@tuned-tensor/cli 0.27.0 → 0.28.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/local-runtime/prefetch.ts","../src/local-runtime/contracts.ts","../src/paths.ts","../src/local-runtime/model-registry.ts","../src/local-runtime/artifacts.ts","../src/local-runtime/decision-models.ts","../src/local-runtime/process-runner.ts","../src/local-runtime/run-reporter.ts","../src/local-runtime/package-root.ts","../src/local-runtime/progress-bar.ts","../src/local-runtime/assets.ts","../src/local-runtime/huggingface-cache.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { lstat, mkdir, readFile, readdir, realpath, stat } from \"node:fs/promises\";\nimport { isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport {\n baseModelRevisionSchema,\n type FineTuneRunRequest,\n type LocalRunnerConfig,\n} from \"./contracts.js\";\nimport { fileUri, writeJson } from \"./artifacts.js\";\nimport {\n assertCertifiedBaseModelConfig,\n defaultBaseModelRevision,\n isCertifiedTrainingModel,\n resolveRequestedBaseModelRevision,\n resolveTrainingModel,\n} from \"./model-registry.js\";\nimport {\n buildBundledPythonCommand,\n runLoggedProcess,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\nimport { withProgressHeartbeat, type LocalRunReporter } from \"./run-reporter.js\";\nimport { recordAssetDownload } from \"./assets.js\";\nimport {\n minimalMachineLearningEnvironment,\n resolveHuggingFaceCacheLayout,\n withHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\n\nexport interface ModelPrefetchPayload {\n base_model: string;\n revision?: string;\n model_cache?: string;\n local_files_only?: boolean;\n /** Resolve the latest commit of an uncertified model instead of requiring a pin. */\n resolve_latest?: boolean;\n}\n\nexport interface ModelPrefetchReport {\n ok: boolean;\n status: \"completed\" | \"skipped\";\n base_model: string;\n model_cache?: string;\n hf_home?: string;\n hub_cache?: string;\n snapshot_path?: string;\n snapshot_revision?: string;\n file_count?: number;\n size_bytes?: number;\n verified_blob_count?: number;\n local_base_model_path?: string;\n artifact_dir: string;\n input_path?: string;\n output_path?: string;\n log_uri?: string;\n command?: string[];\n reason?: string;\n manifest_path?: string;\n}\n\ntype CertifiedFileDigest = { algorithm: \"sha1\" | \"sha256\"; digest: string };\n\nconst NEMOTRON_BF16_FILE_DIGESTS: Readonly<Record<string, CertifiedFileDigest>> = {\n \".gitattributes\": { algorithm: \"sha1\", digest: \"fe3f694ce14b577c9833fca6e83c5e26a7119127\" },\n \"LICENSE\": { algorithm: \"sha1\", digest: \"4d76cc87c9edb280753e3bee3b499ae461113835\" },\n \"README.md\": { algorithm: \"sha1\", digest: \"8ec43ee9f3ee345202e4a6ef752c51b2619f7425\" },\n \"accuracy_plot.png\": { algorithm: \"sha256\", digest: \"1397995f8a5d34d819a069d86c02914990e9ecfc2fce101e233924da9cf5ddcf\" },\n \"agentic_coding_benchmarks.png\": { algorithm: \"sha256\", digest: \"06cf5486ae94ecd7cc6f91ae3b4bae21c7435253a294cb89f54f7ec42eda8847\" },\n \"bias.md\": { algorithm: \"sha1\", digest: \"cdcc8055f965222fabddabcabf22885d3a8bacc1\" },\n \"chat_template.jinja\": { algorithm: \"sha1\", digest: \"d85b0c772f8fe585063847c5f6bf5ec48eb210be\" },\n \"config.json\": { algorithm: \"sha1\", digest: \"993b612989e6aa67da45f908ea5983cb777e7678\" },\n \"explainability.md\": { algorithm: \"sha1\", digest: \"2435f23c865e7daba6a6eceef2f214b86df75d24\" },\n \"generation_config.json\": { algorithm: \"sha1\", digest: \"a41201df53f9d0769947989353b5d02e70491c56\" },\n \"model.safetensors.index.json\": { algorithm: \"sha1\", digest: \"3cd409443b1896d9adc5c3981af301841f85329a\" },\n \"special_tokens_map.json\": { algorithm: \"sha1\", digest: \"0451f37912edb7f8a4bf04d77eef13f6130f0515\" },\n \"tokenizer.json\": { algorithm: \"sha256\", digest: \"623c34567aebb18582765289fbe23d901c62704d6518d71866e0e58db892b5b7\" },\n \"tokenizer_config.json\": { algorithm: \"sha1\", digest: \"c96e5ad00986bfa0b666d4bc425666f1c51d6d1b\" },\n \"model-00001-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"7a3e74d24969eac6657cb9b6422091fd062b7d30fd4bc90ecee6c3d7f692626a\" },\n \"model-00002-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"a80c3846e959f6dda34aa031cbb668b766643691ac7e5c9f43f62e6fb1221059\" },\n \"model-00003-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"996bf3a46668e14075cb82259390267c2b1f71446caeb3a5f1f9e0bd7a079ae7\" },\n \"model-00004-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"cce1d79e7ff2e2b746b9d97166156aa1dcec796116675cc7fd1aa70a8d73ccb2\" },\n \"model-00005-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"9338f59d3fd5f074288c71a9559452d5b5c581da00e9ccb9fe7aa2ce9b04d2ad\" },\n \"model-00006-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"e947fa4097c68263ba3d097fceb32a300a22cebd9d909fb5198af7d18a4022fe\" },\n \"model-00007-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"c7362630bf4256275ca58354ed8f31506cec67ffab30573e753703fd5ae48795\" },\n \"model-00008-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"1b33a5a6b5505b25b57c90ddda19e9cd1598176468917df0c56116fa6f6072cb\" },\n \"model-00009-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"fcc9b48caff427beaf1f87b78cf4ab42bc2a3c43b3c487bccb013ba22d7468b2\" },\n \"model-00010-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"d1924fd54d1b77a15aff8df591a317e8a82a58e46d6f5742fa21e90e0be3cfa6\" },\n \"model-00011-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"e9d0b83bcf04bd4d5758b94e6495a3f1595d121d82faffaa27ce6a884e2c8757\" },\n \"model-00012-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"fce184f112cb0b97024cadc60f993f6f660e365d04e21c240fb3c75747bd3a01\" },\n \"model-00013-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"f427d037d2a3e4d44323325aa38571e3551e8ad702f469c3dacc4e59ea2e50d1\" },\n \"model-00014-of-00014.safetensors\": { algorithm: \"sha256\", digest: \"64577b275ca4e7e5266eae0903674f7f46ec2a8cbf4f4f1a3207f80d503cd1d0\" },\n \"privacy.md\": { algorithm: \"sha1\", digest: \"e3bf30aa1c42a488298ef37383647dc99e1cd39e\" },\n \"safety.md\": { algorithm: \"sha1\", digest: \"f53bf94a4635862eed5cf3e0bc799b93f81d20ac\" },\n};\n\nconst MUSE_GLIMMER_FILE_DIGESTS: Readonly<Record<string, CertifiedFileDigest>> = {\n \".gitattributes\": { algorithm: \"sha1\", digest: \"52373fe24473b1aa44333d318f578ae6bf04b49b\" },\n \"LICENSE\": { algorithm: \"sha1\", digest: \"d645695673349e3947e8e5ae42332d0ac3164cd7\" },\n \"README.md\": { algorithm: \"sha1\", digest: \"a25f87c1c1fbd88f367a552fd14427baa8cb947e\" },\n \"USAGE_POLICY.md\": { algorithm: \"sha1\", digest: \"1a9ed6cffc54585daf9cc904c07cb6e436a9444b\" },\n \"chat_template.jinja\": { algorithm: \"sha1\", digest: \"7507f3c9f38809152732c045df3977848f3916a6\" },\n \"config.json\": { algorithm: \"sha1\", digest: \"190826dc834c13c86b8dc68e775a888a852d7c34\" },\n \"generation_config.json\": { algorithm: \"sha1\", digest: \"b69a50a4239f42707d54a479e0143b8ee56c8bcc\" },\n \"model.safetensors.index.json\": { algorithm: \"sha1\", digest: \"00b257ef0c8bce1b001a6266f6b1f66f4fe16a6b\" },\n \"processor_config.json\": { algorithm: \"sha1\", digest: \"ec9a07be13ea1dadf7395131871753b13f406c26\" },\n \"tokenizer_config.json\": { algorithm: \"sha1\", digest: \"fe7f0bb90fb0d0288e3a505974ae0e4baf1d3e61\" },\n \"tokenizer.json\": { algorithm: \"sha256\", digest: \"c9dbee66967b58f31a7c27f723c3760da3526ccd0427578e8905b0abb0031c4d\" },\n \"model-00001-of-00002.safetensors\": { algorithm: \"sha256\", digest: \"8eef61530e1283642c77ce2e6721feb5c6f348fa055c00e90f2844a136372694\" },\n \"model-00002-of-00002.safetensors\": { algorithm: \"sha256\", digest: \"b58cc2144ba1ba1af4420f67f4ca3ced7f09298510b80464cc75018a0be14381\" },\n};\n\nfunction certifiedFileDigests(\n modelId: string,\n): Readonly<Record<string, CertifiedFileDigest>> | undefined {\n switch (modelId) {\n case \"nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16\":\n return NEMOTRON_BF16_FILE_DIGESTS;\n case \"meta-models/Muse-Glimmer-30B\":\n return MUSE_GLIMMER_FILE_DIGESTS;\n default:\n return undefined;\n }\n}\n\n\nasync function certifiedFileDigest(path: string, expected: CertifiedFileDigest): Promise<string> {\n const metadata = await stat(path);\n const digest = createHash(expected.algorithm);\n if (expected.algorithm === \"sha1\") digest.update(`blob ${metadata.size}\\0`);\n // Weight shards are tens of GB; avoid a read/async iteration per 64 KiB.\n for await (const chunk of createReadStream(path, { highWaterMark: 8 * 1024 * 1024 })) digest.update(chunk);\n return digest.digest(\"hex\");\n}\n\nfunction isStrictPhysicalDescendant(parent: string, child: string): boolean {\n const candidate = relative(parent, child);\n return candidate !== \"\"\n && candidate !== \"..\"\n && !candidate.startsWith(`..${sep}`)\n && !isAbsolute(candidate);\n}\n\nasync function verifySnapshotCacheLocation(\n path: string,\n modelId: string,\n revision: string,\n modelCache: string,\n): Promise<{ repositoryRoot: string; physicalBlobRoot: string }> {\n const repository = `models--${modelId.replaceAll(\"/\", \"--\")}`;\n const layout = resolveHuggingFaceCacheLayout(modelCache);\n const repositoryRoot = join(layout.hubCache, repository);\n const expectedPath = join(repositoryRoot, \"snapshots\", revision);\n const [\n physicalCacheRoot,\n physicalHubRoot,\n physicalRepositoryRoot,\n physicalBlobRoot,\n physicalPath,\n physicalExpectedPath,\n ] = await Promise.all([\n realpath(layout.hfHome).catch(() => null),\n realpath(layout.hubCache).catch(() => null),\n realpath(repositoryRoot).catch(() => null),\n realpath(join(repositoryRoot, \"blobs\")).catch(() => null),\n realpath(path).catch(() => null),\n realpath(expectedPath).catch(() => null),\n ]);\n if (\n !physicalCacheRoot\n || !physicalHubRoot\n || !physicalRepositoryRoot\n || !physicalBlobRoot\n || !physicalPath\n || !physicalExpectedPath\n || physicalPath !== physicalExpectedPath\n ) {\n throw new Error(\n `${modelId} must use the certified Hugging Face cache snapshot ${expectedPath}; got ${path}.`,\n );\n }\n if (!isStrictPhysicalDescendant(physicalCacheRoot, physicalHubRoot)) {\n throw new Error(`Hugging Face hub cache escapes its configured cache root: ${layout.hubCache}`);\n }\n if (!isStrictPhysicalDescendant(physicalHubRoot, physicalRepositoryRoot)) {\n throw new Error(`Hugging Face repository escapes its configured hub cache: ${repositoryRoot}`);\n }\n if (!isStrictPhysicalDescendant(physicalRepositoryRoot, physicalBlobRoot)) {\n throw new Error(`Hugging Face blob store escapes its repository: ${join(repositoryRoot, \"blobs\")}`);\n }\n if (!isStrictPhysicalDescendant(physicalRepositoryRoot, physicalExpectedPath)) {\n throw new Error(`Hugging Face snapshot escapes its configured repository: ${expectedPath}`);\n }\n return { repositoryRoot, physicalBlobRoot };\n}\n\nasync function requireReportedCachePath(\n label: string,\n reported: string | undefined,\n expected: string,\n): Promise<void> {\n const [physicalReported, physicalExpected] = await Promise.all([\n reported ? realpath(reported).catch(() => null) : null,\n realpath(expected).catch(() => null),\n ]);\n if (!physicalReported || !physicalExpected || physicalReported !== physicalExpected) {\n throw new Error(`Model prefetch returned an unexpected ${label}: ${String(reported)}.`);\n }\n}\n\nexport async function verifyModelPrefetchCacheReport(args: {\n modelId: string;\n revision: string;\n modelCache: string;\n output: {\n model_cache?: string;\n hf_home?: string;\n hub_cache?: string;\n snapshot_path?: string;\n };\n}): Promise<void> {\n if (!args.output.snapshot_path) {\n throw new Error(\"Model prefetch did not return a snapshot path.\");\n }\n const effectiveHubCache = resolveHuggingFaceCacheLayout(args.modelCache).hubCache;\n await Promise.all([\n requireReportedCachePath(\"model cache\", args.output.model_cache, args.modelCache),\n requireReportedCachePath(\"HF home\", args.output.hf_home, args.modelCache),\n requireReportedCachePath(\"hub cache\", args.output.hub_cache, effectiveHubCache),\n ]);\n await verifySnapshotCacheLocation(\n args.output.snapshot_path,\n args.modelId,\n args.revision,\n args.modelCache,\n );\n}\n\nasync function verifyCertifiedLocalSnapshot(\n path: string,\n modelId: string,\n snapshotFiles: ReadonlyArray<string>,\n modelCache?: string,\n): Promise<void> {\n const revision = defaultBaseModelRevision(modelId);\n if (!revision) return;\n const digests = certifiedFileDigests(modelId);\n // Revision pinning and per-file digest manifests are independent. Qwen is\n // revision-pinned; Nemotron and Muse also ship a certified file list.\n if (!digests) return;\n if (!modelCache) {\n throw new Error(`A certified local snapshot for ${modelId} requires paths.modelCache.`);\n }\n const { physicalBlobRoot } = await verifySnapshotCacheLocation(\n path,\n modelId,\n revision,\n modelCache,\n );\n\n const physicalFiles = new Map<string, string>();\n for (const file of snapshotFiles) {\n const metadata = await lstat(file);\n const target = await realpath(file);\n if (metadata.isSymbolicLink()) {\n if (!isStrictPhysicalDescendant(physicalBlobRoot, target)) {\n throw new Error(`Certified snapshot symbolic link escapes its Hugging Face blob store: ${file}`);\n }\n }\n physicalFiles.set(file, target);\n }\n const actualFiles = new Set(snapshotFiles.map((file) => relative(path, file).split(\"\\\\\").join(\"/\")));\n const expectedFiles = new Set(Object.keys(digests));\n const unexpected = [...actualFiles].filter((name) => !expectedFiles.has(name)).sort();\n if (unexpected.length > 0) {\n throw new Error(`Certified snapshot contains unexpected file: ${join(path, unexpected[0]!)}`);\n }\n for (const [name, expected] of Object.entries(digests)) {\n if (!actualFiles.has(name)) {\n throw new Error(`Certified snapshot file is missing: ${join(path, name)}`);\n }\n const file = join(path, name);\n const physicalFile = physicalFiles.get(file)!;\n if (await certifiedFileDigest(physicalFile, expected) !== expected.digest) {\n throw new Error(`Certified snapshot file checksum mismatch: ${file}`);\n }\n if (await realpath(file) !== physicalFile) {\n throw new Error(`Certified snapshot file changed during verification: ${file}`);\n }\n }\n}\n\nexport function buildModelPrefetchPayload(\n request: FineTuneRunRequest,\n config: LocalRunnerConfig,\n): ModelPrefetchPayload {\n const model = resolveTrainingModel(request.spec_snapshot.base_model);\n const revision = resolveRequestedBaseModelRevision(\n model.id,\n request.hyperparameters.base_model_revision,\n );\n return {\n base_model: model.id,\n ...(revision ? { revision } : {}),\n ...(config.paths.modelCache ? { model_cache: resolve(config.paths.modelCache) } : {}),\n };\n}\n\n/**\n * A download named directly by repo rather than by a spec. Certified models\n * stay bound to their reviewed revision; an uncertified model without a pin\n * resolves its latest commit, which the download then reports.\n */\nexport function buildModelSourcePrefetchPayload(\n source: { repo: string; revision?: string },\n config: LocalRunnerConfig,\n): ModelPrefetchPayload {\n const model = resolveTrainingModel(source.repo);\n const revision = source.revision || isCertifiedTrainingModel(model.id)\n ? resolveRequestedBaseModelRevision(model.id, source.revision)\n : undefined;\n return {\n base_model: model.id,\n ...(revision ? { revision } : { resolve_latest: true }),\n ...(config.paths.modelCache ? { model_cache: resolve(config.paths.modelCache) } : {}),\n };\n}\n\nexport function safeName(value: string): string {\n return value.replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"model\";\n}\n\nfunction transformersWeightName(name: string): boolean {\n const lower = name.split(/[\\\\/]/).at(-1)?.toLowerCase() ?? \"\";\n return (lower.endsWith(\".safetensors\") && !lower.startsWith(\"adapter_\"))\n || /^pytorch_model.*\\.bin$/.test(lower);\n}\n\nexport async function verifyLocalBaseModel(\n path: string,\n expectedModelId?: string,\n modelCache?: string,\n): Promise<{ fileCount: number; sizeBytes: number }> {\n const root = await lstat(path).catch(() => null);\n if (!root) throw new Error(`paths.baseModel is set to ${path}, but that path does not exist.`);\n if (root.isSymbolicLink()) {\n throw new Error(`paths.baseModel must not itself be a symbolic link: ${path}`);\n }\n if (!root.isDirectory()) {\n throw new Error(\n `paths.baseModel must be a Hugging Face snapshot directory, not a standalone file or archive: ${path}`,\n );\n }\n const files: Array<{ path: string; size: number }> = [];\n const visit = async (directory: string): Promise<void> => {\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const child = join(directory, entry.name);\n if (entry.isSymbolicLink()) {\n const metadata = await stat(child);\n if (!metadata.isFile()) {\n throw new Error(`Local base model contains a non-file symbolic link: ${child}`);\n }\n files.push({ path: child, size: metadata.size });\n continue;\n }\n if (entry.isDirectory()) {\n await visit(child);\n continue;\n }\n const metadata = await stat(child);\n if (metadata.isFile()) files.push({ path: child, size: metadata.size });\n }\n };\n await visit(path);\n const nonEmpty = files.filter((file) => file.size > 0);\n const weights = nonEmpty.filter((file) => transformersWeightName(file.path));\n if (weights.length === 0) {\n throw new Error(`Local base-model directory contains no non-empty Transformers model weights: ${path}`);\n }\n const required = async (name: string) => {\n const metadata = await stat(join(path, name)).catch(() => null);\n return Boolean(metadata?.isFile() && metadata.size > 0);\n };\n if (!await required(\"config.json\")) throw new Error(`Local base-model directory is missing config.json: ${path}`);\n try {\n const config = JSON.parse(await readFile(join(path, \"config.json\"), \"utf8\")) as unknown;\n assertCertifiedBaseModelConfig(\n config,\n `Local base-model config ${join(path, \"config.json\")}`,\n expectedModelId,\n );\n } catch (error) {\n const detail = error instanceof Error ? `: ${error.message}` : \"\";\n throw new Error(\n `Local base-model directory has an invalid or unsupported config.json: ${path}${detail}`,\n { cause: error },\n );\n }\n if (expectedModelId) {\n await verifyCertifiedLocalSnapshot(\n path,\n expectedModelId,\n files.map((file) => file.path),\n modelCache,\n );\n }\n const vocabNames = [\n \"tokenizer.json\", \"tokenizer.model\", \"sentencepiece.bpe.model\", \"spiece.model\", \"vocab.json\", \"tokenizer.tiktoken\",\n ];\n if (!await required(\"tokenizer_config.json\") || !(await Promise.all(vocabNames.map(required))).some(Boolean)) {\n throw new Error(`Local base-model directory is missing tokenizer metadata or vocabulary: ${path}`);\n }\n // Inventory lexical names, not realpaths: HF file symlinks target sibling blobs.\n const inventory = new Set(nonEmpty.map((file) => resolve(file.path)));\n for (const file of files.filter((candidate) => candidate.path.endsWith(\".index.json\"))) {\n const parsed = JSON.parse(await readFile(file.path, \"utf8\")) as { weight_map?: unknown };\n if (!parsed.weight_map || typeof parsed.weight_map !== \"object\" || Array.isArray(parsed.weight_map)) {\n throw new Error(`Local base-model weight index is invalid: ${file.path}`);\n }\n for (const shard of new Set(Object.values(parsed.weight_map as Record<string, unknown>))) {\n if (typeof shard !== \"string\" || !shard || /^(?:[A-Za-z]:|[/\\\\])/.test(shard)\n || shard.split(/[/\\\\]/).includes(\"..\")) {\n throw new Error(\"Local base-model weight index has an invalid indexed weight shard path\");\n }\n if (!inventory.has(resolve(path, shard)) || !await required(shard)) {\n throw new Error(`Local base-model directory is missing indexed weight shard: ${String(shard)}`);\n }\n }\n }\n return {\n fileCount: files.length,\n sizeBytes: files.reduce((total, file) => total + file.size, 0),\n };\n}\n\nexport async function prefetchBaseModel(args: {\n /** Download the spec's base model ... */\n request?: FineTuneRunRequest;\n /** ... or a model named directly. */\n source?: { repo: string; revision?: string };\n config: LocalRunnerConfig;\n reporter?: LocalRunReporter;\n localOnly?: boolean;\n}): Promise<ModelPrefetchReport> {\n if (!args.request === !args.source) throw new Error(\"Model prefetch needs either a spec request or a source repo.\");\n const payload: ModelPrefetchPayload = {\n ...(args.source\n ? buildModelSourcePrefetchPayload(args.source, args.config)\n : buildModelPrefetchPayload(args.request!, args.config)),\n ...(args.localOnly ? { local_files_only: true } : {}),\n };\n const artifactDir = resolve(\n args.config.artifactRoot,\n args.localOnly ? \"verify-base\" : \"prefetch\",\n `${safeName(payload.base_model)}-${new Date().toISOString().replace(/[:.]/g, \"-\")}`,\n );\n await mkdir(artifactDir, { recursive: true });\n\n if (args.request && args.config.paths.baseModel) {\n const localPath = resolve(args.config.paths.baseModel);\n const modelId = args.request.spec_snapshot.base_model;\n const verified = await withProgressHeartbeat(args.reporter, {\n stage: \"model_prefetch\", status: \"running\",\n message: \"Verifying local model checksums. Large cached models can take several minutes.\",\n }, () => verifyLocalBaseModel(\n localPath,\n modelId,\n args.config.paths.modelCache,\n ));\n return {\n ok: true,\n status: args.localOnly ? \"completed\" : \"skipped\",\n base_model: args.request.spec_snapshot.base_model,\n local_base_model_path: localPath,\n file_count: verified.fileCount,\n size_bytes: verified.sizeBytes,\n artifact_dir: artifactDir,\n reason: args.localOnly\n ? \"Verified the configured local base-model artifact; no network access was used.\"\n : \"paths.baseModel points at a verified local base-model artifact; no Hugging Face download is needed.\",\n };\n }\n\n const inputPath = join(artifactDir, \"prefetch-input.json\");\n const outputPath = join(artifactDir, \"prefetch-output.json\");\n const logPath = join(artifactDir, \"prefetch.log\");\n await writeJson(inputPath, payload);\n\n const entrypoint = buildBundledPythonCommand(\n \"prefetch.py\",\n [\"--input\", inputPath, \"--output\", outputPath],\n );\n\n const downloadEvent = {\n stage: \"model_prefetch\",\n status: \"running\",\n message: args.localOnly\n ? \"Verifying cached model files. Large models can take several minutes.\"\n : \"Downloading and verifying model files. Cached files still need checksum verification; large models can take several minutes.\",\n details: {\n base_model: payload.base_model,\n model_cache: payload.model_cache ?? null,\n command: entrypoint.displayCommand,\n log_path: logPath,\n },\n };\n\n const cacheEnvironment = withHuggingFaceCacheEnvironment(\n minimalMachineLearningEnvironment(process.env),\n payload.model_cache,\n );\n const effectiveModelCache = cacheEnvironment.HF_HOME!;\n const effectiveHubCache = resolveHuggingFaceCacheLayout(effectiveModelCache).hubCache;\n const env = withBundledPythonEnvironment(cacheEnvironment);\n\n const { exitCode } = await withProgressHeartbeat(args.reporter, downloadEvent, () => runLoggedProcess({\n command: entrypoint.command,\n commandArgs: entrypoint.commandArgs,\n env,\n logPath,\n // A base model can be several gigabytes. Surface the downloader's progress\n // by default; callers can still opt out by omitting the reporter (`--quiet`).\n reporter: args.reporter ? { ...args.reporter, verbose: true } : undefined,\n stage: \"model_prefetch\",\n }));\n\n if (exitCode !== 0) {\n throw new Error(`Model prefetch exited with code ${exitCode}. See ${logPath}.`);\n }\n\n const output = JSON.parse(await readFile(outputPath, \"utf8\")) as {\n ok?: boolean;\n base_model?: string;\n model_cache?: string;\n hf_home?: string;\n hub_cache?: string;\n snapshot_path?: string;\n snapshot_revision?: string;\n file_count?: number;\n size_bytes?: number;\n verified_blob_count?: number;\n };\n const snapshotRevision = baseModelRevisionSchema.safeParse(output.snapshot_revision);\n if (!snapshotRevision.success) {\n throw new Error(\n \"Model prefetch did not resolve the base model to a 40-character immutable commit SHA.\",\n );\n }\n if (output.base_model !== payload.base_model) {\n throw new Error(`Model prefetch returned ${String(output.base_model)} for requested model ${payload.base_model}.`);\n }\n if (payload.revision && snapshotRevision.data !== payload.revision.toLowerCase()) {\n throw new Error(\n `Model prefetch resolved a different revision (${snapshotRevision.data}) than requested (${payload.revision}).`,\n );\n }\n await verifyModelPrefetchCacheReport({\n modelId: payload.base_model,\n revision: snapshotRevision.data,\n modelCache: effectiveModelCache,\n output,\n });\n if (defaultBaseModelRevision(payload.base_model)) {\n await withProgressHeartbeat(args.reporter, {\n stage: \"model_prefetch\", status: \"running\",\n message: \"Checking model files against the certified revision's checksums.\",\n }, () => verifyLocalBaseModel(\n output.snapshot_path!,\n payload.base_model,\n effectiveModelCache,\n ));\n }\n const recorded = args.localOnly ? undefined : await withProgressHeartbeat(args.reporter, {\n stage: \"model_prefetch\", status: \"running\",\n message: \"Verifying model files and recording the local asset manifest.\",\n }, () => recordAssetDownload({\n kind: \"model\",\n repo: payload.base_model,\n revision: snapshotRevision.data,\n snapshotPath: output.snapshot_path!,\n }));\n\n await args.reporter?.onEvent?.({\n stage: \"model_prefetch\",\n status: \"completed\",\n message: \"Base model is available in the local Hugging Face cache.\",\n details: {\n base_model: output.base_model ?? payload.base_model,\n hf_home: effectiveModelCache,\n hub_cache: effectiveHubCache,\n snapshot_path: output.snapshot_path ?? null,\n snapshot_revision: snapshotRevision.data,\n file_count: output.file_count ?? null,\n size_bytes: output.size_bytes ?? null,\n verified_blob_count: output.verified_blob_count ?? null,\n },\n });\n\n return {\n ok: true,\n status: \"completed\",\n base_model: output.base_model ?? payload.base_model,\n model_cache: effectiveModelCache,\n hf_home: effectiveModelCache,\n hub_cache: effectiveHubCache,\n snapshot_path: output.snapshot_path,\n snapshot_revision: snapshotRevision.data,\n file_count: output.file_count,\n size_bytes: output.size_bytes,\n verified_blob_count: output.verified_blob_count,\n artifact_dir: artifactDir,\n input_path: inputPath,\n output_path: outputPath,\n log_uri: fileUri(logPath),\n command: entrypoint.displayCommand,\n ...(recorded ? { manifest_path: recorded.path } : {}),\n };\n}\n","import { z } from \"zod\";\nimport { pipelineDocumentSchema, isFoundationPipeline, parsePipeline } from \"@tuned-tensor/pipeline-contract\";\nimport { DEFAULT_ARTIFACT_ROOT } from \"../paths.js\";\nimport { canonicalizeTrainingModel, isCertifiedTrainingModel, uncertifiedRevisionError } from \"./model-registry.js\";\nimport { DECISION_MODELS, canonicalizeDecisionModel, isDecisionModel } from \"./decision-models.js\";\n\n/**\n * The local adapter training contract uses text supervised\n * fine-tuning with a LoRA adapter. Additional methods should only be added\n * after they have their own end-to-end CUDA acceptance test.\n */\nexport const datasetFormatSchema = z.literal(\"chat_jsonl\");\nexport const baseModelRevisionSchema = z.string()\n .regex(/^[0-9a-f]{40}$/i, \"base_model_revision must be a 40-character Hugging Face commit SHA\")\n .transform((value) => value.toLowerCase());\n\nexport const behaviorSpecExampleSchema = z.object({\n input: z.string().min(1),\n output: z.string().min(1),\n}).strict();\n\n/**\n * Engine-neutral behavior contract shared by adapter and foundation specs.\n * Both runtimes must compile these fields into the same model instruction.\n */\nexport const behaviorSpecSchema = z.object({\n name: z.string().min(1),\n description: z.string().default(\"\"),\n system_prompt: z.string().default(\"\"),\n guidelines: z.array(z.string()).default([]),\n examples: z.array(behaviorSpecExampleSchema).default([]),\n constraints: z.array(z.string()).default([]),\n}).strict();\n\nexport const specSnapshotSchema = behaviorSpecSchema.extend({\n base_model: z.string().transform((value) => canonicalizeTrainingModel(value)),\n});\n\nexport const foundationHyperparametersSchema = z.object({\n vocab_size: z.number().int().min(64).max(65_536).default(256),\n max_chars: z.number().int().min(1_000).max(1_000_000_000_000).default(20_000),\n depth: z.number().int().min(1).max(64).default(2),\n pretrain_steps: z.number().int().min(1).max(10_000_000).default(2),\n finetune_steps: z.number().int().min(1).max(10_000_000).default(2),\n rl_steps: z.number().int().min(0).max(10_000_000).default(0),\n batch_size: z.number().int().min(1).max(1024).default(2),\n sequence_length: z.number().int().min(16).max(8192).default(64),\n nproc_per_node: z.number().int().min(1).max(16).default(1),\n corpus_path: z.string().min(1).optional(),\n tokenizer_max_chars: z.number().int().min(1_000).max(1_000_000_000_000).optional(),\n validation_path: z.string().min(1).optional(),\n checkpoint_backup_dir: z.string().min(1).optional(),\n seed: z.number().int().min(0).max(2_147_483_647).optional(),\n learning_rate: z.number().positive().max(1).optional(),\n weight_decay: z.number().min(0).max(10).optional(),\n warmup_steps: z.number().int().min(0).max(10_000_000).optional(),\n min_lr_ratio: z.number().min(0).max(1).optional(),\n gradient_accumulation_steps: z.number().int().min(1).max(1024).optional(),\n gradient_clip: z.number().positive().max(1_000).optional(),\n bf16: z.boolean().optional(),\n checkpoint_interval_steps: z.number().int().min(1).max(10_000_000).optional(),\n checkpoint_interval_seconds: z.number().int().min(1).max(86_400).optional(),\n keep_checkpoints: z.number().int().min(1).max(100).optional(),\n log_interval_steps: z.number().int().min(1).max(1_000_000).optional(),\n}).strict();\n\n/** A Hugging Face dataset repo id such as `org/name`. */\nexport const huggingFaceRepoIdSchema = z.string().regex(\n /^[A-Za-z0-9][A-Za-z0-9._-]{0,95}\\/[A-Za-z0-9][A-Za-z0-9._-]{0,95}$/,\n \"huggingface.repo must be a Hugging Face dataset id such as org/name\",\n);\n\n/**\n * Optional Hugging Face source for `dataset_prebuilt`. When present, the split\n * paths are files inside that dataset repo rather than local paths. Like\n * `base_model` + `base_model_revision`, pin `revision` to an immutable commit\n * for reproducible runs; an unpinned source uses the cached `main` snapshot.\n */\nexport const datasetColumnsSchema = z.union([\n z.object({\n input: z.string().min(1),\n output: z.string().min(1),\n }).strict(),\n /** A chat column of `{role, content}` turns; its first user turn and reply become one example. */\n z.object({ messages: z.string().min(1) }).strict(),\n]);\n\nexport const huggingFaceDatasetSourceSchema = z.object({\n repo: huggingFaceRepoIdSchema,\n revision: baseModelRevisionSchema.optional(),\n /**\n * Field names for plain JSONL or Parquet records such as `{\"text\": ..., \"label\": ...}`,\n * or `{messages}` for a chat column. Each record becomes a chat row with the\n * spec's compiled system message. Omit for files that are already TT chat JSONL.\n */\n columns: datasetColumnsSchema.optional(),\n}).strict();\n\n/** True for a contained path inside a repo, such as `data/train.jsonl`. */\nexport function isRepoRelativePath(value: string): boolean {\n if (/^(?:[A-Za-z]:|[/\\\\]|file:)/.test(value)) return false;\n return value.split(/[/\\\\]/).every((part) => part !== \"\" && part !== \".\" && part !== \"..\");\n}\n\nexport const datasetPrebuiltSchema = z.object({\n training: z.string().min(1),\n validation: z.string().min(1).optional(),\n test: z.string().min(1).optional(),\n format: datasetFormatSchema.default(\"chat_jsonl\"),\n huggingface: huggingFaceDatasetSourceSchema.optional(),\n}).strict().superRefine((dataset, context) => {\n if (!dataset.validation && !dataset.test) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"validation\"],\n message: \"Provide a distinct validation or test split for held-out evaluation\",\n });\n }\n if (!dataset.huggingface) return;\n for (const key of [\"training\", \"validation\", \"test\"] as const) {\n const value = dataset[key];\n if (value === undefined) continue;\n if (!isRepoRelativePath(value)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [key],\n message: `With dataset_prebuilt.huggingface, ${key} must be a file path inside the dataset repo, such as data/${key}.jsonl`,\n });\n } else if (value.toLowerCase().endsWith(\".parquet\")) {\n if (!dataset.huggingface.columns) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [key],\n message: `${key} is a Parquet file; set dataset_prebuilt.huggingface.columns to map its records`,\n });\n }\n } else if (!value.toLowerCase().endsWith(\".jsonl\")) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [key],\n message: `${key} must be a .jsonl or .parquet file; CSV and other formats are not supported yet`,\n });\n }\n }\n});\n\n/**\n * Provenance of a dataset resolved from the Hugging Face cache. Recorded on the\n * run request and report so every run names the exact repo commit and file\n * digests it trained and evaluated on.\n */\nconst datasetSourceFileSchema = z.object({\n path: z.string().min(1),\n size_bytes: z.number().int().nonnegative(),\n sha256: z.string().regex(/^[a-f0-9]{64}$/),\n}).strict();\n\nconst datasetConversionStatsSchema = z.object({\n records: z.number().int().nonnegative(),\n kept: z.number().int().nonnegative(),\n skipped_missing_fields: z.number().int().nonnegative(),\n dropped_duplicate_inputs: z.number().int().nonnegative(),\n dropped_eval_overlap: z.number().int().nonnegative(),\n}).strict();\n\nexport const datasetSourceSchema = z.object({\n provider: z.literal(\"huggingface\"),\n repo: huggingFaceRepoIdSchema,\n requested_revision: baseModelRevisionSchema.nullable(),\n revision: baseModelRevisionSchema,\n pinned: z.boolean(),\n columns: datasetColumnsSchema.nullable(),\n /** Per-split record accounting when `columns` converted plain JSONL records. */\n conversion: z.object({\n training: datasetConversionStatsSchema,\n validation: datasetConversionStatsSchema.optional(),\n test: datasetConversionStatsSchema.optional(),\n }).strict().nullable().optional(),\n snapshot_path: z.string().min(1),\n files: z.object({\n training: datasetSourceFileSchema,\n validation: datasetSourceFileSchema.optional(),\n test: datasetSourceFileSchema.optional(),\n }).strict(),\n}).strict();\n\nexport const fineTuneHyperparametersSchema = z.object({\n n_epochs: z.number().int().min(1).max(20).default(1),\n learning_rate: z.number().positive().optional(),\n batch_size: z.number().int().min(1).optional(),\n lora_rank: z.number().int().min(1).optional(),\n lora_alpha: z.number().int().min(1).optional(),\n lora_dropout: z.number().min(0).max(1).optional(),\n max_seq_length: z.number().int().min(128).max(32768).optional(),\n gradient_accumulation_steps: z.number().int().min(1).optional(),\n max_eval_examples: z.number().int().min(1).optional(),\n /** Immutable Hugging Face commit used by every stage of the run. */\n base_model_revision: baseModelRevisionSchema.optional(),\n}).strict();\n\n/** Uncertified base models must pin the exact Hugging Face commit they train. */\nfunction requirePinnedUncertifiedModel(\n spec: { base_model: string; hyperparameters?: { base_model_revision?: string } }\n | { spec_snapshot: { base_model: string }; hyperparameters?: { base_model_revision?: string } },\n context: z.RefinementCtx,\n): void {\n const baseModel = \"spec_snapshot\" in spec ? spec.spec_snapshot.base_model : spec.base_model;\n if (isCertifiedTrainingModel(baseModel) || spec.hyperparameters?.base_model_revision) return;\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"hyperparameters\", \"base_model_revision\"],\n message: uncertifiedRevisionError(baseModel).message,\n });\n}\n\nexport const fineTuneRunRequestSchema = z.object({\n run_id: z.string().uuid(),\n user_id: z.string().min(1),\n behavior_spec_id: z.string().uuid(),\n run_number: z.number().int().min(1),\n spec_snapshot: specSnapshotSchema,\n hyperparameters: fineTuneHyperparametersSchema.default({ n_epochs: 1 }),\n dataset_prebuilt: datasetPrebuiltSchema.optional(),\n dataset_source: datasetSourceSchema.optional(),\n}).strict().superRefine((request, context) => {\n requirePinnedUncertifiedModel(request, context);\n if (request.spec_snapshot.examples.length === 0 && !request.dataset_prebuilt) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"spec_snapshot\", \"examples\"],\n message: \"Add examples or provide dataset_prebuilt training and validation files\",\n });\n }\n});\n\nexport const evalExampleResultSchema = z.object({\n prompt: z.string(),\n expected: z.string(),\n actual: z.string(),\n passed: z.boolean(),\n score: z.number().min(0).max(1),\n reasoning: z.string().nullable(),\n latency_ms: z.number().int().nonnegative(),\n scored_by: z.enum([\"exact_match\", \"json_fields\", \"heuristic\"]).optional(),\n}).strict();\n\nexport const jsonFieldMetricsSchema = z.object({\n fields: z.array(z.string()),\n valid_json_count: z.number().int().nonnegative(),\n valid_json_rate: z.number().min(0).max(1),\n schema_match_count: z.number().int().nonnegative(),\n schema_match_rate: z.number().min(0).max(1),\n all_fields_match_count: z.number().int().nonnegative(),\n all_fields_match_rate: z.number().min(0).max(1),\n field_accuracy: z.record(z.string(), z.object({\n correct: z.number().int().nonnegative(),\n total: z.number().int().nonnegative(),\n accuracy: z.number().min(0).max(1),\n }).strict()),\n}).strict();\n\nexport const evalSplitSchema = z.enum([\n \"spec_examples\",\n \"spec_holdout\",\n \"prebuilt_test\",\n \"prebuilt_validation\",\n \"general_regression\",\n]);\n\nexport const evalReportSchema = z.object({\n kind: z.enum([\"baseline\", \"candidate\"]),\n model_id: z.string(),\n total: z.number().int().nonnegative(),\n eval_examples_total: z.number().int().nonnegative(),\n eval_examples_used: z.number().int().nonnegative(),\n eval_truncated: z.boolean(),\n eval_split: evalSplitSchema.optional(),\n eval_sample_seed: z.number().int().nullable().optional(),\n avg_score: z.number().min(0).max(1),\n pass_rate: z.number().min(0).max(1),\n exact_match_rate: z.number().min(0).max(1),\n avg_token_f1: z.number().min(0).max(1).optional(),\n avg_latency_ms: z.number().int().nonnegative(),\n cached: z.boolean().optional(),\n cache_key: z.string().optional(),\n results: z.array(evalExampleResultSchema),\n artifact_uri: z.string(),\n scoring_method: z.enum([\"heuristic\", \"exact_match\", \"json_fields\"]),\n inference_provider: z.enum([\"none\", \"transformers\"]).optional(),\n scoring_mode: z.enum([\"exact_match\", \"json_fields\"]).optional(),\n json_field_metrics: jsonFieldMetricsSchema.optional(),\n generation_config: z.record(z.string(), z.unknown()).optional(),\n log_uri: z.string().optional(),\n}).strict();\n\nexport const comparisonReportSchema = z.object({\n avg_score_delta: z.number(),\n pass_rate_delta: z.number(),\n exact_match_rate_delta: z.number(),\n token_f1_delta: z.number().optional(),\n regressions: z.number().int().nonnegative(),\n improvements: z.number().int().nonnegative(),\n regressed_examples: z.array(z.object({\n prompt: z.string(),\n old_score: z.number(),\n new_score: z.number(),\n }).strict()),\n}).strict();\n\nexport const trainingReportSchema = z.object({\n provider: z.enum([\"local-uv\", \"aws-ssh\"]),\n training_job_name: z.string(),\n model_artifact_uri: z.string().optional(),\n base_model_artifact_uri: z.string().optional(),\n metrics: z.record(z.string(), z.unknown()).nullable(),\n exit_code: z.number().int().nullable(),\n log_uri: z.string(),\n command: z.array(z.string()).optional(),\n}).strict();\n\n/**\n * What produced a run, recorded once in the report so it travels with\n * `tt publish`: software and host, execution target, exact inputs (spec,\n * base model, data) by digest, and the training configuration.\n */\nexport const runProvenanceSchema = z.object({\n schema_version: z.literal(1),\n recorded_at: z.string(),\n software: z.object({\n tt_version: z.string(),\n node_version: z.string(),\n platform: z.string(),\n arch: z.string(),\n runtime_fingerprint: z.string(),\n python_lock_sha256: z.string().nullable(),\n }).strict(),\n execution: z.object({\n target: z.enum([\"local\", \"aws\"]),\n training_backend: z.string(),\n instance_id: z.string().optional(),\n region: z.string().optional(),\n }).strict(),\n spec: z.object({\n behavior_spec_id: z.string(),\n run_number: z.number().int(),\n snapshot_sha256: z.string(),\n system_prompt_sha256: z.string(),\n file_path: z.string().optional(),\n file_sha256: z.string().optional(),\n }).strict(),\n base_model: z.object({\n id: z.string(),\n revision: z.string().nullable(),\n fingerprint: z.string().nullable(),\n }).strict(),\n data: z.object({\n prebuilt: z.boolean(),\n format: z.string().nullable(),\n file_sha256: z.record(z.string(), z.string()),\n compiled_training_sha256: z.string().nullable(),\n training_examples: z.number().int().nonnegative().nullable(),\n eval_split: z.string(),\n eval_sample_seed: z.number().int(),\n eval_examples_total: z.number().int().nonnegative(),\n eval_examples_used: z.number().int().nonnegative(),\n }).strict(),\n training: z.object({\n hyperparameters: z.record(z.string(), z.unknown()),\n exit_code: z.number().int().nullable(),\n log_uri: z.string(),\n }).strict(),\n /** Hash over request, runtime, preparation config and input digests. */\n source_fingerprint: z.string(),\n}).strict();\n\nexport const runReportSchema = z.object({\n run_id: z.string().uuid(),\n behavior_spec_id: z.string().uuid(),\n user_id: z.string(),\n run_number: z.number().int().min(1),\n base_model: z.string(),\n fine_tuned_model_id: z.string(),\n status: z.enum([\"completed\", \"failed\"]),\n baseline: evalReportSchema,\n candidate: evalReportSchema,\n comparison: comparisonReportSchema,\n general_regression: z.object({\n dataset_uri: z.string(),\n dataset_sha256: z.string().regex(/^[a-f0-9]{64}$/),\n baseline: evalReportSchema,\n candidate: evalReportSchema,\n comparison: comparisonReportSchema,\n policy: z.object({\n max_score_drop: z.number().min(0).max(1),\n max_pass_rate_drop: z.number().min(0).max(1),\n }).strict(),\n passed: z.boolean(),\n failures: z.array(z.string()),\n }).strict().optional(),\n training: trainingReportSchema,\n provenance: runProvenanceSchema.optional(),\n artifact_uris: z.object({\n dataset: z.string(),\n baseline_eval: z.string(),\n candidate_eval: z.string(),\n general_baseline_eval: z.string().optional(),\n general_candidate_eval: z.string().optional(),\n report: z.string(),\n }).strict(),\n run_metadata: z.object({\n base_model: z.string(),\n fine_tuned_model_id: z.string(),\n dataset_prebuilt: z.boolean(),\n dataset_format: datasetFormatSchema.nullable().optional(),\n dataset_uri: z.string(),\n dataset_source: datasetSourceSchema.optional(),\n spec_example_count: z.number().int().nonnegative(),\n training_example_count: z.number().int().nonnegative().nullable(),\n eval_examples_total: z.number().int().nonnegative(),\n eval_examples_used: z.number().int().nonnegative(),\n eval_split: evalSplitSchema.optional(),\n eval_sample_seed: z.number().int().nullable().optional(),\n started_at: z.string(),\n completed_at: z.string(),\n elapsed_ms: z.number().int().nonnegative(),\n elapsed_seconds: z.number().nonnegative(),\n }).strict(),\n created_at: z.string(),\n}).strict();\n\nconst inferenceConfigSchema = z.object({\n batchSize: z.number().int().min(1).max(128).default(4),\n maxNewTokens: z.number().int().min(1).default(256),\n temperature: z.number().min(0).default(0),\n topP: z.number().min(0).max(1).default(1),\n device: z.enum([\"cuda\", \"cpu\"]).default(\"cuda\"),\n}).strict();\n\nconst scoringConfigSchema = z.object({\n mode: z.enum([\"exact_match\", \"json_fields\"]).default(\"exact_match\"),\n fields: z.array(z.string().min(1)).optional(),\n}).strict();\n\nconst evaluationConfigSchema = z.object({\n inference: inferenceConfigSchema.default({\n batchSize: 4,\n maxNewTokens: 256,\n temperature: 0,\n topP: 1,\n device: \"cuda\",\n }),\n scoring: scoringConfigSchema.default({ mode: \"exact_match\" }),\n timeoutMs: z.number().int().min(100).default(1_800_000),\n maxExamples: z.number().int().min(1).optional(),\n sampleSeed: z.number().int().optional(),\n baselineCache: z.boolean().default(true),\n generalRegression: z.object({\n dataset: z.string().min(1),\n systemPrompt: z.string().optional(),\n maxScoreDrop: z.number().min(0).max(1).default(0.03),\n maxPassRateDrop: z.number().min(0).max(1).default(0.05),\n }).strict().optional(),\n}).strict();\n\nexport const localRunnerConfigSchema = z.object({\n gpu: z.object({\n provider: z.literal(\"aws\"),\n instanceId: z.string().regex(/^i-[a-f0-9]{8,17}$/),\n profile: z.string().min(1).optional(),\n region: z.string().min(1).optional(),\n user: z.string().regex(/^[a-z_][a-z0-9_-]*$/i),\n identityFile: z.string().min(1).optional(),\n privateIp: z.boolean().default(false),\n maxSeconds: z.number().int().min(60).max(604800).default(86400),\n }).strict().optional(),\n storeRoot: z.string().optional(),\n artifactRoot: z.string().default(DEFAULT_ARTIFACT_ROOT),\n dryRun: z.boolean().default(false),\n paths: z.object({\n baseModel: z.string().optional(),\n modelCache: z.string().optional(),\n }).strict().default({}),\n evaluation: evaluationConfigSchema.default({\n inference: {\n batchSize: 4,\n maxNewTokens: 256,\n temperature: 0,\n topP: 1,\n device: \"cuda\",\n },\n scoring: { mode: \"exact_match\" },\n timeoutMs: 1_800_000,\n baselineCache: true,\n }),\n}).strict();\n\n// User-authored project configuration. Runtime defaults are applied only by the resolver.\nexport const projectRuntimeSchema = z.object({\n gpu: localRunnerConfigSchema.shape.gpu,\n artifactRoot: z.string().min(1).optional(),\n storeRoot: z.string().min(1).optional(),\n paths: z.object({ baseModel: z.string().min(1).optional(), modelCache: z.string().min(1).optional() }).strict().optional(),\n}).strict();\nconst projectWorkflowFields = {\n evaluation: evaluationConfigSchema.optional(),\n runtime: projectRuntimeSchema.optional(),\n pipeline: pipelineDocumentSchema.optional(),\n};\n\nexport const localFoundationSpecFileSchema = behaviorSpecSchema.extend({\n ...projectWorkflowFields,\n engine: z.literal(\"foundation\"),\n id: z.string().uuid().optional(),\n examples: z.array(behaviorSpecExampleSchema).min(2),\n foundation: foundationHyperparametersSchema,\n});\n\nexport const localAdapterSpecFileSchema = specSnapshotSchema.extend({\n ...projectWorkflowFields,\n engine: z.literal(\"adapter\").optional(),\n id: z.string().uuid().optional(),\n hyperparameters: fineTuneHyperparametersSchema.optional(),\n dataset_prebuilt: datasetPrebuiltSchema.optional(),\n}).strict().superRefine(requirePinnedUncertifiedModel);\n\n/**\n * One typed question a decision model answers per input. Example outputs are\n * the answer labels: a choice key, `true`/`false`, or a score level index.\n */\nexport const decisionQuestionSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"choice\"),\n /** Answer label -> description the model reads. Key order is option order. */\n criteria: z.record(z.string().min(1), z.string()).refine(\n (criteria) => Object.keys(criteria).length >= 2 && Object.keys(criteria).length <= 32,\n \"A choice decision needs 2 to 32 labels.\",\n ),\n }).strict(),\n z.object({\n type: z.literal(\"noul\"),\n criteria: z.object({ true: z.string().optional(), false: z.string().optional() }).strict().optional(),\n }).strict(),\n z.object({\n type: z.literal(\"score\"),\n /** Level descriptions, index 0 first; example outputs are level indices. */\n criteria: z.array(z.string().min(1)).min(2).max(10),\n }).strict(),\n]);\n\nexport const decisionHyperparametersSchema = z.object({\n n_epochs: z.number().int().min(1).max(50).optional(),\n learning_rate: z.number().positive().max(1).optional(),\n batch_size: z.number().int().min(1).max(256).optional(),\n /** Train only the decision head; faster on CPU, usually less accurate. */\n freeze_encoder: z.boolean().optional(),\n /** Shuffle option order per training row so the head learns meaning, not position. */\n shuffle_options: z.boolean().optional(),\n seed: z.number().int().min(0).max(2_147_483_647).optional(),\n device: z.enum([\"auto\", \"cpu\", \"cuda\", \"mps\"]).optional(),\n}).strict();\n\nexport const localDecisionSpecFileSchema = behaviorSpecSchema.extend({\n ...projectWorkflowFields,\n engine: z.literal(\"decision\"),\n id: z.string().uuid().optional(),\n // Refine first: a union member must report an issue, not throw, for other engines' specs.\n base_model: z.string()\n .refine(isDecisionModel, `Unsupported decision model. Supported decision models: ${DECISION_MODELS.map((model) => model.id).join(\", \")}`)\n .transform((value) => canonicalizeDecisionModel(value)),\n decision: decisionQuestionSchema,\n hyperparameters: decisionHyperparametersSchema.optional(),\n});\n\n/** Answer labels in option order; example outputs must be one of these. */\nexport function decisionLabels(question: z.infer<typeof decisionQuestionSchema>): string[] {\n if (question.type === \"choice\") return Object.keys(question.criteria);\n if (question.type === \"noul\") return [\"false\", \"true\"];\n return question.criteria.map((_, index) => String(index));\n}\n\nexport const localBehaviorSpecFileSchema = z.union([\n localFoundationSpecFileSchema,\n localDecisionSpecFileSchema,\n localAdapterSpecFileSchema,\n]).superRefine((spec, ctx) => {\n if (spec.pipeline && isFoundationPipeline(parsePipeline(spec.pipeline)) !== (spec.engine === \"foundation\")) {\n ctx.addIssue({ code: \"custom\", path: [\"pipeline\"], message: \"Pipeline engine must match the spec engine.\" });\n }\n if (spec.engine === \"foundation\" && (spec.evaluation || spec.runtime?.storeRoot || spec.runtime?.paths)) {\n ctx.addIssue({ code: \"custom\", path: [\"runtime\"], message: \"Foundation uses foundation settings for evaluation and checkpoints; runtime.artifactRoot and runtime.gpu are supported.\" });\n }\n if (spec.engine === \"decision\" && (spec.evaluation || spec.runtime?.gpu || spec.runtime?.storeRoot || spec.runtime?.paths)) {\n ctx.addIssue({ code: \"custom\", path: [\"runtime\"], message: \"Decision specs support runtime.artifactRoot only; the device is set in hyperparameters.device.\" });\n }\n});\n\nexport type BehaviorSpecExample = z.infer<typeof behaviorSpecExampleSchema>;\nexport type BehaviorSpec = z.infer<typeof behaviorSpecSchema>;\nexport type SpecSnapshot = z.infer<typeof specSnapshotSchema>;\nexport type FineTuneHyperparameters = z.infer<typeof fineTuneHyperparametersSchema>;\nexport type FineTuneRunRequest = z.infer<typeof fineTuneRunRequestSchema>;\nexport type HuggingFaceDatasetSource = z.infer<typeof huggingFaceDatasetSourceSchema>;\nexport type DatasetSource = z.infer<typeof datasetSourceSchema>;\nexport type FoundationHyperparameters = z.infer<typeof foundationHyperparametersSchema>;\nexport type LocalAdapterSpecFile = z.infer<typeof localAdapterSpecFileSchema>;\nexport type LocalFoundationSpecFile = z.infer<typeof localFoundationSpecFileSchema>;\nexport type LocalDecisionSpecFile = z.infer<typeof localDecisionSpecFileSchema>;\nexport type DecisionQuestion = z.infer<typeof decisionQuestionSchema>;\nexport type DecisionHyperparameters = z.infer<typeof decisionHyperparametersSchema>;\nexport type LocalBehaviorSpecFile = z.infer<typeof localBehaviorSpecFileSchema>;\n\nexport function isFoundationSpecFile(\n spec: LocalBehaviorSpecFile,\n): spec is LocalFoundationSpecFile {\n return spec.engine === \"foundation\";\n}\n\nexport function isDecisionSpecFile(\n spec: LocalBehaviorSpecFile,\n): spec is LocalDecisionSpecFile {\n return spec.engine === \"decision\";\n}\nexport type EvalExampleResult = z.infer<typeof evalExampleResultSchema>;\nexport type EvalSplit = z.infer<typeof evalSplitSchema>;\nexport type EvalReport = z.infer<typeof evalReportSchema>;\nexport type ComparisonReport = z.infer<typeof comparisonReportSchema>;\nexport type TrainingReport = z.infer<typeof trainingReportSchema>;\nexport type RunReport = z.infer<typeof runReportSchema>;\nexport type RunProvenance = z.infer<typeof runProvenanceSchema>;\nexport type LocalRunnerConfig = z.infer<typeof localRunnerConfigSchema>;\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, resolve } from \"node:path\";\n\n/** Home and project state share this directory name. */\nexport const TUNED_TENSOR_DIR = \".tuned-tensor\";\n\nexport const DEFAULT_ARTIFACT_ROOT = `${TUNED_TENSOR_DIR}/artifacts`;\nexport const DEFAULT_PROJECT_STORE_ROOT = `${TUNED_TENSOR_DIR}/store`;\nexport const DEFAULT_FOUNDATION_RUNS_DIR = `${TUNED_TENSOR_DIR}/foundation-runs`;\nexport const DEFAULT_DECISION_RUNS_DIR = `${TUNED_TENSOR_DIR}/decision-runs`;\n\nfunction envHome(env: NodeJS.ProcessEnv = process.env): string {\n const home = env.HOME?.trim();\n return home ? resolve(home) : homedir();\n}\n\nexport function expandUserPath(\n value: string,\n env: NodeJS.ProcessEnv = process.env,\n baseDirectory = process.cwd(),\n): string {\n const trimmed = value.trim();\n if (trimmed === \"~\") return envHome(env);\n if (trimmed.startsWith(\"~/\")) return resolve(envHome(env), trimmed.slice(2));\n return isAbsolute(trimmed) ? resolve(trimmed) : resolve(baseDirectory, trimmed);\n}\n\n/** Laptop-local parent: config, agent, store, and uv caches. */\nexport function getTunedTensorHome(env: NodeJS.ProcessEnv = process.env): string {\n const override = env.TUNED_TENSOR_HOME?.trim();\n if (override) return expandUserPath(override, env);\n return join(envHome(env), TUNED_TENSOR_DIR);\n}\n\nfunction legacyConfigDir(env: NodeJS.ProcessEnv): string {\n const configHome = env.XDG_CONFIG_HOME?.trim()\n ? resolve(env.XDG_CONFIG_HOME)\n : join(envHome(env), \".config\");\n return join(configHome, \"tuned-tensor\");\n}\n\nexport function getConfigDir(env: NodeJS.ProcessEnv = process.env): string {\n const next = getTunedTensorHome(env);\n if (env.TUNED_TENSOR_HOME?.trim()) return next;\n const legacy = legacyConfigDir(env);\n if (!existsSync(join(next, \"config.json\")) && existsSync(join(legacy, \"config.json\"))) {\n return legacy;\n }\n return next;\n}\n\nexport function getAgentConfigDir(env: NodeJS.ProcessEnv = process.env): string {\n const next = join(getTunedTensorHome(env), \"agent\");\n if (env.TUNED_TENSOR_HOME?.trim()) return next;\n const legacy = join(legacyConfigDir(env), \"agent\");\n if (!existsSync(next) && existsSync(legacy)) return legacy;\n return next;\n}\n\nexport function defaultStoreRoot(env: NodeJS.ProcessEnv = process.env): string {\n const override = env.TT_LOCAL_HOME?.trim();\n if (override) return expandUserPath(override, env);\n const next = join(getTunedTensorHome(env), \"store\");\n if (env.TUNED_TENSOR_HOME?.trim()) return next;\n const legacy = join(envHome(env), \".tuned-tensor-local\");\n if (!existsSync(next) && existsSync(legacy)) return legacy;\n return next;\n}\n\nexport function defaultCacheRoot(env: NodeJS.ProcessEnv = process.env): string {\n return join(getTunedTensorHome(env), \"cache\");\n}\n\nexport function pythonEnvironmentPath(\n kind: \"uv\" | \"uv-foundation\" | \"uv-serving\" | \"uv-decision\",\n hash: string,\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const next = join(defaultCacheRoot(env), kind, hash);\n if (env.TUNED_TENSOR_HOME?.trim()) return next;\n const cacheHome = env.XDG_CACHE_HOME?.trim()\n ? resolve(env.XDG_CACHE_HOME)\n : join(envHome(env), \".cache\");\n const legacy = join(cacheHome, \"tuned-tensor-local\", kind, hash);\n if (!existsSync(next) && existsSync(legacy)) return legacy;\n return next;\n}\n","import { lstat, readdir } from \"node:fs/promises\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { verifyTarGzipArchive } from \"./artifacts.js\";\n\n/**\n * Immutable Hugging Face revision reviewed and certified for Qwen/Qwen3.5-2B.\n * Prefetch, training, evaluation, and serving reject any different revision.\n */\nexport const QWEN_3_5_2B_REVISION =\n \"15852e8c16360a2fea060d615a32b45270f8a8fc\";\n\n/**\n * Immutable Hugging Face revision reviewed and certified for Nemotron\n * 3.5 Lightning 30B-A3B-BF16 local fine-tuning. Prefetch, training,\n * evaluation, and serving reject any different revision.\n */\nexport const NEMOTRON_BF16_REVISION =\n \"ce38b6ab8b252b4b8ee7165b4605e93191cafd73\";\n\n/** Immutable Hugging Face revision reviewed and certified for Muse Glimmer. */\nexport const MUSE_GLIMMER_BF16_REVISION =\n \"a4e59da52a7bc87ae7251dd5545c0dd437c44b68\";\n\n/**\n * How the bundled text-only runtime loads a training model. Causal-LM\n * checkpoints load through AutoModelForCausalLM; multimodal checkpoints whose\n * text tower is not registered in the causal-LM auto mapping load through\n * AutoModelForImageTextToText instead.\n */\nexport type ModelLoader = \"causal_lm\" | \"image_text_to_text\";\n\nexport interface TrainingModel {\n id: string;\n family: string;\n /** Immutable Hugging Face revision this training path is bound to, if any. */\n defaultRevision?: string;\n modelLoader: ModelLoader;\n defaultLearningRate: number;\n defaultPerDeviceBatchSize: number;\n defaultGradientAccumulationSteps: number;\n defaultLoraRank: number;\n defaultLoraAlpha: number;\n defaultLoraDropout: number;\n defaultMaxSeqLength: number;\n loraTargetModules: \"all-linear\" | string[];\n gradientCheckpointing: boolean;\n}\n\nexport const TRAINING_MODELS: TrainingModel[] = [\n {\n id: \"Qwen/Qwen3.5-2B\",\n family: \"qwen3_5\",\n defaultRevision: QWEN_3_5_2B_REVISION,\n modelLoader: \"causal_lm\",\n defaultLearningRate: 0.00001,\n defaultPerDeviceBatchSize: 1,\n defaultGradientAccumulationSteps: 8,\n defaultLoraRank: 16,\n defaultLoraAlpha: 32,\n defaultLoraDropout: 0.05,\n defaultMaxSeqLength: 2048,\n loraTargetModules: \"all-linear\",\n gradientCheckpointing: false,\n },\n {\n id: \"nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16\",\n family: \"nemotron_h\",\n defaultRevision: NEMOTRON_BF16_REVISION,\n modelLoader: \"causal_lm\",\n defaultLearningRate: 0.00001,\n defaultPerDeviceBatchSize: 1,\n defaultGradientAccumulationSteps: 8,\n defaultLoraRank: 16,\n defaultLoraAlpha: 32,\n defaultLoraDropout: 0.05,\n defaultMaxSeqLength: 1024,\n // Avoid one LoRA pair for every routed expert matrix. Adapt the shared\n // attention (q/k/v/o) and Mamba input projections instead, keeping the\n // adapter bounded. out_proj/conv1d are rejected by PEFT for Mamba models.\n loraTargetModules: [\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"in_proj\"],\n gradientCheckpointing: true,\n },\n {\n id: \"meta-models/Muse-Glimmer-30B\",\n family: \"muse_glimmer\",\n defaultRevision: MUSE_GLIMMER_BF16_REVISION,\n // Muse Glimmer is a vision-language model whose text tower is not exposed\n // through the causal-LM auto mapping, so the bundled runtime loads the full\n // conditional-generation checkpoint (vision tower frozen and unused) via\n // AutoModelForImageTextToText for text-only SFT.\n modelLoader: \"image_text_to_text\",\n defaultLearningRate: 0.00001,\n defaultPerDeviceBatchSize: 1,\n defaultGradientAccumulationSteps: 8,\n defaultLoraRank: 16,\n defaultLoraAlpha: 32,\n defaultLoraDropout: 0.05,\n defaultMaxSeqLength: 2048,\n loraTargetModules: \"all-linear\",\n gradientCheckpointing: true,\n },\n];\n\n/** A Hugging Face model repository id such as `owner/name`. */\nconst HUGGING_FACE_REPO_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,95}\\/[A-Za-z0-9][A-Za-z0-9._-]{0,95}$/;\n\n/**\n * Conservative defaults for an uncertified Hugging Face causal LM. TT has not\n * reviewed its architecture, weights or memory needs, so the run must pin an\n * immutable `hyperparameters.base_model_revision` and loads without remote\n * code. Users can still override the numeric defaults in the spec.\n */\nfunction uncertifiedTrainingModel(id: string): TrainingModel {\n return {\n id,\n family: \"uncertified\",\n modelLoader: \"causal_lm\",\n defaultLearningRate: 0.0001,\n defaultPerDeviceBatchSize: 1,\n defaultGradientAccumulationSteps: 8,\n defaultLoraRank: 16,\n defaultLoraAlpha: 32,\n defaultLoraDropout: 0.05,\n defaultMaxSeqLength: 2048,\n loraTargetModules: \"all-linear\",\n gradientCheckpointing: true,\n };\n}\n\nfunction findCertifiedTrainingModel(modelId: string): TrainingModel | undefined {\n const normalized = modelId.trim().toLowerCase();\n return TRAINING_MODELS.find((candidate) => candidate.id.toLowerCase() === normalized);\n}\n\n/** Whether TT has reviewed and pinned this model's training path. */\nexport function isCertifiedTrainingModel(modelId: string): boolean {\n return findCertifiedTrainingModel(modelId) !== undefined;\n}\n\n/**\n * Resolve a certified model, or any other Hugging Face repo id as an\n * uncertified causal LM. Uncertified models require a pinned revision; see\n * `uncertifiedRevisionError`.\n */\nexport function resolveTrainingModel(modelId: string): TrainingModel {\n const model = findCertifiedTrainingModel(modelId);\n if (model) return model;\n const id = modelId.trim();\n if (HUGGING_FACE_REPO_ID.test(id)) return uncertifiedTrainingModel(id);\n throw new Error(\n `Unsupported base model \"${modelId}\". Use a certified model (${TRAINING_MODELS.map((item) => item.id).join(\", \")}) `\n + \"or a Hugging Face repo id such as owner/name.\",\n );\n}\n\n/** Explain how to opt in to an uncertified model that has no pinned revision. */\nexport function uncertifiedRevisionError(modelId: string): Error {\n return new Error(\n `${modelId} is not a TT-certified base model. To fine-tune it anyway, set `\n + \"hyperparameters.base_model_revision to its 40-character commit SHA \"\n + `(see https://huggingface.co/${modelId}/commits/main). `\n + \"Uncertified models load as text causal LMs with safetensors weights and no remote code.\",\n );\n}\n\nexport function canonicalizeTrainingModel(modelId: string): string {\n return resolveTrainingModel(modelId).id;\n}\n\n/** Resolve and enforce the immutable revision contract for a training model. */\nexport function resolveRequestedBaseModelRevision(\n modelId: string,\n requestedRevision?: string,\n): string | undefined {\n const model = resolveTrainingModel(modelId);\n if (!isCertifiedTrainingModel(model.id) && !requestedRevision) {\n throw uncertifiedRevisionError(model.id);\n }\n if (\n model.defaultRevision\n && requestedRevision\n && requestedRevision !== model.defaultRevision\n ) {\n throw new Error(\n `${model.id} must use certified revision ${model.defaultRevision}; got ${requestedRevision}.`,\n );\n }\n return requestedRevision ?? model.defaultRevision;\n}\n\n/** Resolve the immutable revision a training model is bound to, if any. */\nexport function defaultBaseModelRevision(modelId: string): string | undefined {\n return resolveTrainingModel(modelId).defaultRevision;\n}\n\n/** Resolve how the bundled text-only runtime must load a training model. */\nexport function resolveModelLoader(modelId: string): ModelLoader {\n return resolveTrainingModel(modelId).modelLoader;\n}\n\nconst CERTIFIED_QWEN_TEXT_CONFIG = {\n model_type: \"qwen3_5_text\",\n hidden_size: 2048,\n num_hidden_layers: 24,\n num_attention_heads: 8,\n num_key_value_heads: 2,\n intermediate_size: 6144,\n vocab_size: 248320,\n} as const;\n\nconst CERTIFIED_MUSE_GLIMMER_TEXT_CONFIG = {\n model_type: \"muse_glimmer_text\",\n hidden_size: 6656,\n num_hidden_layers: 52,\n num_attention_heads: 32,\n num_key_value_heads: 2,\n intermediate_size: 19968,\n vocab_size: 202048,\n} as const;\n\nconst CERTIFIED_NEMOTRON_CONFIG = {\n hidden_size: 2688,\n num_hidden_layers: 52,\n num_attention_heads: 32,\n num_key_value_heads: 2,\n intermediate_size: 1856,\n vocab_size: 131072,\n n_routed_experts: 128,\n num_experts_per_tok: 6,\n num_nextn_predict_layers: 1,\n max_position_embeddings: 262144,\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction hasArchitecture(config: Record<string, unknown>, architecture: string): boolean {\n const architectures = config.architectures;\n return Array.isArray(architectures) && architectures.includes(architecture);\n}\n\n/**\n * Reject a same-family snapshot that is not the certified text tower. Qwen3.5\n * and Muse Glimmer both expose the text tower through a repo-level config with\n * a `text_config` sub-object, so they share this check.\n */\nfunction assertCertifiedTextTowerConfig(\n config: Record<string, unknown>,\n label: string,\n certifiedModelId: string,\n architecture: string,\n certifiedTextConfig: Readonly<Record<string, unknown>>,\n): void {\n if (!hasArchitecture(config, architecture)) {\n throw new Error(`${label} is not the certified ${certifiedModelId} architecture.`);\n }\n const textConfig = config.text_config;\n if (!isRecord(textConfig)) {\n throw new Error(`${label} is not the certified ${certifiedModelId} architecture.`);\n }\n for (const [key, expected] of Object.entries(certifiedTextConfig)) {\n if (textConfig[key] !== expected) {\n throw new Error(\n `${label} is not the certified ${certifiedModelId} architecture: `\n + `text_config.${key} must be ${JSON.stringify(expected)}.`,\n );\n }\n }\n}\n\n/** Reject a same-family snapshot that is not the certified architecture. */\nexport function assertCertifiedBaseModelConfig(\n value: unknown,\n label = \"base-model config.json\",\n expectedModelId?: string,\n): void {\n if (!isRecord(value)) {\n throw new Error(`${label} must contain a JSON object.`);\n }\n const config = value;\n // Uncertified models have no reviewed architecture to compare against.\n if (expectedModelId && !isCertifiedTrainingModel(expectedModelId)) return;\n const expectedFamily = expectedModelId\n ? resolveTrainingModel(expectedModelId).family\n : undefined;\n\n if (config.model_type === \"qwen3_5\") {\n if (expectedFamily && expectedFamily !== \"qwen3_5\") {\n throw new Error(`${label} does not match requested base model ${expectedModelId}.`);\n }\n assertCertifiedTextTowerConfig(\n config,\n label,\n \"Qwen/Qwen3.5-2B\",\n \"Qwen3_5ForConditionalGeneration\",\n CERTIFIED_QWEN_TEXT_CONFIG,\n );\n return;\n }\n if (config.model_type === \"muse_glimmer\") {\n if (expectedFamily && expectedFamily !== \"muse_glimmer\") {\n throw new Error(`${label} does not match requested base model ${expectedModelId}.`);\n }\n assertCertifiedTextTowerConfig(\n config,\n label,\n \"meta-models/Muse-Glimmer-30B\",\n \"MuseGlimmerForConditionalGeneration\",\n CERTIFIED_MUSE_GLIMMER_TEXT_CONFIG,\n );\n return;\n }\n if (\n config.model_type === \"nemotron_h\"\n && hasArchitecture(config, \"NemotronHForCausalLM\")\n ) {\n if (expectedFamily && expectedFamily !== \"nemotron_h\") {\n throw new Error(`${label} does not match requested base model ${expectedModelId}.`);\n }\n for (const [key, expected] of Object.entries(CERTIFIED_NEMOTRON_CONFIG)) {\n if (config[key] !== expected) {\n throw new Error(\n `${label} is not the certified nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16 architecture: `\n + `${key} must be ${JSON.stringify(expected)}.`,\n );\n }\n }\n return;\n }\n throw new Error(\n `${label} is not a certified TT base-model architecture.`,\n );\n}\n\nexport interface ModelArtifactInspection {\n uri: string;\n path: string;\n kind: \"file\" | \"directory\";\n adapter_weight_file_count: number;\n adapter_weight_bytes: number;\n has_adapter_config: boolean;\n}\n\nexport function localModelArtifactPath(uri: string): string {\n if (uri.startsWith(\"file://\")) {\n const legacy = uri.slice(\"file://\".length);\n if (process.platform === \"win32\" && /^[a-z]:[\\\\/]/i.test(legacy)) return resolve(legacy);\n return fileURLToPath(new URL(uri));\n }\n if (isAbsolute(uri)) return resolve(uri);\n if (/^[a-z][a-z0-9+.-]*:/i.test(uri)) {\n throw new Error(`Model artifact must be a local path or file URI: ${uri}`);\n }\n return resolve(uri);\n}\n\nfunction adapterWeightName(name: string): boolean {\n const lower = name.toLowerCase();\n return lower === \"adapter_model.safetensors\" || lower === \"adapter_model.bin\";\n}\n\nasync function inspectAdapterDirectory(path: string): Promise<{\n count: number;\n bytes: number;\n hasConfig: boolean;\n}> {\n let count = 0;\n let bytes = 0;\n let hasConfig = false;\n for (const entry of await readdir(path, { withFileTypes: true })) {\n const child = resolve(path, entry.name);\n if (entry.isSymbolicLink()) {\n throw new Error(`Model artifact must not contain symbolic links: ${child}`);\n }\n if (entry.isDirectory()) {\n const nested = await inspectAdapterDirectory(child);\n count += nested.count;\n bytes += nested.bytes;\n hasConfig ||= nested.hasConfig;\n continue;\n }\n if (!entry.isFile()) continue;\n const metadata = await lstat(child);\n if (adapterWeightName(entry.name) && metadata.size > 0) {\n count += 1;\n bytes += metadata.size;\n }\n if (entry.name.toLowerCase() === \"adapter_config.json\" && metadata.size > 0) {\n hasConfig = true;\n }\n }\n return { count, bytes, hasConfig };\n}\n\nexport async function inspectModelArtifact(uri: string): Promise<ModelArtifactInspection> {\n const path = localModelArtifactPath(uri);\n const metadata = await lstat(path).catch(() => null);\n if (!metadata) throw new Error(`Model artifact does not exist: ${path}`);\n if (metadata.isSymbolicLink()) {\n throw new Error(`Model artifact must not be a symbolic link: ${path}`);\n }\n if (metadata.isDirectory()) {\n const adapter = await inspectAdapterDirectory(path);\n return {\n uri,\n path,\n kind: \"directory\",\n adapter_weight_file_count: adapter.count,\n adapter_weight_bytes: adapter.bytes,\n has_adapter_config: adapter.hasConfig,\n };\n }\n if (!metadata.isFile() || !path.toLowerCase().endsWith(\".tar.gz\")) {\n throw new Error(\n `Model artifact must be a PEFT adapter directory or .tar.gz archive: ${path}`,\n );\n }\n const archive = await verifyTarGzipArchive(path);\n return {\n uri,\n path,\n kind: \"file\",\n adapter_weight_file_count: archive.adapter_weight_entries,\n adapter_weight_bytes: archive.adapter_weight_bytes,\n has_adapter_config: archive.adapter_config_entries > 0,\n };\n}\n\nexport async function assertUsableModelArtifact(\n uri: string,\n): Promise<ModelArtifactInspection> {\n const inspection = await inspectModelArtifact(uri);\n if (\n inspection.adapter_weight_file_count === 0\n || inspection.adapter_weight_bytes === 0\n ) {\n throw new Error(\n `PEFT model artifact ${inspection.path} contains no non-empty adapter_model weights.`,\n );\n }\n if (!inspection.has_adapter_config) {\n throw new Error(\n `PEFT model artifact ${inspection.path} contains adapter weights but no non-empty adapter_config.json.`,\n );\n }\n return inspection;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { copyFile, lstat, mkdir, open, readFile, readdir, realpath, rename, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { createGunzip } from \"node:zlib\";\nimport { pathToFileURL } from \"node:url\";\n\nexport interface RunArtifacts {\n root: string;\n prefix: string;\n runDir: string;\n trainingJsonl: string;\n stageMetadataJson: string;\n trainingReportJson: string;\n baselineEvalJson: string;\n candidateEvalJson: string;\n generalBaselineEvalJson: string;\n generalCandidateEvalJson: string;\n runReportJson: string;\n artifactManifestJson: string;\n progressJsonl: string;\n trainingDir: string;\n trainingInputDir: string;\n trainingConfigDir: string;\n trainingOutputDir: string;\n trainingModelDir: string;\n trainingLog: string;\n}\n\nconst RUN_OWNER_FILE = \".tt-local-run-owner.json\";\nexport const ARTIFACT_WORKFLOW_LOCK_FILE = \".tt-local-workflow.lock\";\n\nexport interface ArtifactRunOwner {\n schema_version: 1;\n run_id: string;\n user_id: string;\n behavior_spec_id: string;\n created_at: string;\n}\n\nexport function fileUri(path: string): string {\n return pathToFileURL(resolve(path)).href;\n}\n\nexport function defaultArtifactPrefix(input: {\n userId: string;\n behaviorSpecId: string;\n runId: string;\n}): string {\n return join(\"users\", input.userId, \"specs\", input.behaviorSpecId, \"runs\", input.runId);\n}\n\nexport function resolveRunArtifacts(args: {\n artifactRoot: string;\n prefix: string;\n}): RunArtifacts {\n const root = resolve(args.artifactRoot);\n const safePrefix = args.prefix.replace(/^[/\\\\]+/, \"\");\n const runDir = resolve(root, safePrefix);\n const containment = relative(root, runDir);\n if (containment === \"..\" || containment.startsWith(`..${sep}`) || isAbsolute(containment)) {\n throw new Error(`Artifact prefix escapes artifactRoot: ${args.prefix}`);\n }\n const trainingDir = join(runDir, \"training\");\n return {\n root,\n prefix: safePrefix,\n runDir,\n trainingJsonl: join(runDir, \"training.jsonl\"),\n stageMetadataJson: join(runDir, \"stage-metadata.json\"),\n trainingReportJson: join(runDir, \"training-report.json\"),\n baselineEvalJson: join(runDir, \"baseline-eval.json\"),\n candidateEvalJson: join(runDir, \"candidate-eval.json\"),\n generalBaselineEvalJson: join(runDir, \"general-baseline-eval.json\"),\n generalCandidateEvalJson: join(runDir, \"general-candidate-eval.json\"),\n runReportJson: join(runDir, \"run-report.json\"),\n artifactManifestJson: join(runDir, \"artifact-manifest.json\"),\n progressJsonl: join(runDir, \"progress.jsonl\"),\n trainingDir,\n trainingInputDir: join(trainingDir, \"input\", \"data\", \"training\"),\n trainingConfigDir: join(trainingDir, \"input\", \"config\"),\n trainingOutputDir: join(trainingDir, \"output\"),\n trainingModelDir: join(trainingDir, \"model\"),\n trainingLog: join(trainingDir, \"training.log\"),\n };\n}\n\n/**\n * Creates the run directory one component at a time and rejects symlinked\n * descendants. Lexical `resolve()` containment alone is insufficient because\n * an existing child symlink could redirect later writes or recursive cleanup\n * outside `artifactRoot`.\n */\nexport async function ensureSafeRunDirectory(artifacts: RunArtifacts): Promise<void> {\n await mkdir(artifacts.root, { recursive: true });\n const canonicalRoot = await realpath(artifacts.root);\n const pathFromRoot = relative(artifacts.root, artifacts.runDir);\n const segments = pathFromRoot ? pathFromRoot.split(sep).filter(Boolean) : [];\n let current = artifacts.root;\n for (const segment of segments) {\n current = join(current, segment);\n let metadata = await lstat(current).catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return null;\n throw error;\n });\n if (!metadata) {\n await mkdir(current).catch((error: NodeJS.ErrnoException) => {\n if (error.code !== \"EEXIST\") throw error;\n });\n metadata = await lstat(current);\n }\n if (metadata.isSymbolicLink()) {\n throw new Error(`Artifact path must not contain symbolic links: ${current}`);\n }\n if (!metadata.isDirectory()) {\n throw new Error(`Artifact path component is not a directory: ${current}`);\n }\n }\n const canonicalRunDir = await realpath(artifacts.runDir);\n const containment = relative(canonicalRoot, canonicalRunDir);\n if (containment === \"..\" || containment.startsWith(`..${sep}`) || isAbsolute(containment)) {\n throw new Error(`Artifact run directory escapes artifactRoot: ${artifacts.runDir}`);\n }\n}\n\n/**\n * Durably binds an artifact directory to one run identity. The owner survives\n * workflow-lock release, preventing a later run with a colliding custom\n * prefix from deleting or silently reusing another run's artifacts.\n */\nexport async function claimRunArtifactDirectory(args: {\n artifacts: RunArtifacts;\n runId: string;\n userId: string;\n behaviorSpecId: string;\n}): Promise<ArtifactRunOwner> {\n await ensureSafeRunDirectory(args.artifacts);\n const ownerPath = join(args.artifacts.runDir, RUN_OWNER_FILE);\n const proposed: ArtifactRunOwner = {\n schema_version: 1,\n run_id: args.runId,\n user_id: args.userId,\n behavior_spec_id: args.behaviorSpecId,\n created_at: new Date().toISOString(),\n };\n try {\n const handle = await open(ownerPath, \"wx\", 0o600);\n try {\n await handle.writeFile(`${JSON.stringify(proposed, null, 2)}\\n`);\n await handle.sync();\n } finally {\n await handle.close();\n }\n return proposed;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n let existing: ArtifactRunOwner;\n try {\n existing = JSON.parse(await readFile(ownerPath, \"utf8\")) as ArtifactRunOwner;\n } catch (error) {\n throw new Error(`Artifact run owner claim is unreadable: ${ownerPath}`, { cause: error });\n }\n if (\n existing.schema_version !== 1\n || existing.run_id !== args.runId\n || existing.user_id !== args.userId\n || existing.behavior_spec_id !== args.behaviorSpecId\n ) {\n throw new Error(\n `Artifact directory ${args.artifacts.runDir} is already owned by run ${existing.run_id ?? \"unknown\"}; `\n + `run ${args.runId} must use a different artifacts.prefix.`,\n );\n }\n return existing;\n}\n\nexport async function prepareRunDirectories(artifacts: RunArtifacts): Promise<void> {\n await ensureSafeRunDirectory(artifacts);\n await Promise.all([\n mkdir(artifacts.runDir, { recursive: true }),\n mkdir(artifacts.trainingInputDir, { recursive: true }),\n mkdir(artifacts.trainingConfigDir, { recursive: true }),\n mkdir(artifacts.trainingOutputDir, { recursive: true }),\n mkdir(artifacts.trainingModelDir, { recursive: true }),\n ]);\n}\n\nexport async function writeJson(path: string, value: unknown): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function writeJsonAtomic(path: string, value: unknown): Promise<void> {\n await writeFileAtomic(path, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport async function writeFileAtomic(path: string, value: string | Uint8Array): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const temporary = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`;\n await writeFile(temporary, value);\n await rename(temporary, path);\n}\n\nexport async function readJson<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nexport async function appendProgress(artifacts: RunArtifacts, event: {\n stage: string;\n message: string;\n details?: Record<string, unknown>;\n}): Promise<void> {\n await mkdir(artifacts.runDir, { recursive: true });\n await writeFile(\n artifacts.progressJsonl,\n `${JSON.stringify({ at: new Date().toISOString(), ...event })}\\n`,\n { encoding: \"utf8\", flag: \"a\" },\n );\n}\n\nexport async function copyDatasetToTrainingChannel(artifacts: RunArtifacts): Promise<string> {\n const destination = join(artifacts.trainingInputDir, \"training.jsonl\");\n await copyFile(artifacts.trainingJsonl, destination);\n return destination;\n}\n\nexport interface ArtifactManifestFile {\n path: string;\n size_bytes: number;\n sha256: string;\n}\n\nexport interface ArtifactManifest {\n schema_version: 1;\n generated_at: string;\n files: ArtifactManifestFile[];\n model?: ArtifactManifestModel;\n}\n\nexport interface ArtifactManifestModel {\n artifact_kind: \"file\" | \"directory\";\n format: \"tar.gz\" | \"huggingface-directory\";\n framework: \"transformers-peft\";\n base_model: string;\n base_model_revision?: string;\n base_model_artifact_uri?: string;\n base_model_fingerprint?: string;\n artifact_uri: string;\n artifact_root: string;\n servable: true;\n files: ArtifactManifestFile[];\n}\n\nexport interface ArtifactManifestVerification {\n valid: boolean;\n checked: number;\n missing: string[];\n changed: string[];\n unexpected: string[];\n}\n\nexport interface TarGzipVerification {\n entries: number;\n payload_entries: number;\n recognized_payload_entries: number;\n recognized_payload_bytes: number;\n adapter_weight_entries: number;\n adapter_weight_bytes: number;\n full_model_weight_entries: number;\n full_model_weight_bytes: number;\n adapter_config_entries: number;\n expanded_bytes: number;\n}\n\nconst MANIFEST_IGNORED_PATHS = new Set([\n \"artifact-manifest.json\",\n // These are append-only/control-plane files rather than immutable stage\n // outputs. Including them would invalidate a manifest whenever the store\n // records the next stage event or refreshes the canonical request copy.\n \"progress.jsonl\",\n \"request.json\",\n RUN_OWNER_FILE,\n ARTIFACT_WORKFLOW_LOCK_FILE,\n]);\n\nfunction portableRelative(root: string, path: string): string {\n return relative(root, path).split(sep).join(\"/\");\n}\n\nfunction shouldManifest(path: string): boolean {\n const atomicTemporary = /\\.\\d+\\.\\d+\\.[0-9a-f-]{36}\\.tmp$/i.test(path);\n return !MANIFEST_IGNORED_PATHS.has(path) && !atomicTemporary;\n}\n\nasync function listArtifactFiles(root: string, current = root): Promise<string[]> {\n const files: string[] = [];\n for (const entry of await readdir(current, { withFileTypes: true }).catch(() => [])) {\n const absolute = join(current, entry.name);\n if (entry.isSymbolicLink()) {\n throw new Error(`Artifact tree must not contain symbolic links: ${absolute}`);\n }\n if (entry.isDirectory()) {\n // Mutable prediction recovery is not evidence for a completed stage.\n if (portableRelative(root, absolute) === \"inference-checkpoints\") continue;\n files.push(...await listArtifactFiles(root, absolute));\n continue;\n }\n if (!entry.isFile()) continue;\n const relativePath = portableRelative(root, absolute);\n if (!shouldManifest(relativePath)) continue;\n const metadata = await stat(absolute).catch(() => null);\n if (metadata?.isFile()) files.push(relativePath);\n }\n return files.sort();\n}\n\nasync function sha256File(path: string): Promise<string> {\n const hash = createHash(\"sha256\");\n for await (const chunk of createReadStream(path)) hash.update(chunk);\n return hash.digest(\"hex\");\n}\n\nasync function describeArtifactFile(root: string, path: string): Promise<ArtifactManifestFile> {\n const absolute = join(root, path);\n const metadata = await stat(absolute);\n return {\n path,\n size_bytes: metadata.size,\n sha256: await sha256File(absolute),\n };\n}\n\nfunction assertManifestFiles(value: unknown, label: string): asserts value is ArtifactManifestFile[] {\n if (!Array.isArray(value)) throw new Error(`Artifact manifest ${label} must be an array.`);\n const paths = new Set<string>();\n for (const file of value) {\n if (\n !file\n || typeof file.path !== \"string\"\n || !Number.isSafeInteger(file.size_bytes)\n || file.size_bytes < 0\n || typeof file.sha256 !== \"string\"\n || !/^[a-f0-9]{64}$/.test(file.sha256)\n ) {\n throw new Error(`Artifact manifest contains an invalid ${label} entry.`);\n }\n const manifestPath = file.path as string;\n const segments: string[] = manifestPath.split(\"/\");\n if (\n !manifestPath\n || manifestPath.includes(\"\\\\\")\n || manifestPath.includes(\"\\0\")\n || manifestPath.startsWith(\"/\")\n || /^[a-z]:/i.test(manifestPath)\n || segments.some((segment) => !segment || segment === \".\" || segment === \"..\")\n ) {\n throw new Error(`Artifact manifest contains an unsafe ${label} path: ${manifestPath}`);\n }\n if (paths.has(manifestPath)) throw new Error(`Artifact manifest contains a duplicate ${label} path: ${manifestPath}`);\n paths.add(manifestPath);\n }\n}\n\nfunction hasPeftAdapterFiles(files: ArtifactManifestFile[]): boolean {\n const names = new Set(\n files\n .filter((file) => file.size_bytes > 0)\n .map((file) => file.path.split(\"/\").at(-1)?.toLowerCase()),\n );\n return (\n names.has(\"adapter_config.json\")\n && (names.has(\"adapter_model.safetensors\") || names.has(\"adapter_model.bin\"))\n );\n}\n\nfunction parseArtifactManifest(value: unknown): ArtifactManifest {\n if (!value || typeof value !== \"object\") throw new Error(\"Artifact manifest must be an object.\");\n const candidate = value as Partial<ArtifactManifest>;\n if (candidate.schema_version !== 1 || !Array.isArray(candidate.files)) {\n throw new Error(\"Unsupported or invalid artifact manifest.\");\n }\n assertManifestFiles(candidate.files, \"file\");\n if (candidate.model) {\n const model = candidate.model;\n const allowedModelKeys = new Set([\n \"artifact_kind\",\n \"format\",\n \"framework\",\n \"base_model\",\n \"base_model_revision\",\n \"base_model_artifact_uri\",\n \"base_model_fingerprint\",\n \"artifact_uri\",\n \"artifact_root\",\n \"servable\",\n \"files\",\n ]);\n const hasBaseArtifact = model.base_model_artifact_uri !== undefined;\n const hasBaseFingerprint = model.base_model_fingerprint !== undefined;\n if (\n Object.keys(model).some((key) => !allowedModelKeys.has(key))\n || (model.artifact_kind !== \"file\" && model.artifact_kind !== \"directory\")\n || (model.format !== \"tar.gz\" && model.format !== \"huggingface-directory\")\n || model.framework !== \"transformers-peft\"\n || typeof model.base_model !== \"string\"\n || (model.base_model_revision !== undefined && typeof model.base_model_revision !== \"string\")\n || (model.base_model_artifact_uri !== undefined && typeof model.base_model_artifact_uri !== \"string\")\n || (model.base_model_fingerprint !== undefined && typeof model.base_model_fingerprint !== \"string\")\n || hasBaseArtifact !== hasBaseFingerprint\n || typeof model.artifact_uri !== \"string\"\n || typeof model.artifact_root !== \"string\"\n || model.servable !== true\n || !Array.isArray(model.files)\n || model.files.length === 0\n || (model.artifact_kind === \"file\" && model.format !== \"tar.gz\")\n || (model.artifact_kind === \"directory\" && model.format !== \"huggingface-directory\")\n ) {\n throw new Error(\"Artifact manifest contains invalid model contract metadata.\");\n }\n assertManifestFiles(model.files, \"model file\");\n if (model.artifact_kind === \"directory\" && !hasPeftAdapterFiles(model.files)) {\n throw new Error(\"PEFT model manifest requires adapter weights and adapter_config.json.\");\n }\n }\n return candidate as ArtifactManifest;\n}\n\n/** Atomically snapshots every immutable file currently present in a run directory. */\nexport async function writeArtifactManifest(\n artifacts: RunArtifacts,\n options: { model?: Omit<ArtifactManifestModel, \"files\"> } = {},\n): Promise<ArtifactManifest> {\n const paths = await listArtifactFiles(artifacts.runDir);\n let model: ArtifactManifestModel | undefined;\n if (options.model) {\n if (\n options.model.framework !== \"transformers-peft\"\n || options.model.servable !== true\n || (options.model.artifact_kind === \"file\" && options.model.format !== \"tar.gz\")\n || (options.model.artifact_kind === \"directory\" && options.model.format !== \"huggingface-directory\")\n ) {\n throw new Error(\"TT local model artifacts must be verified, servable Transformers PEFT adapters.\");\n }\n if (\n (options.model.base_model_artifact_uri === undefined)\n !== (options.model.base_model_fingerprint === undefined)\n ) {\n throw new Error(\"Model contracts must record a local base-model URI and fingerprint together.\");\n }\n const modelRoot = resolve(options.model.artifact_root);\n const modelPaths = options.model.artifact_kind === \"file\"\n ? [portableRelative(dirname(modelRoot), modelRoot)]\n : await listArtifactFiles(modelRoot);\n const checksumRoot = options.model.artifact_kind === \"file\" ? dirname(modelRoot) : modelRoot;\n if (options.model.artifact_kind === \"file\") {\n if (!modelRoot.toLowerCase().endsWith(\".tar.gz\")) {\n throw new Error(`PEFT file artifacts must be .tar.gz archives: ${modelRoot}`);\n }\n const archive = await verifyTarGzipArchive(modelRoot);\n if (archive.adapter_weight_entries === 0 || archive.adapter_weight_bytes === 0) {\n throw new Error(`PEFT model archive contains no adapter_model.safetensors or adapter_model.bin: ${modelRoot}`);\n }\n if (archive.adapter_config_entries === 0) {\n throw new Error(`PEFT model archive contains no adapter_config.json: ${modelRoot}`);\n }\n }\n const modelFiles = await Promise.all(modelPaths.map((path) => describeArtifactFile(checksumRoot, path)));\n if (options.model.artifact_kind === \"directory\" && !hasPeftAdapterFiles(modelFiles)) {\n throw new Error(`PEFT model directory requires adapter weights and adapter_config.json: ${modelRoot}`);\n }\n model = {\n ...options.model,\n artifact_root: modelRoot,\n files: modelFiles,\n };\n }\n const manifest: ArtifactManifest = {\n schema_version: 1,\n generated_at: new Date().toISOString(),\n files: await Promise.all(paths.map((path) => describeArtifactFile(artifacts.runDir, path))),\n ...(model ? { model } : {}),\n };\n await writeJsonAtomic(artifacts.artifactManifestJson, manifest);\n return manifest;\n}\n\n/** Re-hashes a persisted run and reports missing, changed, and untracked files. */\nexport async function verifyArtifactManifest(\n manifestPath: string,\n options: {\n requiredPaths?: string[];\n allowUnexpected?: boolean;\n scopeToRequired?: boolean;\n verifyModel?: boolean;\n } = {},\n): Promise<ArtifactManifestVerification> {\n const root = dirname(resolve(manifestPath));\n const manifest = parseArtifactManifest(JSON.parse(await readFile(manifestPath, \"utf8\")) as unknown);\n const expected = new Map(manifest.files.map((file) => [file.path, file]));\n const actualPaths = await listArtifactFiles(root);\n const actual = new Set(actualPaths);\n const missing: string[] = [];\n const changed: string[] = [];\n\n const normalizedRequired = (options.requiredPaths ?? [])\n .map((path) => path.split(sep).join(\"/\").replace(/^\\.\\//, \"\"));\n const checkedEntries = options.scopeToRequired\n ? normalizedRequired.flatMap((path) => {\n const entry = expected.get(path);\n return entry ? [[path, entry] as const] : [];\n })\n : [...expected.entries()];\n for (const [path, expectedFile] of checkedEntries) {\n if (!actual.has(path)) {\n missing.push(path);\n continue;\n }\n const actualFile = await describeArtifactFile(root, path);\n if (actualFile.size_bytes !== expectedFile.size_bytes || actualFile.sha256 !== expectedFile.sha256) {\n changed.push(path);\n }\n }\n for (const normalized of normalizedRequired) {\n if (!expected.has(normalized) && !missing.includes(normalized)) missing.push(normalized);\n }\n const unexpected = options.allowUnexpected || options.scopeToRequired\n ? []\n : actualPaths.filter((path) => !expected.has(path));\n let modelChecked = 0;\n if (manifest.model && (options.verifyModel ?? !options.scopeToRequired)) {\n const modelRoot = resolve(manifest.model.artifact_root);\n const checksumRoot = manifest.model.artifact_kind === \"file\" ? dirname(modelRoot) : modelRoot;\n const modelActualPaths = manifest.model.artifact_kind === \"file\"\n ? [portableRelative(checksumRoot, modelRoot)]\n : await listArtifactFiles(modelRoot);\n const modelActual = new Set(modelActualPaths);\n for (const expectedFile of manifest.model.files) {\n const label = `model:${expectedFile.path}`;\n if (!modelActual.has(expectedFile.path)) {\n missing.push(label);\n continue;\n }\n const actualFile = await describeArtifactFile(checksumRoot, expectedFile.path);\n modelChecked += 1;\n if (actualFile.size_bytes !== expectedFile.size_bytes || actualFile.sha256 !== expectedFile.sha256) {\n changed.push(label);\n }\n }\n if (!options.allowUnexpected) {\n const expectedModelPaths = new Set(manifest.model.files.map((file) => file.path));\n unexpected.push(...modelActualPaths.filter((path) => !expectedModelPaths.has(path)).map((path) => `model:${path}`));\n }\n if (manifest.model.artifact_kind === \"file\") {\n try {\n const archive = await verifyTarGzipArchive(modelRoot);\n if (archive.adapter_weight_entries === 0 || archive.adapter_weight_bytes === 0) {\n changed.push(`model:${portableRelative(checksumRoot, modelRoot)}:missing_adapter_weights`);\n }\n if (archive.adapter_config_entries === 0) {\n changed.push(`model:${portableRelative(checksumRoot, modelRoot)}:missing_adapter_config`);\n }\n } catch {\n changed.push(`model:${portableRelative(checksumRoot, modelRoot)}:invalid_archive`);\n }\n } else if (!hasPeftAdapterFiles(\n await Promise.all(modelActualPaths.map((path) => describeArtifactFile(checksumRoot, path))),\n )) {\n changed.push(\"model:missing_peft_adapter\");\n }\n }\n return {\n valid: missing.length === 0 && changed.length === 0 && unexpected.length === 0,\n checked: checkedEntries.length + modelChecked,\n missing: [...new Set(missing)].sort(),\n changed: changed.sort(),\n unexpected: unexpected.sort(),\n };\n}\n\n/** Validates gzip CRC/truncation, tar headers, paths, and bounded PAX metadata. */\nexport async function verifyTarGzipArchive(path: string): Promise<TarGzipVerification> {\n const maxEntries = 100_000;\n const maxExpandedBytes = 20 * 1024 * 1024 * 1024;\n const maxPaxBytes = 1024 * 1024;\n const safeMemberPath = (value: string): string => {\n const normalized = value.replaceAll(\"\\\\\", \"/\");\n const segments = normalized.split(\"/\").filter(Boolean);\n if (\n !normalized\n || normalized.startsWith(\"/\")\n || /^[a-z]:\\//i.test(normalized)\n || segments.includes(\"..\")\n ) {\n throw new Error(`Unsafe tar member path ${JSON.stringify(normalized)} in ${path}.`);\n }\n return normalized;\n };\n const parsePax = (payload: Buffer, global: boolean): string | undefined => {\n let offset = 0;\n let memberPath: string | undefined;\n const allowedMetadata = new Set([\"mtime\", \"atime\", \"ctime\", \"uid\", \"gid\", \"uname\", \"gname\"]);\n while (offset < payload.length) {\n const separator = payload.indexOf(0x20, offset);\n if (separator < 0) throw new Error(`Malformed PAX record in ${path}.`);\n const lengthText = payload.subarray(offset, separator).toString(\"ascii\");\n if (!/^[1-9][0-9]*$/.test(lengthText)) throw new Error(`Malformed PAX record length in ${path}.`);\n const length = Number.parseInt(lengthText, 10);\n const end = offset + length;\n if (!Number.isSafeInteger(length) || end > payload.length || payload[end - 1] !== 0x0a) {\n throw new Error(`Truncated PAX record in ${path}.`);\n }\n const record = payload.subarray(separator + 1, end - 1).toString(\"utf8\");\n const equals = record.indexOf(\"=\");\n if (equals <= 0) throw new Error(`Malformed PAX key/value in ${path}.`);\n const key = record.slice(0, equals);\n const value = record.slice(equals + 1);\n if (key === \"path\") {\n if (global) throw new Error(`Global PAX path overrides are unsupported in ${path}.`);\n memberPath = safeMemberPath(value);\n } else if (!allowedMetadata.has(key)) {\n // In particular, reject linkpath and size overrides: the validator\n // must never interpret a member differently from a downstream reader.\n throw new Error(`Unsupported PAX key ${JSON.stringify(key)} in ${path}.`);\n }\n offset = end;\n }\n return memberPath;\n };\n const gunzip = createReadStream(path).pipe(createGunzip());\n let buffered = Buffer.alloc(0);\n let payloadBytes = 0;\n let paddingBytes = 0;\n let paxType: \"x\" | \"g\" | null = null;\n let paxChunks: Buffer[] = [];\n let pendingPaxPath: string | undefined;\n let entries = 0;\n let payloadEntries = 0;\n let recognizedPayloadEntries = 0;\n let recognizedPayloadBytes = 0;\n let adapterWeightEntries = 0;\n let adapterWeightBytes = 0;\n let fullModelWeightEntries = 0;\n let fullModelWeightBytes = 0;\n let adapterConfigEntries = 0;\n let expandedBytes = 0;\n let zeroBlocks = 0;\n let ended = false;\n for await (const chunk of gunzip) {\n buffered = Buffer.concat([buffered, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]);\n while (true) {\n if (payloadBytes > 0) {\n if (buffered.length === 0) break;\n const consumed = Math.min(payloadBytes, buffered.length);\n if (paxType) paxChunks.push(buffered.subarray(0, consumed));\n buffered = buffered.subarray(consumed);\n payloadBytes -= consumed;\n continue;\n }\n if (paddingBytes > 0) {\n if (buffered.length === 0) break;\n const consumed = Math.min(paddingBytes, buffered.length);\n buffered = buffered.subarray(consumed);\n paddingBytes -= consumed;\n continue;\n }\n if (paxType) {\n const paxPath = parsePax(Buffer.concat(paxChunks), paxType === \"g\");\n if (paxType === \"x\") pendingPaxPath = paxPath;\n paxType = null;\n paxChunks = [];\n continue;\n }\n if (buffered.length < 512) break;\n const header = buffered.subarray(0, 512);\n buffered = buffered.subarray(512);\n if (header.every((byte) => byte === 0)) {\n zeroBlocks += 1;\n if (zeroBlocks >= 2) ended = true;\n continue;\n }\n if (ended) throw new Error(`Tar archive contains data after its end marker: ${path}.`);\n zeroBlocks = 0;\n const checksumText = header.subarray(148, 156).toString(\"ascii\").replace(/\\0/g, \"\").trim();\n if (!/^[0-7]+$/.test(checksumText)) throw new Error(`Invalid tar checksum field in ${path}.`);\n const expectedChecksum = Number.parseInt(checksumText, 8);\n let actualChecksum = 0;\n for (let index = 0; index < header.length; index += 1) {\n actualChecksum += index >= 148 && index < 156 ? 32 : header[index]!;\n }\n if (actualChecksum !== expectedChecksum) throw new Error(`Tar member checksum mismatch in ${path}.`);\n const sizeText = header.subarray(124, 136).toString(\"ascii\").replace(/\\0/g, \"\").trim();\n if (sizeText && !/^[0-7]+$/.test(sizeText)) throw new Error(`Invalid tar member size in ${path}.`);\n const size = sizeText ? Number.parseInt(sizeText, 8) : 0;\n if (!Number.isSafeInteger(size) || size < 0) throw new Error(`Invalid tar member size in ${path}.`);\n const type = String.fromCharCode(header[156] ?? 0);\n if (type !== \"\\0\" && type !== \"0\" && type !== \"5\" && type !== \"x\" && type !== \"g\") {\n throw new Error(`Unsafe or unsupported tar member type ${JSON.stringify(type)} in ${path}.`);\n }\n const shortName = header.subarray(0, 100).toString(\"utf8\").replace(/\\0.*$/, \"\");\n const prefix = header.subarray(345, 500).toString(\"utf8\").replace(/\\0.*$/, \"\");\n const headerPath = safeMemberPath(prefix ? `${prefix}/${shortName}` : shortName);\n const memberPath = type === \"x\" || type === \"g\"\n ? headerPath\n : safeMemberPath(pendingPaxPath ?? headerPath);\n if (type !== \"x\" && type !== \"g\") pendingPaxPath = undefined;\n const segments = memberPath.split(\"/\").filter(Boolean);\n const name = segments.at(-1)?.toLowerCase();\n const metadataOnly = name === \"training-metrics.json\"\n || name === \"trainer_state.json\"\n || name === \"training_args.bin\"\n || name === \"config.json\"\n || name === \"generation_config.json\"\n || name === \"adapter_config.json\"\n || name === \"readme.md\"\n || name?.startsWith(\"tokenizer\")\n || name?.startsWith(\"special_tokens\")\n || name?.startsWith(\"added_tokens\")\n || name === \"vocab.json\"\n || name === \"merges.txt\";\n const recognizedPayload = Boolean(name)\n && name !== \"training_args.bin\"\n && (\n name!.endsWith(\".safetensors\")\n || name!.endsWith(\".bin\")\n );\n const adapterWeight = name === \"adapter_model.safetensors\" || name === \"adapter_model.bin\";\n const fullModelWeight = Boolean(name)\n && ((name!.endsWith(\".safetensors\") && !name!.startsWith(\"adapter_\"))\n || /^pytorch_model.*\\.bin$/.test(name!));\n if (size > 0 && name === \"adapter_config.json\" && (type === \"\\0\" || type === \"0\")) {\n adapterConfigEntries += 1;\n }\n if ((type === \"x\" || type === \"g\") && size > maxPaxBytes) {\n throw new Error(`PAX metadata exceeds 1 MiB in ${path}.`);\n }\n if (size > 0 && !metadataOnly && (type === \"\\0\" || type === \"0\")) payloadEntries += 1;\n if (size > 0 && recognizedPayload && (type === \"\\0\" || type === \"0\")) {\n recognizedPayloadEntries += 1;\n recognizedPayloadBytes += size;\n }\n if (size > 0 && adapterWeight && (type === \"\\0\" || type === \"0\")) {\n adapterWeightEntries += 1;\n adapterWeightBytes += size;\n }\n if (size > 0 && fullModelWeight && (type === \"\\0\" || type === \"0\")) {\n fullModelWeightEntries += 1;\n fullModelWeightBytes += size;\n }\n expandedBytes += size;\n if (expandedBytes > maxExpandedBytes) throw new Error(`Tar archive exceeds 20 GiB expanded size: ${path}.`);\n payloadBytes = size;\n paddingBytes = (512 - (size % 512)) % 512;\n paxType = type === \"x\" || type === \"g\" ? type : null;\n paxChunks = [];\n entries += 1;\n if (entries > maxEntries) throw new Error(`Tar archive exceeds ${maxEntries} members: ${path}.`);\n }\n }\n if (payloadBytes !== 0 || paddingBytes !== 0 || paxType || buffered.some((byte) => byte !== 0)) {\n throw new Error(`Truncated tar archive: ${path}.`);\n }\n if (pendingPaxPath) throw new Error(`PAX path override has no following member in ${path}.`);\n if (!ended) throw new Error(`Tar archive is missing its end marker: ${path}.`);\n if (entries === 0) throw new Error(`Empty tar archive: ${path}.`);\n if (payloadEntries === 0) throw new Error(`Tar archive contains no model payload files: ${path}.`);\n return {\n entries,\n payload_entries: payloadEntries,\n recognized_payload_entries: recognizedPayloadEntries,\n recognized_payload_bytes: recognizedPayloadBytes,\n adapter_weight_entries: adapterWeightEntries,\n adapter_weight_bytes: adapterWeightBytes,\n full_model_weight_entries: fullModelWeightEntries,\n full_model_weight_bytes: fullModelWeightBytes,\n adapter_config_entries: adapterConfigEntries,\n expanded_bytes: expandedBytes,\n };\n}\n\nexport async function assertArtifactManifest(\n manifestPath: string,\n options: {\n requiredPaths?: string[];\n allowUnexpected?: boolean;\n scopeToRequired?: boolean;\n verifyModel?: boolean;\n } = {},\n): Promise<ArtifactManifestVerification> {\n const result = await verifyArtifactManifest(manifestPath, options);\n if (!result.valid) {\n const details = [\n result.missing.length ? `missing=${result.missing.join(\",\")}` : \"\",\n result.changed.length ? `changed=${result.changed.join(\",\")}` : \"\",\n result.unexpected.length ? `unexpected=${result.unexpected.join(\",\")}` : \"\",\n ].filter(Boolean).join(\" \");\n throw new Error(`Artifact integrity verification failed${details ? `: ${details}` : \".\"}`);\n }\n return result;\n}\n","/**\n * Typed decision checkpoints the bundled `training/decision` runtime can\n * evaluate and fine-tune. A decision model answers one typed question about an\n * input (choice, yes/no or ordinal score) in a single encoder forward pass and\n * returns a probability per option instead of generating text.\n *\n * Each entry is pinned to a reviewed Hugging Face commit; add a model only with\n * its own end-to-end fine-tune and evaluation run.\n */\nexport interface DecisionModel {\n id: string;\n family: \"laya\";\n revision: string;\n parameters: string;\n license: string;\n defaultLearningRate: number;\n defaultBatchSize: number;\n defaultEpochs: number;\n}\n\n/** Laya 0.3.22 `PINNED_REVISIONS` entry for the English checkpoint. */\nexport const LAYA_REVISION = \"55cf4c4ebb4ebe31b2550e8bdf3bd21b99753851\";\n\nexport const DECISION_MODELS: DecisionModel[] = [\n {\n id: \"convaiinnovations/laya\",\n family: \"laya\",\n revision: LAYA_REVISION,\n parameters: \"421M (ModernBERT-large encoder + typed decision head)\",\n license: \"Apache-2.0\",\n defaultLearningRate: 0.00002,\n defaultBatchSize: 8,\n defaultEpochs: 3,\n },\n];\n\nexport const DEFAULT_DECISION_MODEL = DECISION_MODELS[0]!.id;\n\nexport function resolveDecisionModel(modelId: string): DecisionModel {\n const normalized = modelId.trim().toLowerCase();\n const model = DECISION_MODELS.find((candidate) => candidate.id.toLowerCase() === normalized);\n if (!model) {\n throw new Error(\n `Unsupported decision model \"${modelId}\". Supported decision models: ${DECISION_MODELS.map((item) => item.id).join(\", \")}`,\n );\n }\n return model;\n}\n\nexport function isDecisionModel(modelId: string): boolean {\n return DECISION_MODELS.some((candidate) => candidate.id.toLowerCase() === modelId.trim().toLowerCase());\n}\n\nexport function canonicalizeDecisionModel(modelId: string): string {\n return resolveDecisionModel(modelId).id;\n}\n","import { createHash } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { constants, readFileSync, type WriteStream } from \"node:fs\";\nimport { mkdir, open } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { pythonEnvironmentPath } from \"../paths.js\";\nimport { forwardStreamLines, reportInBackground, type LocalRunReporter } from \"./run-reporter.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\nimport { parseProgressLine } from \"./progress-bar.js\";\n\nconst packageRoot = localRuntimePackageRoot(import.meta.url);\nconst bundledProject = join(packageRoot, \"training/adapter\");\nconst bundledRuntimeHash = (() => {\n const hash = createHash(\"sha256\");\n for (const name of [\"pyproject.toml\", \"uv.lock\"]) {\n hash.update(readFileSync(join(bundledProject, name)));\n }\n return hash.digest(\"hex\").slice(0, 20);\n})();\nexport const BUNDLED_PYTHON_ENVIRONMENT = pythonEnvironmentPath(\"uv\", bundledRuntimeHash);\ntype BundledPythonEntrypoint =\n | \"train.py\"\n | \"evaluate.py\"\n | \"prefetch.py\"\n | \"prefetch_dataset.py\"\n | \"serve.py\"\n | \"-c\";\n\nconst foundationProject = join(packageRoot, \"training/foundation\");\nconst foundationRuntimeHash = (() => {\n const hash = createHash(\"sha256\");\n for (const name of [\"pyproject.toml\", \"uv.lock\"]) {\n hash.update(readFileSync(join(foundationProject, name)));\n }\n return hash.digest(\"hex\").slice(0, 20);\n})();\nexport const FOUNDATION_PYTHON_ENVIRONMENT = pythonEnvironmentPath(\"uv-foundation\", foundationRuntimeHash);\nexport type FoundationPythonEntrypoint =\n | \"train_tokenizer.py\"\n | \"pretrain.py\"\n | \"finetune.py\"\n | \"evaluate.py\"\n | \"rl.py\"\n | \"-c\";\n\nconst decisionProject = join(packageRoot, \"training/decision\");\nconst decisionRuntimeHash = (() => {\n const hash = createHash(\"sha256\");\n for (const name of [\"pyproject.toml\", \"uv.lock\"]) {\n hash.update(readFileSync(join(decisionProject, name)));\n }\n return hash.digest(\"hex\").slice(0, 20);\n})();\nexport const DECISION_PYTHON_ENVIRONMENT = pythonEnvironmentPath(\"uv-decision\", decisionRuntimeHash);\nexport type DecisionPythonEntrypoint = \"train.py\" | \"evaluate.py\" | \"-c\";\n\n/** Build a command for the locked typed decision-model runtime. */\nexport function buildDecisionPythonCommand(\n entrypoint: DecisionPythonEntrypoint,\n args: string[] = [],\n): { command: \"uv\"; commandArgs: string[]; displayCommand: string[] } {\n const commandArgs = [\n \"run\",\n \"--frozen\",\n \"--quiet\",\n \"--project\",\n decisionProject,\n \"python\",\n entrypoint === \"-c\" ? entrypoint : join(decisionProject, \"src\", entrypoint),\n ...args,\n ];\n return { command: \"uv\", commandArgs, displayCommand: [\"uv\", ...commandArgs] };\n}\n\n/** Keep the decision virtualenv outside a possibly read-only npm install. */\nexport function withDecisionPythonEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n return { ...env, UV_PROJECT_ENVIRONMENT: DECISION_PYTHON_ENVIRONMENT };\n}\n\n/** Build a command for the locked adapter Python runtime bundled with TT. */\nexport function buildBundledPythonCommand(\n entrypoint: BundledPythonEntrypoint,\n args: string[] = [],\n): { command: \"uv\"; commandArgs: string[]; displayCommand: string[] } {\n const target = entrypoint === \"-c\"\n ? entrypoint\n : join(bundledProject, \"src\", entrypoint);\n const commandArgs = [\n \"run\",\n \"--frozen\",\n \"--quiet\",\n \"--project\",\n bundledProject,\n \"python\",\n target,\n ...args,\n ];\n return {\n command: \"uv\",\n commandArgs,\n displayCommand: [\"uv\", ...commandArgs],\n };\n}\n\n/** Keep uv's mutable virtualenv outside a possibly read-only npm install. */\nexport function withBundledPythonEnvironment(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n return {\n ...env,\n UV_PROJECT_ENVIRONMENT: BUNDLED_PYTHON_ENVIRONMENT,\n };\n}\n\n/** Build a command for the locked from-scratch foundation runtime. */\nexport function buildFoundationPythonCommand(\n entrypoint: FoundationPythonEntrypoint,\n args: string[] = [],\n): { command: \"uv\"; commandArgs: string[]; displayCommand: string[] } {\n const target = entrypoint === \"-c\"\n ? entrypoint\n : join(foundationProject, \"src\", entrypoint);\n const commandArgs = [\n \"run\",\n \"--frozen\",\n \"--quiet\",\n \"--project\",\n foundationProject,\n \"python\",\n target,\n ...args,\n ];\n return {\n command: \"uv\",\n commandArgs,\n displayCommand: [\"uv\", ...commandArgs],\n };\n}\n\n/** Keep the foundation virtualenv outside a possibly read-only npm install. */\nexport function withFoundationPythonEnvironment(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n return {\n ...env,\n UV_PROJECT_ENVIRONMENT: FOUNDATION_PYTHON_ENVIRONMENT,\n };\n}\n\nexport interface LoggedProcessResult {\n exitCode: number;\n stderr: string;\n}\n\nexport class ProcessCancelledError extends Error {\n constructor(message = \"Process cancelled.\") {\n super(message);\n this.name = \"ProcessCancelledError\";\n }\n}\n\nasync function openProcessLog(\n path: string,\n exclusive: boolean,\n append: boolean,\n): Promise<WriteStream> {\n const flags = constants.O_WRONLY\n | constants.O_CREAT\n | (exclusive ? constants.O_EXCL : append ? constants.O_APPEND : constants.O_TRUNC)\n | (process.platform === \"win32\" ? 0 : constants.O_NOFOLLOW);\n const handle = await open(path, flags, 0o600);\n try {\n return handle.createWriteStream({ autoClose: true });\n } catch (error) {\n await handle.close();\n throw error;\n }\n}\n\nexport async function runLoggedProcess(args: {\n command: string;\n commandArgs: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n logPath?: string;\n timeoutMs?: number;\n timeoutMessage?: string;\n reporter?: LocalRunReporter;\n stage: string;\n onLine?: (line: string, stream: \"stdout\" | \"stderr\") => void;\n shouldCancel?: () => boolean | Promise<boolean>;\n cancelPollMs?: number;\n terminateProcessGroupOnExit?: boolean;\n exclusiveLog?: boolean;\n appendLog?: boolean;\n shutdownGraceMs?: number;\n}): Promise<LoggedProcessResult> {\n if (args.logPath) await mkdir(dirname(args.logPath), { recursive: true });\n const logStream = args.logPath\n ? await openProcessLog(args.logPath, args.exclusiveLog ?? false, args.appendLog ?? false)\n : null;\n let stderr = \"\";\n\n try {\n const exitCode = await new Promise<number>((resolvePromise, reject) => {\n const child = spawn(args.command, args.commandArgs, {\n cwd: args.cwd ? resolve(args.cwd) : process.cwd(),\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: args.env ?? process.env,\n detached: process.platform !== \"win32\",\n });\n let timedOut = false;\n let cancelled = false;\n let cancellationError: unknown;\n let cancellationCheckRunning = false;\n let forceKillTimer: NodeJS.Timeout | null = null;\n const killProcessGroup = (signal: NodeJS.Signals) => {\n if (child.pid && process.platform !== \"win32\") {\n try {\n process.kill(-child.pid, signal);\n return;\n } catch {\n // The child may have exited between the check and signal.\n }\n }\n child.kill(signal);\n };\n const requestStop = (signal: NodeJS.Signals = \"SIGTERM\") => {\n killProcessGroup(signal);\n if (!forceKillTimer) {\n forceKillTimer = setTimeout(() => killProcessGroup(\"SIGKILL\"), args.shutdownGraceMs ?? 5_000);\n forceKillTimer.unref();\n }\n };\n const onSigint = () => {\n cancelled = true;\n requestStop(\"SIGINT\");\n };\n const onSigterm = () => {\n cancelled = true;\n requestStop(\"SIGTERM\");\n };\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n const timer = args.timeoutMs\n ? setTimeout(() => {\n timedOut = true;\n requestStop();\n }, args.timeoutMs)\n : null;\n const cancellationTimer = args.shouldCancel\n ? setInterval(() => {\n if (cancellationCheckRunning || cancelled) return;\n cancellationCheckRunning = true;\n Promise.resolve(args.shouldCancel?.())\n .then((requested) => {\n if (!requested || cancelled) return;\n cancelled = true;\n requestStop();\n })\n .catch((error) => {\n cancellationError = error;\n requestStop();\n })\n .finally(() => { cancellationCheckRunning = false; });\n }, args.cancelPollMs ?? 250)\n : null;\n cancellationTimer?.unref();\n\n const clearProcessTimers = () => {\n if (timer) clearTimeout(timer);\n if (cancellationTimer) clearInterval(cancellationTimer);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n };\n\n if (logStream) {\n child.stdout.pipe(logStream, { end: false });\n child.stderr.pipe(logStream, { end: false });\n }\n\n forwardStreamLines(child.stdout, (line) => {\n const progress = parseProgressLine(line);\n if (progress) {\n // Structured progress drives a bar; it stays in the log file only.\n reportInBackground(() => args.reporter?.onProgress?.(progress));\n return;\n }\n args.onLine?.(line, \"stdout\");\n if (args.reporter?.verbose) {\n reportInBackground(() => args.reporter?.onLog?.({ stage: args.stage, stream: \"stdout\", message: line }));\n }\n });\n forwardStreamLines(child.stderr, (line) => {\n stderr += `${line}\\n`;\n args.onLine?.(line, \"stderr\");\n if (args.reporter?.verbose) {\n reportInBackground(() => args.reporter?.onLog?.({ stage: args.stage, stream: \"stderr\", message: line }));\n }\n });\n child.on(\"error\", (error) => {\n clearProcessTimers();\n reject(timedOut\n ? new Error(args.timeoutMessage ?? `${args.command} timed out after ${args.timeoutMs}ms`)\n : error);\n });\n child.on(\"close\", (code) => {\n if (\n timedOut\n || cancelled\n || cancellationError\n || args.terminateProcessGroupOnExit\n ) {\n // The direct child can close its stdio while descendants remain in\n // the process group and ignore SIGTERM. Complete teardown before\n // cancelling the force-kill timer.\n killProcessGroup(\"SIGKILL\");\n }\n clearProcessTimers();\n if (timedOut) {\n reject(new Error(args.timeoutMessage ?? `${args.command} timed out after ${args.timeoutMs}ms`));\n return;\n }\n if (cancellationError) {\n reject(cancellationError);\n return;\n }\n if (cancelled) {\n reject(new ProcessCancelledError(`${args.stage} was cancelled.`));\n return;\n }\n resolvePromise(code ?? 1);\n });\n });\n return { exitCode, stderr };\n } finally {\n if (logStream) {\n await new Promise<void>((resolveEnd) => {\n logStream.end(resolveEnd);\n });\n }\n }\n}\n","import type { TransferProgress } from \"./progress-bar.js\";\n\nexport interface LocalRunProgressLog {\n stage: string;\n stream?: \"stdout\" | \"stderr\" | \"info\";\n message: string;\n}\n\nexport interface LocalRunProgressEvent {\n stage: string;\n status: string;\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport interface LocalRunReporter {\n verbose?: boolean;\n onEvent?(event: LocalRunProgressEvent): void | Promise<void>;\n onLog?(log: LocalRunProgressLog): void | Promise<void>;\n /** Byte-level transfer progress, e.g. Hugging Face model or dataset downloads. */\n onProgress?(progress: TransferProgress): void | Promise<void>;\n}\n\n/** Optional high-volume reporting must never crash or orphan the workload. */\nexport function reportInBackground(action: () => void | Promise<void>): void {\n try {\n void Promise.resolve(action()).catch(() => undefined);\n } catch {\n // Progress/log reporting is best effort. Cancellation is enforced through\n // the process runner's explicit polling callback.\n }\n}\n\n/** Keep long checksum passes visible even when no bytes need downloading. */\nexport async function withProgressHeartbeat<T>(\n reporter: LocalRunReporter | undefined,\n event: LocalRunProgressEvent,\n run: () => Promise<T>,\n): Promise<T> {\n if (!reporter?.onEvent) return await run();\n reportInBackground(() => reporter.onEvent!(event));\n const timer = setInterval(() => {\n reportInBackground(() => reporter.onEvent!({\n stage: event.stage, status: event.status, message: `Still working: ${event.message}`,\n }));\n }, 15_000);\n timer.unref();\n try {\n return await run();\n } finally {\n clearInterval(timer);\n }\n}\n\nexport function sanitizeLogLine(line: string): string {\n return line\n .replace(/(Bearer\\s+)[A-Za-z0-9._~+/=-]+/gi, \"$1[redacted]\")\n .replace(/((?:api[_-]?key|token|secret|password)=)[^\\s]+/gi, \"$1[redacted]\");\n}\n\nexport function forwardStreamLines(\n stream: NodeJS.ReadableStream,\n onLine: (line: string) => void,\n): void {\n let buffered = \"\";\n stream.setEncoding(\"utf8\");\n stream.on(\"data\", (chunk: string) => {\n buffered += chunk;\n const lines = buffered.split(/\\r\\n|\\n|\\r/);\n buffered = lines.pop() ?? \"\";\n for (const line of lines) {\n if (line.trim()) onLine(sanitizeLogLine(line));\n }\n });\n stream.on(\"end\", () => {\n if (buffered.trim()) onLine(sanitizeLogLine(buffered));\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/** Resolve the unified CLI package root from source tests or bundled dist files. */\nexport function localRuntimePackageRoot(moduleUrl: string): string {\n const moduleDirectory = dirname(fileURLToPath(moduleUrl));\n const candidates = [\n dirname(moduleDirectory),\n dirname(dirname(moduleDirectory)),\n ];\n const root = candidates.find((candidate) =>\n existsSync(resolve(candidate, \"package.json\"))\n && existsSync(resolve(candidate, \"training/adapter\")),\n );\n if (!root) {\n throw new Error(\"Unable to locate the bundled Tuned Tensor local runtime assets.\");\n }\n return root;\n}\n","/**\n * Byte-level progress for long Hugging Face downloads.\n *\n * Python downloaders print `@@tt-progress {json}` lines; the process runner\n * turns them into {@link TransferProgress} events and a reporter renders them.\n * On a terminal the bar redraws in place; otherwise (CI, logs, the TT shell) it\n * prints a line every 10% or 30 seconds so captured output stays readable.\n */\n\nimport type { LocalRunReporter } from \"./run-reporter.js\";\n\nexport const PROGRESS_PREFIX = \"@@tt-progress \";\n\nexport interface TransferProgress {\n label: string;\n phase: string;\n completed_bytes: number;\n total_bytes: number;\n files_completed: number;\n files_total: number;\n}\n\nfunction nonNegativeInteger(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : null;\n}\n\nexport function parseProgressLine(line: string): TransferProgress | null {\n const start = line.indexOf(PROGRESS_PREFIX);\n if (start !== 0) return null;\n let value: unknown;\n try {\n value = JSON.parse(line.slice(PROGRESS_PREFIX.length));\n } catch {\n return null;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n const completed = nonNegativeInteger(record.completed_bytes);\n const total = nonNegativeInteger(record.total_bytes);\n if (completed === null || total === null) return null;\n return {\n label: typeof record.label === \"string\" ? record.label : \"download\",\n phase: typeof record.phase === \"string\" ? record.phase : \"download\",\n completed_bytes: completed,\n total_bytes: total,\n files_completed: nonNegativeInteger(record.files_completed) ?? 0,\n files_total: nonNegativeInteger(record.files_total) ?? 0,\n };\n}\n\nexport function formatBytes(bytes: number): string {\n const units = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\"];\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit += 1;\n }\n return `${unit === 0 ? value.toFixed(0) : value.toFixed(value >= 100 ? 0 : value >= 10 ? 1 : 2)} ${units[unit]}`;\n}\n\nexport function formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return \"--\";\n const whole = Math.round(seconds);\n const hours = Math.floor(whole / 3600);\n const minutes = Math.floor((whole % 3600) / 60);\n const rest = whole % 60;\n if (hours > 0) return `${hours}h ${String(minutes).padStart(2, \"0\")}m`;\n if (minutes > 0) return `${minutes}m ${String(rest).padStart(2, \"0\")}s`;\n return `${rest}s`;\n}\n\ninterface Sample {\n at: number;\n bytes: number;\n}\n\n/** Throughput over a sliding window so the ETA follows Wi-Fi speed changes. */\nexport class RateTracker {\n private samples: Sample[] = [];\n\n constructor(private readonly windowMs = 15_000) {}\n\n add(at: number, bytes: number): void {\n const last = this.samples.at(-1);\n // A retry can restart a partially written file; restart the window.\n if (last && bytes < last.bytes) this.samples = [];\n this.samples.push({ at, bytes });\n while (this.samples.length > 2 && at - this.samples[0]!.at > this.windowMs) this.samples.shift();\n }\n\n bytesPerSecond(): number | null {\n const first = this.samples[0];\n const last = this.samples.at(-1);\n if (!first || !last || last.at - first.at < 500) return null;\n return (last.bytes - first.bytes) / ((last.at - first.at) / 1000);\n }\n}\n\n/**\n * One progress line. With `columns`, a bar fills the space the text leaves\n * (10 to 30 cells) and is dropped when the terminal is too narrow.\n */\nexport function formatProgressLine(\n progress: TransferProgress,\n rate: number | null,\n columns?: number,\n): string {\n const total = progress.total_bytes;\n const fraction = total > 0 ? Math.min(1, progress.completed_bytes / total) : 1;\n // `drop` orders what a narrow terminal loses first; percent and size stay.\n const fields: Array<{ text: string; drop?: number }> = [\n { text: `${(fraction * 100).toFixed(1).padStart(5)}%` },\n { text: `${formatBytes(progress.completed_bytes)} / ${formatBytes(total)}` },\n ];\n const done = progress.completed_bytes >= total;\n if (!done && rate !== null && rate > 0) {\n fields.push(\n { text: `${formatBytes(rate)}/s`, drop: 2 },\n { text: `ETA ${formatDuration((total - progress.completed_bytes) / rate)}`, drop: 3 },\n );\n }\n if (progress.files_total > 0) fields.push({ text: `${progress.files_completed}/${progress.files_total} files`, drop: 1 });\n const prefix = `[tt] ${progress.label}: `;\n const join = () => fields.map((field) => field.text).join(\" \");\n if (columns === undefined) return `${prefix}${join()}`;\n for (const rank of [1, 2, 3]) {\n if (prefix.length + join().length <= columns - 1) break;\n const index = fields.findIndex((field) => field.drop === rank);\n if (index !== -1) fields.splice(index, 1);\n }\n const text = join();\n const barWidth = Math.min(30, columns - 1 - prefix.length - text.length - 3);\n if (barWidth < 10) return `${prefix}${text}`.slice(0, Math.max(0, columns - 1));\n const filled = Math.round(fraction * barWidth);\n return `${prefix}[${\"#\".repeat(filled)}${\"-\".repeat(barWidth - filled)}] ${text}`;\n}\n\nexport interface ProgressRenderer {\n update(progress: TransferProgress): void;\n /** Clear an in-place bar before other output is written. */\n interrupt(): void;\n}\n\nexport function createProgressRenderer(options: {\n write: (text: string) => void;\n tty: boolean;\n columns?: number;\n now?: () => number;\n lineIntervalMs?: number;\n}): ProgressRenderer {\n const now = options.now ?? (() => Date.now());\n const rates = new Map<string, RateTracker>();\n const lastLine = new Map<string, { at: number; decile: number }>();\n const completed = new Set<string>();\n let drawn = false;\n let lastDraw = Number.NEGATIVE_INFINITY;\n\n const finished = (progress: TransferProgress) =>\n progress.phase === \"downloaded\" || (progress.total_bytes > 0 && progress.completed_bytes >= progress.total_bytes);\n\n return {\n update(progress) {\n const at = now();\n const tracker = rates.get(progress.label) ?? new RateTracker();\n rates.set(progress.label, tracker);\n tracker.add(at, progress.completed_bytes);\n const done = finished(progress);\n if (options.tty) {\n // The downloader reports completion more than once; print it once.\n if (done && completed.has(progress.label)) return;\n if (!done) completed.delete(progress.label);\n if (!done && at - lastDraw < 100) return;\n lastDraw = at;\n const line = formatProgressLine(progress, tracker.bytesPerSecond(), Math.max(40, options.columns ?? 80));\n options.write(`\\r\\x1b[2K${line}${done ? \"\\n\" : \"\"}`);\n drawn = !done;\n if (done) {\n rates.delete(progress.label);\n completed.add(progress.label);\n }\n return;\n }\n const fraction = progress.total_bytes > 0 ? progress.completed_bytes / progress.total_bytes : 1;\n const decile = Math.floor(fraction * 10);\n const previous = lastLine.get(progress.label);\n const interval = options.lineIntervalMs ?? 30_000;\n if (previous && !done && decile <= previous.decile && at - previous.at < interval) return;\n if (previous && done && previous.decile === 10) return;\n lastLine.set(progress.label, { at, decile: done ? 10 : decile });\n options.write(`${formatProgressLine(progress, tracker.bytesPerSecond())}\\n`);\n },\n interrupt() {\n if (!drawn) return;\n options.write(\"\\r\\x1b[2K\");\n drawn = false;\n },\n };\n}\n\n/** Whether stderr should get an in-place bar; the parent `tt` sets the hint for its child. */\nexport function progressTty(env: NodeJS.ProcessEnv = process.env, stream: { isTTY?: boolean } = process.stderr): boolean {\n if (env.TT_PROGRESS_TTY === \"0\") return false;\n return env.TT_PROGRESS_TTY === \"1\" || Boolean(stream.isTTY);\n}\n\nexport function progressColumns(env: NodeJS.ProcessEnv = process.env, stream: { columns?: number } = process.stderr): number | undefined {\n const hinted = Number(env.TT_PROGRESS_COLUMNS);\n if (Number.isInteger(hinted) && hinted > 0) return hinted;\n return stream.columns;\n}\n\n/** Minimal stderr reporter for download steps run from the main `tt` process. */\nexport function createTransferReporter(stream: NodeJS.WriteStream = process.stderr): LocalRunReporter {\n const progress = createProgressRenderer({\n write: (text) => stream.write(text),\n tty: progressTty(process.env, stream),\n columns: progressColumns(process.env, stream),\n });\n return {\n onEvent(event) {\n progress.interrupt();\n stream.write(`[tt] ${event.stage}: ${event.message}\\n`);\n },\n onLog(log) {\n progress.interrupt();\n stream.write(`[tt] ${log.stage}: ${log.message}\\n`);\n },\n onProgress(update) {\n progress.update(update);\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { readFile, readdir, realpath, stat } from \"node:fs/promises\";\nimport { basename, dirname, join, relative, sep } from \"node:path\";\nimport { getTunedTensorHome } from \"../paths.js\";\nimport { writeJsonAtomic } from \"./artifacts.js\";\nimport type { FineTuneRunRequest, LocalRunnerConfig } from \"./contracts.js\";\nimport { withHuggingFaceCacheEnvironment } from \"./huggingface-cache.js\";\nimport { resolveRequestedBaseModelRevision, resolveTrainingModel } from \"./model-registry.js\";\nimport type { LocalRunReporter } from \"./run-reporter.js\";\n\n/**\n * Downloaded Hugging Face assets.\n *\n * Files stay in the Hugging Face cache, which is already content-addressed.\n * TT adds two small records on top of it:\n *\n * - a manifest per download under `~/.tuned-tensor/assets/`, so people can find\n * what they downloaded and where it lives (`tt assets list|path|verify`);\n * - `tunedtensor.lock.json` beside a spec, which pins the exact revision and\n * file digests a project trains on. Runs refuse to use anything else.\n *\n * A digest is the file's Hugging Face content address: `sha256:<hex>` for\n * LFS files and `git-sha1:<hex>` for small files stored in git.\n */\nexport type AssetKind = \"dataset\" | \"model\";\n\nexport interface AssetSnapshot {\n repo: string;\n revision: string;\n files: Record<string, string>;\n}\n\nexport interface AssetManifest extends AssetSnapshot {\n version: 1;\n kind: AssetKind;\n fetched_at: string;\n snapshot_path: string;\n size_bytes: number;\n}\n\nexport interface SpecLock {\n version: 1;\n dataset?: AssetSnapshot;\n base_model?: AssetSnapshot;\n}\n\nexport type LockKey = keyof Omit<SpecLock, \"version\">;\n\nconst COMMIT_SHA = /^[0-9a-f]{40}$/;\n\nexport class SpecLockMismatchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SpecLockMismatchError\";\n }\n}\n\nexport function assetsRoot(env: NodeJS.ProcessEnv = process.env): string {\n return join(getTunedTensorHome(env), \"assets\");\n}\n\n/** `<hub>/datasets--org--name/snapshots/<revision>`, as huggingface_hub lays it out. */\nexport function snapshotDirectory(hubCache: string, kind: AssetKind, repo: string, revision: string): string {\n return join(hubCache, `${kind}s--${repo.replaceAll(\"/\", \"--\")}`, \"snapshots\", revision);\n}\n\nasync function contentDigest(path: string, algorithm: \"sha256\" | \"git-sha1\"): Promise<string> {\n const size = (await stat(path)).size;\n const hash = algorithm === \"sha256\" ? createHash(\"sha256\") : createHash(\"sha1\").update(`blob ${size}\\0`);\n // Match the bounded buffer used by model verification for large weight files.\n for await (const chunk of createReadStream(path, { highWaterMark: 8 * 1024 * 1024 })) hash.update(chunk);\n return `${algorithm}:${hash.digest(\"hex\")}`;\n}\n\nasync function listFiles(root: string, directory = root): Promise<string[]> {\n const files: string[] = [];\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const child = join(directory, entry.name);\n if (entry.isDirectory()) files.push(...await listFiles(root, child));\n else files.push(relative(root, child).split(sep).join(\"/\"));\n }\n return files.sort();\n}\n\n/**\n * Hash the actual snapshot bytes. A blob filename selects the digest format,\n * but cannot prove that the cached bytes have remained intact.\n */\nexport async function snapshotDigests(\n snapshot: string,\n paths?: readonly string[],\n): Promise<{ files: Record<string, string>; sizeBytes: number }> {\n const files: Record<string, string> = {};\n let sizeBytes = 0;\n for (const path of paths ?? await listFiles(snapshot)) {\n const local = join(snapshot, ...path.split(\"/\"));\n const target = await realpath(local);\n sizeBytes += (await stat(target)).size;\n const blob = target !== local && basename(dirname(target)) === \"blobs\" ? basename(target).toLowerCase() : \"\";\n files[path] = await contentDigest(target, /^[0-9a-f]{40}$/.test(blob) ? \"git-sha1\" : \"sha256\");\n if (/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(blob) && files[path].split(\":\")[1] !== blob) {\n throw new SpecLockMismatchError(`Cached file ${path} failed its checksum. Remove the corrupt blob ${target} and prefetch it again.`);\n }\n }\n return { files, sizeBytes };\n}\n\nfunction manifestPath(kind: AssetKind, repo: string, revision: string, env?: NodeJS.ProcessEnv): string {\n return join(assetsRoot(env), `${kind}s`, repo.replaceAll(\"/\", \"--\"), revision, \"manifest.json\");\n}\n\n/** Record a completed download so people (and TT) can find and verify it later. */\nexport async function recordAssetDownload(args: {\n kind: AssetKind;\n repo: string;\n revision: string;\n snapshotPath: string;\n paths?: readonly string[];\n env?: NodeJS.ProcessEnv;\n}): Promise<{ manifest: AssetManifest; path: string }> {\n const path = manifestPath(args.kind, args.repo, args.revision, args.env);\n let paths = args.paths;\n if (paths) {\n // Dataset downloads fetch only the named split files; keep files that an\n // earlier download of the same revision already recorded.\n const previous = Object.keys((await readJsonIfPresent<AssetManifest>(path))?.files ?? {});\n const stillCached = await Promise.all(previous.map(async (file) =>\n await stat(join(args.snapshotPath, ...file.split(\"/\"))).then(() => file, () => null)));\n paths = [...new Set([...stillCached.filter((file): file is string => file !== null), ...paths])].sort();\n }\n const { files, sizeBytes } = await snapshotDigests(args.snapshotPath, paths);\n const manifest: AssetManifest = {\n version: 1,\n kind: args.kind,\n repo: args.repo,\n revision: args.revision,\n fetched_at: new Date().toISOString(),\n snapshot_path: args.snapshotPath,\n size_bytes: sizeBytes,\n files,\n };\n await writeJsonAtomic(path, manifest);\n return { manifest, path };\n}\n\nasync function readJsonIfPresent<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw error;\n }\n}\n\nexport async function listAssets(env?: NodeJS.ProcessEnv): Promise<Array<AssetManifest & { manifest_path: string }>> {\n const root = assetsRoot(env);\n const found: Array<AssetManifest & { manifest_path: string }> = [];\n for (const kind of [\"datasets\", \"models\"]) {\n const repos = await readdir(join(root, kind)).catch(() => []);\n for (const repo of repos) {\n for (const revision of await readdir(join(root, kind, repo)).catch(() => [])) {\n const path = join(root, kind, repo, revision, \"manifest.json\");\n const manifest = await readJsonIfPresent<AssetManifest>(path);\n if (manifest) found.push({ ...manifest, manifest_path: path });\n }\n }\n }\n return found.sort((a, b) => b.fetched_at.localeCompare(a.fetched_at));\n}\n\n/** Find a download by `org/name` or `org/name@revision`; newest first. */\nexport async function findAsset(reference: string, env?: NodeJS.ProcessEnv) {\n const [repo, revision] = reference.split(\"@\");\n const match = (await listAssets(env)).find((asset) =>\n asset.repo === repo && (!revision || asset.revision.startsWith(revision.toLowerCase())));\n if (!match) throw new Error(`No downloaded asset matches ${reference}. Run \\`tt assets list\\` to see downloads.`);\n return match;\n}\n\n/** Re-hash every recorded file and compare it with the manifest. */\nexport async function verifyAsset(manifest: AssetManifest): Promise<{ ok: boolean; problems: string[] }> {\n const problems: string[] = [];\n for (const [path, expected] of Object.entries(manifest.files)) {\n const local = join(manifest.snapshot_path, ...path.split(\"/\"));\n const target = await realpath(local).catch(() => null);\n if (!target) {\n problems.push(`${path}: missing from ${manifest.snapshot_path}`);\n continue;\n }\n const algorithm = expected.startsWith(\"git-sha1:\") ? \"git-sha1\" : \"sha256\";\n if (await contentDigest(target, algorithm) !== expected) problems.push(`${path}: content does not match ${expected}`);\n }\n return { ok: problems.length === 0, problems };\n}\n\n/**\n * `tunedtensor.json` locks to `tunedtensor.lock.json` beside it. Temporary\n * copies that `tt` and the agent write beside a spec\n * (`.tunedtensor.json.tt-local-….json`) share the original spec's lock.\n */\nexport function specLockPath(specPath: string): string {\n const name = basename(specPath).replace(/^\\.(.+)\\.tt-(?:local|agent)-[^/\\\\]*\\.json$/, \"$1\");\n return join(dirname(specPath), `${name.replace(/\\.json$/i, \"\")}.lock.json`);\n}\n\nexport async function readSpecLock(specPath: string): Promise<SpecLock | undefined> {\n const path = specLockPath(specPath);\n const lock = await readJsonIfPresent<SpecLock>(path);\n if (lock && lock.version !== 1) throw new Error(`${path} has unsupported version ${String(lock.version)}.`);\n return lock;\n}\n\nexport async function writeSpecLockEntry(specPath: string, key: LockKey, entry: AssetSnapshot): Promise<void> {\n const lock = await readSpecLock(specPath) ?? { version: 1 };\n await writeJsonAtomic(specLockPath(specPath), { ...lock, version: 1, [key]: sortedEntry(entry) });\n}\n\nfunction sortedEntry(entry: AssetSnapshot): AssetSnapshot {\n return {\n repo: entry.repo,\n revision: entry.revision,\n files: Object.fromEntries(Object.entries(entry.files).sort(([a], [b]) => a.localeCompare(b))),\n };\n}\n\nconst PREFETCH_COMMAND: Record<LockKey, string> = {\n dataset: \"tt datasets prefetch\",\n base_model: \"tt models prefetch\",\n};\n\n/**\n * Compare what a run is about to use with the spec's lock. A missing entry is\n * recorded (trust on first use, like `terraform init`); a different repo,\n * revision or file digest stops the run. Prefetch commands update the lock.\n */\nexport async function checkSpecLock(specPath: string, key: LockKey, actual: AssetSnapshot): Promise<\"recorded\" | \"matched\"> {\n const locked = (await readSpecLock(specPath))?.[key];\n if (!locked) {\n await writeSpecLockEntry(specPath, key, actual);\n return \"recorded\";\n }\n const lockFile = basename(specLockPath(specPath));\n const update = `If this change is intended, run \\`${PREFETCH_COMMAND[key]}\\` with this spec to update ${lockFile}.`;\n const label = key === \"dataset\" ? \"dataset\" : \"base model\";\n if (locked.repo !== actual.repo || locked.revision !== actual.revision) {\n throw new SpecLockMismatchError(\n `The spec's ${label} is ${actual.repo}@${actual.revision}, but ${lockFile} pins ${locked.repo}@${locked.revision}. ${update}`,\n );\n }\n if (key === \"base_model\") {\n for (const path of Object.keys(locked.files)) {\n if (actual.files[path] === undefined) {\n throw new SpecLockMismatchError(`base model file ${path} is missing from the cached snapshot. ${update}`);\n }\n }\n }\n for (const [path, digest] of Object.entries(actual.files)) {\n if (locked.files[path] === undefined) {\n throw new SpecLockMismatchError(`${label} file ${path} is not in ${lockFile}. ${update}`);\n }\n if (locked.files[path] !== digest) {\n throw new SpecLockMismatchError(\n `${label} file ${path} is ${digest}, but ${lockFile} expects ${locked.files[path]}. The cached file differs from the one this project was locked to. ${update}`,\n );\n }\n }\n return \"matched\";\n}\n\n/** The revision the lock pins for a repo, when it is a valid commit. */\nexport function lockedRevision(lock: SpecLock | undefined, key: LockKey, repo: string): string | undefined {\n const entry = lock?.[key];\n return entry?.repo === repo && COMMIT_SHA.test(entry.revision) ? entry.revision : undefined;\n}\n\n/** Use the lock's revision for a spec dataset that does not pin one itself. */\nexport function applySpecLock<T extends FineTuneRunRequest>(request: T, lock: SpecLock | undefined): T {\n const source = request.dataset_prebuilt?.huggingface;\n if (!source || source.revision) return request;\n const revision = lockedRevision(lock, \"dataset\", source.repo);\n if (!revision) return request;\n return { ...request, dataset_prebuilt: { ...request.dataset_prebuilt!, huggingface: { ...source, revision } } };\n}\n\n/**\n * Check a run's resolved Hugging Face dataset and base model against the\n * spec's lock, recording entries the lock does not have yet. Runs that load\n * the base model from paths.baseModel or a remote GPU host skip the model.\n */\nexport async function enforceSpecLock(args: {\n specPath: string;\n request: FineTuneRunRequest;\n config: LocalRunnerConfig;\n reporter?: LocalRunReporter;\n}): Promise<void> {\n if (args.config.dryRun) return;\n const dataset = args.request.dataset_source;\n if (dataset) {\n const paths = Object.values(dataset.files).flatMap((file) => file ? [file.path] : []);\n const { files } = await snapshotDigests(dataset.snapshot_path, paths);\n await checkSpecLock(args.specPath, \"dataset\", { repo: dataset.repo, revision: dataset.revision, files });\n }\n if (args.config.paths.baseModel || args.config.gpu) return;\n const model = resolveTrainingModel(args.request.spec_snapshot.base_model);\n const revision = resolveRequestedBaseModelRevision(model.id, args.request.hyperparameters.base_model_revision);\n if (!revision) return;\n const hubCache = withHuggingFaceCacheEnvironment(process.env, args.config.paths.modelCache).HF_HUB_CACHE!;\n const snapshot = snapshotDirectory(hubCache, \"model\", model.id, revision);\n if (!await stat(snapshot).then(() => true, () => false)) {\n if ((await readSpecLock(args.specPath))?.base_model) {\n throw new SpecLockMismatchError(\n `Base model ${model.id}@${revision} is not downloaded (${snapshot}). Run \\`tt models prefetch\\` with this spec first.`,\n );\n }\n // A first run must download and lock the model before training starts.\n const { prefetchBaseModel } = await import(\"./prefetch.js\");\n await prefetchBaseModel({ request: args.request, config: args.config, reporter: args.reporter });\n }\n const { files } = await snapshotDigests(snapshot);\n await checkSpecLock(args.specPath, \"base_model\", { repo: model.id, revision, files });\n}\n","import { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/**\n * The TT local runtime treats `paths.modelCache` as Hugging Face's `HF_HOME`. Model\n * snapshots therefore live below `<modelCache>/hub`, matching the default\n * layout used by huggingface_hub and Transformers.\n */\nexport interface HuggingFaceCacheLayout {\n hfHome: string;\n hubCache: string;\n}\n\n/**\n * Builds a deliberately small environment for bundled ML processes.\n * Unrelated shell credentials must not be inherited by training processes.\n */\nexport function minimalMachineLearningEnvironment(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const exact = new Set([\n \"PATH\", \"HOME\", \"USER\", \"LOGNAME\", \"SHELL\", \"TMPDIR\", \"TEMP\", \"TMP\",\n \"LANG\", \"LANGUAGE\", \"LD_LIBRARY_PATH\", \"DYLD_LIBRARY_PATH\", \"XDG_CACHE_HOME\",\n \"SSL_CERT_FILE\", \"REQUESTS_CA_BUNDLE\", \"CURL_CA_BUNDLE\",\n \"NO_PROXY\", \"no_proxy\",\n \"UV_CACHE_DIR\", \"UV_PYTHON\",\n \"HF_HOME\", \"HF_HUB_CACHE\", \"HUGGINGFACE_HUB_CACHE\", \"HF_ENDPOINT\",\n \"HF_TOKEN\",\n \"HF_HUB_OFFLINE\", \"HF_HUB_DISABLE_TELEMETRY\", \"TRANSFORMERS_OFFLINE\",\n \"HF_HUB_ENABLE_HF_TRANSFER\", \"HF_HUB_DOWNLOAD_TIMEOUT\", \"HF_HUB_ETAG_TIMEOUT\",\n \"TT_HF_DOWNLOAD_MAX_ATTEMPTS\", \"PYTHONUTF8\", \"PYTHONIOENCODING\",\n ]);\n const prefixes = [\n \"LC_\", \"CUDA_\", \"NVIDIA_\", \"NCCL_\", \"OMP_\", \"MKL_\", \"TORCH_\",\n \"PYTORCH_\", \"TOKENIZERS_\", \"HF_XET_\",\n ];\n const result = Object.fromEntries(Object.entries(env).filter(([key]) =>\n exact.has(key) || prefixes.some((prefix) => key.startsWith(prefix))\n ));\n // PyTorch 2.13 can route ordinary CUDA operations through optional Triton\n // JIT kernels. Triton's first-use helper compilation requires system Python\n // development headers, which are not part of a normal packaged TT\n // install. Prefer PyTorch's eager fallback unless the launching environment\n // explicitly opts back in with TORCH_DISABLE_NATIVE_JIT=0.\n result.TORCH_DISABLE_NATIVE_JIT ??= \"1\";\n return result;\n}\n\nexport function resolveHuggingFaceCacheLayout(modelCache: string): HuggingFaceCacheLayout {\n const hfHome = resolve(modelCache);\n return {\n hfHome,\n hubCache: join(hfHome, \"hub\"),\n };\n}\n\n/**\n * Returns a child-process environment in which current Hugging Face cache\n * variables agree and deprecated Transformers overrides are removed. Explicit\n * TT local configuration wins over inherited shell variables, avoiding a\n * second cache tree during prefetch, training, evaluation, or serving.\n */\nexport function withHuggingFaceCacheEnvironment(\n env: NodeJS.ProcessEnv,\n modelCache?: string,\n): NodeJS.ProcessEnv {\n const inheritedHub = env.HF_HUB_CACHE ?? env.HUGGINGFACE_HUB_CACHE;\n const canonicalHome = modelCache\n ?? env.HF_HOME\n ?? (inheritedHub ? dirname(resolve(inheritedHub)) : join(homedir(), \".cache\", \"huggingface\"));\n const layout = resolveHuggingFaceCacheLayout(canonicalHome);\n const result: NodeJS.ProcessEnv = {\n ...env,\n HF_HOME: layout.hfHome,\n HF_HUB_CACHE: layout.hubCache,\n HUGGINGFACE_HUB_CACHE: layout.hubCache,\n };\n // These deprecated Transformers variables override HF_HOME when inherited\n // and also emit warnings when present. Removing them lets Transformers use\n // the canonical HF_HUB_CACHE value above.\n delete result.TRANSFORMERS_CACHE;\n delete result.PYTORCH_TRANSFORMERS_CACHE;\n delete result.PYTORCH_PRETRAINED_BERT_CACHE;\n return result;\n}\n\n/**\n * Training, evaluation, and serving run only after prefetch has verified the\n * immutable snapshot. Keep those stages local even when the host has network.\n */\nexport function withOfflineHuggingFaceCacheEnvironment(\n env: NodeJS.ProcessEnv,\n modelCache?: string,\n): NodeJS.ProcessEnv {\n return {\n ...withHuggingFaceCacheEnvironment(env, modelCache),\n HF_HUB_OFFLINE: \"1\",\n TRANSFORMERS_OFFLINE: \"1\",\n };\n}\n"],"mappings":"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","names":["createHash","createReadStream","lstat","mkdir","readFile","readdir","realpath","stat","isAbsolute","join","relative","resolve","sep","lstat","readdir","isAbsolute","resolve","isAbsolute","join","resolve","join","manifestPath","resolve","resolve","isAbsolute","readdir","lstat","createHash","mkdir","open","dirname","join","resolve","existsSync","dirname","resolve","fileURLToPath","join","join","createHash","open","mkdir","dirname","resolve","createHash","createReadStream","readFile","readdir","realpath","stat","dirname","join","relative","sep","homedir","dirname","join","resolve","join","stat","createHash","createReadStream","readdir","relative","sep","realpath","dirname","readFile","files","prefetchBaseModel","stat","createHash","createReadStream","relative","sep","isAbsolute","join","realpath","lstat","resolve","readdir","metadata","readFile","mkdir"]}