@loontail/minecraft-kit 0.5.0 → 0.6.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/logger.ts","../src/core/logger.ts","../src/constants/platform.ts","../src/core/errors.ts","../src/core/system.ts","../src/constants/defaults.ts","../src/http/cache.ts","../src/http/client.ts","../src/constants/files.ts","../src/core/paths.ts","../src/types/install.ts","../src/types/loader.ts","../src/constants/api.ts","../src/http/metadata.ts","../src/install/assets.ts","../src/constants/maven.ts","../src/core/maven.ts","../src/core/rules.ts","../src/install/libraries.ts","../src/install/fabric-install.ts","../src/constants/limits.ts","../src/core/fs.ts","../src/core/archive.ts","../src/core/collections.ts","../src/core/retry.ts","../src/http/download.ts","../src/install/forge-install.ts","../src/install/runtime.ts","../src/install/planner.ts","../src/install/runtime-extras.ts","../src/install/runner.ts","../src/install/runtime-install.ts","../src/constants/launch.ts","../src/launch/arguments.ts","../src/launch/placeholders.ts","../src/launch/args-composition.ts","../src/launch/classpath.ts","../src/core/uuid.ts","../src/types/auth.ts","../src/launch/placeholder-values.ts","../src/core/manifest-merge.ts","../src/launch/version-resolution.ts","../src/launch/compose.ts","../src/launch/runner.ts","../src/launch/spawner.ts","../src/types/verify.ts","../src/repair/helpers.ts","../src/repair/fabric.ts","../src/repair/forge.ts","../src/repair/minecraft.ts","../src/repair/runner.ts","../src/repair/runtime.ts","../src/types/runtime.ts","../src/targets/index.ts","../src/update/runner.ts","../src/core/hash.ts","../src/verify/helpers.ts","../src/verify/fabric.ts","../src/verify/forge.ts","../src/verify/minecraft.ts","../src/verify/runtime.ts","../src/versions/fabric.ts","../src/core/xml.ts","../src/versions/forge.ts","../src/versions/minecraft.ts","../src/constants/runtime.ts","../src/versions/runtime.ts","../src/kit.ts","../src/types/events.ts","../src/types/minecraft.ts","../src/types/repair.ts","../src/types/system.ts","../src/constants/placeholders.ts"],"names":["os","LRUCache","path","archDigit","fs","crypto","yauzl","pipeline","createWriteStream","Readable","pLimit","createReadStream","spawn","buffer","Buffer"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Log levels accepted by the pluggable logger. */\nexport const LogLevels = {\n DEBUG: \"debug\",\n INFO: \"info\",\n WARN: \"warn\",\n ERROR: \"error\",\n} as const;\n\n/** Log-level literal. */\nexport type LogLevel = (typeof LogLevels)[keyof typeof LogLevels];\n\n/** Pluggable logger. Default implementation is a silent logger; pass your own to surface logs. */\nexport interface Logger {\n log(level: LogLevel, message: string, fields?: Readonly<Record<string, unknown>>): void;\n}\n","import { LogLevels } from \"../types/logger\";\nimport type { LogLevel, Logger } from \"../types/logger\";\n\n/** Logger that drops every message. Default when no logger is supplied. */\nexport const silentLogger: Logger = {\n log() {\n // Intentionally empty.\n },\n};\n\n/** Logger that mirrors messages to `console.<level>` with structured fields. */\nexport const consoleLogger: Logger = {\n log(level, message, fields) {\n const target = pickConsole(level);\n if (fields !== undefined) {\n target(`[${level}] ${message}`, fields);\n } else {\n target(`[${level}] ${message}`);\n }\n },\n};\n\nfunction pickConsole(level: LogLevel): (...args: unknown[]) => void {\n if (level === LogLevels.ERROR) return console.error.bind(console);\n if (level === LogLevels.WARN) return console.warn.bind(console);\n if (level === LogLevels.INFO) return console.info.bind(console);\n return console.debug.bind(console);\n}\n","import type { Architecture, OperatingSystem } from \"../types/system\";\n\n/** Mapping from Node's `process.platform` to Mojang OS names. */\nexport const NODE_PLATFORM_TO_MOJANG_OS = {\n win32: \"windows\",\n darwin: \"osx\",\n linux: \"linux\",\n} as const satisfies Partial<Record<NodeJS.Platform, OperatingSystem>>;\n\n/** Mapping from Node's `process.arch` to Mojang/Mojang-runtime arch tags. */\nexport const NODE_ARCH_TO_MOJANG_ARCH = {\n x64: \"x64\",\n ia32: \"x86\",\n arm64: \"arm64\",\n} as const satisfies Partial<Record<NodeJS.Architecture, Architecture>>;\n\n/** Mapping from {OperatingSystem, Architecture} to the runtime-index platform key. */\nexport const RUNTIME_PLATFORM_KEYS: Readonly<\n Record<OperatingSystem, Readonly<Record<Architecture, string>>>\n> = {\n windows: { x64: \"windows-x64\", x86: \"windows-x86\", arm64: \"windows-arm64\" },\n osx: { x64: \"mac-os\", arm64: \"mac-os-arm64\", x86: \"mac-os\" },\n linux: { x64: \"linux\", x86: \"linux-i386\", arm64: \"linux\" },\n};\n","import type { MinecraftKitErrorCode, MinecraftKitErrorContext } from \"../types/errors\";\n\n/**\n * The single error class thrown by every public API in `@loontail/minecraft-kit`.\n *\n * Use {@link isMinecraftKitError} or {@link isErrorCode} for type-narrowing in `catch` blocks.\n */\nexport class MinecraftKitError extends Error {\n override readonly name = \"MinecraftKitError\";\n\n /** Stable discriminator. */\n readonly code: MinecraftKitErrorCode;\n\n /** Structured context; safe to serialize. */\n readonly context: Readonly<MinecraftKitErrorContext>;\n\n constructor(\n code: MinecraftKitErrorCode,\n message: string,\n options: { cause?: unknown; context?: MinecraftKitErrorContext } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n Object.setPrototypeOf(this, new.target.prototype);\n this.code = code;\n this.context = Object.freeze({ ...(options.context ?? {}) });\n }\n\n /** JSON-friendly representation. */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n cause:\n this.cause instanceof Error\n ? { name: this.cause.name, message: this.cause.message }\n : this.cause,\n };\n }\n}\n\n/** True when `e` is an {@link MinecraftKitError}. */\nexport function isMinecraftKitError(e: unknown): e is MinecraftKitError {\n return e instanceof MinecraftKitError;\n}\n\n/** True when `e` is an {@link MinecraftKitError} carrying the given code. */\nexport function isErrorCode<C extends MinecraftKitErrorCode>(\n e: unknown,\n code: C,\n): e is MinecraftKitError & { code: C } {\n return isMinecraftKitError(e) && e.code === code;\n}\n","import os from \"node:os\";\nimport { NODE_ARCH_TO_MOJANG_ARCH, NODE_PLATFORM_TO_MOJANG_OS } from \"../constants/platform\";\nimport type { Architecture, OperatingSystem, RuntimeSystem } from \"../types/system\";\nimport { MinecraftKitError } from \"./errors\";\n\n/** Inputs allowing the host system to be derived from current Node values or overrides. */\nexport interface DetectSystemInput {\n readonly platform?: NodeJS.Platform;\n readonly arch?: NodeJS.Architecture;\n readonly osVersion?: string;\n}\n\n/**\n * Resolve the current host system identifiers.\n *\n * @throws {@link MinecraftKitError} with code `RUNTIME_UNSUPPORTED_PLATFORM` when the\n * platform/arch combination is not understood.\n */\nexport function detectSystem(input: DetectSystemInput = {}): RuntimeSystem {\n const platform = input.platform ?? process.platform;\n const arch = input.arch ?? process.arch;\n const osVersion = input.osVersion ?? os.release();\n const mojangOs = (NODE_PLATFORM_TO_MOJANG_OS as Record<string, OperatingSystem | undefined>)[\n platform\n ];\n const mojangArch = (NODE_ARCH_TO_MOJANG_ARCH as Record<string, Architecture | undefined>)[arch];\n if (mojangOs === undefined || mojangArch === undefined) {\n throw new MinecraftKitError(\n \"RUNTIME_UNSUPPORTED_PLATFORM\",\n `Unsupported platform/arch combination: ${platform}/${arch}`,\n { context: { platform, arch: String(arch) } },\n );\n }\n return { os: mojangOs, arch: mojangArch, osVersion };\n}\n","/** HTTP request timeout for metadata calls, in milliseconds. */\nexport const HTTP_TIMEOUT_MS = 30_000;\n\n/** Maximum retry attempts for transient HTTP failures. */\nexport const HTTP_RETRY_MAX = 4;\n\n/** Base delay for exponential backoff, in milliseconds. */\nexport const HTTP_RETRY_BACKOFF_BASE_MS = 500;\n\n/** Maximum delay for exponential backoff, in milliseconds. */\nexport const HTTP_RETRY_BACKOFF_CAP_MS = 30_000;\n\n/**\n * Default per-host concurrency for downloads. The runner uses a worker-pool: when one file\n * finishes, the next file in the queue starts immediately. There is no batch barrier.\n */\nexport const DOWNLOAD_CONCURRENCY = 32;\n\n/** TTL for in-memory metadata cache entries, in milliseconds. */\nexport const CACHE_TTL_MS = 5 * 60_000;\n\n/** Maximum number of entries kept in the metadata cache. */\nexport const CACHE_MAX_ENTRIES = 256;\n\n/** User-agent value sent on every HTTP request. */\nexport const USER_AGENT = \"minecraft-kit/0.1\";\n\n/** Default launcher brand sent through `${launcher_name}`. */\nexport const DEFAULT_LAUNCHER_NAME = \"minecraft-kit\";\n\n/** Default launcher version sent through `${launcher_version}`. */\nexport const DEFAULT_LAUNCHER_VERSION = \"0.1.0\";\n\n/** Default min heap size in megabytes. */\nexport const DEFAULT_MIN_MB = 1024;\n\n/** Default max heap size in megabytes. */\nexport const DEFAULT_MAX_MB = 4096;\n\n/** Time after a SIGTERM before escalating to SIGKILL when aborting a launch. */\nexport const DEFAULT_KILL_GRACE_MS = 5_000;\n\n/** Throttle interval for emitting download:progress events (in milliseconds). */\nexport const PROGRESS_EVENT_INTERVAL_MS = 100;\n\n/** Maximum number of stderr lines retained from a Forge processor for diagnostics. */\nexport const MAX_PROCESSOR_STDERR_LINES = 20;\n\n/**\n * Maximum bytes per line emitted by {@link ChildProcessSpawner}. Lines longer than this\n * are split: a Minecraft crash that prints megabytes of unbroken text should not exhaust\n * memory inside the launcher.\n */\nexport const SPAWNER_MAX_LINE_BYTES = 64 * 1024;\n","import { LRUCache } from \"lru-cache\";\nimport { CACHE_MAX_ENTRIES, CACHE_TTL_MS } from \"../constants/defaults\";\nimport type { MetadataCache } from \"../types/cache\";\n\n/** Inputs to {@link createMemoryCache}. */\nexport interface MemoryCacheOptions {\n readonly maxEntries?: number;\n readonly ttlMs?: number;\n}\n\n/** In-memory metadata cache backed by `lru-cache`. */\nexport function createMemoryCache(options: MemoryCacheOptions = {}): MetadataCache {\n const cache = new LRUCache<string, object>({\n max: options.maxEntries ?? CACHE_MAX_ENTRIES,\n ttl: options.ttlMs ?? CACHE_TTL_MS,\n });\n return {\n get<T>(key: string): T | undefined {\n const wrapped = cache.get(key) as { value: T } | undefined;\n return wrapped === undefined ? undefined : wrapped.value;\n },\n set<T>(key: string, value: T, ttlMs?: number): void {\n const wrapped = { value };\n if (ttlMs === undefined) {\n cache.set(key, wrapped);\n } else {\n cache.set(key, wrapped, { ttl: ttlMs });\n }\n },\n delete(key: string): void {\n cache.delete(key);\n },\n clear(): void {\n cache.clear();\n },\n };\n}\n","import { HTTP_TIMEOUT_MS, USER_AGENT } from \"../constants/defaults\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport type { HttpClient, HttpHeaders, HttpRequestOptions, HttpResponse } from \"../types/http\";\n\n/** Sentinel used as the abort reason when our internal timer fires. */\nconst TIMEOUT_REASON = Symbol(\"http-timeout\");\n\n/**\n * Default {@link HttpClient} implementation backed by Node's built-in `fetch` (undici under\n * the hood). Maps fetch errors to {@link MinecraftKitError}.\n */\nexport class FetchHttpClient implements HttpClient {\n async request(url: string, options: HttpRequestOptions = {}): Promise<HttpResponse> {\n const controller = new AbortController();\n const timeoutMs = options.timeoutMs ?? HTTP_TIMEOUT_MS;\n const onParentAbort = (): void => controller.abort(options.signal?.reason);\n if (options.signal) {\n if (options.signal.aborted) {\n controller.abort(options.signal.reason);\n } else {\n options.signal.addEventListener(\"abort\", onParentAbort, { once: true });\n }\n }\n const timer = setTimeout(() => controller.abort(TIMEOUT_REASON), timeoutMs);\n let response: Response;\n try {\n response = await fetch(url, {\n method: \"GET\",\n headers: { \"user-agent\": USER_AGENT, ...(options.headers ?? {}) },\n signal: controller.signal,\n redirect: \"follow\",\n });\n } catch (cause) {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onParentAbort);\n if (controller.signal.reason === TIMEOUT_REASON) {\n throw new MinecraftKitError(\"NETWORK_TIMEOUT\", `Request timed out: ${url}`, {\n cause,\n context: { url, timeoutMs },\n });\n }\n if (options.signal?.aborted) {\n throw new MinecraftKitError(\"NETWORK_ABORTED\", `Request aborted: ${url}`, {\n cause,\n context: { url },\n });\n }\n throw new MinecraftKitError(\"NETWORK_HTTP_ERROR\", `Network request failed: ${url}`, {\n cause,\n context: { url },\n });\n }\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onParentAbort);\n if (!response.ok) {\n throw new MinecraftKitError(\"NETWORK_HTTP_ERROR\", `HTTP ${response.status} for ${url}`, {\n context: { url, httpStatus: response.status },\n });\n }\n return new FetchHttpResponse(response, url);\n }\n}\n\nclass FetchHttpResponse implements HttpResponse {\n readonly status: number;\n readonly headers: HttpHeaders;\n readonly url: string;\n\n constructor(\n private readonly response: Response,\n url: string,\n ) {\n this.status = response.status;\n this.url = url;\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n this.headers = headers;\n }\n\n async text(): Promise<string> {\n return this.response.text();\n }\n\n async json<T = unknown>(): Promise<T> {\n return (await this.response.json()) as T;\n }\n\n async bytes(): Promise<Uint8Array> {\n const buf = await this.response.arrayBuffer();\n return new Uint8Array(buf);\n }\n\n async *stream(): AsyncIterable<Uint8Array> {\n const body = this.response.body;\n if (!body) {\n const buf = await this.bytes();\n yield buf;\n return;\n }\n const reader = body.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) return;\n if (value) yield value;\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","/**\n * Relative-path segments used to build per-target directory layouts.\n *\n * These are SEGMENTS — never use them as absolute paths. Compose with `path.join` at call sites.\n */\nexport const VERSIONS_DIR = \"versions\";\nexport const LIBRARIES_DIR = \"libraries\";\nexport const ASSETS_DIR = \"assets\";\nexport const ASSETS_OBJECTS_DIR = \"assets/objects\";\nexport const ASSETS_INDEXES_DIR = \"assets/indexes\";\nexport const ASSETS_VIRTUAL_DIR = \"assets/virtual\";\nexport const ASSETS_LEGACY_DIR = \"assets/virtual/legacy\";\nexport const ASSETS_RESOURCES_DIR = \"resources\";\nexport const ASSETS_LOG_CONFIGS_DIR = \"assets/log_configs\";\nexport const RUNTIMES_DIR = \"runtime\";\nexport const NATIVES_DIR_NAME = \"natives\";\nexport const FORGE_INSTALLERS_DIR = \"forge-installers\";\n\n/** Java executable filename per OS (relative to the runtime root). */\nexport const JAVA_EXECUTABLE = {\n windows: \"bin/javaw.exe\",\n windowsConsole: \"bin/java.exe\",\n linux: \"bin/java\",\n /** Note: macOS uses an extra `jre.bundle/Contents/Home/` prefix above this. */\n osx: \"bin/java\",\n} as const;\n\n/** macOS runtime layout adds this prefix above {@link JAVA_EXECUTABLE.osx}. */\nexport const MAC_RUNTIME_PREFIX = \"jre.bundle/Contents/Home\";\n","import path from \"node:path\";\nimport {\n ASSETS_INDEXES_DIR,\n ASSETS_LEGACY_DIR,\n ASSETS_LOG_CONFIGS_DIR,\n ASSETS_OBJECTS_DIR,\n ASSETS_RESOURCES_DIR,\n ASSETS_VIRTUAL_DIR,\n FORGE_INSTALLERS_DIR,\n JAVA_EXECUTABLE,\n LIBRARIES_DIR,\n MAC_RUNTIME_PREFIX,\n NATIVES_DIR_NAME,\n RUNTIMES_DIR,\n VERSIONS_DIR,\n} from \"../constants/files\";\nimport type { OperatingSystem } from \"../types/system\";\n\n/** Helpers for the per-target directory layout. */\nexport const targetPaths = {\n versionsDir: (root: string): string => path.join(root, VERSIONS_DIR),\n versionDir: (root: string, versionId: string): string => path.join(root, VERSIONS_DIR, versionId),\n versionJar: (root: string, versionId: string): string =>\n path.join(root, VERSIONS_DIR, versionId, `${versionId}.jar`),\n versionJson: (root: string, versionId: string): string =>\n path.join(root, VERSIONS_DIR, versionId, `${versionId}.json`),\n librariesDir: (root: string): string => path.join(root, LIBRARIES_DIR),\n libraryFile: (root: string, libraryPath: string): string =>\n path.join(root, LIBRARIES_DIR, libraryPath),\n assetIndex: (root: string, indexId: string): string =>\n path.join(root, ASSETS_INDEXES_DIR, `${indexId}.json`),\n assetObject: (root: string, hash: string): string =>\n path.join(root, ASSETS_OBJECTS_DIR, hash.slice(0, 2), hash),\n assetVirtual: (root: string, virtualPath: string): string =>\n path.join(root, ASSETS_VIRTUAL_DIR, virtualPath),\n assetLegacy: (root: string, virtualPath: string): string =>\n path.join(root, ASSETS_LEGACY_DIR, virtualPath),\n assetResource: (root: string, virtualPath: string): string =>\n path.join(root, ASSETS_RESOURCES_DIR, virtualPath),\n loggingConfig: (root: string, id: string): string => path.join(root, ASSETS_LOG_CONFIGS_DIR, id),\n nativesDir: (root: string, versionId: string): string =>\n path.join(root, VERSIONS_DIR, versionId, NATIVES_DIR_NAME),\n /**\n * Path to a runtime component's root directory. Honours `installRoot` (custom global\n * runtime location) when present; otherwise falls back to `<directory>/runtime/<component>`.\n */\n runtimeRoot: (directory: string, component: string, installRoot?: string): string =>\n installRoot !== undefined\n ? path.join(installRoot, component)\n : path.join(directory, RUNTIMES_DIR, component),\n runtimeJavaExecutable: (\n directory: string,\n component: string,\n os: OperatingSystem,\n installRoot?: string,\n ): string => {\n const runtime = targetPaths.runtimeRoot(directory, component, installRoot);\n if (os === \"windows\") return path.join(runtime, JAVA_EXECUTABLE.windows);\n if (os === \"osx\") return path.join(runtime, MAC_RUNTIME_PREFIX, JAVA_EXECUTABLE.osx);\n return path.join(runtime, JAVA_EXECUTABLE.linux);\n },\n forgeInstaller: (root: string, mavenVersion: string): string =>\n path.join(root, FORGE_INSTALLERS_DIR, `forge-${mavenVersion}-installer.jar`),\n} as const;\n","/**\n * Coarse-grained install phases. Used in `install:phase-changed` events so consumers can\n * render a progress bar with named steps.\n */\nexport const InstallPhases = {\n PLANNING: \"planning\",\n DOWNLOADING_VERSION_MANIFEST: \"downloading-version-manifest\",\n DOWNLOADING_CLIENT_JAR: \"downloading-client-jar\",\n DOWNLOADING_LIBRARIES: \"downloading-libraries\",\n DOWNLOADING_ASSET_INDEX: \"downloading-asset-index\",\n DOWNLOADING_ASSETS: \"downloading-assets\",\n EXTRACTING_NATIVES: \"extracting-natives\",\n INSTALLING_RUNTIME: \"installing-runtime\",\n INSTALLING_FABRIC: \"installing-fabric\",\n INSTALLING_FORGE: \"installing-forge\",\n RUNNING_FORGE_PROCESSORS: \"running-forge-processors\",\n WRITING_FILES: \"writing-files\",\n COMPLETED: \"completed\",\n} as const;\n\n/** Install phase literal. */\nexport type InstallPhase = (typeof InstallPhases)[keyof typeof InstallPhases];\n\n/** Action kinds inside an {@link InstallPlan}. */\nexport const InstallActionKinds = {\n DOWNLOAD_FILE: \"download-file\",\n EXTRACT_NATIVE: \"extract-native\",\n RUN_FORGE_PROCESSOR: \"run-forge-processor\",\n WRITE_VERSION_JSON: \"write-version-json\",\n WRITE_LOGGING_CONFIG: \"write-logging-config\",\n} as const;\n\n/** Discriminator for an install action. */\nexport type InstallActionKind = (typeof InstallActionKinds)[keyof typeof InstallActionKinds];\n\n/** A single download step. */\nexport interface DownloadAction {\n readonly kind: typeof InstallActionKinds.DOWNLOAD_FILE;\n readonly url: string;\n readonly target: string;\n readonly expectedSha1?: string;\n readonly expectedSize?: number;\n readonly category:\n | \"client-jar\"\n | \"library\"\n | \"asset-index\"\n | \"asset\"\n | \"logging-config\"\n | \"fabric-library\"\n | \"forge-library\"\n | \"runtime-file\"\n | \"forge-installer\";\n}\n\n/** A native extraction step. Source jar must already exist on disk. */\nexport interface ExtractNativeAction {\n readonly kind: typeof InstallActionKinds.EXTRACT_NATIVE;\n readonly source: string;\n readonly destination: string;\n readonly exclude: readonly string[];\n}\n\n/**\n * A Forge processor invocation. `Main-Class` is intentionally NOT carried here — the\n * runner reads it from `classpath[0]`'s manifest at execution time, because the JAR is\n * not guaranteed to exist on disk during planning (newer Forge versions ship some\n * processor JARs as regular Maven libraries instead of bundling them in the installer).\n */\nexport interface RunForgeProcessorAction {\n readonly kind: typeof InstallActionKinds.RUN_FORGE_PROCESSOR;\n readonly index: number;\n /** First entry is the processor JAR; remaining entries are its declared classpath. */\n readonly classpath: readonly string[];\n readonly args: readonly string[];\n readonly outputs: Readonly<Record<string, string>>;\n}\n\n/** Write a version JSON to disk (Fabric / Forge). */\nexport interface WriteVersionJsonAction {\n readonly kind: typeof InstallActionKinds.WRITE_VERSION_JSON;\n readonly path: string;\n readonly content: string;\n}\n\n/** Write a logging config (log4j XML) to disk. */\nexport interface WriteLoggingConfigAction {\n readonly kind: typeof InstallActionKinds.WRITE_LOGGING_CONFIG;\n readonly path: string;\n readonly content: string;\n}\n\n/** Discriminated union of install actions. */\nexport type InstallAction =\n | DownloadAction\n | ExtractNativeAction\n | RunForgeProcessorAction\n | WriteVersionJsonAction\n | WriteLoggingConfigAction;\n\n/**\n * Pre-computed install plan: a flat ordered list of actions plus computed totals.\n *\n * The runner consumes this; nothing is downloaded or written during planning. The plan\n * carries a reference to the resolved target so the runner does not need a second target\n * argument.\n */\nexport interface InstallPlan {\n readonly targetId: string;\n readonly directory: string;\n readonly target: import(\"./target\").Target;\n readonly actions: readonly InstallAction[];\n readonly totalBytes: number;\n readonly totalActions: number;\n}\n\n/** Outcome summary returned by `install.run`. */\nexport interface InstallReport {\n readonly targetId: string;\n readonly bytesDownloaded: number;\n readonly actionsCompleted: number;\n readonly actionsSkipped: number;\n readonly durationMs: number;\n}\n","import type { ResolvedFabricLoader } from \"./fabric\";\nimport type { ResolvedForgeLoader } from \"./forge\";\nimport type { ResolvedVanillaLoader } from \"./vanilla\";\n\n/**\n * Discriminator literal identifying which mod loader is active for a target.\n *\n * Use the {@link Loaders} const object instead of bare strings. `loader.type === Loaders.FABRIC`\n * is preferred over `loader.type === \"fabric\"`.\n */\nexport const Loaders = {\n /** Plain vanilla Minecraft, no mod loader. */\n VANILLA: \"vanilla\",\n /** Fabric mod loader. */\n FABRIC: \"fabric\",\n /** Modern (1.13+) Forge mod loader. */\n FORGE: \"forge\",\n} as const;\n\n/** Loader-kind literal (used as discriminator on loader objects). */\nexport type LoaderKind = (typeof Loaders)[keyof typeof Loaders];\n\n/**\n * A fully resolved loader pinned to a specific Minecraft version. Use the `type` field to\n * narrow to the concrete shape.\n */\nexport type Loader = ResolvedVanillaLoader | ResolvedFabricLoader | ResolvedForgeLoader;\n\n/**\n * Resolution preference used when a user wants the latest, recommended, or a specific version.\n * Preferences are inputs to resolvers; resolved targets always carry concrete versions.\n */\nexport const VersionPreference = {\n LATEST: \"latest\",\n RECOMMENDED: \"recommended\",\n} as const;\n\n/** Resolution-preference literal. */\nexport type VersionPreferenceKind = (typeof VersionPreference)[keyof typeof VersionPreference];\n","/**\n * Endpoint builders for every external HTTP request the library makes. Code MUST go through\n * these — never hard-code URLs at call sites.\n */\n\nconst PISTON_META = \"https://piston-meta.mojang.com\";\nconst RESOURCES = \"https://resources.download.minecraft.net\";\nconst FABRIC_META = \"https://meta.fabricmc.net\";\nconst FORGE_MAVEN = \"https://maven.minecraftforge.net\";\nconst FORGE_FILES = \"https://files.minecraftforge.net\";\n\n/** Mojang Java-runtime metadata digest, embedded in the runtime index URL path. */\nconst RUNTIME_INDEX_DIGEST = \"2ec0cc96c44e5a76b9c8b7c39df7210883d12871\";\n\n/** Endpoint builders. */\nexport const ApiEndpoints = {\n mojang: {\n /** Top-level Minecraft version manifest (v2). */\n versionManifest: (): string => `${PISTON_META}/mc/game/version_manifest_v2.json`,\n /** Mojang Java-runtime index. */\n runtimeIndex: (): string =>\n `${PISTON_META}/v1/products/java-runtime/${RUNTIME_INDEX_DIGEST}/all.json`,\n },\n resources: {\n /** Hash-addressed Minecraft asset object. */\n asset: (hash: string): string => `${RESOURCES}/${hash.slice(0, 2)}/${hash}`,\n },\n fabric: {\n gameVersions: (): string => `${FABRIC_META}/v2/versions/game`,\n loaderVersions: (): string => `${FABRIC_META}/v2/versions/loader`,\n loaderForGame: (minecraftVersion: string): string =>\n `${FABRIC_META}/v2/versions/loader/${encodeURIComponent(minecraftVersion)}`,\n profile: (minecraftVersion: string, loaderVersion: string): string =>\n `${FABRIC_META}/v2/versions/loader/${encodeURIComponent(minecraftVersion)}/${encodeURIComponent(loaderVersion)}/profile/json`,\n },\n forge: {\n /** Forge Maven listing of all builds across all MC versions. */\n mavenMetadata: (): string => `${FORGE_MAVEN}/net/minecraftforge/forge/maven-metadata.xml`,\n /** Slim \"recommended\" / \"latest\" promotion mapping. */\n promotions: (): string => `${FORGE_FILES}/net/minecraftforge/forge/promotions_slim.json`,\n /** URL of the modern installer JAR for a Maven version (e.g. `1.20.1-47.2.0`). */\n installer: (mavenVersion: string): string => {\n const filename = `forge-${mavenVersion}-installer.jar`;\n return `${FORGE_MAVEN}/net/minecraftforge/forge/${mavenVersion}/${filename}`;\n },\n },\n} as const;\n\n/** Surface type useful for DI. */\nexport type ApiEndpointsShape = typeof ApiEndpoints;\n","import { CACHE_TTL_MS } from \"../constants/defaults\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { HttpClient } from \"../types/http\";\n\n/** Inputs to {@link fetchJson}. */\nexport interface FetchJsonInput {\n readonly url: string;\n readonly cacheKey?: string;\n readonly ttlMs?: number;\n readonly signal?: AbortSignal;\n}\n\n/**\n * GET a URL, parse the body as JSON, and cache the parsed value in {@link MetadataCache} with\n * the given TTL.\n *\n * Cache key defaults to the URL.\n */\nexport async function fetchJson<T>(\n http: HttpClient,\n cache: MetadataCache,\n input: FetchJsonInput,\n): Promise<T> {\n const key = input.cacheKey ?? `json:${input.url}`;\n const cached = cache.get<T>(key);\n if (cached !== undefined) {\n return cached;\n }\n const requestOptions: { signal?: AbortSignal } = {};\n if (input.signal !== undefined) requestOptions.signal = input.signal;\n const response = await http.request(input.url, requestOptions);\n const value = await response.json<T>();\n cache.set(key, value, input.ttlMs ?? CACHE_TTL_MS);\n return value;\n}\n\n/** GET a URL and return raw text, with caching. */\nexport async function fetchText(\n http: HttpClient,\n cache: MetadataCache,\n input: FetchJsonInput,\n): Promise<string> {\n const key = input.cacheKey ?? `text:${input.url}`;\n const cached = cache.get<string>(key);\n if (cached !== undefined) {\n return cached;\n }\n const requestOptions: { signal?: AbortSignal } = {};\n if (input.signal !== undefined) requestOptions.signal = input.signal;\n const response = await http.request(input.url, requestOptions);\n const text = await response.text();\n cache.set(key, text, input.ttlMs ?? CACHE_TTL_MS);\n return text;\n}\n","import { ApiEndpoints } from \"../constants/api\";\nimport { targetPaths } from \"../core/paths\";\nimport { fetchJson } from \"../http/metadata\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { HttpClient } from \"../types/http\";\nimport { type DownloadAction, InstallActionKinds } from \"../types/install\";\nimport type { AssetIndexDocument, AssetIndexReference } from \"../types/minecraft\";\n\n/**\n * Plan asset downloads: fetch the asset index and emit a download action per object plus the\n * index file itself.\n */\nexport async function planAssetDownloads(input: {\n readonly directory: string;\n readonly assetIndex: AssetIndexReference;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n}): Promise<{\n readonly actions: readonly DownloadAction[];\n readonly indexDocument: AssetIndexDocument;\n}> {\n const indexUrl = input.assetIndex.url;\n const indexPath = targetPaths.assetIndex(input.directory, input.assetIndex.id);\n const indexDocument = await fetchJson<AssetIndexDocument>(input.http, input.cache, {\n url: indexUrl,\n cacheKey: `asset-index:${input.assetIndex.id}:${input.assetIndex.sha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const actions: DownloadAction[] = [\n {\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: indexUrl,\n target: indexPath,\n expectedSha1: input.assetIndex.sha1,\n expectedSize: input.assetIndex.size,\n category: \"asset-index\",\n },\n ];\n // Asset indexes routinely list the same hash under multiple virtual paths (e.g. legacy\n // localized variants of the same byte content). Emit one DOWNLOAD_FILE per unique hash so\n // we never schedule two parallel writes to the same `assets/objects/<hash>` target — that\n // race produces a \"Failed to finalize download\" error during repair.\n const seen = new Set<string>();\n for (const entry of Object.values(indexDocument.objects)) {\n if (seen.has(entry.hash)) continue;\n seen.add(entry.hash);\n actions.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: ApiEndpoints.resources.asset(entry.hash),\n target: targetPaths.assetObject(input.directory, entry.hash),\n expectedSha1: entry.hash,\n expectedSize: entry.size,\n category: \"asset\",\n });\n }\n return { actions, indexDocument };\n}\n","/** Default Maven base URL when a library entry has no `url`. */\nexport const DEFAULT_LIBRARY_REPOSITORY = \"https://libraries.minecraft.net/\";\n\n/** Fabric's Maven base. */\nexport const FABRIC_MAVEN_BASE = \"https://maven.fabricmc.net/\";\n\n/** Forge's Maven base. */\nexport const FORGE_MAVEN_BASE = \"https://maven.minecraftforge.net/\";\n","import { MinecraftKitError } from \"./errors\";\n\n/**\n * Parsed Maven coordinate of the form `group:artifact:version[:classifier][@extension]`.\n */\nexport interface MavenCoordinate {\n readonly group: string;\n readonly artifact: string;\n readonly version: string;\n readonly classifier?: string;\n readonly extension: string;\n}\n\n/**\n * Parse a Maven coordinate string. Defaults `extension` to `jar`.\n *\n * @throws `INVALID_INPUT` when the input cannot be parsed.\n */\nexport function parseMavenCoordinate(input: string): MavenCoordinate {\n // Strip enclosing brackets used in Forge install profiles.\n const trimmed = input.startsWith(\"[\") && input.endsWith(\"]\") ? input.slice(1, -1) : input;\n const atIndex = trimmed.indexOf(\"@\");\n const extension = atIndex === -1 ? \"jar\" : trimmed.slice(atIndex + 1);\n const body = atIndex === -1 ? trimmed : trimmed.slice(0, atIndex);\n const parts = body.split(\":\");\n if (parts.length < 3 || parts.length > 4) {\n throw new MinecraftKitError(\"INVALID_INPUT\", `Invalid Maven coordinate: ${input}`, {\n context: { input },\n });\n }\n const [group, artifact, version, classifier] = parts as [string, string, string, string?];\n if (!group || !artifact || !version) {\n throw new MinecraftKitError(\n \"INVALID_INPUT\",\n `Invalid Maven coordinate (missing component): ${input}`,\n { context: { input } },\n );\n }\n if (classifier === undefined) {\n return { group, artifact, version, extension };\n }\n return { group, artifact, version, classifier, extension };\n}\n\n/** Build the relative path under a Maven repository for a coordinate. */\nexport function mavenRelativePath(coord: MavenCoordinate): string {\n const groupPath = coord.group.replaceAll(\".\", \"/\");\n const classifierSegment = coord.classifier === undefined ? \"\" : `-${coord.classifier}`;\n const filename = `${coord.artifact}-${coord.version}${classifierSegment}.${coord.extension}`;\n return `${groupPath}/${coord.artifact}/${coord.version}/${filename}`;\n}\n\n/** Convenience: parse + relative path. */\nexport function mavenRelativePathFor(input: string): string {\n return mavenRelativePath(parseMavenCoordinate(input));\n}\n","import type { LibraryRule } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\n\n/** Inputs to rule evaluation. */\nexport interface RuleEvaluationContext {\n readonly system: RuntimeSystem;\n readonly features?: Readonly<Record<string, boolean>>;\n}\n\n/**\n * Evaluate a list of Mojang library/argument rules against the given context.\n *\n * Algorithm: each rule with a matching `os`/`features` predicate updates a running\n * `allowed` flag (`allow` → true, `disallow` → false). Last matching rule wins.\n * When the rule list is empty, the result is `true`.\n */\nexport function evaluateRules(\n rules: readonly LibraryRule[] | undefined,\n context: RuleEvaluationContext,\n): boolean {\n if (!rules || rules.length === 0) {\n return true;\n }\n let allowed = false;\n for (const rule of rules) {\n if (matchesRule(rule, context)) {\n allowed = rule.action === \"allow\";\n }\n }\n return allowed;\n}\n\nfunction matchesRule(rule: LibraryRule, context: RuleEvaluationContext): boolean {\n if (rule.os !== undefined) {\n if (rule.os.name !== undefined && rule.os.name !== context.system.os) {\n return false;\n }\n if (rule.os.arch !== undefined && normalizeArch(rule.os.arch) !== context.system.arch) {\n return false;\n }\n if (rule.os.version !== undefined) {\n try {\n if (!new RegExp(rule.os.version).test(context.system.osVersion)) {\n return false;\n }\n } catch {\n return false;\n }\n }\n }\n if (rule.features !== undefined) {\n const features = context.features ?? {};\n for (const [key, expected] of Object.entries(rule.features)) {\n const actual = features[key] === true;\n if (expected !== actual) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * Mojang manifests sometimes use `x86` (32-bit) where Node uses `ia32`. We canonicalize\n * to Mojang names elsewhere and treat `x86` as `x86`.\n */\nfunction normalizeArch(arch: string): string {\n return arch === \"ia32\" ? \"x86\" : arch;\n}\n\n/** Resolve the `${arch}` placeholder used in legacy native classifier names. */\nexport function resolveArchPlaceholder(template: string, archDigit: string): string {\n return template.replaceAll(\"${arch}\", archDigit);\n}\n\n/** The numeric arch suffix used by legacy LWJGL natives (`x64` → `64`, `x86` → `32`). */\nexport function archDigit(arch: RuntimeSystem[\"arch\"]): string {\n if (arch === \"x86\") return \"32\";\n if (arch === \"x64\") return \"64\";\n return \"64\";\n}\n","import path from \"node:path\";\nimport { DEFAULT_LIBRARY_REPOSITORY } from \"../constants/maven\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { mavenRelativePathFor, parseMavenCoordinate } from \"../core/maven\";\nimport { targetPaths } from \"../core/paths\";\nimport { archDigit, evaluateRules, resolveArchPlaceholder } from \"../core/rules\";\nimport {\n type DownloadAction,\n type ExtractNativeAction,\n InstallActionKinds,\n} from \"../types/install\";\nimport type { LibraryArtifact, MinecraftLibrary } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\n\n/** Outputs of {@link planLibraryDownloads}. */\nexport interface LibraryPlan {\n readonly downloads: readonly DownloadAction[];\n readonly nativeExtractions: readonly ExtractNativeAction[];\n readonly classpathFiles: readonly string[];\n}\n\n/**\n * Walk a library list, evaluate rules against the system, and produce concrete download +\n * native-extraction actions. Library entries that don't apply on the target platform are\n * silently filtered.\n */\nexport function planLibraryDownloads(input: {\n readonly libraries: readonly MinecraftLibrary[];\n readonly directory: string;\n readonly system: RuntimeSystem;\n readonly versionId: string;\n readonly category: DownloadAction[\"category\"];\n}): LibraryPlan {\n const downloads: DownloadAction[] = [];\n const nativeExtractions: ExtractNativeAction[] = [];\n const classpathFiles: string[] = [];\n const seenPaths = new Set<string>();\n const nativesDir = targetPaths.nativesDir(input.directory, input.versionId);\n for (const library of input.libraries) {\n if (!evaluateRules(library.rules, { system: input.system })) continue;\n\n const artifact = pickPrimaryArtifact(library);\n if (artifact) {\n const targetPath = path.join(\n targetPaths.librariesDir(input.directory),\n artifact.relativePath,\n );\n if (!seenPaths.has(targetPath)) {\n seenPaths.add(targetPath);\n // Empty URL in a Forge install_profile / version JSON means \"the file is\n // provided by the installer's `maven/` extraction or by a processor output —\n // do not issue a download.\" Still record the path on the classpath so the\n // launch composer can find it after install.\n if (artifact.url) {\n downloads.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: artifact.url,\n target: targetPath,\n ...(artifact.sha1 !== undefined ? { expectedSha1: artifact.sha1 } : {}),\n ...(artifact.size !== undefined ? { expectedSize: artifact.size } : {}),\n category: input.category,\n });\n }\n classpathFiles.push(targetPath);\n }\n }\n\n const native = pickNative(library, input.system);\n if (native) {\n const targetPath = path.join(targetPaths.librariesDir(input.directory), native.relativePath);\n if (!seenPaths.has(targetPath)) {\n seenPaths.add(targetPath);\n if (native.url) {\n downloads.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: native.url,\n target: targetPath,\n ...(native.sha1 !== undefined ? { expectedSha1: native.sha1 } : {}),\n ...(native.size !== undefined ? { expectedSize: native.size } : {}),\n category: input.category,\n });\n }\n }\n nativeExtractions.push({\n kind: InstallActionKinds.EXTRACT_NATIVE,\n source: targetPath,\n destination: nativesDir,\n exclude: library.extract?.exclude ?? [\"META-INF/\"],\n });\n }\n }\n return { downloads, nativeExtractions, classpathFiles };\n}\n\ninterface ArtifactDescription {\n readonly relativePath: string;\n readonly url: string;\n readonly sha1: string | undefined;\n readonly size: number | undefined;\n}\n\nfunction pickPrimaryArtifact(library: MinecraftLibrary): ArtifactDescription | null {\n if (library.downloads?.artifact) {\n return artifactFromDownload(library.downloads.artifact);\n }\n if (library.url) {\n return mavenArtifactFromCoord(library.name, library.url);\n }\n if (library.name && !library.natives) {\n return mavenArtifactFromCoord(library.name, DEFAULT_LIBRARY_REPOSITORY);\n }\n return null;\n}\n\nfunction pickNative(library: MinecraftLibrary, system: RuntimeSystem): ArtifactDescription | null {\n if (!library.natives) return null;\n const classifierTemplate = library.natives[system.os];\n if (!classifierTemplate) return null;\n const classifier = resolveArchPlaceholder(classifierTemplate, archDigit(system.arch));\n const classifierArtifact = library.downloads?.classifiers?.[classifier];\n if (classifierArtifact) {\n return artifactFromDownload(classifierArtifact);\n }\n if (library.url || library.name) {\n const coord = parseMavenCoordinate(library.name);\n const withClassifier = `${coord.group}:${coord.artifact}:${coord.version}:${classifier}`;\n return mavenArtifactFromCoord(withClassifier, library.url ?? DEFAULT_LIBRARY_REPOSITORY);\n }\n return null;\n}\n\nfunction artifactFromDownload(artifact: LibraryArtifact): ArtifactDescription {\n return {\n relativePath: artifact.path,\n url: artifact.url,\n sha1: artifact.sha1,\n size: artifact.size,\n };\n}\n\nfunction mavenArtifactFromCoord(coord: string, baseUrl: string): ArtifactDescription {\n const relativePath = mavenRelativePathFor(coord);\n const normalizedBase = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n if (!relativePath) {\n throw new MinecraftKitError(\"MANIFEST_INVALID\", `Invalid library coordinate: ${coord}`, {\n context: { input: coord },\n });\n }\n return {\n relativePath,\n url: `${normalizedBase}${relativePath}`,\n sha1: undefined,\n size: undefined,\n };\n}\n","import { targetPaths } from \"../core/paths\";\nimport type { ResolvedFabricLoader } from \"../types/fabric\";\nimport {\n type DownloadAction,\n InstallActionKinds,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport type { ResolvedMinecraft } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\nimport { planLibraryDownloads } from \"./libraries\";\n\n/**\n * Plan the Fabric-specific install steps for a resolved Fabric loader: write the profile\n * JSON (becomes `versions/<id>/<id>.json`) and download every Fabric library.\n */\nexport function planFabricInstall(input: {\n readonly loader: ResolvedFabricLoader;\n readonly minecraft: ResolvedMinecraft;\n readonly directory: string;\n readonly system: RuntimeSystem;\n}): {\n readonly versionJson: WriteVersionJsonAction;\n readonly libraryDownloads: readonly DownloadAction[];\n readonly classpathFiles: readonly string[];\n readonly versionId: string;\n} {\n const versionId = input.loader.profile.id;\n const versionJsonPath = targetPaths.versionJson(input.directory, versionId);\n const versionJson: WriteVersionJsonAction = {\n kind: InstallActionKinds.WRITE_VERSION_JSON,\n path: versionJsonPath,\n content: `${JSON.stringify(input.loader.profile, null, 2)}\\n`,\n };\n const plan = planLibraryDownloads({\n libraries: input.loader.profile.libraries,\n directory: input.directory,\n system: input.system,\n versionId: input.minecraft.version,\n category: \"fabric-library\",\n });\n return {\n versionJson,\n libraryDownloads: plan.downloads,\n classpathFiles: plan.classpathFiles,\n versionId,\n };\n}\n","/** Per-file size cap during archive extraction (bytes). */\nexport const EXTRACTION_MAX_FILE_SIZE = 256 * 1024 * 1024;\n\n/** Total decompressed-bytes cap per archive. */\nexport const EXTRACTION_MAX_TOTAL_SIZE = 2 * 1024 * 1024 * 1024;\n\n/** Maximum compression ratio (decompressed / compressed) before treating as a zip bomb. */\nexport const EXTRACTION_MAX_COMPRESSION_RATIO = 200;\n\n/** Maximum entry count per archive. */\nexport const EXTRACTION_MAX_ENTRY_COUNT = 100_000;\n\n/** Reasonable maximum bytes a Forge installer JAR can be. */\nexport const FORGE_INSTALLER_MAX_SIZE = 256 * 1024 * 1024;\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MinecraftKitError } from \"./errors\";\n\n/** Ensure a directory exists, creating intermediate directories as needed. */\nexport async function ensureDir(directory: string): Promise<void> {\n try {\n await fs.mkdir(directory, { recursive: true });\n } catch (cause) {\n throw new MinecraftKitError(\n \"FILESYSTEM_WRITE_ERROR\",\n `Failed to create directory: ${directory}`,\n { cause, context: { filePath: directory } },\n );\n }\n}\n\n/** Returns true if a path exists and is a regular file. */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(filePath);\n return stat.isFile();\n } catch {\n return false;\n }\n}\n\n/** Returns true if a path exists and is a directory. */\nexport async function dirExists(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(filePath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\n/** Get file size in bytes; returns -1 when the file is absent. */\nexport async function fileSize(filePath: string): Promise<number> {\n try {\n const stat = await fs.stat(filePath);\n return stat.size;\n } catch {\n return -1;\n }\n}\n\n/**\n * Atomically write `data` to `target`. Writes to a temp sibling and renames.\n *\n * Creates parent directories if missing. Throws {@link MinecraftKitError} with\n * code `FILESYSTEM_WRITE_ERROR` on failure.\n */\nexport async function atomicWrite(target: string, data: Uint8Array | string): Promise<void> {\n await ensureDir(path.dirname(target));\n const tmp = `${target}.${crypto.randomBytes(4).toString(\"hex\")}.tmp`;\n try {\n if (typeof data === \"string\") {\n await fs.writeFile(tmp, data, \"utf8\");\n } else {\n await fs.writeFile(tmp, data);\n }\n await fs.rename(tmp, target);\n } catch (cause) {\n try {\n await fs.unlink(tmp);\n } catch {\n // Best-effort cleanup.\n }\n throw new MinecraftKitError(\"FILESYSTEM_WRITE_ERROR\", `Failed to write file: ${target}`, {\n cause,\n context: { filePath: target },\n });\n }\n}\n\n/** Read a file as UTF-8 text, mapping fs errors to a domain error. */\nexport async function readText(filePath: string): Promise<string> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch (cause) {\n throw new MinecraftKitError(\"FILESYSTEM_READ_ERROR\", `Failed to read file: ${filePath}`, {\n cause,\n context: { filePath },\n });\n }\n}\n\n/** Read a file as bytes, mapping fs errors to a domain error. */\nexport async function readBytes(filePath: string): Promise<Uint8Array> {\n try {\n const buf = await fs.readFile(filePath);\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n } catch (cause) {\n throw new MinecraftKitError(\"FILESYSTEM_READ_ERROR\", `Failed to read file: ${filePath}`, {\n cause,\n context: { filePath },\n });\n }\n}\n\n/** List immediate child directory names of `directory`. Returns [] when directory is missing. */\nexport async function listChildDirectories(directory: string): Promise<readonly string[]> {\n try {\n const entries = await fs.readdir(directory, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\n/** Set the executable bit on a file (best-effort; no-op on Windows). */\nexport async function chmodExecutable(filePath: string): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n try {\n await fs.chmod(filePath, 0o755);\n } catch {\n // Best-effort.\n }\n}\n\n/**\n * Verify that `child` is contained in `root`. Used to defeat zip-slip and absolute-path\n * traversal during archive extraction.\n *\n * @throws `FILESYSTEM_PATH_TRAVERSAL` when `child` escapes `root`.\n */\nexport function assertWithinRoot(root: string, child: string): void {\n const normalizedRoot = path.resolve(root);\n const normalizedChild = path.resolve(root, child);\n const sep = path.sep;\n if (normalizedChild !== normalizedRoot && !normalizedChild.startsWith(normalizedRoot + sep)) {\n throw new MinecraftKitError(\"FILESYSTEM_PATH_TRAVERSAL\", `Path escapes root: ${child}`, {\n context: { filePath: child, rootDirectory: root },\n });\n }\n}\n","import { createWriteStream } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport yauzl from \"yauzl\";\nimport {\n EXTRACTION_MAX_COMPRESSION_RATIO,\n EXTRACTION_MAX_ENTRY_COUNT,\n EXTRACTION_MAX_FILE_SIZE,\n EXTRACTION_MAX_TOTAL_SIZE,\n} from \"../constants/limits\";\nimport { MinecraftKitError } from \"./errors\";\nimport { assertWithinRoot, atomicWrite, chmodExecutable, ensureDir } from \"./fs\";\n\n/** A single zip entry exposed to callers. */\nexport interface ZipEntry {\n readonly name: string;\n readonly compressedSize: number;\n readonly uncompressedSize: number;\n readonly isDirectory: boolean;\n /** Read the entry contents into a Buffer (size limits enforced). */\n readBuffer(): Promise<Buffer>;\n /** Stream the entry contents. */\n openReadStream(): Promise<Readable>;\n}\n\n/** Open a zip/jar file for streaming inspection. */\nexport function openZip(filePath: string): Promise<ZipReader> {\n return new Promise((resolve, reject) => {\n yauzl.open(filePath, { lazyEntries: true, autoClose: false }, (err, zipFile) => {\n if (err || !zipFile) {\n reject(\n new MinecraftKitError(\"ARCHIVE_INVALID\", `Failed to open archive: ${filePath}`, {\n cause: err,\n context: { filePath },\n }),\n );\n return;\n }\n resolve(new ZipReader(zipFile, filePath));\n });\n });\n}\n\n/** Reader for a single zip file. */\nexport class ZipReader {\n constructor(\n private readonly file: yauzl.ZipFile,\n private readonly filePath: string,\n ) {}\n\n /** Iterate every entry. Caller may break out of the loop early. */\n async *entries(): AsyncGenerator<ZipEntry> {\n const file = this.file;\n let count = 0;\n while (true) {\n const entry = await this.readNext();\n if (entry === null) return;\n count++;\n if (count > EXTRACTION_MAX_ENTRY_COUNT) {\n throw new MinecraftKitError(\n \"ARCHIVE_TOO_LARGE\",\n `Archive contains too many entries: ${this.filePath}`,\n { context: { filePath: this.filePath } },\n );\n }\n yield this.toZipEntry(entry, file);\n }\n }\n\n /** Find a single entry by name. Returns undefined if absent. */\n async findEntry(name: string): Promise<ZipEntry | undefined> {\n for await (const entry of this.entries()) {\n if (entry.name === name) return entry;\n }\n return undefined;\n }\n\n /** Close the reader. */\n close(): void {\n this.file.close();\n }\n\n private readNext(): Promise<yauzl.Entry | null> {\n return new Promise((resolve, reject) => {\n const onEntry = (entry: yauzl.Entry): void => {\n cleanup();\n resolve(entry);\n };\n const onEnd = (): void => {\n cleanup();\n resolve(null);\n };\n const onError = (err: unknown): void => {\n cleanup();\n reject(\n new MinecraftKitError(\"ARCHIVE_INVALID\", \"Failed to read archive entry\", {\n cause: err,\n context: { filePath: this.filePath },\n }),\n );\n };\n const cleanup = (): void => {\n this.file.removeListener(\"entry\", onEntry);\n this.file.removeListener(\"end\", onEnd);\n this.file.removeListener(\"error\", onError);\n };\n this.file.once(\"entry\", onEntry);\n this.file.once(\"end\", onEnd);\n this.file.once(\"error\", onError);\n this.file.readEntry();\n });\n }\n\n private toZipEntry(entry: yauzl.Entry, file: yauzl.ZipFile): ZipEntry {\n const name = entry.fileName;\n const isDirectory = name.endsWith(\"/\");\n return {\n name,\n compressedSize: entry.compressedSize,\n uncompressedSize: entry.uncompressedSize,\n isDirectory,\n readBuffer: async () => {\n if (entry.uncompressedSize > EXTRACTION_MAX_FILE_SIZE) {\n throw new MinecraftKitError(\n \"ARCHIVE_TOO_LARGE\",\n `Archive entry exceeds size cap: ${name}`,\n { context: { filePath: this.filePath, entryName: name, size: entry.uncompressedSize } },\n );\n }\n if (\n entry.compressedSize > 0 &&\n entry.uncompressedSize / entry.compressedSize > EXTRACTION_MAX_COMPRESSION_RATIO\n ) {\n throw new MinecraftKitError(\n \"ARCHIVE_TOO_LARGE\",\n `Archive entry exceeds compression-ratio cap: ${name}`,\n { context: { filePath: this.filePath, entryName: name } },\n );\n }\n const stream = await openStream(file, entry, this.filePath);\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n },\n openReadStream: () => openStream(file, entry, this.filePath),\n };\n }\n}\n\nfunction openStream(\n file: yauzl.ZipFile,\n entry: yauzl.Entry,\n archivePath: string,\n): Promise<Readable> {\n return new Promise((resolve, reject) => {\n file.openReadStream(entry, (err, stream) => {\n if (err || !stream) {\n reject(\n new MinecraftKitError(\n \"ARCHIVE_INVALID\",\n `Failed to open archive entry: ${entry.fileName}`,\n { cause: err, context: { filePath: archivePath, entryName: entry.fileName } },\n ),\n );\n return;\n }\n resolve(stream);\n });\n });\n}\n\n/** Inputs to {@link extractEntryToDir}. */\nexport interface ExtractOptions {\n /** Path-prefix exclusion list. Defaults to `[\"META-INF/\"]`. */\n readonly excludePrefixes?: readonly string[];\n /** When false, refuse to overwrite existing files. */\n readonly overwrite?: boolean;\n}\n\n/** Extract every file entry from a zip into `targetDir`, applying safety checks. */\nexport async function extractAllToDir(\n zipPath: string,\n targetDir: string,\n options: ExtractOptions = {},\n): Promise<{ readonly fileCount: number }> {\n const exclude = options.excludePrefixes ?? [\"META-INF/\"];\n let fileCount = 0;\n let totalSize = 0;\n await ensureDir(targetDir);\n const reader = await openZip(zipPath);\n try {\n for await (const entry of reader.entries()) {\n if (entry.isDirectory) continue;\n if (exclude.some((prefix) => entry.name.startsWith(prefix))) continue;\n assertSafeEntryName(entry.name);\n const destination = path.join(targetDir, entry.name);\n assertWithinRoot(targetDir, entry.name);\n totalSize += entry.uncompressedSize;\n if (totalSize > EXTRACTION_MAX_TOTAL_SIZE) {\n throw new MinecraftKitError(\n \"ARCHIVE_TOO_LARGE\",\n `Archive total size cap exceeded: ${zipPath}`,\n { context: { filePath: zipPath } },\n );\n }\n if (entry.uncompressedSize > EXTRACTION_MAX_FILE_SIZE) {\n throw new MinecraftKitError(\n \"ARCHIVE_TOO_LARGE\",\n `Archive entry exceeds size cap: ${entry.name}`,\n { context: { filePath: zipPath, entryName: entry.name } },\n );\n }\n await ensureDir(path.dirname(destination));\n const stream = await entry.openReadStream();\n await pipeline(stream, createWriteStream(destination));\n if (\n entry.name.endsWith(\".so\") ||\n entry.name.endsWith(\".dylib\") ||\n entry.name.endsWith(\".jnilib\")\n ) {\n await chmodExecutable(destination);\n }\n fileCount++;\n }\n } finally {\n reader.close();\n }\n return { fileCount };\n}\n\nconst RESERVED_NAME = /^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\\..*)?$/i;\n\n/** Reject entry names that are dangerous regardless of containment. */\nexport function assertSafeEntryName(name: string): void {\n if (!name) {\n throw rejectEntry(name, \"empty entry name\");\n }\n if (name.includes(String.fromCharCode(0))) {\n throw rejectEntry(name, \"null byte\");\n }\n if (path.posix.isAbsolute(name) || /^[a-zA-Z]:/.test(name) || name.startsWith(\"\\\\\")) {\n throw rejectEntry(name, \"absolute path\");\n }\n const segments = name.split(\"/\");\n for (const segment of segments) {\n if (segment === \"..\") {\n throw rejectEntry(name, \"parent traversal\");\n }\n if (RESERVED_NAME.test(segment)) {\n throw rejectEntry(name, \"reserved Windows name\");\n }\n if (/[\\s.]$/.test(segment)) {\n throw rejectEntry(name, \"trailing dot or whitespace\");\n }\n }\n}\n\nfunction rejectEntry(name: string, reason: string): MinecraftKitError {\n return new MinecraftKitError(\n \"ARCHIVE_ENTRY_REJECTED\",\n `Archive entry rejected (${reason}): ${name}`,\n { context: { entryName: name, reason } },\n );\n}\n\n/** Read a single named entry to a Buffer. Returns undefined if missing. */\nexport async function readEntryBuffer(\n zipPath: string,\n entryName: string,\n): Promise<Buffer | undefined> {\n const reader = await openZip(zipPath);\n try {\n const entry = await reader.findEntry(entryName);\n if (!entry) return undefined;\n return await entry.readBuffer();\n } finally {\n reader.close();\n }\n}\n\n/** Extract a single entry to a destination path. */\nexport async function extractSingleEntry(\n zipPath: string,\n entryName: string,\n destination: string,\n): Promise<void> {\n const buffer = await readEntryBuffer(zipPath, entryName);\n if (!buffer) {\n throw new MinecraftKitError(\"ARCHIVE_INVALID\", `Archive entry not found: ${entryName}`, {\n context: { filePath: zipPath, entryName },\n });\n }\n await atomicWrite(destination, buffer);\n}\n\n/**\n * JAR manifest line-continuation: a line break followed by a single space or tab joins\n * the next line onto the previous one. See JAR specification.\n */\nconst MANIFEST_LINE_CONTINUATION = /\\r?\\n[ \\t]/g;\nconst MANIFEST_MAIN_CLASS = /^Main-Class:\\s*(.+)$/i;\n\n/** Read the `Main-Class` attribute from a JAR's `META-INF/MANIFEST.MF`. */\nexport async function readJarMainClass(zipPath: string): Promise<string | undefined> {\n const buf = await readEntryBuffer(zipPath, \"META-INF/MANIFEST.MF\");\n if (!buf) return undefined;\n const text = buf.toString(\"utf8\").replaceAll(MANIFEST_LINE_CONTINUATION, \"\");\n for (const line of text.split(/\\r?\\n/)) {\n const match = MANIFEST_MAIN_CLASS.exec(line);\n if (match?.[1]) return match[1].trim();\n }\n return undefined;\n}\n","/** Return a new array preserving first-occurrence order, keyed by `key(value)`. */\nexport function dedupeBy<T, K>(values: readonly T[], key: (value: T) => K): readonly T[] {\n const seen = new Set<K>();\n const result: T[] = [];\n for (const value of values) {\n const k = key(value);\n if (seen.has(k)) continue;\n seen.add(k);\n result.push(value);\n }\n return result;\n}\n\n/** Return a new array preserving first-occurrence order, deduplicated by value identity. */\nexport function dedupe<T>(values: readonly T[]): readonly T[] {\n return dedupeBy(values, (v) => v);\n}\n","import {\n HTTP_RETRY_BACKOFF_BASE_MS,\n HTTP_RETRY_BACKOFF_CAP_MS,\n HTTP_RETRY_MAX,\n} from \"../constants/defaults\";\nimport { MinecraftKitError, isMinecraftKitError } from \"./errors\";\n\n/** Inputs passed to {@link withRetry}. */\nexport interface RetryOptions {\n readonly maxAttempts?: number;\n readonly baseMs?: number;\n readonly capMs?: number;\n readonly signal?: AbortSignal;\n readonly sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;\n readonly random?: () => number;\n readonly onAttemptFailed?: (error: unknown, attempt: number) => void;\n}\n\n/** Default sleep that respects the abort signal. */\nexport function abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(toAbortError(signal));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(toAbortError(signal));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction toAbortError(signal?: AbortSignal): Error {\n return new MinecraftKitError(\"NETWORK_ABORTED\", \"Operation aborted\", {\n context: { reason: signal?.reason },\n });\n}\n\n/**\n * Run `op` with full-jitter exponential backoff. Retries only when {@link isRetryable}\n * returns true.\n */\nexport async function withRetry<T>(\n op: (attempt: number) => Promise<T>,\n isRetryable: (error: unknown) => boolean,\n options: RetryOptions = {},\n): Promise<T> {\n const max = options.maxAttempts ?? HTTP_RETRY_MAX;\n const base = options.baseMs ?? HTTP_RETRY_BACKOFF_BASE_MS;\n const cap = options.capMs ?? HTTP_RETRY_BACKOFF_CAP_MS;\n const sleep = options.sleep ?? abortableSleep;\n const random = options.random ?? Math.random;\n let lastError: unknown;\n for (let attempt = 0; attempt < max; attempt++) {\n if (options.signal?.aborted) {\n throw toAbortError(options.signal);\n }\n try {\n return await op(attempt);\n } catch (error) {\n lastError = error;\n options.onAttemptFailed?.(error, attempt);\n if (!isRetryable(error) || attempt === max - 1) {\n throw error;\n }\n const delayCap = Math.min(cap, base * 2 ** attempt);\n const delay = Math.floor(random() * delayCap);\n await sleep(delay, options.signal);\n }\n }\n // Should be unreachable; the for-loop returns or throws.\n throw lastError ?? new Error(\"withRetry exhausted attempts\");\n}\n\n/** Default retry predicate for HTTP-like errors. */\nexport function isHttpRetryable(error: unknown): boolean {\n if (!isMinecraftKitError(error)) {\n return false;\n }\n if (error.code === \"NETWORK_ABORTED\") return false;\n if (error.code === \"NETWORK_TIMEOUT\") return true;\n if (error.code === \"NETWORK_HTTP_ERROR\") {\n const status = typeof error.context.httpStatus === \"number\" ? error.context.httpStatus : 0;\n if (status === 408 || status === 425 || status === 429) return true;\n if (status >= 500 && status < 600) return true;\n return status === 0;\n }\n return false;\n}\n","import crypto from \"node:crypto\";\nimport { createWriteStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { HTTP_RETRY_MAX } from \"../constants/defaults\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { ensureDir } from \"../core/fs\";\nimport { isHttpRetryable, withRetry } from \"../core/retry\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\n\n/** Inputs to {@link downloadFile}. */\nexport interface DownloadFileInput {\n readonly url: string;\n readonly target: string;\n readonly expectedSha1?: string;\n readonly expectedSize?: number;\n readonly category?: string;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/** Outputs from a successful download. */\nexport interface DownloadFileResult {\n readonly bytesDownloaded: number;\n readonly sha1: string;\n readonly skipped: boolean;\n}\n\n/**\n * Stream a URL to a file with on-the-fly hash verification, atomic rename, retries, and\n * progress events. Skips the download when the destination already exists with matching\n * size + sha1.\n */\nexport async function downloadFile(\n http: HttpClient,\n input: DownloadFileInput,\n): Promise<DownloadFileResult> {\n const fileRef = { url: input.url, target: input.target, category: input.category };\n if (input.expectedSha1 !== undefined) {\n const existing = await checkExistingFile(input.target, input.expectedSha1, input.expectedSize);\n if (existing.matches) {\n input.onEvent?.({ type: \"download:skipped\", file: fileRef });\n return { bytesDownloaded: 0, sha1: existing.sha1, skipped: true };\n }\n }\n await ensureDir(path.dirname(input.target));\n const tmp = `${input.target}.${crypto.randomBytes(4).toString(\"hex\")}.download`;\n return withRetry(\n async () => {\n input.onEvent?.({\n type: \"download:started\",\n file: fileRef,\n expectedSize: input.expectedSize ?? 0,\n });\n const startedAt = Date.now();\n let bytesDownloaded = 0;\n const hash = crypto.createHash(\"sha1\");\n const response = await http.request(input.url, { signal: input.signal });\n const contentLength = Number(response.headers[\"content-length\"] ?? \"0\");\n const total = input.expectedSize ?? (Number.isFinite(contentLength) ? contentLength : 0);\n const sourceIterable = response.stream();\n const counting = (async function* () {\n for await (const chunk of sourceIterable) {\n bytesDownloaded += chunk.byteLength;\n hash.update(chunk);\n input.onEvent?.({\n type: \"download:progress\",\n file: fileRef,\n bytesDownloaded,\n totalBytes: total,\n });\n yield chunk;\n }\n })();\n try {\n await pipeline(Readable.from(counting), createWriteStream(tmp));\n } catch (cause) {\n await safeUnlink(tmp);\n throw new MinecraftKitError(\n \"FILESYSTEM_WRITE_ERROR\",\n `Failed to write download: ${input.target}`,\n { cause, context: { filePath: input.target, url: input.url } },\n );\n }\n const computedSha1 = hash.digest(\"hex\");\n if (input.expectedSize !== undefined && bytesDownloaded !== input.expectedSize) {\n await safeUnlink(tmp);\n throw new MinecraftKitError(\"INTEGRITY_SIZE_MISMATCH\", `Size mismatch for ${input.url}`, {\n context: {\n url: input.url,\n expectedSize: input.expectedSize,\n actualSize: bytesDownloaded,\n },\n });\n }\n if (input.expectedSha1 !== undefined && computedSha1 !== input.expectedSha1) {\n await safeUnlink(tmp);\n input.onEvent?.({\n type: \"integrity:mismatch\",\n file: fileRef,\n algorithm: \"sha1\",\n expected: input.expectedSha1,\n actual: computedSha1,\n });\n throw new MinecraftKitError(\"INTEGRITY_HASH_MISMATCH\", `SHA-1 mismatch for ${input.url}`, {\n context: {\n url: input.url,\n expectedHash: input.expectedSha1,\n actualHash: computedSha1,\n },\n });\n }\n try {\n await fs.rename(tmp, input.target);\n } catch (cause) {\n await safeUnlink(tmp);\n throw new MinecraftKitError(\n \"FILESYSTEM_WRITE_ERROR\",\n `Failed to finalize download: ${input.target}`,\n { cause, context: { filePath: input.target } },\n );\n }\n input.onEvent?.({\n type: \"download:completed\",\n file: fileRef,\n durationMs: Date.now() - startedAt,\n bytes: bytesDownloaded,\n });\n if (input.expectedSha1 !== undefined) {\n input.onEvent?.({\n type: \"integrity:verified\",\n file: fileRef,\n algorithm: \"sha1\",\n hash: computedSha1,\n });\n }\n return { bytesDownloaded, sha1: computedSha1, skipped: false };\n },\n isHttpRetryable,\n {\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n onAttemptFailed: (error, attempt) => {\n input.onEvent?.({\n type: \"download:failed\",\n file: fileRef,\n error: error instanceof Error ? error : new Error(String(error)),\n willRetry: isHttpRetryable(error) && attempt < HTTP_RETRY_MAX - 1,\n });\n },\n },\n );\n}\n\nasync function checkExistingFile(\n target: string,\n expectedSha1: string,\n expectedSize: number | undefined,\n): Promise<{ readonly matches: boolean; readonly sha1: string }> {\n let stat: Awaited<ReturnType<typeof fs.stat>>;\n try {\n stat = await fs.stat(target);\n } catch {\n return { matches: false, sha1: \"\" };\n }\n if (!stat.isFile()) {\n return { matches: false, sha1: \"\" };\n }\n if (expectedSize !== undefined && stat.size !== expectedSize) {\n return { matches: false, sha1: \"\" };\n }\n const buf = await fs.readFile(target);\n const sha1 = crypto.createHash(\"sha1\").update(buf).digest(\"hex\");\n return { matches: sha1 === expectedSha1, sha1 };\n}\n\nasync function safeUnlink(filePath: string): Promise<void> {\n try {\n await fs.unlink(filePath);\n } catch {\n // Best-effort.\n }\n}\n","import path from \"node:path\";\nimport { ApiEndpoints } from \"../constants/api\";\nimport { extractSingleEntry, openZip, readEntryBuffer } from \"../core/archive\";\nimport { dedupe, dedupeBy } from \"../core/collections\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { atomicWrite } from \"../core/fs\";\nimport { mavenRelativePathFor } from \"../core/maven\";\nimport { targetPaths } from \"../core/paths\";\nimport { evaluateRules } from \"../core/rules\";\nimport { downloadFile } from \"../http/download\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type {\n ForgeInstallProfile,\n ForgeProcessor,\n ForgeVersionJson,\n ResolvedForgeLoader,\n} from \"../types/forge\";\nimport type { HttpClient } from \"../types/http\";\nimport {\n type DownloadAction,\n InstallActionKinds,\n type RunForgeProcessorAction,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport type { ResolvedMinecraft } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\nimport { planLibraryDownloads } from \"./libraries\";\n\n/** Outputs of {@link planForgeInstall}. */\nexport interface ForgeInstallPlan {\n readonly installerDownload: DownloadAction;\n readonly libraryDownloads: readonly DownloadAction[];\n readonly classpathFiles: readonly string[];\n readonly processorActions: readonly RunForgeProcessorAction[];\n readonly versionJson: WriteVersionJsonAction;\n readonly versionId: string;\n readonly profile: ForgeInstallProfile;\n readonly version: ForgeVersionJson;\n}\n\n/** Inputs to {@link planForgeInstall}. */\nexport interface PlanForgeInstallInput {\n readonly loader: ResolvedForgeLoader;\n readonly minecraft: ResolvedMinecraft;\n readonly directory: string;\n readonly system: RuntimeSystem;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/**\n * Plan the Forge install steps. Downloads the installer, parses install_profile + version.json,\n * extracts embedded artifacts to `libraries/`, and prepares processor invocations.\n */\nexport async function planForgeInstall(input: PlanForgeInstallInput): Promise<ForgeInstallPlan> {\n const installerPath = targetPaths.forgeInstaller(input.directory, input.loader.fullVersion);\n await downloadFile(input.http, {\n url: input.loader.installerUrl,\n target: installerPath,\n category: \"forge-installer\",\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n\n const installerDownload: DownloadAction = {\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: input.loader.installerUrl,\n target: installerPath,\n category: \"forge-installer\",\n };\n\n const profile = await readJsonEntry<ForgeInstallProfile>(installerPath, \"install_profile.json\");\n const versionRelative = profile.json.startsWith(\"/\") ? profile.json.slice(1) : profile.json;\n const version = await readJsonEntry<ForgeVersionJson>(installerPath, versionRelative);\n\n await extractInstallerMavenEntries(installerPath, input.directory);\n\n const dataResolved = await resolveProfileData({\n profile,\n installerPath,\n directory: input.directory,\n });\n\n const installerLibraries = planLibraryDownloads({\n libraries: profile.libraries,\n directory: input.directory,\n system: input.system,\n versionId: input.minecraft.version,\n category: \"forge-library\",\n });\n const versionLibraries = planLibraryDownloads({\n libraries: version.libraries,\n directory: input.directory,\n system: input.system,\n versionId: version.id,\n category: \"forge-library\",\n });\n\n const dedupedDownloads = dedupeBy(\n [...installerLibraries.downloads, ...versionLibraries.downloads],\n (action) => action.target,\n );\n const classpathFiles = dedupe([\n ...installerLibraries.classpathFiles,\n ...versionLibraries.classpathFiles,\n ]);\n\n const processorActions = await buildProcessorActions({\n profile,\n minecraft: input.minecraft,\n installerPath,\n directory: input.directory,\n system: input.system,\n dataResolved,\n });\n\n const versionJsonPath = targetPaths.versionJson(input.directory, version.id);\n const versionJson: WriteVersionJsonAction = {\n kind: InstallActionKinds.WRITE_VERSION_JSON,\n path: versionJsonPath,\n content: `${JSON.stringify(version, null, 2)}\\n`,\n };\n\n return {\n installerDownload,\n libraryDownloads: dedupedDownloads,\n classpathFiles,\n processorActions,\n versionJson,\n versionId: version.id,\n profile,\n version,\n };\n}\n\nasync function readJsonEntry<T>(zipPath: string, entryName: string): Promise<T> {\n const buffer = await readEntryBuffer(zipPath, entryName);\n if (!buffer) {\n throw new MinecraftKitError(\n \"FORGE_INSTALLER_INVALID\",\n `Forge installer is missing required entry: ${entryName}`,\n { context: { filePath: zipPath, entryName } },\n );\n }\n try {\n return JSON.parse(buffer.toString(\"utf8\")) as T;\n } catch (cause) {\n throw new MinecraftKitError(\n \"FORGE_INSTALLER_INVALID\",\n `Forge installer entry is not valid JSON: ${entryName}`,\n { cause, context: { filePath: zipPath, entryName } },\n );\n }\n}\n\nasync function extractInstallerMavenEntries(\n installerPath: string,\n directory: string,\n): Promise<void> {\n const reader = await openZip(installerPath);\n try {\n for await (const entry of reader.entries()) {\n if (!entry.name.startsWith(\"maven/\") || entry.isDirectory) continue;\n const relativeWithinLibraries = entry.name.slice(\"maven/\".length);\n const destination = path.join(targetPaths.librariesDir(directory), relativeWithinLibraries);\n const buffer = await entry.readBuffer();\n await atomicWrite(destination, buffer);\n }\n } finally {\n reader.close();\n }\n}\n\ninterface ResolvedProfileData {\n readonly tokens: Readonly<Record<string, ResolvedTokenValue>>;\n}\n\ninterface ResolvedTokenValue {\n /** Final string used in argument substitution. */\n readonly value: string;\n /** When true, the value is an on-disk path; otherwise it is a literal. */\n readonly isPath: boolean;\n}\n\nasync function resolveProfileData(input: {\n readonly profile: ForgeInstallProfile;\n readonly installerPath: string;\n readonly directory: string;\n}): Promise<ResolvedProfileData> {\n const tokens: Record<string, ResolvedTokenValue> = {};\n for (const [key, sided] of Object.entries(input.profile.data)) {\n const raw = sided.client;\n tokens[key] = await resolveDataValue(raw, input.installerPath, input.directory);\n }\n return { tokens };\n}\n\nasync function resolveDataValue(\n raw: string,\n installerPath: string,\n directory: string,\n): Promise<ResolvedTokenValue> {\n if (raw.startsWith(\"[\") && raw.endsWith(\"]\")) {\n const coord = raw.slice(1, -1);\n const relativePath = mavenRelativePathFor(coord);\n return {\n value: path.join(targetPaths.librariesDir(directory), relativePath),\n isPath: true,\n };\n }\n if (raw.startsWith(\"'\")) {\n return { value: raw.slice(1), isPath: false };\n }\n if (raw.startsWith(\"/\")) {\n const entryName = raw.slice(1);\n const destination = path.join(targetPaths.librariesDir(directory), \"forge-data\", entryName);\n await extractSingleEntry(installerPath, entryName, destination);\n return { value: destination, isPath: true };\n }\n return { value: raw, isPath: false };\n}\n\nasync function buildProcessorActions(input: {\n readonly profile: ForgeInstallProfile;\n readonly minecraft: ResolvedMinecraft;\n readonly installerPath: string;\n readonly directory: string;\n readonly system: RuntimeSystem;\n readonly dataResolved: ResolvedProfileData;\n}): Promise<readonly RunForgeProcessorAction[]> {\n const builtIns: Record<string, ResolvedTokenValue> = {\n SIDE: { value: \"client\", isPath: false },\n MINECRAFT_JAR: {\n value: targetPaths.versionJar(input.directory, input.minecraft.version),\n isPath: true,\n },\n MINECRAFT_VERSION: { value: input.minecraft.version, isPath: false },\n ROOT: { value: input.directory, isPath: true },\n INSTALLER: { value: input.installerPath, isPath: true },\n LIBRARY_DIR: { value: targetPaths.librariesDir(input.directory), isPath: true },\n };\n const tokens: Readonly<Record<string, ResolvedTokenValue>> = {\n ...builtIns,\n ...input.dataResolved.tokens,\n };\n const actions: RunForgeProcessorAction[] = [];\n let index = 0;\n for (const processor of input.profile.processors) {\n if (!processorAppliesToClient(processor)) {\n continue;\n }\n if (!evaluateRules([], { system: input.system })) {\n // Currently processors do not carry rules; placeholder for future expansion.\n }\n const action = buildProcessorAction({\n processor,\n directory: input.directory,\n tokens,\n index,\n });\n actions.push(action);\n index++;\n }\n return actions;\n}\n\nfunction processorAppliesToClient(processor: ForgeProcessor): boolean {\n if (!processor.sides || processor.sides.length === 0) return true;\n return processor.sides.includes(\"client\");\n}\n\nfunction buildProcessorAction(input: {\n readonly processor: ForgeProcessor;\n readonly directory: string;\n readonly tokens: Readonly<Record<string, ResolvedTokenValue>>;\n readonly index: number;\n}): RunForgeProcessorAction {\n const jarPath = path.join(\n targetPaths.librariesDir(input.directory),\n mavenRelativePathFor(input.processor.jar),\n );\n // Note: `Main-Class` is read from the JAR at runtime, not here. Newer Forge versions\n // ship some processor JARs as regular Maven libraries that haven't been downloaded\n // yet at planning time.\n const classpath = [\n jarPath,\n ...input.processor.classpath.map((coord) =>\n path.join(targetPaths.librariesDir(input.directory), mavenRelativePathFor(coord)),\n ),\n ];\n const args = input.processor.args.map((arg) => substituteToken(arg, input.tokens));\n const outputs: Record<string, string> = {};\n if (input.processor.outputs) {\n for (const [key, value] of Object.entries(input.processor.outputs)) {\n outputs[substituteToken(key, input.tokens)] = stripLiteralPrefix(\n substituteToken(value, input.tokens),\n );\n }\n }\n return {\n kind: InstallActionKinds.RUN_FORGE_PROCESSOR,\n index: input.index,\n classpath,\n args,\n outputs,\n };\n}\n\nfunction substituteToken(\n raw: string,\n tokens: Readonly<Record<string, ResolvedTokenValue>>,\n): string {\n if (raw.startsWith(\"[\") && raw.endsWith(\"]\")) {\n return path.join(...mavenRelativePathFor(raw.slice(1, -1)).split(\"/\"));\n }\n return raw.replaceAll(/\\{([A-Z0-9_]+)\\}/g, (match, key: string) => {\n const token = tokens[key];\n if (token === undefined) {\n throw new MinecraftKitError(\"FORGE_INSTALLER_INVALID\", `Unknown processor token: ${match}`, {\n context: { token: key },\n });\n }\n return token.value;\n });\n}\n\nfunction stripLiteralPrefix(value: string): string {\n return value.startsWith(\"'\") ? value.slice(1) : value;\n}\n\n/** Build the Forge installer download URL. Used by repair flows that need to refetch. */\nexport function forgeInstallerUrl(fullVersion: string): string {\n return ApiEndpoints.forge.installer(fullVersion);\n}\n","import path from \"node:path\";\nimport { targetPaths } from \"../core/paths\";\nimport { fetchJson } from \"../http/metadata\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { HttpClient } from \"../types/http\";\nimport { type DownloadAction, InstallActionKinds } from \"../types/install\";\nimport type { ResolvedRuntime, RuntimeFilesManifest } from \"../types/runtime\";\n\n/** Plan the per-file downloads required to install a runtime. */\nexport async function planRuntimeDownloads(input: {\n readonly runtime: ResolvedRuntime;\n readonly directory: string;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n}): Promise<{\n readonly actions: readonly DownloadAction[];\n readonly manifest: RuntimeFilesManifest;\n}> {\n const manifest = await fetchJson<RuntimeFilesManifest>(input.http, input.cache, {\n url: input.runtime.manifestUrl,\n cacheKey: `runtime-manifest:${input.runtime.component}:${input.runtime.platformKey}:${input.runtime.manifestSha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const actions: DownloadAction[] = [];\n const runtimeRoot = targetPaths.runtimeRoot(\n input.directory,\n input.runtime.component,\n input.runtime.installRoot,\n );\n for (const [relativePath, entry] of Object.entries(manifest.files)) {\n if (entry.type !== \"file\") continue;\n const target = path.join(runtimeRoot, relativePath);\n actions.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: entry.downloads.raw.url,\n target,\n expectedSha1: entry.downloads.raw.sha1,\n expectedSize: entry.downloads.raw.size,\n category: \"runtime-file\",\n });\n }\n return { actions, manifest };\n}\n","import { targetPaths } from \"../core/paths\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport { type InstallAction, InstallActionKinds, type InstallPlan } from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { Target } from \"../types/target\";\nimport { planAssetDownloads } from \"./assets\";\nimport { planFabricInstall } from \"./fabric-install\";\nimport { planForgeInstall } from \"./forge-install\";\nimport { planLibraryDownloads } from \"./libraries\";\nimport { planRuntimeDownloads } from \"./runtime\";\n\n/** Inputs to the install planner. */\nexport interface PlanInstallInput {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/** Build a flat install plan for the given target. */\nexport async function planInstall(input: PlanInstallInput): Promise<InstallPlan> {\n const { target } = input;\n const actions: InstallAction[] = [];\n\n // 1. Vanilla client jar.\n actions.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: target.minecraft.manifest.downloads.client.url,\n target: targetPaths.versionJar(target.directory, target.minecraft.version),\n expectedSha1: target.minecraft.manifest.downloads.client.sha1,\n expectedSize: target.minecraft.manifest.downloads.client.size,\n category: \"client-jar\",\n });\n\n // 2. Vanilla version JSON (write).\n actions.push({\n kind: InstallActionKinds.WRITE_VERSION_JSON,\n path: targetPaths.versionJson(target.directory, target.minecraft.version),\n content: `${JSON.stringify(target.minecraft.manifest, null, 2)}\\n`,\n });\n\n // 3. Vanilla libraries + native extractions.\n const vanillaLibraries = planLibraryDownloads({\n libraries: target.minecraft.manifest.libraries,\n directory: target.directory,\n system: target.runtime.system,\n versionId: target.minecraft.version,\n category: \"library\",\n });\n actions.push(...vanillaLibraries.downloads);\n actions.push(...vanillaLibraries.nativeExtractions);\n\n // 4. Asset index + objects.\n const assetPlan = await planAssetDownloads({\n directory: target.directory,\n assetIndex: target.minecraft.manifest.assetIndex,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n actions.push(...assetPlan.actions);\n\n // 5. Logging config.\n if (target.minecraft.manifest.logging?.client) {\n const logging = target.minecraft.manifest.logging.client;\n actions.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: logging.file.url,\n target: targetPaths.loggingConfig(target.directory, logging.file.id),\n expectedSha1: logging.file.sha1,\n expectedSize: logging.file.size,\n category: \"logging-config\",\n });\n }\n\n // 6. Runtime files.\n const runtimePlan = await planRuntimeDownloads({\n runtime: target.runtime,\n directory: target.directory,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n actions.push(...runtimePlan.actions);\n\n // 7. Loader-specific extras.\n if (target.loader.type === Loaders.FABRIC) {\n const fabricPlan = planFabricInstall({\n loader: target.loader,\n minecraft: target.minecraft,\n directory: target.directory,\n system: target.runtime.system,\n });\n actions.push(fabricPlan.versionJson);\n actions.push(...fabricPlan.libraryDownloads);\n } else if (target.loader.type === Loaders.FORGE) {\n const forgePlan = await planForgeInstall({\n loader: target.loader,\n minecraft: target.minecraft,\n directory: target.directory,\n system: target.runtime.system,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n actions.push(forgePlan.installerDownload);\n actions.push(...forgePlan.libraryDownloads);\n actions.push(forgePlan.versionJson);\n actions.push(...forgePlan.processorActions);\n }\n\n const totalBytes = actions.reduce((sum, action) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return sum + (action.expectedSize ?? 0);\n }\n return sum;\n }, 0);\n\n return {\n targetId: target.id,\n directory: target.directory,\n target,\n actions,\n totalActions: actions.length,\n totalBytes,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { ensureDir } from \"../core/fs\";\nimport { targetPaths } from \"../core/paths\";\nimport type { ResolvedRuntime, RuntimeFilesManifest } from \"../types/runtime\";\n\n/**\n * Materialize directory placeholders and symlinks declared by a runtime manifest.\n *\n * Plain file entries are handled by the regular downloader; this function fills in the\n * non-file entry types after the downloads have completed.\n */\nexport async function materializeRuntimeExtras(input: {\n readonly runtime: ResolvedRuntime;\n readonly directory: string;\n readonly manifest: RuntimeFilesManifest;\n}): Promise<void> {\n const root = targetPaths.runtimeRoot(\n input.directory,\n input.runtime.component,\n input.runtime.installRoot,\n );\n for (const [relativePath, entry] of Object.entries(input.manifest.files)) {\n const fullPath = path.join(root, relativePath);\n if (entry.type === \"directory\") {\n await ensureDir(fullPath);\n } else if (entry.type === \"link\") {\n await ensureDir(path.dirname(fullPath));\n await unlinkIfPresent(fullPath);\n await createLinkOrCopy(root, relativePath, entry.target, fullPath);\n } else if (entry.executable && process.platform !== \"win32\") {\n // chmod failure is non-fatal: the file may simply be on a filesystem that ignores mode\n // bits (FAT, SMB). The launcher will fail later with a clearer error if the binary is\n // truly not executable.\n await fs.chmod(fullPath, 0o755).catch(() => {});\n }\n }\n}\n\nasync function unlinkIfPresent(target: string): Promise<void> {\n try {\n await fs.unlink(target);\n } catch (cause) {\n if (isNotFound(cause)) return;\n throw new MinecraftKitError(\n \"FILESYSTEM_WRITE_ERROR\",\n `Failed to remove stale runtime entry: ${target}`,\n { cause, context: { filePath: target } },\n );\n }\n}\n\nasync function createLinkOrCopy(\n root: string,\n relativePath: string,\n linkTarget: string,\n destination: string,\n): Promise<void> {\n try {\n await fs.symlink(linkTarget, destination);\n return;\n } catch (symlinkError) {\n // Symlinks are restricted on Windows and some filesystems. Fall back to copying the\n // resolved file. If copy ALSO fails the runtime is unusable, so we throw with both\n // failures attached as context.\n const absoluteSource = path.resolve(path.dirname(path.join(root, relativePath)), linkTarget);\n try {\n await fs.copyFile(absoluteSource, destination);\n } catch (copyError) {\n throw new MinecraftKitError(\n \"FILESYSTEM_WRITE_ERROR\",\n `Failed to materialize runtime entry: ${destination}`,\n {\n cause: copyError,\n context: {\n filePath: destination,\n linkTarget,\n symlinkError: errorMessage(symlinkError),\n },\n },\n );\n }\n }\n}\n\nfunction isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import crypto from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport pLimit from \"p-limit\";\nimport { DOWNLOAD_CONCURRENCY, MAX_PROCESSOR_STDERR_LINES } from \"../constants/defaults\";\nimport { extractAllToDir, readJarMainClass } from \"../core/archive\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { atomicWrite } from \"../core/fs\";\nimport { targetPaths } from \"../core/paths\";\nimport { downloadFile } from \"../http/download\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport {\n type DownloadAction,\n type ExtractNativeAction,\n type InstallAction,\n InstallActionKinds,\n type InstallPlan,\n type InstallReport,\n type RunForgeProcessorAction,\n type WriteLoggingConfigAction,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport { type InstallPhase, InstallPhases } from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { Spawner } from \"../types/spawner\";\nimport type { OperatingSystem } from \"../types/system\";\nimport { planRuntimeDownloads } from \"./runtime\";\nimport { materializeRuntimeExtras } from \"./runtime-extras\";\n\n/** Inputs to the install runner. */\nexport interface RunInstallInput {\n readonly plan: InstallPlan;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly spawner: Spawner;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n readonly concurrency?: number;\n}\n\n/** Execute an install plan. */\nexport async function runInstall(input: RunInstallInput): Promise<InstallReport> {\n const startedAt = Date.now();\n let bytesDownloaded = 0;\n let actionsCompleted = 0;\n let actionsSkipped = 0;\n const onEvent = input.onEvent;\n let currentPhase: InstallPhase | null = null;\n const enterPhase = (phase: InstallPhase): void => {\n if (phase === currentPhase) return;\n onEvent?.({ type: \"install:phase-changed\", phase, previous: currentPhase });\n currentPhase = phase;\n };\n\n const downloads = input.plan.actions.filter(isDownload);\n const natives = input.plan.actions.filter(isNative);\n const writeActions = input.plan.actions.filter(isWrite);\n const processors = input.plan.actions.filter(isProcessor);\n\n enterPhase(InstallPhases.PLANNING);\n\n // 1. Download files in parallel.\n enterPhase(InstallPhases.DOWNLOADING_LIBRARIES);\n const limit = pLimit(input.concurrency ?? DOWNLOAD_CONCURRENCY);\n await Promise.all(\n downloads.map((action) =>\n limit(async () => {\n if (input.signal?.aborted) {\n throw new MinecraftKitError(\"LAUNCH_ABORTED\", \"Install aborted by signal\");\n }\n const result = await downloadFile(input.http, {\n url: action.url,\n target: action.target,\n ...(action.expectedSha1 !== undefined ? { expectedSha1: action.expectedSha1 } : {}),\n ...(action.expectedSize !== undefined ? { expectedSize: action.expectedSize } : {}),\n ...(action.category !== undefined ? { category: action.category } : {}),\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n bytesDownloaded += result.bytesDownloaded;\n if (result.skipped) actionsSkipped++;\n actionsCompleted++;\n }),\n ),\n );\n\n // 2. Write version JSON / logging config files.\n if (writeActions.length > 0) {\n enterPhase(InstallPhases.WRITING_FILES);\n for (const action of writeActions) {\n if (input.signal?.aborted) {\n throw new MinecraftKitError(\"LAUNCH_ABORTED\", \"Install aborted by signal\");\n }\n await atomicWrite(action.path, action.content);\n actionsCompleted++;\n }\n }\n\n // 3. Native extractions.\n if (natives.length > 0) {\n enterPhase(InstallPhases.EXTRACTING_NATIVES);\n for (const action of natives) {\n if (input.signal?.aborted) {\n throw new MinecraftKitError(\"LAUNCH_ABORTED\", \"Install aborted by signal\");\n }\n const { fileCount } = await extractAllToDir(action.source, action.destination, {\n excludePrefixes: action.exclude as readonly string[],\n });\n input.onEvent?.({\n type: \"archive:extracted\",\n archive: action.source,\n target: action.destination,\n fileCount,\n });\n actionsCompleted++;\n }\n }\n\n // 4. Runtime extras (directories + symlinks for the runtime component).\n if (input.plan.target.runtime !== undefined) {\n enterPhase(InstallPhases.INSTALLING_RUNTIME);\n const runtimePlan = await planRuntimeDownloads({\n runtime: input.plan.target.runtime,\n directory: input.plan.directory,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n await materializeRuntimeExtras({\n runtime: input.plan.target.runtime,\n directory: input.plan.directory,\n manifest: runtimePlan.manifest,\n });\n }\n\n // 5. Forge processors.\n if (processors.length > 0) {\n enterPhase(InstallPhases.RUNNING_FORGE_PROCESSORS);\n if (input.plan.target.loader.type !== Loaders.FORGE) {\n throw new MinecraftKitError(\n \"FORGE_PROCESSOR_FAILED\",\n \"Forge processors planned for a non-Forge target\",\n );\n }\n const javaPath = targetPaths.runtimeJavaExecutable(\n input.plan.directory,\n input.plan.target.runtime.component,\n input.plan.target.runtime.system.os as OperatingSystem,\n input.plan.target.runtime.installRoot,\n );\n for (const action of processors) {\n if (input.signal?.aborted) {\n throw new MinecraftKitError(\"LAUNCH_ABORTED\", \"Install aborted by signal\");\n }\n await runProcessor({\n action,\n javaPath,\n spawner: input.spawner,\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n total: processors.length,\n });\n actionsCompleted++;\n }\n }\n\n enterPhase(InstallPhases.COMPLETED);\n\n return {\n targetId: input.plan.targetId,\n bytesDownloaded,\n actionsCompleted,\n actionsSkipped,\n durationMs: Date.now() - startedAt,\n };\n}\n\nfunction isDownload(action: InstallAction): action is DownloadAction {\n return action.kind === InstallActionKinds.DOWNLOAD_FILE;\n}\n\nfunction isNative(action: InstallAction): action is ExtractNativeAction {\n return action.kind === InstallActionKinds.EXTRACT_NATIVE;\n}\n\nfunction isProcessor(action: InstallAction): action is RunForgeProcessorAction {\n return action.kind === InstallActionKinds.RUN_FORGE_PROCESSOR;\n}\n\nfunction isWrite(\n action: InstallAction,\n): action is WriteVersionJsonAction | WriteLoggingConfigAction {\n return (\n action.kind === InstallActionKinds.WRITE_VERSION_JSON ||\n action.kind === InstallActionKinds.WRITE_LOGGING_CONFIG\n );\n}\n\n/** Inputs to {@link runProcessor}. */\nexport interface RunProcessorInput {\n readonly action: RunForgeProcessorAction;\n readonly javaPath: string;\n readonly spawner: Spawner;\n readonly onEvent?: ProgressListener;\n readonly total: number;\n}\n\n/** Execute a single Forge processor and verify its declared outputs. */\nexport async function runProcessor(input: RunProcessorInput): Promise<void> {\n const startedAt = Date.now();\n // Resolve Main-Class from the processor JAR (always classpath[0]) now that all\n // libraries have been downloaded. Deferring this from planning to runtime is what\n // lets newer Forge versions work, since their processor JARs ship as regular Maven\n // libraries instead of being bundled inside the installer.\n const processorJar = input.action.classpath[0];\n if (processorJar === undefined) {\n throw new MinecraftKitError(\n \"FORGE_INSTALLER_INVALID\",\n \"Forge processor has an empty classpath\",\n { context: { processorIndex: input.action.index } },\n );\n }\n const mainClass = await readJarMainClass(processorJar);\n if (!mainClass) {\n throw new MinecraftKitError(\n \"FORGE_INSTALLER_INVALID\",\n `Forge processor jar has no Main-Class: ${processorJar}`,\n { context: { filePath: processorJar } },\n );\n }\n const classpathSeparator = process.platform === \"win32\" ? \";\" : \":\";\n const args = [\n \"-cp\",\n input.action.classpath.join(classpathSeparator),\n mainClass,\n ...input.action.args,\n ];\n input.onEvent?.({\n type: \"forge:processor-started\",\n processor: { index: input.action.index, mainClass },\n total: input.total,\n });\n const stderrTail: string[] = [];\n const child = input.spawner.spawn(input.javaPath, args, { cwd: process.cwd() });\n child.stdout.on(\"data\", () => {\n // Forge processors print noisy progress to stdout; we don't surface it.\n });\n child.stderr.on(\"data\", (line) => {\n if (stderrTail.length >= MAX_PROCESSOR_STDERR_LINES) stderrTail.shift();\n stderrTail.push(line);\n });\n const exit = await child.exited;\n if (exit.code !== 0) {\n throw new MinecraftKitError(\n \"FORGE_PROCESSOR_FAILED\",\n `Forge processor exited with code ${exit.code ?? \"(signal)\"}: ${mainClass}`,\n {\n context: {\n exitCode: exit.code ?? undefined,\n mainClass,\n stderr: stderrTail.join(\"\\n\"),\n },\n },\n );\n }\n input.onEvent?.({\n type: \"forge:processor-completed\",\n processor: { index: input.action.index, mainClass },\n exitCode: exit.code ?? 0,\n durationMs: Date.now() - startedAt,\n });\n for (const [outputPath, expectedSha1] of Object.entries(input.action.outputs)) {\n const sha1 = await sha1OfFileStreaming(outputPath);\n if (sha1 !== expectedSha1) {\n throw new MinecraftKitError(\n \"FORGE_PROCESSOR_FAILED\",\n `Processor output hash mismatch: ${outputPath}`,\n { context: { filePath: outputPath, expectedHash: expectedSha1, actualHash: sha1 } },\n );\n }\n input.onEvent?.({\n type: \"forge:processor-output-verified\",\n processor: { index: input.action.index, mainClass },\n path: outputPath,\n });\n }\n}\n\nasync function sha1OfFileStreaming(filePath: string): Promise<string> {\n const hash = crypto.createHash(\"sha1\");\n await new Promise<void>((resolve, reject) => {\n const stream = createReadStream(filePath);\n stream.on(\"data\", (chunk) => hash.update(chunk));\n stream.on(\"end\", () => resolve());\n stream.on(\"error\", reject);\n });\n return hash.digest(\"hex\");\n}\n","import type { MetadataCache } from \"../types/cache\";\nimport type { HttpClient } from \"../types/http\";\nimport type { InstallAction, InstallPlan } from \"../types/install\";\nimport type { ResolvedRuntime } from \"../types/runtime\";\nimport type { Target } from \"../types/target\";\nimport { planRuntimeDownloads } from \"./runtime\";\n\n/** Inputs to {@link planRuntimeInstall}. */\nexport interface PlanRuntimeInstallInput {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n}\n\n/**\n * Build an install plan that downloads ONLY the Java runtime declared by `target.runtime`.\n *\n * Useful when the consumer wants to provision a JRE without touching the rest of the\n * Minecraft installation (no client jar, no libraries, no assets). When `target.runtime.installRoot`\n * is set the runtime files land in a shared global location instead of the per-target folder.\n *\n * The returned plan is a regular {@link InstallPlan}, so it can be passed to the existing\n * install runner — directory placeholders and symlinks declared by the runtime manifest are\n * still materialized after downloads complete.\n */\nexport async function planRuntimeInstall(input: PlanRuntimeInstallInput): Promise<InstallPlan> {\n const runtimePlan = await planRuntimeDownloads({\n runtime: input.target.runtime,\n directory: input.target.directory,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const actions: readonly InstallAction[] = runtimePlan.actions;\n const totalBytes = runtimePlan.actions.reduce(\n (sum, action) => sum + (action.expectedSize ?? 0),\n 0,\n );\n return {\n targetId: input.target.id,\n directory: input.target.directory,\n target: input.target,\n actions,\n totalActions: actions.length,\n totalBytes,\n };\n}\n\n/** Inputs to {@link planStandaloneRuntimeInstall}. */\nexport interface PlanStandaloneRuntimeInstallInput {\n readonly id: string;\n /** Where the runtime files live. Used as `directory` if `runtime.installRoot` is unset. */\n readonly directory: string;\n readonly runtime: ResolvedRuntime;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n}\n\n/**\n * Plan a runtime-only install **without a Minecraft target**. Useful for \"Install Java/runtime\"\n * flows where the user just wants a JRE on disk and never had a Minecraft version to choose\n * from. The returned plan is shaped exactly like a normal {@link InstallPlan} and runs through\n * the standard install runner — but its `target.minecraft` and `target.loader` fields are\n * intentional placeholders. The runner only reads `target.runtime` for runtime-only plans, so\n * the placeholders are never accessed at runtime.\n */\nexport async function planStandaloneRuntimeInstall(\n input: PlanStandaloneRuntimeInstallInput,\n): Promise<InstallPlan> {\n const runtimePlan = await planRuntimeDownloads({\n runtime: input.runtime,\n directory: input.directory,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const actions: readonly InstallAction[] = runtimePlan.actions;\n const totalBytes = runtimePlan.actions.reduce(\n (sum, action) => sum + (action.expectedSize ?? 0),\n 0,\n );\n // The install runner only touches `target.runtime` and `target.directory` for plans that\n // have no processors and no write/native actions. The other Target fields are placeholders.\n const target = {\n id: input.id,\n directory: input.directory,\n runtime: input.runtime,\n minecraft: undefined,\n loader: undefined,\n } as unknown as Target;\n return {\n targetId: input.id,\n directory: input.directory,\n target,\n actions,\n totalActions: actions.length,\n totalBytes,\n };\n}\n","/** JVM args appended for every launch. */\nexport const BASE_JVM_ARGS = [\n \"-XX:+UnlockExperimentalVMOptions\",\n \"-XX:+UseG1GC\",\n \"-XX:G1NewSizePercent=20\",\n \"-XX:G1ReservePercent=20\",\n \"-XX:MaxGCPauseMillis=50\",\n \"-XX:G1HeapRegionSize=32M\",\n] as const;\n\n/** JVM args added for legacy (≤1.12) versions that lack `arguments.jvm`. */\nexport const LEGACY_JVM_ARGS = [\n \"-Djava.library.path=${natives_directory}\",\n \"-Dminecraft.launcher.brand=${launcher_name}\",\n \"-Dminecraft.launcher.version=${launcher_version}\",\n \"-cp\",\n \"${classpath}\",\n] as const;\n\n/** macOS-only JVM args (suppress dock label). */\nexport const MACOS_JVM_ARGS = [\"-Xdock:name=Minecraft\"] as const;\n","import { evaluateRules } from \"../core/rules\";\nimport type { ArgumentEntry, MinecraftArguments } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\n\n/** Flatten a modern `arguments.{game|jvm}` array, evaluating rules. */\nexport function flattenArguments(\n entries: readonly ArgumentEntry[],\n context: {\n readonly system: RuntimeSystem;\n readonly features?: Readonly<Record<string, boolean>>;\n },\n): readonly string[] {\n const result: string[] = [];\n for (const entry of entries) {\n if (typeof entry === \"string\") {\n result.push(entry);\n continue;\n }\n if (!evaluateRules(entry.rules, context)) continue;\n if (typeof entry.value === \"string\") {\n result.push(entry.value);\n } else {\n result.push(...entry.value);\n }\n }\n return result;\n}\n\n/** Split a legacy minecraftArguments string into an array. */\nexport function splitLegacyArguments(raw: string): readonly string[] {\n return raw.trim().length === 0 ? [] : raw.trim().split(/\\s+/);\n}\n\n/** Convenience: pull both game and jvm arrays from a modern arguments object. */\nexport function pickArguments(\n args: MinecraftArguments | undefined,\n context: {\n readonly system: RuntimeSystem;\n readonly features?: Readonly<Record<string, boolean>>;\n },\n): { readonly game: readonly string[]; readonly jvm: readonly string[] } {\n return {\n game: flattenArguments(args?.game ?? [], context),\n jvm: flattenArguments(args?.jvm ?? [], context),\n };\n}\n","import { MinecraftKitError } from \"../core/errors\";\n\n/** Substitute `${...}` placeholders in a single argument. */\nexport function substituteArg(raw: string, values: Readonly<Record<string, string>>): string {\n return raw.replaceAll(/\\$\\{([a-zA-Z0-9_]+)\\}/g, (match, key: string) => {\n const value = values[key];\n if (value === undefined) {\n throw new MinecraftKitError(\"INVALID_INPUT\", `Unknown launch placeholder: ${match}`, {\n context: { placeholder: key },\n });\n }\n return value;\n });\n}\n\n/** Substitute placeholders in every entry of an arguments list. */\nexport function substituteArgs(\n args: readonly string[],\n values: Readonly<Record<string, string>>,\n): readonly string[] {\n return args.map((arg) => substituteArg(arg, values));\n}\n","import { DEFAULT_MAX_MB, DEFAULT_MIN_MB } from \"../constants/defaults\";\nimport { BASE_JVM_ARGS, LEGACY_JVM_ARGS, MACOS_JVM_ARGS } from \"../constants/launch\";\nimport { targetPaths } from \"../core/paths\";\nimport type { LaunchOptions } from \"../types/launch\";\nimport type { MinecraftVersionManifest } from \"../types/minecraft\";\nimport type { Target } from \"../types/target\";\nimport { pickArguments, splitLegacyArguments } from \"./arguments\";\nimport { substituteArgs } from \"./placeholders\";\n\n/** Output of {@link composeArgs}. */\nexport interface ComposedArgs {\n readonly jvmArgs: readonly string[];\n readonly gameArgs: readonly string[];\n}\n\n/**\n * Build the final JVM and game argument lists for a launch. The order is:\n *\n * jvmArgs = memory + base + macos + manifest-jvm + (logging) + caller-extra\n * gameArgs = manifest-game + caller-extra + (resolution/fullscreen)\n *\n * Caller-extra entries land last so the user can override anything emitted by the manifest\n * (last-wins for JVM `-Xms`/`-Xmx`, additive for game args).\n */\nexport function composeArgs(input: {\n readonly target: Target;\n readonly merged: MinecraftVersionManifest;\n readonly options: LaunchOptions;\n readonly placeholderValues: Readonly<Record<string, string>>;\n readonly features: Readonly<Record<string, boolean>>;\n}): ComposedArgs {\n const minMb = input.options.memory?.minMb ?? DEFAULT_MIN_MB;\n const maxMb = input.options.memory?.maxMb ?? DEFAULT_MAX_MB;\n const memoryArgs = [`-Xms${minMb}M`, `-Xmx${maxMb}M`];\n const ruleContext = { system: input.target.runtime.system, features: input.features };\n\n let rawJvm: readonly string[];\n let rawGame: readonly string[];\n if (input.merged.arguments) {\n const picked = pickArguments(input.merged.arguments, ruleContext);\n rawJvm = picked.jvm;\n rawGame = picked.game;\n } else if (input.merged.minecraftArguments) {\n rawJvm = LEGACY_JVM_ARGS;\n rawGame = splitLegacyArguments(input.merged.minecraftArguments);\n } else {\n rawJvm = [];\n rawGame = [];\n }\n\n const macosArgs = input.target.runtime.system.os === \"osx\" ? MACOS_JVM_ARGS : [];\n const baseJvm = [...memoryArgs, ...BASE_JVM_ARGS, ...macosArgs];\n const substitutedJvm = substituteArgs(rawJvm, input.placeholderValues);\n const substitutedGame = substituteArgs(rawGame, input.placeholderValues);\n const jvmArgs = [...baseJvm, ...substitutedJvm];\n\n if (input.merged.logging?.client?.argument) {\n const logging = input.merged.logging.client;\n const loggingArg = substituteArgs([logging.argument], {\n ...input.placeholderValues,\n path: targetPaths.loggingConfig(input.target.directory, logging.file.id),\n })[0];\n if (loggingArg !== undefined) jvmArgs.push(loggingArg);\n }\n\n const extraJvm = input.options.extraJvmArgs ?? [];\n const extraGame = input.options.extraGameArgs ?? [];\n const gameArgs = [...substitutedGame, ...extraGame];\n\n if (input.options.fullscreen === true) gameArgs.push(\"--fullscreen\");\n if (input.options.resolution !== undefined && rawGame.every((a) => !a.includes(\"--width\"))) {\n gameArgs.push(\n \"--width\",\n input.options.resolution.width.toString(),\n \"--height\",\n input.options.resolution.height.toString(),\n );\n }\n\n return { jvmArgs: [...jvmArgs, ...extraJvm], gameArgs };\n}\n","import path from \"node:path\";\nimport { mavenRelativePath, parseMavenCoordinate } from \"../core/maven\";\nimport { targetPaths } from \"../core/paths\";\nimport { evaluateRules } from \"../core/rules\";\nimport type { MinecraftLibrary, MinecraftVersionManifest } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\n\n/** Build the classpath entries for a launch. */\nexport function buildClasspath(input: {\n readonly directory: string;\n readonly versionId: string;\n readonly merged: MinecraftVersionManifest;\n readonly system: RuntimeSystem;\n}): readonly string[] {\n const seen = new Set<string>();\n const entries: string[] = [];\n for (const library of input.merged.libraries) {\n if (library.natives) continue;\n if (!evaluateRules(library.rules, { system: input.system })) continue;\n const relative = relativeFor(library);\n if (!relative) continue;\n const absolute = path.join(targetPaths.librariesDir(input.directory), relative);\n if (seen.has(absolute)) continue;\n seen.add(absolute);\n entries.push(absolute);\n }\n const versionJar = targetPaths.versionJar(input.directory, input.versionId);\n if (!seen.has(versionJar)) entries.push(versionJar);\n return entries;\n}\n\nfunction relativeFor(library: MinecraftLibrary): string | null {\n if (library.downloads?.artifact?.path) return library.downloads.artifact.path;\n if (library.name) {\n const coord = parseMavenCoordinate(library.name);\n return mavenRelativePath(coord);\n }\n return null;\n}\n","import crypto from \"node:crypto\";\n\n/**\n * Derive a stable v3-style UUID for an offline player username.\n *\n * Mojang's offline-mode formula: `MD5(\"OfflinePlayer:\" + name)` with the version/variant\n * bits patched to UUID v3.\n */\nexport function offlineUuidFor(username: string): string {\n const md5 = crypto.createHash(\"md5\");\n md5.update(`OfflinePlayer:${username}`, \"utf8\");\n const bytes = md5.digest();\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x30; // v3\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant\n return formatUuid(bytes);\n}\n\nfunction formatUuid(bytes: Buffer): string {\n const hex = bytes.toString(\"hex\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;\n}\n\n/** Strip the dashes from a UUID. Used by `${auth_uuid}`. */\nexport function stripUuidDashes(uuid: string): string {\n return uuid.replaceAll(\"-\", \"\");\n}\n","/** Authentication modes accepted by the launch composer. */\nexport const AuthModes = {\n /** Offline-mode play with a chosen username and synthetic UUID. */\n OFFLINE: \"offline\",\n /** Pre-authenticated session — caller provides the access token and identity. */\n ONLINE: \"online\",\n} as const;\n\n/** Auth mode literal. */\nexport type AuthMode = (typeof AuthModes)[keyof typeof AuthModes];\n\n/** Offline authentication. */\nexport interface OfflineAuth {\n readonly mode: typeof AuthModes.OFFLINE;\n readonly username: string;\n /** Optional explicit UUID. When omitted, a deterministic UUID is derived from the username. */\n readonly uuid?: string;\n}\n\n/** Online (token-based) authentication. */\nexport interface OnlineAuth {\n readonly mode: typeof AuthModes.ONLINE;\n readonly username: string;\n readonly uuid: string;\n readonly accessToken: string;\n readonly userType?: string;\n readonly clientId?: string;\n readonly xuid?: string;\n}\n\n/** Auth shape consumed by `kit.launch.compose`. */\nexport type LaunchAuth = OfflineAuth | OnlineAuth;\n","import path from \"node:path\";\nimport { DEFAULT_LAUNCHER_NAME, DEFAULT_LAUNCHER_VERSION } from \"../constants/defaults\";\nimport { ASSETS_DIR, ASSETS_LEGACY_DIR, LIBRARIES_DIR } from \"../constants/files\";\nimport { targetPaths } from \"../core/paths\";\nimport { offlineUuidFor, stripUuidDashes } from \"../core/uuid\";\nimport { AuthModes, type LaunchAuth } from \"../types/auth\";\nimport type { LaunchOptions } from \"../types/launch\";\nimport type { Target } from \"../types/target\";\n\n/** Resolve every `${...}` value the launch arguments substitute against. */\nexport function buildPlaceholderValues(input: {\n readonly target: Target;\n readonly versionId: string;\n readonly auth: LaunchAuth;\n readonly classpath: readonly string[];\n readonly options: LaunchOptions;\n}): Readonly<Record<string, string>> {\n const cpSeparator = process.platform === \"win32\" ? \";\" : \":\";\n const directory = input.target.directory;\n const username = input.auth.username;\n const uuid =\n input.auth.mode === AuthModes.OFFLINE\n ? (input.auth.uuid ?? offlineUuidFor(username))\n : input.auth.uuid;\n const accessToken = input.auth.mode === AuthModes.OFFLINE ? \"0\" : input.auth.accessToken;\n const userType =\n input.auth.mode === AuthModes.OFFLINE ? \"legacy\" : (input.auth.userType ?? \"msa\");\n const launcherName = input.options.launcherName ?? DEFAULT_LAUNCHER_NAME;\n const launcherVersion = input.options.launcherVersion ?? DEFAULT_LAUNCHER_VERSION;\n return {\n auth_player_name: username,\n version_name: input.versionId,\n game_directory: directory,\n assets_root: path.join(directory, ASSETS_DIR),\n assets_index_name: input.target.minecraft.manifest.assets,\n auth_uuid: stripUuidDashes(uuid),\n auth_access_token: accessToken,\n auth_session: `token:${accessToken}:${stripUuidDashes(uuid)}`,\n clientid: input.auth.mode === AuthModes.ONLINE ? (input.auth.clientId ?? \"\") : \"\",\n auth_xuid: input.auth.mode === AuthModes.ONLINE ? (input.auth.xuid ?? \"\") : \"\",\n user_type: userType,\n user_properties: \"{}\",\n version_type: input.target.minecraft.channel,\n game_assets: path.join(directory, ASSETS_LEGACY_DIR),\n natives_directory: targetPaths.nativesDir(directory, input.target.minecraft.version),\n classpath: input.classpath.join(cpSeparator),\n classpath_separator: cpSeparator,\n library_directory: path.join(directory, LIBRARIES_DIR),\n launcher_name: launcherName,\n launcher_version: launcherVersion,\n resolution_width: input.options.resolution?.width.toString() ?? \"\",\n resolution_height: input.options.resolution?.height.toString() ?? \"\",\n };\n}\n","import type {\n ArgumentEntry,\n MinecraftArguments,\n MinecraftLibrary,\n MinecraftVersionManifest,\n} from \"../types/minecraft\";\n\n/**\n * Merge a child Minecraft version manifest with its parent (resolved through `inheritsFrom`).\n *\n * Rules:\n * - Scalar fields (`mainClass`, `assetIndex`, `assets`, `type`, `minecraftArguments`,\n * `javaVersion`, `logging`) — child overrides parent when defined, otherwise parent value.\n * - `libraries` — additive concat (parent first, child appended). No dedup; later loaders rely on this.\n * - `arguments.game` / `arguments.jvm` — additive concat.\n * - `downloads` — shallow merge; child wins on conflict.\n */\nexport function mergeManifest(\n parent: MinecraftVersionManifest,\n child: MinecraftVersionManifest,\n): MinecraftVersionManifest {\n const merged: MinecraftVersionManifest = {\n id: child.id || parent.id,\n type: child.type ?? parent.type,\n mainClass: child.mainClass ?? parent.mainClass,\n assetIndex: child.assetIndex ?? parent.assetIndex,\n assets: child.assets ?? parent.assets,\n downloads: { ...parent.downloads, ...child.downloads },\n libraries: mergeLibraries(parent.libraries, child.libraries),\n arguments: mergeArguments(parent.arguments, child.arguments),\n minecraftArguments: child.minecraftArguments ?? parent.minecraftArguments,\n javaVersion: child.javaVersion ?? parent.javaVersion,\n logging: child.logging ?? parent.logging,\n inheritsFrom: child.inheritsFrom ?? parent.inheritsFrom,\n releaseTime: child.releaseTime ?? parent.releaseTime,\n time: child.time ?? parent.time,\n minimumLauncherVersion: child.minimumLauncherVersion ?? parent.minimumLauncherVersion,\n complianceLevel: child.complianceLevel ?? parent.complianceLevel,\n };\n return merged;\n}\n\nfunction mergeLibraries(\n parent: readonly MinecraftLibrary[],\n child: readonly MinecraftLibrary[],\n): readonly MinecraftLibrary[] {\n return [...parent, ...child];\n}\n\nfunction mergeArguments(\n parent: MinecraftArguments | undefined,\n child: MinecraftArguments | undefined,\n): MinecraftArguments | undefined {\n if (!parent && !child) return undefined;\n const parentGame: readonly ArgumentEntry[] = parent?.game ?? [];\n const parentJvm: readonly ArgumentEntry[] = parent?.jvm ?? [];\n const childGame: readonly ArgumentEntry[] = child?.game ?? [];\n const childJvm: readonly ArgumentEntry[] = child?.jvm ?? [];\n return {\n game: [...parentGame, ...childGame],\n jvm: [...parentJvm, ...childJvm],\n };\n}\n","import { MinecraftKitError } from \"../core/errors\";\nimport { fileExists, listChildDirectories, readText } from \"../core/fs\";\nimport { mergeManifest } from \"../core/manifest-merge\";\nimport { targetPaths } from \"../core/paths\";\nimport { Loaders } from \"../types/loader\";\nimport type { MinecraftVersionManifest } from \"../types/minecraft\";\nimport type { Target } from \"../types/target\";\n\n/** Result of resolving the on-disk version JSON for a target. */\nexport interface ResolvedLaunchVersion {\n /** Topmost version id (the one used as `${version_name}` and for the natives directory). */\n readonly versionId: string;\n /** Merged manifest with `inheritsFrom` chain folded together. */\n readonly merged: MinecraftVersionManifest;\n /** Inherits-from chain from top (`versionId`) down to the root vanilla version. */\n readonly chain: readonly string[];\n}\n\n/** Read the installed version JSON appropriate for a target's loader and merge inheritsFrom. */\nexport async function resolveLaunchVersion(target: Target): Promise<ResolvedLaunchVersion> {\n if (target.loader.type === Loaders.VANILLA) {\n return {\n versionId: target.minecraft.version,\n merged: target.minecraft.manifest,\n chain: [target.minecraft.version],\n };\n }\n const versionId = await pickInstalledVersionId(target);\n const merged = await loadAndMerge(target.directory, versionId, target.minecraft.manifest);\n // Fabric and modern Forge inherit directly from vanilla — a two-level chain.\n return { versionId, merged, chain: [versionId, target.minecraft.version] };\n}\n\n/**\n * Pick the version id whose `versions/<id>/<id>.jar` should land on the launch classpath.\n * Walks the inherits-from chain from top to root and returns the first id whose jar exists\n * on disk. Falls back to the root id when nothing is materialised yet.\n *\n * Why: Fabric's profile id is `fabric-loader-0.14.21-1.20.1`, but Fabric does not produce a\n * matching `.jar`; the loader expects the **vanilla** client jar on the classpath and hooks\n * it via `KnotClient`. Modern Forge similarly leaves `versions/<forge-id>/<forge-id>.jar`\n * absent and routes the patched client jar through `libraries/`. Walking the chain picks\n * the right id for both shapes without special-casing.\n */\nexport async function pickClientJarVersionId(\n directory: string,\n chain: readonly string[],\n): Promise<string> {\n for (const id of chain) {\n const jar = targetPaths.versionJar(directory, id);\n if (await fileExists(jar)) return id;\n }\n const fallback = chain.at(-1);\n if (fallback === undefined) {\n throw new MinecraftKitError(\n \"MANIFEST_NOT_FOUND\",\n \"Cannot resolve a client jar version id from an empty inheritsFrom chain\",\n );\n }\n // Nothing on disk yet — fall back to the root vanilla id so the launch composition still\n // produces a valid path; install/repair will materialise the jar before run-time.\n return fallback;\n}\n\nasync function pickInstalledVersionId(target: Target): Promise<string> {\n if (target.loader.type === Loaders.FABRIC) {\n const candidate = target.loader.profile.id;\n const versionJsonPath = targetPaths.versionJson(target.directory, candidate);\n if (await fileExists(versionJsonPath)) return candidate;\n }\n if (target.loader.type === Loaders.FORGE) {\n const directories = await listChildDirectories(targetPaths.versionsDir(target.directory));\n for (const id of directories) {\n const versionJsonPath = targetPaths.versionJson(target.directory, id);\n if (!(await fileExists(versionJsonPath))) continue;\n const text = await readText(versionJsonPath);\n try {\n const parsed = JSON.parse(text) as { inheritsFrom?: string; id?: string };\n if (\n parsed.inheritsFrom === target.minecraft.version &&\n (id.includes(\"forge\") || (parsed.id ?? \"\").includes(\"forge\"))\n ) {\n return id;\n }\n } catch {\n // Ignore unreadable / malformed version JSONs and keep looking.\n }\n }\n }\n throw new MinecraftKitError(\n \"MANIFEST_NOT_FOUND\",\n `Could not find an installed version JSON for target ${target.id}`,\n { context: { targetId: target.id, loaderType: target.loader.type } },\n );\n}\n\nasync function loadAndMerge(\n directory: string,\n versionId: string,\n parentManifest: MinecraftVersionManifest,\n): Promise<MinecraftVersionManifest> {\n const versionJsonPath = targetPaths.versionJson(directory, versionId);\n const text = await readText(versionJsonPath);\n let child: MinecraftVersionManifest;\n try {\n child = JSON.parse(text) as MinecraftVersionManifest;\n } catch (cause) {\n throw new MinecraftKitError(\n \"MANIFEST_INVALID\",\n `Version JSON is not valid JSON: ${versionJsonPath}`,\n { cause, context: { filePath: versionJsonPath } },\n );\n }\n if (child.inheritsFrom !== undefined && child.inheritsFrom !== parentManifest.id) {\n // Recursive merge through any chain — but in practice Forge/Fabric inherit directly from vanilla.\n return mergeManifest(parentManifest, child);\n }\n return mergeManifest(parentManifest, child);\n}\n","import { MinecraftKitError } from \"../core/errors\";\nimport { targetPaths } from \"../core/paths\";\nimport type { LaunchComposition, LaunchOptions } from \"../types/launch\";\nimport type { Target } from \"../types/target\";\nimport { composeArgs } from \"./args-composition\";\nimport { buildClasspath } from \"./classpath\";\nimport { buildPlaceholderValues } from \"./placeholder-values\";\nimport { pickClientJarVersionId, resolveLaunchVersion } from \"./version-resolution\";\n\n/** Inputs to {@link composeLaunch}. */\nexport interface ComposeLaunchInput {\n readonly target: Target;\n readonly options: LaunchOptions;\n}\n\n/** Build a fully resolved {@link LaunchComposition} ready to hand to {@link runLaunch}. */\nexport async function composeLaunch(input: ComposeLaunchInput): Promise<LaunchComposition> {\n const { target, options } = input;\n if (!options.auth.username || options.auth.username.length === 0) {\n throw new MinecraftKitError(\n \"INVALID_INPUT\",\n `Auth username must be non-empty (target ${target.id})`,\n { context: { targetId: target.id } },\n );\n }\n\n const resolved = await resolveLaunchVersion(target);\n const javaPath = targetPaths.runtimeJavaExecutable(\n target.directory,\n target.runtime.component,\n target.runtime.system.os,\n target.runtime.installRoot,\n );\n\n // Walk the inheritsFrom chain to find the version id whose `.jar` actually exists on\n // disk: Fabric and modern Forge leave their own `versions/<id>/<id>.jar` absent and\n // expect the vanilla client jar to land on the classpath instead.\n const clientJarVersionId = await pickClientJarVersionId(target.directory, resolved.chain);\n const classpath = buildClasspath({\n directory: target.directory,\n versionId: clientJarVersionId,\n merged: resolved.merged,\n system: target.runtime.system,\n });\n\n const features = buildFeatures(options);\n const placeholderValues = buildPlaceholderValues({\n target,\n versionId: resolved.versionId,\n auth: options.auth,\n classpath,\n options,\n });\n const composed = composeArgs({\n target,\n merged: resolved.merged,\n options,\n placeholderValues,\n features,\n });\n\n return {\n targetId: target.id,\n directory: target.directory,\n javaPath,\n mainClass: resolved.merged.mainClass,\n jvmArgs: composed.jvmArgs,\n gameArgs: composed.gameArgs,\n classpath,\n nativesDirectory: targetPaths.nativesDir(target.directory, target.minecraft.version),\n auth: options.auth,\n workingDirectory: target.directory,\n };\n}\n\nfunction buildFeatures(options: LaunchOptions): Readonly<Record<string, boolean>> {\n const features: Record<string, boolean> = { ...(options.features ?? {}) };\n if (options.resolution !== undefined) {\n features.has_custom_resolution = true;\n }\n return features;\n}\n","import { DEFAULT_KILL_GRACE_MS } from \"../constants/defaults\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport type {\n LaunchComposition,\n LaunchExit,\n LaunchRunOptions,\n LaunchSession,\n} from \"../types/launch\";\nimport type { Spawner } from \"../types/spawner\";\n\n/** Inputs to {@link runLaunch}. */\nexport interface RunLaunchInput {\n readonly composition: LaunchComposition;\n readonly options?: LaunchRunOptions;\n readonly spawner: Spawner;\n}\n\n/**\n * Spawn the configured Java process. Returns a {@link LaunchSession} immediately after the\n * process is created; the `exited` promise resolves when the game terminates.\n */\nexport function runLaunch(input: RunLaunchInput): LaunchSession {\n const composition = input.composition;\n const options = input.options ?? {};\n const args = [...composition.jvmArgs, composition.mainClass, ...composition.gameArgs];\n options.onEvent?.({\n type: \"launch:starting\",\n command: composition.javaPath,\n args,\n cwd: composition.workingDirectory,\n });\n const child = input.spawner.spawn(composition.javaPath, args, {\n cwd: composition.workingDirectory,\n ...(composition.env !== undefined ? { env: composition.env } : {}),\n });\n options.onEvent?.({ type: \"launch:started\", pid: child.pid });\n child.stdout.on(\"data\", (line) => {\n options.onEvent?.({ type: \"launch:stdout\", line });\n });\n child.stderr.on(\"data\", (line) => {\n options.onEvent?.({ type: \"launch:stderr\", line });\n });\n\n const grace = options.killGracePeriodMs ?? DEFAULT_KILL_GRACE_MS;\n let aborted = false;\n const doAbort = (reason: string): void => {\n if (aborted) return;\n aborted = true;\n options.onEvent?.({ type: \"launch:aborted\", reason });\n // Both kill calls are unconditional. Node's child_process treats a kill against a dead\n // process as a no-op, so guarding against the first return value adds no safety and\n // creates asymmetry with the SIGKILL path.\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), grace).unref();\n };\n\n if (options.signal !== undefined) {\n if (options.signal.aborted) {\n doAbort(reasonFrom(options.signal.reason));\n } else {\n options.signal.addEventListener(\"abort\", () => doAbort(reasonFrom(options.signal?.reason)), {\n once: true,\n });\n }\n }\n\n const exited: Promise<LaunchExit> = (async () => {\n const { code, signal } = await child.exited;\n options.onEvent?.({ type: \"launch:exited\", code, signal });\n if (!aborted && code !== 0 && code !== null) {\n throw new MinecraftKitError(\n \"LAUNCH_PROCESS_FAILED\",\n `Minecraft process exited with code ${code}`,\n { context: { exitCode: code } },\n );\n }\n return { code, signal, aborted };\n })();\n\n return {\n pid: child.pid,\n exited,\n abort(reason?: string): void {\n doAbort(reason ?? \"user\");\n },\n };\n}\n\nfunction reasonFrom(value: unknown): string {\n if (value === undefined) return \"aborted\";\n if (typeof value === \"string\") return value;\n if (value instanceof Error) return value.message;\n return String(value);\n}\n","import { Buffer } from \"node:buffer\";\nimport { spawn } from \"node:child_process\";\nimport { SPAWNER_MAX_LINE_BYTES } from \"../constants/defaults\";\nimport type { ProcessStream, SpawnOptions, SpawnedProcess, Spawner } from \"../types/spawner\";\n\n/** Default spawner backed by `node:child_process.spawn`. */\nexport class ChildProcessSpawner implements Spawner {\n spawn(command: string, args: readonly string[], options: SpawnOptions): SpawnedProcess {\n const child = spawn(command, [...args], {\n cwd: options.cwd,\n env: options.env === undefined ? process.env : { ...process.env, ...options.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const stdout = streamFromBuffer(child.stdout);\n const stderr = streamFromBuffer(child.stderr);\n const exited = new Promise<{\n readonly code: number | null;\n readonly signal: NodeJS.Signals | null;\n }>((resolve) => {\n child.once(\"exit\", (code, signal) => resolve({ code, signal }));\n });\n return {\n pid: child.pid ?? -1,\n stdout,\n stderr,\n exited,\n kill(signal): boolean {\n return child.kill(signal);\n },\n };\n }\n}\n\nfunction streamFromBuffer(stream: NodeJS.ReadableStream | null): ProcessStream {\n if (!stream) {\n return { on() {} };\n }\n let buffer = \"\";\n const listeners = new Set<(line: string) => void>();\n const emit = (line: string): void => {\n for (const listener of listeners) listener(line);\n };\n stream.on(\"data\", (chunk: Buffer | string) => {\n const text = Buffer.isBuffer(chunk) ? chunk.toString(\"utf8\") : String(chunk);\n buffer += text;\n let index = buffer.indexOf(\"\\n\");\n while (index !== -1) {\n const line = buffer.slice(0, index).replace(/\\r$/, \"\");\n buffer = buffer.slice(index + 1);\n emitBounded(emit, line);\n index = buffer.indexOf(\"\\n\");\n }\n // Pathological input: a single line longer than the cap with no newline yet. Flush in\n // chunks so the buffer cannot grow without bound.\n while (buffer.length > SPAWNER_MAX_LINE_BYTES) {\n emit(buffer.slice(0, SPAWNER_MAX_LINE_BYTES));\n buffer = buffer.slice(SPAWNER_MAX_LINE_BYTES);\n }\n });\n stream.on(\"end\", () => {\n if (buffer.length > 0) {\n emitBounded(emit, buffer);\n buffer = \"\";\n }\n });\n return {\n on(_event, listener) {\n listeners.add(listener);\n },\n };\n}\n\nfunction emitBounded(emit: (line: string) => void, line: string): void {\n if (line.length <= SPAWNER_MAX_LINE_BYTES) {\n emit(line);\n return;\n }\n for (let i = 0; i < line.length; i += SPAWNER_MAX_LINE_BYTES) {\n emit(line.slice(i, i + SPAWNER_MAX_LINE_BYTES));\n }\n}\n","/** Aspect of an installation a verification result describes. */\nexport const VerificationKinds = {\n MINECRAFT: \"minecraft\",\n FABRIC: \"fabric\",\n FORGE: \"forge\",\n RUNTIME: \"runtime\",\n} as const;\n\n/** Verification kind literal. */\nexport type VerificationKind = (typeof VerificationKinds)[keyof typeof VerificationKinds];\n\n/** Status of an individual file checked during verification. */\nexport const VerifyFileStatuses = {\n OK: \"ok\",\n MISSING: \"missing\",\n CORRUPT: \"corrupt\",\n WRONG_SIZE: \"wrong-size\",\n} as const;\n\n/** File status literal. */\nexport type VerifyFileStatus = (typeof VerifyFileStatuses)[keyof typeof VerifyFileStatuses];\n\n/** Categories assigned to each verified file for easier filtering. */\nexport const VerifyFileCategories = {\n CLIENT_JAR: \"client-jar\",\n LIBRARY: \"library\",\n ASSET: \"asset\",\n ASSET_INDEX: \"asset-index\",\n NATIVE: \"native\",\n LOADER_LIBRARY: \"loader-library\",\n RUNTIME_FILE: \"runtime-file\",\n LOGGING_CONFIG: \"logging-config\",\n} as const;\n\n/** Verification file category literal. */\nexport type VerifyFileCategory = (typeof VerifyFileCategories)[keyof typeof VerifyFileCategories];\n\n/** A single verified file. */\nexport interface VerificationFileResult {\n readonly path: string;\n readonly category: VerifyFileCategory;\n readonly status: VerifyFileStatus;\n readonly expectedSha1?: string;\n readonly actualSha1?: string;\n readonly expectedSize?: number;\n readonly actualSize?: number;\n /** Optional URL where the file can be re-downloaded if it's broken. */\n readonly url?: string;\n}\n\n/** Aggregate verification result returned by each `verify.<kind>.run` API. */\nexport interface VerificationResult {\n readonly targetId: string;\n readonly kind: VerificationKind;\n readonly isValid: boolean;\n readonly issues: readonly VerificationFileResult[];\n readonly checkedFiles: number;\n readonly durationMs: number;\n}\n","import { planInstall } from \"../install/planner\";\nimport {\n type DownloadAction,\n type ExtractNativeAction,\n type InstallAction,\n InstallActionKinds,\n type InstallPlan,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport type { AspectRepairInput, RepairPlan } from \"../types/repair\";\nimport type { Target } from \"../types/target\";\nimport {\n type VerificationResult,\n VerifyFileCategories,\n type VerifyFileCategory,\n} from \"../types/verify\";\n\n/** Normalize the `from` option of a repair plan into an array. */\nexport function asResultArray(\n from: VerificationResult | readonly VerificationResult[],\n): readonly VerificationResult[] {\n return Array.isArray(from) ? from : [from];\n}\n\n/**\n * Category-aware view over a set of verification results. Lets repair distinguish\n * - paths that need a download (have any non-`native` category recorded), from\n * - paths whose only issue is `native` extraction (the JAR is fine, but the extracted\n * natives directory is missing).\n *\n * Without this distinction, a \"natives directory missing\" report would re-trigger every\n * native-jar download even though every JAR on disk is already correct.\n */\nexport interface IssueIndex {\n /** True when any verification result reported an issue at `path`. */\n has(path: string): boolean;\n /**\n * True when at least one issue at `path` carries a category other than `native`.\n * Used to decide whether a `DOWNLOAD_FILE` action should fire — a `native`-only issue\n * means \"re-extract the JAR\" not \"re-download the JAR\".\n */\n hasNonNative(path: string): boolean;\n /** All categories recorded for the given path (empty when none). */\n categoriesAt(path: string): ReadonlySet<VerifyFileCategory>;\n}\n\n/** Build an {@link IssueIndex} from one or more verification results. */\nexport function buildIssueIndex(\n from: VerificationResult | readonly VerificationResult[],\n): IssueIndex {\n const map = new Map<string, Set<VerifyFileCategory>>();\n for (const v of asResultArray(from)) {\n for (const issue of v.issues) {\n const set = map.get(issue.path);\n if (set) set.add(issue.category);\n else map.set(issue.path, new Set([issue.category]));\n }\n }\n return {\n has: (path) => map.has(path),\n hasNonNative: (path) => {\n const cats = map.get(path);\n if (!cats) return false;\n for (const c of cats) {\n if (c !== VerifyFileCategories.NATIVE) return true;\n }\n return false;\n },\n categoriesAt: (path) => map.get(path) ?? new Set<VerifyFileCategory>(),\n };\n}\n\n/** Sum expected bytes of all DOWNLOAD_FILE actions in a list. */\nexport function sumDownloadBytes(actions: readonly InstallAction[]): number {\n return actions.reduce((sum, action) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return sum + ((action as DownloadAction).expectedSize ?? 0);\n }\n return sum;\n }, 0);\n}\n\n/** Wrap a list of install actions in a {@link RepairPlan} for the given target. */\nexport function buildRepairPlan(target: Target, actions: readonly InstallAction[]): RepairPlan {\n return {\n targetId: target.id,\n directory: target.directory,\n target,\n actions,\n totalActions: actions.length,\n totalBytes: sumDownloadBytes(actions),\n };\n}\n\n/** Predicate to keep only actions belonging to a specific repair aspect. */\nexport type AspectFilter = (action: InstallAction) => boolean;\n\n/**\n * Run the boilerplate every aspect-specific repair planner shares:\n * 1. Build a full install plan.\n * 2. Index the verification issues.\n * 3. Filter install actions through the aspect-specific predicate using the standard\n * DOWNLOAD / WRITE / EXTRACT_NATIVE selection rules.\n * 4. Let the caller append any aspect-specific actions (e.g. Forge's defensive sweep).\n * 5. Wrap the actions in a {@link RepairPlan}.\n */\nexport async function planAspectRepair(\n input: AspectRepairInput,\n aspectFilter: AspectFilter,\n postprocess?: (context: {\n actions: InstallAction[];\n installPlan: InstallPlan;\n issues: IssueIndex;\n }) => void,\n): Promise<RepairPlan> {\n const installPlan = await planInstall({\n target: input.target,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const issues = buildIssueIndex(input.from);\n const actions = selectRepairActions({\n target: input.target,\n installPlan,\n issues,\n aspectFilter,\n });\n postprocess?.({ actions, installPlan, issues });\n return buildRepairPlan(input.target, actions);\n}\n\n/**\n * Apply the standard repair-action selection rules, restricted to the actions accepted by\n * `aspectFilter`. The rules are:\n * - DOWNLOAD_FILE: include if the target path has any non-`native` issue recorded.\n * - WRITE_VERSION_JSON: include if the destination path has any issue recorded.\n * - EXTRACT_NATIVE: include if the source JAR has any issue recorded.\n * - Anything else admitted by `aspectFilter` is included unconditionally.\n */\nexport function selectRepairActions(input: {\n readonly target: Target;\n readonly installPlan: InstallPlan;\n readonly issues: IssueIndex;\n readonly aspectFilter: AspectFilter;\n}): InstallAction[] {\n const matching: InstallAction[] = [];\n for (const action of input.installPlan.actions) {\n if (!input.aspectFilter(action)) continue;\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n if (input.issues.hasNonNative((action as DownloadAction).target)) {\n matching.push(action);\n }\n } else if (action.kind === InstallActionKinds.WRITE_VERSION_JSON) {\n if (input.issues.has((action as WriteVersionJsonAction).path)) {\n matching.push(action);\n }\n } else if (action.kind === InstallActionKinds.EXTRACT_NATIVE) {\n if (input.issues.has((action as ExtractNativeAction).source)) {\n matching.push(action);\n }\n } else {\n // Non-standard kinds (e.g. RUN_FORGE_PROCESSOR) are admitted by the aspect filter.\n matching.push(action);\n }\n }\n return matching;\n}\n","import { MinecraftKitError } from \"../core/errors\";\nimport { targetPaths } from \"../core/paths\";\nimport {\n type DownloadAction,\n type InstallAction,\n InstallActionKinds,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { RepairPlan } from \"../types/repair\";\nimport type { AspectRepairInput } from \"../types/repair\";\nimport { planAspectRepair } from \"./helpers\";\n\n/** Inputs to {@link planFabricRepair}. */\nexport type PlanFabricRepairInput = AspectRepairInput;\n\n/** Build a repair plan covering the Fabric loader slice: profile JSON + libraries. */\nexport async function planFabricRepair(input: PlanFabricRepairInput): Promise<RepairPlan> {\n if (input.target.loader.type !== Loaders.FABRIC) {\n throw new MinecraftKitError(\n \"INVALID_INPUT\",\n `repair.fabric requires a Fabric target (got ${input.target.loader.type})`,\n );\n }\n const fabricJsonPath = targetPaths.versionJson(\n input.target.directory,\n input.target.loader.profile.id,\n );\n return planAspectRepair(input, (action: InstallAction) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return (action as DownloadAction).category === \"fabric-library\";\n }\n if (action.kind === InstallActionKinds.WRITE_VERSION_JSON) {\n return (action as WriteVersionJsonAction).path === fabricJsonPath;\n }\n return false;\n });\n}\n","import { MinecraftKitError } from \"../core/errors\";\nimport { targetPaths } from \"../core/paths\";\nimport {\n type DownloadAction,\n type InstallAction,\n InstallActionKinds,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { RepairPlan } from \"../types/repair\";\nimport type { AspectRepairInput } from \"../types/repair\";\nimport { planAspectRepair } from \"./helpers\";\n\nconst FORGE_DOWNLOAD_CATEGORIES = new Set<DownloadAction[\"category\"]>([\n \"forge-library\",\n \"forge-installer\",\n]);\n\n/** Inputs to {@link planForgeRepair}. */\nexport type PlanForgeRepairInput = AspectRepairInput;\n\n/**\n * Build a repair plan covering the Forge loader slice: version JSON, libraries, installer\n * download, and the Forge processors that produce the final installation. When the Forge\n * version JSON was missing during verify (so libraries couldn't be enumerated), every\n * forge-library download is added defensively — `downloadFile` skips files already on disk.\n */\nexport async function planForgeRepair(input: PlanForgeRepairInput): Promise<RepairPlan> {\n if (input.target.loader.type !== Loaders.FORGE) {\n throw new MinecraftKitError(\n \"INVALID_INPUT\",\n `repair.forge requires a Forge target (got ${input.target.loader.type})`,\n );\n }\n const forgeJsonPath = targetPaths.versionJson(\n input.target.directory,\n input.target.loader.fullVersion,\n );\n\n return planAspectRepair(\n input,\n (action: InstallAction) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return FORGE_DOWNLOAD_CATEGORIES.has((action as DownloadAction).category);\n }\n if (action.kind === InstallActionKinds.WRITE_VERSION_JSON) {\n return (action as WriteVersionJsonAction).path === forgeJsonPath;\n }\n // Processors handled in the postprocess step (only when JSON was missing).\n return false;\n },\n ({ actions, installPlan, issues }) => {\n if (!issues.has(forgeJsonPath)) return;\n // Forge JSON was missing during verify → libraries couldn't be enumerated. Include\n // every forge-library download (skip-on-correct keeps this cheap) plus the processors\n // that regenerate the JSON.\n const alreadyIncluded = new Set(\n actions\n .filter((a): a is DownloadAction => a.kind === InstallActionKinds.DOWNLOAD_FILE)\n .map((a) => a.target),\n );\n for (const action of installPlan.actions) {\n if (\n action.kind === InstallActionKinds.DOWNLOAD_FILE &&\n (action as DownloadAction).category === \"forge-library\" &&\n !alreadyIncluded.has((action as DownloadAction).target)\n ) {\n actions.push(action);\n } else if (action.kind === InstallActionKinds.RUN_FORGE_PROCESSOR) {\n actions.push(action);\n }\n }\n },\n );\n}\n","import { targetPaths } from \"../core/paths\";\nimport {\n type DownloadAction,\n type InstallAction,\n InstallActionKinds,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport type { RepairPlan } from \"../types/repair\";\nimport type { AspectRepairInput } from \"../types/repair\";\nimport { planAspectRepair } from \"./helpers\";\n\nconst MINECRAFT_DOWNLOAD_CATEGORIES = new Set<DownloadAction[\"category\"]>([\n \"client-jar\",\n \"library\",\n \"asset-index\",\n \"asset\",\n \"logging-config\",\n]);\n\n/** Inputs to {@link planMinecraftRepair}. */\nexport type PlanMinecraftRepairInput = AspectRepairInput;\n\n/**\n * Build a repair plan covering only the vanilla Minecraft slice: client jar, version JSON,\n * libraries (incl. native jars), assets, logging config, and native extractions.\n */\nexport async function planMinecraftRepair(input: PlanMinecraftRepairInput): Promise<RepairPlan> {\n const vanillaJsonPath = targetPaths.versionJson(\n input.target.directory,\n input.target.minecraft.version,\n );\n return planAspectRepair(input, (action: InstallAction) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return MINECRAFT_DOWNLOAD_CATEGORIES.has((action as DownloadAction).category);\n }\n if (action.kind === InstallActionKinds.WRITE_VERSION_JSON) {\n return (action as WriteVersionJsonAction).path === vanillaJsonPath;\n }\n if (action.kind === InstallActionKinds.EXTRACT_NATIVE) {\n return true;\n }\n return false;\n });\n}\n","import { runInstall } from \"../install/runner\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport type { RepairPlan, RepairReport } from \"../types/repair\";\nimport type { Spawner } from \"../types/spawner\";\n\n/** Inputs to {@link runRepair}. Shared across all aspect-specific repair flows. */\nexport interface RunRepairInput {\n readonly plan: RepairPlan;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly spawner: Spawner;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/** Execute any repair plan. Reuses the install runner. */\nexport async function runRepair(input: RunRepairInput): Promise<RepairReport> {\n const report = await runInstall({\n plan: {\n ...input.plan,\n totalActions: input.plan.actions.length,\n totalBytes: input.plan.totalBytes,\n },\n http: input.http,\n cache: input.cache,\n spawner: input.spawner,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n return {\n targetId: report.targetId,\n bytesDownloaded: report.bytesDownloaded,\n actionsCompleted: report.actionsCompleted,\n durationMs: report.durationMs,\n };\n}\n","import { type DownloadAction, type InstallAction, InstallActionKinds } from \"../types/install\";\nimport type { RepairPlan } from \"../types/repair\";\nimport type { AspectRepairInput } from \"../types/repair\";\nimport { planAspectRepair } from \"./helpers\";\n\n/** Inputs to {@link planRuntimeRepair}. */\nexport type PlanRuntimeRepairInput = AspectRepairInput;\n\n/**\n * Build a repair plan covering the Java runtime files. `target.runtime.installRoot` is\n * honoured automatically because both `planInstall` and the verify side resolve runtime\n * paths through the same `targetPaths.runtimeRoot(..., installRoot)` helper.\n */\nexport async function planRuntimeRepair(input: PlanRuntimeRepairInput): Promise<RepairPlan> {\n return planAspectRepair(\n input,\n (action: InstallAction) =>\n action.kind === InstallActionKinds.DOWNLOAD_FILE &&\n (action as DownloadAction).category === \"runtime-file\",\n );\n}\n","import type { RuntimeSystem } from \"./system\";\n\n/**\n * Mojang Java-runtime component identifiers. New components appear over time\n * (e.g. `java-runtime-delta` for Java 21).\n *\n * The launcher must respect the `javaVersion.component` field declared by the per-version\n * Minecraft manifest. This list captures the set we have direct knowledge about; unknown\n * components are still allowed and resolved dynamically against the runtime index.\n */\nexport const RuntimeComponents = {\n JRE_LEGACY: \"jre-legacy\",\n JAVA_RUNTIME_ALPHA: \"java-runtime-alpha\",\n JAVA_RUNTIME_BETA: \"java-runtime-beta\",\n JAVA_RUNTIME_GAMMA: \"java-runtime-gamma\",\n JAVA_RUNTIME_GAMMA_SNAPSHOT: \"java-runtime-gamma-snapshot\",\n JAVA_RUNTIME_DELTA: \"java-runtime-delta\",\n JAVA_RUNTIME_EPSILON: \"java-runtime-epsilon\",\n MINECRAFT_JAVA_EXE: \"minecraft-java-exe\",\n} as const;\n\n/** Runtime component literal. */\nexport type RuntimeComponent = string;\n\n/** User-supplied resolution preferences. */\nexport const RuntimePreference = {\n /** Component declared by the Minecraft manifest. */\n RECOMMENDED: \"recommended\",\n /** Newest component available for the platform. */\n LATEST: \"latest\",\n} as const;\n\n/** Runtime preference literal. */\nexport type RuntimePreferenceKind = (typeof RuntimePreference)[keyof typeof RuntimePreference];\n\n/** Top-level runtime index returned by Mojang. */\nexport type RuntimeIndex = Readonly<Record<string, RuntimeIndexPlatform>>;\n\n/** Per-platform component map inside the runtime index. */\nexport type RuntimeIndexPlatform = Readonly<Record<string, readonly RuntimeIndexEntry[]>>;\n\n/** A single available runtime release. */\nexport interface RuntimeIndexEntry {\n readonly availability: { readonly group: number; readonly progress: number };\n readonly manifest: { readonly sha1: string; readonly size: number; readonly url: string };\n readonly version: { readonly name: string; readonly released: string };\n}\n\n/** Inner per-component file manifest. */\nexport interface RuntimeFilesManifest {\n readonly files: Readonly<Record<string, RuntimeFileEntry>>;\n}\n\n/** A single file in the runtime manifest. */\nexport type RuntimeFileEntry = RuntimeFileFile | RuntimeFileDirectory | RuntimeFileLink;\n\n/** A file entry: real bytes to download, may have lzma sidecar. */\nexport interface RuntimeFileFile {\n readonly type: \"file\";\n readonly executable: boolean;\n readonly downloads: {\n readonly raw: { readonly sha1: string; readonly size: number; readonly url: string };\n readonly lzma?: { readonly sha1: string; readonly size: number; readonly url: string };\n };\n}\n\n/** A directory placeholder. */\nexport interface RuntimeFileDirectory {\n readonly type: \"directory\";\n}\n\n/** A relative symlink. */\nexport interface RuntimeFileLink {\n readonly type: \"link\";\n readonly target: string;\n}\n\n/** Resolved runtime ready to install or launch with. */\nexport interface ResolvedRuntime {\n /** Mojang component name (e.g. `java-runtime-gamma`). */\n readonly component: string;\n /** Platform key inside the runtime index (e.g. `windows-x64`). */\n readonly platformKey: string;\n /** Version name (e.g. `\"17.0.8\"`). */\n readonly versionName: string;\n /** Major Java version when known. */\n readonly majorVersion?: number;\n readonly system: RuntimeSystem;\n /** URL of the per-component file manifest. */\n readonly manifestUrl: string;\n /** SHA-1 of the file manifest. */\n readonly manifestSha1: string;\n /**\n * Absolute path containing component directories. When set, runtime files for `component`\n * live at `<installRoot>/<component>/...`. When unset, defaults to `<target.directory>/runtime`.\n */\n readonly installRoot?: string;\n}\n","import path from \"node:path\";\nimport { ASSETS_DIR, LIBRARIES_DIR, RUNTIMES_DIR, VERSIONS_DIR } from \"../constants/files\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { dirExists, fileExists, listChildDirectories } from \"../core/fs\";\nimport { Loaders, type VersionPreferenceKind } from \"../types/loader\";\nimport { RuntimePreference, type RuntimePreferenceKind } from \"../types/runtime\";\nimport type { RuntimeSystem } from \"../types/system\";\nimport type {\n DiscoveredLoaderHint,\n DiscoveredRuntimeHint,\n DiscoveredTarget,\n Target,\n TargetCreateInput,\n} from \"../types/target\";\nimport type { FabricVersionsApi } from \"../versions/fabric\";\nimport type { ForgeVersionsApi } from \"../versions/forge\";\nimport type { MinecraftVersionsApi } from \"../versions/minecraft\";\nimport type { RuntimeVersionsApi } from \"../versions/runtime\";\n\n/** Inputs to {@link TargetsApi.resolve}. */\nexport interface TargetResolveInput {\n readonly id: string;\n readonly directory: string;\n readonly minecraft: { readonly version: string };\n readonly loader: TargetLoaderInput;\n readonly runtime?: {\n readonly preference?: RuntimePreferenceKind;\n /** Override the runtime component. Defaults to the Minecraft manifest's `javaVersion.component`. */\n readonly component?: string;\n /**\n * Custom install root (absolute path) holding the component directories.\n * When unset, runtime files live under `<directory>/runtime/`.\n */\n readonly installRoot?: string;\n };\n readonly system?: RuntimeSystem;\n readonly signal?: AbortSignal;\n}\n\n/** Loader input variants. */\nexport type TargetLoaderInput =\n | { readonly type: typeof Loaders.VANILLA }\n | {\n readonly type: typeof Loaders.FABRIC;\n readonly preference?: VersionPreferenceKind;\n readonly version?: string;\n }\n | {\n readonly type: typeof Loaders.FORGE;\n readonly preference?: VersionPreferenceKind;\n readonly version?: string;\n };\n\n/** Inputs to {@link TargetsApi.list}. */\nexport interface TargetListInput {\n readonly rootDir: string;\n}\n\n/** Constructor inputs for {@link TargetsApi}. */\nexport interface TargetsApiContext {\n readonly minecraft: MinecraftVersionsApi;\n readonly fabric: FabricVersionsApi;\n readonly forge: ForgeVersionsApi;\n readonly runtime: RuntimeVersionsApi;\n readonly system: RuntimeSystem;\n}\n\n/** Public Targets API surface. */\nexport class TargetsApi {\n constructor(private readonly ctx: TargetsApiContext) {}\n\n /** The detected host system used by `resolve()` when no `system` is supplied. */\n get system(): RuntimeSystem {\n return this.ctx.system;\n }\n\n /** Build a {@link Target} from already-resolved components. */\n create(input: TargetCreateInput): Target {\n if (!input.id) {\n throw new MinecraftKitError(\"INVALID_INPUT\", \"Target id must be non-empty\");\n }\n if (!input.directory) {\n throw new MinecraftKitError(\"INVALID_INPUT\", \"Target directory must be non-empty\");\n }\n if (input.loader.minecraftVersion !== input.minecraft.version) {\n throw new MinecraftKitError(\n \"INVALID_INPUT\",\n `Loader Minecraft version (${input.loader.minecraftVersion}) does not match resolved Minecraft (${input.minecraft.version})`,\n {\n context: {\n loaderMinecraft: input.loader.minecraftVersion,\n minecraftVersion: input.minecraft.version,\n },\n },\n );\n }\n return {\n id: input.id,\n directory: input.directory,\n minecraft: input.minecraft,\n loader: input.loader,\n runtime: input.runtime,\n };\n }\n\n /** Sugar API: resolve every component then assemble a target. */\n async resolve(input: TargetResolveInput): Promise<Target> {\n const minecraft = await this.ctx.minecraft.resolve({\n version: input.minecraft.version,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const system = input.system ?? this.ctx.system;\n const componentOverride = input.runtime?.component;\n const runtimeComponent = componentOverride ?? minecraft.manifest.javaVersion?.component;\n const resolvedRuntime = await this.ctx.runtime.resolve({\n system,\n ...(runtimeComponent !== undefined ? { component: runtimeComponent } : {}),\n preference: input.runtime?.preference ?? RuntimePreference.RECOMMENDED,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const runtime: import(\"../types/runtime\").ResolvedRuntime =\n input.runtime?.installRoot !== undefined\n ? { ...resolvedRuntime, installRoot: input.runtime.installRoot }\n : resolvedRuntime;\n let loader: import(\"../types/loader\").Loader;\n if (input.loader.type === Loaders.VANILLA) {\n // Vanilla loader is just a wrapper around the already-resolved Minecraft manifest —\n // no upstream fetch needed.\n loader = {\n type: Loaders.VANILLA,\n minecraftVersion: minecraft.version,\n minecraft,\n };\n } else if (input.loader.type === Loaders.FABRIC) {\n loader = await this.ctx.fabric.resolve({\n minecraftVersion: minecraft.version,\n ...(input.loader.preference !== undefined ? { preference: input.loader.preference } : {}),\n ...(input.loader.version !== undefined ? { loaderVersion: input.loader.version } : {}),\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n } else {\n loader = await this.ctx.forge.resolve({\n minecraftVersion: minecraft.version,\n ...(input.loader.preference !== undefined ? { preference: input.loader.preference } : {}),\n ...(input.loader.version !== undefined ? { forgeVersion: input.loader.version } : {}),\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n }\n return this.create({\n id: input.id,\n directory: input.directory,\n minecraft,\n loader,\n runtime,\n });\n }\n\n /** Scan a root directory for Minecraft installations. Returns only what is on disk. */\n async list(input: TargetListInput): Promise<readonly DiscoveredTarget[]> {\n if (!(await dirExists(input.rootDir))) return [];\n const subdirs = await listChildDirectories(input.rootDir);\n const results: DiscoveredTarget[] = [];\n for (const id of subdirs) {\n const directory = path.join(input.rootDir, id);\n const discovered = await discoverInstallation(id, directory);\n if (discovered) results.push(discovered);\n }\n return results;\n }\n}\n\nasync function discoverInstallation(\n id: string,\n directory: string,\n): Promise<DiscoveredTarget | null> {\n const versionsDir = path.join(directory, VERSIONS_DIR);\n const librariesDir = path.join(directory, LIBRARIES_DIR);\n const assetsDir = path.join(directory, ASSETS_DIR);\n const looksLikeInstall =\n (await dirExists(versionsDir)) &&\n ((await dirExists(librariesDir)) || (await dirExists(assetsDir)));\n if (!looksLikeInstall) return null;\n const versionDirs = await listChildDirectories(versionsDir);\n const minecraftVersions: string[] = [];\n const loaders: DiscoveredLoaderHint[] = [];\n for (const versionId of versionDirs) {\n const hint = inferLoaderFromVersionId(versionId);\n if (hint) {\n loaders.push(hint);\n if (hint.minecraftVersion && !minecraftVersions.includes(hint.minecraftVersion)) {\n minecraftVersions.push(hint.minecraftVersion);\n }\n } else {\n minecraftVersions.push(versionId);\n }\n }\n const runtime = await discoverRuntime(directory);\n return { id, directory, minecraftVersions, loaders, ...(runtime ? { runtime } : {}) };\n}\n\nasync function discoverRuntime(directory: string): Promise<DiscoveredRuntimeHint | undefined> {\n const runtimeDir = path.join(directory, RUNTIMES_DIR);\n if (!(await dirExists(runtimeDir))) return undefined;\n let components: readonly string[];\n try {\n components = await listChildDirectories(runtimeDir);\n } catch {\n return undefined;\n }\n for (const component of components) {\n const root = path.join(runtimeDir, component);\n const javaPath =\n process.platform === \"win32\"\n ? path.join(root, \"bin\", \"javaw.exe\")\n : process.platform === \"darwin\"\n ? path.join(root, \"jre.bundle\", \"Contents\", \"Home\", \"bin\", \"java\")\n : path.join(root, \"bin\", \"java\");\n if (await fileExists(javaPath)) {\n return { component, javaPath };\n }\n }\n return undefined;\n}\n\nfunction inferLoaderFromVersionId(versionId: string): DiscoveredLoaderHint | null {\n const fabricMatch = /^fabric-loader-([^-]+)-(.+)$/.exec(versionId);\n if (fabricMatch?.[1] && fabricMatch[2]) {\n return { type: Loaders.FABRIC, version: fabricMatch[1], minecraftVersion: fabricMatch[2] };\n }\n const forgeMatch = /^([^-]+)-forge-(.+)$/.exec(versionId);\n if (forgeMatch?.[1] && forgeMatch[2]) {\n return { type: Loaders.FORGE, minecraftVersion: forgeMatch[1], version: forgeMatch[2] };\n }\n return null;\n}\n","import { planInstall } from \"../install/planner\";\nimport { runInstall } from \"../install/runner\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport type { Spawner } from \"../types/spawner\";\nimport type { Target } from \"../types/target\";\nimport type { UpdatePlan, UpdateReport } from \"../types/update\";\n\n/** Inputs to {@link planUpdate}. */\nexport interface PlanUpdateInput {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n}\n\n/**\n * Build an update plan. Structurally identical to an install plan — the install runner\n * already skips files whose on-disk size + sha1 match the manifest, so \"update\" and\n * \"install\" share the same action list.\n */\nexport async function planUpdate(input: PlanUpdateInput): Promise<UpdatePlan> {\n return planInstall({\n target: input.target,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n}\n\n/** Inputs to the update runner. */\nexport interface RunUpdateInput {\n readonly plan: UpdatePlan;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly spawner: Spawner;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/**\n * Execute an update plan. Reuses the install runner; already-correct files are skipped\n * automatically and counted in the `actionsSkipped` field of the report.\n */\nexport async function runUpdate(input: RunUpdateInput): Promise<UpdateReport> {\n const report = await runInstall({\n plan: input.plan,\n http: input.http,\n cache: input.cache,\n spawner: input.spawner,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n return {\n targetId: report.targetId,\n bytesDownloaded: report.bytesDownloaded,\n actionsCompleted: report.actionsCompleted,\n actionsSkipped: report.actionsSkipped,\n durationMs: report.durationMs,\n };\n}\n","import crypto from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\n\n/** Compute the SHA-1 of a file on disk. Streams to keep memory usage flat. */\nexport async function sha1OfFile(filePath: string): Promise<string> {\n const hash = crypto.createHash(\"sha1\");\n await new Promise<void>((resolve, reject) => {\n const stream = createReadStream(filePath);\n stream.on(\"data\", (chunk) => hash.update(chunk));\n stream.on(\"end\", resolve);\n stream.on(\"error\", reject);\n });\n return hash.digest(\"hex\");\n}\n","import { fileExists, fileSize, listChildDirectories, readText } from \"../core/fs\";\nimport { sha1OfFile } from \"../core/hash\";\nimport { targetPaths } from \"../core/paths\";\nimport type { ProgressListener } from \"../types/events\";\nimport {\n type VerificationFileResult,\n type VerificationKind,\n type VerificationResult,\n VerifyFileStatuses,\n} from \"../types/verify\";\n\n/** Records a single file-check result and emits the corresponding event. */\nexport type VerificationRecorder = (result: VerificationFileResult) => void;\n\n/**\n * Run the boilerplate shared by every aspect verifier: tracks the per-file results emitted\n * via the recorder, fires `verify:file-checked` events, and assembles the {@link VerificationResult}.\n */\nexport async function runVerification(\n input: {\n readonly targetId: string;\n readonly kind: VerificationKind;\n readonly onEvent?: ProgressListener;\n },\n check: (record: VerificationRecorder) => Promise<void>,\n): Promise<VerificationResult> {\n const startedAt = Date.now();\n const results: VerificationFileResult[] = [];\n const record: VerificationRecorder = (result) => {\n results.push(result);\n input.onEvent?.({ type: \"verify:file-checked\", file: result });\n };\n await check(record);\n return {\n targetId: input.targetId,\n kind: input.kind,\n isValid: results.every((r) => r.status === VerifyFileStatuses.OK),\n issues: results.filter((r) => r.status !== VerifyFileStatuses.OK),\n checkedFiles: results.length,\n durationMs: Date.now() - startedAt,\n };\n}\n\n/** Verify a file by existence + optional size + optional sha1. */\nexport async function verifyHashedFile(input: {\n readonly path: string;\n readonly expectedSha1?: string;\n readonly expectedSize?: number;\n readonly url?: string;\n readonly category: VerificationFileResult[\"category\"];\n}): Promise<VerificationFileResult> {\n if (!(await fileExists(input.path))) {\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.MISSING,\n ...(input.expectedSha1 !== undefined ? { expectedSha1: input.expectedSha1 } : {}),\n ...(input.expectedSize !== undefined ? { expectedSize: input.expectedSize } : {}),\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n }\n if (input.expectedSize !== undefined) {\n const size = await fileSize(input.path);\n if (size !== input.expectedSize) {\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.WRONG_SIZE,\n expectedSize: input.expectedSize,\n actualSize: size,\n ...(input.expectedSha1 !== undefined ? { expectedSha1: input.expectedSha1 } : {}),\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n }\n }\n if (input.expectedSha1 !== undefined) {\n const actualSha1 = await sha1OfFile(input.path);\n if (actualSha1 !== input.expectedSha1) {\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.CORRUPT,\n expectedSha1: input.expectedSha1,\n actualSha1,\n ...(input.expectedSize !== undefined ? { expectedSize: input.expectedSize } : {}),\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n }\n }\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.OK,\n ...(input.expectedSha1 !== undefined ? { expectedSha1: input.expectedSha1 } : {}),\n ...(input.expectedSize !== undefined ? { expectedSize: input.expectedSize } : {}),\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n}\n\n/** Verify by existence only (no hash/size check). */\nexport async function verifyExistence(input: {\n readonly path: string;\n readonly category: VerificationFileResult[\"category\"];\n readonly url?: string;\n}): Promise<VerificationFileResult> {\n if (await fileExists(input.path)) {\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.OK,\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n }\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.MISSING,\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n}\n\n/**\n * Locate a Forge version JSON on disk for the given Minecraft version. Returns the\n * discovered path even if the JSON file itself is missing — callers use the path to record\n * a MISSING issue and trigger a write/repair downstream. Returns null when the versions\n * directory has no Forge folder for this Minecraft version.\n */\nexport async function findForgeVersionJsonPath(\n directory: string,\n minecraftVersion: string,\n): Promise<string | null> {\n const versionsDir = targetPaths.versionsDir(directory);\n const dirs = await listChildDirectories(versionsDir);\n for (const id of dirs) {\n if (!id.startsWith(`${minecraftVersion}-forge-`)) continue;\n const jsonPath = targetPaths.versionJson(directory, id);\n if (!(await fileExists(jsonPath))) {\n return jsonPath;\n }\n const parsed = await tryParseInheritsFrom(jsonPath);\n if (parsed === minecraftVersion) return jsonPath;\n }\n return null;\n}\n\nasync function tryParseInheritsFrom(jsonPath: string): Promise<string | undefined> {\n try {\n const parsed = JSON.parse(await readText(jsonPath)) as { inheritsFrom?: string };\n return parsed.inheritsFrom;\n } catch {\n // Malformed JSON cannot match by inheritsFrom; treated as a non-match. The next\n // verify pass over this file will surface it through the regular file check path.\n return undefined;\n }\n}\n","import { MinecraftKitError } from \"../core/errors\";\nimport { targetPaths } from \"../core/paths\";\nimport { planLibraryDownloads } from \"../install/libraries\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport { Loaders } from \"../types/loader\";\nimport type { Target } from \"../types/target\";\nimport { VerificationKinds, type VerificationResult, VerifyFileCategories } from \"../types/verify\";\nimport { runVerification, verifyExistence, verifyHashedFile } from \"./helpers\";\n\n/** Inputs to {@link verifyFabric}. */\nexport interface VerifyFabricInput {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/** Verify the Fabric loader slice: profile JSON + every library it pulls in. */\nexport async function verifyFabric(input: VerifyFabricInput): Promise<VerificationResult> {\n if (input.target.loader.type !== Loaders.FABRIC) {\n throw new MinecraftKitError(\n \"INVALID_INPUT\",\n `verify.fabric requires a Fabric target (got ${input.target.loader.type})`,\n );\n }\n const loader = input.target.loader;\n return runVerification(\n {\n targetId: input.target.id,\n kind: VerificationKinds.FABRIC,\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n },\n async (record) => {\n record(\n await verifyExistence({\n path: targetPaths.versionJson(input.target.directory, loader.profile.id),\n category: VerifyFileCategories.LOADER_LIBRARY,\n }),\n );\n const fabricLibraries = planLibraryDownloads({\n libraries: loader.profile.libraries,\n directory: input.target.directory,\n system: input.target.runtime.system,\n versionId: input.target.minecraft.version,\n category: \"fabric-library\",\n });\n for (const action of fabricLibraries.downloads) {\n record(\n await verifyHashedFile({\n path: action.target,\n expectedSha1: action.expectedSha1,\n expectedSize: action.expectedSize,\n ...(action.url ? { url: action.url } : {}),\n category: VerifyFileCategories.LOADER_LIBRARY,\n }),\n );\n }\n },\n );\n}\n","import { MinecraftKitError } from \"../core/errors\";\nimport { fileExists, readText } from \"../core/fs\";\nimport { planLibraryDownloads } from \"../install/libraries\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { ForgeVersionJson } from \"../types/forge\";\nimport type { HttpClient } from \"../types/http\";\nimport { Loaders } from \"../types/loader\";\nimport type { Target } from \"../types/target\";\nimport {\n VerificationKinds,\n type VerificationResult,\n VerifyFileCategories,\n VerifyFileStatuses,\n} from \"../types/verify\";\nimport {\n findForgeVersionJsonPath,\n runVerification,\n verifyExistence,\n verifyHashedFile,\n} from \"./helpers\";\n\n/** Inputs to {@link verifyForge}. */\nexport interface VerifyForgeInput {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/**\n * Verify the Forge loader slice: the on-disk Forge version JSON and every library it\n * declares. Libraries can only be enumerated once the JSON is present *and parsable*; a\n * malformed JSON is surfaced as a CORRUPT issue so repair rewrites it before re-running.\n */\nexport async function verifyForge(input: VerifyForgeInput): Promise<VerificationResult> {\n if (input.target.loader.type !== Loaders.FORGE) {\n throw new MinecraftKitError(\n \"INVALID_INPUT\",\n `verify.forge requires a Forge target (got ${input.target.loader.type})`,\n );\n }\n return runVerification(\n {\n targetId: input.target.id,\n kind: VerificationKinds.FORGE,\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n },\n async (record) => {\n const forgeVersionJsonPath = await findForgeVersionJsonPath(\n input.target.directory,\n input.target.minecraft.version,\n );\n if (forgeVersionJsonPath === null) return;\n record(\n await verifyExistence({\n path: forgeVersionJsonPath,\n category: VerifyFileCategories.LOADER_LIBRARY,\n }),\n );\n if (!(await fileExists(forgeVersionJsonPath))) return;\n\n let parsed: ForgeVersionJson;\n try {\n parsed = JSON.parse(await readText(forgeVersionJsonPath)) as ForgeVersionJson;\n } catch {\n // Surface as CORRUPT so repair rewrites the JSON. Library verification will pick up\n // on the next pass once the file parses.\n record({\n path: forgeVersionJsonPath,\n category: VerifyFileCategories.LOADER_LIBRARY,\n status: VerifyFileStatuses.CORRUPT,\n });\n return;\n }\n const forgeLibraries = planLibraryDownloads({\n libraries: parsed.libraries,\n directory: input.target.directory,\n system: input.target.runtime.system,\n versionId: input.target.minecraft.version,\n category: \"forge-library\",\n });\n for (const action of forgeLibraries.downloads) {\n record(\n await verifyHashedFile({\n path: action.target,\n expectedSha1: action.expectedSha1,\n expectedSize: action.expectedSize,\n ...(action.url ? { url: action.url } : {}),\n category: VerifyFileCategories.LOADER_LIBRARY,\n }),\n );\n }\n },\n );\n}\n","import { fileExists } from \"../core/fs\";\nimport { targetPaths } from \"../core/paths\";\nimport { fetchJson } from \"../http/metadata\";\nimport { planLibraryDownloads } from \"../install/libraries\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport type { AssetIndexDocument } from \"../types/minecraft\";\nimport type { Target } from \"../types/target\";\nimport {\n VerificationKinds,\n type VerificationResult,\n VerifyFileCategories,\n VerifyFileStatuses,\n} from \"../types/verify\";\nimport { runVerification, verifyExistence, verifyHashedFile } from \"./helpers\";\n\n/** Inputs to {@link verifyMinecraft}. */\nexport interface VerifyMinecraftInput {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/**\n * Verify the vanilla Minecraft slice of an installation: the client jar, version JSON,\n * libraries (incl. native jars), assets (index + objects), logging config, and the\n * extracted natives directory.\n */\nexport async function verifyMinecraft(input: VerifyMinecraftInput): Promise<VerificationResult> {\n return runVerification(\n {\n targetId: input.target.id,\n kind: VerificationKinds.MINECRAFT,\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n },\n async (record) => {\n const { directory, minecraft, runtime } = input.target;\n\n // Client jar.\n record(\n await verifyHashedFile({\n path: targetPaths.versionJar(directory, minecraft.version),\n expectedSha1: minecraft.manifest.downloads.client.sha1,\n expectedSize: minecraft.manifest.downloads.client.size,\n url: minecraft.manifest.downloads.client.url,\n category: VerifyFileCategories.CLIENT_JAR,\n }),\n );\n\n // Vanilla version JSON (a missing JSON triggers WRITE_VERSION_JSON during repair).\n record(\n await verifyExistence({\n path: targetPaths.versionJson(directory, minecraft.version),\n category: VerifyFileCategories.CLIENT_JAR,\n }),\n );\n\n // Logging config.\n if (minecraft.manifest.logging?.client) {\n const logging = minecraft.manifest.logging.client;\n record(\n await verifyHashedFile({\n path: targetPaths.loggingConfig(directory, logging.file.id),\n expectedSha1: logging.file.sha1,\n expectedSize: logging.file.size,\n url: logging.file.url,\n category: VerifyFileCategories.LOGGING_CONFIG,\n }),\n );\n }\n\n // Libraries (incl. native jars).\n const libraryPlan = planLibraryDownloads({\n libraries: minecraft.manifest.libraries,\n directory,\n system: runtime.system,\n versionId: minecraft.version,\n category: \"library\",\n });\n for (const action of libraryPlan.downloads) {\n record(\n await verifyHashedFile({\n path: action.target,\n expectedSha1: action.expectedSha1,\n expectedSize: action.expectedSize,\n url: action.url,\n category: VerifyFileCategories.LIBRARY,\n }),\n );\n }\n\n // Asset index + objects.\n const indexUrl = minecraft.manifest.assetIndex.url;\n const indexPath = targetPaths.assetIndex(directory, minecraft.manifest.assetIndex.id);\n record(\n await verifyHashedFile({\n path: indexPath,\n expectedSha1: minecraft.manifest.assetIndex.sha1,\n expectedSize: minecraft.manifest.assetIndex.size,\n url: indexUrl,\n category: VerifyFileCategories.ASSET_INDEX,\n }),\n );\n const indexDocument = await fetchJson<AssetIndexDocument>(input.http, input.cache, {\n url: indexUrl,\n cacheKey: `asset-index:${minecraft.manifest.assetIndex.id}:${minecraft.manifest.assetIndex.sha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n // Same hash may be referenced by multiple virtual paths; verify each physical file\n // at most once.\n const seenAssetHashes = new Set<string>();\n for (const entry of Object.values(indexDocument.objects)) {\n if (seenAssetHashes.has(entry.hash)) continue;\n seenAssetHashes.add(entry.hash);\n record(\n await verifyHashedFile({\n path: targetPaths.assetObject(directory, entry.hash),\n expectedSha1: entry.hash,\n expectedSize: entry.size,\n category: VerifyFileCategories.ASSET,\n }),\n );\n }\n\n // Natives directory presence. When it's gone, every native JAR needs to be\n // re-extracted: emit one NATIVE issue per source JAR so the count of issues matches\n // the count of EXTRACT_NATIVE actions repair will produce.\n const nativesDir = targetPaths.nativesDir(directory, minecraft.version);\n if (!(await fileExists(nativesDir))) {\n for (const extraction of libraryPlan.nativeExtractions) {\n record({\n path: extraction.source,\n category: VerifyFileCategories.NATIVE,\n status: VerifyFileStatuses.MISSING,\n });\n }\n }\n },\n );\n}\n","import path from \"node:path\";\nimport { targetPaths } from \"../core/paths\";\nimport { fetchJson } from \"../http/metadata\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport type { RuntimeFilesManifest } from \"../types/runtime\";\nimport type { Target } from \"../types/target\";\nimport {\n VerificationKinds,\n type VerificationResult,\n VerifyFileCategories,\n VerifyFileStatuses,\n} from \"../types/verify\";\nimport { runVerification, verifyHashedFile } from \"./helpers\";\n\n/** Inputs to {@link verifyRuntime}. */\nexport interface VerifyRuntimeInput {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/**\n * Verify the Java runtime files. Honours `target.runtime.installRoot` when set so a\n * shared/global runtime install is checked at its real location instead of the per-target\n * `runtime/` subfolder.\n */\nexport async function verifyRuntime(input: VerifyRuntimeInput): Promise<VerificationResult> {\n return runVerification(\n {\n targetId: input.target.id,\n kind: VerificationKinds.RUNTIME,\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n },\n async (record) => {\n let manifest: RuntimeFilesManifest;\n try {\n manifest = await fetchJson<RuntimeFilesManifest>(input.http, input.cache, {\n url: input.target.runtime.manifestUrl,\n cacheKey: `runtime-manifest:${input.target.runtime.component}:${input.target.runtime.platformKey}:${input.target.runtime.manifestSha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n } catch {\n // Manifest unreachable — record one MISSING issue keyed on the manifest URL so the\n // caller sees that the runtime cannot be verified right now. Repair will re-attempt.\n record({\n path: input.target.runtime.manifestUrl,\n category: VerifyFileCategories.RUNTIME_FILE,\n status: VerifyFileStatuses.MISSING,\n });\n return;\n }\n const runtimeRoot = targetPaths.runtimeRoot(\n input.target.directory,\n input.target.runtime.component,\n input.target.runtime.installRoot,\n );\n for (const [relative, entry] of Object.entries(manifest.files)) {\n if (entry.type !== \"file\") continue;\n record(\n await verifyHashedFile({\n path: path.join(runtimeRoot, relative),\n expectedSha1: entry.downloads.raw.sha1,\n expectedSize: entry.downloads.raw.size,\n url: entry.downloads.raw.url,\n category: VerifyFileCategories.RUNTIME_FILE,\n }),\n );\n }\n },\n );\n}\n","import { ApiEndpoints } from \"../constants/api\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { fetchJson } from \"../http/metadata\";\nimport type {\n FabricCompatibilityEntry,\n FabricLoaderSummary,\n FabricProfile,\n ResolvedFabricLoader,\n} from \"../types/fabric\";\nimport { Loaders, VersionPreference, type VersionPreferenceKind } from \"../types/loader\";\nimport type { ResolverContext } from \"./context\";\n\n/** Inputs to {@link FabricVersionsApi.list}. */\nexport interface FabricListInput {\n readonly minecraftVersion?: string;\n readonly signal?: AbortSignal;\n}\n\n/** Inputs to {@link FabricVersionsApi.resolve}. */\nexport interface FabricResolveInput {\n readonly minecraftVersion: string;\n readonly preference?: VersionPreferenceKind;\n readonly loaderVersion?: string;\n readonly signal?: AbortSignal;\n}\n\n/** Public Fabric versions API surface. */\nexport class FabricVersionsApi {\n constructor(private readonly ctx: ResolverContext) {}\n\n /** List Fabric loader versions, optionally constrained to a Minecraft version. */\n async list(input: FabricListInput = {}): Promise<readonly FabricLoaderSummary[]> {\n if (input.minecraftVersion === undefined) {\n return fetchJson<readonly FabricLoaderSummary[]>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.fabric.loaderVersions(),\n cacheKey: \"fabric-loader-all\",\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n }\n const compat = await fetchJson<readonly FabricCompatibilityEntry[]>(\n this.ctx.http,\n this.ctx.cache,\n {\n url: ApiEndpoints.fabric.loaderForGame(input.minecraftVersion),\n cacheKey: `fabric-loader-mc:${input.minecraftVersion}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n },\n );\n return compat.map((c) => c.loader);\n }\n\n /** Resolve a Fabric loader version against a Minecraft version. */\n async resolve(input: FabricResolveInput): Promise<ResolvedFabricLoader> {\n const loaders = await this.list({\n minecraftVersion: input.minecraftVersion,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (loaders.length === 0) {\n throw new MinecraftKitError(\n \"MANIFEST_NOT_FOUND\",\n `No Fabric loader available for Minecraft ${input.minecraftVersion}`,\n { context: { version: input.minecraftVersion } },\n );\n }\n const chosen = pickFabricLoader(loaders, input);\n if (!chosen) {\n throw new MinecraftKitError(\n \"MANIFEST_NOT_FOUND\",\n `Fabric loader version not found: ${input.loaderVersion ?? \"(none matched)\"}`,\n { context: { version: input.loaderVersion } },\n );\n }\n const profile = await fetchJson<FabricProfile>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.fabric.profile(input.minecraftVersion, chosen.version),\n cacheKey: `fabric-profile:${input.minecraftVersion}:${chosen.version}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n return {\n type: Loaders.FABRIC,\n minecraftVersion: input.minecraftVersion,\n loaderVersion: chosen.version,\n profile,\n };\n }\n}\n\nfunction pickFabricLoader(\n loaders: readonly FabricLoaderSummary[],\n input: FabricResolveInput,\n): FabricLoaderSummary | undefined {\n if (input.loaderVersion !== undefined) {\n return loaders.find((l) => l.version === input.loaderVersion);\n }\n const preference = input.preference ?? VersionPreference.LATEST;\n if (preference === VersionPreference.RECOMMENDED) {\n const stable = loaders.find((l) => l.stable);\n if (stable) return stable;\n }\n return loaders[0];\n}\n","/**\n * Extract every `<version>...</version>` element from a Maven `maven-metadata.xml`. The\n * structure is rigid enough that a regex-based extractor is robust here — no full XML parser\n * dependency required.\n */\nexport function parseMavenMetadataVersions(xml: string): readonly string[] {\n const versions: string[] = [];\n const regex = /<version>\\s*([^<]+?)\\s*<\\/version>/g;\n for (const match of xml.matchAll(regex)) {\n if (match[1]) versions.push(match[1]);\n }\n return versions;\n}\n","import { ApiEndpoints } from \"../constants/api\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { parseMavenMetadataVersions } from \"../core/xml\";\nimport { fetchJson, fetchText } from \"../http/metadata\";\nimport type { ForgeBuildSummary, ResolvedForgeLoader } from \"../types/forge\";\nimport { Loaders, VersionPreference, type VersionPreferenceKind } from \"../types/loader\";\nimport type { ResolverContext } from \"./context\";\n\n/** Inputs to {@link ForgeVersionsApi.list}. */\nexport interface ForgeListInput {\n readonly minecraftVersion?: string;\n readonly signal?: AbortSignal;\n}\n\n/** Inputs to {@link ForgeVersionsApi.resolve}. */\nexport interface ForgeResolveInput {\n readonly minecraftVersion: string;\n readonly preference?: VersionPreferenceKind;\n readonly forgeVersion?: string;\n readonly signal?: AbortSignal;\n}\n\n/** Public Forge versions API surface. */\nexport class ForgeVersionsApi {\n constructor(private readonly ctx: ResolverContext) {}\n\n /** List Forge builds (across all Minecraft versions, or filtered to one). */\n async list(input: ForgeListInput = {}): Promise<readonly ForgeBuildSummary[]> {\n const xml = await fetchText(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.forge.mavenMetadata(),\n cacheKey: \"forge-maven-metadata\",\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const allVersions = parseMavenMetadataVersions(xml);\n const promotions = await fetchJson<ForgePromotions>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.forge.promotions(),\n cacheKey: \"forge-promotions\",\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const summaries = allVersions\n .map((fullVersion) => buildSummary(fullVersion, promotions))\n .filter((s): s is ForgeBuildSummary => s !== null);\n if (input.minecraftVersion === undefined) return summaries;\n return summaries.filter((s) => s.minecraftVersion === input.minecraftVersion);\n }\n\n /** Resolve a Forge build for a Minecraft version. */\n async resolve(input: ForgeResolveInput): Promise<ResolvedForgeLoader> {\n const builds = await this.list({\n minecraftVersion: input.minecraftVersion,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (builds.length === 0) {\n throw new MinecraftKitError(\n \"MANIFEST_NOT_FOUND\",\n `No Forge build available for Minecraft ${input.minecraftVersion}`,\n { context: { version: input.minecraftVersion } },\n );\n }\n const chosen = pickForge(builds, input);\n if (!chosen) {\n throw new MinecraftKitError(\n \"MANIFEST_NOT_FOUND\",\n `Forge build not found for ${input.minecraftVersion}: ${input.forgeVersion ?? \"(none matched)\"}`,\n { context: { version: input.forgeVersion } },\n );\n }\n return {\n type: Loaders.FORGE,\n minecraftVersion: chosen.minecraftVersion,\n forgeVersion: chosen.forgeVersion,\n fullVersion: chosen.fullVersion,\n installerUrl: ApiEndpoints.forge.installer(chosen.fullVersion),\n };\n }\n}\n\ninterface ForgePromotions {\n readonly promos: Readonly<Record<string, string>>;\n}\n\nfunction buildSummary(fullVersion: string, promotions: ForgePromotions): ForgeBuildSummary | null {\n const dashIndex = fullVersion.indexOf(\"-\");\n if (dashIndex <= 0 || dashIndex === fullVersion.length - 1) return null;\n const minecraftVersion = fullVersion.slice(0, dashIndex);\n const forgeVersion = fullVersion.slice(dashIndex + 1);\n const promos = promotions.promos;\n const recommended = promos[`${minecraftVersion}-recommended`];\n const latest = promos[`${minecraftVersion}-latest`];\n return {\n fullVersion,\n minecraftVersion,\n forgeVersion,\n isRecommended: recommended === forgeVersion,\n isLatest: latest === forgeVersion,\n };\n}\n\nfunction pickForge(\n builds: readonly ForgeBuildSummary[],\n input: ForgeResolveInput,\n): ForgeBuildSummary | undefined {\n if (input.forgeVersion !== undefined) {\n return builds.find(\n (b) => b.forgeVersion === input.forgeVersion || b.fullVersion === input.forgeVersion,\n );\n }\n const preference = input.preference ?? VersionPreference.RECOMMENDED;\n if (preference === VersionPreference.RECOMMENDED) {\n const recommended = builds.find((b) => b.isRecommended);\n if (recommended) return recommended;\n }\n const latest = builds.find((b) => b.isLatest);\n if (latest) return latest;\n return builds[builds.length - 1];\n}\n","import { ApiEndpoints } from \"../constants/api\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { fetchJson } from \"../http/metadata\";\nimport type {\n MinecraftChannel,\n MinecraftVersionManifest,\n MinecraftVersionSummary,\n ResolvedMinecraft,\n} from \"../types/minecraft\";\nimport type { ResolverContext } from \"./context\";\n\n/** Top-level shape returned by `version_manifest_v2.json`. */\ninterface VersionManifestRoot {\n readonly latest: { readonly release: string; readonly snapshot: string };\n readonly versions: readonly MinecraftVersionSummary[];\n}\n\n/** Inputs to {@link MinecraftVersionsApi.list}. */\nexport interface MinecraftListInput {\n readonly channel?: MinecraftChannel;\n readonly signal?: AbortSignal;\n}\n\n/** Inputs to {@link MinecraftVersionsApi.latest}. */\nexport interface MinecraftLatestInput {\n readonly channel?: MinecraftChannel;\n readonly signal?: AbortSignal;\n}\n\n/** Inputs to {@link MinecraftVersionsApi.get} / `.resolve`. */\nexport interface MinecraftGetInput {\n readonly version: string;\n readonly signal?: AbortSignal;\n}\n\n/** Public Minecraft versions API surface. */\nexport class MinecraftVersionsApi {\n constructor(private readonly ctx: ResolverContext) {}\n\n /** List all Minecraft versions, optionally filtered by channel. */\n async list(input: MinecraftListInput = {}): Promise<readonly MinecraftVersionSummary[]> {\n const root = await this.fetchManifestRoot(input.signal);\n if (input.channel === undefined) return root.versions;\n return root.versions.filter((v) => v.type === input.channel);\n }\n\n /** Return the latest version on the given channel (defaults to RELEASE). */\n async latest(input: MinecraftLatestInput = {}): Promise<MinecraftVersionSummary> {\n const root = await this.fetchManifestRoot(input.signal);\n const targetId = input.channel === \"snapshot\" ? root.latest.snapshot : root.latest.release;\n const summary = root.versions.find((v) => v.id === targetId);\n if (!summary) {\n throw new MinecraftKitError(\n \"MANIFEST_NOT_FOUND\",\n `Latest version ${targetId} not found in manifest`,\n );\n }\n return summary;\n }\n\n /** Return a single version summary or throw `MANIFEST_NOT_FOUND`. */\n async get(input: MinecraftGetInput): Promise<MinecraftVersionSummary> {\n const root = await this.fetchManifestRoot(input.signal);\n const summary = root.versions.find((v) => v.id === input.version);\n if (!summary) {\n throw new MinecraftKitError(\n \"MANIFEST_NOT_FOUND\",\n `Minecraft version not found: ${input.version}`,\n { context: { version: input.version } },\n );\n }\n return summary;\n }\n\n /** Fetch and parse the per-version manifest in addition to the summary. */\n async resolve(input: MinecraftGetInput): Promise<ResolvedMinecraft> {\n const summary = await this.get(input);\n const manifest = await fetchJson<MinecraftVersionManifest>(this.ctx.http, this.ctx.cache, {\n url: summary.url,\n cacheKey: `minecraft-manifest:${summary.id}:${summary.sha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (!manifest.id || !manifest.mainClass) {\n throw new MinecraftKitError(\n \"MANIFEST_INVALID\",\n `Per-version manifest is missing required fields: ${summary.id}`,\n { context: { version: summary.id, url: summary.url } },\n );\n }\n return {\n version: summary.id,\n channel: summary.type,\n manifest,\n summary,\n };\n }\n\n private async fetchManifestRoot(signal: AbortSignal | undefined): Promise<VersionManifestRoot> {\n return fetchJson<VersionManifestRoot>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.mojang.versionManifest(),\n cacheKey: \"minecraft-version-manifest-v2\",\n ...(signal !== undefined ? { signal } : {}),\n });\n }\n}\n","import { RuntimeComponents } from \"../types/runtime\";\n\n/**\n * Fallback Mojang component when the per-version manifest declares none. Pre-1.7 vanilla\n * versions and a handful of legacy snapshots fall in this bucket.\n */\nexport const FALLBACK_COMPONENT: string = RuntimeComponents.JRE_LEGACY;\n","import { ApiEndpoints } from \"../constants/api\";\nimport { RUNTIME_PLATFORM_KEYS } from \"../constants/platform\";\nimport { FALLBACK_COMPONENT } from \"../constants/runtime\";\nimport { MinecraftKitError } from \"../core/errors\";\nimport { fetchJson } from \"../http/metadata\";\nimport { RuntimePreference, type RuntimePreferenceKind } from \"../types/runtime\";\nimport type { ResolvedRuntime, RuntimeIndex, RuntimeIndexEntry } from \"../types/runtime\";\nimport type { RuntimeSystem } from \"../types/system\";\nimport type { ResolverContext } from \"./context\";\n\n/** Inputs to {@link RuntimeVersionsApi.list}. */\nexport interface RuntimeListInput {\n readonly system: RuntimeSystem;\n readonly minecraftVersion?: string;\n readonly signal?: AbortSignal;\n}\n\n/** A summary entry for the list API. */\nexport interface RuntimeListEntry {\n readonly component: string;\n readonly platformKey: string;\n readonly versionName: string;\n readonly released: string;\n readonly manifestUrl: string;\n}\n\n/** Inputs to {@link RuntimeVersionsApi.resolve}. */\nexport interface RuntimeResolveInput {\n readonly system: RuntimeSystem;\n readonly minecraftVersion?: string;\n readonly component?: string;\n readonly preference?: RuntimePreferenceKind;\n readonly signal?: AbortSignal;\n}\n\n/** Public runtime versions API surface. */\nexport class RuntimeVersionsApi {\n constructor(private readonly ctx: ResolverContext) {}\n\n /** List available runtime entries for the host platform. */\n async list(input: RuntimeListInput): Promise<readonly RuntimeListEntry[]> {\n const platformKey = pickPlatformKey(input.system);\n const index = await this.fetchIndex(input.signal);\n const platform = index[platformKey];\n if (!platform) return [];\n const entries: RuntimeListEntry[] = [];\n for (const [component, items] of Object.entries(platform)) {\n for (const item of items) {\n entries.push({\n component,\n platformKey,\n versionName: item.version.name,\n released: item.version.released,\n manifestUrl: item.manifest.url,\n });\n }\n }\n return entries;\n }\n\n /** Resolve a single runtime for the host platform and Minecraft version. */\n async resolve(input: RuntimeResolveInput): Promise<ResolvedRuntime> {\n const platformKey = pickPlatformKey(input.system);\n const index = await this.fetchIndex(input.signal);\n const platform = index[platformKey];\n if (!platform) {\n throw new MinecraftKitError(\n \"RUNTIME_UNSUPPORTED_PLATFORM\",\n `No runtimes published for platform: ${platformKey}`,\n { context: { platform: platformKey } },\n );\n }\n const component = input.component ?? FALLBACK_COMPONENT;\n const candidates = platform[component] ?? [];\n if (candidates.length === 0) {\n const all = Object.entries(platform);\n const preference = input.preference ?? RuntimePreference.RECOMMENDED;\n if (preference === RuntimePreference.LATEST) {\n const fallback = pickLatestAcrossComponents(all);\n if (fallback) {\n return toResolved(fallback.component, platformKey, fallback.entry, input.system);\n }\n }\n throw new MinecraftKitError(\n \"RUNTIME_NOT_FOUND\",\n `Runtime component ${component} not available on ${platformKey}`,\n { context: { platform: platformKey, version: component } },\n );\n }\n const entry = candidates[0];\n if (!entry) {\n throw new MinecraftKitError(\n \"RUNTIME_NOT_FOUND\",\n `Runtime component ${component} list is empty for ${platformKey}`,\n { context: { platform: platformKey, version: component } },\n );\n }\n return toResolved(component, platformKey, entry, input.system);\n }\n\n private async fetchIndex(signal: AbortSignal | undefined): Promise<RuntimeIndex> {\n return fetchJson<RuntimeIndex>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.mojang.runtimeIndex(),\n cacheKey: \"mojang-runtime-index\",\n ...(signal !== undefined ? { signal } : {}),\n });\n }\n}\n\nfunction pickPlatformKey(system: RuntimeSystem): string {\n const archMap = RUNTIME_PLATFORM_KEYS[system.os];\n return archMap[system.arch];\n}\n\nfunction pickLatestAcrossComponents(\n entries: readonly [string, readonly RuntimeIndexEntry[]][],\n): { readonly component: string; readonly entry: RuntimeIndexEntry } | null {\n let bestComponent: string | null = null;\n let bestEntry: RuntimeIndexEntry | null = null;\n for (const [component, list] of entries) {\n for (const entry of list) {\n if (!bestEntry || entry.version.released > bestEntry.version.released) {\n bestComponent = component;\n bestEntry = entry;\n }\n }\n }\n if (!bestComponent || !bestEntry) return null;\n return { component: bestComponent, entry: bestEntry };\n}\n\nfunction toResolved(\n component: string,\n platformKey: string,\n entry: RuntimeIndexEntry,\n system: RuntimeSystem,\n): ResolvedRuntime {\n return {\n component,\n platformKey,\n versionName: entry.version.name,\n system,\n manifestUrl: entry.manifest.url,\n manifestSha1: entry.manifest.sha1,\n };\n}\n","import { silentLogger } from \"./core/logger\";\nimport { detectSystem } from \"./core/system\";\nimport { createMemoryCache } from \"./http/cache\";\nimport { FetchHttpClient } from \"./http/client\";\nimport { planInstall } from \"./install/planner\";\nimport { runInstall } from \"./install/runner\";\nimport {\n type PlanStandaloneRuntimeInstallInput,\n planRuntimeInstall,\n planStandaloneRuntimeInstall,\n} from \"./install/runtime-install\";\nimport { composeLaunch } from \"./launch/compose\";\nimport { runLaunch } from \"./launch/runner\";\nimport { ChildProcessSpawner } from \"./launch/spawner\";\nimport { planFabricRepair } from \"./repair/fabric\";\nimport { planForgeRepair } from \"./repair/forge\";\nimport { planMinecraftRepair } from \"./repair/minecraft\";\nimport { runRepair } from \"./repair/runner\";\nimport { planRuntimeRepair } from \"./repair/runtime\";\nimport { TargetsApi } from \"./targets/index\";\nimport type { MetadataCache } from \"./types/cache\";\nimport type { OperationOptions, ProgressListener } from \"./types/events\";\nimport type { HttpClient } from \"./types/http\";\nimport type { InstallPlan, InstallReport } from \"./types/install\";\nimport type {\n LaunchComposition,\n LaunchOptions,\n LaunchRunOptions,\n LaunchSession,\n} from \"./types/launch\";\nimport type { Logger } from \"./types/logger\";\nimport type { RepairPlan, RepairReport } from \"./types/repair\";\nimport type { Spawner } from \"./types/spawner\";\nimport type { RuntimeSystem } from \"./types/system\";\nimport type { Target } from \"./types/target\";\nimport type { UpdatePlan, UpdateReport } from \"./types/update\";\nimport type { VerificationResult } from \"./types/verify\";\nimport { planUpdate, runUpdate } from \"./update/runner\";\nimport { verifyFabric } from \"./verify/fabric\";\nimport { verifyForge } from \"./verify/forge\";\nimport { verifyMinecraft } from \"./verify/minecraft\";\nimport { verifyRuntime } from \"./verify/runtime\";\nimport { FabricVersionsApi } from \"./versions/fabric\";\nimport { ForgeVersionsApi } from \"./versions/forge\";\nimport { MinecraftVersionsApi } from \"./versions/minecraft\";\nimport { RuntimeVersionsApi } from \"./versions/runtime\";\n\n/** Constructor options for {@link MinecraftKit}. */\nexport interface MinecraftKitOptions {\n readonly httpClient?: HttpClient;\n readonly cache?: MetadataCache;\n readonly logger?: Logger;\n readonly system?: RuntimeSystem;\n readonly spawner?: Spawner;\n}\n\n/**\n * Single facade for the entire library.\n *\n * @example\n * ```ts\n * const kit = new MinecraftKit();\n * const target = await kit.targets.resolve({ id, directory, minecraft: { version: '1.20.1' }, loader: { type: Loaders.VANILLA } });\n * const plan = await kit.install.plan(target);\n * await kit.install.run(plan, { onEvent: console.log });\n * ```\n */\nexport class MinecraftKit {\n readonly versions: {\n readonly minecraft: MinecraftVersionsApi;\n readonly fabric: FabricVersionsApi;\n readonly forge: ForgeVersionsApi;\n readonly runtime: RuntimeVersionsApi;\n };\n readonly targets: TargetsApi;\n readonly install: {\n plan(target: Target, options?: OperationOptions): Promise<InstallPlan>;\n run(plan: InstallPlan, options?: OperationOptions): Promise<InstallReport>;\n /** Install only the Java runtime declared by `target.runtime` (honours `installRoot`). */\n readonly runtime: {\n plan(target: Target, options?: OperationOptions): Promise<InstallPlan>;\n run(plan: InstallPlan, options?: OperationOptions): Promise<InstallReport>;\n /**\n * Plan a runtime-only install without an existing Minecraft Target. The caller\n * supplies a {@link ResolvedRuntime} (typically from `kit.versions.runtime.resolve`)\n * plus a directory and stable id.\n */\n standalonePlan(\n input: Omit<PlanStandaloneRuntimeInstallInput, \"http\" | \"cache\">,\n ): Promise<InstallPlan>;\n };\n };\n readonly update: {\n plan(target: Target, options?: OperationOptions): Promise<UpdatePlan>;\n run(plan: UpdatePlan, options?: OperationOptions): Promise<UpdateReport>;\n };\n readonly verify: {\n /** Verify the vanilla Minecraft slice (client jar, libraries, assets, natives, log config). */\n readonly minecraft: {\n run(target: Target, options?: VerifyOperationOptions): Promise<VerificationResult>;\n };\n /** Verify the Fabric loader slice (profile JSON + libraries). Throws on non-Fabric targets. */\n readonly fabric: {\n run(target: Target, options?: VerifyOperationOptions): Promise<VerificationResult>;\n };\n /** Verify the Forge loader slice (version JSON + libraries). Throws on non-Forge targets. */\n readonly forge: {\n run(target: Target, options?: VerifyOperationOptions): Promise<VerificationResult>;\n };\n /** Verify the Java runtime files. Honours `target.runtime.installRoot` for shared installs. */\n readonly runtime: {\n run(target: Target, options?: VerifyOperationOptions): Promise<VerificationResult>;\n };\n };\n readonly repair: {\n /** Repair the vanilla Minecraft slice (client jar, libraries, assets, natives, log config). */\n readonly minecraft: RepairAspect;\n /** Repair the Fabric loader slice (profile JSON + libraries). Throws on non-Fabric targets. */\n readonly fabric: RepairAspect;\n /** Repair the Forge loader slice (version JSON + libraries + processors). Throws on non-Forge. */\n readonly forge: RepairAspect;\n /** Repair the Java runtime files. Honours `target.runtime.installRoot`. */\n readonly runtime: RepairAspect;\n };\n readonly launch: {\n compose(target: Target, options: LaunchOptions): Promise<LaunchComposition>;\n run(composition: LaunchComposition, options?: LaunchRunOptions): LaunchSession;\n };\n\n /** Cache surface useful for advanced consumers (e.g. clearing between operations). */\n readonly cache: MetadataCache;\n\n constructor(options: MinecraftKitOptions = {}) {\n const http = options.httpClient ?? new FetchHttpClient();\n const cache = options.cache ?? createMemoryCache();\n const logger = options.logger ?? silentLogger;\n const system = options.system ?? detectSystem();\n const spawner = options.spawner ?? new ChildProcessSpawner();\n const ctx = { http, cache, logger };\n\n const minecraft = new MinecraftVersionsApi(ctx);\n const fabric = new FabricVersionsApi(ctx);\n const forge = new ForgeVersionsApi(ctx);\n const runtime = new RuntimeVersionsApi(ctx);\n this.versions = { minecraft, fabric, forge, runtime };\n this.targets = new TargetsApi({ minecraft, fabric, forge, runtime, system });\n this.cache = cache;\n\n // Carry signal/onEvent from operation-level options through to internal call sites.\n // Centralising this avoids the same conditional spread appearing in every method below.\n const carry = (opts: { signal?: AbortSignal; onEvent?: ProgressListener } | undefined) => ({\n ...(opts?.signal !== undefined ? { signal: opts.signal } : {}),\n ...(opts?.onEvent !== undefined ? { onEvent: opts.onEvent } : {}),\n });\n\n const runInstallPlan = (plan: InstallPlan, opts?: OperationOptions) =>\n runInstall({ plan, http, cache, spawner, ...carry(opts) });\n\n this.install = {\n plan: (target, opts) => planInstall({ target, http, cache, ...carry(opts) }),\n run: runInstallPlan,\n runtime: {\n plan: (target, opts) => planRuntimeInstall({ target, http, cache, ...carry(opts) }),\n run: runInstallPlan,\n standalonePlan: (input) => planStandaloneRuntimeInstall({ ...input, http, cache }),\n },\n };\n\n this.update = {\n plan: (target, opts) => planUpdate({ target, http, cache, ...carry(opts) }),\n run: (plan, opts) => runUpdate({ plan, http, cache, spawner, ...carry(opts) }),\n };\n\n const verifyArgs = (target: Target, opts?: VerifyOperationOptions) => ({\n target,\n http,\n cache,\n ...carry(opts),\n });\n this.verify = {\n minecraft: { run: (target, opts) => verifyMinecraft(verifyArgs(target, opts)) },\n fabric: { run: (target, opts) => verifyFabric(verifyArgs(target, opts)) },\n forge: { run: (target, opts) => verifyForge(verifyArgs(target, opts)) },\n runtime: { run: (target, opts) => verifyRuntime(verifyArgs(target, opts)) },\n };\n\n const repairArgs = (target: Target, opts: RepairPlanOptions) => ({\n target,\n from: opts.from,\n http,\n cache,\n ...carry({ ...(opts.signal !== undefined ? { signal: opts.signal } : {}) }),\n });\n const runRepairPlan: RepairAspect[\"run\"] = (plan, opts) =>\n runRepair({ plan, http, cache, spawner, ...carry(opts) });\n this.repair = {\n minecraft: {\n plan: (target, opts) => planMinecraftRepair(repairArgs(target, opts)),\n run: runRepairPlan,\n },\n fabric: {\n plan: (target, opts) => planFabricRepair(repairArgs(target, opts)),\n run: runRepairPlan,\n },\n forge: {\n plan: (target, opts) => planForgeRepair(repairArgs(target, opts)),\n run: runRepairPlan,\n },\n runtime: {\n plan: (target, opts) => planRuntimeRepair(repairArgs(target, opts)),\n run: runRepairPlan,\n },\n };\n\n this.launch = {\n compose: (target, opts) => composeLaunch({ target, options: opts }),\n run: (composition, opts) =>\n runLaunch({\n composition,\n ...(opts !== undefined ? { options: opts } : {}),\n spawner,\n }),\n };\n }\n}\n\n/** Options accepted by every `verify.<kind>.run`. */\nexport interface VerifyOperationOptions {\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n\n/** Options for any `repair.<aspect>.plan` call. Accepts one or many verification results. */\nexport interface RepairPlanOptions {\n readonly from: VerificationResult | readonly VerificationResult[];\n readonly signal?: AbortSignal;\n}\n\n/** Shared shape of every aspect-specific repair surface (`repair.minecraft`, `.fabric`, …). */\nexport interface RepairAspect {\n plan(target: Target, options: RepairPlanOptions): Promise<RepairPlan>;\n run(plan: RepairPlan, options?: OperationOptions): Promise<RepairReport>;\n}\n","import type { InstallPhase } from \"./install\";\nimport type { RepairPhase } from \"./repair\";\nimport type { VerificationFileResult, VerificationResult } from \"./verify\";\n\n/**\n * Stable string constants for the `type` discriminator of every {@link ProgressEvent}.\n * Use these instead of bare string literals when filtering events.\n */\nexport const EventTypes = {\n INSTALL_PHASE_CHANGED: \"install:phase-changed\",\n DOWNLOAD_STARTED: \"download:started\",\n DOWNLOAD_PROGRESS: \"download:progress\",\n DOWNLOAD_SKIPPED: \"download:skipped\",\n DOWNLOAD_COMPLETED: \"download:completed\",\n DOWNLOAD_FAILED: \"download:failed\",\n INTEGRITY_VERIFIED: \"integrity:verified\",\n INTEGRITY_MISMATCH: \"integrity:mismatch\",\n ARCHIVE_EXTRACTED: \"archive:extracted\",\n FORGE_PROCESSOR_STARTED: \"forge:processor-started\",\n FORGE_PROCESSOR_COMPLETED: \"forge:processor-completed\",\n FORGE_PROCESSOR_OUTPUT_VERIFIED: \"forge:processor-output-verified\",\n VERIFY_FILE_CHECKED: \"verify:file-checked\",\n VERIFY_COMPLETED: \"verify:completed\",\n REPAIR_PHASE_CHANGED: \"repair:phase-changed\",\n LAUNCH_STARTING: \"launch:starting\",\n LAUNCH_STARTED: \"launch:started\",\n LAUNCH_STDOUT: \"launch:stdout\",\n LAUNCH_STDERR: \"launch:stderr\",\n LAUNCH_EXITED: \"launch:exited\",\n LAUNCH_ABORTED: \"launch:aborted\",\n} as const;\n\n/** Literal type of the `type` discriminator of a {@link ProgressEvent}. */\nexport type EventType = (typeof EventTypes)[keyof typeof EventTypes];\n\n/** Reference to a single file used in download events. */\nexport interface FileRef {\n readonly url: string;\n readonly target: string;\n readonly category?: string;\n}\n\n/** A single processor description used in Forge events. */\nexport interface ProcessorRef {\n readonly index: number;\n readonly mainClass: string;\n}\n\n/**\n * Discriminated union of all runtime progress events. Pass an `onEvent` callback to\n * `install.run`, `update.run`, `verify.run`, `repair.run`, or `launch.run` to receive these.\n */\nexport type ProgressEvent =\n | {\n readonly type: \"install:phase-changed\";\n readonly phase: InstallPhase;\n readonly previous: InstallPhase | null;\n }\n | { readonly type: \"download:started\"; readonly file: FileRef; readonly expectedSize: number }\n | {\n readonly type: \"download:progress\";\n readonly file: FileRef;\n readonly bytesDownloaded: number;\n readonly totalBytes: number;\n }\n | { readonly type: \"download:skipped\"; readonly file: FileRef }\n | {\n readonly type: \"download:completed\";\n readonly file: FileRef;\n readonly durationMs: number;\n readonly bytes: number;\n }\n | {\n readonly type: \"download:failed\";\n readonly file: FileRef;\n readonly error: Error;\n readonly willRetry: boolean;\n }\n | {\n readonly type: \"integrity:verified\";\n readonly file: FileRef;\n readonly algorithm: \"sha1\" | \"sha256\";\n readonly hash: string;\n }\n | {\n readonly type: \"integrity:mismatch\";\n readonly file: FileRef;\n readonly algorithm: \"sha1\" | \"sha256\";\n readonly expected: string;\n readonly actual: string;\n }\n | {\n readonly type: \"archive:extracted\";\n readonly archive: string;\n readonly target: string;\n readonly fileCount: number;\n }\n | {\n readonly type: \"forge:processor-started\";\n readonly processor: ProcessorRef;\n readonly total: number;\n }\n | {\n readonly type: \"forge:processor-completed\";\n readonly processor: ProcessorRef;\n readonly exitCode: number;\n readonly durationMs: number;\n }\n | {\n readonly type: \"forge:processor-output-verified\";\n readonly processor: ProcessorRef;\n readonly path: string;\n }\n | { readonly type: \"verify:file-checked\"; readonly file: VerificationFileResult }\n | { readonly type: \"verify:completed\"; readonly summary: VerificationResult }\n | {\n readonly type: \"repair:phase-changed\";\n readonly phase: RepairPhase;\n readonly previous: RepairPhase | null;\n }\n | {\n readonly type: \"launch:starting\";\n readonly command: string;\n readonly args: readonly string[];\n readonly cwd: string;\n }\n | { readonly type: \"launch:started\"; readonly pid: number }\n | { readonly type: \"launch:stdout\"; readonly line: string }\n | { readonly type: \"launch:stderr\"; readonly line: string }\n | {\n readonly type: \"launch:exited\";\n readonly code: number | null;\n readonly signal: NodeJS.Signals | null;\n }\n | { readonly type: \"launch:aborted\"; readonly reason: string };\n\n/** Listener signature accepted by every long-running operation. */\nexport type ProgressListener = (event: ProgressEvent) => void;\n\n/** Common options accepted by long-running operations. */\nexport interface OperationOptions {\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n}\n","/**\n * Minecraft release channels matching the `type` field of Mojang version manifest entries.\n */\nexport const MinecraftChannels = {\n RELEASE: \"release\",\n SNAPSHOT: \"snapshot\",\n OLD_BETA: \"old_beta\",\n OLD_ALPHA: \"old_alpha\",\n} as const;\n\n/** Channel literal as it appears in version manifest entries. */\nexport type MinecraftChannel = (typeof MinecraftChannels)[keyof typeof MinecraftChannels];\n\n/**\n * One entry from the top-level Minecraft `version_manifest_v2.json` listing.\n *\n * Note: this is a summary entry, not the full per-version manifest. Use\n * {@link ResolvedMinecraft} for the resolved/parsed full manifest.\n */\nexport interface MinecraftVersionSummary {\n /** Version id (e.g. `\"1.20.1\"`). */\n readonly id: string;\n /** Release channel. */\n readonly type: MinecraftChannel;\n /** URL to the per-version manifest JSON. */\n readonly url: string;\n /** Manifest's last edit time (ISO-8601). */\n readonly time: string;\n /** Original release time (ISO-8601). */\n readonly releaseTime: string;\n /** SHA-1 of the per-version manifest (added in v2). */\n readonly sha1: string;\n /** Compliance level: 0 = legacy, 1 = secure-chat / safety features. */\n readonly complianceLevel: number;\n}\n\n/** Subset of the per-version manifest used by resolvers and consumers. */\nexport interface MinecraftVersionManifest {\n readonly id: string;\n readonly type: MinecraftChannel | string;\n readonly mainClass: string;\n /** Asset index reference. */\n readonly assetIndex: AssetIndexReference;\n /** Asset index id (also exposed for legacy callers). */\n readonly assets: string;\n readonly downloads: MinecraftDownloads;\n readonly libraries: readonly MinecraftLibrary[];\n /** Modern (1.13+) argument structure. Mutually exclusive with {@link minecraftArguments}. */\n readonly arguments?: MinecraftArguments;\n /** Legacy (≤1.12.2) argument string. Mutually exclusive with {@link arguments}. */\n readonly minecraftArguments?: string;\n readonly javaVersion?: MinecraftJavaVersion;\n readonly logging?: MinecraftLogging;\n readonly inheritsFrom?: string;\n readonly releaseTime?: string;\n readonly time?: string;\n readonly minimumLauncherVersion?: number;\n readonly complianceLevel?: number;\n}\n\n/** Reference to the asset-index JSON file. */\nexport interface AssetIndexReference {\n readonly id: string;\n readonly sha1: string;\n readonly size: number;\n readonly totalSize: number;\n readonly url: string;\n}\n\n/** Per-platform downloads block of the Minecraft per-version manifest. */\nexport interface MinecraftDownloads {\n readonly client: ArtifactDownload;\n readonly server?: ArtifactDownload;\n readonly client_mappings?: ArtifactDownload;\n readonly server_mappings?: ArtifactDownload;\n}\n\n/** A single hash-verified download. */\nexport interface ArtifactDownload {\n readonly sha1: string;\n readonly size: number;\n readonly url: string;\n}\n\n/** Library entry. Combines vanilla, modern-natives, and legacy-classifier shapes. */\nexport interface MinecraftLibrary {\n readonly name: string;\n readonly downloads?: MinecraftLibraryDownloads;\n readonly natives?: Readonly<Record<string, string>>;\n readonly extract?: { readonly exclude?: readonly string[] };\n readonly rules?: readonly LibraryRule[];\n /** Some Fabric/Forge libraries carry only a Maven base URL plus a coordinate. */\n readonly url?: string;\n}\n\n/** Library downloads block. */\nexport interface MinecraftLibraryDownloads {\n readonly artifact?: LibraryArtifact;\n readonly classifiers?: Readonly<Record<string, LibraryArtifact>>;\n}\n\n/** An individual library artifact (jar/zip). */\nexport interface LibraryArtifact extends ArtifactDownload {\n readonly path: string;\n}\n\n/** Rule entry used by libraries and modern arguments. */\nexport interface LibraryRule {\n readonly action: \"allow\" | \"disallow\";\n readonly os?: { readonly name?: string; readonly arch?: string; readonly version?: string };\n readonly features?: Readonly<Record<string, boolean>>;\n}\n\n/** Modern (1.13+) arguments structure. */\nexport interface MinecraftArguments {\n readonly game: readonly ArgumentEntry[];\n readonly jvm: readonly ArgumentEntry[];\n}\n\n/** A single argument entry: bare string or rule-gated value. */\nexport type ArgumentEntry =\n | string\n | { readonly rules: readonly LibraryRule[]; readonly value: string | readonly string[] };\n\n/** Required Java runtime descriptor from the version manifest. */\nexport interface MinecraftJavaVersion {\n /** Mojang java-runtime component name (e.g. `java-runtime-gamma`). */\n readonly component: string;\n readonly majorVersion: number;\n}\n\n/** Logging-config entry from the version manifest. */\nexport interface MinecraftLogging {\n readonly client?: {\n readonly argument: string;\n readonly file: ArtifactDownload & { readonly id: string };\n readonly type: string;\n };\n}\n\n/**\n * Fully resolved Minecraft version: summary + parsed manifest, ready to feed into\n * `kit.targets.create` or `kit.install.plan`.\n */\nexport interface ResolvedMinecraft {\n /** Version id (e.g. `\"1.20.1\"`). */\n readonly version: string;\n readonly channel: MinecraftChannel;\n readonly manifest: MinecraftVersionManifest;\n readonly summary: MinecraftVersionSummary;\n}\n\n/** Asset index document body. */\nexport interface AssetIndexDocument {\n readonly objects: Readonly<Record<string, AssetObject>>;\n readonly virtual?: boolean;\n readonly map_to_resources?: boolean;\n}\n\n/** A single asset object hash + size. */\nexport interface AssetObject {\n readonly hash: string;\n readonly size: number;\n}\n","import type { MetadataCache } from \"./cache\";\nimport type { HttpClient } from \"./http\";\nimport type { InstallAction } from \"./install\";\nimport type { Target } from \"./target\";\nimport type { VerificationResult } from \"./verify\";\n\n/** Coarse-grained repair phases used for `repair:phase-changed` events. */\nexport const RepairPhases = {\n PLANNING: \"planning\",\n REPAIRING_CLIENT_JAR: \"repairing-client-jar\",\n REPAIRING_LIBRARIES: \"repairing-libraries\",\n REPAIRING_ASSETS: \"repairing-assets\",\n REPAIRING_NATIVES: \"repairing-natives\",\n REPAIRING_RUNTIME: \"repairing-runtime\",\n REPAIRING_LOADER: \"repairing-loader\",\n COMPLETED: \"completed\",\n} as const;\n\n/** Repair phase literal. */\nexport type RepairPhase = (typeof RepairPhases)[keyof typeof RepairPhases];\n\n/**\n * A repair plan is, structurally, an install plan limited to actions needed to fix the\n * issues reported by a previous {@link VerificationResult}. The runner is the same.\n */\nexport interface RepairPlan {\n readonly targetId: string;\n readonly directory: string;\n readonly target: import(\"./target\").Target;\n readonly actions: readonly InstallAction[];\n readonly totalBytes: number;\n readonly totalActions: number;\n}\n\n/** Repair report — same shape as install report. */\nexport interface RepairReport {\n readonly targetId: string;\n readonly bytesDownloaded: number;\n readonly actionsCompleted: number;\n readonly durationMs: number;\n}\n\n/**\n * Inputs accepted by every aspect-specific `planXxxRepair` (`planMinecraftRepair`,\n * `planFabricRepair`, `planForgeRepair`, `planRuntimeRepair`). The per-aspect input types\n * are aliases over this shape.\n */\nexport interface AspectRepairInput {\n readonly target: Target;\n readonly from: VerificationResult | readonly VerificationResult[];\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n}\n","/**\n * Operating-system identifiers used by Mojang launcher metadata.\n *\n * Mojang manifests use `windows`, `osx`, and `linux` as canonical names. These differ\n * from Node's {@link NodeJS.Platform} values (`win32` / `darwin` / `linux`).\n */\nexport const OperatingSystems = {\n WINDOWS: \"windows\",\n OSX: \"osx\",\n LINUX: \"linux\",\n} as const;\n\n/** OS literal as used inside Mojang/Forge/Fabric JSON manifests. */\nexport type OperatingSystem = (typeof OperatingSystems)[keyof typeof OperatingSystems];\n\n/**\n * CPU architecture identifiers. Matches the values that appear in Mojang library `os.arch`\n * fields, after normalization from Node's {@link NodeJS.Architecture}.\n */\nexport const Architectures = {\n X86: \"x86\",\n X64: \"x64\",\n ARM64: \"arm64\",\n} as const;\n\n/** Architecture literal used in launcher metadata. */\nexport type Architecture = (typeof Architectures)[keyof typeof Architectures];\n\n/**\n * Identifies the host system for the launcher. All resolvers consume this object to\n * pick the right artifacts (libraries, natives, runtime).\n */\nexport interface RuntimeSystem {\n /** OS identifier (mojang naming). */\n readonly os: OperatingSystem;\n /** CPU architecture (mojang naming). */\n readonly arch: Architecture;\n /** OS version string from `os.release()`. Used to evaluate library `os.version` regex rules. */\n readonly osVersion: string;\n}\n","/**\n * All `${...}` tokens substituted into JVM and game arguments.\n *\n * This map drives both substitution at launch time and documentation generation.\n */\nexport const LAUNCH_PLACEHOLDERS = {\n \"${auth_player_name}\": \"Player display name.\",\n \"${version_name}\": \"Resolved Minecraft version id.\",\n \"${game_directory}\": \"Per-target directory.\",\n \"${assets_root}\": \"Assets root (`<directory>/assets`).\",\n \"${assets_index_name}\": \"Asset index id from the manifest.\",\n \"${auth_uuid}\": \"Player UUID (no dashes).\",\n \"${auth_access_token}\": \"Yggdrasil/MSA access token.\",\n \"${auth_session}\": \"Legacy session token (`token:<token>:<uuid>`).\",\n \"${clientid}\": \"MSA client id.\",\n \"${auth_xuid}\": \"Xbox user id.\",\n \"${user_type}\": \"`msa` | `mojang` | `legacy`.\",\n \"${user_properties}\": \"User properties JSON (often `{}`).\",\n \"${version_type}\": \"Channel string, e.g. `release`.\",\n \"${game_assets}\": \"Legacy virtual assets directory.\",\n \"${resolution_width}\": \"Window width (feature-gated).\",\n \"${resolution_height}\": \"Window height (feature-gated).\",\n \"${natives_directory}\": \"Extracted natives directory.\",\n \"${classpath}\": \"Joined classpath of libraries + version jar.\",\n \"${classpath_separator}\": \"OS-specific classpath separator (`:` / `;`).\",\n \"${library_directory}\": \"Per-target libraries directory.\",\n \"${launcher_name}\": \"Launcher brand string.\",\n \"${launcher_version}\": \"Launcher version string.\",\n \"${path}\": \"Path to the log4j config file (logging.client.argument only).\",\n} as const;\n\n/** Token literal type. */\nexport type LaunchPlaceholder = keyof typeof LAUNCH_PLACEHOLDERS;\n"]}
1
+ {"version":3,"sources":["../src/types/errors.ts","../src/core/errors.ts","../src/types/auth.ts","../src/auth/microsoft.ts","../src/core/json.ts","../src/types/logger.ts","../src/core/logger.ts","../src/auth/debug.ts","../src/auth/minecraft.ts","../src/auth/xbox.ts","../src/auth/index.ts","../src/constants/platform.ts","../src/core/system.ts","../src/constants/defaults.ts","../src/http/cache.ts","../src/http/client.ts","../src/constants/files.ts","../src/core/paths.ts","../src/types/install.ts","../src/types/loader.ts","../src/constants/api.ts","../src/http/metadata.ts","../src/install/assets.ts","../src/constants/maven.ts","../src/core/maven.ts","../src/core/rules.ts","../src/install/libraries.ts","../src/install/fabric-install.ts","../src/constants/limits.ts","../src/core/fs.ts","../src/core/archive.ts","../src/core/collections.ts","../src/core/abort.ts","../src/core/retry.ts","../src/types/events.ts","../src/http/download.ts","../src/install/forge-install.ts","../src/install/runtime.ts","../src/install/planner.ts","../node_modules/yocto-queue/index.js","../node_modules/p-limit/index.js","../src/core/hash.ts","../src/install/processor.ts","../src/install/runtime-extras.ts","../src/install/runner.ts","../src/install/runtime-install.ts","../src/constants/launch.ts","../src/launch/arguments.ts","../src/launch/jvm-compat.ts","../src/launch/placeholders.ts","../src/launch/args-composition.ts","../src/launch/classpath.ts","../src/core/uuid.ts","../src/launch/placeholder-values.ts","../src/core/manifest-merge.ts","../src/launch/version-resolution.ts","../src/launch/compose.ts","../src/launch/runner.ts","../src/launch/spawner.ts","../src/types/verify.ts","../src/verify/helpers.ts","../src/verify/fabric.ts","../src/verify/forge.ts","../src/verify/minecraft.ts","../src/verify/runtime.ts","../src/repair/helpers.ts","../src/repair/fabric.ts","../src/repair/forge.ts","../src/repair/minecraft.ts","../src/repair/runner.ts","../src/repair/runtime.ts","../src/repair/all.ts","../src/types/runtime.ts","../src/targets/index.ts","../src/update/runner.ts","../src/versions/fabric.ts","../src/core/xml.ts","../src/versions/forge.ts","../src/core/guards.ts","../src/versions/minecraft.ts","../src/constants/runtime.ts","../src/versions/runtime.ts","../src/kit.ts","../src/core/assert-never.ts","../src/install/progress-tracker.ts","../src/core/pause-controller.ts","../src/constants/placeholders.ts","../src/types/minecraft.ts","../src/types/repair.ts","../src/types/system.ts"],"names":["process","os","LRUCache","path","archDigit","fs","crypto","yauzl","pipeline","createWriteStream","Readable","AsyncResource","createReadStream","checkpoint","spawn","buffer","emit","Buffer"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Stable error code registry. `MinecraftKitError` carries one of these as `code`; consumers\n * can switch on it exhaustively via the derived {@link MinecraftKitErrorCode} union.\n *\n * Codes are stable across releases — adding new codes is non-breaking; removing or renaming\n * a code is a breaking change.\n */\nexport const MinecraftKitErrorCodes = {\n NETWORK_TIMEOUT: \"NETWORK_TIMEOUT\",\n NETWORK_HTTP_ERROR: \"NETWORK_HTTP_ERROR\",\n NETWORK_ABORTED: \"NETWORK_ABORTED\",\n INTEGRITY_HASH_MISMATCH: \"INTEGRITY_HASH_MISMATCH\",\n INTEGRITY_SIZE_MISMATCH: \"INTEGRITY_SIZE_MISMATCH\",\n MANIFEST_INVALID: \"MANIFEST_INVALID\",\n MANIFEST_NOT_FOUND: \"MANIFEST_NOT_FOUND\",\n METADATA_PARSE_ERROR: \"METADATA_PARSE_ERROR\",\n FILESYSTEM_PATH_TRAVERSAL: \"FILESYSTEM_PATH_TRAVERSAL\",\n FILESYSTEM_WRITE_ERROR: \"FILESYSTEM_WRITE_ERROR\",\n FILESYSTEM_READ_ERROR: \"FILESYSTEM_READ_ERROR\",\n ARCHIVE_INVALID: \"ARCHIVE_INVALID\",\n ARCHIVE_TOO_LARGE: \"ARCHIVE_TOO_LARGE\",\n ARCHIVE_ENTRY_REJECTED: \"ARCHIVE_ENTRY_REJECTED\",\n RUNTIME_NOT_FOUND: \"RUNTIME_NOT_FOUND\",\n RUNTIME_UNSUPPORTED_PLATFORM: \"RUNTIME_UNSUPPORTED_PLATFORM\",\n FORGE_PROCESSOR_FAILED: \"FORGE_PROCESSOR_FAILED\",\n FORGE_INSTALLER_INVALID: \"FORGE_INSTALLER_INVALID\",\n LAUNCH_JAVA_NOT_FOUND: \"LAUNCH_JAVA_NOT_FOUND\",\n LAUNCH_PROCESS_FAILED: \"LAUNCH_PROCESS_FAILED\",\n LAUNCH_ABORTED: \"LAUNCH_ABORTED\",\n VERIFICATION_FAILED: \"VERIFICATION_FAILED\",\n INVALID_INPUT: \"INVALID_INPUT\",\n NOT_IMPLEMENTED: \"NOT_IMPLEMENTED\",\n UNSUPPORTED_VERSION: \"UNSUPPORTED_VERSION\",\n LZMA_DECODE_ERROR: \"LZMA_DECODE_ERROR\",\n AUTH_DEVICE_CODE_EXPIRED: \"AUTH_DEVICE_CODE_EXPIRED\",\n AUTH_DEVICE_CODE_DECLINED: \"AUTH_DEVICE_CODE_DECLINED\",\n AUTH_DEVICE_CODE_FAILED: \"AUTH_DEVICE_CODE_FAILED\",\n AUTH_REFRESH_FAILED: \"AUTH_REFRESH_FAILED\",\n AUTH_XBOX_FAILED: \"AUTH_XBOX_FAILED\",\n AUTH_XSTS_FAILED: \"AUTH_XSTS_FAILED\",\n AUTH_MINECRAFT_FAILED: \"AUTH_MINECRAFT_FAILED\",\n AUTH_NO_GAME_OWNERSHIP: \"AUTH_NO_GAME_OWNERSHIP\",\n AUTH_MISSING_CLIENT_ID: \"AUTH_MISSING_CLIENT_ID\",\n AUTH_CANCELLED: \"AUTH_CANCELLED\",\n} as const;\n\n/** Union of all kit error codes. */\nexport type MinecraftKitErrorCode =\n (typeof MinecraftKitErrorCodes)[keyof typeof MinecraftKitErrorCodes];\n\n/** Structured context attached to errors. */\nexport type MinecraftKitErrorContext = {\n readonly url?: string;\n readonly filePath?: string;\n readonly expectedHash?: string;\n readonly actualHash?: string;\n readonly expectedSize?: number;\n readonly actualSize?: number;\n readonly httpStatus?: number;\n readonly exitCode?: number;\n readonly platform?: string;\n readonly version?: string;\n readonly [key: string]: unknown;\n};\n","import {\n type MinecraftKitErrorCode,\n MinecraftKitErrorCodes,\n type MinecraftKitErrorContext,\n} from \"../types/errors\";\n\nexport { MinecraftKitErrorCodes };\nexport type { MinecraftKitErrorCode };\n\n/**\n * The single error class thrown by every public API in `@loontail/minecraft-kit`.\n *\n * Use {@link isMinecraftKitError} or {@link isErrorCode} for type-narrowing in `catch` blocks.\n */\nexport class MinecraftKitError extends Error {\n override readonly name = \"MinecraftKitError\";\n\n /** Stable discriminator. */\n readonly code: MinecraftKitErrorCode;\n\n /** Structured context; safe to serialize. */\n readonly context: Readonly<MinecraftKitErrorContext>;\n\n constructor(\n code: MinecraftKitErrorCode,\n message: string,\n options: { cause?: unknown; context?: MinecraftKitErrorContext } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n Object.setPrototypeOf(this, new.target.prototype);\n this.code = code;\n this.context = Object.freeze({ ...(options.context ?? {}) });\n }\n\n /** JSON-friendly representation. */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n cause:\n this.cause instanceof Error\n ? { name: this.cause.name, message: this.cause.message }\n : this.cause,\n };\n }\n}\n\n/** True when `e` is an {@link MinecraftKitError}. */\nexport const isMinecraftKitError = (e: unknown): e is MinecraftKitError => {\n return e instanceof MinecraftKitError;\n};\n\n/** True when `e` is an {@link MinecraftKitError} carrying the given code. */\nexport const isErrorCode = <C extends MinecraftKitErrorCode>(\n e: unknown,\n code: C,\n): e is MinecraftKitError & { code: C } => {\n return isMinecraftKitError(e) && e.code === code;\n};\n","/** Authentication modes accepted by the launch composer. */\nexport const AuthModes = {\n /** Offline-mode play with a chosen username and synthetic UUID. */\n OFFLINE: \"offline\",\n /** Pre-authenticated session — caller provides the access token and identity. */\n ONLINE: \"online\",\n} as const;\n\n/** Auth mode literal. */\nexport type AuthMode = (typeof AuthModes)[keyof typeof AuthModes];\n\n/** Offline authentication. */\nexport type OfflineAuth = {\n readonly mode: typeof AuthModes.OFFLINE;\n readonly username: string;\n /** Optional explicit UUID. When omitted, a deterministic UUID is derived from the username. */\n readonly uuid?: string;\n};\n\n/** Online (token-based) authentication. */\nexport type OnlineAuth = {\n readonly mode: typeof AuthModes.ONLINE;\n readonly username: string;\n readonly uuid: string;\n readonly accessToken: string;\n readonly userType?: string;\n readonly clientId?: string;\n readonly xuid?: string;\n};\n\n/** Auth shape consumed by `kit.launch.compose`. */\nexport type LaunchAuth = OfflineAuth | OnlineAuth;\n\n/**\n * Device-code prompt presented to the user. The caller renders these to the user, who then\n * visits {@link verificationUri} in a browser and enters {@link userCode}.\n */\nexport type DeviceCodePrompt = {\n /** Short alphanumeric code the user types on the verification page. */\n readonly userCode: string;\n /** URI the user opens to complete sign-in (typically `https://microsoft.com/link`). */\n readonly verificationUri: string;\n /** Human-readable instruction string suggested by Microsoft. */\n readonly message: string;\n /** Seconds before the device/user code pair becomes invalid. */\n readonly expiresIn: number;\n /** Recommended seconds between polling requests. */\n readonly interval: number;\n};\n\n/** Opaque state returned by `start()` and consumed by `poll()`. */\nexport type DeviceCodeState = {\n readonly deviceCode: string;\n readonly userCode: string;\n readonly verificationUri: string;\n readonly message: string;\n readonly expiresIn: number;\n readonly interval: number;\n readonly clientId: string;\n /** Wall-clock ms timestamp after which polling should stop. */\n readonly expiresAt: number;\n};\n\n/**\n * Combined Microsoft + Minecraft session returned by `kit.auth.login` and `kit.auth.refresh`.\n *\n * The fields under {@link minecraft} are everything {@link OnlineAuth} needs. The fields under\n * {@link microsoft} are needed only by the launcher to refresh the session later — persist them\n * to durable storage (encrypted) alongside the user's profile.\n */\nexport type MojangSession = {\n readonly minecraft: {\n /** Player display name. */\n readonly username: string;\n /** Player UUID, dashed (e.g. `f81d4fae-7dec-11d0-a765-00a0c91e6bf6`). */\n readonly uuid: string;\n /** Bearer token for `api.minecraftservices.com` and the game itself. */\n readonly accessToken: string;\n /** Wall-clock ms timestamp when {@link accessToken} expires. */\n readonly expiresAt: number;\n /** Xbox User ID (XUID) as a numeric string. */\n readonly xuid: string;\n };\n readonly microsoft: {\n /** Microsoft refresh token; used to obtain a fresh session without re-prompting. */\n readonly refreshToken: string;\n /** Azure AD application id used to mint the session. */\n readonly clientId: string;\n };\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport type { DeviceCodePrompt, DeviceCodeState } from \"../types/auth\";\nimport type { HttpClient } from \"../types/http\";\n\nconst TENANT = \"consumers\";\nconst DEVICE_CODE_URL = `https://login.microsoftonline.com/${TENANT}/oauth2/v2.0/devicecode`;\nconst TOKEN_URL = `https://login.microsoftonline.com/${TENANT}/oauth2/v2.0/token`;\n\n/**\n * Scope required for Minecraft. `XboxLive.signin` unlocks the Xbox Live token exchange and\n * `offline_access` is what causes Microsoft to return a refresh token.\n */\nconst SCOPE = \"XboxLive.signin offline_access\";\n\n/**\n * Microsoft access + refresh tokens. Internal — callers receive the higher-level\n * {@link import(\"../types/auth\").MojangSession} instead.\n */\nexport type MicrosoftToken = {\n readonly accessToken: string;\n readonly refreshToken: string;\n readonly expiresIn: number;\n};\n\ntype DeviceCodeResponse = {\n readonly device_code: string;\n readonly user_code: string;\n readonly verification_uri: string;\n readonly message: string;\n readonly expires_in: number;\n readonly interval: number;\n};\n\ntype TokenSuccess = {\n readonly token_type: \"Bearer\";\n readonly scope: string;\n readonly expires_in: number;\n readonly access_token: string;\n readonly refresh_token?: string;\n};\n\ntype TokenError = {\n readonly error: string;\n readonly error_description?: string;\n};\n\n/** Start a device-code session against Microsoft's `/devicecode` endpoint. */\nexport const startDeviceCode = async (input: {\n readonly http: HttpClient;\n readonly clientId: string;\n readonly signal?: AbortSignal;\n}): Promise<{ readonly prompt: DeviceCodePrompt; readonly state: DeviceCodeState }> => {\n const body = new URLSearchParams({ client_id: input.clientId, scope: SCOPE });\n const response = await input.http.request(DEVICE_CODE_URL, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\", accept: \"application/json\" },\n body: body.toString(),\n // We need to read the body of 400/401 responses to surface Microsoft's actual\n // `error_description` rather than reporting \"HTTP 400\" — the most common cause is\n // an app registration that doesn't allow personal MSA accounts or hasn't enabled\n // public client flows.\n acceptNonOk: true,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (response.status < 200 || response.status >= 300) {\n const err = (await response.json().catch(() => ({}))) as TokenError;\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_DEVICE_CODE_FAILED,\n explainDeviceCodeError(err, input.clientId),\n {\n context: {\n httpStatus: response.status,\n microsoftError: err.error,\n clientId: input.clientId,\n },\n },\n );\n }\n const data = (await response.json()) as DeviceCodeResponse;\n const now = Date.now();\n const state: DeviceCodeState = {\n deviceCode: data.device_code,\n userCode: data.user_code,\n verificationUri: data.verification_uri,\n message: data.message,\n expiresIn: data.expires_in,\n interval: data.interval,\n clientId: input.clientId,\n expiresAt: now + data.expires_in * 1000,\n };\n const prompt: DeviceCodePrompt = {\n userCode: data.user_code,\n verificationUri: data.verification_uri,\n message: data.message,\n expiresIn: data.expires_in,\n interval: data.interval,\n };\n return { prompt, state };\n};\n\n/**\n * Poll Microsoft's `/token` endpoint until the user finishes signing in. The interval is\n * pulled from {@link DeviceCodeState} and increased on `slow_down` per RFC 8628.\n */\nexport const pollDeviceCode = async (input: {\n readonly http: HttpClient;\n readonly state: DeviceCodeState;\n readonly signal?: AbortSignal;\n /** Called once per polling tick — useful to surface \"still waiting\" feedback in a UI. */\n readonly onTick?: (info: { readonly nextDelayMs: number; readonly expiresAt: number }) => void;\n}): Promise<MicrosoftToken> => {\n let intervalSec = input.state.interval;\n while (true) {\n if (input.signal?.aborted) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_CANCELLED,\n \"Device-code polling aborted.\",\n {\n context: { reason: input.signal.reason },\n },\n );\n }\n if (Date.now() >= input.state.expiresAt) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_DEVICE_CODE_EXPIRED,\n \"Device code expired before the user signed in.\",\n );\n }\n const delayMs = intervalSec * 1000;\n input.onTick?.({ nextDelayMs: delayMs, expiresAt: input.state.expiresAt });\n await wait(delayMs, input.signal);\n const body = new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n client_id: input.state.clientId,\n device_code: input.state.deviceCode,\n });\n const response = await input.http.request(TOKEN_URL, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\", accept: \"application/json\" },\n body: body.toString(),\n acceptNonOk: true,\n });\n if (response.status >= 200 && response.status < 300) {\n const ok = (await response.json()) as TokenSuccess;\n if (!ok.refresh_token) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_DEVICE_CODE_FAILED,\n \"Microsoft did not return a refresh token. Make sure `offline_access` is in the requested scopes.\",\n );\n }\n return {\n accessToken: ok.access_token,\n refreshToken: ok.refresh_token,\n expiresIn: ok.expires_in,\n };\n }\n const err = (await response.json().catch(() => ({}))) as TokenError;\n switch (err.error) {\n case \"authorization_pending\":\n continue;\n case \"slow_down\":\n intervalSec += 5;\n continue;\n case \"authorization_declined\":\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_DEVICE_CODE_DECLINED,\n \"The user declined the sign-in request.\",\n );\n case \"expired_token\":\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_DEVICE_CODE_EXPIRED,\n \"Device code expired before the user signed in.\",\n );\n default:\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_DEVICE_CODE_FAILED,\n `Microsoft device-code exchange failed: ${err.error ?? \"unknown_error\"}${\n err.error_description ? ` — ${err.error_description}` : \"\"\n }`,\n { context: { httpStatus: response.status, microsoftError: err.error } },\n );\n }\n }\n};\n\n/**\n * Exchange a long-lived refresh token for a fresh Microsoft access token + (rotated)\n * refresh token. Mirrors the `refresh_token` grant from the OAuth 2.0 spec.\n */\nexport const refreshMicrosoftToken = async (input: {\n readonly http: HttpClient;\n readonly refreshToken: string;\n readonly clientId: string;\n readonly signal?: AbortSignal;\n}): Promise<MicrosoftToken> => {\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: input.clientId,\n refresh_token: input.refreshToken,\n scope: SCOPE,\n });\n const response = await input.http.request(TOKEN_URL, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\", accept: \"application/json\" },\n body: body.toString(),\n acceptNonOk: true,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (response.status < 200 || response.status >= 300) {\n const err = (await response.json().catch(() => ({}))) as TokenError;\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_REFRESH_FAILED,\n `Microsoft refused to refresh the token: ${err.error ?? \"unknown_error\"}${\n err.error_description ? ` — ${err.error_description}` : \"\"\n }`,\n { context: { httpStatus: response.status, microsoftError: err.error } },\n );\n }\n const ok = (await response.json()) as TokenSuccess;\n return {\n accessToken: ok.access_token,\n refreshToken: ok.refresh_token ?? input.refreshToken,\n expiresIn: ok.expires_in,\n };\n};\n\n/**\n * Translate Microsoft's `/devicecode` error into a sentence that points the operator at the\n * Azure setting they likely got wrong. The vanilla `error_description` from MS is often a\n * 200-character wall of text — readable, but not actionable.\n */\nconst explainDeviceCodeError = (err: TokenError, clientId: string): string => {\n const desc = err.error_description ?? \"\";\n const ms = desc ? ` — ${desc}` : \"\";\n // AADSTS sub-codes carry the actual root cause. Microsoft maps several distinct app-side\n // misconfigurations onto the same OAuth top-level `error` value (e.g. `unauthorized_client`\n // covers both \"public flows disabled\" and \"wrong supported account types\"). Detect the\n // sub-code first so we can give a precise hint.\n if (/AADSTS700016/i.test(desc) || /not found in the directory/i.test(desc)) {\n return `Microsoft cannot see app ${clientId} from the consumers tenant. Fix: Azure portal → your app → Authentication → \"Supported account types\" → choose \"Personal Microsoft accounts only\" or \"Multitenant + personal accounts\" → Save. Wait ~30s for propagation.${ms}`;\n }\n if (/AADSTS7000218/i.test(desc) || /must either be a confidential client/i.test(desc)) {\n return `Microsoft rejected the client_id (${clientId}): \"Allow public client flows\" is OFF. Fix: Azure portal → your app → Authentication → bottom of the page → toggle \"Allow public client flows\" to Yes → Save.${ms}`;\n }\n if (/AADSTS50059/i.test(desc) || /tenant identifier/i.test(desc)) {\n return `Microsoft Entra cannot route the request — the app's \"Supported account types\" excludes consumers. Fix: Azure portal → Authentication → set Supported account types to include personal MSA → Save.${ms}`;\n }\n switch (err.error) {\n case \"unauthorized_client\":\n return `Microsoft rejected the client_id (${clientId}). Likely cause: \"Supported account types\" excludes personal Microsoft accounts, OR \"Allow public client flows\" is disabled. Fix both in Azure portal → your app → Authentication.${ms}`;\n case \"invalid_client\":\n return `Microsoft does not recognise client_id ${clientId}. Make sure you pasted the Application (client) ID — not the Object ID or Tenant ID — and that the app exists.${ms}`;\n case \"invalid_request\":\n return `Microsoft rejected the device-code request as malformed.${ms}`;\n case \"invalid_scope\":\n return `Microsoft refused the requested scope (XboxLive.signin offline_access). Make sure the app is configured for Microsoft account sign-in.${ms}`;\n default:\n return `Microsoft device-code request failed: ${err.error ?? \"unknown_error\"}${ms}`;\n }\n};\n\nconst wait = (ms: number, signal?: AbortSignal): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(\n new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_CANCELLED,\n \"Device-code polling aborted.\",\n {\n context: { reason: signal.reason },\n },\n ),\n );\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(\n new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_CANCELLED,\n \"Device-code polling aborted.\",\n {\n context: { reason: signal?.reason },\n },\n ),\n );\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n};\n","import type { MinecraftKitErrorContext } from \"../types/errors\";\nimport type { MinecraftKitErrorCode } from \"../types/errors\";\nimport { MinecraftKitError } from \"./errors\";\n\n/**\n * `JSON.parse(text)` typed as `T`, wrapped so a parse failure becomes a\n * {@link MinecraftKitError} with the caller's `code`/`message`/`context`.\n *\n * Note: this is a parse-only helper — it does not validate the resulting shape. Pair with a\n * runtime check (or use {@link parseJsonAs} which accepts a guard) when the payload comes\n * from an untrusted source.\n */\nexport const parseJsonStrict = <T>(\n text: string,\n options: {\n readonly code: MinecraftKitErrorCode;\n readonly message: string;\n readonly context?: MinecraftKitErrorContext;\n },\n): T => {\n try {\n return JSON.parse(text) as T;\n } catch (cause) {\n throw new MinecraftKitError(options.code, options.message, {\n cause,\n ...(options.context !== undefined ? { context: options.context } : {}),\n });\n }\n};\n\n/**\n * Like {@link parseJsonStrict} but also runs `guard` against the parsed value. The runtime\n * validation step is the difference between \"the JSON parsed\" and \"the JSON matches what we\n * expect\" — important on responses pulled over the network.\n */\nexport const parseJsonAs = <T>(\n text: string,\n guard: (value: unknown) => value is T,\n options: {\n readonly code: MinecraftKitErrorCode;\n readonly message: string;\n readonly context?: MinecraftKitErrorContext;\n },\n): T => {\n const value = parseJsonStrict<unknown>(text, options);\n if (!guard(value)) {\n throw new MinecraftKitError(options.code, options.message, {\n ...(options.context !== undefined ? { context: options.context } : {}),\n });\n }\n return value;\n};\n\n/**\n * Parse JSON or return `undefined` on failure. Use when \"couldn't parse\" and \"doesn't apply\n * here\" should produce the same outcome (e.g. peeking at unverified files on disk).\n */\nexport const parseJsonOrUndefined = <T>(text: string): T | undefined => {\n try {\n return JSON.parse(text) as T;\n } catch {\n return undefined;\n }\n};\n","/** Log levels accepted by the pluggable logger. */\nexport const LogLevels = {\n DEBUG: \"debug\",\n INFO: \"info\",\n WARN: \"warn\",\n ERROR: \"error\",\n} as const;\n\n/** Log-level literal. */\nexport type LogLevel = (typeof LogLevels)[keyof typeof LogLevels];\n\n/** Pluggable logger. Default implementation is a silent logger; pass your own to surface logs. */\nexport type Logger = {\n log(level: LogLevel, message: string, fields?: Readonly<Record<string, unknown>>): void;\n};\n","import { LogLevels } from \"../types/logger\";\nimport type { LogLevel, Logger } from \"../types/logger\";\n\n/** Logger that drops every message. Default when no logger is supplied. */\nexport const silentLogger: Logger = {\n log() {\n // Intentionally empty.\n },\n};\n\n/** Logger that mirrors messages to `console.<level>` with structured fields. */\nexport const consoleLogger: Logger = {\n log(level, message, fields) {\n const target = pickConsole(level);\n if (fields !== undefined) {\n target(`[${level}] ${message}`, fields);\n } else {\n target(`[${level}] ${message}`);\n }\n },\n};\n\n/**\n * Wrap a {@link Logger} so every message is prefixed with `[scope]`. Mirrors the\n * `scopedLogger(scope)` convention used by the launcher: each module reaches for one named\n * logger at the top of the file (e.g. `const log = scopedLogger(input.logger, \"http\")`)\n * instead of threading the scope through every callsite.\n *\n * The merged `fields` argument lets a scope attach default context (e.g. a request id) without\n * the call site repeating it on every message.\n */\nexport const scopedLogger = (\n base: Logger,\n scope: string,\n baseFields?: Readonly<Record<string, unknown>>,\n): Logger => {\n if (base === silentLogger) return silentLogger;\n return {\n log(level, message, fields) {\n const merged =\n baseFields !== undefined || fields !== undefined ? { ...baseFields, ...fields } : undefined;\n if (merged !== undefined) {\n base.log(level, `[${scope}] ${message}`, merged);\n } else {\n base.log(level, `[${scope}] ${message}`);\n }\n },\n };\n};\n\nconst pickConsole = (level: LogLevel): ((...args: unknown[]) => void) => {\n if (level === LogLevels.ERROR) return console.error.bind(console);\n if (level === LogLevels.WARN) return console.warn.bind(console);\n if (level === LogLevels.INFO) return console.info.bind(console);\n return console.debug.bind(console);\n};\n","import process from \"node:process\";\nimport { consoleLogger, scopedLogger, silentLogger } from \"../core/logger\";\nimport type { Logger } from \"../types/logger\";\n\n/**\n * When set to a truthy value, the kit ships a stderr-bound `Logger` to the auth modules\n * even if the caller didn't supply one. Useful for one-off CLI debugging without wiring a\n * logger all the way through `MinecraftKit`.\n */\nexport const DEBUG_ENV_VAR = \"MINECRAFT_KIT_AUTH_DEBUG\";\n\n/**\n * Build the `auth` scope's logger. Caller-supplied logger wins; otherwise we honour\n * `MINECRAFT_KIT_AUTH_DEBUG=1` by routing through `consoleLogger`. Default is silent so\n * the auth flow stays quiet in production.\n */\nexport const buildAuthLogger = (base: Logger | undefined): Logger => {\n if (base !== undefined) return scopedLogger(base, \"auth\");\n if (process.env[DEBUG_ENV_VAR]) return scopedLogger(consoleLogger, \"auth\");\n return silentLogger;\n};\n\n/**\n * Legacy stderr writer kept for the existing internal auth helpers. New code threads a\n * `Logger` explicitly through `buildAuthLogger`.\n */\nexport const authDebug = (message: string): void => {\n if (process.env[DEBUG_ENV_VAR]) {\n process.stderr.write(`[auth] ${message}\\n`);\n }\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { parseJsonOrUndefined } from \"../core/json\";\nimport type { HttpClient } from \"../types/http\";\nimport { authDebug } from \"./debug\";\n\nconst MC_LOGIN_URL = \"https://api.minecraftservices.com/authentication/login_with_xbox\";\nconst MC_PROFILE_URL = \"https://api.minecraftservices.com/minecraft/profile\";\n\n/** Result of `login_with_xbox` — Minecraft bearer token + lifetime. */\nexport type MinecraftLoginResult = {\n readonly accessToken: string;\n readonly expiresIn: number;\n};\n\ntype LoginResponse = {\n readonly access_token: string;\n readonly expires_in: number;\n /** Claims JWT carrying the XUID (`xuid`) — opaque to us; we extract via `parseXuid`. */\n readonly username?: string;\n};\n\ntype ProfileResponse = {\n readonly id: string;\n readonly name: string;\n readonly errorMessage?: string;\n};\n\n/** Step 4 — trade the XSTS token for a Minecraft bearer token. */\nexport const loginWithXbox = async (input: {\n readonly http: HttpClient;\n readonly xstsToken: string;\n readonly userHash: string;\n readonly signal?: AbortSignal;\n}): Promise<MinecraftLoginResult> => {\n const body = JSON.stringify({\n identityToken: `XBL3.0 x=${input.userHash};${input.xstsToken}`,\n });\n authDebug(\n `login_with_xbox POST — userHashLen=${input.userHash.length}, xstsTokenLen=${input.xstsToken.length}`,\n );\n const response = await input.http.request(MC_LOGIN_URL, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n // Mojang sometimes rejects unknown user-agents on the auth endpoints. Override the\n // library default with a UA that matches what real Minecraft launchers send, so we\n // don't trip an \"anomalous client\" filter.\n \"user-agent\": \"Minecraft Launcher/2.0 (minecraft-kit)\",\n },\n body,\n acceptNonOk: true,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (response.status < 200 || response.status >= 300) {\n // Read the response body for diagnostic context. Mojang sometimes returns a JSON\n // payload like `{\"error\":\"FORBIDDEN\",\"errorMessage\":\"...\"}` — much more actionable than\n // a bare status code.\n const rawBody = await response.text().catch(() => \"\");\n const detail = rawBody.slice(0, 400);\n authDebug(`login_with_xbox failed status=${response.status} body=${detail}`);\n if (response.status === 403) {\n // Mojang ships a \"blessed apps\" allow-list. New Azure AD client_ids must be approved\n // through https://aka.ms/mce-reviewappid before login_with_xbox accepts them. Catch\n // that specific error message and surface a precise fix.\n if (/invalid app registration/i.test(detail)) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_MINECRAFT_FAILED,\n `Mojang has not approved this Azure AD application id for the Minecraft API. The OAuth + Xbox/XSTS exchange all succeeded, but api.minecraftservices.com only accepts client_ids that are on its allow-list. Apply at https://aka.ms/mce-reviewappid (Application ID, contact email, purpose) — approval typically takes a few days. Raw response: ${detail}`,\n { context: { httpStatus: 403, body: detail, reason: \"invalid_app_registration\" } },\n );\n }\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_NO_GAME_OWNERSHIP,\n `Mojang refused login_with_xbox (HTTP 403). The Xbox/Microsoft exchange succeeded, but api.minecraftservices.com declined to issue a Minecraft token. Most common causes: (1) you signed in to the browser with a DIFFERENT Microsoft account than the one owning Java Edition — re-check the email on https://www.minecraft.net/profile and make sure it matches what you typed at the device-code page; (2) this account never used Xbox services before — open https://www.xbox.com once with this account, then retry; (3) transient Mojang 5xx/403, just retry in 60s. Raw response: ${detail || \"<empty>\"}`,\n { context: { httpStatus: 403, body: detail } },\n );\n }\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_MINECRAFT_FAILED,\n `Minecraft sign-in failed with HTTP ${response.status}. Response: ${detail || \"<empty>\"}`,\n { context: { httpStatus: response.status, body: detail } },\n );\n }\n const parsed = (await response.json()) as LoginResponse;\n if (!parsed.access_token) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_MINECRAFT_FAILED,\n \"Minecraft sign-in returned no access token.\",\n );\n }\n return { accessToken: parsed.access_token, expiresIn: parsed.expires_in };\n};\n\n/** Step 5 — fetch the player profile (UUID + display name) using the Minecraft bearer token. */\nexport const fetchMinecraftProfile = async (input: {\n readonly http: HttpClient;\n readonly accessToken: string;\n readonly signal?: AbortSignal;\n}): Promise<{ readonly uuid: string; readonly username: string }> => {\n const response = await input.http.request(MC_PROFILE_URL, {\n headers: {\n authorization: `Bearer ${input.accessToken}`,\n accept: \"application/json\",\n \"user-agent\": \"Minecraft Launcher/2.0 (minecraft-kit)\",\n },\n acceptNonOk: true,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (response.status === 404) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_NO_GAME_OWNERSHIP,\n \"This Microsoft account does not own Minecraft: Java Edition.\",\n { context: { httpStatus: 404 } },\n );\n }\n if (response.status < 200 || response.status >= 300) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_MINECRAFT_FAILED,\n `Failed to load Minecraft profile (HTTP ${response.status}).`,\n { context: { httpStatus: response.status } },\n );\n }\n const parsed = (await response.json()) as ProfileResponse;\n if (parsed.errorMessage || !parsed.id || !parsed.name) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_MINECRAFT_FAILED,\n parsed.errorMessage ?? \"Minecraft profile response was malformed.\",\n );\n }\n return { uuid: dashUuid(parsed.id), username: parsed.name };\n};\n\n/**\n * Decode the XUID out of the JWT-shaped Minecraft access token. The token has three base64url\n * segments — we read the middle (payload) one and pluck `xuid`. Errors are non-fatal; we\n * return an empty string so the rest of the flow can still proceed.\n */\nexport const extractXuid = (accessToken: string): string => {\n const parts = accessToken.split(\".\");\n const payload = parts[1];\n if (typeof payload !== \"string\") return \"\";\n const json = Buffer.from(payload.replace(/-/g, \"+\").replace(/_/g, \"/\"), \"base64\").toString(\n \"utf8\",\n );\n const parsed = parseJsonOrUndefined<{ xuid?: unknown }>(json);\n return typeof parsed?.xuid === \"string\" ? parsed.xuid : \"\";\n};\n\n/** Convert a dashless UUID (Mojang format) into the dashed canonical form. */\nconst dashUuid = (raw: string): string => {\n if (raw.includes(\"-\")) return raw;\n if (raw.length !== 32) return raw;\n return `${raw.slice(0, 8)}-${raw.slice(8, 12)}-${raw.slice(12, 16)}-${raw.slice(\n 16,\n 20,\n )}-${raw.slice(20)}`;\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport type { HttpClient } from \"../types/http\";\nimport type { Logger } from \"../types/logger\";\n\nconst XBL_URL = \"https://user.auth.xboxlive.com/user/authenticate\";\nconst XSTS_URL = \"https://xsts.auth.xboxlive.com/xsts/authorize\";\n\n/**\n * Result of either XBL or XSTS authentication: the JWT plus the user hash that prefixes the\n * Minecraft `identityToken`.\n */\nexport type XboxToken = {\n readonly token: string;\n readonly userHash: string;\n};\n\ntype XboxResponse = {\n readonly Token: string;\n readonly DisplayClaims?: { readonly xui?: ReadonlyArray<{ readonly uhs?: string }> };\n};\n\ntype XstsErrorResponse = {\n readonly Identity?: string;\n readonly XErr?: number;\n readonly Message?: string;\n readonly Redirect?: string;\n};\n\n/**\n * Step 2 — exchange the Microsoft access token for an Xbox Live user token.\n */\nexport const authenticateXbl = async (input: {\n readonly http: HttpClient;\n readonly accessToken: string;\n readonly signal?: AbortSignal;\n readonly logger?: Logger;\n}): Promise<XboxToken> => {\n const body = JSON.stringify({\n Properties: {\n AuthMethod: \"RPS\",\n SiteName: \"user.auth.xboxlive.com\",\n RpsTicket: `d=${input.accessToken}`,\n },\n RelyingParty: \"http://auth.xboxlive.com\",\n TokenType: \"JWT\",\n });\n let response: Awaited<ReturnType<HttpClient[\"request\"]>>;\n try {\n response = await input.http.request(XBL_URL, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n } catch (cause) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_XBOX_FAILED,\n \"Xbox Live authentication failed.\",\n {\n cause,\n },\n );\n }\n const parsed = (await response.json()) as XboxResponse;\n const userHash = parsed.DisplayClaims?.xui?.[0]?.uhs;\n if (!parsed.Token || !userHash) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_XBOX_FAILED,\n \"Xbox Live authentication returned an incomplete response.\",\n );\n }\n input.logger?.log(\"debug\", `XBL ok — tokenLen=${parsed.Token.length}, userHash=${userHash}`);\n return { token: parsed.Token, userHash };\n};\n\n/**\n * Step 3 — exchange the XBL token for an XSTS token bound to `api.minecraftservices.com`.\n *\n * XSTS uses HTTP 401 + a `XErr` numeric code in the body to surface account-level problems\n * (no Xbox profile, country restriction, child account…). Those codes are mapped to a single\n * `AUTH_XSTS_FAILED` error with a human-friendly message — callers can branch on `xerr` in\n * the context if they need finer-grained handling.\n */\nexport const authenticateXsts = async (input: {\n readonly http: HttpClient;\n readonly xblToken: string;\n readonly signal?: AbortSignal;\n readonly logger?: Logger;\n}): Promise<XboxToken> => {\n const body = JSON.stringify({\n Properties: { SandboxId: \"RETAIL\", UserTokens: [input.xblToken] },\n RelyingParty: \"rp://api.minecraftservices.com/\",\n TokenType: \"JWT\",\n });\n const response = await input.http.request(XSTS_URL, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body,\n acceptNonOk: true,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (response.status === 401) {\n const err = (await response.json().catch(() => ({}))) as XstsErrorResponse;\n throw new MinecraftKitError(MinecraftKitErrorCodes.AUTH_XSTS_FAILED, explainXErr(err.XErr), {\n context: { xerr: err.XErr ?? null, message: err.Message ?? null },\n });\n }\n if (response.status < 200 || response.status >= 300) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_XSTS_FAILED,\n `XSTS authorization failed with HTTP ${response.status}.`,\n { context: { httpStatus: response.status } },\n );\n }\n const parsed = (await response.json()) as XboxResponse;\n const userHash = parsed.DisplayClaims?.xui?.[0]?.uhs;\n if (!parsed.Token || !userHash) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_XSTS_FAILED,\n \"XSTS authorization returned an incomplete response.\",\n );\n }\n input.logger?.log(\"debug\", `XSTS ok — tokenLen=${parsed.Token.length}, userHash=${userHash}`);\n return { token: parsed.Token, userHash };\n};\n\nconst explainXErr = (xerr: number | undefined): string => {\n switch (xerr) {\n case 2148916227:\n return \"This account has been banned from Xbox.\";\n case 2148916233:\n return \"This Microsoft account has no Xbox profile yet — sign in once at https://minecraft.net to create one.\";\n case 2148916235:\n return \"Xbox Live is not available in this account's country/region.\";\n case 2148916236:\n case 2148916237:\n return \"This account needs an adult to verify it. Sign in on Xbox to complete the prompt.\";\n case 2148916238:\n return \"This is a child account. Add it to a Microsoft family group with an adult to continue.\";\n default:\n return xerr ? `XSTS authorization failed (XErr ${xerr}).` : \"XSTS authorization failed.\";\n }\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { AuthModes, type DeviceCodePrompt, type DeviceCodeState } from \"../types/auth\";\nimport type { MojangSession, OnlineAuth } from \"../types/auth\";\nimport type { HttpClient } from \"../types/http\";\nimport {\n type MicrosoftToken,\n pollDeviceCode,\n refreshMicrosoftToken,\n startDeviceCode,\n} from \"./microsoft\";\nimport { extractXuid, fetchMinecraftProfile, loginWithXbox } from \"./minecraft\";\nimport { authenticateXbl, authenticateXsts } from \"./xbox\";\n\n/** Env var consulted when no explicit `clientId` is supplied. */\nexport const CLIENT_ID_ENV_VAR = \"MINECRAFT_KIT_MSA_CLIENT_ID\";\n\nexport { authDebug, buildAuthLogger, DEBUG_ENV_VAR } from \"./debug\";\n\n/** Options accepted by {@link MojangAuthApi.login}. */\nexport type LoginOptions = {\n /**\n * Azure AD application id. When omitted, the value of\n * `process.env.MINECRAFT_KIT_MSA_CLIENT_ID` is used. Throws `AUTH_MISSING_CLIENT_ID` if\n * neither is set — the library cannot ship a default client id.\n */\n readonly clientId?: string;\n /**\n * Called once with the URL + user code the user must enter in a browser. The promise\n * returned by `login` resolves only after the user finishes signing in (or rejects on\n * abort / decline / timeout).\n */\n readonly onPrompt: (prompt: DeviceCodePrompt) => void | Promise<void>;\n /** Called once per polling tick — useful for UI \"still waiting\" feedback. */\n readonly onPoll?: (info: { readonly nextDelayMs: number; readonly expiresAt: number }) => void;\n readonly signal?: AbortSignal;\n};\n\n/** Options accepted by {@link MojangAuthApi.refresh}. */\nexport type RefreshOptions = {\n /** As in {@link LoginOptions.clientId}. */\n readonly clientId?: string;\n readonly signal?: AbortSignal;\n};\n\n/** Options accepted by {@link MojangAuthApi.deviceCode.start}. */\nexport type StartDeviceCodeOptions = {\n readonly clientId?: string;\n readonly signal?: AbortSignal;\n};\n\n/** Options accepted by {@link MojangAuthApi.deviceCode.poll}. */\nexport type PollDeviceCodeOptions = {\n readonly signal?: AbortSignal;\n readonly onTick?: (info: { readonly nextDelayMs: number; readonly expiresAt: number }) => void;\n};\n\n/**\n * High-level Microsoft / Mojang auth surface attached to {@link import(\"../kit\").MinecraftKit}\n * as `kit.auth`. Implements the standard 5-step flow:\n *\n * 1. Microsoft OAuth2 device-code grant against the `consumers` tenant.\n * 2. Xbox Live RPS exchange.\n * 3. XSTS token bound to `rp://api.minecraftservices.com/`.\n * 4. `login_with_xbox` to get a Minecraft bearer token.\n * 5. `minecraft/profile` to resolve the player UUID + display name.\n *\n * Returns a {@link MojangSession} carrying everything launch composition needs plus the\n * Microsoft refresh token. The library does NOT persist tokens — that's the launcher's job.\n */\nexport class MojangAuthApi {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Run the full device-code flow end-to-end. The caller supplies an `onPrompt` callback to\n * render the URL + code to the user; this method polls until they finish.\n */\n async login(options: LoginOptions): Promise<MojangSession> {\n const clientId = resolveClientId(options.clientId);\n const { prompt, state } = await startDeviceCode({\n http: this.http,\n clientId,\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n });\n await options.onPrompt(prompt);\n const msToken = await pollDeviceCode({\n http: this.http,\n state,\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n ...(options.onPoll !== undefined ? { onTick: options.onPoll } : {}),\n });\n return this.completeMicrosoftToken(msToken, clientId, options.signal);\n }\n\n /** Refresh a previously obtained session. The Microsoft refresh token may be rotated. */\n async refresh(refreshToken: string, options: RefreshOptions = {}): Promise<MojangSession> {\n const clientId = resolveClientId(options.clientId);\n const msToken = await refreshMicrosoftToken({\n http: this.http,\n refreshToken,\n clientId,\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n });\n return this.completeMicrosoftToken(msToken, clientId, options.signal);\n }\n\n /**\n * Lower-level device-code surface — exposed so callers can decouple \"show prompt\" from\n * \"block on poll\" (e.g. a GUI that lets the user dismiss the modal). Most callers should\n * use {@link login} instead.\n */\n readonly deviceCode = {\n start: (\n options: StartDeviceCodeOptions = {},\n ): Promise<{\n readonly prompt: DeviceCodePrompt;\n readonly state: DeviceCodeState;\n }> => {\n const clientId = resolveClientId(options.clientId);\n return startDeviceCode({\n http: this.http,\n clientId,\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n });\n },\n poll: async (\n state: DeviceCodeState,\n options: PollDeviceCodeOptions = {},\n ): Promise<MojangSession> => {\n const msToken = await pollDeviceCode({\n http: this.http,\n state,\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n ...(options.onTick !== undefined ? { onTick: options.onTick } : {}),\n });\n return this.completeMicrosoftToken(msToken, state.clientId, options.signal);\n },\n };\n\n /** Steps 2 → 5: given a Microsoft access token, finish the flow. */\n private async completeMicrosoftToken(\n msToken: MicrosoftToken,\n clientId: string,\n signal: AbortSignal | undefined,\n ): Promise<MojangSession> {\n const signalOpt = signal !== undefined ? { signal } : {};\n const xbl = await authenticateXbl({\n http: this.http,\n accessToken: msToken.accessToken,\n ...signalOpt,\n });\n const xsts = await authenticateXsts({\n http: this.http,\n xblToken: xbl.token,\n ...signalOpt,\n });\n const mc = await loginWithXbox({\n http: this.http,\n xstsToken: xsts.token,\n userHash: xsts.userHash,\n ...signalOpt,\n });\n const profile = await fetchMinecraftProfile({\n http: this.http,\n accessToken: mc.accessToken,\n ...signalOpt,\n });\n\n return {\n minecraft: {\n username: profile.username,\n uuid: profile.uuid,\n accessToken: mc.accessToken,\n expiresAt: Date.now() + mc.expiresIn * 1000,\n xuid: extractXuid(mc.accessToken),\n },\n microsoft: {\n refreshToken: msToken.refreshToken,\n clientId,\n },\n };\n }\n}\n\n/**\n * Project a {@link MojangSession} into the {@link OnlineAuth} shape that `kit.launch.compose`\n * accepts.\n */\nexport const toOnlineAuth = (session: MojangSession): OnlineAuth => {\n return {\n mode: AuthModes.ONLINE,\n username: session.minecraft.username,\n uuid: session.minecraft.uuid,\n accessToken: session.minecraft.accessToken,\n userType: \"msa\",\n clientId: session.microsoft.clientId,\n xuid: session.minecraft.xuid,\n };\n};\n\nconst resolveClientId = (explicit: string | undefined): string => {\n if (typeof explicit === \"string\" && explicit.trim().length > 0) return explicit.trim();\n const fromEnv = process.env[CLIENT_ID_ENV_VAR];\n if (typeof fromEnv === \"string\" && fromEnv.trim().length > 0) return fromEnv.trim();\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.AUTH_MISSING_CLIENT_ID,\n `No Azure AD client id supplied. Pass \\`clientId\\` explicitly or set ${CLIENT_ID_ENV_VAR}. Register an Azure AD application in the 'Personal Microsoft accounts' audience with XboxLive.signin + offline_access scopes to obtain one.`,\n );\n};\n","import type { Architecture, OperatingSystem } from \"../types/system\";\n\n/** Mapping from Node's `process.platform` to Mojang OS names. */\nexport const NODE_PLATFORM_TO_MOJANG_OS = {\n win32: \"windows\",\n darwin: \"osx\",\n linux: \"linux\",\n} as const satisfies Partial<Record<NodeJS.Platform, OperatingSystem>>;\n\n/** Mapping from Node's `process.arch` to Mojang/Mojang-runtime arch tags. */\nexport const NODE_ARCH_TO_MOJANG_ARCH = {\n x64: \"x64\",\n ia32: \"x86\",\n arm64: \"arm64\",\n} as const satisfies Partial<Record<NodeJS.Architecture, Architecture>>;\n\n/** Mapping from {OperatingSystem, Architecture} to the runtime-index platform key. */\nexport const RUNTIME_PLATFORM_KEYS: Readonly<\n Record<OperatingSystem, Readonly<Record<Architecture, string>>>\n> = {\n windows: { x64: \"windows-x64\", x86: \"windows-x86\", arm64: \"windows-arm64\" },\n osx: { x64: \"mac-os\", arm64: \"mac-os-arm64\", x86: \"mac-os\" },\n linux: { x64: \"linux\", x86: \"linux-i386\", arm64: \"linux\" },\n};\n","import os from \"node:os\";\nimport { NODE_ARCH_TO_MOJANG_ARCH, NODE_PLATFORM_TO_MOJANG_OS } from \"../constants/platform\";\nimport type { Architecture, OperatingSystem, RuntimeSystem } from \"../types/system\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"./errors\";\n\n/** Inputs allowing the host system to be derived from current Node values or overrides. */\nexport type DetectSystemInput = {\n readonly platform?: NodeJS.Platform;\n readonly arch?: NodeJS.Architecture;\n readonly osVersion?: string;\n};\n\n/**\n * Resolve the current host system identifiers.\n *\n * @throws {@link MinecraftKitError} with code `RUNTIME_UNSUPPORTED_PLATFORM` when the\n * platform/arch combination is not understood.\n */\nexport const detectSystem = (input: DetectSystemInput = {}): RuntimeSystem => {\n const platform = input.platform ?? process.platform;\n const arch = input.arch ?? process.arch;\n const osVersion = input.osVersion ?? os.release();\n const mojangOs = (NODE_PLATFORM_TO_MOJANG_OS as Record<string, OperatingSystem | undefined>)[\n platform\n ];\n const mojangArch = (NODE_ARCH_TO_MOJANG_ARCH as Record<string, Architecture | undefined>)[arch];\n if (mojangOs === undefined || mojangArch === undefined) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.RUNTIME_UNSUPPORTED_PLATFORM,\n `Unsupported platform/arch combination: ${platform}/${arch}`,\n { context: { platform, arch: String(arch) } },\n );\n }\n return { os: mojangOs, arch: mojangArch, osVersion };\n};\n","/** HTTP request timeout for metadata calls, in milliseconds. */\nexport const HTTP_TIMEOUT_MS = 30_000;\n\n/** Maximum retry attempts for transient HTTP failures. */\nexport const HTTP_RETRY_MAX = 4;\n\n/** Base delay for exponential backoff, in milliseconds. */\nexport const HTTP_RETRY_BACKOFF_BASE_MS = 500;\n\n/** Maximum delay for exponential backoff, in milliseconds. */\nexport const HTTP_RETRY_BACKOFF_CAP_MS = 30_000;\n\n/**\n * Default per-host concurrency for downloads. The runner uses a worker-pool: when one file\n * finishes, the next file in the queue starts immediately. There is no batch barrier.\n */\nexport const DOWNLOAD_CONCURRENCY = 32;\n\n/** TTL for in-memory metadata cache entries, in milliseconds. */\nexport const CACHE_TTL_MS = 5 * 60_000;\n\n/** Maximum number of entries kept in the metadata cache. */\nexport const CACHE_MAX_ENTRIES = 256;\n\n/** User-agent value sent on every HTTP request. */\nexport const USER_AGENT = \"minecraft-kit/0.1\";\n\n/** Default launcher brand sent through `${launcher_name}`. */\nexport const DEFAULT_LAUNCHER_NAME = \"minecraft-kit\";\n\n/** Default launcher version sent through `${launcher_version}`. */\nexport const DEFAULT_LAUNCHER_VERSION = \"0.1.0\";\n\n/** Default min heap size in megabytes. */\nexport const DEFAULT_MIN_MB = 1024;\n\n/** Default max heap size in megabytes. */\nexport const DEFAULT_MAX_MB = 4096;\n\n/** Time after a SIGTERM before escalating to SIGKILL when aborting a launch. */\nexport const DEFAULT_KILL_GRACE_MS = 5_000;\n\n/** Throttle interval for emitting download:progress events (in milliseconds). */\nexport const PROGRESS_EVENT_INTERVAL_MS = 100;\n\n/** Maximum number of stderr lines retained from a Forge processor for diagnostics. */\nexport const MAX_PROCESSOR_STDERR_LINES = 20;\n\n/**\n * Maximum bytes per line emitted by {@link ChildProcessSpawner}. Lines longer than this\n * are split: a Minecraft crash that prints megabytes of unbroken text should not exhaust\n * memory inside the launcher.\n */\nexport const SPAWNER_MAX_LINE_BYTES = 64 * 1024;\n","import { LRUCache } from \"lru-cache\";\nimport { CACHE_MAX_ENTRIES, CACHE_TTL_MS } from \"../constants/defaults\";\nimport type { MetadataCache } from \"../types/cache\";\n\n/** Inputs to {@link createMemoryCache}. */\nexport type MemoryCacheOptions = {\n readonly maxEntries?: number;\n readonly ttlMs?: number;\n};\n\n/** In-memory metadata cache backed by `lru-cache`. */\nexport const createMemoryCache = (options: MemoryCacheOptions = {}): MetadataCache => {\n const cache = new LRUCache<string, object>({\n max: options.maxEntries ?? CACHE_MAX_ENTRIES,\n ttl: options.ttlMs ?? CACHE_TTL_MS,\n });\n return {\n get<T>(key: string): T | undefined {\n const wrapped = cache.get(key) as { value: T } | undefined;\n return wrapped === undefined ? undefined : wrapped.value;\n },\n set<T>(key: string, value: T, ttlMs?: number): void {\n const wrapped = { value };\n if (ttlMs === undefined) {\n cache.set(key, wrapped);\n } else {\n cache.set(key, wrapped, { ttl: ttlMs });\n }\n },\n delete(key: string): void {\n cache.delete(key);\n },\n clear(): void {\n cache.clear();\n },\n };\n};\n","import { HTTP_TIMEOUT_MS, USER_AGENT } from \"../constants/defaults\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport type { HttpClient, HttpHeaders, HttpRequestOptions, HttpResponse } from \"../types/http\";\n\n/** Sentinel used as the abort reason when our internal timer fires. */\nconst TIMEOUT_REASON = Symbol(\"http-timeout\");\n\n/**\n * Default {@link HttpClient} implementation backed by Node's built-in `fetch` (undici under\n * the hood). Maps fetch errors to {@link MinecraftKitError}.\n */\nexport class FetchHttpClient implements HttpClient {\n async request(url: string, options: HttpRequestOptions = {}): Promise<HttpResponse> {\n const controller = new AbortController();\n const timeoutMs = options.timeoutMs ?? HTTP_TIMEOUT_MS;\n const onParentAbort = (): void => controller.abort(options.signal?.reason);\n if (options.signal) {\n if (options.signal.aborted) {\n controller.abort(options.signal.reason);\n } else {\n options.signal.addEventListener(\"abort\", onParentAbort, { once: true });\n }\n }\n const timer = setTimeout(() => controller.abort(TIMEOUT_REASON), timeoutMs);\n let response: Response;\n const method = options.method ?? \"GET\";\n try {\n const init: {\n method: string;\n headers: Record<string, string>;\n signal: AbortSignal;\n redirect: \"follow\";\n body?: string | Uint8Array;\n } = {\n method,\n headers: { \"user-agent\": USER_AGENT, ...(options.headers ?? {}) },\n signal: controller.signal,\n redirect: \"follow\",\n };\n if (method !== \"GET\" && options.body !== undefined) {\n init.body = options.body;\n }\n response = await fetch(url, init);\n } catch (cause) {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onParentAbort);\n if (controller.signal.reason === TIMEOUT_REASON) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.NETWORK_TIMEOUT,\n `Request timed out: ${url}`,\n {\n cause,\n context: { url, timeoutMs },\n },\n );\n }\n if (options.signal?.aborted) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.NETWORK_ABORTED,\n `Request aborted: ${url}`,\n {\n cause,\n context: { url },\n },\n );\n }\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.NETWORK_HTTP_ERROR,\n `Network request failed: ${url}`,\n {\n cause,\n context: { url },\n },\n );\n }\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onParentAbort);\n if (!response.ok && options.acceptNonOk !== true) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.NETWORK_HTTP_ERROR,\n `HTTP ${response.status} for ${url}`,\n {\n context: { url, httpStatus: response.status },\n },\n );\n }\n return new FetchHttpResponse(response, url);\n }\n}\n\nclass FetchHttpResponse implements HttpResponse {\n readonly status: number;\n readonly headers: HttpHeaders;\n readonly url: string;\n\n constructor(\n private readonly response: Response,\n url: string,\n ) {\n this.status = response.status;\n this.url = url;\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n this.headers = headers;\n }\n\n async text(): Promise<string> {\n return this.response.text();\n }\n\n async json<T = unknown>(): Promise<T> {\n return (await this.response.json()) as T;\n }\n\n async bytes(): Promise<Uint8Array> {\n const buf = await this.response.arrayBuffer();\n return new Uint8Array(buf);\n }\n\n async *stream(): AsyncIterable<Uint8Array> {\n const body = this.response.body;\n if (!body) {\n const buf = await this.bytes();\n yield buf;\n return;\n }\n const reader = body.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) return;\n if (value) yield value;\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","/**\n * Relative-path segments used to build per-target directory layouts.\n *\n * These are SEGMENTS — never use them as absolute paths. Compose with `path.join` at call sites.\n */\nexport const VERSIONS_DIR = \"versions\";\nexport const LIBRARIES_DIR = \"libraries\";\nexport const ASSETS_DIR = \"assets\";\nexport const ASSETS_OBJECTS_DIR = \"assets/objects\";\nexport const ASSETS_INDEXES_DIR = \"assets/indexes\";\nexport const ASSETS_VIRTUAL_DIR = \"assets/virtual\";\nexport const ASSETS_LEGACY_DIR = \"assets/virtual/legacy\";\nexport const ASSETS_RESOURCES_DIR = \"resources\";\nexport const ASSETS_LOG_CONFIGS_DIR = \"assets/log_configs\";\nexport const RUNTIMES_DIR = \"runtime\";\nexport const NATIVES_DIR_NAME = \"natives\";\nexport const FORGE_INSTALLERS_DIR = \"forge-installers\";\n\n/** Java executable filename per OS (relative to the runtime root). */\nexport const JAVA_EXECUTABLE = {\n windows: \"bin/javaw.exe\",\n windowsConsole: \"bin/java.exe\",\n linux: \"bin/java\",\n /** Note: macOS uses an extra `jre.bundle/Contents/Home/` prefix above this. */\n osx: \"bin/java\",\n} as const;\n\n/** macOS runtime layout adds this prefix above {@link JAVA_EXECUTABLE.osx}. */\nexport const MAC_RUNTIME_PREFIX = \"jre.bundle/Contents/Home\";\n","import path from \"node:path\";\nimport {\n ASSETS_INDEXES_DIR,\n ASSETS_LEGACY_DIR,\n ASSETS_LOG_CONFIGS_DIR,\n ASSETS_OBJECTS_DIR,\n ASSETS_RESOURCES_DIR,\n ASSETS_VIRTUAL_DIR,\n FORGE_INSTALLERS_DIR,\n JAVA_EXECUTABLE,\n LIBRARIES_DIR,\n MAC_RUNTIME_PREFIX,\n NATIVES_DIR_NAME,\n RUNTIMES_DIR,\n VERSIONS_DIR,\n} from \"../constants/files\";\nimport type { OperatingSystem } from \"../types/system\";\n\n/** Helpers for the per-target directory layout. */\nexport const targetPaths = {\n versionsDir: (root: string): string => path.join(root, VERSIONS_DIR),\n versionDir: (root: string, versionId: string): string => path.join(root, VERSIONS_DIR, versionId),\n versionJar: (root: string, versionId: string): string =>\n path.join(root, VERSIONS_DIR, versionId, `${versionId}.jar`),\n versionJson: (root: string, versionId: string): string =>\n path.join(root, VERSIONS_DIR, versionId, `${versionId}.json`),\n librariesDir: (root: string): string => path.join(root, LIBRARIES_DIR),\n libraryFile: (root: string, libraryPath: string): string =>\n path.join(root, LIBRARIES_DIR, libraryPath),\n assetIndex: (root: string, indexId: string): string =>\n path.join(root, ASSETS_INDEXES_DIR, `${indexId}.json`),\n assetObject: (root: string, hash: string): string =>\n path.join(root, ASSETS_OBJECTS_DIR, hash.slice(0, 2), hash),\n assetVirtual: (root: string, virtualPath: string): string =>\n path.join(root, ASSETS_VIRTUAL_DIR, virtualPath),\n assetLegacy: (root: string, virtualPath: string): string =>\n path.join(root, ASSETS_LEGACY_DIR, virtualPath),\n assetResource: (root: string, virtualPath: string): string =>\n path.join(root, ASSETS_RESOURCES_DIR, virtualPath),\n loggingConfig: (root: string, id: string): string => path.join(root, ASSETS_LOG_CONFIGS_DIR, id),\n nativesDir: (root: string, versionId: string): string =>\n path.join(root, VERSIONS_DIR, versionId, NATIVES_DIR_NAME),\n /**\n * Path to a runtime component's root directory. Honours `installRoot` (custom global\n * runtime location) when present; otherwise falls back to `<directory>/runtime/<component>`.\n */\n runtimeRoot: (directory: string, component: string, installRoot?: string): string =>\n installRoot !== undefined\n ? path.join(installRoot, component)\n : path.join(directory, RUNTIMES_DIR, component),\n runtimeJavaExecutable: (\n directory: string,\n component: string,\n os: OperatingSystem,\n installRoot?: string,\n ): string => {\n const runtime = targetPaths.runtimeRoot(directory, component, installRoot);\n if (os === \"windows\") return path.join(runtime, JAVA_EXECUTABLE.windows);\n if (os === \"osx\") return path.join(runtime, MAC_RUNTIME_PREFIX, JAVA_EXECUTABLE.osx);\n return path.join(runtime, JAVA_EXECUTABLE.linux);\n },\n forgeInstaller: (root: string, mavenVersion: string): string =>\n path.join(root, FORGE_INSTALLERS_DIR, `forge-${mavenVersion}-installer.jar`),\n} as const;\n","/**\n * Coarse-grained install phases. Used in `install:phase-changed` events so consumers can\n * render a progress bar with named steps.\n */\nexport const InstallPhases = {\n PLANNING: \"planning\",\n DOWNLOADING_VERSION_MANIFEST: \"downloading-version-manifest\",\n DOWNLOADING_CLIENT_JAR: \"downloading-client-jar\",\n DOWNLOADING_LIBRARIES: \"downloading-libraries\",\n DOWNLOADING_ASSET_INDEX: \"downloading-asset-index\",\n DOWNLOADING_ASSETS: \"downloading-assets\",\n EXTRACTING_NATIVES: \"extracting-natives\",\n INSTALLING_RUNTIME: \"installing-runtime\",\n INSTALLING_FABRIC: \"installing-fabric\",\n INSTALLING_FORGE: \"installing-forge\",\n RUNNING_FORGE_PROCESSORS: \"running-forge-processors\",\n WRITING_FILES: \"writing-files\",\n COMPLETED: \"completed\",\n} as const;\n\n/** Install phase literal. */\nexport type InstallPhase = (typeof InstallPhases)[keyof typeof InstallPhases];\n\n/** Action kinds inside an {@link InstallPlan}. */\nexport const InstallActionKinds = {\n DOWNLOAD_FILE: \"download-file\",\n EXTRACT_NATIVE: \"extract-native\",\n RUN_FORGE_PROCESSOR: \"run-forge-processor\",\n WRITE_VERSION_JSON: \"write-version-json\",\n WRITE_LOGGING_CONFIG: \"write-logging-config\",\n} as const;\n\n/** Discriminator for an install action. */\nexport type InstallActionKind = (typeof InstallActionKinds)[keyof typeof InstallActionKinds];\n\n/**\n * Categorisation tag on every {@link DownloadAction}. Drives the install-phase mapping\n * and lets consumers filter the plan to a subset (e.g. \"runtime only\").\n */\nexport const DownloadCategories = {\n CLIENT_JAR: \"client-jar\",\n LIBRARY: \"library\",\n ASSET_INDEX: \"asset-index\",\n ASSET: \"asset\",\n LOGGING_CONFIG: \"logging-config\",\n FABRIC_LIBRARY: \"fabric-library\",\n FORGE_LIBRARY: \"forge-library\",\n RUNTIME_FILE: \"runtime-file\",\n FORGE_INSTALLER: \"forge-installer\",\n} as const;\n\n/** Download category literal — drives `runInstall` phase boundaries. */\nexport type DownloadCategory = (typeof DownloadCategories)[keyof typeof DownloadCategories];\n\n/** A single download step. */\nexport type DownloadAction = {\n readonly kind: typeof InstallActionKinds.DOWNLOAD_FILE;\n readonly url: string;\n readonly target: string;\n readonly expectedSha1?: string;\n readonly expectedSize?: number;\n readonly category: DownloadCategory;\n};\n\n/** A native extraction step. Source jar must already exist on disk. */\nexport type ExtractNativeAction = {\n readonly kind: typeof InstallActionKinds.EXTRACT_NATIVE;\n readonly source: string;\n readonly destination: string;\n readonly exclude: readonly string[];\n};\n\n/**\n * A Forge processor invocation. `Main-Class` is intentionally NOT carried here — the\n * runner reads it from `classpath[0]`'s manifest at execution time, because the JAR is\n * not guaranteed to exist on disk during planning (newer Forge versions ship some\n * processor JARs as regular Maven libraries instead of bundling them in the installer).\n */\nexport type RunForgeProcessorAction = {\n readonly kind: typeof InstallActionKinds.RUN_FORGE_PROCESSOR;\n readonly index: number;\n /** First entry is the processor JAR; remaining entries are its declared classpath. */\n readonly classpath: readonly string[];\n readonly args: readonly string[];\n readonly outputs: Readonly<Record<string, string>>;\n};\n\n/** Write a version JSON to disk (Fabric / Forge). */\nexport type WriteVersionJsonAction = {\n readonly kind: typeof InstallActionKinds.WRITE_VERSION_JSON;\n readonly path: string;\n readonly content: string;\n};\n\n/** Write a logging config (log4j XML) to disk. */\nexport type WriteLoggingConfigAction = {\n readonly kind: typeof InstallActionKinds.WRITE_LOGGING_CONFIG;\n readonly path: string;\n readonly content: string;\n};\n\n/** Discriminated union of install actions. */\nexport type InstallAction =\n | DownloadAction\n | ExtractNativeAction\n | RunForgeProcessorAction\n | WriteVersionJsonAction\n | WriteLoggingConfigAction;\n\n/**\n * A \"runtime-only\" install plan target. Used by `planStandaloneRuntimeInstall` to plan a\n * JRE-only install without a Minecraft version/loader pinned to the plan.\n */\nexport type RuntimeOnlyInstallTarget = {\n readonly id: string;\n readonly directory: string;\n readonly runtime: import(\"./runtime\").ResolvedRuntime;\n readonly minecraft?: undefined;\n readonly loader?: undefined;\n};\n\n/**\n * Shape of `InstallPlan.target`. Either a fully-resolved {@link import(\"./target\").Target} or a\n * runtime-only stand-in. The install runner only reads `target.minecraft`/`target.loader` when\n * the plan actually contains those steps, so runtime-only plans are safe.\n */\nexport type InstallPlanTarget = import(\"./target\").Target | RuntimeOnlyInstallTarget;\n\n/**\n * Pre-computed install plan: a flat ordered list of actions plus computed totals.\n *\n * The runner consumes this; nothing is downloaded or written during planning. The plan\n * carries a reference to the resolved target so the runner does not need a second target\n * argument.\n */\nexport type InstallPlan = {\n readonly targetId: string;\n readonly directory: string;\n readonly target: InstallPlanTarget;\n readonly actions: readonly InstallAction[];\n readonly totalBytes: number;\n readonly totalActions: number;\n};\n\n/** Outcome summary returned by `install.run`. */\nexport type InstallReport = {\n readonly targetId: string;\n readonly bytesDownloaded: number;\n readonly actionsCompleted: number;\n readonly actionsSkipped: number;\n readonly durationMs: number;\n};\n","import type { ResolvedFabricLoader } from \"./fabric\";\nimport type { ResolvedForgeLoader } from \"./forge\";\nimport type { ResolvedVanillaLoader } from \"./vanilla\";\n\n/**\n * Discriminator literal identifying which mod loader is active for a target.\n *\n * Use the {@link Loaders} const object instead of bare strings. `loader.type === Loaders.FABRIC`\n * is preferred over `loader.type === \"fabric\"`.\n */\nexport const Loaders = {\n /** Plain vanilla Minecraft, no mod loader. */\n VANILLA: \"vanilla\",\n /** Fabric mod loader. */\n FABRIC: \"fabric\",\n /** Modern (1.13+) Forge mod loader. */\n FORGE: \"forge\",\n} as const;\n\n/** Loader-kind literal (used as discriminator on loader objects). */\nexport type LoaderKind = (typeof Loaders)[keyof typeof Loaders];\n\n/**\n * A fully resolved loader pinned to a specific Minecraft version. Use the `type` field to\n * narrow to the concrete shape.\n */\nexport type Loader = ResolvedVanillaLoader | ResolvedFabricLoader | ResolvedForgeLoader;\n\n/**\n * Resolution preference used when a user wants the latest, recommended, or a specific version.\n * Preferences are inputs to resolvers; resolved targets always carry concrete versions.\n */\nexport const VersionPreference = {\n LATEST: \"latest\",\n RECOMMENDED: \"recommended\",\n} as const;\n\n/** Resolution-preference literal. */\nexport type VersionPreferenceKind = (typeof VersionPreference)[keyof typeof VersionPreference];\n","/**\n * Endpoint builders for every external HTTP request the library makes. Code MUST go through\n * these — never hard-code URLs at call sites.\n */\n\nconst PISTON_META = \"https://piston-meta.mojang.com\";\nconst RESOURCES = \"https://resources.download.minecraft.net\";\nconst FABRIC_META = \"https://meta.fabricmc.net\";\nconst FORGE_MAVEN = \"https://maven.minecraftforge.net\";\nconst FORGE_FILES = \"https://files.minecraftforge.net\";\n\n/** Mojang Java-runtime metadata digest, embedded in the runtime index URL path. */\nconst RUNTIME_INDEX_DIGEST = \"2ec0cc96c44e5a76b9c8b7c39df7210883d12871\";\n\n/** Endpoint builders. */\nexport const ApiEndpoints = {\n mojang: {\n /** Top-level Minecraft version manifest (v2). */\n versionManifest: (): string => `${PISTON_META}/mc/game/version_manifest_v2.json`,\n /** Mojang Java-runtime index. */\n runtimeIndex: (): string =>\n `${PISTON_META}/v1/products/java-runtime/${RUNTIME_INDEX_DIGEST}/all.json`,\n },\n resources: {\n /** Hash-addressed Minecraft asset object. */\n asset: (hash: string): string => `${RESOURCES}/${hash.slice(0, 2)}/${hash}`,\n },\n fabric: {\n gameVersions: (): string => `${FABRIC_META}/v2/versions/game`,\n loaderVersions: (): string => `${FABRIC_META}/v2/versions/loader`,\n loaderForGame: (minecraftVersion: string): string =>\n `${FABRIC_META}/v2/versions/loader/${encodeURIComponent(minecraftVersion)}`,\n profile: (minecraftVersion: string, loaderVersion: string): string =>\n `${FABRIC_META}/v2/versions/loader/${encodeURIComponent(minecraftVersion)}/${encodeURIComponent(loaderVersion)}/profile/json`,\n },\n forge: {\n /** Forge Maven listing of all builds across all MC versions. */\n mavenMetadata: (): string => `${FORGE_MAVEN}/net/minecraftforge/forge/maven-metadata.xml`,\n /** Slim \"recommended\" / \"latest\" promotion mapping. */\n promotions: (): string => `${FORGE_FILES}/net/minecraftforge/forge/promotions_slim.json`,\n /** URL of the modern installer JAR for a Maven version (e.g. `1.20.1-47.2.0`). */\n installer: (mavenVersion: string): string => {\n const filename = `forge-${mavenVersion}-installer.jar`;\n return `${FORGE_MAVEN}/net/minecraftforge/forge/${mavenVersion}/${filename}`;\n },\n },\n} as const;\n\n/** Surface type useful for DI. */\nexport type ApiEndpointsShape = typeof ApiEndpoints;\n","import { CACHE_TTL_MS } from \"../constants/defaults\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { HttpClient } from \"../types/http\";\n\n/** Inputs to {@link fetchJson}. */\nexport type FetchJsonInput = {\n readonly url: string;\n readonly cacheKey?: string;\n readonly ttlMs?: number;\n readonly signal?: AbortSignal;\n};\n\n/**\n * GET a URL, parse the body as JSON, and cache the parsed value in {@link MetadataCache} with\n * the given TTL.\n *\n * Cache key defaults to the URL.\n */\nexport const fetchJson = async <T>(\n http: HttpClient,\n cache: MetadataCache,\n input: FetchJsonInput,\n): Promise<T> => {\n const key = input.cacheKey ?? `json:${input.url}`;\n const cached = cache.get<T>(key);\n if (cached !== undefined) {\n return cached;\n }\n const requestOptions: { signal?: AbortSignal } = {};\n if (input.signal !== undefined) requestOptions.signal = input.signal;\n const response = await http.request(input.url, requestOptions);\n const value = await response.json<T>();\n cache.set(key, value, input.ttlMs ?? CACHE_TTL_MS);\n return value;\n};\n\n/** GET a URL and return raw text, with caching. */\nexport const fetchText = async (\n http: HttpClient,\n cache: MetadataCache,\n input: FetchJsonInput,\n): Promise<string> => {\n const key = input.cacheKey ?? `text:${input.url}`;\n const cached = cache.get<string>(key);\n if (cached !== undefined) {\n return cached;\n }\n const requestOptions: { signal?: AbortSignal } = {};\n if (input.signal !== undefined) requestOptions.signal = input.signal;\n const response = await http.request(input.url, requestOptions);\n const text = await response.text();\n cache.set(key, text, input.ttlMs ?? CACHE_TTL_MS);\n return text;\n};\n","import { ApiEndpoints } from \"../constants/api\";\nimport { targetPaths } from \"../core/paths\";\nimport { fetchJson } from \"../http/metadata\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { HttpClient } from \"../types/http\";\nimport { type DownloadAction, DownloadCategories, InstallActionKinds } from \"../types/install\";\nimport type { AssetIndexDocument, AssetIndexReference } from \"../types/minecraft\";\n\n/**\n * Plan asset downloads: fetch the asset index and emit a download action per object plus the\n * index file itself.\n */\nexport const planAssetDownloads = async (input: {\n readonly directory: string;\n readonly assetIndex: AssetIndexReference;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n}): Promise<{\n readonly actions: readonly DownloadAction[];\n readonly indexDocument: AssetIndexDocument;\n}> => {\n const indexUrl = input.assetIndex.url;\n const indexPath = targetPaths.assetIndex(input.directory, input.assetIndex.id);\n const indexDocument = await fetchJson<AssetIndexDocument>(input.http, input.cache, {\n url: indexUrl,\n cacheKey: `asset-index:${input.assetIndex.id}:${input.assetIndex.sha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const actions: DownloadAction[] = [\n {\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: indexUrl,\n target: indexPath,\n expectedSha1: input.assetIndex.sha1,\n expectedSize: input.assetIndex.size,\n category: DownloadCategories.ASSET_INDEX,\n },\n ];\n // Asset indexes routinely list the same hash under multiple virtual paths (e.g. legacy\n // localized variants of the same byte content). Emit one DOWNLOAD_FILE per unique hash so\n // we never schedule two parallel writes to the same `assets/objects/<hash>` target — that\n // race produces a \"Failed to finalize download\" error during repair.\n const seen = new Set<string>();\n for (const entry of Object.values(indexDocument.objects)) {\n if (seen.has(entry.hash)) continue;\n seen.add(entry.hash);\n actions.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: ApiEndpoints.resources.asset(entry.hash),\n target: targetPaths.assetObject(input.directory, entry.hash),\n expectedSha1: entry.hash,\n expectedSize: entry.size,\n category: DownloadCategories.ASSET,\n });\n }\n return { actions, indexDocument };\n};\n","/** Default Maven base URL when a library entry has no `url`. */\nexport const DEFAULT_LIBRARY_REPOSITORY = \"https://libraries.minecraft.net/\";\n\n/** Fabric's Maven base. */\nexport const FABRIC_MAVEN_BASE = \"https://maven.fabricmc.net/\";\n\n/** Forge's Maven base. */\nexport const FORGE_MAVEN_BASE = \"https://maven.minecraftforge.net/\";\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"./errors\";\n\n/**\n * Parsed Maven coordinate of the form `group:artifact:version[:classifier][@extension]`.\n */\nexport type MavenCoordinate = {\n readonly group: string;\n readonly artifact: string;\n readonly version: string;\n readonly classifier?: string;\n readonly extension: string;\n};\n\n/**\n * Parse a Maven coordinate string. Defaults `extension` to `jar`.\n *\n * @throws `INVALID_INPUT` when the input cannot be parsed.\n */\nexport const parseMavenCoordinate = (input: string): MavenCoordinate => {\n // Strip enclosing brackets used in Forge install profiles.\n const trimmed = input.startsWith(\"[\") && input.endsWith(\"]\") ? input.slice(1, -1) : input;\n const atIndex = trimmed.indexOf(\"@\");\n const extension = atIndex === -1 ? \"jar\" : trimmed.slice(atIndex + 1);\n const body = atIndex === -1 ? trimmed : trimmed.slice(0, atIndex);\n const parts = body.split(\":\");\n if (parts.length < 3 || parts.length > 4) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `Invalid Maven coordinate: ${input}`,\n {\n context: { input },\n },\n );\n }\n const [group, artifact, version, classifier] = parts as [string, string, string, string?];\n if (!group || !artifact || !version) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `Invalid Maven coordinate (missing component): ${input}`,\n { context: { input } },\n );\n }\n if (classifier === undefined) {\n return { group, artifact, version, extension };\n }\n return { group, artifact, version, classifier, extension };\n};\n\n/** Build the relative path under a Maven repository for a coordinate. */\nexport const mavenRelativePath = (coord: MavenCoordinate): string => {\n const groupPath = coord.group.replaceAll(\".\", \"/\");\n const classifierSegment = coord.classifier === undefined ? \"\" : `-${coord.classifier}`;\n const filename = `${coord.artifact}-${coord.version}${classifierSegment}.${coord.extension}`;\n return `${groupPath}/${coord.artifact}/${coord.version}/${filename}`;\n};\n\n/** Convenience: parse + relative path. */\nexport const mavenRelativePathFor = (input: string): string => {\n return mavenRelativePath(parseMavenCoordinate(input));\n};\n","import type { LibraryRule } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\n\n/** Inputs to rule evaluation. */\nexport type RuleEvaluationContext = {\n readonly system: RuntimeSystem;\n readonly features?: Readonly<Record<string, boolean>>;\n};\n\n/**\n * Evaluate a list of Mojang library/argument rules against the given context.\n *\n * Algorithm: each rule with a matching `os`/`features` predicate updates a running\n * `allowed` flag (`allow` → true, `disallow` → false). Last matching rule wins.\n * When the rule list is empty, the result is `true`.\n */\nexport const evaluateRules = (\n rules: readonly LibraryRule[] | undefined,\n context: RuleEvaluationContext,\n): boolean => {\n if (!rules || rules.length === 0) {\n return true;\n }\n let allowed = false;\n for (const rule of rules) {\n if (matchesRule(rule, context)) {\n allowed = rule.action === \"allow\";\n }\n }\n return allowed;\n};\n\nconst matchesRule = (rule: LibraryRule, context: RuleEvaluationContext): boolean => {\n if (rule.os !== undefined) {\n if (rule.os.name !== undefined && rule.os.name !== context.system.os) {\n return false;\n }\n if (rule.os.arch !== undefined && normalizeArch(rule.os.arch) !== context.system.arch) {\n return false;\n }\n if (rule.os.version !== undefined) {\n try {\n if (!new RegExp(rule.os.version).test(context.system.osVersion)) {\n return false;\n }\n } catch {\n return false;\n }\n }\n }\n if (rule.features !== undefined) {\n const features = context.features ?? {};\n for (const [key, expected] of Object.entries(rule.features)) {\n const actual = features[key] === true;\n if (expected !== actual) {\n return false;\n }\n }\n }\n return true;\n};\n\n/**\n * Mojang manifests sometimes use `x86` (32-bit) where Node uses `ia32`. We canonicalize\n * to Mojang names elsewhere and treat `x86` as `x86`.\n */\nconst normalizeArch = (arch: string): string => {\n return arch === \"ia32\" ? \"x86\" : arch;\n};\n\n/** Resolve the `${arch}` placeholder used in legacy native classifier names. */\nexport const resolveArchPlaceholder = (template: string, archDigit: string): string => {\n return template.replaceAll(\"${arch}\", archDigit);\n};\n\n/** The numeric arch suffix used by legacy LWJGL natives (`x64` → `64`, `x86` → `32`). */\nexport const archDigit = (arch: RuntimeSystem[\"arch\"]): string => {\n if (arch === \"x86\") return \"32\";\n if (arch === \"x64\") return \"64\";\n return \"64\";\n};\n","import path from \"node:path\";\nimport { DEFAULT_LIBRARY_REPOSITORY } from \"../constants/maven\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { mavenRelativePathFor, parseMavenCoordinate } from \"../core/maven\";\nimport { targetPaths } from \"../core/paths\";\nimport { archDigit, evaluateRules, resolveArchPlaceholder } from \"../core/rules\";\nimport {\n type DownloadAction,\n type DownloadCategory,\n type ExtractNativeAction,\n InstallActionKinds,\n} from \"../types/install\";\nimport type { LibraryArtifact, MinecraftLibrary } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\n\n/** Outputs of {@link planLibraryDownloads}. */\nexport type LibraryPlan = {\n readonly downloads: readonly DownloadAction[];\n readonly nativeExtractions: readonly ExtractNativeAction[];\n readonly classpathFiles: readonly string[];\n};\n\n/**\n * Walk a library list, evaluate rules against the system, and produce concrete download +\n * native-extraction actions. Library entries that don't apply on the target platform are\n * silently filtered.\n */\nexport const planLibraryDownloads = (input: {\n readonly libraries: readonly MinecraftLibrary[];\n readonly directory: string;\n readonly system: RuntimeSystem;\n readonly versionId: string;\n readonly category: DownloadCategory;\n}): LibraryPlan => {\n const downloads: DownloadAction[] = [];\n const nativeExtractions: ExtractNativeAction[] = [];\n const classpathFiles: string[] = [];\n const seenPaths = new Set<string>();\n const nativesDir = targetPaths.nativesDir(input.directory, input.versionId);\n for (const library of input.libraries) {\n if (!evaluateRules(library.rules, { system: input.system })) continue;\n\n const artifact = pickPrimaryArtifact(library);\n if (artifact) {\n const targetPath = path.join(\n targetPaths.librariesDir(input.directory),\n artifact.relativePath,\n );\n if (!seenPaths.has(targetPath)) {\n seenPaths.add(targetPath);\n // Empty URL in a Forge install_profile / version JSON means \"the file is\n // provided by the installer's `maven/` extraction or by a processor output —\n // do not issue a download.\" Still record the path on the classpath so the\n // launch composer can find it after install.\n if (artifact.url) {\n downloads.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: artifact.url,\n target: targetPath,\n ...(artifact.sha1 !== undefined ? { expectedSha1: artifact.sha1 } : {}),\n ...(artifact.size !== undefined ? { expectedSize: artifact.size } : {}),\n category: input.category,\n });\n }\n classpathFiles.push(targetPath);\n }\n }\n\n const native = pickNative(library, input.system);\n if (native) {\n const targetPath = path.join(targetPaths.librariesDir(input.directory), native.relativePath);\n if (!seenPaths.has(targetPath)) {\n seenPaths.add(targetPath);\n if (native.url) {\n downloads.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: native.url,\n target: targetPath,\n ...(native.sha1 !== undefined ? { expectedSha1: native.sha1 } : {}),\n ...(native.size !== undefined ? { expectedSize: native.size } : {}),\n category: input.category,\n });\n }\n }\n nativeExtractions.push({\n kind: InstallActionKinds.EXTRACT_NATIVE,\n source: targetPath,\n destination: nativesDir,\n exclude: library.extract?.exclude ?? [\"META-INF/\"],\n });\n }\n }\n return { downloads, nativeExtractions, classpathFiles };\n};\n\ntype ArtifactDescription = {\n readonly relativePath: string;\n readonly url: string;\n readonly sha1: string | undefined;\n readonly size: number | undefined;\n};\n\nconst pickPrimaryArtifact = (library: MinecraftLibrary): ArtifactDescription | null => {\n if (library.downloads?.artifact) {\n return artifactFromDownload(library.downloads.artifact);\n }\n if (library.url) {\n return mavenArtifactFromCoord(library.name, library.url);\n }\n if (library.name && !library.natives) {\n return mavenArtifactFromCoord(library.name, DEFAULT_LIBRARY_REPOSITORY);\n }\n return null;\n};\n\nconst pickNative = (\n library: MinecraftLibrary,\n system: RuntimeSystem,\n): ArtifactDescription | null => {\n if (!library.natives) return null;\n const classifierTemplate = library.natives[system.os];\n if (!classifierTemplate) return null;\n const classifier = resolveArchPlaceholder(classifierTemplate, archDigit(system.arch));\n const classifierArtifact = library.downloads?.classifiers?.[classifier];\n if (classifierArtifact) {\n return artifactFromDownload(classifierArtifact);\n }\n if (library.url || library.name) {\n const coord = parseMavenCoordinate(library.name);\n const withClassifier = `${coord.group}:${coord.artifact}:${coord.version}:${classifier}`;\n return mavenArtifactFromCoord(withClassifier, library.url ?? DEFAULT_LIBRARY_REPOSITORY);\n }\n return null;\n};\n\nconst artifactFromDownload = (artifact: LibraryArtifact): ArtifactDescription => {\n return {\n relativePath: artifact.path,\n url: artifact.url,\n sha1: artifact.sha1,\n size: artifact.size,\n };\n};\n\nconst mavenArtifactFromCoord = (coord: string, baseUrl: string): ArtifactDescription => {\n const relativePath = mavenRelativePathFor(coord);\n const normalizedBase = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n if (!relativePath) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_INVALID,\n `Invalid library coordinate: ${coord}`,\n {\n context: { input: coord },\n },\n );\n }\n return {\n relativePath,\n url: `${normalizedBase}${relativePath}`,\n sha1: undefined,\n size: undefined,\n };\n};\n","import { targetPaths } from \"../core/paths\";\nimport type { ResolvedFabricLoader } from \"../types/fabric\";\nimport {\n type DownloadAction,\n DownloadCategories,\n InstallActionKinds,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport type { ResolvedMinecraft } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\nimport { planLibraryDownloads } from \"./libraries\";\n\n/**\n * Plan the Fabric-specific install steps for a resolved Fabric loader: write the profile\n * JSON (becomes `versions/<id>/<id>.json`) and download every Fabric library.\n */\nexport const planFabricInstall = (input: {\n readonly loader: ResolvedFabricLoader;\n readonly minecraft: ResolvedMinecraft;\n readonly directory: string;\n readonly system: RuntimeSystem;\n}): {\n readonly versionJson: WriteVersionJsonAction;\n readonly libraryDownloads: readonly DownloadAction[];\n readonly classpathFiles: readonly string[];\n readonly versionId: string;\n} => {\n const versionId = input.loader.profile.id;\n const versionJsonPath = targetPaths.versionJson(input.directory, versionId);\n const versionJson: WriteVersionJsonAction = {\n kind: InstallActionKinds.WRITE_VERSION_JSON,\n path: versionJsonPath,\n content: `${JSON.stringify(input.loader.profile, null, 2)}\\n`,\n };\n const plan = planLibraryDownloads({\n libraries: input.loader.profile.libraries,\n directory: input.directory,\n system: input.system,\n versionId: input.minecraft.version,\n category: DownloadCategories.FABRIC_LIBRARY,\n });\n return {\n versionJson,\n libraryDownloads: plan.downloads,\n classpathFiles: plan.classpathFiles,\n versionId,\n };\n};\n","/** Per-file size cap during archive extraction (bytes). */\nexport const EXTRACTION_MAX_FILE_SIZE = 256 * 1024 * 1024;\n\n/** Total decompressed-bytes cap per archive. */\nexport const EXTRACTION_MAX_TOTAL_SIZE = 2 * 1024 * 1024 * 1024;\n\n/** Maximum compression ratio (decompressed / compressed) before treating as a zip bomb. */\nexport const EXTRACTION_MAX_COMPRESSION_RATIO = 200;\n\n/** Maximum entry count per archive. */\nexport const EXTRACTION_MAX_ENTRY_COUNT = 100_000;\n\n/** Reasonable maximum bytes a Forge installer JAR can be. */\nexport const FORGE_INSTALLER_MAX_SIZE = 256 * 1024 * 1024;\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"./errors\";\n\n/** Ensure a directory exists, creating intermediate directories as needed. */\nexport const ensureDir = async (directory: string): Promise<void> => {\n try {\n await fs.mkdir(directory, { recursive: true });\n } catch (cause) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FILESYSTEM_WRITE_ERROR,\n `Failed to create directory: ${directory}`,\n { cause, context: { filePath: directory } },\n );\n }\n};\n\n/** Returns true if a path exists and is a regular file. */\nexport const fileExists = async (filePath: string): Promise<boolean> => {\n try {\n const stat = await fs.stat(filePath);\n return stat.isFile();\n } catch {\n return false;\n }\n};\n\n/** Returns true if a path exists and is a directory. */\nexport const dirExists = async (filePath: string): Promise<boolean> => {\n try {\n const stat = await fs.stat(filePath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n};\n\n/** Get file size in bytes; returns -1 when the file is absent. */\nexport const fileSize = async (filePath: string): Promise<number> => {\n try {\n const stat = await fs.stat(filePath);\n return stat.size;\n } catch {\n return -1;\n }\n};\n\n/**\n * Atomically write `data` to `target`. Writes to a temp sibling and renames.\n *\n * Creates parent directories if missing. Throws {@link MinecraftKitError} with\n * code `FILESYSTEM_WRITE_ERROR` on failure.\n */\nexport const atomicWrite = async (target: string, data: Uint8Array | string): Promise<void> => {\n await ensureDir(path.dirname(target));\n const tmp = `${target}.${crypto.randomBytes(4).toString(\"hex\")}.tmp`;\n try {\n if (typeof data === \"string\") {\n await fs.writeFile(tmp, data, \"utf8\");\n } else {\n await fs.writeFile(tmp, data);\n }\n await fs.rename(tmp, target);\n } catch (cause) {\n try {\n await fs.unlink(tmp);\n } catch {\n // Best-effort cleanup.\n }\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FILESYSTEM_WRITE_ERROR,\n `Failed to write file: ${target}`,\n {\n cause,\n context: { filePath: target },\n },\n );\n }\n};\n\n/** Read a file as UTF-8 text, mapping fs errors to a domain error. */\nexport const readText = async (filePath: string): Promise<string> => {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch (cause) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FILESYSTEM_READ_ERROR,\n `Failed to read file: ${filePath}`,\n {\n cause,\n context: { filePath },\n },\n );\n }\n};\n\n/** Read a file as bytes, mapping fs errors to a domain error. */\nexport const readBytes = async (filePath: string): Promise<Uint8Array> => {\n try {\n const buf = await fs.readFile(filePath);\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n } catch (cause) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FILESYSTEM_READ_ERROR,\n `Failed to read file: ${filePath}`,\n {\n cause,\n context: { filePath },\n },\n );\n }\n};\n\n/** List immediate child directory names of `directory`. Returns [] when directory is missing. */\nexport const listChildDirectories = async (directory: string): Promise<readonly string[]> => {\n try {\n const entries = await fs.readdir(directory, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n};\n\n/** Set the executable bit on a file (best-effort; no-op on Windows). */\nexport const chmodExecutable = async (filePath: string): Promise<void> => {\n if (process.platform === \"win32\") {\n return;\n }\n try {\n await fs.chmod(filePath, 0o755);\n } catch {\n // Best-effort.\n }\n};\n\n/**\n * Verify that `child` is contained in `root`. Used to defeat zip-slip and absolute-path\n * traversal during archive extraction.\n *\n * @throws `FILESYSTEM_PATH_TRAVERSAL` when `child` escapes `root`.\n */\nexport const assertWithinRoot = (root: string, child: string): void => {\n const normalizedRoot = path.resolve(root);\n const normalizedChild = path.resolve(root, child);\n const sep = path.sep;\n if (normalizedChild !== normalizedRoot && !normalizedChild.startsWith(normalizedRoot + sep)) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FILESYSTEM_PATH_TRAVERSAL,\n `Path escapes root: ${child}`,\n {\n context: { filePath: child, rootDirectory: root },\n },\n );\n }\n};\n","import { createWriteStream } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport yauzl from \"yauzl\";\nimport {\n EXTRACTION_MAX_COMPRESSION_RATIO,\n EXTRACTION_MAX_ENTRY_COUNT,\n EXTRACTION_MAX_FILE_SIZE,\n EXTRACTION_MAX_TOTAL_SIZE,\n} from \"../constants/limits\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"./errors\";\nimport { assertWithinRoot, atomicWrite, chmodExecutable, ensureDir } from \"./fs\";\n\n/** A single zip entry exposed to callers. */\nexport type ZipEntry = {\n readonly name: string;\n readonly compressedSize: number;\n readonly uncompressedSize: number;\n readonly isDirectory: boolean;\n /** Read the entry contents into a Buffer (size limits enforced). */\n readBuffer(): Promise<Buffer>;\n /** Stream the entry contents. */\n openReadStream(): Promise<Readable>;\n};\n\n/** Open a zip/jar file for streaming inspection. */\nexport const openZip = (filePath: string): Promise<ZipReader> => {\n return new Promise((resolve, reject) => {\n yauzl.open(filePath, { lazyEntries: true, autoClose: false }, (err, zipFile) => {\n if (err || !zipFile) {\n reject(\n new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_INVALID,\n `Failed to open archive: ${filePath}`,\n {\n cause: err,\n context: { filePath },\n },\n ),\n );\n return;\n }\n resolve(new ZipReader(zipFile, filePath));\n });\n });\n};\n\n/** Reader for a single zip file. */\nexport class ZipReader {\n constructor(\n private readonly file: yauzl.ZipFile,\n private readonly filePath: string,\n ) {}\n\n /** Iterate every entry. Caller may break out of the loop early. */\n async *entries(): AsyncGenerator<ZipEntry> {\n const file = this.file;\n let count = 0;\n while (true) {\n const entry = await this.readNext();\n if (entry === null) return;\n count++;\n if (count > EXTRACTION_MAX_ENTRY_COUNT) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_TOO_LARGE,\n `Archive contains too many entries: ${this.filePath}`,\n { context: { filePath: this.filePath } },\n );\n }\n yield this.toZipEntry(entry, file);\n }\n }\n\n /** Find a single entry by name. Returns undefined if absent. */\n async findEntry(name: string): Promise<ZipEntry | undefined> {\n for await (const entry of this.entries()) {\n if (entry.name === name) return entry;\n }\n return undefined;\n }\n\n /** Close the reader. */\n close(): void {\n this.file.close();\n }\n\n private readNext(): Promise<yauzl.Entry | null> {\n return new Promise((resolve, reject) => {\n const onEntry = (entry: yauzl.Entry): void => {\n cleanup();\n resolve(entry);\n };\n const onEnd = (): void => {\n cleanup();\n resolve(null);\n };\n const onError = (err: unknown): void => {\n cleanup();\n reject(\n new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_INVALID,\n \"Failed to read archive entry\",\n {\n cause: err,\n context: { filePath: this.filePath },\n },\n ),\n );\n };\n const cleanup = (): void => {\n this.file.removeListener(\"entry\", onEntry);\n this.file.removeListener(\"end\", onEnd);\n this.file.removeListener(\"error\", onError);\n };\n this.file.once(\"entry\", onEntry);\n this.file.once(\"end\", onEnd);\n this.file.once(\"error\", onError);\n this.file.readEntry();\n });\n }\n\n private toZipEntry(entry: yauzl.Entry, file: yauzl.ZipFile): ZipEntry {\n const name = entry.fileName;\n const isDirectory = name.endsWith(\"/\");\n return {\n name,\n compressedSize: entry.compressedSize,\n uncompressedSize: entry.uncompressedSize,\n isDirectory,\n readBuffer: async () => {\n if (entry.uncompressedSize > EXTRACTION_MAX_FILE_SIZE) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_TOO_LARGE,\n `Archive entry exceeds size cap: ${name}`,\n { context: { filePath: this.filePath, entryName: name, size: entry.uncompressedSize } },\n );\n }\n if (\n entry.compressedSize > 0 &&\n entry.uncompressedSize / entry.compressedSize > EXTRACTION_MAX_COMPRESSION_RATIO\n ) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_TOO_LARGE,\n `Archive entry exceeds compression-ratio cap: ${name}`,\n { context: { filePath: this.filePath, entryName: name } },\n );\n }\n const stream = await openStream(file, entry, this.filePath);\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n },\n openReadStream: () => openStream(file, entry, this.filePath),\n };\n }\n}\n\nconst openStream = (\n file: yauzl.ZipFile,\n entry: yauzl.Entry,\n archivePath: string,\n): Promise<Readable> => {\n return new Promise((resolve, reject) => {\n file.openReadStream(entry, (err, stream) => {\n if (err || !stream) {\n reject(\n new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_INVALID,\n `Failed to open archive entry: ${entry.fileName}`,\n { cause: err, context: { filePath: archivePath, entryName: entry.fileName } },\n ),\n );\n return;\n }\n resolve(stream);\n });\n });\n};\n\n/** Inputs to {@link extractEntryToDir}. */\nexport type ExtractOptions = {\n /** Path-prefix exclusion list. Defaults to `[\"META-INF/\"]`. */\n readonly excludePrefixes?: readonly string[];\n /** When false, refuse to overwrite existing files. */\n readonly overwrite?: boolean;\n};\n\n/** Extract every file entry from a zip into `targetDir`, applying safety checks. */\nexport const extractAllToDir = async (\n zipPath: string,\n targetDir: string,\n options: ExtractOptions = {},\n): Promise<{ readonly fileCount: number }> => {\n const exclude = options.excludePrefixes ?? [\"META-INF/\"];\n let fileCount = 0;\n let totalSize = 0;\n await ensureDir(targetDir);\n const reader = await openZip(zipPath);\n try {\n for await (const entry of reader.entries()) {\n if (entry.isDirectory) continue;\n if (exclude.some((prefix) => entry.name.startsWith(prefix))) continue;\n assertSafeEntryName(entry.name);\n const destination = path.join(targetDir, entry.name);\n assertWithinRoot(targetDir, entry.name);\n totalSize += entry.uncompressedSize;\n if (totalSize > EXTRACTION_MAX_TOTAL_SIZE) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_TOO_LARGE,\n `Archive total size cap exceeded: ${zipPath}`,\n { context: { filePath: zipPath } },\n );\n }\n if (entry.uncompressedSize > EXTRACTION_MAX_FILE_SIZE) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_TOO_LARGE,\n `Archive entry exceeds size cap: ${entry.name}`,\n { context: { filePath: zipPath, entryName: entry.name } },\n );\n }\n await ensureDir(path.dirname(destination));\n const stream = await entry.openReadStream();\n await pipeline(stream, createWriteStream(destination));\n if (\n entry.name.endsWith(\".so\") ||\n entry.name.endsWith(\".dylib\") ||\n entry.name.endsWith(\".jnilib\")\n ) {\n await chmodExecutable(destination);\n }\n fileCount++;\n }\n } finally {\n reader.close();\n }\n return { fileCount };\n};\n\nconst RESERVED_NAME = /^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\\..*)?$/i;\n\n/** Reject entry names that are dangerous regardless of containment. */\nexport const assertSafeEntryName = (name: string): void => {\n if (!name) {\n throw rejectEntry(name, \"empty entry name\");\n }\n if (name.includes(String.fromCharCode(0))) {\n throw rejectEntry(name, \"null byte\");\n }\n if (path.posix.isAbsolute(name) || /^[a-zA-Z]:/.test(name) || name.startsWith(\"\\\\\")) {\n throw rejectEntry(name, \"absolute path\");\n }\n const segments = name.split(\"/\");\n for (const segment of segments) {\n if (segment === \"..\") {\n throw rejectEntry(name, \"parent traversal\");\n }\n if (RESERVED_NAME.test(segment)) {\n throw rejectEntry(name, \"reserved Windows name\");\n }\n if (/[\\s.]$/.test(segment)) {\n throw rejectEntry(name, \"trailing dot or whitespace\");\n }\n }\n};\n\nconst rejectEntry = (name: string, reason: string): MinecraftKitError => {\n return new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_ENTRY_REJECTED,\n `Archive entry rejected (${reason}): ${name}`,\n { context: { entryName: name, reason } },\n );\n};\n\n/** Read a single named entry to a Buffer. Returns undefined if missing. */\nexport const readEntryBuffer = async (\n zipPath: string,\n entryName: string,\n): Promise<Buffer | undefined> => {\n const reader = await openZip(zipPath);\n try {\n const entry = await reader.findEntry(entryName);\n if (!entry) return undefined;\n return await entry.readBuffer();\n } finally {\n reader.close();\n }\n};\n\n/** Extract a single entry to a destination path. */\nexport const extractSingleEntry = async (\n zipPath: string,\n entryName: string,\n destination: string,\n): Promise<void> => {\n const buffer = await readEntryBuffer(zipPath, entryName);\n if (!buffer) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.ARCHIVE_INVALID,\n `Archive entry not found: ${entryName}`,\n {\n context: { filePath: zipPath, entryName },\n },\n );\n }\n await atomicWrite(destination, buffer);\n};\n\n/**\n * JAR manifest line-continuation: a line break followed by a single space or tab joins\n * the next line onto the previous one. See JAR specification.\n */\nconst MANIFEST_LINE_CONTINUATION = /\\r?\\n[ \\t]/g;\nconst MANIFEST_MAIN_CLASS = /^Main-Class:\\s*(.+)$/i;\n\n/** Read the `Main-Class` attribute from a JAR's `META-INF/MANIFEST.MF`. */\nexport const readJarMainClass = async (zipPath: string): Promise<string | undefined> => {\n const buf = await readEntryBuffer(zipPath, \"META-INF/MANIFEST.MF\");\n if (!buf) return undefined;\n const text = buf.toString(\"utf8\").replaceAll(MANIFEST_LINE_CONTINUATION, \"\");\n for (const line of text.split(/\\r?\\n/)) {\n const match = MANIFEST_MAIN_CLASS.exec(line);\n if (match?.[1]) return match[1].trim();\n }\n return undefined;\n};\n","/** Return a new array preserving first-occurrence order, keyed by `key(value)`. */\nexport const dedupeBy = <T, K>(values: readonly T[], key: (value: T) => K): readonly T[] => {\n const seen = new Set<K>();\n const result: T[] = [];\n for (const value of values) {\n const k = key(value);\n if (seen.has(k)) continue;\n seen.add(k);\n result.push(value);\n }\n return result;\n};\n\n/** Return a new array preserving first-occurrence order, deduplicated by value identity. */\nexport const dedupe = <T>(values: readonly T[]): readonly T[] => {\n return dedupeBy(values, (v) => v);\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"./errors\";\nimport type { PauseController } from \"./pause-controller\";\n\n/**\n * The two checkpoint hooks that every long-running operation in the kit honours: caller\n * cancellation via `AbortSignal`, and caller pause/resume via {@link PauseController}.\n *\n * Wrap the pair so the call sites don't repeat the same three-line dance\n * (check signal -> await pause -> check signal again).\n */\nexport type CheckpointSources = {\n readonly signal?: AbortSignal;\n readonly pauseController?: PauseController;\n};\n\n/**\n * Throw {@link MinecraftKitError} with code `LAUNCH_ABORTED` if the signal is aborted.\n *\n * `LAUNCH_ABORTED` is intentionally reused for install + launch + repair runners because\n * downstream code maps it to a single user-visible \"operation cancelled\" state.\n */\nexport const assertNotAborted = (signal: AbortSignal | undefined, message: string): void => {\n if (signal?.aborted) {\n throw new MinecraftKitError(MinecraftKitErrorCodes.LAUNCH_ABORTED, message);\n }\n};\n\n/**\n * Wait while paused, abort-checking before and after. The double abort-check matters:\n * `pauseController.waitWhilePaused()` can resolve long after a cancel request, and the\n * caller should see the cancel rather than push another action through.\n */\nexport const checkpoint = async (\n sources: CheckpointSources,\n message = \"Operation aborted by signal\",\n): Promise<void> => {\n assertNotAborted(sources.signal, message);\n await sources.pauseController?.waitWhilePaused();\n assertNotAborted(sources.signal, message);\n};\n","import {\n HTTP_RETRY_BACKOFF_BASE_MS,\n HTTP_RETRY_BACKOFF_CAP_MS,\n HTTP_RETRY_MAX,\n} from \"../constants/defaults\";\nimport { MinecraftKitError, MinecraftKitErrorCodes, isMinecraftKitError } from \"./errors\";\n\n/** Inputs passed to {@link withRetry}. */\nexport type RetryOptions = {\n readonly maxAttempts?: number;\n readonly baseMs?: number;\n readonly capMs?: number;\n readonly signal?: AbortSignal;\n readonly sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;\n readonly random?: () => number;\n readonly onAttemptFailed?: (error: unknown, attempt: number) => void;\n};\n\n/** Default sleep that respects the abort signal. */\nexport const abortableSleep = (ms: number, signal?: AbortSignal): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(toAbortError(signal));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(toAbortError(signal));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n};\n\nconst toAbortError = (signal?: AbortSignal): Error => {\n return new MinecraftKitError(MinecraftKitErrorCodes.NETWORK_ABORTED, \"Operation aborted\", {\n context: { reason: signal?.reason },\n });\n};\n\n/**\n * Run `op` with full-jitter exponential backoff. Retries only when {@link isRetryable}\n * returns true.\n */\nexport const withRetry = async <T>(\n op: (attempt: number) => Promise<T>,\n isRetryable: (error: unknown) => boolean,\n options: RetryOptions = {},\n): Promise<T> => {\n const max = options.maxAttempts ?? HTTP_RETRY_MAX;\n const base = options.baseMs ?? HTTP_RETRY_BACKOFF_BASE_MS;\n const cap = options.capMs ?? HTTP_RETRY_BACKOFF_CAP_MS;\n const sleep = options.sleep ?? abortableSleep;\n const random = options.random ?? Math.random;\n let lastError: unknown;\n for (let attempt = 0; attempt < max; attempt++) {\n if (options.signal?.aborted) {\n throw toAbortError(options.signal);\n }\n try {\n return await op(attempt);\n } catch (error) {\n lastError = error;\n options.onAttemptFailed?.(error, attempt);\n if (!isRetryable(error) || attempt === max - 1) {\n throw error;\n }\n const delayCap = Math.min(cap, base * 2 ** attempt);\n const delay = Math.floor(random() * delayCap);\n await sleep(delay, options.signal);\n }\n }\n // Should be unreachable; the for-loop returns or throws.\n throw lastError ?? new Error(\"withRetry exhausted attempts\");\n};\n\n/** Default retry predicate for HTTP-like errors. */\nexport const isHttpRetryable = (error: unknown): boolean => {\n if (!isMinecraftKitError(error)) {\n return false;\n }\n if (error.code === \"NETWORK_ABORTED\") return false;\n if (error.code === \"NETWORK_TIMEOUT\") return true;\n if (error.code === \"NETWORK_HTTP_ERROR\") {\n const status = typeof error.context.httpStatus === \"number\" ? error.context.httpStatus : 0;\n if (status === 408 || status === 425 || status === 429) return true;\n if (status >= 500 && status < 600) return true;\n return status === 0;\n }\n return false;\n};\n","import type { InstallPhase } from \"./install\";\nimport type { RepairPhase } from \"./repair\";\nimport type { VerificationFileResult, VerificationResult } from \"./verify\";\n\n/**\n * Stable string constants for the `type` discriminator of every {@link ProgressEvent}.\n * Use these instead of bare string literals when filtering events.\n */\nexport const EventTypes = {\n INSTALL_PHASE_CHANGED: \"install:phase-changed\",\n DOWNLOAD_STARTED: \"download:started\",\n DOWNLOAD_PROGRESS: \"download:progress\",\n DOWNLOAD_SKIPPED: \"download:skipped\",\n DOWNLOAD_COMPLETED: \"download:completed\",\n DOWNLOAD_FAILED: \"download:failed\",\n INTEGRITY_VERIFIED: \"integrity:verified\",\n INTEGRITY_MISMATCH: \"integrity:mismatch\",\n ARCHIVE_EXTRACTED: \"archive:extracted\",\n FORGE_PROCESSOR_STARTED: \"forge:processor-started\",\n FORGE_PROCESSOR_COMPLETED: \"forge:processor-completed\",\n FORGE_PROCESSOR_OUTPUT_VERIFIED: \"forge:processor-output-verified\",\n VERIFY_FILE_CHECKED: \"verify:file-checked\",\n VERIFY_COMPLETED: \"verify:completed\",\n REPAIR_PHASE_CHANGED: \"repair:phase-changed\",\n LAUNCH_STARTING: \"launch:starting\",\n LAUNCH_STARTED: \"launch:started\",\n LAUNCH_STDOUT: \"launch:stdout\",\n LAUNCH_STDERR: \"launch:stderr\",\n LAUNCH_EXITED: \"launch:exited\",\n LAUNCH_ABORTED: \"launch:aborted\",\n} as const;\n\n/** Literal type of the `type` discriminator of a {@link ProgressEvent}. */\nexport type EventType = (typeof EventTypes)[keyof typeof EventTypes];\n\n/** Reference to a single file used in download events. */\nexport type FileRef = {\n readonly url: string;\n readonly target: string;\n readonly category?: string;\n};\n\n/** A single processor description used in Forge events. */\nexport type ProcessorRef = {\n readonly index: number;\n readonly mainClass: string;\n};\n\n/**\n * Discriminated union of all runtime progress events. Pass an `onEvent` callback to\n * `install.run`, `update.run`, `verify.run`, `repair.run`, or `launch.run` to receive these.\n */\nexport type ProgressEvent =\n | {\n readonly type: \"install:phase-changed\";\n readonly phase: InstallPhase;\n readonly previous: InstallPhase | null;\n }\n | { readonly type: \"download:started\"; readonly file: FileRef; readonly expectedSize: number }\n | {\n readonly type: \"download:progress\";\n readonly file: FileRef;\n readonly bytesDownloaded: number;\n readonly totalBytes: number;\n }\n | { readonly type: \"download:skipped\"; readonly file: FileRef }\n | {\n readonly type: \"download:completed\";\n readonly file: FileRef;\n readonly durationMs: number;\n readonly bytes: number;\n }\n | {\n readonly type: \"download:failed\";\n readonly file: FileRef;\n readonly error: Error;\n readonly willRetry: boolean;\n }\n | {\n readonly type: \"integrity:verified\";\n readonly file: FileRef;\n readonly algorithm: \"sha1\" | \"sha256\";\n readonly hash: string;\n }\n | {\n readonly type: \"integrity:mismatch\";\n readonly file: FileRef;\n readonly algorithm: \"sha1\" | \"sha256\";\n readonly expected: string;\n readonly actual: string;\n }\n | {\n readonly type: \"archive:extracted\";\n readonly archive: string;\n readonly target: string;\n readonly fileCount: number;\n }\n | {\n readonly type: \"forge:processor-started\";\n readonly processor: ProcessorRef;\n readonly total: number;\n }\n | {\n readonly type: \"forge:processor-completed\";\n readonly processor: ProcessorRef;\n readonly exitCode: number;\n readonly durationMs: number;\n }\n | {\n readonly type: \"forge:processor-output-verified\";\n readonly processor: ProcessorRef;\n readonly path: string;\n }\n | { readonly type: \"verify:file-checked\"; readonly file: VerificationFileResult }\n | { readonly type: \"verify:completed\"; readonly summary: VerificationResult }\n | {\n readonly type: \"repair:phase-changed\";\n readonly phase: RepairPhase;\n readonly previous: RepairPhase | null;\n }\n | {\n readonly type: \"launch:starting\";\n readonly command: string;\n readonly args: readonly string[];\n readonly cwd: string;\n }\n | { readonly type: \"launch:started\"; readonly pid: number }\n | { readonly type: \"launch:stdout\"; readonly line: string }\n | { readonly type: \"launch:stderr\"; readonly line: string }\n | {\n readonly type: \"launch:exited\";\n readonly code: number | null;\n readonly signal: NodeJS.Signals | null;\n }\n | { readonly type: \"launch:aborted\"; readonly reason: string };\n\n/** Listener signature accepted by every long-running operation. */\nexport type ProgressListener = (event: ProgressEvent) => void;\n\n/** Common options accepted by long-running operations. */\nexport type OperationOptions = {\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n","import crypto from \"node:crypto\";\nimport { createWriteStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { HTTP_RETRY_MAX } from \"../constants/defaults\";\nimport { checkpoint } from \"../core/abort\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { ensureDir } from \"../core/fs\";\nimport type { PauseController } from \"../core/pause-controller\";\nimport { isHttpRetryable, withRetry } from \"../core/retry\";\nimport { EventTypes } from \"../types/events\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\n\n/** Inputs to {@link downloadFile}. */\nexport type DownloadFileInput = {\n readonly url: string;\n readonly target: string;\n readonly expectedSha1?: string;\n readonly expectedSize?: number;\n readonly category?: string;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n /** Checked between chunks; pauses an in-flight download without aborting. */\n readonly pauseController?: PauseController;\n /**\n * Optional host allow-list. When set, downloads whose hostname does not match any entry\n * are rejected before fetch. Entries support a leading wildcard label, e.g.\n * `\"*.minecraft.net\"` matches `\"piston-data.minecraft.net\"`. Hostnames are compared\n * case-insensitively.\n */\n readonly hostAllowList?: readonly string[];\n};\n\n/** Outputs from a successful download. */\nexport type DownloadFileResult = {\n readonly bytesDownloaded: number;\n readonly sha1: string;\n readonly skipped: boolean;\n};\n\n/**\n * Stream a URL to a file with on-the-fly hash verification, atomic rename, retries, and\n * progress events. Skips the download when the destination already exists with matching\n * size + sha1.\n */\nexport const downloadFile = async (\n http: HttpClient,\n input: DownloadFileInput,\n): Promise<DownloadFileResult> => {\n assertSafeDownloadUrl(input.url, input.hostAllowList);\n const fileRef = {\n url: input.url,\n target: input.target,\n ...(input.category !== undefined ? { category: input.category } : {}),\n };\n if (input.expectedSha1 !== undefined) {\n const existing = await checkExistingFile(input.target, input.expectedSha1, input.expectedSize);\n if (existing.matches) {\n input.onEvent?.({ type: EventTypes.DOWNLOAD_SKIPPED, file: fileRef });\n return { bytesDownloaded: 0, sha1: existing.sha1, skipped: true };\n }\n }\n await ensureDir(path.dirname(input.target));\n const tmp = `${input.target}.${crypto.randomBytes(4).toString(\"hex\")}.download`;\n return withRetry(\n async () => {\n input.onEvent?.({\n type: EventTypes.DOWNLOAD_STARTED,\n file: fileRef,\n expectedSize: input.expectedSize ?? 0,\n });\n const startedAt = Date.now();\n let bytesDownloaded = 0;\n const hash = crypto.createHash(\"sha1\");\n const response = await http.request(input.url, {\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const contentLength = Number(response.headers[\"content-length\"] ?? \"0\");\n const total = input.expectedSize ?? (Number.isFinite(contentLength) ? contentLength : 0);\n const sourceIterable = response.stream();\n const counting = (async function* () {\n for await (const chunk of sourceIterable) {\n await checkpoint(\n {\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.pauseController !== undefined\n ? { pauseController: input.pauseController }\n : {}),\n },\n \"Download aborted by signal\",\n );\n bytesDownloaded += chunk.byteLength;\n hash.update(chunk);\n input.onEvent?.({\n type: EventTypes.DOWNLOAD_PROGRESS,\n file: fileRef,\n bytesDownloaded,\n totalBytes: total,\n });\n yield chunk;\n }\n })();\n try {\n await pipeline(Readable.from(counting), createWriteStream(tmp));\n } catch (cause) {\n await safeUnlink(tmp);\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FILESYSTEM_WRITE_ERROR,\n `Failed to write download: ${input.target}`,\n { cause, context: { filePath: input.target, url: input.url } },\n );\n }\n const computedSha1 = hash.digest(\"hex\");\n if (input.expectedSize !== undefined && bytesDownloaded !== input.expectedSize) {\n await safeUnlink(tmp);\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INTEGRITY_SIZE_MISMATCH,\n `Size mismatch for ${input.url}`,\n {\n context: {\n url: input.url,\n expectedSize: input.expectedSize,\n actualSize: bytesDownloaded,\n },\n },\n );\n }\n if (input.expectedSha1 !== undefined && computedSha1 !== input.expectedSha1) {\n await safeUnlink(tmp);\n input.onEvent?.({\n type: EventTypes.INTEGRITY_MISMATCH,\n file: fileRef,\n algorithm: \"sha1\",\n expected: input.expectedSha1,\n actual: computedSha1,\n });\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INTEGRITY_HASH_MISMATCH,\n `SHA-1 mismatch for ${input.url}`,\n {\n context: {\n url: input.url,\n expectedHash: input.expectedSha1,\n actualHash: computedSha1,\n },\n },\n );\n }\n try {\n await fs.rename(tmp, input.target);\n } catch (cause) {\n await safeUnlink(tmp);\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FILESYSTEM_WRITE_ERROR,\n `Failed to finalize download: ${input.target}`,\n { cause, context: { filePath: input.target } },\n );\n }\n input.onEvent?.({\n type: EventTypes.DOWNLOAD_COMPLETED,\n file: fileRef,\n durationMs: Date.now() - startedAt,\n bytes: bytesDownloaded,\n });\n if (input.expectedSha1 !== undefined) {\n input.onEvent?.({\n type: EventTypes.INTEGRITY_VERIFIED,\n file: fileRef,\n algorithm: \"sha1\",\n hash: computedSha1,\n });\n }\n return { bytesDownloaded, sha1: computedSha1, skipped: false };\n },\n isHttpRetryable,\n {\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n onAttemptFailed: (error, attempt) => {\n input.onEvent?.({\n type: EventTypes.DOWNLOAD_FAILED,\n file: fileRef,\n error: error instanceof Error ? error : new Error(String(error)),\n willRetry: isHttpRetryable(error) && attempt < HTTP_RETRY_MAX - 1,\n });\n },\n },\n );\n};\n\nconst checkExistingFile = async (\n target: string,\n expectedSha1: string,\n expectedSize: number | undefined,\n): Promise<{ readonly matches: boolean; readonly sha1: string }> => {\n let stat: Awaited<ReturnType<typeof fs.stat>>;\n try {\n stat = await fs.stat(target);\n } catch {\n return { matches: false, sha1: \"\" };\n }\n if (!stat.isFile()) {\n return { matches: false, sha1: \"\" };\n }\n if (expectedSize !== undefined && stat.size !== expectedSize) {\n return { matches: false, sha1: \"\" };\n }\n const buf = await fs.readFile(target);\n const sha1 = crypto.createHash(\"sha1\").update(buf).digest(\"hex\");\n return { matches: sha1 === expectedSha1, sha1 };\n};\n\nconst safeUnlink = async (filePath: string): Promise<void> => {\n try {\n await fs.unlink(filePath);\n } catch {\n // Best-effort.\n }\n};\n\n// Manifests are loaded over the network; an attacker controlling DNS or a man-in-the-middle\n// could rewrite `library.url` to `file:///etc/passwd` and the streaming `fetch` would happily\n// follow it. Restrict downloads to plain HTTP(S) so manifests can never coax `fetch` into\n// reading local files, executing JS, or following data URIs. Callers that ship in a hostile\n// environment can additionally pin to a host allow-list.\nconst assertSafeDownloadUrl = (url: string, allowList: readonly string[] | undefined): void => {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `Download URL is not parseable: ${url}`,\n {\n context: { url },\n },\n );\n }\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `Download URL must use http(s); refusing scheme ${parsed.protocol}`,\n { context: { url, scheme: parsed.protocol } },\n );\n }\n if (allowList !== undefined && !matchesHostAllowList(parsed.hostname, allowList)) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `Download URL host is not in the allow-list: ${parsed.hostname}`,\n { context: { url, host: parsed.hostname } },\n );\n }\n};\n\nconst matchesHostAllowList = (hostname: string, allowList: readonly string[]): boolean => {\n const host = hostname.toLowerCase();\n return allowList.some((entry) => matchesHostEntry(host, entry.toLowerCase()));\n};\n\nconst matchesHostEntry = (host: string, entry: string): boolean => {\n if (entry.startsWith(\"*.\")) {\n const suffix = entry.slice(1);\n return host === entry.slice(2) || host.endsWith(suffix);\n }\n return host === entry;\n};\n","import path from \"node:path\";\nimport { ApiEndpoints } from \"../constants/api\";\nimport { extractSingleEntry, openZip, readEntryBuffer } from \"../core/archive\";\nimport { dedupe, dedupeBy } from \"../core/collections\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { atomicWrite } from \"../core/fs\";\nimport { parseJsonStrict } from \"../core/json\";\nimport { mavenRelativePathFor } from \"../core/maven\";\nimport { targetPaths } from \"../core/paths\";\nimport { evaluateRules } from \"../core/rules\";\nimport { downloadFile } from \"../http/download\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type {\n ForgeInstallProfile,\n ForgeProcessor,\n ForgeVersionJson,\n ResolvedForgeLoader,\n} from \"../types/forge\";\nimport type { HttpClient } from \"../types/http\";\nimport {\n type DownloadAction,\n DownloadCategories,\n InstallActionKinds,\n type RunForgeProcessorAction,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport type { ResolvedMinecraft } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\nimport { planLibraryDownloads } from \"./libraries\";\n\n/** Outputs of {@link planForgeInstall}. */\nexport type ForgeInstallPlan = {\n readonly installerDownload: DownloadAction;\n readonly libraryDownloads: readonly DownloadAction[];\n readonly classpathFiles: readonly string[];\n readonly processorActions: readonly RunForgeProcessorAction[];\n readonly versionJson: WriteVersionJsonAction;\n readonly versionId: string;\n readonly profile: ForgeInstallProfile;\n readonly version: ForgeVersionJson;\n};\n\n/** Inputs to {@link planForgeInstall}. */\nexport type PlanForgeInstallInput = {\n readonly loader: ResolvedForgeLoader;\n readonly minecraft: ResolvedMinecraft;\n readonly directory: string;\n readonly system: RuntimeSystem;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\n/**\n * Plan the Forge install steps. Downloads the installer, parses install_profile + version.json,\n * extracts embedded artifacts to `libraries/`, and prepares processor invocations.\n */\nexport const planForgeInstall = async (input: PlanForgeInstallInput): Promise<ForgeInstallPlan> => {\n const installerPath = targetPaths.forgeInstaller(input.directory, input.loader.fullVersion);\n await downloadFile(input.http, {\n url: input.loader.installerUrl,\n target: installerPath,\n category: DownloadCategories.FORGE_INSTALLER,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n\n const installerDownload: DownloadAction = {\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: input.loader.installerUrl,\n target: installerPath,\n category: DownloadCategories.FORGE_INSTALLER,\n };\n\n const profile = await readJsonEntry<ForgeInstallProfile>(installerPath, \"install_profile.json\");\n const versionRelative = profile.json.startsWith(\"/\") ? profile.json.slice(1) : profile.json;\n const version = await readJsonEntry<ForgeVersionJson>(installerPath, versionRelative);\n\n await extractInstallerMavenEntries(installerPath, input.directory);\n\n const dataResolved = await resolveProfileData({\n profile,\n installerPath,\n directory: input.directory,\n });\n\n const installerLibraries = planLibraryDownloads({\n libraries: profile.libraries,\n directory: input.directory,\n system: input.system,\n versionId: input.minecraft.version,\n category: DownloadCategories.FORGE_LIBRARY,\n });\n const versionLibraries = planLibraryDownloads({\n libraries: version.libraries,\n directory: input.directory,\n system: input.system,\n versionId: version.id,\n category: DownloadCategories.FORGE_LIBRARY,\n });\n\n const dedupedDownloads = dedupeBy(\n [...installerLibraries.downloads, ...versionLibraries.downloads],\n (action) => action.target,\n );\n const classpathFiles = dedupe([\n ...installerLibraries.classpathFiles,\n ...versionLibraries.classpathFiles,\n ]);\n\n const processorActions = await buildProcessorActions({\n profile,\n minecraft: input.minecraft,\n installerPath,\n directory: input.directory,\n system: input.system,\n dataResolved,\n });\n\n const versionJsonPath = targetPaths.versionJson(input.directory, version.id);\n const versionJson: WriteVersionJsonAction = {\n kind: InstallActionKinds.WRITE_VERSION_JSON,\n path: versionJsonPath,\n content: `${JSON.stringify(version, null, 2)}\\n`,\n };\n\n return {\n installerDownload,\n libraryDownloads: dedupedDownloads,\n classpathFiles,\n processorActions,\n versionJson,\n versionId: version.id,\n profile,\n version,\n };\n};\n\nconst readJsonEntry = async <T>(zipPath: string, entryName: string): Promise<T> => {\n const buffer = await readEntryBuffer(zipPath, entryName);\n if (!buffer) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FORGE_INSTALLER_INVALID,\n `Forge installer is missing required entry: ${entryName}`,\n { context: { filePath: zipPath, entryName } },\n );\n }\n return parseJsonStrict<T>(buffer.toString(\"utf8\"), {\n code: MinecraftKitErrorCodes.FORGE_INSTALLER_INVALID,\n message: `Forge installer entry is not valid JSON: ${entryName}`,\n context: { filePath: zipPath, entryName },\n });\n};\n\nconst extractInstallerMavenEntries = async (\n installerPath: string,\n directory: string,\n): Promise<void> => {\n const reader = await openZip(installerPath);\n try {\n for await (const entry of reader.entries()) {\n if (!entry.name.startsWith(\"maven/\") || entry.isDirectory) continue;\n const relativeWithinLibraries = entry.name.slice(\"maven/\".length);\n const destination = path.join(targetPaths.librariesDir(directory), relativeWithinLibraries);\n const buffer = await entry.readBuffer();\n await atomicWrite(destination, buffer);\n }\n } finally {\n reader.close();\n }\n};\n\ntype ResolvedProfileData = {\n readonly tokens: Readonly<Record<string, ResolvedTokenValue>>;\n};\n\ntype ResolvedTokenValue = {\n /** Final string used in argument substitution. */\n readonly value: string;\n /** When true, the value is an on-disk path; otherwise it is a literal. */\n readonly isPath: boolean;\n};\n\nconst resolveProfileData = async (input: {\n readonly profile: ForgeInstallProfile;\n readonly installerPath: string;\n readonly directory: string;\n}): Promise<ResolvedProfileData> => {\n const tokens: Record<string, ResolvedTokenValue> = {};\n for (const [key, sided] of Object.entries(input.profile.data)) {\n const raw = sided.client;\n tokens[key] = await resolveDataValue(raw, input.installerPath, input.directory);\n }\n return { tokens };\n};\n\nconst resolveDataValue = async (\n raw: string,\n installerPath: string,\n directory: string,\n): Promise<ResolvedTokenValue> => {\n if (raw.startsWith(\"[\") && raw.endsWith(\"]\")) {\n const coord = raw.slice(1, -1);\n const relativePath = mavenRelativePathFor(coord);\n return {\n value: path.join(targetPaths.librariesDir(directory), relativePath),\n isPath: true,\n };\n }\n if (raw.startsWith(\"'\")) {\n return { value: raw.slice(1), isPath: false };\n }\n if (raw.startsWith(\"/\")) {\n const entryName = raw.slice(1);\n const destination = path.join(targetPaths.librariesDir(directory), \"forge-data\", entryName);\n await extractSingleEntry(installerPath, entryName, destination);\n return { value: destination, isPath: true };\n }\n return { value: raw, isPath: false };\n};\n\nconst buildProcessorActions = async (input: {\n readonly profile: ForgeInstallProfile;\n readonly minecraft: ResolvedMinecraft;\n readonly installerPath: string;\n readonly directory: string;\n readonly system: RuntimeSystem;\n readonly dataResolved: ResolvedProfileData;\n}): Promise<readonly RunForgeProcessorAction[]> => {\n const builtIns: Record<string, ResolvedTokenValue> = {\n SIDE: { value: \"client\", isPath: false },\n MINECRAFT_JAR: {\n value: targetPaths.versionJar(input.directory, input.minecraft.version),\n isPath: true,\n },\n MINECRAFT_VERSION: { value: input.minecraft.version, isPath: false },\n ROOT: { value: input.directory, isPath: true },\n INSTALLER: { value: input.installerPath, isPath: true },\n LIBRARY_DIR: { value: targetPaths.librariesDir(input.directory), isPath: true },\n };\n const tokens: Readonly<Record<string, ResolvedTokenValue>> = {\n ...builtIns,\n ...input.dataResolved.tokens,\n };\n const actions: RunForgeProcessorAction[] = [];\n let index = 0;\n for (const processor of input.profile.processors) {\n if (!processorAppliesToClient(processor)) {\n continue;\n }\n if (!evaluateRules([], { system: input.system })) {\n // Currently processors do not carry rules; placeholder for future expansion.\n }\n const action = buildProcessorAction({\n processor,\n directory: input.directory,\n tokens,\n index,\n });\n actions.push(action);\n index++;\n }\n return actions;\n};\n\nconst processorAppliesToClient = (processor: ForgeProcessor): boolean => {\n if (!processor.sides || processor.sides.length === 0) return true;\n return processor.sides.includes(\"client\");\n};\n\nconst buildProcessorAction = (input: {\n readonly processor: ForgeProcessor;\n readonly directory: string;\n readonly tokens: Readonly<Record<string, ResolvedTokenValue>>;\n readonly index: number;\n}): RunForgeProcessorAction => {\n const jarPath = path.join(\n targetPaths.librariesDir(input.directory),\n mavenRelativePathFor(input.processor.jar),\n );\n // Note: `Main-Class` is read from the JAR at runtime, not here. Newer Forge versions\n // ship some processor JARs as regular Maven libraries that haven't been downloaded\n // yet at planning time.\n const classpath = [\n jarPath,\n ...input.processor.classpath.map((coord) =>\n path.join(targetPaths.librariesDir(input.directory), mavenRelativePathFor(coord)),\n ),\n ];\n const args = input.processor.args.map((arg) => substituteToken(arg, input.tokens));\n const outputs: Record<string, string> = {};\n if (input.processor.outputs) {\n for (const [key, value] of Object.entries(input.processor.outputs)) {\n outputs[substituteToken(key, input.tokens)] = stripLiteralPrefix(\n substituteToken(value, input.tokens),\n );\n }\n }\n return {\n kind: InstallActionKinds.RUN_FORGE_PROCESSOR,\n index: input.index,\n classpath,\n args,\n outputs,\n };\n};\n\nconst substituteToken = (\n raw: string,\n tokens: Readonly<Record<string, ResolvedTokenValue>>,\n): string => {\n if (raw.startsWith(\"[\") && raw.endsWith(\"]\")) {\n return path.join(...mavenRelativePathFor(raw.slice(1, -1)).split(\"/\"));\n }\n return raw.replaceAll(/\\{([A-Z0-9_]+)\\}/g, (match, key: string) => {\n const token = tokens[key];\n if (token === undefined) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FORGE_INSTALLER_INVALID,\n `Unknown processor token: ${match}`,\n {\n context: { token: key },\n },\n );\n }\n return token.value;\n });\n};\n\n/** @internal */\nexport const stripLiteralPrefix = (value: string): string => {\n // Forge install_profile.json wraps literal values in single quotes (vs `{token}` /\n // `[g:a:v]` maven coords). Both quotes must be stripped.\n const stripped = value.startsWith(\"'\") ? value.slice(1) : value;\n return stripped.endsWith(\"'\") ? stripped.slice(0, -1) : stripped;\n};\n\n/** Build the Forge installer download URL. Used by repair flows that need to refetch. */\nexport const forgeInstallerUrl = (fullVersion: string): string => {\n return ApiEndpoints.forge.installer(fullVersion);\n};\n","import path from \"node:path\";\nimport { targetPaths } from \"../core/paths\";\nimport { fetchJson } from \"../http/metadata\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { HttpClient } from \"../types/http\";\nimport { type DownloadAction, DownloadCategories, InstallActionKinds } from \"../types/install\";\nimport type { ResolvedRuntime, RuntimeFilesManifest } from \"../types/runtime\";\n\n/** Plan the per-file downloads required to install a runtime. */\nexport const planRuntimeDownloads = async (input: {\n readonly runtime: ResolvedRuntime;\n readonly directory: string;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n}): Promise<{\n readonly actions: readonly DownloadAction[];\n readonly manifest: RuntimeFilesManifest;\n}> => {\n const manifest = await fetchJson<RuntimeFilesManifest>(input.http, input.cache, {\n url: input.runtime.manifestUrl,\n cacheKey: `runtime-manifest:${input.runtime.component}:${input.runtime.platformKey}:${input.runtime.manifestSha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const actions: DownloadAction[] = [];\n const runtimeRoot = targetPaths.runtimeRoot(\n input.directory,\n input.runtime.component,\n input.runtime.installRoot,\n );\n for (const [relativePath, entry] of Object.entries(manifest.files)) {\n if (entry.type !== \"file\") continue;\n const target = path.join(runtimeRoot, relativePath);\n actions.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: entry.downloads.raw.url,\n target,\n expectedSha1: entry.downloads.raw.sha1,\n expectedSize: entry.downloads.raw.size,\n category: DownloadCategories.RUNTIME_FILE,\n });\n }\n return { actions, manifest };\n};\n","import { targetPaths } from \"../core/paths\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport {\n DownloadCategories,\n type InstallAction,\n InstallActionKinds,\n type InstallPlan,\n} from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { Target } from \"../types/target\";\nimport { planAssetDownloads } from \"./assets\";\nimport { planFabricInstall } from \"./fabric-install\";\nimport { planForgeInstall } from \"./forge-install\";\nimport { planLibraryDownloads } from \"./libraries\";\nimport { planRuntimeDownloads } from \"./runtime\";\n\n/** Inputs to the install planner. */\nexport type PlanInstallInput = {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\n/** Build a flat install plan for the given target. */\nexport const planInstall = async (input: PlanInstallInput): Promise<InstallPlan> => {\n const { target } = input;\n const actions: InstallAction[] = [];\n\n // 1. Vanilla client jar.\n actions.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: target.minecraft.manifest.downloads.client.url,\n target: targetPaths.versionJar(target.directory, target.minecraft.version),\n expectedSha1: target.minecraft.manifest.downloads.client.sha1,\n expectedSize: target.minecraft.manifest.downloads.client.size,\n category: DownloadCategories.CLIENT_JAR,\n });\n\n // 2. Vanilla version JSON (write).\n actions.push({\n kind: InstallActionKinds.WRITE_VERSION_JSON,\n path: targetPaths.versionJson(target.directory, target.minecraft.version),\n content: `${JSON.stringify(target.minecraft.manifest, null, 2)}\\n`,\n });\n\n // 3. Vanilla libraries + native extractions.\n const vanillaLibraries = planLibraryDownloads({\n libraries: target.minecraft.manifest.libraries,\n directory: target.directory,\n system: target.runtime.system,\n versionId: target.minecraft.version,\n category: DownloadCategories.LIBRARY,\n });\n actions.push(...vanillaLibraries.downloads);\n actions.push(...vanillaLibraries.nativeExtractions);\n\n // 4. Asset index + objects.\n const assetPlan = await planAssetDownloads({\n directory: target.directory,\n assetIndex: target.minecraft.manifest.assetIndex,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n actions.push(...assetPlan.actions);\n\n // 5. Logging config.\n if (target.minecraft.manifest.logging?.client) {\n const logging = target.minecraft.manifest.logging.client;\n actions.push({\n kind: InstallActionKinds.DOWNLOAD_FILE,\n url: logging.file.url,\n target: targetPaths.loggingConfig(target.directory, logging.file.id),\n expectedSha1: logging.file.sha1,\n expectedSize: logging.file.size,\n category: DownloadCategories.LOGGING_CONFIG,\n });\n }\n\n // 6. Runtime files.\n const runtimePlan = await planRuntimeDownloads({\n runtime: target.runtime,\n directory: target.directory,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n actions.push(...runtimePlan.actions);\n\n // 7. Loader-specific extras.\n if (target.loader.type === Loaders.FABRIC) {\n const fabricPlan = planFabricInstall({\n loader: target.loader,\n minecraft: target.minecraft,\n directory: target.directory,\n system: target.runtime.system,\n });\n actions.push(fabricPlan.versionJson);\n actions.push(...fabricPlan.libraryDownloads);\n } else if (target.loader.type === Loaders.FORGE) {\n const forgePlan = await planForgeInstall({\n loader: target.loader,\n minecraft: target.minecraft,\n directory: target.directory,\n system: target.runtime.system,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n actions.push(forgePlan.installerDownload);\n actions.push(...forgePlan.libraryDownloads);\n actions.push(forgePlan.versionJson);\n actions.push(...forgePlan.processorActions);\n }\n\n const totalBytes = actions.reduce((sum, action) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return sum + (action.expectedSize ?? 0);\n }\n return sum;\n }, 0);\n\n return {\n targetId: target.id,\n directory: target.directory,\n target,\n actions,\n totalActions: actions.length,\n totalBytes,\n };\n};\n","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\nimport {AsyncResource} from '#async_hooks';\n\nexport default function pLimit(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tactiveCount++;\n\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\tqueue.enqueue(\n\t\t\tAsyncResource.bind(run.bind(undefined, function_, resolve, arguments_)),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// when the run function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\t\tqueue.dequeue()();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n","import crypto from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\n\n/** Compute the SHA-1 of a file on disk. Streams to keep memory usage flat. */\nexport const sha1OfFile = async (filePath: string): Promise<string> => {\n const hash = crypto.createHash(\"sha1\");\n const stream = createReadStream(filePath);\n try {\n await new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (chunk) => hash.update(chunk));\n stream.on(\"end\", resolve);\n stream.on(\"error\", reject);\n });\n } finally {\n if (!stream.destroyed) stream.destroy();\n }\n return hash.digest(\"hex\");\n};\n","import { MAX_PROCESSOR_STDERR_LINES } from \"../constants/defaults\";\nimport { readJarMainClass } from \"../core/archive\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { sha1OfFile } from \"../core/hash\";\nimport { EventTypes } from \"../types/events\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { RunForgeProcessorAction } from \"../types/install\";\nimport type { Spawner } from \"../types/spawner\";\n\n/** Inputs to {@link runProcessor}. */\nexport type RunProcessorInput = {\n readonly action: RunForgeProcessorAction;\n readonly javaPath: string;\n readonly spawner: Spawner;\n readonly onEvent?: ProgressListener;\n readonly total: number;\n};\n\n/** Execute a single Forge processor and verify its declared outputs. */\nexport const runProcessor = async (input: RunProcessorInput): Promise<void> => {\n const startedAt = Date.now();\n const mainClass = await resolveProcessorMainClass(input.action);\n emit(input, { type: EventTypes.FORGE_PROCESSOR_STARTED, index: input.action.index, mainClass });\n\n const exit = await spawnProcessor(input, mainClass);\n if (exit.code !== 0) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FORGE_PROCESSOR_FAILED,\n `Forge processor exited with code ${exit.code ?? \"(signal)\"}: ${mainClass}`,\n {\n context: {\n mainClass,\n stderr: exit.stderr,\n ...(exit.code !== null ? { exitCode: exit.code } : {}),\n },\n },\n );\n }\n input.onEvent?.({\n type: EventTypes.FORGE_PROCESSOR_COMPLETED,\n processor: { index: input.action.index, mainClass },\n exitCode: exit.code ?? 0,\n durationMs: Date.now() - startedAt,\n });\n\n await verifyProcessorOutputs(input, mainClass);\n};\n\nconst resolveProcessorMainClass = async (action: RunForgeProcessorAction): Promise<string> => {\n // Resolve Main-Class from the processor JAR (always classpath[0]) now that all\n // libraries have been downloaded. Deferring this from planning to runtime is what\n // lets newer Forge versions work, since their processor JARs ship as regular Maven\n // libraries instead of being bundled inside the installer.\n const processorJar = action.classpath[0];\n if (processorJar === undefined) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FORGE_INSTALLER_INVALID,\n \"Forge processor has an empty classpath\",\n { context: { processorIndex: action.index } },\n );\n }\n const mainClass = await readJarMainClass(processorJar);\n if (!mainClass) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FORGE_INSTALLER_INVALID,\n `Forge processor jar has no Main-Class: ${processorJar}`,\n { context: { filePath: processorJar } },\n );\n }\n return mainClass;\n};\n\ntype ProcessorExit = {\n readonly code: number | null;\n readonly stderr: string;\n};\n\nconst spawnProcessor = async (\n input: RunProcessorInput,\n mainClass: string,\n): Promise<ProcessorExit> => {\n const classpathSeparator = process.platform === \"win32\" ? \";\" : \":\";\n const args = [\n \"-cp\",\n input.action.classpath.join(classpathSeparator),\n mainClass,\n ...input.action.args,\n ];\n const stderrTail: string[] = [];\n const child = input.spawner.spawn(input.javaPath, args, { cwd: process.cwd() });\n child.stdout.on(\"data\", () => {\n // Forge processors print noisy progress to stdout; we don't surface it.\n });\n child.stderr.on(\"data\", (line) => {\n if (stderrTail.length >= MAX_PROCESSOR_STDERR_LINES) stderrTail.shift();\n stderrTail.push(line);\n });\n const exit = await child.exited;\n return { code: exit.code, stderr: stderrTail.join(\"\\n\") };\n};\n\nconst verifyProcessorOutputs = async (\n input: RunProcessorInput,\n mainClass: string,\n): Promise<void> => {\n for (const [outputPath, expectedSha1] of Object.entries(input.action.outputs)) {\n const sha1 = await sha1OfFile(outputPath);\n if (sha1 !== expectedSha1) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FORGE_PROCESSOR_FAILED,\n `Processor output hash mismatch: ${outputPath}`,\n { context: { filePath: outputPath, expectedHash: expectedSha1, actualHash: sha1 } },\n );\n }\n input.onEvent?.({\n type: EventTypes.FORGE_PROCESSOR_OUTPUT_VERIFIED,\n processor: { index: input.action.index, mainClass },\n path: outputPath,\n });\n }\n};\n\nconst emit = (\n input: RunProcessorInput,\n event: {\n type: typeof EventTypes.FORGE_PROCESSOR_STARTED;\n index: number;\n mainClass: string;\n },\n): void => {\n input.onEvent?.({\n type: event.type,\n processor: { index: event.index, mainClass: event.mainClass },\n total: input.total,\n });\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { ensureDir } from \"../core/fs\";\nimport { targetPaths } from \"../core/paths\";\nimport type { ResolvedRuntime, RuntimeFilesManifest } from \"../types/runtime\";\n\n/**\n * Materialize directory placeholders and symlinks declared by a runtime manifest.\n *\n * Plain file entries are handled by the regular downloader; this function fills in the\n * non-file entry types after the downloads have completed.\n */\nexport const materializeRuntimeExtras = async (input: {\n readonly runtime: ResolvedRuntime;\n readonly directory: string;\n readonly manifest: RuntimeFilesManifest;\n}): Promise<void> => {\n const root = targetPaths.runtimeRoot(\n input.directory,\n input.runtime.component,\n input.runtime.installRoot,\n );\n for (const [relativePath, entry] of Object.entries(input.manifest.files)) {\n const fullPath = path.join(root, relativePath);\n if (entry.type === \"directory\") {\n await ensureDir(fullPath);\n } else if (entry.type === \"link\") {\n await ensureDir(path.dirname(fullPath));\n await unlinkIfPresent(fullPath);\n await createLinkOrCopy(root, relativePath, entry.target, fullPath);\n } else if (entry.executable && process.platform !== \"win32\") {\n // chmod failure is non-fatal: the file may simply be on a filesystem that ignores mode\n // bits (FAT, SMB). The launcher will fail later with a clearer error if the binary is\n // truly not executable.\n await fs.chmod(fullPath, 0o755).catch(() => {});\n }\n }\n};\n\nconst unlinkIfPresent = async (target: string): Promise<void> => {\n try {\n await fs.unlink(target);\n } catch (cause) {\n if (isNotFound(cause)) return;\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FILESYSTEM_WRITE_ERROR,\n `Failed to remove stale runtime entry: ${target}`,\n { cause, context: { filePath: target } },\n );\n }\n};\n\nconst createLinkOrCopy = async (\n root: string,\n relativePath: string,\n linkTarget: string,\n destination: string,\n): Promise<void> => {\n try {\n await fs.symlink(linkTarget, destination);\n return;\n } catch (symlinkError) {\n // Symlinks are restricted on Windows and some filesystems. Fall back to copying the\n // resolved file. If copy ALSO fails the runtime is unusable, so we throw with both\n // failures attached as context.\n const absoluteSource = path.resolve(path.dirname(path.join(root, relativePath)), linkTarget);\n try {\n await fs.copyFile(absoluteSource, destination);\n } catch (copyError) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FILESYSTEM_WRITE_ERROR,\n `Failed to materialize runtime entry: ${destination}`,\n {\n cause: copyError,\n context: {\n filePath: destination,\n linkTarget,\n symlinkError: errorMessage(symlinkError),\n },\n },\n );\n }\n }\n};\n\nconst isNotFound = (error: unknown): boolean => {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code: unknown }).code === \"ENOENT\"\n );\n};\n\nconst errorMessage = (error: unknown): string => {\n return error instanceof Error ? error.message : String(error);\n};\n","import pLimit from \"p-limit\";\nimport { DOWNLOAD_CONCURRENCY } from \"../constants/defaults\";\nimport { checkpoint as runCheckpoint } from \"../core/abort\";\nimport { extractAllToDir } from \"../core/archive\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { atomicWrite } from \"../core/fs\";\nimport { targetPaths } from \"../core/paths\";\nimport type { PauseController } from \"../core/pause-controller\";\nimport { downloadFile } from \"../http/download\";\nimport type { MetadataCache } from \"../types/cache\";\nimport { EventTypes } from \"../types/events\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport {\n type DownloadAction,\n DownloadCategories,\n type DownloadCategory,\n type ExtractNativeAction,\n type InstallAction,\n InstallActionKinds,\n type InstallPlan,\n type InstallReport,\n type RunForgeProcessorAction,\n type WriteLoggingConfigAction,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport { type InstallPhase, InstallPhases } from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { Spawner } from \"../types/spawner\";\nimport type { OperatingSystem } from \"../types/system\";\nimport { runProcessor } from \"./processor\";\nimport { planRuntimeDownloads } from \"./runtime\";\nimport { materializeRuntimeExtras } from \"./runtime-extras\";\n\n/** Inputs to the install runner. */\nexport type RunInstallInput = {\n readonly plan: InstallPlan;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly spawner: Spawner;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n readonly concurrency?: number;\n /** Checkpoint between top-level actions and group transitions. Does not interrupt in-flight downloads. */\n readonly pauseController?: PauseController;\n /** When set, only download actions in this set run; post-download steps that depend on them are skipped too. */\n readonly actionCategories?: ReadonlySet<DownloadAction[\"category\"]>;\n};\n\n/** Download category → install phase mapping that runs each category as its own phase. */\nconst DOWNLOAD_GROUPS: ReadonlyArray<{\n readonly categories: ReadonlyArray<DownloadCategory>;\n readonly phase: InstallPhase;\n}> = [\n { categories: [DownloadCategories.RUNTIME_FILE], phase: InstallPhases.INSTALLING_RUNTIME },\n { categories: [DownloadCategories.CLIENT_JAR], phase: InstallPhases.DOWNLOADING_CLIENT_JAR },\n { categories: [DownloadCategories.LIBRARY], phase: InstallPhases.DOWNLOADING_LIBRARIES },\n { categories: [DownloadCategories.ASSET_INDEX], phase: InstallPhases.DOWNLOADING_ASSET_INDEX },\n { categories: [DownloadCategories.ASSET], phase: InstallPhases.DOWNLOADING_ASSETS },\n { categories: [DownloadCategories.LOGGING_CONFIG], phase: InstallPhases.WRITING_FILES },\n { categories: [DownloadCategories.FABRIC_LIBRARY], phase: InstallPhases.INSTALLING_FABRIC },\n {\n categories: [DownloadCategories.FORGE_INSTALLER, DownloadCategories.FORGE_LIBRARY],\n phase: InstallPhases.INSTALLING_FORGE,\n },\n];\n\ntype InstallCounters = {\n bytesDownloaded: number;\n actionsCompleted: number;\n actionsSkipped: number;\n};\n\ntype InstallRunnerContext = {\n readonly input: RunInstallInput;\n readonly counters: InstallCounters;\n readonly checkpoint: () => Promise<void>;\n readonly enterPhase: (phase: InstallPhase) => void;\n readonly limit: ReturnType<typeof pLimit>;\n};\n\ntype PlannedActions = {\n readonly downloads: readonly DownloadAction[];\n readonly natives: readonly ExtractNativeAction[];\n readonly writes: ReadonlyArray<WriteVersionJsonAction | WriteLoggingConfigAction>;\n readonly processors: readonly RunForgeProcessorAction[];\n};\n\n/** Execute an install plan. */\nexport const runInstall = async (input: RunInstallInput): Promise<InstallReport> => {\n const startedAt = Date.now();\n const counters: InstallCounters = { bytesDownloaded: 0, actionsCompleted: 0, actionsSkipped: 0 };\n const ctx = createContext(input, counters);\n\n ctx.enterPhase(InstallPhases.PLANNING);\n\n const plannedActions = partitionActions(input);\n await runDownloadsStage(ctx, plannedActions.downloads);\n await runWritesStage(ctx, plannedActions.writes);\n await runNativesStage(ctx, plannedActions.natives);\n await runRuntimeStage(ctx);\n await runProcessorsStage(ctx, plannedActions.processors);\n\n ctx.enterPhase(InstallPhases.COMPLETED);\n\n return {\n targetId: input.plan.targetId,\n bytesDownloaded: counters.bytesDownloaded,\n actionsCompleted: counters.actionsCompleted,\n actionsSkipped: counters.actionsSkipped,\n durationMs: Date.now() - startedAt,\n };\n};\n\nconst createContext = (input: RunInstallInput, counters: InstallCounters): InstallRunnerContext => {\n let currentPhase: InstallPhase | null = null;\n const enterPhase = (phase: InstallPhase): void => {\n if (phase === currentPhase) return;\n input.onEvent?.({ type: EventTypes.INSTALL_PHASE_CHANGED, phase, previous: currentPhase });\n currentPhase = phase;\n };\n const checkpoint = (): Promise<void> =>\n runCheckpoint(\n {\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.pauseController !== undefined ? { pauseController: input.pauseController } : {}),\n },\n \"Install aborted by signal\",\n );\n return {\n input,\n counters,\n checkpoint,\n enterPhase,\n limit: pLimit(input.concurrency ?? DOWNLOAD_CONCURRENCY),\n };\n};\n\nconst partitionActions = (input: RunInstallInput): PlannedActions => {\n const filter = input.actionCategories;\n return {\n downloads: input.plan.actions\n .filter(isDownload)\n .filter((a) => (filter ? filter.has(a.category) : true)),\n natives: input.plan.actions.filter(isNative),\n writes: input.plan.actions.filter(isWrite),\n processors: input.plan.actions.filter(isProcessor),\n };\n};\n\nconst runDownloadsStage = async (\n ctx: InstallRunnerContext,\n downloads: readonly DownloadAction[],\n): Promise<void> => {\n if (downloads.length === 0) return;\n for (const group of DOWNLOAD_GROUPS) {\n const groupActions = downloads.filter((action) => group.categories.includes(action.category));\n if (groupActions.length === 0) continue;\n await ctx.checkpoint();\n ctx.enterPhase(group.phase);\n await runDownloadGroup(ctx, groupActions);\n }\n // Categories not declared in DOWNLOAD_GROUPS fall back to the generic libraries phase, so a\n // newly-added download category does not silently skip its progress reporting.\n const ungrouped = downloads.filter(\n (action) => !DOWNLOAD_GROUPS.some((g) => g.categories.includes(action.category)),\n );\n if (ungrouped.length > 0) {\n await ctx.checkpoint();\n ctx.enterPhase(InstallPhases.DOWNLOADING_LIBRARIES);\n await runDownloadGroup(ctx, ungrouped);\n }\n};\n\nconst runDownloadGroup = async (\n ctx: InstallRunnerContext,\n groupActions: readonly DownloadAction[],\n): Promise<void> => {\n await Promise.all(\n groupActions.map((action) =>\n ctx.limit(async () => {\n await ctx.checkpoint();\n const result = await downloadFile(ctx.input.http, {\n url: action.url,\n target: action.target,\n ...(action.expectedSha1 !== undefined ? { expectedSha1: action.expectedSha1 } : {}),\n ...(action.expectedSize !== undefined ? { expectedSize: action.expectedSize } : {}),\n ...(action.category !== undefined ? { category: action.category } : {}),\n ...(ctx.input.signal !== undefined ? { signal: ctx.input.signal } : {}),\n ...(ctx.input.onEvent !== undefined ? { onEvent: ctx.input.onEvent } : {}),\n ...(ctx.input.pauseController !== undefined\n ? { pauseController: ctx.input.pauseController }\n : {}),\n });\n ctx.counters.bytesDownloaded += result.bytesDownloaded;\n if (result.skipped) ctx.counters.actionsSkipped++;\n ctx.counters.actionsCompleted++;\n }),\n ),\n );\n};\n\nconst runWritesStage = async (\n ctx: InstallRunnerContext,\n writes: ReadonlyArray<WriteVersionJsonAction | WriteLoggingConfigAction>,\n): Promise<void> => {\n if (writes.length === 0) return;\n await ctx.checkpoint();\n ctx.enterPhase(InstallPhases.WRITING_FILES);\n for (const action of writes) {\n await ctx.checkpoint();\n await atomicWrite(action.path, action.content);\n ctx.counters.actionsCompleted++;\n }\n};\n\nconst runNativesStage = async (\n ctx: InstallRunnerContext,\n natives: readonly ExtractNativeAction[],\n): Promise<void> => {\n if (natives.length === 0) return;\n await ctx.checkpoint();\n ctx.enterPhase(InstallPhases.EXTRACTING_NATIVES);\n for (const action of natives) {\n await ctx.checkpoint();\n const { fileCount } = await extractAllToDir(action.source, action.destination, {\n excludePrefixes: action.exclude as readonly string[],\n });\n ctx.input.onEvent?.({\n type: EventTypes.ARCHIVE_EXTRACTED,\n archive: action.source,\n target: action.destination,\n fileCount,\n });\n ctx.counters.actionsCompleted++;\n }\n};\n\nconst runRuntimeStage = async (ctx: InstallRunnerContext): Promise<void> => {\n const runtime = ctx.input.plan.target.runtime;\n if (runtime === undefined) return;\n await ctx.checkpoint();\n ctx.enterPhase(InstallPhases.INSTALLING_RUNTIME);\n const runtimePlan = await planRuntimeDownloads({\n runtime,\n directory: ctx.input.plan.directory,\n http: ctx.input.http,\n cache: ctx.input.cache,\n ...(ctx.input.signal !== undefined ? { signal: ctx.input.signal } : {}),\n });\n await materializeRuntimeExtras({\n runtime,\n directory: ctx.input.plan.directory,\n manifest: runtimePlan.manifest,\n });\n};\n\nconst runProcessorsStage = async (\n ctx: InstallRunnerContext,\n processors: readonly RunForgeProcessorAction[],\n): Promise<void> => {\n if (processors.length === 0) return;\n await ctx.checkpoint();\n ctx.enterPhase(InstallPhases.RUNNING_FORGE_PROCESSORS);\n const target = ctx.input.plan.target;\n if (target.loader?.type !== Loaders.FORGE) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.FORGE_PROCESSOR_FAILED,\n \"Forge processors planned for a non-Forge target\",\n );\n }\n const javaPath = targetPaths.runtimeJavaExecutable(\n ctx.input.plan.directory,\n target.runtime.component,\n target.runtime.system.os as OperatingSystem,\n target.runtime.installRoot,\n );\n for (const action of processors) {\n await ctx.checkpoint();\n await runProcessor({\n action,\n javaPath,\n spawner: ctx.input.spawner,\n ...(ctx.input.onEvent !== undefined ? { onEvent: ctx.input.onEvent } : {}),\n total: processors.length,\n });\n ctx.counters.actionsCompleted++;\n }\n};\n\nconst isDownload = (action: InstallAction): action is DownloadAction => {\n return action.kind === InstallActionKinds.DOWNLOAD_FILE;\n};\n\nconst isNative = (action: InstallAction): action is ExtractNativeAction => {\n return action.kind === InstallActionKinds.EXTRACT_NATIVE;\n};\n\nconst isProcessor = (action: InstallAction): action is RunForgeProcessorAction => {\n return action.kind === InstallActionKinds.RUN_FORGE_PROCESSOR;\n};\n\nconst isWrite = (\n action: InstallAction,\n): action is WriteVersionJsonAction | WriteLoggingConfigAction => {\n return (\n action.kind === InstallActionKinds.WRITE_VERSION_JSON ||\n action.kind === InstallActionKinds.WRITE_LOGGING_CONFIG\n );\n};\n","import type { MetadataCache } from \"../types/cache\";\nimport type { HttpClient } from \"../types/http\";\nimport type { InstallAction, InstallPlan, RuntimeOnlyInstallTarget } from \"../types/install\";\nimport type { ResolvedRuntime } from \"../types/runtime\";\nimport type { Target } from \"../types/target\";\nimport { planRuntimeDownloads } from \"./runtime\";\n\n/** Inputs to {@link planRuntimeInstall}. */\nexport type PlanRuntimeInstallInput = {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n};\n\n/**\n * Build an install plan that downloads ONLY the Java runtime declared by `target.runtime`.\n *\n * Useful when the consumer wants to provision a JRE without touching the rest of the\n * Minecraft installation (no client jar, no libraries, no assets). When `target.runtime.installRoot`\n * is set the runtime files land in a shared global location instead of the per-target folder.\n *\n * The returned plan is a regular {@link InstallPlan}, so it can be passed to the existing\n * install runner — directory placeholders and symlinks declared by the runtime manifest are\n * still materialized after downloads complete.\n */\nexport const planRuntimeInstall = async (input: PlanRuntimeInstallInput): Promise<InstallPlan> => {\n const runtimePlan = await planRuntimeDownloads({\n runtime: input.target.runtime,\n directory: input.target.directory,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const actions: readonly InstallAction[] = runtimePlan.actions;\n const totalBytes = runtimePlan.actions.reduce(\n (sum, action) => sum + (action.expectedSize ?? 0),\n 0,\n );\n return {\n targetId: input.target.id,\n directory: input.target.directory,\n target: input.target,\n actions,\n totalActions: actions.length,\n totalBytes,\n };\n};\n\n/** Inputs to {@link planStandaloneRuntimeInstall}. */\nexport type PlanStandaloneRuntimeInstallInput = {\n readonly id: string;\n /** Where the runtime files live. Used as `directory` if `runtime.installRoot` is unset. */\n readonly directory: string;\n readonly runtime: ResolvedRuntime;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n};\n\n/**\n * Plan a runtime-only install **without a Minecraft target**. Useful for \"Install Java/runtime\"\n * flows where the user just wants a JRE on disk and never had a Minecraft version to choose\n * from. The returned plan is shaped exactly like a normal {@link InstallPlan} but uses a\n * {@link RuntimeOnlyInstallTarget} that carries only the runtime + directory — the runner skips\n * Minecraft/loader-specific stages because they have no actions in this plan.\n */\nexport const planStandaloneRuntimeInstall = async (\n input: PlanStandaloneRuntimeInstallInput,\n): Promise<InstallPlan> => {\n const runtimePlan = await planRuntimeDownloads({\n runtime: input.runtime,\n directory: input.directory,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const actions: readonly InstallAction[] = runtimePlan.actions;\n const totalBytes = runtimePlan.actions.reduce(\n (sum, action) => sum + (action.expectedSize ?? 0),\n 0,\n );\n const target: RuntimeOnlyInstallTarget = {\n id: input.id,\n directory: input.directory,\n runtime: input.runtime,\n };\n return {\n targetId: input.id,\n directory: input.directory,\n target,\n actions,\n totalActions: actions.length,\n totalBytes,\n };\n};\n","/** JVM args appended for every launch. */\nexport const BASE_JVM_ARGS = [\n \"-XX:+UnlockExperimentalVMOptions\",\n \"-XX:+UseG1GC\",\n \"-XX:G1NewSizePercent=20\",\n \"-XX:G1ReservePercent=20\",\n \"-XX:MaxGCPauseMillis=50\",\n \"-XX:G1HeapRegionSize=32M\",\n] as const;\n\n/** JVM args added for legacy (≤1.12) versions that lack `arguments.jvm`. */\nexport const LEGACY_JVM_ARGS = [\n \"-Djava.library.path=${natives_directory}\",\n \"-Dminecraft.launcher.brand=${launcher_name}\",\n \"-Dminecraft.launcher.version=${launcher_version}\",\n \"-cp\",\n \"${classpath}\",\n] as const;\n\n/** macOS-only JVM args (suppress dock label). */\nexport const MACOS_JVM_ARGS = [\"-Xdock:name=Minecraft\"] as const;\n","import { evaluateRules } from \"../core/rules\";\nimport type { ArgumentEntry, MinecraftArguments } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\n\n/** Flatten a modern `arguments.{game|jvm}` array, evaluating rules. */\nexport const flattenArguments = (\n entries: readonly ArgumentEntry[],\n context: {\n readonly system: RuntimeSystem;\n readonly features?: Readonly<Record<string, boolean>>;\n },\n): readonly string[] => {\n const result: string[] = [];\n for (const entry of entries) {\n if (typeof entry === \"string\") {\n result.push(entry);\n continue;\n }\n if (!evaluateRules(entry.rules, context)) continue;\n if (typeof entry.value === \"string\") {\n result.push(entry.value);\n } else {\n result.push(...entry.value);\n }\n }\n return result;\n};\n\n/** Split a legacy minecraftArguments string into an array. */\nexport const splitLegacyArguments = (raw: string): readonly string[] => {\n return raw.trim().length === 0 ? [] : raw.trim().split(/\\s+/);\n};\n\n/** Convenience: pull both game and jvm arrays from a modern arguments object. */\nexport const pickArguments = (\n args: MinecraftArguments | undefined,\n context: {\n readonly system: RuntimeSystem;\n readonly features?: Readonly<Record<string, boolean>>;\n },\n): { readonly game: readonly string[]; readonly jvm: readonly string[] } => {\n return {\n game: flattenArguments(args?.game ?? [], context),\n jvm: flattenArguments(args?.jvm ?? [], context),\n };\n};\n","import type { Logger } from \"../types/logger\";\n\n// Sources: --sun-misc-unsafe-memory-access (JEP 471/498), --enable-native-access\n// (JEP 412 incubator/454 final), -XX:+UseCompactObjectHeaders (JEP 450),\n// -XX:+UseZGC (production since Java 15). Match by prefix to cover `--flag=v`\n// and `--flag v` forms.\nconst FLAG_MIN_JAVA: ReadonlyArray<{ readonly prefix: string; readonly minJava: number }> = [\n { prefix: \"--sun-misc-unsafe-memory-access\", minJava: 23 },\n { prefix: \"--enable-native-access\", minJava: 17 },\n { prefix: \"-XX:+UseCompactObjectHeaders\", minJava: 24 },\n { prefix: \"-XX:+UseZGC\", minJava: 15 },\n];\n\nexport type FilterArgsInput = {\n readonly args: readonly string[];\n readonly javaMajor: number;\n readonly logger?: Logger;\n};\n\n/** Drop JVM flags the chosen Java version cannot parse (safety net against pinned newer flags). */\nexport const filterArgsForJava = (input: FilterArgsInput): readonly string[] => {\n if (!Number.isFinite(input.javaMajor) || input.javaMajor <= 0) return input.args;\n const out: string[] = [];\n for (const arg of input.args) {\n const incompatible = FLAG_MIN_JAVA.find(\n ({ prefix }) =>\n arg === prefix || arg.startsWith(`${prefix}=`) || arg.startsWith(`${prefix} `),\n );\n if (incompatible && input.javaMajor < incompatible.minJava) {\n input.logger?.log(\n \"warn\",\n `Dropping JVM arg \"${arg}\" — requires Java ${incompatible.minJava}, runtime is Java ${input.javaMajor}`,\n { flag: arg, minJava: incompatible.minJava, runtimeJava: input.javaMajor },\n );\n continue;\n }\n out.push(arg);\n }\n return out;\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\n\n/** Substitute `${...}` placeholders in a single argument. */\nexport const substituteArg = (raw: string, values: Readonly<Record<string, string>>): string => {\n return raw.replaceAll(/\\$\\{([a-zA-Z0-9_]+)\\}/g, (match, key: string) => {\n const value = values[key];\n if (value === undefined) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `Unknown launch placeholder: ${match}`,\n {\n context: { placeholder: key },\n },\n );\n }\n return value;\n });\n};\n\n/** Substitute placeholders in every entry of an arguments list. */\nexport const substituteArgs = (\n args: readonly string[],\n values: Readonly<Record<string, string>>,\n): readonly string[] => {\n return args.map((arg) => substituteArg(arg, values));\n};\n","import { DEFAULT_MAX_MB, DEFAULT_MIN_MB } from \"../constants/defaults\";\nimport { BASE_JVM_ARGS, LEGACY_JVM_ARGS, MACOS_JVM_ARGS } from \"../constants/launch\";\nimport { silentLogger } from \"../core/logger\";\nimport { targetPaths } from \"../core/paths\";\nimport type { LaunchOptions } from \"../types/launch\";\nimport type { Logger } from \"../types/logger\";\nimport type { MinecraftVersionManifest } from \"../types/minecraft\";\nimport type { Target } from \"../types/target\";\nimport { pickArguments, splitLegacyArguments } from \"./arguments\";\nimport { filterArgsForJava } from \"./jvm-compat\";\nimport { substituteArgs } from \"./placeholders\";\n\n/** Output of {@link composeArgs}. */\nexport type ComposedArgs = {\n readonly jvmArgs: readonly string[];\n readonly gameArgs: readonly string[];\n};\n\n/**\n * Build the final JVM and game argument lists for a launch. The order is:\n *\n * jvmArgs = memory + base + macos + manifest-jvm + (logging) + caller-extra\n * gameArgs = manifest-game + caller-extra + (resolution/fullscreen)\n *\n * Caller-extra entries land last so the user can override anything emitted by the manifest\n * (last-wins for JVM `-Xms`/`-Xmx`, additive for game args).\n */\nexport const composeArgs = (input: {\n readonly target: Target;\n readonly merged: MinecraftVersionManifest;\n readonly options: LaunchOptions;\n readonly placeholderValues: Readonly<Record<string, string>>;\n readonly features: Readonly<Record<string, boolean>>;\n readonly logger?: Logger;\n}): ComposedArgs => {\n const minMb = input.options.memory?.minMb ?? DEFAULT_MIN_MB;\n const maxMb = input.options.memory?.maxMb ?? DEFAULT_MAX_MB;\n const memoryArgs = [`-Xms${minMb}M`, `-Xmx${maxMb}M`];\n const ruleContext = { system: input.target.runtime.system, features: input.features };\n\n let rawJvm: readonly string[];\n let rawGame: readonly string[];\n if (input.merged.arguments) {\n const picked = pickArguments(input.merged.arguments, ruleContext);\n rawJvm = picked.jvm;\n rawGame = picked.game;\n } else if (input.merged.minecraftArguments) {\n rawJvm = LEGACY_JVM_ARGS;\n rawGame = splitLegacyArguments(input.merged.minecraftArguments);\n } else {\n rawJvm = [];\n rawGame = [];\n }\n\n const macosArgs = input.target.runtime.system.os === \"osx\" ? MACOS_JVM_ARGS : [];\n const baseJvm = [...memoryArgs, ...BASE_JVM_ARGS, ...macosArgs];\n const substitutedJvm = substituteArgs(rawJvm, input.placeholderValues);\n const substitutedGame = substituteArgs(rawGame, input.placeholderValues);\n // Base + macOS args are static and known-safe; only manifest args get filtered.\n const javaMajor = input.target.runtime.majorVersion;\n const filteredManifestJvm =\n javaMajor !== undefined\n ? filterArgsForJava({\n args: substitutedJvm,\n javaMajor,\n logger: input.logger ?? silentLogger,\n })\n : substitutedJvm;\n const jvmArgs = [...baseJvm, ...filteredManifestJvm];\n\n if (input.merged.logging?.client?.argument) {\n const logging = input.merged.logging.client;\n const loggingArg = substituteArgs([logging.argument], {\n ...input.placeholderValues,\n path: targetPaths.loggingConfig(input.target.directory, logging.file.id),\n })[0];\n if (loggingArg !== undefined) jvmArgs.push(loggingArg);\n }\n\n const extraJvm = input.options.extraJvmArgs ?? [];\n const extraGame = input.options.extraGameArgs ?? [];\n const gameArgs = [...substitutedGame, ...extraGame];\n\n if (input.options.fullscreen === true) gameArgs.push(\"--fullscreen\");\n if (input.options.resolution !== undefined && rawGame.every((a) => !a.includes(\"--width\"))) {\n gameArgs.push(\n \"--width\",\n input.options.resolution.width.toString(),\n \"--height\",\n input.options.resolution.height.toString(),\n );\n }\n\n return { jvmArgs: [...jvmArgs, ...extraJvm], gameArgs };\n};\n","import path from \"node:path\";\nimport { mavenRelativePath, parseMavenCoordinate } from \"../core/maven\";\nimport { targetPaths } from \"../core/paths\";\nimport { evaluateRules } from \"../core/rules\";\nimport type { MinecraftLibrary, MinecraftVersionManifest } from \"../types/minecraft\";\nimport type { RuntimeSystem } from \"../types/system\";\n\n/** Build the classpath entries for a launch. */\nexport const buildClasspath = (input: {\n readonly directory: string;\n readonly versionId: string;\n readonly merged: MinecraftVersionManifest;\n readonly system: RuntimeSystem;\n}): readonly string[] => {\n const seen = new Set<string>();\n const entries: string[] = [];\n for (const library of input.merged.libraries) {\n if (library.natives) continue;\n if (!evaluateRules(library.rules, { system: input.system })) continue;\n const relative = relativeFor(library);\n if (!relative) continue;\n const absolute = path.join(targetPaths.librariesDir(input.directory), relative);\n if (seen.has(absolute)) continue;\n seen.add(absolute);\n entries.push(absolute);\n }\n const versionJar = targetPaths.versionJar(input.directory, input.versionId);\n if (!seen.has(versionJar)) entries.push(versionJar);\n return entries;\n};\n\nconst relativeFor = (library: MinecraftLibrary): string | null => {\n if (library.downloads?.artifact?.path) return library.downloads.artifact.path;\n if (library.name) {\n const coord = parseMavenCoordinate(library.name);\n return mavenRelativePath(coord);\n }\n return null;\n};\n","import crypto from \"node:crypto\";\n\n/**\n * Derive a stable v3-style UUID for an offline player username.\n *\n * Mojang's offline-mode formula: `MD5(\"OfflinePlayer:\" + name)` with the version/variant\n * bits patched to UUID v3.\n */\nexport const offlineUuidFor = (username: string): string => {\n const md5 = crypto.createHash(\"md5\");\n md5.update(`OfflinePlayer:${username}`, \"utf8\");\n const bytes = md5.digest();\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x30; // v3\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant\n return formatUuid(bytes);\n};\n\nconst formatUuid = (bytes: Buffer): string => {\n const hex = bytes.toString(\"hex\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;\n};\n\n/** Strip the dashes from a UUID. Used by `${auth_uuid}`. */\nexport const stripUuidDashes = (uuid: string): string => {\n return uuid.replaceAll(\"-\", \"\");\n};\n","import path from \"node:path\";\nimport { DEFAULT_LAUNCHER_NAME, DEFAULT_LAUNCHER_VERSION } from \"../constants/defaults\";\nimport { ASSETS_DIR, ASSETS_LEGACY_DIR, LIBRARIES_DIR } from \"../constants/files\";\nimport { targetPaths } from \"../core/paths\";\nimport { offlineUuidFor, stripUuidDashes } from \"../core/uuid\";\nimport { AuthModes, type LaunchAuth } from \"../types/auth\";\nimport type { LaunchOptions } from \"../types/launch\";\nimport type { Target } from \"../types/target\";\n\n/** Resolve every `${...}` value the launch arguments substitute against. */\nexport const buildPlaceholderValues = (input: {\n readonly target: Target;\n readonly versionId: string;\n readonly auth: LaunchAuth;\n readonly classpath: readonly string[];\n readonly options: LaunchOptions;\n}): Readonly<Record<string, string>> => {\n const cpSeparator = process.platform === \"win32\" ? \";\" : \":\";\n const directory = input.target.directory;\n const username = input.auth.username;\n const uuid =\n input.auth.mode === AuthModes.OFFLINE\n ? (input.auth.uuid ?? offlineUuidFor(username))\n : input.auth.uuid;\n const accessToken = input.auth.mode === AuthModes.OFFLINE ? \"0\" : input.auth.accessToken;\n const userType =\n input.auth.mode === AuthModes.OFFLINE ? \"legacy\" : (input.auth.userType ?? \"msa\");\n const launcherName = input.options.launcherName ?? DEFAULT_LAUNCHER_NAME;\n const launcherVersion = input.options.launcherVersion ?? DEFAULT_LAUNCHER_VERSION;\n return {\n auth_player_name: username,\n version_name: input.versionId,\n game_directory: directory,\n assets_root: path.join(directory, ASSETS_DIR),\n assets_index_name: input.target.minecraft.manifest.assets,\n auth_uuid: stripUuidDashes(uuid),\n auth_access_token: accessToken,\n auth_session: `token:${accessToken}:${stripUuidDashes(uuid)}`,\n clientid: input.auth.mode === AuthModes.ONLINE ? (input.auth.clientId ?? \"\") : \"\",\n auth_xuid: input.auth.mode === AuthModes.ONLINE ? (input.auth.xuid ?? \"\") : \"\",\n user_type: userType,\n user_properties: \"{}\",\n version_type: input.target.minecraft.channel,\n game_assets: path.join(directory, ASSETS_LEGACY_DIR),\n natives_directory: targetPaths.nativesDir(directory, input.target.minecraft.version),\n classpath: input.classpath.join(cpSeparator),\n classpath_separator: cpSeparator,\n library_directory: path.join(directory, LIBRARIES_DIR),\n launcher_name: launcherName,\n launcher_version: launcherVersion,\n resolution_width: input.options.resolution?.width.toString() ?? \"\",\n resolution_height: input.options.resolution?.height.toString() ?? \"\",\n };\n};\n","import type {\n ArgumentEntry,\n MinecraftArguments,\n MinecraftLibrary,\n MinecraftVersionManifest,\n} from \"../types/minecraft\";\nimport { parseMavenCoordinate } from \"./maven\";\n\n/**\n * Merge a child Minecraft version manifest with its parent (resolved through `inheritsFrom`).\n *\n * Rules:\n * - Scalar fields (`mainClass`, `assetIndex`, `assets`, `type`, `minecraftArguments`,\n * `javaVersion`, `logging`) — child overrides parent when defined, otherwise parent value.\n * - `libraries` — deduped by `group:artifact[:classifier]` with child winning. Fabric's\n * Knot loader and modern Forge ship version-pinned copies of intrinsic libraries\n * (ASM, mixin, intermediary, …) that must replace vanilla's copies on the classpath.\n * - `arguments.game` / `arguments.jvm` — additive concat.\n * - `downloads` — shallow merge; child wins on conflict.\n */\nexport const mergeManifest = (\n parent: MinecraftVersionManifest,\n child: MinecraftVersionManifest,\n): MinecraftVersionManifest => {\n const args = mergeArguments(parent.arguments, child.arguments);\n const minecraftArguments = child.minecraftArguments ?? parent.minecraftArguments;\n const javaVersion = child.javaVersion ?? parent.javaVersion;\n const logging = child.logging ?? parent.logging;\n const inheritsFrom = child.inheritsFrom ?? parent.inheritsFrom;\n const releaseTime = child.releaseTime ?? parent.releaseTime;\n const time = child.time ?? parent.time;\n const minimumLauncherVersion = child.minimumLauncherVersion ?? parent.minimumLauncherVersion;\n const complianceLevel = child.complianceLevel ?? parent.complianceLevel;\n return {\n id: child.id || parent.id,\n type: child.type ?? parent.type,\n mainClass: child.mainClass ?? parent.mainClass,\n assetIndex: child.assetIndex ?? parent.assetIndex,\n assets: child.assets ?? parent.assets,\n downloads: { ...parent.downloads, ...child.downloads },\n libraries: mergeLibraries(parent.libraries, child.libraries),\n ...(args !== undefined ? { arguments: args } : {}),\n ...(minecraftArguments !== undefined ? { minecraftArguments } : {}),\n ...(javaVersion !== undefined ? { javaVersion } : {}),\n ...(logging !== undefined ? { logging } : {}),\n ...(inheritsFrom !== undefined ? { inheritsFrom } : {}),\n ...(releaseTime !== undefined ? { releaseTime } : {}),\n ...(time !== undefined ? { time } : {}),\n ...(minimumLauncherVersion !== undefined ? { minimumLauncherVersion } : {}),\n ...(complianceLevel !== undefined ? { complianceLevel } : {}),\n };\n};\n\nconst libraryDedupeKey = (library: MinecraftLibrary): string | null => {\n if (!library.name) return null;\n try {\n const coord = parseMavenCoordinate(library.name);\n const classifier = coord.classifier ? `:${coord.classifier}` : \"\";\n return `${coord.group}:${coord.artifact}${classifier}`;\n } catch {\n return null;\n }\n};\n\nconst mergeLibraries = (\n parent: readonly MinecraftLibrary[],\n child: readonly MinecraftLibrary[],\n): readonly MinecraftLibrary[] => {\n // Fabric Knot's classpath verifier rejects two copies of intrinsic libraries\n // (ASM, mixin, intermediary, …). Dedupe by `group:artifact[:classifier]` with\n // child winning — loader profiles pin versions compatible with themselves.\n // Libraries without a parseable Maven coordinate fall through to a separate\n // bucket so their ordering relative to others is preserved.\n const byKey = new Map<string, MinecraftLibrary>();\n const unkeyed: MinecraftLibrary[] = [];\n for (const lib of [...parent, ...child]) {\n const key = libraryDedupeKey(lib);\n if (key === null) {\n unkeyed.push(lib);\n continue;\n }\n byKey.set(key, lib);\n }\n return [...byKey.values(), ...unkeyed];\n};\n\nconst mergeArguments = (\n parent: MinecraftArguments | undefined,\n child: MinecraftArguments | undefined,\n): MinecraftArguments | undefined => {\n if (!parent && !child) return undefined;\n const parentGame: readonly ArgumentEntry[] = parent?.game ?? [];\n const parentJvm: readonly ArgumentEntry[] = parent?.jvm ?? [];\n const childGame: readonly ArgumentEntry[] = child?.game ?? [];\n const childJvm: readonly ArgumentEntry[] = child?.jvm ?? [];\n return {\n game: [...parentGame, ...childGame],\n jvm: [...parentJvm, ...childJvm],\n };\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { fileExists, listChildDirectories, readText } from \"../core/fs\";\nimport { parseJsonOrUndefined, parseJsonStrict } from \"../core/json\";\nimport { mergeManifest } from \"../core/manifest-merge\";\nimport { targetPaths } from \"../core/paths\";\nimport { Loaders } from \"../types/loader\";\nimport type { MinecraftVersionManifest } from \"../types/minecraft\";\nimport type { Target } from \"../types/target\";\n\n/** Result of resolving the on-disk version JSON for a target. */\nexport type ResolvedLaunchVersion = {\n /** Topmost version id (the one used as `${version_name}` and for the natives directory). */\n readonly versionId: string;\n /** Merged manifest with `inheritsFrom` chain folded together. */\n readonly merged: MinecraftVersionManifest;\n /** Inherits-from chain from top (`versionId`) down to the root vanilla version. */\n readonly chain: readonly string[];\n};\n\n/** Read the installed version JSON appropriate for a target's loader and merge inheritsFrom. */\nexport const resolveLaunchVersion = async (target: Target): Promise<ResolvedLaunchVersion> => {\n if (target.loader.type === Loaders.VANILLA) {\n return {\n versionId: target.minecraft.version,\n merged: target.minecraft.manifest,\n chain: [target.minecraft.version],\n };\n }\n const versionId = await pickInstalledVersionId(target);\n const merged = await loadAndMerge(target.directory, versionId, target.minecraft.manifest);\n // Fabric and modern Forge inherit directly from vanilla — a two-level chain.\n return { versionId, merged, chain: [versionId, target.minecraft.version] };\n};\n\n/**\n * Pick the version id whose `versions/<id>/<id>.jar` should land on the launch classpath.\n * Walks the inherits-from chain from top to root and returns the first id whose jar exists\n * on disk. Falls back to the root id when nothing is materialised yet.\n *\n * Why: Fabric's profile id is `fabric-loader-0.14.21-1.20.1`, but Fabric does not produce a\n * matching `.jar`; the loader expects the **vanilla** client jar on the classpath and hooks\n * it via `KnotClient`. Modern Forge similarly leaves `versions/<forge-id>/<forge-id>.jar`\n * absent and routes the patched client jar through `libraries/`. Walking the chain picks\n * the right id for both shapes without special-casing.\n */\nexport const pickClientJarVersionId = async (\n directory: string,\n chain: readonly string[],\n): Promise<string> => {\n for (const id of chain) {\n const jar = targetPaths.versionJar(directory, id);\n if (await fileExists(jar)) return id;\n }\n const fallback = chain.at(-1);\n if (fallback === undefined) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_NOT_FOUND,\n \"Cannot resolve a client jar version id from an empty inheritsFrom chain\",\n );\n }\n // Nothing on disk yet — fall back to the root vanilla id so the launch composition still\n // produces a valid path; install/repair will materialise the jar before run-time.\n return fallback;\n};\n\nconst pickInstalledVersionId = async (target: Target): Promise<string> => {\n if (target.loader.type === Loaders.FABRIC) {\n const candidate = target.loader.profile.id;\n const versionJsonPath = targetPaths.versionJson(target.directory, candidate);\n if (await fileExists(versionJsonPath)) return candidate;\n }\n if (target.loader.type === Loaders.FORGE) {\n const directories = await listChildDirectories(targetPaths.versionsDir(target.directory));\n for (const id of directories) {\n const versionJsonPath = targetPaths.versionJson(target.directory, id);\n if (!(await fileExists(versionJsonPath))) continue;\n const text = await readText(versionJsonPath);\n const parsed = parseJsonOrUndefined<{ inheritsFrom?: string; id?: string }>(text);\n if (\n parsed?.inheritsFrom === target.minecraft.version &&\n (id.includes(\"forge\") || (parsed.id ?? \"\").includes(\"forge\"))\n ) {\n return id;\n }\n }\n }\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_NOT_FOUND,\n `Could not find an installed version JSON for target ${target.id}`,\n { context: { targetId: target.id, loaderType: target.loader.type } },\n );\n};\n\nconst loadAndMerge = async (\n directory: string,\n versionId: string,\n parentManifest: MinecraftVersionManifest,\n): Promise<MinecraftVersionManifest> => {\n const versionJsonPath = targetPaths.versionJson(directory, versionId);\n const text = await readText(versionJsonPath);\n const child = parseJsonStrict<MinecraftVersionManifest>(text, {\n code: MinecraftKitErrorCodes.MANIFEST_INVALID,\n message: `Version JSON is not valid JSON: ${versionJsonPath}`,\n context: { filePath: versionJsonPath },\n });\n if (child.inheritsFrom !== undefined && child.inheritsFrom !== parentManifest.id) {\n // Recursive merge through any chain — but in practice Forge/Fabric inherit directly from vanilla.\n return mergeManifest(parentManifest, child);\n }\n return mergeManifest(parentManifest, child);\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { silentLogger } from \"../core/logger\";\nimport { targetPaths } from \"../core/paths\";\nimport type { LaunchComposition, LaunchOptions } from \"../types/launch\";\nimport type { Logger } from \"../types/logger\";\nimport type { Target } from \"../types/target\";\nimport { composeArgs } from \"./args-composition\";\nimport { buildClasspath } from \"./classpath\";\nimport { buildPlaceholderValues } from \"./placeholder-values\";\nimport { pickClientJarVersionId, resolveLaunchVersion } from \"./version-resolution\";\n\nexport type ComposeLaunchInput = {\n readonly target: Target;\n readonly options: LaunchOptions;\n /** Surfaces non-fatal compose-time warnings; defaults to silent. */\n readonly logger?: Logger;\n};\n\n/** Build a fully resolved {@link LaunchComposition} ready to hand to {@link runLaunch}. */\nexport const composeLaunch = async (input: ComposeLaunchInput): Promise<LaunchComposition> => {\n const { target, options } = input;\n if (!options.auth.username || options.auth.username.length === 0) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `Auth username must be non-empty (target ${target.id})`,\n { context: { targetId: target.id } },\n );\n }\n\n const resolved = await resolveLaunchVersion(target);\n const javaPath = targetPaths.runtimeJavaExecutable(\n target.directory,\n target.runtime.component,\n target.runtime.system.os,\n target.runtime.installRoot,\n );\n\n // Walk the inheritsFrom chain to find the version id whose `.jar` actually exists on\n // disk: Fabric and modern Forge leave their own `versions/<id>/<id>.jar` absent and\n // expect the vanilla client jar to land on the classpath instead.\n const clientJarVersionId = await pickClientJarVersionId(target.directory, resolved.chain);\n const classpath = buildClasspath({\n directory: target.directory,\n versionId: clientJarVersionId,\n merged: resolved.merged,\n system: target.runtime.system,\n });\n\n const features = buildFeatures(options);\n const placeholderValues = buildPlaceholderValues({\n target,\n versionId: resolved.versionId,\n auth: options.auth,\n classpath,\n options,\n });\n const composed = composeArgs({\n target,\n merged: resolved.merged,\n options,\n placeholderValues,\n features,\n logger: input.logger ?? silentLogger,\n });\n\n return {\n targetId: target.id,\n directory: target.directory,\n javaPath,\n mainClass: resolved.merged.mainClass,\n jvmArgs: composed.jvmArgs,\n gameArgs: composed.gameArgs,\n classpath,\n nativesDirectory: targetPaths.nativesDir(target.directory, target.minecraft.version),\n auth: options.auth,\n workingDirectory: target.directory,\n };\n};\n\nconst buildFeatures = (options: LaunchOptions): Readonly<Record<string, boolean>> => {\n const features: Record<string, boolean> = { ...(options.features ?? {}) };\n if (options.resolution !== undefined) {\n features.has_custom_resolution = true;\n }\n return features;\n};\n","import { DEFAULT_KILL_GRACE_MS } from \"../constants/defaults\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { EventTypes } from \"../types/events\";\nimport type {\n LaunchComposition,\n LaunchExit,\n LaunchRunOptions,\n LaunchSession,\n} from \"../types/launch\";\nimport type { Spawner } from \"../types/spawner\";\n\n/** Inputs to {@link runLaunch}. */\nexport type RunLaunchInput = {\n readonly composition: LaunchComposition;\n readonly options?: LaunchRunOptions;\n readonly spawner: Spawner;\n};\n\n/**\n * Spawn the configured Java process. Returns a {@link LaunchSession} immediately after the\n * process is created; the `exited` promise resolves when the game terminates.\n */\nexport const runLaunch = (input: RunLaunchInput): LaunchSession => {\n const composition = input.composition;\n const options = input.options ?? {};\n const args = [...composition.jvmArgs, composition.mainClass, ...composition.gameArgs];\n options.onEvent?.({\n type: EventTypes.LAUNCH_STARTING,\n command: composition.javaPath,\n args,\n cwd: composition.workingDirectory,\n });\n const child = input.spawner.spawn(composition.javaPath, args, {\n cwd: composition.workingDirectory,\n ...(composition.env !== undefined ? { env: composition.env } : {}),\n });\n options.onEvent?.({ type: EventTypes.LAUNCH_STARTED, pid: child.pid });\n child.stdout.on(\"data\", (line) => {\n options.onEvent?.({ type: EventTypes.LAUNCH_STDOUT, line });\n });\n child.stderr.on(\"data\", (line) => {\n options.onEvent?.({ type: EventTypes.LAUNCH_STDERR, line });\n });\n\n const grace = options.killGracePeriodMs ?? DEFAULT_KILL_GRACE_MS;\n let aborted = false;\n const doAbort = (reason: string): void => {\n if (aborted) return;\n aborted = true;\n options.onEvent?.({ type: EventTypes.LAUNCH_ABORTED, reason });\n // Both kill calls are unconditional. Node's child_process treats a kill against a dead\n // process as a no-op, so guarding against the first return value adds no safety and\n // creates asymmetry with the SIGKILL path.\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), grace).unref();\n };\n\n if (options.signal !== undefined) {\n if (options.signal.aborted) {\n doAbort(reasonFrom(options.signal.reason));\n } else {\n options.signal.addEventListener(\"abort\", () => doAbort(reasonFrom(options.signal?.reason)), {\n once: true,\n });\n }\n }\n\n const exited: Promise<LaunchExit> = (async () => {\n const { code, signal } = await child.exited;\n options.onEvent?.({ type: EventTypes.LAUNCH_EXITED, code, signal });\n if (!aborted && code !== 0 && code !== null) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.LAUNCH_PROCESS_FAILED,\n `Minecraft process exited with code ${code}`,\n { context: { exitCode: code } },\n );\n }\n return { code, signal, aborted };\n })();\n\n return {\n pid: child.pid,\n exited,\n abort(reason?: string): void {\n doAbort(reason ?? \"user\");\n },\n };\n};\n\nconst reasonFrom = (value: unknown): string => {\n if (value === undefined) return \"aborted\";\n if (typeof value === \"string\") return value;\n if (value instanceof Error) return value.message;\n return String(value);\n};\n","import { Buffer } from \"node:buffer\";\nimport { spawn } from \"node:child_process\";\nimport { SPAWNER_MAX_LINE_BYTES } from \"../constants/defaults\";\nimport type { ProcessStream, SpawnOptions, SpawnedProcess, Spawner } from \"../types/spawner\";\n\n/** Default spawner backed by `node:child_process.spawn`. */\nexport class ChildProcessSpawner implements Spawner {\n spawn(command: string, args: readonly string[], options: SpawnOptions): SpawnedProcess {\n const child = spawn(command, [...args], {\n cwd: options.cwd,\n env: options.env === undefined ? process.env : { ...process.env, ...options.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const stdout = streamFromBuffer(child.stdout);\n const stderr = streamFromBuffer(child.stderr);\n const exited = new Promise<{\n readonly code: number | null;\n readonly signal: NodeJS.Signals | null;\n }>((resolve) => {\n child.once(\"exit\", (code, signal) => resolve({ code, signal }));\n });\n return {\n pid: child.pid ?? -1,\n stdout,\n stderr,\n exited,\n kill(signal): boolean {\n return child.kill(signal);\n },\n };\n }\n}\n\nconst streamFromBuffer = (stream: NodeJS.ReadableStream | null): ProcessStream => {\n if (!stream) {\n return { on() {} };\n }\n let buffer = \"\";\n const listeners = new Set<(line: string) => void>();\n const emit = (line: string): void => {\n for (const listener of listeners) listener(line);\n };\n stream.on(\"data\", (chunk: Buffer | string) => {\n const text = Buffer.isBuffer(chunk) ? chunk.toString(\"utf8\") : String(chunk);\n buffer += text;\n let index = buffer.indexOf(\"\\n\");\n while (index !== -1) {\n const line = buffer.slice(0, index).replace(/\\r$/, \"\");\n buffer = buffer.slice(index + 1);\n emitBounded(emit, line);\n index = buffer.indexOf(\"\\n\");\n }\n // Pathological input: a single line longer than the cap with no newline yet. Flush in\n // chunks so the buffer cannot grow without bound.\n while (buffer.length > SPAWNER_MAX_LINE_BYTES) {\n emit(buffer.slice(0, SPAWNER_MAX_LINE_BYTES));\n buffer = buffer.slice(SPAWNER_MAX_LINE_BYTES);\n }\n });\n stream.on(\"end\", () => {\n if (buffer.length > 0) {\n emitBounded(emit, buffer);\n buffer = \"\";\n }\n // The producer is done — clear the subscriber set so callers that retain a reference to\n // the ProcessStream don't keep their listener closures alive for the lifetime of the\n // owning process.\n listeners.clear();\n });\n return {\n on(_event, listener) {\n listeners.add(listener);\n },\n };\n};\n\nconst emitBounded = (emit: (line: string) => void, line: string): void => {\n if (line.length <= SPAWNER_MAX_LINE_BYTES) {\n emit(line);\n return;\n }\n for (let i = 0; i < line.length; i += SPAWNER_MAX_LINE_BYTES) {\n emit(line.slice(i, i + SPAWNER_MAX_LINE_BYTES));\n }\n};\n","/** Aspect of an installation a verification result describes. */\nexport const VerificationKinds = {\n MINECRAFT: \"minecraft\",\n FABRIC: \"fabric\",\n FORGE: \"forge\",\n RUNTIME: \"runtime\",\n} as const;\n\n/** Verification kind literal. */\nexport type VerificationKind = (typeof VerificationKinds)[keyof typeof VerificationKinds];\n\n/** Status of an individual file checked during verification. */\nexport const VerifyFileStatuses = {\n OK: \"ok\",\n MISSING: \"missing\",\n CORRUPT: \"corrupt\",\n WRONG_SIZE: \"wrong-size\",\n} as const;\n\n/** File status literal. */\nexport type VerifyFileStatus = (typeof VerifyFileStatuses)[keyof typeof VerifyFileStatuses];\n\n/** Categories assigned to each verified file for easier filtering. */\nexport const VerifyFileCategories = {\n CLIENT_JAR: \"client-jar\",\n LIBRARY: \"library\",\n ASSET: \"asset\",\n ASSET_INDEX: \"asset-index\",\n NATIVE: \"native\",\n LOADER_LIBRARY: \"loader-library\",\n RUNTIME_FILE: \"runtime-file\",\n LOGGING_CONFIG: \"logging-config\",\n} as const;\n\n/** Verification file category literal. */\nexport type VerifyFileCategory = (typeof VerifyFileCategories)[keyof typeof VerifyFileCategories];\n\n/** A single verified file. */\nexport type VerificationFileResult = {\n readonly path: string;\n readonly category: VerifyFileCategory;\n readonly status: VerifyFileStatus;\n readonly expectedSha1?: string;\n readonly actualSha1?: string;\n readonly expectedSize?: number;\n readonly actualSize?: number;\n /** Optional URL where the file can be re-downloaded if it's broken. */\n readonly url?: string;\n};\n\n/** Aggregate verification result returned by each `verify.<kind>.run` API. */\nexport type VerificationResult = {\n readonly targetId: string;\n readonly kind: VerificationKind;\n readonly isValid: boolean;\n readonly issues: readonly VerificationFileResult[];\n readonly checkedFiles: number;\n readonly durationMs: number;\n};\n","import { fileExists, fileSize, listChildDirectories, readText } from \"../core/fs\";\nimport { sha1OfFile } from \"../core/hash\";\nimport { parseJsonOrUndefined } from \"../core/json\";\nimport { targetPaths } from \"../core/paths\";\nimport { EventTypes } from \"../types/events\";\nimport type { ProgressListener } from \"../types/events\";\nimport {\n type VerificationFileResult,\n type VerificationKind,\n type VerificationResult,\n VerifyFileStatuses,\n} from \"../types/verify\";\n\n/** Records a single file-check result and emits the corresponding event. */\nexport type VerificationRecorder = (result: VerificationFileResult) => void;\n\n/**\n * Run the boilerplate shared by every aspect verifier: tracks the per-file results emitted\n * via the recorder, fires `verify:file-checked` events, and assembles the {@link VerificationResult}.\n */\nexport const runVerification = async (\n input: {\n readonly targetId: string;\n readonly kind: VerificationKind;\n readonly onEvent?: ProgressListener;\n },\n check: (record: VerificationRecorder) => Promise<void>,\n): Promise<VerificationResult> => {\n const startedAt = Date.now();\n const results: VerificationFileResult[] = [];\n const record: VerificationRecorder = (result) => {\n results.push(result);\n input.onEvent?.({ type: EventTypes.VERIFY_FILE_CHECKED, file: result });\n };\n await check(record);\n return {\n targetId: input.targetId,\n kind: input.kind,\n isValid: results.every((r) => r.status === VerifyFileStatuses.OK),\n issues: results.filter((r) => r.status !== VerifyFileStatuses.OK),\n checkedFiles: results.length,\n durationMs: Date.now() - startedAt,\n };\n};\n\n/** Verify a file by existence + optional size + optional sha1. */\nexport const verifyHashedFile = async (input: {\n readonly path: string;\n readonly expectedSha1?: string;\n readonly expectedSize?: number;\n readonly url?: string;\n readonly category: VerificationFileResult[\"category\"];\n}): Promise<VerificationFileResult> => {\n if (!(await fileExists(input.path))) {\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.MISSING,\n ...(input.expectedSha1 !== undefined ? { expectedSha1: input.expectedSha1 } : {}),\n ...(input.expectedSize !== undefined ? { expectedSize: input.expectedSize } : {}),\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n }\n if (input.expectedSize !== undefined) {\n const size = await fileSize(input.path);\n if (size !== input.expectedSize) {\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.WRONG_SIZE,\n expectedSize: input.expectedSize,\n actualSize: size,\n ...(input.expectedSha1 !== undefined ? { expectedSha1: input.expectedSha1 } : {}),\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n }\n }\n if (input.expectedSha1 !== undefined) {\n const actualSha1 = await sha1OfFile(input.path);\n if (actualSha1 !== input.expectedSha1) {\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.CORRUPT,\n expectedSha1: input.expectedSha1,\n actualSha1,\n ...(input.expectedSize !== undefined ? { expectedSize: input.expectedSize } : {}),\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n }\n }\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.OK,\n ...(input.expectedSha1 !== undefined ? { expectedSha1: input.expectedSha1 } : {}),\n ...(input.expectedSize !== undefined ? { expectedSize: input.expectedSize } : {}),\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n};\n\n/** Verify by existence only (no hash/size check). */\nexport const verifyExistence = async (input: {\n readonly path: string;\n readonly category: VerificationFileResult[\"category\"];\n readonly url?: string;\n}): Promise<VerificationFileResult> => {\n if (await fileExists(input.path)) {\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.OK,\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n }\n return {\n path: input.path,\n category: input.category,\n status: VerifyFileStatuses.MISSING,\n ...(input.url !== undefined ? { url: input.url } : {}),\n };\n};\n\n/**\n * Locate a Forge version JSON on disk for the given Minecraft version. Returns the\n * discovered path even if the JSON file itself is missing — callers use the path to record\n * a MISSING issue and trigger a write/repair downstream. Returns null when the versions\n * directory has no Forge folder for this Minecraft version.\n */\nexport const findForgeVersionJsonPath = async (\n directory: string,\n minecraftVersion: string,\n): Promise<string | null> => {\n const versionsDir = targetPaths.versionsDir(directory);\n const dirs = await listChildDirectories(versionsDir);\n for (const id of dirs) {\n if (!id.startsWith(`${minecraftVersion}-forge-`)) continue;\n const jsonPath = targetPaths.versionJson(directory, id);\n if (!(await fileExists(jsonPath))) {\n return jsonPath;\n }\n const parsed = await tryParseInheritsFrom(jsonPath);\n if (parsed === minecraftVersion) return jsonPath;\n }\n return null;\n};\n\nconst tryParseInheritsFrom = async (jsonPath: string): Promise<string | undefined> => {\n // Malformed JSON cannot match by inheritsFrom; treated as a non-match. The next\n // verify pass over this file will surface it through the regular file check path.\n const parsed = parseJsonOrUndefined<{ inheritsFrom?: string }>(await readText(jsonPath));\n return parsed?.inheritsFrom;\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { targetPaths } from \"../core/paths\";\nimport { planLibraryDownloads } from \"../install/libraries\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport { DownloadCategories } from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { Target } from \"../types/target\";\nimport { VerificationKinds, type VerificationResult, VerifyFileCategories } from \"../types/verify\";\nimport { runVerification, verifyExistence, verifyHashedFile } from \"./helpers\";\n\n/** Inputs to {@link verifyFabric}. */\nexport type VerifyFabricInput = {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\n/** Verify the Fabric loader slice: profile JSON + every library it pulls in. */\nexport const verifyFabric = async (input: VerifyFabricInput): Promise<VerificationResult> => {\n if (input.target.loader.type !== Loaders.FABRIC) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `verify.fabric requires a Fabric target (got ${input.target.loader.type})`,\n );\n }\n const loader = input.target.loader;\n return runVerification(\n {\n targetId: input.target.id,\n kind: VerificationKinds.FABRIC,\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n },\n async (record) => {\n record(\n await verifyExistence({\n path: targetPaths.versionJson(input.target.directory, loader.profile.id),\n category: VerifyFileCategories.LOADER_LIBRARY,\n }),\n );\n const fabricLibraries = planLibraryDownloads({\n libraries: loader.profile.libraries,\n directory: input.target.directory,\n system: input.target.runtime.system,\n versionId: input.target.minecraft.version,\n category: DownloadCategories.FABRIC_LIBRARY,\n });\n for (const action of fabricLibraries.downloads) {\n record(\n await verifyHashedFile({\n path: action.target,\n ...(action.expectedSha1 !== undefined ? { expectedSha1: action.expectedSha1 } : {}),\n ...(action.expectedSize !== undefined ? { expectedSize: action.expectedSize } : {}),\n ...(action.url ? { url: action.url } : {}),\n category: VerifyFileCategories.LOADER_LIBRARY,\n }),\n );\n }\n },\n );\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { fileExists, readText } from \"../core/fs\";\nimport { parseJsonOrUndefined } from \"../core/json\";\nimport { planLibraryDownloads } from \"../install/libraries\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { ForgeVersionJson } from \"../types/forge\";\nimport type { HttpClient } from \"../types/http\";\nimport { DownloadCategories } from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { Target } from \"../types/target\";\nimport {\n VerificationKinds,\n type VerificationResult,\n VerifyFileCategories,\n VerifyFileStatuses,\n} from \"../types/verify\";\nimport {\n findForgeVersionJsonPath,\n runVerification,\n verifyExistence,\n verifyHashedFile,\n} from \"./helpers\";\n\n/** Inputs to {@link verifyForge}. */\nexport type VerifyForgeInput = {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\n/**\n * Verify the Forge loader slice: the on-disk Forge version JSON and every library it\n * declares. Libraries can only be enumerated once the JSON is present *and parsable*; a\n * malformed JSON is surfaced as a CORRUPT issue so repair rewrites it before re-running.\n */\nexport const verifyForge = async (input: VerifyForgeInput): Promise<VerificationResult> => {\n if (input.target.loader.type !== Loaders.FORGE) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `verify.forge requires a Forge target (got ${input.target.loader.type})`,\n );\n }\n return runVerification(\n {\n targetId: input.target.id,\n kind: VerificationKinds.FORGE,\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n },\n async (record) => {\n const forgeVersionJsonPath = await findForgeVersionJsonPath(\n input.target.directory,\n input.target.minecraft.version,\n );\n if (forgeVersionJsonPath === null) return;\n record(\n await verifyExistence({\n path: forgeVersionJsonPath,\n category: VerifyFileCategories.LOADER_LIBRARY,\n }),\n );\n if (!(await fileExists(forgeVersionJsonPath))) return;\n\n const parsed = parseJsonOrUndefined<ForgeVersionJson>(await readText(forgeVersionJsonPath));\n if (parsed === undefined) {\n // Surface as CORRUPT so repair rewrites the JSON. Library verification will pick up\n // on the next pass once the file parses.\n record({\n path: forgeVersionJsonPath,\n category: VerifyFileCategories.LOADER_LIBRARY,\n status: VerifyFileStatuses.CORRUPT,\n });\n return;\n }\n const forgeLibraries = planLibraryDownloads({\n libraries: parsed.libraries,\n directory: input.target.directory,\n system: input.target.runtime.system,\n versionId: input.target.minecraft.version,\n category: DownloadCategories.FORGE_LIBRARY,\n });\n for (const action of forgeLibraries.downloads) {\n record(\n await verifyHashedFile({\n path: action.target,\n ...(action.expectedSha1 !== undefined ? { expectedSha1: action.expectedSha1 } : {}),\n ...(action.expectedSize !== undefined ? { expectedSize: action.expectedSize } : {}),\n ...(action.url ? { url: action.url } : {}),\n category: VerifyFileCategories.LOADER_LIBRARY,\n }),\n );\n }\n },\n );\n};\n","import { fileExists } from \"../core/fs\";\nimport { targetPaths } from \"../core/paths\";\nimport { fetchJson } from \"../http/metadata\";\nimport { planLibraryDownloads } from \"../install/libraries\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport { DownloadCategories } from \"../types/install\";\nimport type { AssetIndexDocument } from \"../types/minecraft\";\nimport type { Target } from \"../types/target\";\nimport {\n VerificationKinds,\n type VerificationResult,\n VerifyFileCategories,\n VerifyFileStatuses,\n} from \"../types/verify\";\nimport { runVerification, verifyExistence, verifyHashedFile } from \"./helpers\";\n\n/** Inputs to {@link verifyMinecraft}. */\nexport type VerifyMinecraftInput = {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\n/**\n * Verify the vanilla Minecraft slice of an installation: the client jar, version JSON,\n * libraries (incl. native jars), assets (index + objects), logging config, and the\n * extracted natives directory.\n */\nexport const verifyMinecraft = async (input: VerifyMinecraftInput): Promise<VerificationResult> => {\n return runVerification(\n {\n targetId: input.target.id,\n kind: VerificationKinds.MINECRAFT,\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n },\n async (record) => {\n const { directory, minecraft, runtime } = input.target;\n\n // Client jar.\n record(\n await verifyHashedFile({\n path: targetPaths.versionJar(directory, minecraft.version),\n expectedSha1: minecraft.manifest.downloads.client.sha1,\n expectedSize: minecraft.manifest.downloads.client.size,\n url: minecraft.manifest.downloads.client.url,\n category: VerifyFileCategories.CLIENT_JAR,\n }),\n );\n\n // Vanilla version JSON (a missing JSON triggers WRITE_VERSION_JSON during repair).\n record(\n await verifyExistence({\n path: targetPaths.versionJson(directory, minecraft.version),\n category: VerifyFileCategories.CLIENT_JAR,\n }),\n );\n\n // Logging config.\n if (minecraft.manifest.logging?.client) {\n const logging = minecraft.manifest.logging.client;\n record(\n await verifyHashedFile({\n path: targetPaths.loggingConfig(directory, logging.file.id),\n expectedSha1: logging.file.sha1,\n expectedSize: logging.file.size,\n url: logging.file.url,\n category: VerifyFileCategories.LOGGING_CONFIG,\n }),\n );\n }\n\n // Libraries (incl. native jars).\n const libraryPlan = planLibraryDownloads({\n libraries: minecraft.manifest.libraries,\n directory,\n system: runtime.system,\n versionId: minecraft.version,\n category: DownloadCategories.LIBRARY,\n });\n for (const action of libraryPlan.downloads) {\n record(\n await verifyHashedFile({\n path: action.target,\n ...(action.expectedSha1 !== undefined ? { expectedSha1: action.expectedSha1 } : {}),\n ...(action.expectedSize !== undefined ? { expectedSize: action.expectedSize } : {}),\n url: action.url,\n category: VerifyFileCategories.LIBRARY,\n }),\n );\n }\n\n // Asset index + objects.\n const indexUrl = minecraft.manifest.assetIndex.url;\n const indexPath = targetPaths.assetIndex(directory, minecraft.manifest.assetIndex.id);\n record(\n await verifyHashedFile({\n path: indexPath,\n expectedSha1: minecraft.manifest.assetIndex.sha1,\n expectedSize: minecraft.manifest.assetIndex.size,\n url: indexUrl,\n category: VerifyFileCategories.ASSET_INDEX,\n }),\n );\n const indexDocument = await fetchJson<AssetIndexDocument>(input.http, input.cache, {\n url: indexUrl,\n cacheKey: `asset-index:${minecraft.manifest.assetIndex.id}:${minecraft.manifest.assetIndex.sha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n // Same hash may be referenced by multiple virtual paths; verify each physical file\n // at most once.\n const seenAssetHashes = new Set<string>();\n for (const entry of Object.values(indexDocument.objects)) {\n if (seenAssetHashes.has(entry.hash)) continue;\n seenAssetHashes.add(entry.hash);\n record(\n await verifyHashedFile({\n path: targetPaths.assetObject(directory, entry.hash),\n expectedSha1: entry.hash,\n expectedSize: entry.size,\n category: VerifyFileCategories.ASSET,\n }),\n );\n }\n\n // Natives directory presence. When it's gone, every native JAR needs to be\n // re-extracted: emit one NATIVE issue per source JAR so the count of issues matches\n // the count of EXTRACT_NATIVE actions repair will produce.\n const nativesDir = targetPaths.nativesDir(directory, minecraft.version);\n if (!(await fileExists(nativesDir))) {\n for (const extraction of libraryPlan.nativeExtractions) {\n record({\n path: extraction.source,\n category: VerifyFileCategories.NATIVE,\n status: VerifyFileStatuses.MISSING,\n });\n }\n }\n },\n );\n};\n","import path from \"node:path\";\nimport { targetPaths } from \"../core/paths\";\nimport { fetchJson } from \"../http/metadata\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport type { RuntimeFilesManifest } from \"../types/runtime\";\nimport type { Target } from \"../types/target\";\nimport {\n VerificationKinds,\n type VerificationResult,\n VerifyFileCategories,\n VerifyFileStatuses,\n} from \"../types/verify\";\nimport { runVerification, verifyHashedFile } from \"./helpers\";\n\n/** Inputs to {@link verifyRuntime}. */\nexport type VerifyRuntimeInput = {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\n/**\n * Verify the Java runtime files. Honours `target.runtime.installRoot` when set so a\n * shared/global runtime install is checked at its real location instead of the per-target\n * `runtime/` subfolder.\n */\nexport const verifyRuntime = async (input: VerifyRuntimeInput): Promise<VerificationResult> => {\n return runVerification(\n {\n targetId: input.target.id,\n kind: VerificationKinds.RUNTIME,\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n },\n async (record) => {\n let manifest: RuntimeFilesManifest;\n try {\n manifest = await fetchJson<RuntimeFilesManifest>(input.http, input.cache, {\n url: input.target.runtime.manifestUrl,\n cacheKey: `runtime-manifest:${input.target.runtime.component}:${input.target.runtime.platformKey}:${input.target.runtime.manifestSha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n } catch {\n // Manifest unreachable — record one MISSING issue keyed on the manifest URL so the\n // caller sees that the runtime cannot be verified right now. Repair will re-attempt.\n record({\n path: input.target.runtime.manifestUrl,\n category: VerifyFileCategories.RUNTIME_FILE,\n status: VerifyFileStatuses.MISSING,\n });\n return;\n }\n const runtimeRoot = targetPaths.runtimeRoot(\n input.target.directory,\n input.target.runtime.component,\n input.target.runtime.installRoot,\n );\n for (const [relative, entry] of Object.entries(manifest.files)) {\n if (entry.type !== \"file\") continue;\n record(\n await verifyHashedFile({\n path: path.join(runtimeRoot, relative),\n expectedSha1: entry.downloads.raw.sha1,\n expectedSize: entry.downloads.raw.size,\n url: entry.downloads.raw.url,\n category: VerifyFileCategories.RUNTIME_FILE,\n }),\n );\n }\n },\n );\n};\n","import { planInstall } from \"../install/planner\";\nimport {\n type DownloadAction,\n type ExtractNativeAction,\n type InstallAction,\n InstallActionKinds,\n type InstallPlan,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport type { AspectRepairInput, RepairPlan } from \"../types/repair\";\nimport type { Target } from \"../types/target\";\nimport {\n type VerificationResult,\n VerifyFileCategories,\n type VerifyFileCategory,\n} from \"../types/verify\";\n\n/** Normalize the `from` option of a repair plan into an array. */\nexport const asResultArray = (\n from: VerificationResult | readonly VerificationResult[],\n): readonly VerificationResult[] => {\n return Array.isArray(from) ? from : [from];\n};\n\n/**\n * Category-aware view over a set of verification results. Lets repair distinguish\n * - paths that need a download (have any non-`native` category recorded), from\n * - paths whose only issue is `native` extraction (the JAR is fine, but the extracted\n * natives directory is missing).\n *\n * Without this distinction, a \"natives directory missing\" report would re-trigger every\n * native-jar download even though every JAR on disk is already correct.\n */\nexport type IssueIndex = {\n /** True when any verification result reported an issue at `path`. */\n has(path: string): boolean;\n /**\n * True when at least one issue at `path` carries a category other than `native`.\n * Used to decide whether a `DOWNLOAD_FILE` action should fire — a `native`-only issue\n * means \"re-extract the JAR\" not \"re-download the JAR\".\n */\n hasNonNative(path: string): boolean;\n /** All categories recorded for the given path (empty when none). */\n categoriesAt(path: string): ReadonlySet<VerifyFileCategory>;\n};\n\n/** Build an {@link IssueIndex} from one or more verification results. */\nexport const buildIssueIndex = (\n from: VerificationResult | readonly VerificationResult[],\n): IssueIndex => {\n const map = new Map<string, Set<VerifyFileCategory>>();\n for (const v of asResultArray(from)) {\n for (const issue of v.issues) {\n const set = map.get(issue.path);\n if (set) set.add(issue.category);\n else map.set(issue.path, new Set([issue.category]));\n }\n }\n return {\n has: (path) => map.has(path),\n hasNonNative: (path) => {\n const cats = map.get(path);\n if (!cats) return false;\n for (const c of cats) {\n if (c !== VerifyFileCategories.NATIVE) return true;\n }\n return false;\n },\n categoriesAt: (path) => map.get(path) ?? new Set<VerifyFileCategory>(),\n };\n};\n\n/** Sum expected bytes of all DOWNLOAD_FILE actions in a list. */\nexport const sumDownloadBytes = (actions: readonly InstallAction[]): number => {\n return actions.reduce((sum, action) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return sum + ((action as DownloadAction).expectedSize ?? 0);\n }\n return sum;\n }, 0);\n};\n\n/** Wrap a list of install actions in a {@link RepairPlan} for the given target. */\nexport const buildRepairPlan = (target: Target, actions: readonly InstallAction[]): RepairPlan => {\n return {\n targetId: target.id,\n directory: target.directory,\n target,\n actions,\n totalActions: actions.length,\n totalBytes: sumDownloadBytes(actions),\n };\n};\n\n/** Predicate to keep only actions belonging to a specific repair aspect. */\nexport type AspectFilter = (action: InstallAction) => boolean;\n\n/**\n * Run the boilerplate every aspect-specific repair planner shares:\n * 1. Build a full install plan.\n * 2. Index the verification issues.\n * 3. Filter install actions through the aspect-specific predicate using the standard\n * DOWNLOAD / WRITE / EXTRACT_NATIVE selection rules.\n * 4. Let the caller append any aspect-specific actions (e.g. Forge's defensive sweep).\n * 5. Wrap the actions in a {@link RepairPlan}.\n */\nexport const planAspectRepair = async (\n input: AspectRepairInput,\n aspectFilter: AspectFilter,\n postprocess?: (context: {\n actions: InstallAction[];\n installPlan: InstallPlan;\n issues: IssueIndex;\n }) => void,\n): Promise<RepairPlan> => {\n const installPlan = await planInstall({\n target: input.target,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const issues = buildIssueIndex(input.from);\n const actions = selectRepairActions({\n target: input.target,\n installPlan,\n issues,\n aspectFilter,\n });\n postprocess?.({ actions, installPlan, issues });\n return buildRepairPlan(input.target, actions);\n};\n\n/**\n * Apply the standard repair-action selection rules, restricted to the actions accepted by\n * `aspectFilter`. The rules are:\n * - DOWNLOAD_FILE: include if the target path has any non-`native` issue recorded.\n * - WRITE_VERSION_JSON: include if the destination path has any issue recorded.\n * - EXTRACT_NATIVE: include if the source JAR has any issue recorded.\n * - Anything else admitted by `aspectFilter` is included unconditionally.\n */\nexport const selectRepairActions = (input: {\n readonly target: Target;\n readonly installPlan: InstallPlan;\n readonly issues: IssueIndex;\n readonly aspectFilter: AspectFilter;\n}): InstallAction[] => {\n const matching: InstallAction[] = [];\n for (const action of input.installPlan.actions) {\n if (!input.aspectFilter(action)) continue;\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n if (input.issues.hasNonNative((action as DownloadAction).target)) {\n matching.push(action);\n }\n } else if (action.kind === InstallActionKinds.WRITE_VERSION_JSON) {\n if (input.issues.has((action as WriteVersionJsonAction).path)) {\n matching.push(action);\n }\n } else if (action.kind === InstallActionKinds.EXTRACT_NATIVE) {\n if (input.issues.has((action as ExtractNativeAction).source)) {\n matching.push(action);\n }\n } else {\n // Non-standard kinds (e.g. RUN_FORGE_PROCESSOR) are admitted by the aspect filter.\n matching.push(action);\n }\n }\n return matching;\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { targetPaths } from \"../core/paths\";\nimport {\n type DownloadAction,\n DownloadCategories,\n type InstallAction,\n InstallActionKinds,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { RepairPlan } from \"../types/repair\";\nimport type { AspectRepairInput } from \"../types/repair\";\nimport { planAspectRepair } from \"./helpers\";\n\n/** Inputs to {@link planFabricRepair}. */\nexport type PlanFabricRepairInput = AspectRepairInput;\n\n/** Build a repair plan covering the Fabric loader slice: profile JSON + libraries. */\nexport const planFabricRepair = async (input: PlanFabricRepairInput): Promise<RepairPlan> => {\n if (input.target.loader.type !== Loaders.FABRIC) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `repair.fabric requires a Fabric target (got ${input.target.loader.type})`,\n );\n }\n const fabricJsonPath = targetPaths.versionJson(\n input.target.directory,\n input.target.loader.profile.id,\n );\n return planAspectRepair(input, (action: InstallAction) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return (action as DownloadAction).category === DownloadCategories.FABRIC_LIBRARY;\n }\n if (action.kind === InstallActionKinds.WRITE_VERSION_JSON) {\n return (action as WriteVersionJsonAction).path === fabricJsonPath;\n }\n return false;\n });\n};\n","import { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { targetPaths } from \"../core/paths\";\nimport {\n type DownloadAction,\n DownloadCategories,\n type DownloadCategory,\n type InstallAction,\n InstallActionKinds,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport { Loaders } from \"../types/loader\";\nimport type { AspectRepairInput, RepairPlan } from \"../types/repair\";\nimport { planAspectRepair } from \"./helpers\";\n\nconst FORGE_DOWNLOAD_CATEGORIES = new Set<DownloadCategory>([\n DownloadCategories.FORGE_LIBRARY,\n DownloadCategories.FORGE_INSTALLER,\n]);\n\n/** Inputs to {@link planForgeRepair}. */\nexport type PlanForgeRepairInput = AspectRepairInput;\n\n/**\n * Build a repair plan covering the Forge loader slice: version JSON, libraries, installer\n * download, and the Forge processors that produce the final installation. When the Forge\n * version JSON was missing during verify (so libraries couldn't be enumerated), every\n * forge-library download is added defensively — `downloadFile` skips files already on disk.\n */\nexport const planForgeRepair = async (input: PlanForgeRepairInput): Promise<RepairPlan> => {\n if (input.target.loader.type !== Loaders.FORGE) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `repair.forge requires a Forge target (got ${input.target.loader.type})`,\n );\n }\n const forgeJsonPath = targetPaths.versionJson(\n input.target.directory,\n input.target.loader.fullVersion,\n );\n\n return planAspectRepair(\n input,\n (action: InstallAction) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return FORGE_DOWNLOAD_CATEGORIES.has((action as DownloadAction).category);\n }\n if (action.kind === InstallActionKinds.WRITE_VERSION_JSON) {\n return (action as WriteVersionJsonAction).path === forgeJsonPath;\n }\n // Processors handled in the postprocess step (only when JSON was missing).\n return false;\n },\n ({ actions, installPlan, issues }) => {\n if (!issues.has(forgeJsonPath)) return;\n // Forge JSON was missing during verify → libraries couldn't be enumerated. Include\n // every forge-library download (skip-on-correct keeps this cheap) plus the processors\n // that regenerate the JSON.\n const alreadyIncluded = new Set(\n actions\n .filter((a): a is DownloadAction => a.kind === InstallActionKinds.DOWNLOAD_FILE)\n .map((a) => a.target),\n );\n for (const action of installPlan.actions) {\n if (\n action.kind === InstallActionKinds.DOWNLOAD_FILE &&\n (action as DownloadAction).category === DownloadCategories.FORGE_LIBRARY &&\n !alreadyIncluded.has((action as DownloadAction).target)\n ) {\n actions.push(action);\n } else if (action.kind === InstallActionKinds.RUN_FORGE_PROCESSOR) {\n actions.push(action);\n }\n }\n },\n );\n};\n","import { targetPaths } from \"../core/paths\";\nimport {\n type DownloadAction,\n DownloadCategories,\n type DownloadCategory,\n type InstallAction,\n InstallActionKinds,\n type WriteVersionJsonAction,\n} from \"../types/install\";\nimport type { AspectRepairInput, RepairPlan } from \"../types/repair\";\nimport { planAspectRepair } from \"./helpers\";\n\nconst MINECRAFT_DOWNLOAD_CATEGORIES = new Set<DownloadCategory>([\n DownloadCategories.CLIENT_JAR,\n DownloadCategories.LIBRARY,\n DownloadCategories.ASSET_INDEX,\n DownloadCategories.ASSET,\n DownloadCategories.LOGGING_CONFIG,\n]);\n\n/** Inputs to {@link planMinecraftRepair}. */\nexport type PlanMinecraftRepairInput = AspectRepairInput;\n\n/**\n * Build a repair plan covering only the vanilla Minecraft slice: client jar, version JSON,\n * libraries (incl. native jars), assets, logging config, and native extractions.\n */\nexport const planMinecraftRepair = async (input: PlanMinecraftRepairInput): Promise<RepairPlan> => {\n const vanillaJsonPath = targetPaths.versionJson(\n input.target.directory,\n input.target.minecraft.version,\n );\n return planAspectRepair(input, (action: InstallAction) => {\n if (action.kind === InstallActionKinds.DOWNLOAD_FILE) {\n return MINECRAFT_DOWNLOAD_CATEGORIES.has((action as DownloadAction).category);\n }\n if (action.kind === InstallActionKinds.WRITE_VERSION_JSON) {\n return (action as WriteVersionJsonAction).path === vanillaJsonPath;\n }\n if (action.kind === InstallActionKinds.EXTRACT_NATIVE) {\n return true;\n }\n return false;\n });\n};\n","import { runInstall } from \"../install/runner\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport type { RepairPlan, RepairReport } from \"../types/repair\";\nimport type { Spawner } from \"../types/spawner\";\n\n/** Inputs to {@link runRepair}. Shared across all aspect-specific repair flows. */\nexport type RunRepairInput = {\n readonly plan: RepairPlan;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly spawner: Spawner;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\n/** Execute any repair plan. Reuses the install runner. */\nexport const runRepair = async (input: RunRepairInput): Promise<RepairReport> => {\n const report = await runInstall({\n plan: {\n ...input.plan,\n totalActions: input.plan.actions.length,\n totalBytes: input.plan.totalBytes,\n },\n http: input.http,\n cache: input.cache,\n spawner: input.spawner,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n return {\n targetId: report.targetId,\n bytesDownloaded: report.bytesDownloaded,\n actionsCompleted: report.actionsCompleted,\n durationMs: report.durationMs,\n };\n};\n","import {\n type DownloadAction,\n DownloadCategories,\n type InstallAction,\n InstallActionKinds,\n} from \"../types/install\";\nimport type { RepairPlan } from \"../types/repair\";\nimport type { AspectRepairInput } from \"../types/repair\";\nimport { planAspectRepair } from \"./helpers\";\n\n/** Inputs to {@link planRuntimeRepair}. */\nexport type PlanRuntimeRepairInput = AspectRepairInput;\n\n/**\n * Build a repair plan covering the Java runtime files. `target.runtime.installRoot` is\n * honoured automatically because both `planInstall` and the verify side resolve runtime\n * paths through the same `targetPaths.runtimeRoot(..., installRoot)` helper.\n */\nexport const planRuntimeRepair = async (input: PlanRuntimeRepairInput): Promise<RepairPlan> => {\n return planAspectRepair(\n input,\n (action: InstallAction) =>\n action.kind === InstallActionKinds.DOWNLOAD_FILE &&\n (action as DownloadAction).category === DownloadCategories.RUNTIME_FILE,\n );\n};\n","import type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport { Loaders } from \"../types/loader\";\nimport type { RepairReport } from \"../types/repair\";\nimport type { Spawner } from \"../types/spawner\";\nimport type { Target } from \"../types/target\";\nimport type { VerificationKind, VerificationResult } from \"../types/verify\";\nimport { verifyFabric } from \"../verify/fabric\";\nimport { verifyForge } from \"../verify/forge\";\nimport { verifyMinecraft } from \"../verify/minecraft\";\nimport { verifyRuntime } from \"../verify/runtime\";\nimport { planFabricRepair } from \"./fabric\";\nimport { planForgeRepair } from \"./forge\";\nimport { planMinecraftRepair } from \"./minecraft\";\nimport { runRepair } from \"./runner\";\nimport { planRuntimeRepair } from \"./runtime\";\n\nexport type RepairAllInput = {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly spawner: Spawner;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\nexport type RepairAllReport = {\n readonly verifications: readonly VerificationResult[];\n /** Present only for aspects that actually needed work. */\n readonly repairs: ReadonlyMap<VerificationKind, RepairReport>;\n readonly bytesDownloaded: number;\n readonly durationMs: number;\n};\n\n/** Verify every applicable aspect and repair each broken one. */\nexport const repairAll = async (input: RepairAllInput): Promise<RepairAllReport> => {\n const startedAt = Date.now();\n const ctx = {\n target: input.target,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n };\n\n const verifications: VerificationResult[] = [];\n const mc = await verifyMinecraft(ctx);\n verifications.push(mc);\n const rt = await verifyRuntime(ctx);\n verifications.push(rt);\n if (input.target.loader.type === Loaders.FABRIC) {\n verifications.push(await verifyFabric(ctx));\n } else if (input.target.loader.type === Loaders.FORGE) {\n verifications.push(await verifyForge(ctx));\n }\n\n const repairs = new Map<VerificationKind, RepairReport>();\n let bytesDownloaded = 0;\n\n for (const verification of verifications) {\n if (verification.isValid) continue;\n const planner = PLANNERS[verification.kind];\n if (!planner) continue;\n const plan = await planner({ ...ctx, from: verification });\n if (plan.totalActions === 0) continue;\n const report = await runRepair({\n plan,\n http: input.http,\n cache: input.cache,\n spawner: input.spawner,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n repairs.set(verification.kind, report);\n bytesDownloaded += report.bytesDownloaded;\n }\n\n return {\n verifications,\n repairs,\n bytesDownloaded,\n durationMs: Date.now() - startedAt,\n };\n};\n\nconst PLANNERS = {\n minecraft: planMinecraftRepair,\n runtime: planRuntimeRepair,\n fabric: planFabricRepair,\n forge: planForgeRepair,\n} as const;\n","import type { RuntimeSystem } from \"./system\";\n\n/**\n * Mojang Java-runtime component identifiers. New components appear over time\n * (e.g. `java-runtime-delta` for Java 21).\n *\n * The launcher must respect the `javaVersion.component` field declared by the per-version\n * Minecraft manifest. This list captures the set we have direct knowledge about; unknown\n * components are still allowed and resolved dynamically against the runtime index.\n */\nexport const RuntimeComponents = {\n JRE_LEGACY: \"jre-legacy\",\n JAVA_RUNTIME_ALPHA: \"java-runtime-alpha\",\n JAVA_RUNTIME_BETA: \"java-runtime-beta\",\n JAVA_RUNTIME_GAMMA: \"java-runtime-gamma\",\n JAVA_RUNTIME_GAMMA_SNAPSHOT: \"java-runtime-gamma-snapshot\",\n JAVA_RUNTIME_DELTA: \"java-runtime-delta\",\n JAVA_RUNTIME_EPSILON: \"java-runtime-epsilon\",\n MINECRAFT_JAVA_EXE: \"minecraft-java-exe\",\n} as const;\n\n/** Runtime component literal. */\nexport type RuntimeComponent = string;\n\n/** User-supplied resolution preferences. */\nexport const RuntimePreference = {\n /** Component declared by the Minecraft manifest. */\n RECOMMENDED: \"recommended\",\n /** Newest component available for the platform. */\n LATEST: \"latest\",\n} as const;\n\n/** Runtime preference literal. */\nexport type RuntimePreferenceKind = (typeof RuntimePreference)[keyof typeof RuntimePreference];\n\n/** Top-level runtime index returned by Mojang. */\nexport type RuntimeIndex = Readonly<Record<string, RuntimeIndexPlatform>>;\n\n/** Per-platform component map inside the runtime index. */\nexport type RuntimeIndexPlatform = Readonly<Record<string, readonly RuntimeIndexEntry[]>>;\n\n/** A single available runtime release. */\nexport type RuntimeIndexEntry = {\n readonly availability: { readonly group: number; readonly progress: number };\n readonly manifest: { readonly sha1: string; readonly size: number; readonly url: string };\n readonly version: { readonly name: string; readonly released: string };\n};\n\n/** Inner per-component file manifest. */\nexport type RuntimeFilesManifest = {\n readonly files: Readonly<Record<string, RuntimeFileEntry>>;\n};\n\n/** A single file in the runtime manifest. */\nexport type RuntimeFileEntry = RuntimeFileFile | RuntimeFileDirectory | RuntimeFileLink;\n\n/** A file entry: real bytes to download, may have lzma sidecar. */\nexport type RuntimeFileFile = {\n readonly type: \"file\";\n readonly executable: boolean;\n readonly downloads: {\n readonly raw: { readonly sha1: string; readonly size: number; readonly url: string };\n readonly lzma?: { readonly sha1: string; readonly size: number; readonly url: string };\n };\n};\n\n/** A directory placeholder. */\nexport type RuntimeFileDirectory = {\n readonly type: \"directory\";\n};\n\n/** A relative symlink. */\nexport type RuntimeFileLink = {\n readonly type: \"link\";\n readonly target: string;\n};\n\n/** Resolved runtime ready to install or launch with. */\nexport type ResolvedRuntime = {\n /** Mojang component name (e.g. `java-runtime-gamma`). */\n readonly component: string;\n /** Platform key inside the runtime index (e.g. `windows-x64`). */\n readonly platformKey: string;\n /** Version name (e.g. `\"17.0.8\"`). */\n readonly versionName: string;\n /** Major Java version when known. */\n readonly majorVersion?: number;\n readonly system: RuntimeSystem;\n /** URL of the per-component file manifest. */\n readonly manifestUrl: string;\n /** SHA-1 of the file manifest. */\n readonly manifestSha1: string;\n /**\n * Absolute path containing component directories. When set, runtime files for `component`\n * live at `<installRoot>/<component>/...`. When unset, defaults to `<target.directory>/runtime`.\n */\n readonly installRoot?: string;\n};\n","import path from \"node:path\";\nimport { ASSETS_DIR, LIBRARIES_DIR, RUNTIMES_DIR, VERSIONS_DIR } from \"../constants/files\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { dirExists, fileExists, listChildDirectories } from \"../core/fs\";\nimport { Loaders, type VersionPreferenceKind } from \"../types/loader\";\nimport { RuntimePreference, type RuntimePreferenceKind } from \"../types/runtime\";\nimport type { RuntimeSystem } from \"../types/system\";\nimport type {\n DiscoveredLoaderHint,\n DiscoveredRuntimeHint,\n DiscoveredTarget,\n Target,\n TargetCreateInput,\n} from \"../types/target\";\nimport type { FabricVersionsApi } from \"../versions/fabric\";\nimport type { ForgeVersionsApi } from \"../versions/forge\";\nimport type { MinecraftVersionsApi } from \"../versions/minecraft\";\nimport type { RuntimeVersionsApi } from \"../versions/runtime\";\n\n/** Inputs to {@link TargetsApi.resolve}. */\nexport type TargetResolveInput = {\n readonly id: string;\n readonly directory: string;\n readonly minecraft: { readonly version: string };\n readonly loader: TargetLoaderInput;\n readonly runtime?: {\n readonly preference?: RuntimePreferenceKind;\n /** Override the runtime component. Defaults to the Minecraft manifest's `javaVersion.component`. */\n readonly component?: string;\n /**\n * Custom install root (absolute path) holding the component directories.\n * When unset, runtime files live under `<directory>/runtime/`.\n */\n readonly installRoot?: string;\n };\n readonly system?: RuntimeSystem;\n readonly signal?: AbortSignal;\n};\n\n/** Loader input variants. */\nexport type TargetLoaderInput =\n | { readonly type: typeof Loaders.VANILLA }\n | {\n readonly type: typeof Loaders.FABRIC;\n readonly preference?: VersionPreferenceKind;\n readonly version?: string;\n }\n | {\n readonly type: typeof Loaders.FORGE;\n readonly preference?: VersionPreferenceKind;\n readonly version?: string;\n };\n\n/** Inputs to {@link TargetsApi.list}. */\nexport type TargetListInput = {\n readonly rootDir: string;\n};\n\n/** Constructor inputs for {@link TargetsApi}. */\nexport type TargetsApiContext = {\n readonly minecraft: MinecraftVersionsApi;\n readonly fabric: FabricVersionsApi;\n readonly forge: ForgeVersionsApi;\n readonly runtime: RuntimeVersionsApi;\n readonly system: RuntimeSystem;\n};\n\n/** Public Targets API surface. */\nexport class TargetsApi {\n constructor(private readonly ctx: TargetsApiContext) {}\n\n /** The detected host system used by `resolve()` when no `system` is supplied. */\n get system(): RuntimeSystem {\n return this.ctx.system;\n }\n\n /** Build a {@link Target} from already-resolved components. */\n create(input: TargetCreateInput): Target {\n if (!input.id) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n \"Target id must be non-empty\",\n );\n }\n if (!input.directory) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n \"Target directory must be non-empty\",\n );\n }\n if (!path.isAbsolute(input.directory)) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `Target directory must be an absolute path, got: ${input.directory}`,\n { context: { directory: input.directory } },\n );\n }\n if (input.loader.minecraftVersion !== input.minecraft.version) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.INVALID_INPUT,\n `Loader Minecraft version (${input.loader.minecraftVersion}) does not match resolved Minecraft (${input.minecraft.version})`,\n {\n context: {\n loaderMinecraft: input.loader.minecraftVersion,\n minecraftVersion: input.minecraft.version,\n },\n },\n );\n }\n return {\n id: input.id,\n directory: input.directory,\n minecraft: input.minecraft,\n loader: input.loader,\n runtime: input.runtime,\n };\n }\n\n /** Sugar API: resolve every component then assemble a target. */\n async resolve(input: TargetResolveInput): Promise<Target> {\n const minecraft = await this.ctx.minecraft.resolve({\n version: input.minecraft.version,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const system = input.system ?? this.ctx.system;\n const componentOverride = input.runtime?.component;\n const runtimeComponent = componentOverride ?? minecraft.manifest.javaVersion?.component;\n const resolvedRuntime = await this.ctx.runtime.resolve({\n system,\n ...(runtimeComponent !== undefined ? { component: runtimeComponent } : {}),\n preference: input.runtime?.preference ?? RuntimePreference.RECOMMENDED,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const runtime: import(\"../types/runtime\").ResolvedRuntime =\n input.runtime?.installRoot !== undefined\n ? { ...resolvedRuntime, installRoot: input.runtime.installRoot }\n : resolvedRuntime;\n let loader: import(\"../types/loader\").Loader;\n if (input.loader.type === Loaders.VANILLA) {\n // Vanilla loader is just a wrapper around the already-resolved Minecraft manifest —\n // no upstream fetch needed.\n loader = {\n type: Loaders.VANILLA,\n minecraftVersion: minecraft.version,\n minecraft,\n };\n } else if (input.loader.type === Loaders.FABRIC) {\n loader = await this.ctx.fabric.resolve({\n minecraftVersion: minecraft.version,\n ...(input.loader.preference !== undefined ? { preference: input.loader.preference } : {}),\n ...(input.loader.version !== undefined ? { loaderVersion: input.loader.version } : {}),\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n } else {\n loader = await this.ctx.forge.resolve({\n minecraftVersion: minecraft.version,\n ...(input.loader.preference !== undefined ? { preference: input.loader.preference } : {}),\n ...(input.loader.version !== undefined ? { forgeVersion: input.loader.version } : {}),\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n }\n return this.create({\n id: input.id,\n directory: input.directory,\n minecraft,\n loader,\n runtime,\n });\n }\n\n /** Scan a root directory for Minecraft installations. Returns only what is on disk. */\n async list(input: TargetListInput): Promise<readonly DiscoveredTarget[]> {\n if (!(await dirExists(input.rootDir))) return [];\n const subdirs = await listChildDirectories(input.rootDir);\n const results: DiscoveredTarget[] = [];\n for (const id of subdirs) {\n const directory = path.join(input.rootDir, id);\n const discovered = await discoverInstallation(id, directory);\n if (discovered) results.push(discovered);\n }\n return results;\n }\n}\n\nconst discoverInstallation = async (\n id: string,\n directory: string,\n): Promise<DiscoveredTarget | null> => {\n const versionsDir = path.join(directory, VERSIONS_DIR);\n const librariesDir = path.join(directory, LIBRARIES_DIR);\n const assetsDir = path.join(directory, ASSETS_DIR);\n const looksLikeInstall =\n (await dirExists(versionsDir)) &&\n ((await dirExists(librariesDir)) || (await dirExists(assetsDir)));\n if (!looksLikeInstall) return null;\n const versionDirs = await listChildDirectories(versionsDir);\n const minecraftVersions: string[] = [];\n const loaders: DiscoveredLoaderHint[] = [];\n for (const versionId of versionDirs) {\n const hint = inferLoaderFromVersionId(versionId);\n if (hint) {\n loaders.push(hint);\n if (hint.minecraftVersion && !minecraftVersions.includes(hint.minecraftVersion)) {\n minecraftVersions.push(hint.minecraftVersion);\n }\n } else {\n minecraftVersions.push(versionId);\n }\n }\n const runtime = await discoverRuntime(directory);\n return { id, directory, minecraftVersions, loaders, ...(runtime ? { runtime } : {}) };\n};\n\nconst discoverRuntime = async (directory: string): Promise<DiscoveredRuntimeHint | undefined> => {\n const runtimeDir = path.join(directory, RUNTIMES_DIR);\n if (!(await dirExists(runtimeDir))) return undefined;\n let components: readonly string[];\n try {\n components = await listChildDirectories(runtimeDir);\n } catch {\n return undefined;\n }\n for (const component of components) {\n const root = path.join(runtimeDir, component);\n const javaPath = javaExecutablePath(root);\n if (await fileExists(javaPath)) {\n return { component, javaPath };\n }\n }\n return undefined;\n};\n\nconst inferLoaderFromVersionId = (versionId: string): DiscoveredLoaderHint | null => {\n const fabricMatch = /^fabric-loader-([^-]+)-(.+)$/.exec(versionId);\n if (fabricMatch?.[1] && fabricMatch[2]) {\n return { type: Loaders.FABRIC, version: fabricMatch[1], minecraftVersion: fabricMatch[2] };\n }\n const forgeMatch = /^([^-]+)-forge-(.+)$/.exec(versionId);\n if (forgeMatch?.[1] && forgeMatch[2]) {\n return { type: Loaders.FORGE, minecraftVersion: forgeMatch[1], version: forgeMatch[2] };\n }\n return null;\n};\n\nconst javaExecutablePath = (runtimeRoot: string): string => {\n if (process.platform === \"win32\") return path.join(runtimeRoot, \"bin\", \"javaw.exe\");\n if (process.platform === \"darwin\") {\n return path.join(runtimeRoot, \"jre.bundle\", \"Contents\", \"Home\", \"bin\", \"java\");\n }\n return path.join(runtimeRoot, \"bin\", \"java\");\n};\n","import { planInstall } from \"../install/planner\";\nimport { runInstall } from \"../install/runner\";\nimport type { MetadataCache } from \"../types/cache\";\nimport type { ProgressListener } from \"../types/events\";\nimport type { HttpClient } from \"../types/http\";\nimport type { Spawner } from \"../types/spawner\";\nimport type { Target } from \"../types/target\";\nimport type { UpdatePlan, UpdateReport } from \"../types/update\";\n\n/** Inputs to {@link planUpdate}. */\nexport type PlanUpdateInput = {\n readonly target: Target;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n};\n\n/**\n * Build an update plan. Structurally identical to an install plan — the install runner\n * already skips files whose on-disk size + sha1 match the manifest, so \"update\" and\n * \"install\" share the same action list.\n */\nexport const planUpdate = async (input: PlanUpdateInput): Promise<UpdatePlan> => {\n return planInstall({\n target: input.target,\n http: input.http,\n cache: input.cache,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n};\n\n/** Inputs to the update runner. */\nexport type RunUpdateInput = {\n readonly plan: UpdatePlan;\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly spawner: Spawner;\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\n/**\n * Execute an update plan. Reuses the install runner; already-correct files are skipped\n * automatically and counted in the `actionsSkipped` field of the report.\n */\nexport const runUpdate = async (input: RunUpdateInput): Promise<UpdateReport> => {\n const report = await runInstall({\n plan: input.plan,\n http: input.http,\n cache: input.cache,\n spawner: input.spawner,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n ...(input.onEvent !== undefined ? { onEvent: input.onEvent } : {}),\n });\n return {\n targetId: report.targetId,\n bytesDownloaded: report.bytesDownloaded,\n actionsCompleted: report.actionsCompleted,\n actionsSkipped: report.actionsSkipped,\n durationMs: report.durationMs,\n };\n};\n","import { ApiEndpoints } from \"../constants/api\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { fetchJson } from \"../http/metadata\";\nimport type {\n FabricCompatibilityEntry,\n FabricLoaderSummary,\n FabricProfile,\n ResolvedFabricLoader,\n} from \"../types/fabric\";\nimport { Loaders, VersionPreference, type VersionPreferenceKind } from \"../types/loader\";\nimport type { ResolverContext } from \"./context\";\n\n/** Inputs to {@link FabricVersionsApi.list}. */\nexport type FabricListInput = {\n readonly minecraftVersion?: string;\n readonly signal?: AbortSignal;\n};\n\n/** Inputs to {@link FabricVersionsApi.resolve}. */\nexport type FabricResolveInput = {\n readonly minecraftVersion: string;\n readonly preference?: VersionPreferenceKind;\n readonly loaderVersion?: string;\n readonly signal?: AbortSignal;\n};\n\n/** Public Fabric versions API surface. */\nexport class FabricVersionsApi {\n constructor(private readonly ctx: ResolverContext) {}\n\n /** List Fabric loader versions, optionally constrained to a Minecraft version. */\n async list(input: FabricListInput = {}): Promise<readonly FabricLoaderSummary[]> {\n if (input.minecraftVersion === undefined) {\n return fetchJson<readonly FabricLoaderSummary[]>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.fabric.loaderVersions(),\n cacheKey: \"fabric-loader-all\",\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n }\n const compat = await fetchJson<readonly FabricCompatibilityEntry[]>(\n this.ctx.http,\n this.ctx.cache,\n {\n url: ApiEndpoints.fabric.loaderForGame(input.minecraftVersion),\n cacheKey: `fabric-loader-mc:${input.minecraftVersion}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n },\n );\n return compat.map((c) => c.loader);\n }\n\n /** Resolve a Fabric loader version against a Minecraft version. */\n async resolve(input: FabricResolveInput): Promise<ResolvedFabricLoader> {\n const loaders = await this.list({\n minecraftVersion: input.minecraftVersion,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (loaders.length === 0) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_NOT_FOUND,\n `No Fabric loader available for Minecraft ${input.minecraftVersion}`,\n { context: { version: input.minecraftVersion } },\n );\n }\n const chosen = pickFabricLoader(loaders, input);\n if (!chosen) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_NOT_FOUND,\n `Fabric loader version not found: ${input.loaderVersion ?? \"(none matched)\"}`,\n {\n context: input.loaderVersion !== undefined ? { version: input.loaderVersion } : {},\n },\n );\n }\n const profile = await fetchJson<FabricProfile>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.fabric.profile(input.minecraftVersion, chosen.version),\n cacheKey: `fabric-profile:${input.minecraftVersion}:${chosen.version}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n return {\n type: Loaders.FABRIC,\n minecraftVersion: input.minecraftVersion,\n loaderVersion: chosen.version,\n profile,\n };\n }\n}\n\nconst pickFabricLoader = (\n loaders: readonly FabricLoaderSummary[],\n input: FabricResolveInput,\n): FabricLoaderSummary | undefined => {\n if (input.loaderVersion !== undefined) {\n return loaders.find((l) => l.version === input.loaderVersion);\n }\n const preference = input.preference ?? VersionPreference.LATEST;\n if (preference === VersionPreference.RECOMMENDED) {\n const stable = loaders.find((l) => l.stable);\n if (stable) return stable;\n }\n return loaders[0];\n};\n","/**\n * Extract every `<version>...</version>` element from a Maven `maven-metadata.xml`. The\n * structure is rigid enough that a regex-based extractor is robust here — no full XML parser\n * dependency required.\n */\nexport const parseMavenMetadataVersions = (xml: string): readonly string[] => {\n const versions: string[] = [];\n const regex = /<version>\\s*([^<]+?)\\s*<\\/version>/g;\n for (const match of xml.matchAll(regex)) {\n if (match[1]) versions.push(match[1]);\n }\n return versions;\n};\n","import { ApiEndpoints } from \"../constants/api\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { parseMavenMetadataVersions } from \"../core/xml\";\nimport { fetchJson, fetchText } from \"../http/metadata\";\nimport type { ForgeBuildSummary, ResolvedForgeLoader } from \"../types/forge\";\nimport { Loaders, VersionPreference, type VersionPreferenceKind } from \"../types/loader\";\nimport type { ResolverContext } from \"./context\";\n\n/** Inputs to {@link ForgeVersionsApi.list}. */\nexport type ForgeListInput = {\n readonly minecraftVersion?: string;\n readonly signal?: AbortSignal;\n};\n\n/** Inputs to {@link ForgeVersionsApi.resolve}. */\nexport type ForgeResolveInput = {\n readonly minecraftVersion: string;\n readonly preference?: VersionPreferenceKind;\n readonly forgeVersion?: string;\n readonly signal?: AbortSignal;\n};\n\n/** Public Forge versions API surface. */\nexport class ForgeVersionsApi {\n constructor(private readonly ctx: ResolverContext) {}\n\n /** List Forge builds (across all Minecraft versions, or filtered to one). */\n async list(input: ForgeListInput = {}): Promise<readonly ForgeBuildSummary[]> {\n const xml = await fetchText(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.forge.mavenMetadata(),\n cacheKey: \"forge-maven-metadata\",\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const allVersions = parseMavenMetadataVersions(xml);\n const promotions = await fetchJson<ForgePromotions>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.forge.promotions(),\n cacheKey: \"forge-promotions\",\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n const summaries = allVersions\n .map((fullVersion) => buildSummary(fullVersion, promotions))\n .filter((s): s is ForgeBuildSummary => s !== null);\n if (input.minecraftVersion === undefined) return summaries;\n return summaries.filter((s) => s.minecraftVersion === input.minecraftVersion);\n }\n\n /** Resolve a Forge build for a Minecraft version. */\n async resolve(input: ForgeResolveInput): Promise<ResolvedForgeLoader> {\n const builds = await this.list({\n minecraftVersion: input.minecraftVersion,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (builds.length === 0) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_NOT_FOUND,\n `No Forge build available for Minecraft ${input.minecraftVersion}`,\n { context: { version: input.minecraftVersion } },\n );\n }\n const chosen = pickForge(builds, input);\n if (!chosen) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_NOT_FOUND,\n `Forge build not found for ${input.minecraftVersion}: ${input.forgeVersion ?? \"(none matched)\"}`,\n {\n context: input.forgeVersion !== undefined ? { version: input.forgeVersion } : {},\n },\n );\n }\n return {\n type: Loaders.FORGE,\n minecraftVersion: chosen.minecraftVersion,\n forgeVersion: chosen.forgeVersion,\n fullVersion: chosen.fullVersion,\n installerUrl: ApiEndpoints.forge.installer(chosen.fullVersion),\n };\n }\n}\n\ntype ForgePromotions = {\n readonly promos: Readonly<Record<string, string>>;\n};\n\nconst buildSummary = (\n fullVersion: string,\n promotions: ForgePromotions,\n): ForgeBuildSummary | null => {\n const dashIndex = fullVersion.indexOf(\"-\");\n if (dashIndex <= 0 || dashIndex === fullVersion.length - 1) return null;\n const minecraftVersion = fullVersion.slice(0, dashIndex);\n const forgeVersion = fullVersion.slice(dashIndex + 1);\n const promos = promotions.promos;\n const recommended = promos[`${minecraftVersion}-recommended`];\n const latest = promos[`${minecraftVersion}-latest`];\n return {\n fullVersion,\n minecraftVersion,\n forgeVersion,\n isRecommended: recommended === forgeVersion,\n isLatest: latest === forgeVersion,\n };\n};\n\nconst pickForge = (\n builds: readonly ForgeBuildSummary[],\n input: ForgeResolveInput,\n): ForgeBuildSummary | undefined => {\n if (input.forgeVersion !== undefined) {\n return builds.find(\n (b) => b.forgeVersion === input.forgeVersion || b.fullVersion === input.forgeVersion,\n );\n }\n const preference = input.preference ?? VersionPreference.RECOMMENDED;\n if (preference === VersionPreference.RECOMMENDED) {\n const recommended = builds.find((b) => b.isRecommended);\n if (recommended) return recommended;\n }\n const latest = builds.find((b) => b.isLatest);\n if (latest) return latest;\n return builds[builds.length - 1];\n};\n","/**\n * Lightweight runtime shape checks for JSON pulled over the network. The kit ships without\n * Zod to keep the dependency surface flat; these helpers cover the \"is this the shape we\n * declared, or did the server change its mind\" question at the cost of a few lines per\n * endpoint. Pair with {@link import(\"./json\").parseJsonAs}.\n */\n\n/** True when `value` is a non-null object. */\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\n/** True when `value` is a non-empty string. */\nexport const isNonEmptyString = (value: unknown): value is string => {\n return typeof value === \"string\" && value.length > 0;\n};\n\n/** True when `value` is a finite non-negative integer (size / count / etc.). */\nexport const isNonNegativeInteger = (value: unknown): value is number => {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0;\n};\n\n/** True when `value` is an array and every element passes `itemGuard`. */\nexport const isArrayOf = <T>(\n value: unknown,\n itemGuard: (item: unknown) => item is T,\n): value is readonly T[] => {\n return Array.isArray(value) && value.every(itemGuard);\n};\n\n/** True when `value` is a 40-character lower-case hex SHA-1 digest. */\nexport const isSha1Hex = (value: unknown): value is string => {\n return typeof value === \"string\" && /^[0-9a-f]{40}$/.test(value);\n};\n\n/**\n * True when `value` looks like a `{ sha1, size, url }` artifact entry. We don't enforce\n * `isSha1Hex(sha1)` here because some legacy / old-alpha manifests ship non-hex placeholder\n * strings — the boundary check is about \"shape is right\", not \"values are well-formed\".\n * Hash integrity is verified later at the download site.\n */\nexport const isArtifactDownload = (\n value: unknown,\n): value is { sha1: string; size: number; url: string } => {\n if (!isPlainObject(value)) return false;\n return (\n typeof value.sha1 === \"string\" && typeof value.size === \"number\" && isNonEmptyString(value.url)\n );\n};\n\n/**\n * Light-touch guard for Mojang per-version manifests. Only checks the fields the kit\n * actually reads at the boundary; deep validation lives downstream where each field is\n * actually consumed.\n */\nexport const isMinecraftVersionManifestShape = (\n value: unknown,\n): value is {\n id: string;\n mainClass: string;\n assetIndex: { id: string; sha1: string; size: number; url: string };\n downloads: { client: { sha1: string; size: number; url: string } };\n} => {\n if (!isPlainObject(value)) return false;\n if (!isNonEmptyString(value.id)) return false;\n if (!isNonEmptyString(value.mainClass)) return false;\n if (!isPlainObject(value.assetIndex)) return false;\n if (\n !isNonEmptyString(value.assetIndex.id) ||\n typeof value.assetIndex.sha1 !== \"string\" ||\n typeof value.assetIndex.size !== \"number\" ||\n !isNonEmptyString(value.assetIndex.url)\n ) {\n return false;\n }\n if (!isPlainObject(value.downloads)) return false;\n return isArtifactDownload((value.downloads as Record<string, unknown>).client);\n};\n","import { ApiEndpoints } from \"../constants/api\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { isMinecraftVersionManifestShape } from \"../core/guards\";\nimport { fetchJson } from \"../http/metadata\";\nimport type {\n MinecraftChannel,\n MinecraftVersionManifest,\n MinecraftVersionSummary,\n ResolvedMinecraft,\n} from \"../types/minecraft\";\nimport type { ResolverContext } from \"./context\";\n\n/** Top-level shape returned by `version_manifest_v2.json`. */\ntype VersionManifestRoot = {\n readonly latest: { readonly release: string; readonly snapshot: string };\n readonly versions: readonly MinecraftVersionSummary[];\n};\n\n/** Inputs to {@link MinecraftVersionsApi.list}. */\nexport type MinecraftListInput = {\n readonly channel?: MinecraftChannel;\n readonly signal?: AbortSignal;\n};\n\n/** Inputs to {@link MinecraftVersionsApi.latest}. */\nexport type MinecraftLatestInput = {\n readonly channel?: MinecraftChannel;\n readonly signal?: AbortSignal;\n};\n\n/** Inputs to {@link MinecraftVersionsApi.get} / `.resolve`. */\nexport type MinecraftGetInput = {\n readonly version: string;\n readonly signal?: AbortSignal;\n};\n\n/** Public Minecraft versions API surface. */\nexport class MinecraftVersionsApi {\n constructor(private readonly ctx: ResolverContext) {}\n\n /** List all Minecraft versions, optionally filtered by channel. */\n async list(input: MinecraftListInput = {}): Promise<readonly MinecraftVersionSummary[]> {\n const root = await this.fetchManifestRoot(input.signal);\n if (input.channel === undefined) return root.versions;\n return root.versions.filter((v) => v.type === input.channel);\n }\n\n /** Return the latest version on the given channel (defaults to RELEASE). */\n async latest(input: MinecraftLatestInput = {}): Promise<MinecraftVersionSummary> {\n const root = await this.fetchManifestRoot(input.signal);\n const targetId = input.channel === \"snapshot\" ? root.latest.snapshot : root.latest.release;\n const summary = root.versions.find((v) => v.id === targetId);\n if (!summary) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_NOT_FOUND,\n `Latest version ${targetId} not found in manifest`,\n );\n }\n return summary;\n }\n\n /** Return a single version summary or throw `MANIFEST_NOT_FOUND`. */\n async get(input: MinecraftGetInput): Promise<MinecraftVersionSummary> {\n const root = await this.fetchManifestRoot(input.signal);\n const summary = root.versions.find((v) => v.id === input.version);\n if (!summary) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_NOT_FOUND,\n `Minecraft version not found: ${input.version}`,\n { context: { version: input.version } },\n );\n }\n return summary;\n }\n\n /** Fetch and parse the per-version manifest in addition to the summary. */\n async resolve(input: MinecraftGetInput): Promise<ResolvedMinecraft> {\n const summary = await this.get(input);\n const raw = await fetchJson<unknown>(this.ctx.http, this.ctx.cache, {\n url: summary.url,\n cacheKey: `minecraft-manifest:${summary.id}:${summary.sha1}`,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n if (!isMinecraftVersionManifestShape(raw)) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.MANIFEST_INVALID,\n `Per-version manifest does not match the expected shape: ${summary.id}`,\n { context: { version: summary.id, url: summary.url } },\n );\n }\n const manifest = raw as unknown as MinecraftVersionManifest;\n return {\n version: summary.id,\n channel: summary.type,\n manifest,\n summary,\n };\n }\n\n private async fetchManifestRoot(signal: AbortSignal | undefined): Promise<VersionManifestRoot> {\n return fetchJson<VersionManifestRoot>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.mojang.versionManifest(),\n cacheKey: \"minecraft-version-manifest-v2\",\n ...(signal !== undefined ? { signal } : {}),\n });\n }\n}\n","import { RuntimeComponents } from \"../types/runtime\";\n\n/**\n * Fallback Mojang component when the per-version manifest declares none. Pre-1.7 vanilla\n * versions and a handful of legacy snapshots fall in this bucket.\n */\nexport const FALLBACK_COMPONENT: string = RuntimeComponents.JRE_LEGACY;\n","import { ApiEndpoints } from \"../constants/api\";\nimport { RUNTIME_PLATFORM_KEYS } from \"../constants/platform\";\nimport { FALLBACK_COMPONENT } from \"../constants/runtime\";\nimport { MinecraftKitError, MinecraftKitErrorCodes } from \"../core/errors\";\nimport { fetchJson } from \"../http/metadata\";\nimport { RuntimePreference, type RuntimePreferenceKind } from \"../types/runtime\";\nimport type { ResolvedRuntime, RuntimeIndex, RuntimeIndexEntry } from \"../types/runtime\";\nimport type { RuntimeSystem } from \"../types/system\";\nimport type { ResolverContext } from \"./context\";\n\n/** Inputs to {@link RuntimeVersionsApi.list}. */\nexport type RuntimeListInput = {\n readonly system: RuntimeSystem;\n readonly minecraftVersion?: string;\n readonly signal?: AbortSignal;\n};\n\n/** A summary entry for the list API. */\nexport type RuntimeListEntry = {\n readonly component: string;\n readonly platformKey: string;\n readonly versionName: string;\n readonly released: string;\n readonly manifestUrl: string;\n};\n\n/** Inputs to {@link RuntimeVersionsApi.resolve}. */\nexport type RuntimeResolveInput = {\n readonly system: RuntimeSystem;\n readonly minecraftVersion?: string;\n readonly component?: string;\n readonly preference?: RuntimePreferenceKind;\n readonly signal?: AbortSignal;\n};\n\n/** Public runtime versions API surface. */\nexport class RuntimeVersionsApi {\n constructor(private readonly ctx: ResolverContext) {}\n\n /** List available runtime entries for the host platform. */\n async list(input: RuntimeListInput): Promise<readonly RuntimeListEntry[]> {\n const platformKey = pickPlatformKey(input.system);\n const index = await this.fetchIndex(input.signal);\n const platform = index[platformKey];\n if (!platform) return [];\n const entries: RuntimeListEntry[] = [];\n for (const [component, items] of Object.entries(platform)) {\n for (const item of items) {\n entries.push({\n component,\n platformKey,\n versionName: item.version.name,\n released: item.version.released,\n manifestUrl: item.manifest.url,\n });\n }\n }\n return entries;\n }\n\n /** Resolve a single runtime for the host platform and Minecraft version. */\n async resolve(input: RuntimeResolveInput): Promise<ResolvedRuntime> {\n const platformKey = pickPlatformKey(input.system);\n const index = await this.fetchIndex(input.signal);\n const platform = index[platformKey];\n if (!platform) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.RUNTIME_UNSUPPORTED_PLATFORM,\n `No runtimes published for platform: ${platformKey}`,\n { context: { platform: platformKey } },\n );\n }\n const component = input.component ?? FALLBACK_COMPONENT;\n const candidates = platform[component] ?? [];\n if (candidates.length === 0) {\n const all = Object.entries(platform);\n const preference = input.preference ?? RuntimePreference.RECOMMENDED;\n if (preference === RuntimePreference.LATEST) {\n const fallback = pickLatestAcrossComponents(all);\n if (fallback) {\n return toResolved(fallback.component, platformKey, fallback.entry, input.system);\n }\n }\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.RUNTIME_NOT_FOUND,\n `Runtime component ${component} not available on ${platformKey}`,\n { context: { platform: platformKey, version: component } },\n );\n }\n const entry = candidates[0];\n if (!entry) {\n throw new MinecraftKitError(\n MinecraftKitErrorCodes.RUNTIME_NOT_FOUND,\n `Runtime component ${component} list is empty for ${platformKey}`,\n { context: { platform: platformKey, version: component } },\n );\n }\n return toResolved(component, platformKey, entry, input.system);\n }\n\n private async fetchIndex(signal: AbortSignal | undefined): Promise<RuntimeIndex> {\n return fetchJson<RuntimeIndex>(this.ctx.http, this.ctx.cache, {\n url: ApiEndpoints.mojang.runtimeIndex(),\n cacheKey: \"mojang-runtime-index\",\n ...(signal !== undefined ? { signal } : {}),\n });\n }\n}\n\nconst pickPlatformKey = (system: RuntimeSystem): string => {\n const archMap = RUNTIME_PLATFORM_KEYS[system.os];\n return archMap[system.arch];\n};\n\nconst pickLatestAcrossComponents = (\n entries: readonly [string, readonly RuntimeIndexEntry[]][],\n): { readonly component: string; readonly entry: RuntimeIndexEntry } | null => {\n let bestComponent: string | null = null;\n let bestEntry: RuntimeIndexEntry | null = null;\n for (const [component, list] of entries) {\n for (const entry of list) {\n if (!bestEntry || entry.version.released > bestEntry.version.released) {\n bestComponent = component;\n bestEntry = entry;\n }\n }\n }\n if (!bestComponent || !bestEntry) return null;\n return { component: bestComponent, entry: bestEntry };\n};\n\nconst toResolved = (\n component: string,\n platformKey: string,\n entry: RuntimeIndexEntry,\n system: RuntimeSystem,\n): ResolvedRuntime => {\n const majorVersion = parseMajorVersion(entry.version.name);\n return {\n component,\n platformKey,\n versionName: entry.version.name,\n ...(majorVersion !== undefined ? { majorVersion } : {}),\n system,\n manifestUrl: entry.manifest.url,\n manifestSha1: entry.manifest.sha1,\n };\n};\n\n/** Parse the leading integer from a runtime versionName (`\"21.0.8\"` → 21). */\nexport const parseMajorVersion = (versionName: string): number | undefined => {\n const match = /^(\\d+)/.exec(versionName);\n if (!match || !match[1]) return undefined;\n const parsed = Number.parseInt(match[1], 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n};\n","import { MojangAuthApi } from \"./auth/index\";\nimport { silentLogger } from \"./core/logger\";\nimport type { PauseController } from \"./core/pause-controller\";\nimport { detectSystem } from \"./core/system\";\nimport { createMemoryCache } from \"./http/cache\";\nimport { FetchHttpClient } from \"./http/client\";\nimport { planInstall } from \"./install/planner\";\nimport { runInstall } from \"./install/runner\";\nimport {\n type PlanStandaloneRuntimeInstallInput,\n planRuntimeInstall,\n planStandaloneRuntimeInstall,\n} from \"./install/runtime-install\";\nimport { composeLaunch } from \"./launch/compose\";\nimport { runLaunch } from \"./launch/runner\";\nimport { ChildProcessSpawner } from \"./launch/spawner\";\nimport { type RepairAllReport, repairAll } from \"./repair/all\";\nimport { planFabricRepair } from \"./repair/fabric\";\nimport { planForgeRepair } from \"./repair/forge\";\nimport { planMinecraftRepair } from \"./repair/minecraft\";\nimport { runRepair } from \"./repair/runner\";\nimport { planRuntimeRepair } from \"./repair/runtime\";\nimport { TargetsApi } from \"./targets/index\";\nimport type { MetadataCache } from \"./types/cache\";\nimport type { OperationOptions, ProgressListener } from \"./types/events\";\nimport type { HttpClient } from \"./types/http\";\nimport type { DownloadAction, InstallPlan, InstallReport } from \"./types/install\";\nimport type {\n LaunchComposition,\n LaunchOptions,\n LaunchRunOptions,\n LaunchSession,\n} from \"./types/launch\";\nimport type { Logger } from \"./types/logger\";\nimport type { RepairPlan, RepairReport } from \"./types/repair\";\nimport type { Spawner } from \"./types/spawner\";\nimport type { RuntimeSystem } from \"./types/system\";\nimport type { Target } from \"./types/target\";\nimport type { UpdatePlan, UpdateReport } from \"./types/update\";\nimport type { VerificationResult } from \"./types/verify\";\nimport { planUpdate, runUpdate } from \"./update/runner\";\nimport { verifyFabric } from \"./verify/fabric\";\nimport { verifyForge } from \"./verify/forge\";\nimport { verifyMinecraft } from \"./verify/minecraft\";\nimport { verifyRuntime } from \"./verify/runtime\";\nimport { FabricVersionsApi } from \"./versions/fabric\";\nimport { ForgeVersionsApi } from \"./versions/forge\";\nimport { MinecraftVersionsApi } from \"./versions/minecraft\";\nimport { RuntimeVersionsApi } from \"./versions/runtime\";\n\n/** Constructor options for {@link MinecraftKit}. */\nexport type MinecraftKitOptions = {\n readonly httpClient?: HttpClient;\n readonly cache?: MetadataCache;\n readonly logger?: Logger;\n readonly system?: RuntimeSystem;\n readonly spawner?: Spawner;\n};\n\n/**\n * Single facade for the entire library.\n *\n * @example\n * ```ts\n * const kit = new MinecraftKit();\n * const target = await kit.targets.resolve({ id, directory, minecraft: { version: '1.20.1' }, loader: { type: Loaders.VANILLA } });\n * const plan = await kit.install.plan(target);\n * await kit.install.run(plan, { onEvent: console.log });\n * ```\n */\nexport class MinecraftKit {\n readonly versions: {\n readonly minecraft: MinecraftVersionsApi;\n readonly fabric: FabricVersionsApi;\n readonly forge: ForgeVersionsApi;\n readonly runtime: RuntimeVersionsApi;\n };\n readonly targets: TargetsApi;\n readonly install: {\n plan(target: Target, options?: OperationOptions): Promise<InstallPlan>;\n run(plan: InstallPlan, options?: InstallRunOptions): Promise<InstallReport>;\n /** Install only the Java runtime declared by `target.runtime` (honours `installRoot`). */\n readonly runtime: {\n plan(target: Target, options?: OperationOptions): Promise<InstallPlan>;\n run(plan: InstallPlan, options?: InstallRunOptions): Promise<InstallReport>;\n /**\n * Plan a runtime-only install without an existing Minecraft Target. The caller\n * supplies a {@link ResolvedRuntime} (typically from `kit.versions.runtime.resolve`)\n * plus a directory and stable id.\n */\n standalonePlan(\n input: Omit<PlanStandaloneRuntimeInstallInput, \"http\" | \"cache\">,\n ): Promise<InstallPlan>;\n };\n };\n readonly update: {\n plan(target: Target, options?: OperationOptions): Promise<UpdatePlan>;\n run(plan: UpdatePlan, options?: OperationOptions): Promise<UpdateReport>;\n };\n readonly verify: {\n /** Verify the vanilla Minecraft slice (client jar, libraries, assets, natives, log config). */\n readonly minecraft: {\n run(target: Target, options?: VerifyOperationOptions): Promise<VerificationResult>;\n };\n /** Verify the Fabric loader slice (profile JSON + libraries). Throws on non-Fabric targets. */\n readonly fabric: {\n run(target: Target, options?: VerifyOperationOptions): Promise<VerificationResult>;\n };\n /** Verify the Forge loader slice (version JSON + libraries). Throws on non-Forge targets. */\n readonly forge: {\n run(target: Target, options?: VerifyOperationOptions): Promise<VerificationResult>;\n };\n /** Verify the Java runtime files. Honours `target.runtime.installRoot` for shared installs. */\n readonly runtime: {\n run(target: Target, options?: VerifyOperationOptions): Promise<VerificationResult>;\n };\n };\n readonly repair: {\n /** Repair the vanilla Minecraft slice (client jar, libraries, assets, natives, log config). */\n readonly minecraft: RepairAspect;\n /** Repair the Fabric loader slice (profile JSON + libraries). Throws on non-Fabric targets. */\n readonly fabric: RepairAspect;\n /** Repair the Forge loader slice (version JSON + libraries + processors). Throws on non-Forge. */\n readonly forge: RepairAspect;\n /** Repair the Java runtime files. Honours `target.runtime.installRoot`. */\n readonly runtime: RepairAspect;\n /** Verify every applicable aspect (Minecraft + Runtime + active loader) and repair each broken one. */\n all(target: Target, options?: OperationOptions): Promise<RepairAllReport>;\n };\n readonly launch: {\n compose(target: Target, options: LaunchOptions): Promise<LaunchComposition>;\n run(composition: LaunchComposition, options?: LaunchRunOptions): LaunchSession;\n };\n /**\n * Microsoft / Mojang authentication. Implements the device-code flow against Microsoft\n * Entra, exchanges the resulting tokens for an XSTS + Minecraft session, and returns\n * everything needed to compose an `OnlineAuth` for `launch.compose`.\n */\n readonly auth: MojangAuthApi;\n\n /** Cache surface useful for advanced consumers (e.g. clearing between operations). */\n readonly cache: MetadataCache;\n\n constructor(options: MinecraftKitOptions = {}) {\n const http = options.httpClient ?? new FetchHttpClient();\n const cache = options.cache ?? createMemoryCache();\n const logger = options.logger ?? silentLogger;\n const system = options.system ?? detectSystem();\n const spawner = options.spawner ?? new ChildProcessSpawner();\n const ctx = { http, cache, logger };\n\n const minecraft = new MinecraftVersionsApi(ctx);\n const fabric = new FabricVersionsApi(ctx);\n const forge = new ForgeVersionsApi(ctx);\n const runtime = new RuntimeVersionsApi(ctx);\n this.versions = { minecraft, fabric, forge, runtime };\n this.targets = new TargetsApi({ minecraft, fabric, forge, runtime, system });\n this.auth = new MojangAuthApi(http);\n this.cache = cache;\n\n // Carry signal/onEvent from operation-level options through to internal call sites.\n // Centralising this avoids the same conditional spread appearing in every method below.\n const carry = (opts: { signal?: AbortSignal; onEvent?: ProgressListener } | undefined) => ({\n ...(opts?.signal !== undefined ? { signal: opts.signal } : {}),\n ...(opts?.onEvent !== undefined ? { onEvent: opts.onEvent } : {}),\n });\n\n const carryInstall = (opts: InstallRunOptions | undefined) => ({\n ...carry(opts),\n ...(opts?.pauseController !== undefined ? { pauseController: opts.pauseController } : {}),\n ...(opts?.actionCategories !== undefined ? { actionCategories: opts.actionCategories } : {}),\n });\n\n const runInstallPlan = (plan: InstallPlan, opts?: InstallRunOptions) =>\n runInstall({ plan, http, cache, spawner, ...carryInstall(opts) });\n\n this.install = {\n plan: (target, opts) => planInstall({ target, http, cache, ...carry(opts) }),\n run: runInstallPlan,\n runtime: {\n plan: (target, opts) => planRuntimeInstall({ target, http, cache, ...carry(opts) }),\n run: runInstallPlan,\n standalonePlan: (input) => planStandaloneRuntimeInstall({ ...input, http, cache }),\n },\n };\n\n this.update = {\n plan: (target, opts) => planUpdate({ target, http, cache, ...carry(opts) }),\n run: (plan, opts) => runUpdate({ plan, http, cache, spawner, ...carry(opts) }),\n };\n\n const verifyArgs = (target: Target, opts?: VerifyOperationOptions) => ({\n target,\n http,\n cache,\n ...carry(opts),\n });\n this.verify = {\n minecraft: { run: (target, opts) => verifyMinecraft(verifyArgs(target, opts)) },\n fabric: { run: (target, opts) => verifyFabric(verifyArgs(target, opts)) },\n forge: { run: (target, opts) => verifyForge(verifyArgs(target, opts)) },\n runtime: { run: (target, opts) => verifyRuntime(verifyArgs(target, opts)) },\n };\n\n const repairArgs = (target: Target, opts: RepairPlanOptions) => ({\n target,\n from: opts.from,\n http,\n cache,\n ...carry({ ...(opts.signal !== undefined ? { signal: opts.signal } : {}) }),\n });\n const runRepairPlan: RepairAspect[\"run\"] = (plan, opts) =>\n runRepair({ plan, http, cache, spawner, ...carry(opts) });\n this.repair = {\n minecraft: {\n plan: (target, opts) => planMinecraftRepair(repairArgs(target, opts)),\n run: runRepairPlan,\n },\n fabric: {\n plan: (target, opts) => planFabricRepair(repairArgs(target, opts)),\n run: runRepairPlan,\n },\n forge: {\n plan: (target, opts) => planForgeRepair(repairArgs(target, opts)),\n run: runRepairPlan,\n },\n runtime: {\n plan: (target, opts) => planRuntimeRepair(repairArgs(target, opts)),\n run: runRepairPlan,\n },\n all: (target, opts) =>\n repairAll({\n target,\n http,\n cache,\n spawner,\n ...carry(opts),\n }),\n };\n\n this.launch = {\n compose: (target, opts) => composeLaunch({ target, options: opts, logger }),\n run: (composition, opts) =>\n runLaunch({\n composition,\n ...(opts !== undefined ? { options: opts } : {}),\n spawner,\n }),\n };\n }\n}\n\n/** Options accepted by `install.run` (and `install.runtime.run`). */\nexport interface InstallRunOptions extends OperationOptions {\n readonly pauseController?: PauseController;\n readonly actionCategories?: ReadonlySet<DownloadAction[\"category\"]>;\n}\n\n/** Options accepted by every `verify.<kind>.run`. */\nexport type VerifyOperationOptions = {\n readonly signal?: AbortSignal;\n readonly onEvent?: ProgressListener;\n};\n\n/** Options for any `repair.<aspect>.plan` call. Accepts one or many verification results. */\nexport type RepairPlanOptions = {\n readonly from: VerificationResult | readonly VerificationResult[];\n readonly signal?: AbortSignal;\n};\n\n/** Shared shape of every aspect-specific repair surface (`repair.minecraft`, `.fabric`, …). */\nexport type RepairAspect = {\n plan(target: Target, options: RepairPlanOptions): Promise<RepairPlan>;\n run(plan: RepairPlan, options?: OperationOptions): Promise<RepairReport>;\n};\n","/**\n * Exhaustiveness sentinel for discriminated unions. Drop into the `default` of a switch on\n * `kind` / `type` / `status` so the compiler errors when a new variant is added but the\n * switch is not updated.\n *\n * ```ts\n * switch (action.kind) {\n * case \"download-file\": return ...;\n * case \"write-version-json\": return ...;\n * default: return assertNever(action);\n * }\n * ```\n */\nexport const assertNever = (value: never): never => {\n throw new Error(`Unhandled variant: ${JSON.stringify(value)}`);\n};\n","import { EventTypes } from \"../types/events\";\nimport type { ProgressEvent, ProgressListener } from \"../types/events\";\nimport {\n DownloadCategories,\n type DownloadCategory,\n type InstallPhase,\n InstallPhases,\n type InstallPlan,\n} from \"../types/install\";\n\n/** UI-oriented coarse progress stages, identical across install and repair flows. */\nexport const InstallStages = {\n PREPARE: \"prepare\",\n RUNTIME: \"runtime\",\n MINECRAFT: \"minecraft\",\n LOADER: \"loader\",\n FINALIZE: \"finalize\",\n} as const;\n\nexport type InstallStage = (typeof InstallStages)[keyof typeof InstallStages];\n\nexport type ProgressSnapshot = {\n readonly stage: InstallStage;\n readonly stagePercent: number;\n readonly overallPercent: number;\n readonly bytesDownloaded: number;\n readonly totalBytes: number;\n readonly currentFile?: string;\n};\n\nexport type ProgressTrackerOptions = {\n /** Milliseconds between snapshot pushes. Defaults to 100ms. */\n readonly throttleMs?: number;\n};\n\nexport type InstallProgressTracker = {\n /** Pass directly as the `onEvent` callback to `install.run` / `repair.run`. */\n readonly onEvent: ProgressListener;\n snapshot(): ProgressSnapshot;\n /** First push fires immediately with the initial snapshot. */\n subscribe(listener: (snapshot: ProgressSnapshot) => void): () => void;\n /** Force-emit a final 100% snapshot and stop the throttle timer. */\n finish(): void;\n};\n\nconst STAGE_FOR_CATEGORY: Record<DownloadCategory, InstallStage> = {\n [DownloadCategories.RUNTIME_FILE]: InstallStages.RUNTIME,\n [DownloadCategories.CLIENT_JAR]: InstallStages.MINECRAFT,\n [DownloadCategories.LIBRARY]: InstallStages.MINECRAFT,\n [DownloadCategories.ASSET_INDEX]: InstallStages.MINECRAFT,\n [DownloadCategories.ASSET]: InstallStages.MINECRAFT,\n [DownloadCategories.LOGGING_CONFIG]: InstallStages.MINECRAFT,\n [DownloadCategories.FABRIC_LIBRARY]: InstallStages.LOADER,\n [DownloadCategories.FORGE_LIBRARY]: InstallStages.LOADER,\n [DownloadCategories.FORGE_INSTALLER]: InstallStages.LOADER,\n};\n\nconst STAGE_FOR_PHASE: Partial<Record<InstallPhase, InstallStage>> = {\n [InstallPhases.PLANNING]: InstallStages.PREPARE,\n [InstallPhases.DOWNLOADING_VERSION_MANIFEST]: InstallStages.PREPARE,\n [InstallPhases.INSTALLING_RUNTIME]: InstallStages.RUNTIME,\n [InstallPhases.DOWNLOADING_CLIENT_JAR]: InstallStages.MINECRAFT,\n [InstallPhases.DOWNLOADING_LIBRARIES]: InstallStages.MINECRAFT,\n [InstallPhases.DOWNLOADING_ASSET_INDEX]: InstallStages.MINECRAFT,\n [InstallPhases.DOWNLOADING_ASSETS]: InstallStages.MINECRAFT,\n [InstallPhases.EXTRACTING_NATIVES]: InstallStages.MINECRAFT,\n [InstallPhases.WRITING_FILES]: InstallStages.MINECRAFT,\n [InstallPhases.INSTALLING_FABRIC]: InstallStages.LOADER,\n [InstallPhases.INSTALLING_FORGE]: InstallStages.LOADER,\n [InstallPhases.RUNNING_FORGE_PROCESSORS]: InstallStages.LOADER,\n [InstallPhases.COMPLETED]: InstallStages.FINALIZE,\n};\n\nconst ALL_STAGES: readonly InstallStage[] = [\n InstallStages.PREPARE,\n InstallStages.RUNTIME,\n InstallStages.MINECRAFT,\n InstallStages.LOADER,\n InstallStages.FINALIZE,\n];\n\n/** Aggregate `ProgressEvent`s from one install/repair run into throttled UI snapshots. */\nexport const createInstallProgressTracker = (\n plan: Pick<InstallPlan, \"actions\">,\n options: ProgressTrackerOptions = {},\n): InstallProgressTracker => {\n const throttleMs = options.throttleMs ?? 100;\n\n const stageOfTarget = new Map<string, InstallStage>();\n const expectedSizeOf = new Map<string, number>();\n const stageTotals: Record<InstallStage, number> = {\n prepare: 0,\n runtime: 0,\n minecraft: 0,\n loader: 0,\n finalize: 0,\n };\n let overallTotal = 0;\n for (const action of plan.actions) {\n if (action.kind !== \"download-file\") continue;\n const stage = STAGE_FOR_CATEGORY[action.category] ?? InstallStages.MINECRAFT;\n stageOfTarget.set(action.target, stage);\n const size = action.expectedSize ?? 0;\n expectedSizeOf.set(action.target, size);\n stageTotals[stage] += size;\n overallTotal += size;\n }\n\n const stageDone: Record<InstallStage, number> = {\n prepare: 0,\n runtime: 0,\n minecraft: 0,\n loader: 0,\n finalize: 0,\n };\n const stageInFlight: Record<InstallStage, number> = {\n prepare: 0,\n runtime: 0,\n minecraft: 0,\n loader: 0,\n finalize: 0,\n };\n let totalDone = 0;\n let totalInFlight = 0;\n const inFlightByTarget = new Map<string, { stage: InstallStage; bytes: number }>();\n let currentStage: InstallStage = InstallStages.PREPARE;\n let currentFile: string | undefined;\n\n const listeners = new Set<(snapshot: ProgressSnapshot) => void>();\n let lastPushAt = 0;\n let pending = false;\n let pendingTimer: NodeJS.Timeout | null = null;\n let finished = false;\n\n const snapshot = (): ProgressSnapshot => {\n const stageTotal = stageTotals[currentStage];\n const stageBytes = stageDone[currentStage] + stageInFlight[currentStage];\n const overallBytes = totalDone + totalInFlight;\n return {\n stage: currentStage,\n stagePercent: stageTotal > 0 ? clamp((stageBytes / stageTotal) * 100) : 0,\n overallPercent: overallTotal > 0 ? clamp((overallBytes / overallTotal) * 100) : 0,\n bytesDownloaded: overallBytes,\n totalBytes: stageTotal,\n ...(currentFile !== undefined ? { currentFile } : {}),\n };\n };\n\n const clearTimer = (): void => {\n if (pendingTimer) {\n clearTimeout(pendingTimer);\n pendingTimer = null;\n }\n };\n\n const push = (): void => {\n pending = false;\n clearTimer();\n lastPushAt = Date.now();\n const snap = snapshot();\n for (const listener of listeners) listener(snap);\n };\n\n const schedulePush = (): void => {\n if (finished) return;\n const elapsed = Date.now() - lastPushAt;\n if (elapsed >= throttleMs) {\n push();\n return;\n }\n if (pending) return;\n pending = true;\n pendingTimer = setTimeout(push, throttleMs - elapsed);\n };\n\n const onEvent: ProgressListener = (event: ProgressEvent) => {\n switch (event.type) {\n case EventTypes.INSTALL_PHASE_CHANGED: {\n const next = STAGE_FOR_PHASE[event.phase];\n if (next && next !== currentStage) {\n currentStage = next;\n currentFile = undefined;\n push();\n }\n return;\n }\n case EventTypes.DOWNLOAD_STARTED: {\n const stage = stageOfTarget.get(event.file.target) ?? currentStage;\n inFlightByTarget.set(event.file.target, { stage, bytes: 0 });\n currentFile = event.file.target;\n schedulePush();\n return;\n }\n case EventTypes.DOWNLOAD_PROGRESS: {\n const entry = inFlightByTarget.get(event.file.target);\n if (entry) {\n const delta = event.bytesDownloaded - entry.bytes;\n if (delta !== 0) {\n entry.bytes = event.bytesDownloaded;\n stageInFlight[entry.stage] += delta;\n totalInFlight += delta;\n }\n }\n currentFile = event.file.target;\n schedulePush();\n return;\n }\n case EventTypes.DOWNLOAD_SKIPPED: {\n const stage = stageOfTarget.get(event.file.target);\n if (stage) {\n const size = expectedSizeOf.get(event.file.target) ?? 0;\n stageDone[stage] += size;\n totalDone += size;\n schedulePush();\n }\n return;\n }\n case EventTypes.DOWNLOAD_COMPLETED: {\n const entry = inFlightByTarget.get(event.file.target);\n if (entry) {\n const finalBytes = event.bytes ?? entry.bytes;\n stageInFlight[entry.stage] -= entry.bytes;\n totalInFlight -= entry.bytes;\n stageDone[entry.stage] += finalBytes;\n totalDone += finalBytes;\n inFlightByTarget.delete(event.file.target);\n } else {\n // No `download:started` observed (subscriber attached mid-flight, or tests).\n const stage = stageOfTarget.get(event.file.target);\n if (stage) {\n const bytes = event.bytes ?? expectedSizeOf.get(event.file.target) ?? 0;\n stageDone[stage] += bytes;\n totalDone += bytes;\n }\n }\n schedulePush();\n return;\n }\n default:\n return;\n }\n };\n\n return {\n onEvent,\n snapshot,\n subscribe(listener) {\n listeners.add(listener);\n listener(snapshot());\n return () => listeners.delete(listener);\n },\n finish() {\n finished = true;\n clearTimer();\n currentStage = InstallStages.FINALIZE;\n currentFile = undefined;\n totalDone = overallTotal;\n totalInFlight = 0;\n for (const stage of ALL_STAGES) {\n stageDone[stage] = stageTotals[stage];\n stageInFlight[stage] = 0;\n }\n const snap = snapshot();\n for (const listener of listeners) listener(snap);\n },\n };\n};\n\nconst clamp = (value: number): number => {\n if (value <= 0) return 0;\n if (value >= 100) return 100;\n return value;\n};\n","/**\n * Cooperative pause primitive. Consumers call {@link waitWhilePaused} at safe\n * checkpoints. Independent from `AbortSignal` — abort wins at the next signal\n * check.\n */\nexport class PauseController {\n #paused = false;\n #waiters: Array<() => void> = [];\n\n get paused(): boolean {\n return this.#paused;\n }\n\n pause(): void {\n this.#paused = true;\n }\n\n resume(): void {\n this.#paused = false;\n const list = this.#waiters;\n this.#waiters = [];\n for (const resolve of list) resolve();\n }\n\n waitWhilePaused(): Promise<void> {\n if (!this.#paused) return Promise.resolve();\n return new Promise<void>((resolve) => this.#waiters.push(resolve));\n }\n}\n","/**\n * All `${...}` tokens substituted into JVM and game arguments.\n *\n * This map drives both substitution at launch time and documentation generation.\n */\nexport const LAUNCH_PLACEHOLDERS = {\n \"${auth_player_name}\": \"Player display name.\",\n \"${version_name}\": \"Resolved Minecraft version id.\",\n \"${game_directory}\": \"Per-target directory.\",\n \"${assets_root}\": \"Assets root (`<directory>/assets`).\",\n \"${assets_index_name}\": \"Asset index id from the manifest.\",\n \"${auth_uuid}\": \"Player UUID (no dashes).\",\n \"${auth_access_token}\": \"Yggdrasil/MSA access token.\",\n \"${auth_session}\": \"Legacy session token (`token:<token>:<uuid>`).\",\n \"${clientid}\": \"MSA client id.\",\n \"${auth_xuid}\": \"Xbox user id.\",\n \"${user_type}\": \"`msa` | `mojang` | `legacy`.\",\n \"${user_properties}\": \"User properties JSON (often `{}`).\",\n \"${version_type}\": \"Channel string, e.g. `release`.\",\n \"${game_assets}\": \"Legacy virtual assets directory.\",\n \"${resolution_width}\": \"Window width (feature-gated).\",\n \"${resolution_height}\": \"Window height (feature-gated).\",\n \"${natives_directory}\": \"Extracted natives directory.\",\n \"${classpath}\": \"Joined classpath of libraries + version jar.\",\n \"${classpath_separator}\": \"OS-specific classpath separator (`:` / `;`).\",\n \"${library_directory}\": \"Per-target libraries directory.\",\n \"${launcher_name}\": \"Launcher brand string.\",\n \"${launcher_version}\": \"Launcher version string.\",\n \"${path}\": \"Path to the log4j config file (logging.client.argument only).\",\n} as const;\n\n/** Token literal type. */\nexport type LaunchPlaceholder = keyof typeof LAUNCH_PLACEHOLDERS;\n","/**\n * Minecraft release channels matching the `type` field of Mojang version manifest entries.\n */\nexport const MinecraftChannels = {\n RELEASE: \"release\",\n SNAPSHOT: \"snapshot\",\n OLD_BETA: \"old_beta\",\n OLD_ALPHA: \"old_alpha\",\n} as const;\n\n/** Channel literal as it appears in version manifest entries. */\nexport type MinecraftChannel = (typeof MinecraftChannels)[keyof typeof MinecraftChannels];\n\n/**\n * One entry from the top-level Minecraft `version_manifest_v2.json` listing.\n *\n * Note: this is a summary entry, not the full per-version manifest. Use\n * {@link ResolvedMinecraft} for the resolved/parsed full manifest.\n */\nexport type MinecraftVersionSummary = {\n /** Version id (e.g. `\"1.20.1\"`). */\n readonly id: string;\n /** Release channel. */\n readonly type: MinecraftChannel;\n /** URL to the per-version manifest JSON. */\n readonly url: string;\n /** Manifest's last edit time (ISO-8601). */\n readonly time: string;\n /** Original release time (ISO-8601). */\n readonly releaseTime: string;\n /** SHA-1 of the per-version manifest (added in v2). */\n readonly sha1: string;\n /** Compliance level: 0 = legacy, 1 = secure-chat / safety features. */\n readonly complianceLevel: number;\n};\n\n/** Subset of the per-version manifest used by resolvers and consumers. */\nexport type MinecraftVersionManifest = {\n readonly id: string;\n readonly type: MinecraftChannel | string;\n readonly mainClass: string;\n /** Asset index reference. */\n readonly assetIndex: AssetIndexReference;\n /** Asset index id (also exposed for legacy callers). */\n readonly assets: string;\n readonly downloads: MinecraftDownloads;\n readonly libraries: readonly MinecraftLibrary[];\n /** Modern (1.13+) argument structure. Mutually exclusive with {@link minecraftArguments}. */\n readonly arguments?: MinecraftArguments;\n /** Legacy (≤1.12.2) argument string. Mutually exclusive with {@link arguments}. */\n readonly minecraftArguments?: string;\n readonly javaVersion?: MinecraftJavaVersion;\n readonly logging?: MinecraftLogging;\n readonly inheritsFrom?: string;\n readonly releaseTime?: string;\n readonly time?: string;\n readonly minimumLauncherVersion?: number;\n readonly complianceLevel?: number;\n};\n\n/** Reference to the asset-index JSON file. */\nexport type AssetIndexReference = {\n readonly id: string;\n readonly sha1: string;\n readonly size: number;\n readonly totalSize: number;\n readonly url: string;\n};\n\n/** Per-platform downloads block of the Minecraft per-version manifest. */\nexport type MinecraftDownloads = {\n readonly client: ArtifactDownload;\n readonly server?: ArtifactDownload;\n readonly client_mappings?: ArtifactDownload;\n readonly server_mappings?: ArtifactDownload;\n};\n\n/** A single hash-verified download. */\nexport type ArtifactDownload = {\n readonly sha1: string;\n readonly size: number;\n readonly url: string;\n};\n\n/** Library entry. Combines vanilla, modern-natives, and legacy-classifier shapes. */\nexport type MinecraftLibrary = {\n readonly name: string;\n readonly downloads?: MinecraftLibraryDownloads;\n readonly natives?: Readonly<Record<string, string>>;\n readonly extract?: { readonly exclude?: readonly string[] };\n readonly rules?: readonly LibraryRule[];\n /** Some Fabric/Forge libraries carry only a Maven base URL plus a coordinate. */\n readonly url?: string;\n};\n\n/** Library downloads block. */\nexport type MinecraftLibraryDownloads = {\n readonly artifact?: LibraryArtifact;\n readonly classifiers?: Readonly<Record<string, LibraryArtifact>>;\n};\n\n/** An individual library artifact (jar/zip). */\nexport interface LibraryArtifact extends ArtifactDownload {\n readonly path: string;\n}\n\n/** Rule entry used by libraries and modern arguments. */\nexport type LibraryRule = {\n readonly action: \"allow\" | \"disallow\";\n readonly os?: { readonly name?: string; readonly arch?: string; readonly version?: string };\n readonly features?: Readonly<Record<string, boolean>>;\n};\n\n/** Modern (1.13+) arguments structure. */\nexport type MinecraftArguments = {\n readonly game: readonly ArgumentEntry[];\n readonly jvm: readonly ArgumentEntry[];\n};\n\n/** A single argument entry: bare string or rule-gated value. */\nexport type ArgumentEntry =\n | string\n | { readonly rules: readonly LibraryRule[]; readonly value: string | readonly string[] };\n\n/** Required Java runtime descriptor from the version manifest. */\nexport type MinecraftJavaVersion = {\n /** Mojang java-runtime component name (e.g. `java-runtime-gamma`). */\n readonly component: string;\n readonly majorVersion: number;\n};\n\n/** Logging-config entry from the version manifest. */\nexport type MinecraftLogging = {\n readonly client?: {\n readonly argument: string;\n readonly file: ArtifactDownload & { readonly id: string };\n readonly type: string;\n };\n};\n\n/**\n * Fully resolved Minecraft version: summary + parsed manifest, ready to feed into\n * `kit.targets.create` or `kit.install.plan`.\n */\nexport type ResolvedMinecraft = {\n /** Version id (e.g. `\"1.20.1\"`). */\n readonly version: string;\n readonly channel: MinecraftChannel;\n readonly manifest: MinecraftVersionManifest;\n readonly summary: MinecraftVersionSummary;\n};\n\n/** Asset index document body. */\nexport type AssetIndexDocument = {\n readonly objects: Readonly<Record<string, AssetObject>>;\n readonly virtual?: boolean;\n readonly map_to_resources?: boolean;\n};\n\n/** A single asset object hash + size. */\nexport type AssetObject = {\n readonly hash: string;\n readonly size: number;\n};\n","import type { MetadataCache } from \"./cache\";\nimport type { HttpClient } from \"./http\";\nimport type { InstallAction } from \"./install\";\nimport type { Target } from \"./target\";\nimport type { VerificationResult } from \"./verify\";\n\n/** Coarse-grained repair phases used for `repair:phase-changed` events. */\nexport const RepairPhases = {\n PLANNING: \"planning\",\n REPAIRING_CLIENT_JAR: \"repairing-client-jar\",\n REPAIRING_LIBRARIES: \"repairing-libraries\",\n REPAIRING_ASSETS: \"repairing-assets\",\n REPAIRING_NATIVES: \"repairing-natives\",\n REPAIRING_RUNTIME: \"repairing-runtime\",\n REPAIRING_LOADER: \"repairing-loader\",\n COMPLETED: \"completed\",\n} as const;\n\n/** Repair phase literal. */\nexport type RepairPhase = (typeof RepairPhases)[keyof typeof RepairPhases];\n\n/**\n * A repair plan is, structurally, an install plan limited to actions needed to fix the\n * issues reported by a previous {@link VerificationResult}. The runner is the same.\n */\nexport type RepairPlan = {\n readonly targetId: string;\n readonly directory: string;\n readonly target: import(\"./target\").Target;\n readonly actions: readonly InstallAction[];\n readonly totalBytes: number;\n readonly totalActions: number;\n};\n\n/** Repair report — same shape as install report. */\nexport type RepairReport = {\n readonly targetId: string;\n readonly bytesDownloaded: number;\n readonly actionsCompleted: number;\n readonly durationMs: number;\n};\n\n/**\n * Inputs accepted by every aspect-specific `planXxxRepair` (`planMinecraftRepair`,\n * `planFabricRepair`, `planForgeRepair`, `planRuntimeRepair`). The per-aspect input types\n * are aliases over this shape.\n */\nexport type AspectRepairInput = {\n readonly target: Target;\n readonly from: VerificationResult | readonly VerificationResult[];\n readonly http: HttpClient;\n readonly cache: MetadataCache;\n readonly signal?: AbortSignal;\n};\n","/**\n * Operating-system identifiers used by Mojang launcher metadata.\n *\n * Mojang manifests use `windows`, `osx`, and `linux` as canonical names. These differ\n * from Node's {@link NodeJS.Platform} values (`win32` / `darwin` / `linux`).\n */\nexport const OperatingSystems = {\n WINDOWS: \"windows\",\n OSX: \"osx\",\n LINUX: \"linux\",\n} as const;\n\n/** OS literal as used inside Mojang/Forge/Fabric JSON manifests. */\nexport type OperatingSystem = (typeof OperatingSystems)[keyof typeof OperatingSystems];\n\n/**\n * CPU architecture identifiers. Matches the values that appear in Mojang library `os.arch`\n * fields, after normalization from Node's {@link NodeJS.Architecture}.\n */\nexport const Architectures = {\n X86: \"x86\",\n X64: \"x64\",\n ARM64: \"arm64\",\n} as const;\n\n/** Architecture literal used in launcher metadata. */\nexport type Architecture = (typeof Architectures)[keyof typeof Architectures];\n\n/**\n * Identifies the host system for the launcher. All resolvers consume this object to\n * pick the right artifacts (libraries, natives, runtime).\n */\nexport type RuntimeSystem = {\n /** OS identifier (mojang naming). */\n readonly os: OperatingSystem;\n /** CPU architecture (mojang naming). */\n readonly arch: Architecture;\n /** OS version string from `os.release()`. Used to evaluate library `os.version` regex rules. */\n readonly osVersion: string;\n};\n"]}