@loontail/minecraft-kit 0.4.0 → 0.5.0
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.
- package/dist/cli/index.cjs +5037 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +2 -0
- package/dist/cli/{index.js → index.mjs} +2 -2
- package/dist/cli/index.mjs.map +1 -0
- package/dist/index.cjs +3804 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1714 -0
- package/dist/{index.js → index.mjs} +2 -2
- package/dist/index.mjs.map +1 -0
- package/package.json +8 -5
- package/dist/cli/index.js.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../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/cli/error-format.ts","../../src/cli/progress.ts","../../src/cli/scenarios/install-helpers.ts","../../src/types/minecraft.ts","../../src/cli/scenarios/types.ts","../../src/cli/scenarios/pickers.ts","../../src/cli/scenarios/install.ts","../../src/cli/scenarios/verify-repair.ts","../../src/cli/scenarios/launch.ts","../../src/cli/scenarios/inspect.ts","../../src/cli/ui.ts","../../src/cli/main.ts","../../src/cli/index.ts"],"names":["os","archDigit","path","crypto","pipeline","createWriteStream","fs","Buffer","createReadStream","pickFabricLoader","entry","process"],"mappings":"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","file":"index.mjs","sourcesContent":["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 { isMinecraftKitError } from \"../core/errors\";\n\n/**\n * Translate any error into a short, user-friendly sentence the CLI can show. Avoids leaking\n * raw `NETWORK_HTTP_ERROR: HTTP 400 …` strings to the operator.\n */\nexport function formatUserError(error: unknown): string {\n if (isMinecraftKitError(error)) {\n const status =\n typeof error.context.httpStatus === \"number\" ? error.context.httpStatus : undefined;\n if (error.code === \"NETWORK_HTTP_ERROR\" && status !== undefined) {\n if (status === 400 || status === 404) {\n return \"No matching data is available for that combination.\";\n }\n if (status === 408) return \"The server took too long to respond. Please retry.\";\n if (status === 429)\n return \"The metadata server is rate-limiting requests. Please retry shortly.\";\n if (status >= 500 && status < 600) {\n return \"The metadata server returned an error. Please retry later.\";\n }\n return `Unexpected HTTP ${status} from the metadata server.`;\n }\n switch (error.code) {\n case \"NETWORK_TIMEOUT\":\n return \"Network request timed out. Check your internet connection and retry.\";\n case \"NETWORK_ABORTED\":\n return \"The request was aborted.\";\n case \"MANIFEST_NOT_FOUND\":\n return \"Requested item is not available — try a different selection.\";\n case \"MANIFEST_INVALID\":\n return \"The metadata server returned a malformed response. Please retry.\";\n case \"INTEGRITY_HASH_MISMATCH\":\n return \"A downloaded file failed its hash check. Re-running install / repair will retry.\";\n case \"INTEGRITY_SIZE_MISMATCH\":\n return \"A downloaded file had the wrong size. Re-running install / repair will retry.\";\n case \"RUNTIME_NOT_FOUND\":\n return \"No runtime is published for that combination.\";\n case \"RUNTIME_UNSUPPORTED_PLATFORM\":\n return \"Your platform is not in Mojang's published runtime list.\";\n case \"FORGE_INSTALLER_INVALID\":\n return \"Forge installer appears to be corrupt or in an unsupported format.\";\n case \"FORGE_PROCESSOR_FAILED\":\n return \"A Forge processor failed during install.\";\n case \"LAUNCH_JAVA_NOT_FOUND\":\n return \"Could not find a Java executable. Install the runtime first.\";\n case \"LAUNCH_PROCESS_FAILED\":\n return \"Minecraft exited with an error.\";\n case \"LAUNCH_ABORTED\":\n return \"Operation was aborted.\";\n case \"INVALID_INPUT\":\n return error.message;\n case \"FILESYSTEM_PATH_TRAVERSAL\":\n return \"An archive entry tried to escape the install directory and was rejected.\";\n case \"FILESYSTEM_WRITE_ERROR\":\n case \"FILESYSTEM_READ_ERROR\":\n return `Filesystem error: ${error.message}`;\n default:\n return error.message;\n }\n }\n if (error instanceof Error) return error.message;\n return String(error);\n}\n","import type { ProgressEvent, ProgressListener } from \"../types/events\";\nimport type { InstallPhase } from \"../types/install\";\nimport type { RepairPhase } from \"../types/repair\";\nimport type { Ui, UiSpinner } from \"./ui\";\n\ntype PhaseLabel = InstallPhase | RepairPhase | \"idle\";\n\n/** Aggregated metrics produced by {@link ProgressRenderer.summary}. */\nexport interface ProgressSummary {\n readonly filesDownloaded: number;\n readonly filesSkipped: number;\n readonly filesFailed: number;\n readonly bytesDownloaded: number;\n readonly durationMs: number;\n readonly avgSpeedBps: number;\n}\n\n/** Inputs to {@link ProgressRenderer}. */\nexport interface ProgressRendererInput {\n readonly ui: Ui;\n /** Optional plan totals (used as the denominator for files / bytes when known). */\n readonly totalActions?: number;\n readonly totalBytes?: number;\n /** Label shown next to the progress bar, e.g. `\"Install\"` / `\"Repair\"` / `\"Update\"`. */\n readonly label: string;\n /** Wallclock now() — overridable for tests. */\n readonly now?: () => number;\n /** Throttle minimum between renders, in milliseconds. */\n readonly minRenderIntervalMs?: number;\n /** Override terminal width (defaults to `process.stdout.columns`). */\n readonly columns?: () => number;\n}\n\nconst DEFAULT_RENDER_INTERVAL_MS = 250;\nconst SPEED_WINDOW_MS = 5_000;\nconst BAR_WIDTH = 12;\nconst SAFETY_MARGIN = 1;\n\n/**\n * Throttled, single-line progress renderer. Listens to library {@link ProgressEvent}s and\n * updates a Ui spinner with phase, file counter, byte counter, aggregate speed, active\n * download count, and a textual progress bar. Updates land **in-place** through\n * {@link UiSpinner.message} — there is no per-event newline. Aggregate bytes are computed\n * as `completedBytes + sum(activeBytes)` so retries cannot over-count.\n */\nexport class ProgressRenderer {\n private readonly ui: Ui;\n private readonly label: string;\n private readonly totalActions: number | undefined;\n private readonly totalBytes: number | undefined;\n private readonly now: () => number;\n private readonly minRenderIntervalMs: number;\n private readonly columnsFn: () => number;\n private readonly speedSamples: { readonly ts: number; readonly bytes: number }[] = [];\n private readonly spinner: UiSpinner;\n /** Authoritative bytes for files that have completed. */\n private completedBytes = 0;\n /** Latest progress bytes for files that are currently downloading. */\n private readonly activeBytes = new Map<string, number>();\n /** Files for which `download:started` fired but `download:completed/failed` has not. */\n private readonly activeTargets = new Set<string>();\n private startedAt: number;\n private lastRenderAt = 0;\n private lastRenderedLine: string | null = null;\n private currentPhase: PhaseLabel = \"idle\";\n private filesCompleted = 0;\n private filesSkipped = 0;\n private filesFailed = 0;\n private active = false;\n\n constructor(input: ProgressRendererInput) {\n this.ui = input.ui;\n this.label = input.label;\n if (input.totalActions !== undefined) this.totalActions = input.totalActions;\n if (input.totalBytes !== undefined) this.totalBytes = input.totalBytes;\n this.now = input.now ?? (() => Date.now());\n this.minRenderIntervalMs = input.minRenderIntervalMs ?? DEFAULT_RENDER_INTERVAL_MS;\n this.columnsFn =\n input.columns ??\n (() => (typeof process.stdout.columns === \"number\" ? process.stdout.columns : 0));\n this.spinner = this.ui.spinner();\n this.startedAt = this.now();\n }\n\n /** Start the spinner and return a listener function suitable for `kit.install.run({ onEvent })`. */\n attach(): ProgressListener {\n this.active = true;\n this.startedAt = this.now();\n this.lastRenderAt = 0;\n this.lastRenderedLine = null;\n this.spinner.start(`${this.label}…`);\n return (event) => this.handle(event);\n }\n\n /** Stop the spinner with a final summary line and return the metrics. */\n finish(): ProgressSummary {\n if (!this.active) return this.summary();\n this.active = false;\n const summary = this.summary();\n this.spinner.stop(this.summaryLine(summary));\n return summary;\n }\n\n /** Stop with a failure message instead of the summary. */\n fail(message: string): void {\n if (!this.active) return;\n this.active = false;\n this.spinner.stop(`${this.label} failed: ${message}`);\n }\n\n /** Snapshot of current metrics. */\n summary(): ProgressSummary {\n const durationMs = Math.max(0, this.now() - this.startedAt);\n const bytes = this.bytesDownloadedNow();\n const avgSpeedBps = durationMs > 0 ? (bytes * 1000) / durationMs : 0;\n return {\n filesDownloaded: this.filesCompleted,\n filesSkipped: this.filesSkipped,\n filesFailed: this.filesFailed,\n bytesDownloaded: bytes,\n durationMs,\n avgSpeedBps,\n };\n }\n\n /** Handle one event. Re-rendering is throttled to {@link minRenderIntervalMs}. */\n private handle(event: ProgressEvent): void {\n let forceRender = false;\n switch (event.type) {\n case \"install:phase-changed\":\n case \"repair:phase-changed\":\n this.currentPhase = event.phase;\n forceRender = true;\n break;\n case \"download:started\":\n this.activeTargets.add(event.file.target);\n this.activeBytes.set(event.file.target, 0);\n forceRender = true;\n break;\n case \"download:progress\": {\n const previous = this.activeBytes.get(event.file.target) ?? 0;\n if (event.bytesDownloaded > previous) {\n const ts = this.now();\n this.speedSamples.push({ ts, bytes: event.bytesDownloaded - previous });\n const cutoff = ts - SPEED_WINDOW_MS;\n while (this.speedSamples.length > 0 && this.speedSamples[0]!.ts < cutoff) {\n this.speedSamples.shift();\n }\n }\n this.activeBytes.set(event.file.target, event.bytesDownloaded);\n break;\n }\n case \"download:completed\":\n this.filesCompleted++;\n this.completedBytes += event.bytes;\n this.activeTargets.delete(event.file.target);\n this.activeBytes.delete(event.file.target);\n forceRender = true;\n break;\n case \"download:skipped\":\n this.filesSkipped++;\n this.filesCompleted++;\n forceRender = true;\n break;\n case \"download:failed\":\n if (event.willRetry) {\n // Retry will start over from byte 0; reset the per-file count so the next attempt\n // doesn't carry forward the failed-attempt's bytes.\n this.activeBytes.set(event.file.target, 0);\n } else {\n this.filesFailed++;\n this.activeTargets.delete(event.file.target);\n this.activeBytes.delete(event.file.target);\n }\n forceRender = true;\n break;\n case \"archive:extracted\":\n case \"forge:processor-started\":\n case \"forge:processor-completed\":\n forceRender = true;\n break;\n default:\n break;\n }\n this.maybeRender(forceRender);\n }\n\n private maybeRender(force: boolean): void {\n if (!this.active) return;\n const ts = this.now();\n if (!force && ts - this.lastRenderAt < this.minRenderIntervalMs) return;\n const line = this.formatLine();\n if (line === this.lastRenderedLine) return;\n this.lastRenderAt = ts;\n this.lastRenderedLine = line;\n this.spinner.message(line);\n }\n\n private bytesDownloadedNow(): number {\n let sum = this.completedBytes;\n for (const v of this.activeBytes.values()) sum += v;\n return sum;\n }\n\n private formatLine(): string {\n const phase = shortPhase(this.currentPhase);\n const bytes = this.bytesDownloadedNow();\n const speed = this.computeSpeedBps();\n const active = this.activeTargets.size;\n const ratio = this.computeRatio();\n const fileCounter =\n this.totalActions !== undefined\n ? `${this.filesCompleted}/${this.totalActions}`\n : `${this.filesCompleted}`;\n const segments: string[] = [`[${phase}]`, fileCounter, formatBytes(bytes)];\n if (speed > 0) segments.push(`${formatBytes(speed)}/s`);\n segments.push(`active ${active}`);\n if (ratio !== null) segments.push(`${this.formatBar(ratio)} ${(ratio * 100).toFixed(0)}%`);\n const line = segments.join(\" · \");\n return clipToColumns(line, this.columnsFn());\n }\n\n private formatBar(ratio: number): string {\n const filled = Math.round(ratio * BAR_WIDTH);\n return `${\"█\".repeat(filled)}${\"░\".repeat(BAR_WIDTH - filled)}`;\n }\n\n private computeRatio(): number | null {\n if (this.totalBytes !== undefined && this.totalBytes > 0) {\n return Math.min(1, this.bytesDownloadedNow() / this.totalBytes);\n }\n if (this.totalActions !== undefined && this.totalActions > 0) {\n return Math.min(1, this.filesCompleted / this.totalActions);\n }\n return null;\n }\n\n private computeSpeedBps(): number {\n if (this.speedSamples.length === 0) return 0;\n const oldest = this.speedSamples[0]!.ts;\n const elapsed = Math.max(1, this.now() - oldest);\n const bytes = this.speedSamples.reduce((sum, sample) => sum + sample.bytes, 0);\n return (bytes * 1000) / elapsed;\n }\n\n private summaryLine(summary: ProgressSummary): string {\n const total = this.totalActions !== undefined ? `/${this.totalActions}` : \"\";\n const parts: string[] = [`${this.label} done`, `${summary.filesDownloaded}${total} files`];\n if (summary.filesSkipped > 0) parts.push(`${summary.filesSkipped} skipped`);\n if (summary.filesFailed > 0) parts.push(`${summary.filesFailed} failed`);\n parts.push(`${formatBytes(summary.bytesDownloaded)}`);\n if (summary.avgSpeedBps > 0) parts.push(`avg ${formatBytes(summary.avgSpeedBps)}/s`);\n parts.push(`in ${formatDuration(summary.durationMs)}`);\n return clipToColumns(parts.join(\" · \"), this.columnsFn());\n }\n}\n\n/** Drop the verbose `downloading-` / `installing-` / etc. prefix to keep lines compact. */\nfunction shortPhase(phase: string): string {\n if (phase === \"idle\") return \"starting\";\n for (const prefix of [\n \"downloading-\",\n \"installing-\",\n \"extracting-\",\n \"repairing-\",\n \"running-\",\n \"writing-\",\n ]) {\n if (phase.startsWith(prefix)) return phase.slice(prefix.length);\n }\n return phase;\n}\n\n/**\n * Clip a single-line message to the available terminal width. Anything wider than the\n * column count would wrap onto a physical second line, which makes the next `\\r\\x1b[2K`\n * leave the original wrapped tail visible — the very bug that made the previous progress\n * renderer look like it was spamming new lines.\n */\nfunction clipToColumns(line: string, cols: number): string {\n if (cols <= 0) return line;\n const limit = cols - SAFETY_MARGIN;\n if (limit <= 0) return \"\";\n if (line.length <= limit) return line;\n return `${line.slice(0, Math.max(0, limit - 1))}…`;\n}\n\n/** Format bytes with binary-prefixed suffixes (KB/MB/GB). */\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"—\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n}\n\n/** Format milliseconds as h:mm:ss / mm:ss / s. Used for elapsed durations only. */\nexport function formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return \"—\";\n const seconds = Math.round(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remSec = seconds % 60;\n if (minutes < 60) return `${minutes}m${remSec.toString().padStart(2, \"0\")}s`;\n const hours = Math.floor(minutes / 60);\n const remMin = minutes % 60;\n return `${hours}h${remMin.toString().padStart(2, \"0\")}m${remSec.toString().padStart(2, \"0\")}s`;\n}\n","import path from \"node:path\";\nimport { Loaders } from \"../../types/loader\";\nimport type { MinecraftVersionSummary } from \"../../types/minecraft\";\nimport type { ResolvedRuntime } from \"../../types/runtime\";\nimport type { DiscoveredTarget, Target } from \"../../types/target\";\nimport { formatUserError } from \"../error-format\";\nimport { ProgressRenderer, type ProgressSummary, formatBytes, formatDuration } from \"../progress\";\nimport type { InstallSelection, InstallType, ScenarioContext } from \"./types\";\n\n/**\n * Plan + run an install and pipe progress events into the {@link ProgressRenderer}.\n * Throws if either step fails; the renderer's `fail()` message is the user-facing error.\n */\nexport async function runInstallWithProgress(\n ctx: ScenarioContext,\n target: Target,\n label: string,\n): Promise<void> {\n const planSpinner = ctx.ui.spinner();\n planSpinner.start(`Planning ${label}…`);\n let plan: Awaited<ReturnType<typeof ctx.kit.install.plan>>;\n try {\n plan = await ctx.kit.install.plan(target);\n planSpinner.stop(`Plan ready: ${plan.totalActions} actions, ${formatBytes(plan.totalBytes)}.`);\n } catch (error) {\n planSpinner.stop(\"Planning failed.\");\n // The spinner only shows a generic label. Surface the real reason here so the user\n // can see whether it was a network 404, an invalid manifest, etc., before the\n // wizard bounces them back.\n ctx.ui.log(\"error\", formatUserError(error));\n throw error;\n }\n const renderer = new ProgressRenderer({\n ui: ctx.ui,\n label: `Install ${label}`,\n totalActions: plan.totalActions,\n totalBytes: plan.totalBytes,\n });\n const onEvent = renderer.attach();\n try {\n await ctx.kit.install.run(plan, { onEvent });\n const summary = renderer.finish();\n ctx.ui.note(\"Install summary\", formatSummary(summary));\n } catch (error) {\n renderer.fail(formatUserError(error));\n throw error;\n }\n}\n\n/**\n * Resolve a target from the wizard selection and execute the install. Returns:\n * - `\"ok\"` install completed\n * - `\"cancelled\"` install failed; the underlying error is already logged. The wizard\n * should exit to the main menu rather than re-prompt the same steps —\n * retrying without changing inputs almost never recovers.\n * - `\"install-type\"` target resolution failed; loader choice probably needs to change.\n */\nexport async function runInstallFromSelection(\n ctx: ScenarioContext,\n sel: InstallSelection,\n): Promise<\"ok\" | \"cancelled\" | \"install-type\"> {\n const v = sel.version as MinecraftVersionSummary;\n const dir = sel.directory as string;\n const loaderInput = buildLoaderInput(sel);\n const runtimeInput =\n sel.runtimeOverride !== null ? { runtime: { component: sel.runtimeOverride } } : {};\n let target: Target;\n try {\n target = await ctx.kit.targets.resolve({\n id: path.basename(dir),\n directory: dir,\n minecraft: { version: v.id },\n loader: loaderInput,\n ...runtimeInput,\n });\n } catch (error) {\n ctx.ui.log(\"error\", formatUserError(error));\n return \"install-type\";\n }\n try {\n await runInstallWithProgress(ctx, target, describeLoader(sel));\n return \"ok\";\n } catch {\n // runInstallWithProgress already logged the error (plan-stage via ctx.ui.log,\n // run-stage via renderer.fail). Bounce back to the main menu — looping inside\n // the wizard would only re-trigger the same failure.\n return \"cancelled\";\n }\n}\n\nexport async function runStandaloneRuntimeInstallWithProgress(\n ctx: ScenarioContext,\n input: { readonly id: string; readonly directory: string; readonly runtime: ResolvedRuntime },\n): Promise<void> {\n const label = `runtime ${input.runtime.component}`;\n const planSpinner = ctx.ui.spinner();\n planSpinner.start(`Planning ${label}…`);\n let plan: Awaited<ReturnType<typeof ctx.kit.install.runtime.standalonePlan>>;\n try {\n plan = await ctx.kit.install.runtime.standalonePlan({\n id: input.id,\n directory: input.directory,\n runtime: input.runtime,\n });\n planSpinner.stop(`Plan ready: ${plan.totalActions} files, ${formatBytes(plan.totalBytes)}.`);\n } catch (error) {\n planSpinner.stop(\"Planning failed.\");\n ctx.ui.log(\"error\", formatUserError(error));\n throw error;\n }\n const renderer = new ProgressRenderer({\n ui: ctx.ui,\n label: `Install ${label}`,\n totalActions: plan.totalActions,\n totalBytes: plan.totalBytes,\n });\n const onEvent = renderer.attach();\n try {\n await ctx.kit.install.runtime.run(plan, { onEvent });\n const summary = renderer.finish();\n ctx.ui.note(\"Runtime install summary\", formatSummary(summary));\n } catch (error) {\n renderer.fail(formatUserError(error));\n throw error;\n }\n}\n\nexport function buildLoaderInput(sel: InstallSelection): {\n readonly type: InstallType;\n readonly version?: string;\n} {\n if (sel.installType === Loaders.VANILLA) {\n return { type: Loaders.VANILLA };\n }\n if (sel.installType === Loaders.FABRIC) {\n return { type: Loaders.FABRIC, version: sel.fabricLoader as string };\n }\n return { type: Loaders.FORGE, version: sel.forgeBuild as string };\n}\n\nexport function describeLoader(sel: InstallSelection): string {\n const v = (sel.version as MinecraftVersionSummary).id;\n if (sel.installType === Loaders.VANILLA) return `Vanilla ${v}`;\n if (sel.installType === Loaders.FABRIC) return `Fabric ${sel.fabricLoader} on ${v}`;\n return `Forge ${sel.forgeLabel ?? sel.forgeBuild} on ${v}`;\n}\n\nexport function summaryRows(sel: InstallSelection): readonly (readonly [string, string])[] {\n const v = sel.version as MinecraftVersionSummary;\n const rows: [string, string][] = [\n [\"Minecraft\", v.id],\n [\"Type\", labelForType(sel.installType)],\n ];\n if (sel.installType === Loaders.FABRIC && sel.fabricLoader) {\n rows.push([\"Fabric\", sel.fabricLoader]);\n }\n if (sel.installType === Loaders.FORGE && (sel.forgeLabel || sel.forgeBuild)) {\n rows.push([\"Forge\", sel.forgeLabel ?? sel.forgeBuild ?? \"\"]);\n }\n rows.push([\"Runtime\", sel.runtimeOverride ?? \"auto-detect\"]);\n rows.push([\"Directory\", sel.directory as string]);\n return rows;\n}\n\nfunction labelForType(type: InstallType | null): string {\n if (type === Loaders.FABRIC) return \"Fabric\";\n if (type === Loaders.FORGE) return \"Forge (modern)\";\n return \"Vanilla\";\n}\n\nexport function previousFromDirectory(\n sel: InstallSelection,\n): \"fabric-loader\" | \"forge-build\" | \"install-type\" {\n if (sel.installType === Loaders.FABRIC) return \"fabric-loader\";\n if (sel.installType === Loaders.FORGE) return \"forge-build\";\n return \"install-type\";\n}\n\nexport function defaultIdFromSelection(sel: InstallSelection): string {\n const v = (sel.version as MinecraftVersionSummary).id;\n if (sel.installType === Loaders.FABRIC) {\n return defaultIdFor(\"fabric\", `${v}-${sel.fabricLoader ?? \"\"}`);\n }\n if (sel.installType === Loaders.FORGE) {\n return defaultIdFor(\"forge\", `${v}-${sel.forgeBuild ?? \"\"}`);\n }\n return defaultIdFor(\"vanilla\", v);\n}\n\nexport function defaultIdFor(loader: string, suffix: string): string {\n return `${loader}-${suffix}`.replace(/[^a-zA-Z0-9._-]+/g, \"-\").toLowerCase();\n}\n\nexport function formatDetailed(entry: DiscoveredTarget): string {\n const versions =\n entry.minecraftVersions.length === 0 ? \"(none)\" : entry.minecraftVersions.join(\", \");\n const loaders =\n entry.loaders.length === 0\n ? \"(none)\"\n : entry.loaders.map((l) => `${l.type}${l.version ? ` ${l.version}` : \"\"}`).join(\", \");\n const runtimePath = entry.runtime?.javaPath ?? \"(none detected)\";\n const runtimeComponent = entry.runtime?.component ?? \"(unknown)\";\n const runtimeVersion = entry.runtime?.javaVersion ?? \"(unknown)\";\n return [\n `Directory: ${entry.directory}`,\n `Minecraft: ${versions}`,\n `Loaders: ${loaders}`,\n `Runtime path: ${runtimePath}`,\n `Runtime component: ${runtimeComponent}`,\n `Runtime version: ${runtimeVersion}`,\n ].join(\"\\n\");\n}\n\nexport function formatSummary(summary: ProgressSummary): string {\n const lines = [\n `Files downloaded: ${summary.filesDownloaded}`,\n `Files skipped: ${summary.filesSkipped}`,\n ];\n if (summary.filesFailed > 0) {\n lines.push(`Files failed: ${summary.filesFailed}`);\n }\n lines.push(\n `Bytes downloaded: ${formatBytes(summary.bytesDownloaded)}`,\n `Average speed: ${formatBytes(summary.avgSpeedBps)}/s`,\n `Duration: ${formatDuration(summary.durationMs)}`,\n );\n return lines.join(\"\\n\");\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 { MinecraftKit } from \"../../kit\";\nimport type { Loaders } from \"../../types/loader\";\nimport {\n type MinecraftChannel,\n MinecraftChannels,\n type MinecraftVersionSummary,\n} from \"../../types/minecraft\";\nimport type { SelectOption, Ui } from \"../ui\";\n\n/** Inputs every scenario receives. */\nexport interface ScenarioContext {\n readonly kit: MinecraftKit;\n readonly ui: Ui;\n readonly rootDir: string;\n}\n\n/** Outcome of a scenario — whether the user cancelled or completed. */\nexport type ScenarioOutcome = \"completed\" | \"cancelled\";\n\n/** Loader kind selectable during the install wizard. */\nexport type InstallType = typeof Loaders.VANILLA | typeof Loaders.FABRIC | typeof Loaders.FORGE;\n\n/** Selection state collected by the install wizard. */\nexport interface InstallSelection {\n channel: MinecraftChannel | \"old\" | \"all\" | null;\n version: MinecraftVersionSummary | null;\n runtimeOverride: string | null;\n installType: InstallType | null;\n fabricLoader: string | null;\n forgeBuild: string | null;\n forgeLabel: string | null;\n directory: string | null;\n}\n\n/** Channel picker options. Defined once so tests and the picker share the source. */\nexport const CHANNEL_OPTIONS: readonly SelectOption<MinecraftChannel | \"old\" | \"all\">[] = [\n { label: \"Release\", value: MinecraftChannels.RELEASE, hint: \"stable releases (recommended)\" },\n { label: \"Snapshot\", value: MinecraftChannels.SNAPSHOT, hint: \"weekly development builds\" },\n { label: \"Old versions\", value: \"old\", hint: \"old_beta + old_alpha\" },\n { label: \"All\", value: \"all\", hint: \"every channel combined\" },\n];\n","import path from \"node:path\";\nimport { Loaders, VersionPreference } from \"../../types/loader\";\nimport {\n type MinecraftChannel,\n MinecraftChannels,\n type MinecraftVersionSummary,\n} from \"../../types/minecraft\";\nimport type { DiscoveredTarget, Target } from \"../../types/target\";\nimport { formatUserError } from \"../error-format\";\nimport type { SelectOption, Ui, WizardOutcome } from \"../ui\";\nimport { CHANNEL_OPTIONS, type InstallType, type ScenarioContext } from \"./types\";\n\nexport async function pickChannel(\n ui: Ui,\n): Promise<WizardOutcome<MinecraftChannel | \"old\" | \"all\">> {\n return ui.select({\n message: \"Select Minecraft channel\",\n options: CHANNEL_OPTIONS,\n allowCancel: true,\n });\n}\n\nexport async function pickMinecraftVersion(\n ctx: ScenarioContext,\n channel: MinecraftChannel | \"old\" | \"all\",\n): Promise<WizardOutcome<MinecraftVersionSummary>> {\n const spinner = ctx.ui.spinner();\n spinner.start(\"Loading Minecraft versions…\");\n let versions: readonly MinecraftVersionSummary[];\n try {\n versions = await ctx.kit.versions.minecraft.list();\n spinner.stop(`${versions.length} versions loaded.`);\n } catch (error) {\n spinner.stop(\"Failed to load versions.\");\n ctx.ui.log(\"error\", formatUserError(error));\n return { kind: \"back\" };\n }\n const filtered = filterVersionsByChannel(versions, channel);\n if (filtered.length === 0) {\n ctx.ui.log(\"warn\", \"No versions in that channel.\");\n return { kind: \"back\" };\n }\n const seen = new Set<string>();\n const unique: MinecraftVersionSummary[] = [];\n for (const v of filtered) {\n if (seen.has(v.id)) continue;\n seen.add(v.id);\n unique.push(v);\n }\n const sorted = [...unique].sort((a, b) =>\n (b.releaseTime ?? \"\").localeCompare(a.releaseTime ?? \"\"),\n );\n const options: SelectOption<MinecraftVersionSummary>[] = sorted.map((v) => ({\n label: v.id,\n value: v,\n hint: `${v.type} · ${(v.releaseTime ?? \"\").slice(0, 10)}`,\n }));\n return ctx.ui.searchableSelect({\n message: \"Select Minecraft version\",\n options,\n allowBack: true,\n allowCancel: true,\n });\n}\n\nexport async function pickRuntime(ctx: ScenarioContext): Promise<WizardOutcome<string | null>> {\n const initial = await ctx.ui.select<\"auto\" | \"specific\">({\n message: \"Select Java/runtime\",\n options: [\n {\n label: \"Use recommended\",\n value: \"auto\",\n hint: \"use the runtime declared by the version manifest\",\n },\n {\n label: \"Pick specific component…\",\n value: \"specific\",\n hint: \"choose from Mojang's published runtimes\",\n },\n ],\n allowBack: true,\n allowCancel: true,\n });\n if (initial.kind !== \"ok\") return initial;\n if (initial.value === \"auto\") return { kind: \"ok\", value: null };\n\n const spinner = ctx.ui.spinner();\n spinner.start(\"Loading runtime components…\");\n try {\n const list = await ctx.kit.versions.runtime.list({\n system: ctx.kit.targets.system,\n });\n spinner.stop(\n `${list.length} runtime entr${list.length === 1 ? \"y\" : \"ies\"} for your platform.`,\n );\n if (list.length === 0) {\n ctx.ui.log(\"warn\", \"No published runtimes for this platform — falling back to auto-detect.\");\n return { kind: \"ok\", value: null };\n }\n const seen = new Set<string>();\n const components: { component: string; versionName: string }[] = [];\n for (const entry of list) {\n if (seen.has(entry.component)) continue;\n seen.add(entry.component);\n components.push({\n component: entry.component,\n versionName: entry.versionName,\n });\n }\n const choice = await ctx.ui.select<string>({\n message: \"Select runtime component\",\n options: components.map((c) => ({\n label: c.component,\n value: c.component,\n hint: c.versionName,\n })),\n allowBack: true,\n allowCancel: true,\n });\n if (choice.kind !== \"ok\") return choice;\n return { kind: \"ok\", value: choice.value };\n } catch (error) {\n spinner.stop(\"Failed to load runtimes.\");\n ctx.ui.log(\"warn\", `${formatUserError(error)} Falling back to auto-detect.`);\n return { kind: \"ok\", value: null };\n }\n}\n\nexport async function pickInstallType(ui: Ui): Promise<WizardOutcome<InstallType>> {\n return ui.select<InstallType>({\n message: \"Select installation type\",\n options: [\n { label: \"Vanilla\", value: Loaders.VANILLA, hint: \"no mod loader\" },\n {\n label: \"Fabric\",\n value: Loaders.FABRIC,\n hint: \"lightweight modern loader\",\n },\n { label: \"Forge\", value: Loaders.FORGE, hint: \"modern Forge (1.13+)\" },\n ],\n allowBack: true,\n allowCancel: true,\n });\n}\n\nexport type FabricLoaderOutcome = WizardOutcome<string> | { readonly kind: \"incompatible\" };\n\nexport async function pickFabricLoader(\n ctx: ScenarioContext,\n minecraftVersion: string,\n): Promise<FabricLoaderOutcome> {\n const spinner = ctx.ui.spinner();\n spinner.start(`Loading Fabric loaders for ${minecraftVersion}…`);\n try {\n const loaders = await ctx.kit.versions.fabric.list({ minecraftVersion });\n spinner.stop(`${loaders.length} Fabric loader(s).`);\n if (loaders.length === 0) {\n return { kind: \"incompatible\" };\n }\n const options: SelectOption<string>[] = loaders.map((loader) => ({\n label: loader.version,\n value: loader.version,\n hint: loader.stable ? \"stable\" : \"unstable\",\n }));\n return await ctx.ui.searchableSelect({\n message: \"Select Fabric loader\",\n options,\n allowBack: true,\n allowCancel: true,\n });\n } catch (error) {\n spinner.stop(\"Failed to load Fabric loaders.\");\n // Conflate network failure with \"loader not available\" — both block the wizard from\n // moving forward, and the warning surfaces the underlying error message either way.\n ctx.ui.log(\"warn\", formatUserError(error));\n return { kind: \"incompatible\" };\n }\n}\n\nexport type ForgeBuildOutcome =\n | { readonly kind: \"ok\"; readonly value: string; readonly label: string }\n | { readonly kind: \"back\" }\n | { readonly kind: \"cancel\" }\n | { readonly kind: \"incompatible\" };\n\nexport async function pickForgeBuild(\n ctx: ScenarioContext,\n minecraftVersion: string,\n): Promise<ForgeBuildOutcome> {\n const spinner = ctx.ui.spinner();\n spinner.start(`Loading Forge builds for ${minecraftVersion}…`);\n try {\n const builds = await ctx.kit.versions.forge.list({ minecraftVersion });\n spinner.stop(`${builds.length} Forge build(s).`);\n if (builds.length === 0) {\n return { kind: \"incompatible\" };\n }\n const recommended = builds.find((b) => b.isRecommended);\n const latest = builds.find((b) => b.isLatest);\n const options: SelectOption<string>[] = [];\n if (recommended) {\n options.push({\n label: `Recommended (${recommended.forgeVersion})`,\n value: recommended.forgeVersion,\n hint: \"promoted -recommended\",\n });\n }\n if (latest && latest.forgeVersion !== recommended?.forgeVersion) {\n options.push({\n label: `Latest (${latest.forgeVersion})`,\n value: latest.forgeVersion,\n hint: \"promoted -latest\",\n });\n }\n for (const build of builds) {\n if (build.isRecommended || build.isLatest) continue;\n options.push({\n label: build.forgeVersion,\n value: build.forgeVersion,\n hint: build.fullVersion,\n });\n }\n const result = await ctx.ui.searchableSelect({\n message: \"Select Forge build\",\n options,\n allowBack: true,\n allowCancel: true,\n });\n if (result.kind !== \"ok\") return result;\n const matched = options.find((o) => o.value === result.value);\n return {\n kind: \"ok\",\n value: result.value,\n label: matched?.label ?? result.value,\n };\n } catch (error) {\n spinner.stop(\"Failed to load Forge builds.\");\n ctx.ui.log(\"warn\", formatUserError(error));\n return { kind: \"incompatible\" };\n }\n}\n\nexport async function pickDirectory(\n ctx: ScenarioContext,\n suggestedId: string,\n): Promise<WizardOutcome<string>> {\n const defaultPath = path.join(ctx.rootDir, suggestedId);\n const choice = await ctx.ui.select<\"default\" | \"custom\">({\n message: \"Where should the installation live?\",\n options: [\n { label: `Default: ${defaultPath}`, value: \"default\" },\n { label: \"Custom path…\", value: \"custom\" },\n ],\n allowBack: true,\n allowCancel: true,\n });\n if (choice.kind !== \"ok\") return choice;\n if (choice.value === \"default\") return { kind: \"ok\", value: defaultPath };\n const text = await ctx.ui.text({\n message: \"Custom installation directory\",\n placeholder: defaultPath,\n initial: defaultPath,\n validate: (s) => (s.trim().length === 0 ? \"Path must be non-empty\" : undefined),\n allowBack: true,\n });\n if (text.kind !== \"ok\") return text;\n return { kind: \"ok\", value: (text.value ?? \"\").trim() };\n}\n\nexport async function confirmInstall(\n ctx: ScenarioContext,\n rows: readonly (readonly [string, string])[],\n): Promise<WizardOutcome<boolean>> {\n ctx.ui.note(\"Summary\", rows.map(([k, v]) => `${k.padEnd(11)} ${v}`).join(\"\\n\"));\n return ctx.ui.confirm({\n message: \"Proceed with install?\",\n initial: true,\n allowBack: true,\n });\n}\n\nexport async function pickRuntimeComponent(\n ctx: ScenarioContext,\n): Promise<WizardOutcome<{ readonly component: string; readonly versionName: string }>> {\n const spinner = ctx.ui.spinner();\n spinner.start(\"Loading runtime components…\");\n let entries: Awaited<ReturnType<typeof ctx.kit.versions.runtime.list>>;\n try {\n entries = await ctx.kit.versions.runtime.list({\n system: ctx.kit.targets.system,\n });\n spinner.stop(\n `${entries.length} runtime entr${entries.length === 1 ? \"y\" : \"ies\"} for your platform.`,\n );\n } catch (error) {\n spinner.stop(\"Failed to load runtimes.\");\n ctx.ui.log(\"error\", formatUserError(error));\n return { kind: \"cancel\" };\n }\n if (entries.length === 0) {\n ctx.ui.log(\"warn\", \"No published runtimes for this platform.\");\n return { kind: \"cancel\" };\n }\n // Mojang sometimes ships several entries per component (release history). Keep the first\n // (usually newest) per component for the picker.\n const seen = new Set<string>();\n const componentChoices: { component: string; versionName: string }[] = [];\n for (const entry of entries) {\n if (seen.has(entry.component)) continue;\n seen.add(entry.component);\n componentChoices.push({\n component: entry.component,\n versionName: entry.versionName,\n });\n }\n const choice = await ctx.ui.select<string>({\n message: \"Select Java runtime component\",\n options: componentChoices.map((c) => ({\n label: c.component,\n value: c.component,\n hint: c.versionName,\n })),\n allowBack: true,\n allowCancel: true,\n });\n if (choice.kind !== \"ok\") return choice;\n const picked = componentChoices.find((c) => c.component === choice.value);\n if (!picked) return { kind: \"cancel\" };\n return { kind: \"ok\", value: picked };\n}\n\nexport async function pickRuntimeInstallRoot(\n ctx: ScenarioContext,\n): Promise<WizardOutcome<string | null>> {\n const choice = await ctx.ui.select<\"per-target\" | \"custom\">({\n message: \"Where should the runtime files live?\",\n options: [\n {\n label: \"Per-target (default)\",\n value: \"per-target\",\n hint: \"<directory>/runtime/<component>\",\n },\n {\n label: \"Custom shared install root…\",\n value: \"custom\",\n hint: \"absolute path containing component directories\",\n },\n ],\n allowBack: true,\n allowCancel: true,\n });\n if (choice.kind !== \"ok\") return choice;\n if (choice.value === \"per-target\") return { kind: \"ok\", value: null };\n const text = await ctx.ui.text({\n message: \"Custom runtime install root (absolute path)\",\n placeholder: \"C:\\\\shared\\\\jre\",\n validate: (s) => (s.trim().length === 0 ? \"Path must be non-empty\" : undefined),\n allowBack: true,\n });\n if (text.kind !== \"ok\") return text;\n const trimmed = (text.value ?? \"\").trim();\n if (trimmed.length === 0) return { kind: \"ok\", value: null };\n return { kind: \"ok\", value: trimmed };\n}\n\nexport async function pickInstalledTarget(ctx: ScenarioContext): Promise<Target | null> {\n let list: readonly DiscoveredTarget[];\n try {\n list = await ctx.kit.targets.list({ rootDir: ctx.rootDir });\n } catch (error) {\n ctx.ui.log(\"error\", formatUserError(error));\n return null;\n }\n if (list.length === 0) {\n ctx.ui.log(\"warn\", `No installations under ${ctx.rootDir}. Install one first.`);\n return null;\n }\n const choice = await ctx.ui.select<string>({\n message: \"Pick an installation\",\n options: list.map((entry) => ({\n label: entry.id,\n value: entry.id,\n hint: entry.minecraftVersions.join(\", \") || \"no versions\",\n })),\n allowCancel: true,\n });\n if (choice.kind !== \"ok\") return null;\n const entry = list.find((e) => e.id === choice.value);\n if (!entry) return null;\n const mcVersion = await pickMinecraftVersionFromEntry(ctx, entry);\n if (!mcVersion) return null;\n const loaderHint = entry.loaders.find(\n (l) => !l.minecraftVersion || l.minecraftVersion === mcVersion,\n );\n try {\n return await ctx.kit.targets.resolve({\n id: entry.id,\n directory: entry.directory,\n minecraft: { version: mcVersion },\n loader: loaderHintToInput(loaderHint),\n });\n } catch (error) {\n ctx.ui.log(\"error\", formatUserError(error));\n return null;\n }\n}\n\nexport async function pickMinecraftVersionFromEntry(\n ctx: ScenarioContext,\n entry: DiscoveredTarget,\n): Promise<string | null> {\n if (entry.minecraftVersions.length === 0) {\n ctx.ui.log(\"warn\", \"Installation has no Minecraft versions on disk.\");\n return null;\n }\n if (entry.minecraftVersions.length === 1) {\n return entry.minecraftVersions[0] ?? null;\n }\n const choice = await ctx.ui.select<string>({\n message: \"Multiple Minecraft versions on disk — pick one\",\n options: entry.minecraftVersions.map((v) => ({ label: v, value: v })),\n allowCancel: true,\n });\n if (choice.kind !== \"ok\") return null;\n return choice.value;\n}\n\nfunction loaderHintToInput(hint: DiscoveredTarget[\"loaders\"][number] | undefined): {\n readonly type: typeof Loaders.VANILLA | typeof Loaders.FABRIC | typeof Loaders.FORGE;\n readonly version?: string;\n readonly preference?: typeof VersionPreference.LATEST | typeof VersionPreference.RECOMMENDED;\n} {\n if (!hint) return { type: Loaders.VANILLA };\n if (hint.type === Loaders.FABRIC) {\n return hint.version\n ? { type: Loaders.FABRIC, version: hint.version }\n : { type: Loaders.FABRIC, preference: VersionPreference.LATEST };\n }\n if (hint.type === Loaders.FORGE) {\n return hint.version\n ? { type: Loaders.FORGE, version: hint.version }\n : { type: Loaders.FORGE, preference: VersionPreference.RECOMMENDED };\n }\n return { type: Loaders.VANILLA };\n}\n\nfunction filterVersionsByChannel(\n versions: readonly MinecraftVersionSummary[],\n channel: MinecraftChannel | \"old\" | \"all\",\n): readonly MinecraftVersionSummary[] {\n if (channel === \"all\") return versions;\n if (channel === \"old\") {\n return versions.filter(\n (v) => v.type === MinecraftChannels.OLD_BETA || v.type === MinecraftChannels.OLD_ALPHA,\n );\n }\n return versions.filter((v) => v.type === channel);\n}\n","import path from \"node:path\";\nimport { Loaders } from \"../../types/loader\";\nimport type { MinecraftChannel, MinecraftVersionSummary } from \"../../types/minecraft\";\nimport { formatUserError } from \"../error-format\";\nimport {\n defaultIdFor,\n defaultIdFromSelection,\n previousFromDirectory,\n runInstallFromSelection,\n runStandaloneRuntimeInstallWithProgress,\n summaryRows,\n} from \"./install-helpers\";\nimport {\n confirmInstall,\n pickChannel,\n pickDirectory,\n pickFabricLoader,\n pickForgeBuild,\n pickInstallType,\n pickMinecraftVersion,\n pickRuntime,\n pickRuntimeComponent,\n pickRuntimeInstallRoot,\n} from \"./pickers\";\nimport type { InstallSelection, ScenarioContext, ScenarioOutcome } from \"./types\";\n\n/** Unified install scenario: covers vanilla, Fabric, and Forge through a single wizard. */\nexport async function scenarioInstallMinecraft(ctx: ScenarioContext): Promise<ScenarioOutcome> {\n type Step =\n | \"channel\"\n | \"version\"\n | \"runtime\"\n | \"install-type\"\n | \"fabric-loader\"\n | \"forge-build\"\n | \"directory\"\n | \"summary\";\n const sel: InstallSelection = {\n channel: null,\n version: null,\n runtimeOverride: null,\n installType: null,\n fabricLoader: null,\n forgeBuild: null,\n forgeLabel: null,\n directory: null,\n };\n let step: Step = \"channel\";\n while (true) {\n if (step === \"channel\") {\n const r = await pickChannel(ctx.ui);\n if (r.kind !== \"ok\") return \"cancelled\";\n sel.channel = r.value;\n step = \"version\";\n } else if (step === \"version\") {\n const r = await pickMinecraftVersion(ctx, sel.channel as MinecraftChannel | \"old\" | \"all\");\n if (r.kind === \"cancel\") return \"cancelled\";\n if (r.kind === \"back\") {\n step = \"channel\";\n continue;\n }\n sel.version = r.value;\n step = \"runtime\";\n } else if (step === \"runtime\") {\n const r = await pickRuntime(ctx);\n if (r.kind === \"cancel\") return \"cancelled\";\n if (r.kind === \"back\") {\n step = \"version\";\n continue;\n }\n sel.runtimeOverride = r.value;\n step = \"install-type\";\n } else if (step === \"install-type\") {\n const r = await pickInstallType(ctx.ui);\n if (r.kind === \"cancel\") return \"cancelled\";\n if (r.kind === \"back\") {\n step = \"runtime\";\n continue;\n }\n sel.installType = r.value;\n if (r.value === Loaders.VANILLA) {\n step = \"directory\";\n } else if (r.value === Loaders.FABRIC) {\n step = \"fabric-loader\";\n } else {\n step = \"forge-build\";\n }\n } else if (step === \"fabric-loader\") {\n const r = await pickFabricLoader(ctx, (sel.version as MinecraftVersionSummary).id);\n if (r.kind === \"cancel\") return \"cancelled\";\n if (r.kind === \"back\") {\n step = \"install-type\";\n continue;\n }\n if (r.kind === \"incompatible\") {\n ctx.ui.log(\n \"warn\",\n `Fabric is not available for Minecraft ${(sel.version as MinecraftVersionSummary).id}. Pick another version or install type.`,\n );\n step = \"install-type\";\n continue;\n }\n sel.fabricLoader = r.value;\n step = \"directory\";\n } else if (step === \"forge-build\") {\n const r = await pickForgeBuild(ctx, (sel.version as MinecraftVersionSummary).id);\n if (r.kind === \"cancel\") return \"cancelled\";\n if (r.kind === \"back\") {\n step = \"install-type\";\n continue;\n }\n if (r.kind === \"incompatible\") {\n ctx.ui.log(\n \"warn\",\n `Forge is not available for Minecraft ${(sel.version as MinecraftVersionSummary).id}. Pick another version or install type.`,\n );\n step = \"install-type\";\n continue;\n }\n sel.forgeBuild = r.value;\n sel.forgeLabel = r.label;\n step = \"directory\";\n } else if (step === \"directory\") {\n const r = await pickDirectory(ctx, defaultIdFromSelection(sel));\n if (r.kind === \"cancel\") return \"cancelled\";\n if (r.kind === \"back\") {\n step = previousFromDirectory(sel);\n continue;\n }\n sel.directory = r.value;\n step = \"summary\";\n } else {\n const ok = await confirmInstall(ctx, summaryRows(sel));\n if (ok.kind === \"cancel\") return \"cancelled\";\n if (ok.kind === \"back\") {\n step = \"directory\";\n continue;\n }\n if (!ok.value) return \"cancelled\";\n const result = await runInstallFromSelection(ctx, sel);\n if (result === \"ok\") return \"completed\";\n if (result === \"cancelled\") return \"cancelled\";\n step = result;\n }\n }\n}\n\n/**\n * Standalone: install a Mojang Java runtime directly, without going through a Minecraft\n * version. The user picks a runtime component, a destination directory, and an optional\n * shared install root — that's it.\n */\nexport async function scenarioInstallRuntime(ctx: ScenarioContext): Promise<ScenarioOutcome> {\n type Step = \"component\" | \"directory\" | \"install-root\" | \"summary\";\n let step: Step = \"component\";\n let component: string | null = null;\n let versionLabel: string | null = null;\n let directory: string | null = null;\n let installRoot: string | null = null;\n while (true) {\n if (step === \"component\") {\n const r = await pickRuntimeComponent(ctx);\n if (r.kind === \"cancel\") return \"cancelled\";\n if (r.kind === \"back\") return \"cancelled\";\n component = r.value.component;\n versionLabel = r.value.versionName;\n step = \"directory\";\n } else if (step === \"directory\") {\n const r = await pickDirectory(ctx, defaultIdFor(\"runtime\", component ?? \"java\"));\n if (r.kind === \"cancel\") return \"cancelled\";\n if (r.kind === \"back\") {\n step = \"component\";\n continue;\n }\n directory = r.value;\n step = \"install-root\";\n } else if (step === \"install-root\") {\n const r = await pickRuntimeInstallRoot(ctx);\n if (r.kind === \"cancel\") return \"cancelled\";\n if (r.kind === \"back\") {\n step = \"directory\";\n continue;\n }\n installRoot = r.value;\n step = \"summary\";\n } else {\n const dir = directory as string;\n const comp = component as string;\n const ok = await confirmInstall(ctx, [\n [\"Goal\", \"Install Mojang Java runtime\"],\n [\"Component\", `${comp}${versionLabel ? ` (${versionLabel})` : \"\"}`],\n [\"Directory\", dir],\n [\"Install root\", installRoot ?? `${dir}/runtime (per-target)`],\n ]);\n if (ok.kind === \"cancel\") return \"cancelled\";\n if (ok.kind === \"back\") {\n step = \"install-root\";\n continue;\n }\n if (!ok.value) return \"cancelled\";\n try {\n const runtime = await ctx.kit.versions.runtime.resolve({\n system: ctx.kit.targets.system,\n component: comp,\n });\n const finalRuntime: typeof runtime =\n installRoot !== null ? { ...runtime, installRoot } : runtime;\n await runStandaloneRuntimeInstallWithProgress(ctx, {\n id: path.basename(dir),\n directory: dir,\n runtime: finalRuntime,\n });\n return \"completed\";\n } catch (error) {\n ctx.ui.log(\"error\", formatUserError(error));\n step = \"component\";\n }\n }\n }\n}\n","import { Loaders } from \"../../types/loader\";\nimport type { Target } from \"../../types/target\";\nimport type { VerificationResult } from \"../../types/verify\";\nimport { formatUserError } from \"../error-format\";\nimport { ProgressRenderer } from \"../progress\";\nimport { formatSummary } from \"./install-helpers\";\nimport { pickInstalledTarget } from \"./pickers\";\nimport type { ScenarioContext, ScenarioOutcome } from \"./types\";\n\n/**\n * Run every verify aspect that applies to a target: always `minecraft` and `runtime`, plus\n * `fabric` / `forge` when the target uses that loader.\n */\nasync function verifyAllAspects(\n ctx: ScenarioContext,\n target: Target,\n): Promise<readonly VerificationResult[]> {\n const results: VerificationResult[] = [];\n results.push(await ctx.kit.verify.minecraft.run(target));\n if (target.loader.type === Loaders.FABRIC) {\n results.push(await ctx.kit.verify.fabric.run(target));\n } else if (target.loader.type === Loaders.FORGE) {\n results.push(await ctx.kit.verify.forge.run(target));\n }\n results.push(await ctx.kit.verify.runtime.run(target));\n return results;\n}\n\nfunction summarizeVerifications(results: readonly VerificationResult[]): {\n readonly totalIssues: number;\n readonly perKind: ReadonlyArray<{ readonly kind: string; readonly count: number }>;\n} {\n const perKind = results.map((r) => ({ kind: r.kind, count: r.issues.length }));\n const totalIssues = perKind.reduce((sum, p) => sum + p.count, 0);\n return { totalIssues, perKind };\n}\n\n/** Scenario: verify a discovered installation across minecraft, loader, and runtime. */\nexport async function scenarioVerify(ctx: ScenarioContext): Promise<ScenarioOutcome> {\n const target = await pickInstalledTarget(ctx);\n if (!target) return \"cancelled\";\n const spinner = ctx.ui.spinner();\n spinner.start(\"Verifying…\");\n try {\n const results = await verifyAllAspects(ctx, target);\n spinner.stop(\"Verification complete.\");\n const { totalIssues, perKind } = summarizeVerifications(results);\n if (totalIssues === 0) {\n ctx.ui.log(\"success\", `${target.id} is clean.`);\n } else {\n const breakdown = perKind\n .filter((p) => p.count > 0)\n .map((p) => `${p.kind}: ${p.count}`)\n .join(\", \");\n ctx.ui.log(\n \"warn\",\n `${target.id}: ${totalIssues} issue(s) (${breakdown}). Run \"Repair\" to fix.`,\n );\n }\n return \"completed\";\n } catch (error) {\n spinner.stop(\"Verification failed.\");\n ctx.ui.log(\"error\", formatUserError(error));\n return \"cancelled\";\n }\n}\n\n/** Scenario: repair a discovered installation. */\nexport async function scenarioRepair(ctx: ScenarioContext): Promise<ScenarioOutcome> {\n const target = await pickInstalledTarget(ctx);\n if (!target) return \"cancelled\";\n const verifySpinner = ctx.ui.spinner();\n verifySpinner.start(\"Verifying installation…\");\n try {\n const verifications = await verifyAllAspects(ctx, target);\n const { totalIssues, perKind } = summarizeVerifications(verifications);\n if (totalIssues === 0) {\n verifySpinner.stop(\"Nothing to repair.\");\n ctx.ui.log(\"success\", \"Installation is already clean.\");\n return \"completed\";\n }\n const breakdown = perKind\n .filter((p) => p.count > 0)\n .map((p) => `${p.kind}: ${p.count}`)\n .join(\", \");\n verifySpinner.stop(`Found ${totalIssues} issue(s) — ${breakdown}.`);\n const ok = await ctx.ui.confirm({ message: `Repair ${totalIssues} item(s)?`, initial: true });\n if (ok.kind !== \"ok\" || !ok.value) return \"cancelled\";\n\n type RepairAspectKey = \"minecraft\" | \"fabric\" | \"forge\" | \"runtime\";\n const aspects: ReadonlyArray<{\n readonly key: RepairAspectKey;\n readonly verification?: VerificationResult;\n }> = [\n { key: \"minecraft\", verification: verifications.find((v) => v.kind === \"minecraft\") },\n { key: \"fabric\", verification: verifications.find((v) => v.kind === \"fabric\") },\n { key: \"forge\", verification: verifications.find((v) => v.kind === \"forge\") },\n { key: \"runtime\", verification: verifications.find((v) => v.kind === \"runtime\") },\n ];\n\n for (const aspect of aspects) {\n if (!aspect.verification || aspect.verification.issues.length === 0) continue;\n const plan = await ctx.kit.repair[aspect.key].plan(target, { from: aspect.verification });\n if (plan.totalActions === 0) continue;\n const renderer = new ProgressRenderer({\n ui: ctx.ui,\n label: `Repair ${aspect.key}`,\n totalActions: plan.totalActions,\n totalBytes: plan.totalBytes,\n });\n const onEvent = renderer.attach();\n try {\n await ctx.kit.repair[aspect.key].run(plan, { onEvent });\n const summary = renderer.finish();\n ctx.ui.note(`Repair ${aspect.key} summary`, formatSummary(summary));\n } catch (error) {\n renderer.fail(formatUserError(error));\n throw error;\n }\n }\n return \"completed\";\n } catch (error) {\n ctx.ui.log(\"error\", formatUserError(error));\n return \"cancelled\";\n }\n}\n","import { AuthModes } from \"../../types/auth\";\nimport { formatUserError } from \"../error-format\";\nimport { pickInstalledTarget } from \"./pickers\";\nimport type { ScenarioContext, ScenarioOutcome } from \"./types\";\n\n/** Scenario: launch Minecraft from a discovered installation. */\nexport async function scenarioLaunch(ctx: ScenarioContext): Promise<ScenarioOutcome> {\n const target = await pickInstalledTarget(ctx);\n if (!target) return \"cancelled\";\n const usernameOutcome = await ctx.ui.text({\n message: \"Player username\",\n placeholder: \"Player\",\n initial: \"Player\",\n allowBack: true,\n validate: (s) => (s.trim().length === 0 ? \"Username must be non-empty\" : undefined),\n });\n if (usernameOutcome.kind !== \"ok\") return \"cancelled\";\n try {\n const composition = await ctx.kit.launch.compose(target, {\n auth: { mode: AuthModes.OFFLINE, username: usernameOutcome.value.trim() },\n });\n ctx.ui.note(\n \"Launch summary\",\n [\n `Java: ${composition.javaPath}`,\n `Main class: ${composition.mainClass}`,\n `Classpath: ${composition.classpath.length} entries`,\n `Natives: ${composition.nativesDirectory}`,\n `Working: ${composition.workingDirectory}`,\n ].join(\"\\n\"),\n );\n const ok = await ctx.ui.confirm({ message: \"Spawn Minecraft now?\", initial: true });\n if (ok.kind !== \"ok\" || !ok.value) return \"cancelled\";\n const session = ctx.kit.launch.run(composition, {\n onEvent: (event) => {\n if (event.type === \"launch:stdout\" || event.type === \"launch:stderr\") {\n ctx.ui.log(event.type === \"launch:stderr\" ? \"warn\" : \"info\", event.line);\n }\n },\n });\n ctx.ui.log(\"info\", `Started PID ${session.pid}. Waiting for exit…`);\n await session.exited;\n ctx.ui.log(\"success\", \"Game exited.\");\n return \"completed\";\n } catch (error) {\n ctx.ui.log(\"error\", formatUserError(error));\n return \"cancelled\";\n }\n}\n","import { formatUserError } from \"../error-format\";\nimport { formatDetailed } from \"./install-helpers\";\nimport type { ScenarioContext, ScenarioOutcome } from \"./types\";\n\n/** Scenario: inspect a single installation in detail. */\nexport async function scenarioInspect(ctx: ScenarioContext): Promise<ScenarioOutcome> {\n try {\n const list = await ctx.kit.targets.list({ rootDir: ctx.rootDir });\n if (list.length === 0) {\n ctx.ui.log(\"warn\", \"No installations found. Install one first.\");\n return \"completed\";\n }\n const choice = await ctx.ui.select({\n message: \"Pick an installation to inspect\",\n options: list.map((entry) => ({\n label: entry.id,\n value: entry.id,\n hint: entry.minecraftVersions.join(\", \") || \"no versions\",\n })),\n allowCancel: true,\n });\n if (choice.kind !== \"ok\") return \"cancelled\";\n const entry = list.find((e) => e.id === choice.value);\n if (!entry) return \"cancelled\";\n ctx.ui.note(`Inspect: ${entry.id}`, formatDetailed(entry));\n return \"completed\";\n } catch (error) {\n ctx.ui.log(\"error\", formatUserError(error));\n return \"cancelled\";\n }\n}\n","/**\n * Outcome of a single interactive step.\n *\n * - `ok` — user picked a value.\n * - `back` — user asked to go to the previous step (only available when {@link UiPromptInput.allowBack}).\n * - `cancel` — user pressed Ctrl+C, picked the explicit \"Cancel\" option, or otherwise aborted.\n */\nexport type WizardOutcome<T> =\n | { readonly kind: \"ok\"; readonly value: T }\n | { readonly kind: \"back\" }\n | { readonly kind: \"cancel\" };\n\n/** A select option. */\nexport interface SelectOption<T> {\n readonly label: string;\n readonly value: T;\n readonly hint?: string;\n}\n\n/** Common shape for every interactive prompt input. */\nexport interface UiPromptInput {\n readonly message: string;\n readonly allowBack?: boolean;\n readonly allowCancel?: boolean;\n}\n\n/** Inputs for {@link Ui.text}. */\nexport interface TextInput extends UiPromptInput {\n readonly placeholder?: string;\n readonly initial?: string;\n /** Optional validator. Return undefined for valid input or an error message string. */\n readonly validate?: (value: string) => string | undefined;\n}\n\n/** Inputs for {@link Ui.select}. */\nexport interface SelectInput<T> extends UiPromptInput {\n readonly options: readonly SelectOption<T>[];\n /** Optional initial selection. */\n readonly initialValue?: T;\n}\n\n/** Inputs for {@link Ui.searchableSelect}. */\nexport interface SearchableSelectInput<T> extends SelectInput<T> {\n /**\n * Lists with at most this many entries are rendered as a normal select. Larger lists are\n * clipped to the first {@link MAX_VISIBLE_OPTIONS} entries. Defaults to `30`.\n */\n readonly searchThreshold?: number;\n}\n\n/** Inputs for {@link Ui.confirm}. */\nexport interface ConfirmInput extends UiPromptInput {\n readonly initial?: boolean;\n}\n\n/** Spinner handle. */\nexport interface UiSpinner {\n /** Start the spinner with an initial message. */\n start(message: string): void;\n /** Update the running spinner's message in-place (no newline). */\n message(message: string): void;\n /** Stop the spinner with a final message. */\n stop(message?: string): void;\n}\n\n/** Public interactive-UI contract. */\nexport interface Ui {\n intro(message: string): void;\n outro(message: string): void;\n note(title: string, body: string): void;\n log(level: \"info\" | \"success\" | \"warn\" | \"error\", message: string): void;\n /** Print a raw multi-line block without any clack box/prefix decoration. */\n write(message: string): void;\n text(input: TextInput): Promise<WizardOutcome<string>>;\n select<T>(input: SelectInput<T>): Promise<WizardOutcome<T>>;\n searchableSelect<T>(input: SearchableSelectInput<T>): Promise<WizardOutcome<T>>;\n confirm(input: ConfirmInput): Promise<WizardOutcome<boolean>>;\n spinner(): UiSpinner;\n}\n\nconst BACK = Symbol(\"mckit:back\");\nconst CANCEL = Symbol(\"mckit:cancel\");\n\ninterface ClackModule {\n intro(m: string): void;\n outro(m: string): void;\n note(body: string, title?: string): void;\n log: {\n info(m: string): void;\n success(m: string): void;\n warn(m: string): void;\n error(m: string): void;\n };\n text(opts: object): Promise<unknown>;\n select(opts: object): Promise<unknown>;\n confirm(opts: object): Promise<unknown>;\n spinner(): {\n start(m: string): void;\n stop(m?: string): void;\n message?(m: string): void;\n };\n isCancel(value: unknown): boolean;\n}\n\n/**\n * Build the production {@link Ui} backed by `@clack/prompts`. Lazy import keeps the CLI\n * dependency out of the library's main entry point.\n */\nexport async function createClackUi(): Promise<Ui> {\n const clack = (await import(\"@clack/prompts\")) as unknown as ClackModule;\n return buildUi(clack);\n}\n\n/** Maximum number of options shown in a single select. Above this, a filter is required. */\nexport const MAX_VISIBLE_OPTIONS = 50;\n\n/** Threshold above which {@link Ui.searchableSelect} prompts for a filter first. */\nexport const DEFAULT_SEARCH_THRESHOLD = 30;\n\n/** Build a {@link Ui} from any module that implements the clack contract. Exposed for tests. */\nexport function buildUi(clack: ClackModule): Ui {\n return {\n intro: (m) => clack.intro(m),\n outro: (m) => clack.outro(m),\n write: (m) => process.stdout.write(`${m}\\n`),\n note: (title, body) => clack.note(body, title),\n log: (level, message) => clack.log[level](message),\n text: async (input) => {\n const value = await clack.text({\n message: input.message,\n ...(input.placeholder !== undefined ? { placeholder: input.placeholder } : {}),\n ...(input.initial !== undefined ? { initialValue: input.initial } : {}),\n ...(input.validate !== undefined ? { validate: input.validate } : {}),\n });\n if (clack.isCancel(value)) return { kind: \"cancel\" };\n // clack.text may return undefined when the user submits without typing and no\n // initialValue was supplied. Normalize to an empty string so callers can safely\n // call `.trim()` etc. without runtime crashes.\n return { kind: \"ok\", value: typeof value === \"string\" ? value : \"\" };\n },\n select: async (input) => runSelect(clack, input),\n searchableSelect: async (input) => searchableSelect(clack, input),\n confirm: async (input) => {\n const value = await clack.confirm({\n message: input.message,\n ...(input.initial !== undefined ? { initialValue: input.initial } : {}),\n });\n if (clack.isCancel(value)) return { kind: \"cancel\" };\n return { kind: \"ok\", value: value as boolean };\n },\n // Bypass clack.spinner() for progress: clack's spinner sometimes prints a fresh line\n // per update on Windows / older versions, defeating in-place rendering. Our own\n // {@link createInPlaceSpinner} writes raw ANSI escapes to stdout so updates always\n // overwrite the previous line.\n spinner: () => createInPlaceSpinner(),\n };\n}\n\n/**\n * Default writable stream used by the in-place spinner. Wrapped so tests can swap it.\n */\nconst DEFAULT_OUT: { write(chunk: string): void; isTTY: boolean } = {\n write(chunk) {\n process.stdout.write(chunk);\n },\n get isTTY() {\n return process.stdout.isTTY === true;\n },\n};\n\n/** Inputs to {@link createInPlaceSpinner}. */\nexport interface InPlaceSpinnerInput {\n /** Sink the spinner writes to. Defaults to `process.stdout`. */\n readonly out?: { write(chunk: string): void; isTTY: boolean };\n}\n\n/**\n * Build a {@link UiSpinner} that updates a single terminal line in place by writing raw\n * ANSI escape codes (`\\r\\x1b[2K` — carriage return + clear-line) before each update. Falls\n * back to one line per call when the stream is not a TTY (CI logs, redirected stdout) so it\n * never spams the output.\n *\n * Exposed for tests; the production {@link Ui} created by {@link createClackUi} already uses\n * this internally.\n */\nexport function createInPlaceSpinner(input: InPlaceSpinnerInput = {}): UiSpinner {\n const out = input.out ?? DEFAULT_OUT;\n let started = false;\n let lastLine = \"\";\n return {\n start(message: string): void {\n if (started) {\n // Treat a second `start` as an in-place update so callers don't accidentally print\n // a fresh line by re-starting.\n if (message !== lastLine) {\n lastLine = message;\n if (out.isTTY) {\n out.write(`\\r\\x1b[2K${message}`);\n } else {\n out.write(`${message}\\n`);\n }\n }\n return;\n }\n started = true;\n lastLine = message;\n if (out.isTTY) {\n out.write(message);\n } else {\n out.write(`${message}\\n`);\n }\n },\n message(message: string): void {\n if (!started) return;\n if (message === lastLine) return;\n lastLine = message;\n if (out.isTTY) {\n out.write(`\\r\\x1b[2K${message}`);\n }\n // Non-TTY: drop in-flight updates entirely so the log isn't spammed.\n },\n stop(message?: string): void {\n if (!started) {\n if (message !== undefined) {\n out.write(`${message}\\n`);\n }\n return;\n }\n const finalText = message ?? lastLine;\n if (out.isTTY) {\n out.write(`\\r\\x1b[2K${finalText}\\n`);\n } else {\n out.write(`${finalText}\\n`);\n }\n started = false;\n lastLine = \"\";\n },\n };\n}\n\nasync function runSelect<T>(clack: ClackModule, input: SelectInput<T>): Promise<WizardOutcome<T>> {\n const augmentedOptions: { label: string; value: unknown; hint?: string }[] = input.options.map(\n (option) => {\n const opt: { label: string; value: unknown; hint?: string } = {\n label: option.label,\n value: option.value as unknown,\n };\n if (option.hint !== undefined) opt.hint = option.hint;\n return opt;\n },\n );\n if (input.allowBack === true) {\n augmentedOptions.push({ label: \"← Back\", value: BACK });\n }\n if (input.allowCancel === true) {\n augmentedOptions.push({ label: \"✕ Cancel\", value: CANCEL });\n }\n const result = await clack.select({\n message: input.message,\n options: augmentedOptions,\n maxItems: 12,\n ...(input.initialValue !== undefined ? { initialValue: input.initialValue as unknown } : {}),\n });\n if (clack.isCancel(result)) return { kind: \"cancel\" };\n if (result === BACK) return { kind: \"back\" };\n if (result === CANCEL) return { kind: \"cancel\" };\n return { kind: \"ok\", value: result as T };\n}\n\nasync function searchableSelect<T>(\n clack: ClackModule,\n input: SearchableSelectInput<T>,\n): Promise<WizardOutcome<T>> {\n const threshold = input.searchThreshold ?? DEFAULT_SEARCH_THRESHOLD;\n if (input.options.length <= threshold) {\n return runSelect(clack, input);\n }\n // Long lists: show only the first MAX_VISIBLE_OPTIONS items immediately. No filter\n // sentinel — we render straight versions, sorted newest-first by the caller. There is no\n // typing affordance because clack `select` does not support inline autocomplete, and an\n // explicit \"filter\" entry adds noise that is not worth the extra step.\n const trimmed = input.options.slice(0, MAX_VISIBLE_OPTIONS);\n const truncatedHint =\n input.options.length > MAX_VISIBLE_OPTIONS\n ? ` (top ${MAX_VISIBLE_OPTIONS} of ${input.options.length})`\n : \"\";\n return runSelect<T>(clack, {\n message: `${input.message}${truncatedHint}`,\n options: trimmed,\n ...(input.allowBack === true ? { allowBack: true } : {}),\n ...(input.allowCancel === true ? { allowCancel: true } : {}),\n });\n}\n\n/**\n * Stub UI used by tests. Each prompt consumes one entry from `script`. Allowed entries:\n *\n * - a plain value (success path);\n * - the literal strings `\"back\"` / `\"cancel\"` as shorthand outcomes;\n * - a {@link WizardOutcome} object directly.\n *\n * The stub also captures every log/note/intro/outro call so tests can assert on them.\n */\nexport function createStubUi(script: readonly unknown[] = []): StubUi {\n const queue = [...script];\n const calls: StubUiCall[] = [];\n function consume<T>(prompt: StubUiCall): WizardOutcome<T> {\n calls.push(prompt);\n if (queue.length === 0) {\n throw new Error(`Stub UI exhausted before prompt: ${prompt.kind} \"${prompt.message}\"`);\n }\n const next = queue.shift();\n if (next === \"back\") return { kind: \"back\" };\n if (next === \"cancel\") return { kind: \"cancel\" };\n if (\n typeof next === \"object\" &&\n next !== null &&\n \"kind\" in next &&\n ((next as WizardOutcome<T>).kind === \"back\" || (next as WizardOutcome<T>).kind === \"cancel\")\n ) {\n return next as WizardOutcome<T>;\n }\n return { kind: \"ok\", value: next as T };\n }\n return {\n calls,\n intro: (m) => calls.push({ kind: \"intro\", message: m }),\n outro: (m) => calls.push({ kind: \"outro\", message: m }),\n write: (m) => calls.push({ kind: \"write\", message: m }),\n note: (title, body) => calls.push({ kind: \"note\", message: title, body }),\n log: (level, m) => calls.push({ kind: \"log\", message: m, level }),\n text: async (input) => consume({ kind: \"text\", message: input.message }),\n select: async (input) => consume({ kind: \"select\", message: input.message }),\n searchableSelect: async (input) => consume({ kind: \"search\", message: input.message }),\n confirm: async (input) => consume({ kind: \"confirm\", message: input.message }),\n spinner: () => ({\n start: (m) => calls.push({ kind: \"spinner-start\", message: m }),\n message: (m) => calls.push({ kind: \"spinner-message\", message: m }),\n stop: (m) => calls.push({ kind: \"spinner-stop\", message: m ?? \"\" }),\n }),\n };\n}\n\n/** Recorded stub-UI call. */\nexport interface StubUiCall {\n readonly kind:\n | \"intro\"\n | \"outro\"\n | \"note\"\n | \"log\"\n | \"write\"\n | \"text\"\n | \"select\"\n | \"search\"\n | \"confirm\"\n | \"spinner-start\"\n | \"spinner-message\"\n | \"spinner-stop\";\n readonly message: string;\n readonly level?: \"info\" | \"success\" | \"warn\" | \"error\";\n readonly body?: string;\n}\n\n/** Stub UI handle (extends {@link Ui} with a `calls` log for test assertions). */\nexport interface StubUi extends Ui {\n readonly calls: readonly StubUiCall[];\n}\n","import process from \"node:process\";\nimport { MinecraftKit } from \"../kit\";\nimport { formatUserError } from \"./error-format\";\nimport {\n type ScenarioContext,\n type ScenarioOutcome,\n scenarioInspect,\n scenarioInstallMinecraft,\n scenarioInstallRuntime,\n scenarioLaunch,\n scenarioRepair,\n scenarioVerify,\n} from \"./scenarios\";\nimport { type Ui, createClackUi } from \"./ui\";\n\nconst SCENARIO_KEYS = {\n INSTALL_MC: \"install-minecraft\",\n INSTALL_RUNTIME: \"install-runtime\",\n VERIFY: \"verify\",\n REPAIR: \"repair\",\n LAUNCH: \"launch\",\n INSPECT: \"inspect\",\n EXIT: \"exit\",\n} as const;\n\n/** Inputs to {@link runCli}. */\nexport interface RunCliInput {\n readonly args: readonly string[];\n readonly ui: Ui;\n readonly rootDir: string;\n readonly kit?: MinecraftKit;\n}\n\n/** Programmatic CLI entrypoint, used by both the bin and the tests. */\nexport async function runCli(input: RunCliInput): Promise<number> {\n if (input.args.includes(\"--help\") || input.args.includes(\"-h\")) {\n input.ui.note(\n \"mckit — minecraft-kit CLI\",\n \"Run with no arguments for the interactive menu.\\n--version, --help, --debug\",\n );\n return 0;\n }\n if (input.args.includes(\"--version\") || input.args.includes(\"-v\")) {\n input.ui.log(\"info\", \"0.1.0\");\n return 0;\n }\n const debug = input.args.includes(\"--debug\");\n const kit = input.kit ?? new MinecraftKit();\n const ctx: ScenarioContext = { kit, ui: input.ui, rootDir: input.rootDir };\n input.ui.intro(\"mckit — Minecraft launcher kit\");\n while (true) {\n const choice = await input.ui.select<string>({\n message: \"What would you like to do?\",\n options: MAIN_MENU,\n });\n if (choice.kind !== \"ok\" || choice.value === SCENARIO_KEYS.EXIT) {\n input.ui.outro(\"Goodbye.\");\n return 0;\n }\n try {\n const outcome = await dispatch(choice.value, ctx);\n if (outcome === \"cancelled\") {\n input.ui.log(\"info\", \"Operation cancelled.\");\n }\n } catch (error) {\n if (debug) {\n input.ui.log(\"error\", `${error instanceof Error ? error.stack : String(error)}`);\n } else {\n input.ui.log(\"error\", formatUserError(error));\n }\n }\n }\n}\n\n/** Main-menu options exported so tests can assert their composition. */\nexport const MAIN_MENU: ReadonlyArray<{ label: string; value: string; hint?: string }> = [\n { label: \"Install Minecraft\", value: SCENARIO_KEYS.INSTALL_MC, hint: \"Vanilla / Fabric / Forge\" },\n { label: \"Install Java/runtime\", value: SCENARIO_KEYS.INSTALL_RUNTIME },\n { label: \"Verify installation\", value: SCENARIO_KEYS.VERIFY },\n { label: \"Repair installation\", value: SCENARIO_KEYS.REPAIR },\n { label: \"Launch Minecraft\", value: SCENARIO_KEYS.LAUNCH },\n { label: \"Inspect installation\", value: SCENARIO_KEYS.INSPECT },\n { label: \"Exit\", value: SCENARIO_KEYS.EXIT },\n];\n\nasync function dispatch(choice: string, ctx: ScenarioContext): Promise<ScenarioOutcome> {\n switch (choice) {\n case SCENARIO_KEYS.INSTALL_MC:\n return scenarioInstallMinecraft(ctx);\n case SCENARIO_KEYS.INSTALL_RUNTIME:\n return scenarioInstallRuntime(ctx);\n case SCENARIO_KEYS.VERIFY:\n return scenarioVerify(ctx);\n case SCENARIO_KEYS.REPAIR:\n return scenarioRepair(ctx);\n case SCENARIO_KEYS.LAUNCH:\n return scenarioLaunch(ctx);\n case SCENARIO_KEYS.INSPECT:\n return scenarioInspect(ctx);\n default:\n ctx.ui.log(\"warn\", `Unknown action: ${choice}`);\n return \"cancelled\";\n }\n}\n\n/** Bin entrypoint. */\nexport async function bin(): Promise<void> {\n const ui = await createClackUi();\n const code = await runCli({\n args: process.argv.slice(2),\n ui,\n rootDir: process.cwd(),\n });\n process.exit(code);\n}\n","import { bin } from \"./main\";\n\nvoid bin();\n"]}
|