@tuned-tensor/cli 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/local-runtime/artifacts.ts","../src/local-runtime/model-registry.ts","../src/local-runtime/contracts.ts","../src/local-runtime/local-project.ts","../src/local-runtime/dataset.ts","../src/local-runtime/run-reporter.ts","../src/local-runtime/package-root.ts","../src/local-runtime/store.ts","../src/local-runtime/prefetch.ts","../src/local-runtime/process-runner.ts","../src/local-runtime/huggingface-cache.ts","../src/local-runtime/general-regression.ts","../src/local-runtime/orchestrator.ts","../src/local-runtime/evaluation.ts","../src/local-runtime/process-training.ts"],"sourcesContent":["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\";\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 `file://${resolve(path)}`;\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 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","import { lstat, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { verifyTarGzipArchive } from \"./artifacts.js\";\n\nexport interface TrainingModel {\n id: string;\n family: string;\n defaultLearningRate: number;\n defaultPerDeviceBatchSize: number;\n defaultGradientAccumulationSteps: number;\n defaultLoraRank: number;\n defaultLoraAlpha: number;\n defaultLoraDropout: number;\n defaultMaxSeqLength: number;\n}\n\nexport const TRAINING_MODELS: TrainingModel[] = [\n {\n id: \"Qwen/Qwen3.5-2B\",\n family: \"qwen3_5\",\n defaultLearningRate: 0.00001,\n defaultPerDeviceBatchSize: 1,\n defaultGradientAccumulationSteps: 8,\n defaultLoraRank: 16,\n defaultLoraAlpha: 32,\n defaultLoraDropout: 0.05,\n defaultMaxSeqLength: 2048,\n },\n];\n\nexport function resolveTrainingModel(modelId: string): TrainingModel {\n const normalized = modelId.trim().toLowerCase();\n const model = TRAINING_MODELS.find((candidate) =>\n candidate.id.toLowerCase() === normalized\n );\n if (!model) {\n throw new Error(\n `Unsupported base model \"${modelId}\". Supported model: ${TRAINING_MODELS[0]!.id}`,\n );\n }\n return model;\n}\n\nexport function canonicalizeTrainingModel(modelId: string): string {\n return resolveTrainingModel(modelId).id;\n}\n\nconst CERTIFIED_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\n/** Reject a same-family snapshot that is not the certified 2B architecture. */\nexport function assertCertifiedBaseModelConfig(\n value: unknown,\n label = \"base-model config.json\",\n): void {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${label} must contain a JSON object.`);\n }\n const config = value as Record<string, unknown>;\n const architectures = config.architectures;\n const textConfig = config.text_config;\n if (\n config.model_type !== \"qwen3_5\"\n || !Array.isArray(architectures)\n || !architectures.includes(\"Qwen3_5ForConditionalGeneration\")\n || !textConfig\n || typeof textConfig !== \"object\"\n || Array.isArray(textConfig)\n ) {\n throw new Error(\n `${label} is not the certified Qwen/Qwen3.5-2B architecture.`,\n );\n }\n const text = textConfig as Record<string, unknown>;\n for (const [key, expected] of Object.entries(CERTIFIED_TEXT_CONFIG)) {\n if (text[key] !== expected) {\n throw new Error(\n `${label} is not the certified Qwen/Qwen3.5-2B architecture: `\n + `text_config.${key} must be ${JSON.stringify(expected)}.`,\n );\n }\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://\")) return fileURLToPath(new URL(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 { z } from \"zod\";\nimport { canonicalizeTrainingModel } from \"./model-registry.js\";\n\n/**\n * TT Local deliberately has one training contract today: 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\nexport const specSnapshotSchema = 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 base_model: z.string().transform((value) => canonicalizeTrainingModel(value)),\n}).strict();\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}).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});\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\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}).strict().superRefine((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 localBehaviorSpecFileSchema = specSnapshotSchema.extend({\n id: z.string().uuid().optional(),\n hyperparameters: fineTuneHyperparametersSchema.optional(),\n dataset_prebuilt: datasetPrebuiltSchema.optional(),\n}).strict();\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.literal(\"local-uv\"),\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\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 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 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 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 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 storeRoot: z.string().optional(),\n artifactRoot: z.string().default(\".tt-local/artifacts\"),\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 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\nexport type BehaviorSpecExample = z.infer<typeof behaviorSpecExampleSchema>;\nexport type SpecSnapshot = z.infer<typeof specSnapshotSchema>;\nexport type FineTuneHyperparameters = z.infer<typeof fineTuneHyperparametersSchema>;\nexport type FineTuneRunRequest = z.infer<typeof fineTuneRunRequestSchema>;\nexport type LocalBehaviorSpecFile = z.infer<typeof localBehaviorSpecFileSchema>;\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 LocalRunnerConfig = z.infer<typeof localRunnerConfigSchema>;\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdir } from \"node:fs/promises\";\nimport {\n fineTuneRunRequestSchema,\n localBehaviorSpecFileSchema,\n type FineTuneRunRequest,\n type LocalBehaviorSpecFile,\n} from \"./contracts.js\";\n\nexport const DEFAULT_LOCAL_SPEC_PATH = \"tunedtensor.json\";\n\nexport interface CreateLocalSpecArgs {\n name: string;\n baseModel: string;\n outputPath: string;\n force?: boolean;\n}\n\nexport type LocalRunnerProfile = \"spark\";\n\nexport interface CreateLocalRunnerConfigArgs {\n outputPath: string;\n profile: LocalRunnerProfile;\n force?: boolean;\n}\n\nexport interface RunRequestFromSpecOptions {\n runId?: string;\n}\n\nexport interface LocalRunInput {\n kind: \"request\" | \"spec\";\n path: string;\n request: FineTuneRunRequest;\n spec?: LocalBehaviorSpecFile;\n}\n\nfunction resolveLocalReference(value: unknown, baseDirectory: string): unknown {\n if (typeof value !== \"string\" || !value || isAbsolute(value) || /^[a-z][a-z0-9+.-]*:/i.test(value)) {\n return value;\n }\n if (value === \"~\") return homedir();\n if (value.startsWith(\"~/\")) return resolve(homedir(), value.slice(2));\n return resolve(baseDirectory, value);\n}\n\n/** Resolve dataset paths relative to the spec/request file itself. */\nexport function resolveLocalRunInputPaths(raw: unknown, inputPath: string): unknown {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return raw;\n const baseDirectory = dirname(resolve(inputPath));\n const value = structuredClone(raw) as Record<string, unknown>;\n const dataset = value.dataset_prebuilt;\n if (dataset && typeof dataset === \"object\" && !Array.isArray(dataset)) {\n const fields = dataset as Record<string, unknown>;\n for (const key of [\"training\", \"validation\", \"test\"] as const) {\n if (fields[key] !== undefined) fields[key] = resolveLocalReference(fields[key], baseDirectory);\n }\n }\n return value;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function initLocalSpecFile(args: CreateLocalSpecArgs): Promise<LocalBehaviorSpecFile> {\n if (!args.force && await exists(args.outputPath)) {\n throw new Error(`Refusing to overwrite existing file: ${args.outputPath}`);\n }\n const spec = localBehaviorSpecFileSchema.parse({\n id: randomUUID(),\n name: args.name,\n description: \"\",\n system_prompt: \"Describe the behavior this local model should learn.\",\n guidelines: [\n \"Return concise, task-specific answers.\",\n ],\n constraints: [],\n base_model: args.baseModel,\n examples: [\n {\n input: \"Replace this with representative training input.\",\n output: \"Replace this with the expected training output.\",\n },\n {\n input: \"Replace this with a different validation input.\",\n output: \"Replace this with the expected validation output.\",\n },\n ],\n hyperparameters: {\n n_epochs: 1,\n },\n });\n await mkdir(dirname(args.outputPath), { recursive: true });\n await writeFile(args.outputPath, `${JSON.stringify(spec, null, 2)}\\n`, \"utf8\");\n return spec;\n}\n\nexport async function initLocalRunnerConfigFile(args: CreateLocalRunnerConfigArgs): Promise<Record<string, unknown>> {\n if (!args.force && await exists(args.outputPath)) {\n throw new Error(`Refusing to overwrite existing file: ${args.outputPath}`);\n }\n const config = {\n artifactRoot: \".tt-local/artifacts\",\n storeRoot: \".tt-local/store\",\n evaluation: {\n inference: {\n device: \"cuda\",\n },\n scoring: {\n mode: \"exact_match\",\n },\n timeoutMs: 1_800_000,\n },\n } satisfies Record<string, unknown>;\n await mkdir(dirname(args.outputPath), { recursive: true });\n await writeFile(args.outputPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n return config;\n}\n\nexport function generatedPlaceholderIssues(request: FineTuneRunRequest): string[] {\n const issues: string[] = [];\n if (/describe the behavior this local model should learn/i.test(request.spec_snapshot.system_prompt)) {\n issues.push(\"system_prompt still contains the generated placeholder\");\n }\n request.spec_snapshot.examples.forEach((example, index) => {\n if (/replace this with/i.test(example.input) || /replace this with/i.test(example.output)) {\n issues.push(`examples[${index}] still contains generated placeholder text`);\n }\n });\n return issues;\n}\n\nexport function assertLocalRunInputReady(request: FineTuneRunRequest): void {\n const issues = generatedPlaceholderIssues(request);\n if (issues.length > 0) {\n throw new Error(`Edit the generated behavior spec before training: ${issues.join(\"; \")}.`);\n }\n}\n\nexport function runRequestFromLocalSpec(\n spec: LocalBehaviorSpecFile,\n options: RunRequestFromSpecOptions = {},\n): FineTuneRunRequest {\n const {\n id,\n hyperparameters,\n dataset_prebuilt: datasetPrebuilt,\n ...specSnapshot\n } = spec;\n const behaviorSpecId = id ?? deterministicBehaviorSpecId(specSnapshot);\n return fineTuneRunRequestSchema.parse({\n run_id: options.runId ?? randomUUID(),\n user_id: \"local-user\",\n behavior_spec_id: behaviorSpecId,\n run_number: 1,\n spec_snapshot: specSnapshot,\n hyperparameters,\n dataset_prebuilt: datasetPrebuilt,\n });\n}\n\nfunction deterministicBehaviorSpecId(spec: FineTuneRunRequest[\"spec_snapshot\"]): string {\n const namespace = Buffer.from(\"9f783f01340457bea061942004259253\", \"hex\");\n const digest = createHash(\"sha1\")\n .update(namespace)\n .update(JSON.stringify(spec))\n .digest()\n .subarray(0, 16);\n digest[6] = (digest[6]! & 0x0f) | 0x50;\n digest[8] = (digest[8]! & 0x3f) | 0x80;\n const hex = digest.toString(\"hex\");\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20),\n ].join(\"-\");\n}\n\nexport async function loadLocalRunInput(\n path: string,\n options: RunRequestFromSpecOptions = {},\n): Promise<LocalRunInput> {\n const raw = resolveLocalRunInputPaths(JSON.parse(await readFile(path, \"utf8\")) as unknown, path);\n const request = fineTuneRunRequestSchema.safeParse(raw);\n if (request.success) {\n return { kind: \"request\", path, request: request.data };\n }\n const spec = localBehaviorSpecFileSchema.parse(raw);\n return {\n kind: \"spec\",\n path,\n spec,\n request: runRequestFromLocalSpec(spec, options),\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport type { BehaviorSpecExample, SpecSnapshot } from \"./contracts.js\";\n\nexport interface ChatJsonlRow {\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>;\n}\n\ninterface NormalizedChatJsonl {\n rows: ChatJsonlRow[];\n jsonl: string;\n}\n\nasync function loadNormalizedChatJsonl(path: string): Promise<NormalizedChatJsonl> {\n const text = await readFile(path, \"utf8\");\n const rows: ChatJsonlRow[] = [];\n const jsonLines: string[] = [];\n for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n if (!line.trim()) continue;\n let value: unknown;\n try {\n value = JSON.parse(line) as unknown;\n } catch (error) {\n throw new Error(`Invalid chat JSONL row ${index + 1}: malformed JSON`, { cause: error });\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`Invalid chat JSONL row ${index + 1}: expected an object`);\n }\n const messages = (value as { messages?: unknown }).messages;\n if (\n !Array.isArray(messages)\n || ![2, 3].includes(messages.length)\n || messages.some((message) =>\n !message\n || typeof message !== \"object\"\n || Array.isArray(message)\n || ![\"system\", \"user\", \"assistant\"].includes(String((message as { role?: unknown }).role))\n || typeof (message as { content?: unknown }).content !== \"string\"\n )\n ) {\n throw new Error(\n `Invalid chat JSONL row ${index + 1}: expected an optional system message, one user message, and one assistant answer`,\n );\n }\n const row = { messages } as ChatJsonlRow;\n const offset = row.messages.length === 3 ? 1 : 0;\n if (\n (offset === 1 && row.messages[0]?.role !== \"system\")\n || row.messages[offset]?.role !== \"user\"\n || !row.messages[offset]?.content.trim()\n || row.messages[offset + 1]?.role !== \"assistant\"\n || !row.messages[offset + 1]?.content.trim()\n ) {\n throw new Error(\n `Invalid chat JSONL row ${index + 1}: expected an optional system message, one non-empty user message, and one non-empty assistant answer`,\n );\n }\n rows.push(row);\n jsonLines.push(JSON.stringify(row));\n }\n if (rows.length === 0) throw new Error(`Chat JSONL contains no examples: ${path}`);\n return {\n rows,\n jsonl: jsonLines.join(\"\\n\"),\n };\n}\n\n/** Parses and canonically rewrites text chat JSONL before copying it. */\nexport async function normalizeChatJsonlForRelocation(path: string): Promise<string> {\n return (await loadNormalizedChatJsonl(path)).jsonl;\n}\n\nexport function buildSystemMessage(spec: SpecSnapshot): string {\n const parts: string[] = [];\n if (spec.system_prompt.trim()) parts.push(spec.system_prompt.trim());\n if (spec.guidelines.length > 0) {\n parts.push(`Guidelines:\\n${spec.guidelines.map((guideline) => `- ${guideline}`).join(\"\\n\")}`);\n }\n if (spec.constraints.length > 0) {\n parts.push(`Constraints:\\n${spec.constraints.map((constraint) => `- ${constraint}`).join(\"\\n\")}`);\n }\n return parts.join(\"\\n\\n\") || \"Follow the demonstrated behavior.\";\n}\n\nexport function exampleToChatRow(spec: SpecSnapshot, example: BehaviorSpecExample): ChatJsonlRow {\n const system = buildSystemMessage(spec);\n return {\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: example.input },\n { role: \"assistant\", content: example.output },\n ],\n };\n}\n\nexport function compileSpecToJsonl(spec: SpecSnapshot): string {\n return spec.examples.map((example) => JSON.stringify(exampleToChatRow(spec, example))).join(\"\\n\");\n}\n\nexport function examplesFromSpec(spec: SpecSnapshot): BehaviorSpecExample[] {\n return spec.examples;\n}\n\nexport async function examplesFromChatJsonl(path: string): Promise<BehaviorSpecExample[]> {\n const normalized = await loadNormalizedChatJsonl(path);\n const examples: BehaviorSpecExample[] = [];\n for (const [index, row] of normalized.rows.entries()) {\n const user = row.messages.at(-2)!;\n const assistant = row.messages.at(-1)!;\n examples.push({\n input: user.content,\n output: assistant.content,\n });\n }\n return examples;\n}\n\nexport interface EvaluationSuite {\n examples: BehaviorSpecExample[];\n system: string;\n}\n\n/**\n * Loads an evaluation-only chat JSONL suite. Rows may omit the system message,\n * but when they include one it must be identical across the suite.\n */\nexport async function evaluationSuiteFromChatJsonl(\n path: string,\n configuredSystem?: string,\n): Promise<EvaluationSuite> {\n const normalized = await loadNormalizedChatJsonl(path);\n const inputIdentities = new Set<string>();\n for (const row of normalized.rows) {\n const input = row.messages.at(-2)!.content;\n const identity = input.trim().replace(/\\s+/g, \" \").toLowerCase();\n if (inputIdentities.has(identity)) {\n throw new Error(\n \"General regression data contains duplicate inputs; \"\n + \"evaluation prompts must be unique.\",\n );\n }\n inputIdentities.add(identity);\n }\n const systems = new Set(\n normalized.rows\n .map((row) => row.messages.find((message) => message.role === \"system\")?.content)\n .filter((value): value is string => value !== undefined),\n );\n if (systems.size > 1) {\n throw new Error(\"General regression rows must use one consistent system message.\");\n }\n const embeddedSystem = [...systems][0];\n if (\n configuredSystem !== undefined\n && embeddedSystem !== undefined\n && configuredSystem !== embeddedSystem\n ) {\n throw new Error(\n \"evaluation.generalRegression.systemPrompt must match the system message embedded in the dataset.\",\n );\n }\n return {\n examples: normalized.rows.map((row) => ({\n input: row.messages.at(-2)!.content,\n output: row.messages.at(-1)!.content,\n })),\n system: configuredSystem ?? embeddedSystem ?? \"You are a helpful assistant.\",\n };\n}\n","export 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}\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\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/local-runner\")),\n );\n if (!root) {\n throw new Error(\"Unable to locate the bundled Tuned Tensor local runtime assets.\");\n }\n return root;\n}\n","import { appendFile, copyFile, mkdir, readdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { FineTuneRunRequest, RunReport, SpecSnapshot, TrainingReport } from \"./contracts.js\";\n\nexport type LocalRunStatus =\n | \"queued\"\n | \"preparing\"\n | \"evaluating_baseline\"\n | \"training\"\n | \"evaluating_candidate\"\n | \"scoring\"\n | \"reporting\"\n | \"stage_completed\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\";\n\nexport interface LocalRunState {\n id: string;\n behavior_spec_id: string;\n user_id: string;\n run_number: number;\n status: LocalRunStatus;\n current_stage: string;\n status_message: string;\n artifact_dir: string;\n report_path?: string;\n model_id?: string;\n error?: string;\n base_model: string;\n spec_name: string;\n created_at: string;\n updated_at: string;\n started_at?: string;\n completed_at?: string;\n}\n\nexport function isTerminalRunState(\n state: Pick<LocalRunState, \"status\" | \"current_stage\" | \"completed_at\">,\n): boolean {\n return state.status === \"stage_completed\"\n || state.status === \"completed\"\n || state.status === \"failed\"\n || (state.status === \"cancelled\" && state.current_stage === \"cancelled\" && Boolean(state.completed_at));\n}\n\nexport interface LocalRunEvent {\n id: string;\n run_id: string;\n stage: string;\n status: LocalRunStatus | \"running\" | \"completed\" | \"failed\";\n message: string;\n details?: Record<string, unknown>;\n occurred_at: string;\n}\n\nexport interface LocalModelRecord {\n id: string;\n run_id: string;\n behavior_spec_id: string;\n name: string;\n provider: \"local-uv\";\n base_model: string;\n artifact_uri: string;\n artifact_dir: string;\n metrics: Record<string, unknown> | null;\n created_at: string;\n}\n\nexport interface LocalSpecRecord {\n id: string;\n name: string;\n base_model: string;\n path: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface LocalStore {\n root: string;\n paths: ReturnType<typeof localStorePaths>;\n ensure(): Promise<void>;\n importSpec(specId: string, spec: SpecSnapshot): Promise<LocalSpecRecord>;\n listSpecs(): Promise<LocalSpecRecord[]>;\n getSpec(id: string): Promise<LocalSpecRecord & { spec: SpecSnapshot }>;\n startRun(args: { request: FineTuneRunRequest; artifactDir: string }): Promise<LocalRunState>;\n syncRunRequest(request: FineTuneRunRequest, artifactDir?: string): Promise<LocalRunState>;\n updateRun(args: {\n runId: string;\n status: LocalRunStatus;\n stage: string;\n message: string;\n details?: Record<string, unknown>;\n }): Promise<LocalRunState>;\n completeRun(report: RunReport, artifactDir: string, reportPath: string): Promise<LocalRunState>;\n registerModel(args: {\n request: FineTuneRunRequest;\n training: TrainingReport;\n artifactDir: string;\n createdAt?: string;\n }): Promise<LocalModelRecord | null>;\n invalidateRunOutputs(runId: string, options: { report?: boolean; model?: boolean }): Promise<LocalRunState>;\n failRun(runId: string, error: string): Promise<LocalRunState>;\n cancelRun(runId: string): Promise<void>;\n finalizeCancellation(runId: string): Promise<LocalRunState>;\n isCancellationRequested(runId: string): Promise<boolean>;\n listRuns(): Promise<LocalRunState[]>;\n getRun(id: string): Promise<LocalRunState>;\n getRunEvents(id: string): Promise<LocalRunEvent[]>;\n getRunReport(id: string): Promise<RunReport>;\n listModels(): Promise<LocalModelRecord[]>;\n getModel(id: string): Promise<LocalModelRecord>;\n}\n\nexport function defaultLocalHome(): string {\n return resolve(process.env.TT_LOCAL_HOME ?? join(homedir(), \".tuned-tensor-local\"));\n}\n\nexport function localStorePaths(root: string) {\n return {\n root,\n specsDir: join(root, \"specs\"),\n runsDir: join(root, \"runs\"),\n modelsDir: join(root, \"models\"),\n datasetsDir: join(root, \"datasets\"),\n };\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeJsonAtomic(path: string, value: unknown): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const tmp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`;\n await writeFile(tmp, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n await rename(tmp, path);\n}\n\nasync function readJson<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nasync function appendJsonl(path: string, value: unknown): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await appendFile(path, `${JSON.stringify(value)}\\n`, \"utf8\");\n}\n\nasync function readJsonl<T>(path: string): Promise<T[]> {\n if (!(await exists(path))) return [];\n return (await readFile(path, \"utf8\"))\n .split(/\\r?\\n/)\n .filter(Boolean)\n .map((line) => JSON.parse(line) as T);\n}\n\nasync function copyIfExists(from: string, to: string): Promise<void> {\n if (!(await exists(from))) return;\n await mkdir(dirname(to), { recursive: true });\n await copyFile(from, to);\n}\n\nasync function childDirectoryNames(path: string): Promise<string[]> {\n try {\n const entries = await readdir(path, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n }\n}\n\nfunction compareIds(left: { id: string }, right: { id: string }): number {\n if (left.id === right.id) return 0;\n return left.id < right.id ? -1 : 1;\n}\n\nfunction compareUpdatedAt(\n left: Pick<LocalRunState, \"id\" | \"updated_at\">,\n right: Pick<LocalRunState, \"id\" | \"updated_at\">,\n): number {\n if (left.updated_at !== right.updated_at) return left.updated_at > right.updated_at ? -1 : 1;\n return compareIds(left, right);\n}\n\nfunction compareCreatedAt(\n left: Pick<LocalModelRecord, \"id\" | \"created_at\">,\n right: Pick<LocalModelRecord, \"id\" | \"created_at\">,\n): number {\n if (left.created_at !== right.created_at) return left.created_at > right.created_at ? -1 : 1;\n return compareIds(left, right);\n}\n\nfunction findByIdOrPrefix<T extends { id: string }>(records: T[], id: string): T | undefined {\n return records.find((record) => record.id === id) ?? records.find((record) => record.id.startsWith(id));\n}\n\nexport function createLocalStore(root = defaultLocalHome()): LocalStore {\n const resolvedRoot = resolve(root);\n const paths = localStorePaths(resolvedRoot);\n\n const runDir = (id: string) => join(paths.runsDir, id);\n const runStatePath = (id: string) => join(runDir(id), \"state.json\");\n const runEventsPath = (id: string) => join(runDir(id), \"progress.jsonl\");\n const runRequestPath = (id: string) => join(runDir(id), \"request.json\");\n const runReportPath = (id: string) => join(runDir(id), \"run-report.json\");\n const cancellationPath = (id: string) => join(runDir(id), \"cancel.requested\");\n const specDir = (id: string) => join(paths.specsDir, id);\n const specPath = (id: string) => join(specDir(id), \"spec.json\");\n const modelPath = (id: string) => join(paths.modelsDir, id, \"model.json\");\n\n async function ensure() {\n await Promise.all([\n mkdir(paths.specsDir, { recursive: true }),\n mkdir(paths.runsDir, { recursive: true }),\n mkdir(paths.modelsDir, { recursive: true }),\n mkdir(paths.datasetsDir, { recursive: true }),\n ]);\n }\n\n async function writeRunState(state: LocalRunState): Promise<LocalRunState> {\n await writeJsonAtomic(runStatePath(state.id), state);\n return state;\n }\n\n async function readSpecRecord(id: string): Promise<LocalSpecRecord | null> {\n const path = specPath(id);\n if (!(await exists(path))) return null;\n const [spec, fileStats, directoryStats] = await Promise.all([\n readJson<SpecSnapshot>(path),\n stat(path),\n stat(specDir(id)),\n ]);\n const createdAt = directoryStats.birthtimeMs > 0 ? directoryStats.birthtime : directoryStats.ctime;\n return {\n id,\n name: spec.name,\n base_model: spec.base_model,\n path,\n created_at: createdAt.toISOString(),\n updated_at: fileStats.mtime.toISOString(),\n };\n }\n\n async function listSpecRecords(): Promise<LocalSpecRecord[]> {\n await ensure();\n const records: LocalSpecRecord[] = [];\n for (const id of await childDirectoryNames(paths.specsDir)) {\n const record = await readSpecRecord(id);\n if (record) records.push(record);\n }\n return records.sort(compareUpdatedAt);\n }\n\n async function listRunRecords(): Promise<LocalRunState[]> {\n await ensure();\n const records: LocalRunState[] = [];\n for (const id of await childDirectoryNames(paths.runsDir)) {\n const path = runStatePath(id);\n if (await exists(path)) records.push(await readJson<LocalRunState>(path));\n }\n return records.sort(compareUpdatedAt);\n }\n\n async function listModelRecords(): Promise<LocalModelRecord[]> {\n await ensure();\n const records: LocalModelRecord[] = [];\n for (const id of await childDirectoryNames(paths.modelsDir)) {\n const path = modelPath(id);\n if (await exists(path)) records.push(await readJson<LocalModelRecord>(path));\n }\n return records.sort(compareCreatedAt);\n }\n\n async function importSpecRecord(specId: string, spec: SpecSnapshot): Promise<LocalSpecRecord> {\n await ensure();\n await mkdir(specDir(specId), { recursive: true });\n await writeJsonAtomic(specPath(specId), spec);\n const record = await readSpecRecord(specId);\n if (!record) throw new Error(`Failed to persist spec: ${specId}`);\n return record;\n }\n\n async function appendRunEvent(state: LocalRunState, event: Omit<LocalRunEvent, \"id\" | \"run_id\" | \"occurred_at\">): Promise<void> {\n const row: LocalRunEvent = {\n id: randomUUID(),\n run_id: state.id,\n occurred_at: new Date().toISOString(),\n ...event,\n };\n await appendJsonl(runEventsPath(state.id), row);\n await appendJsonl(join(state.artifact_dir, \"progress.jsonl\"), {\n at: row.occurred_at,\n stage: row.stage,\n status: row.status,\n message: row.message,\n ...(row.details ? { details: row.details } : {}),\n });\n }\n\n async function finalizeCancellationState(runId: string): Promise<LocalRunState> {\n const previous = await getRun(runId);\n if (previous.status === \"cancelled\" && previous.current_stage === \"cancelled\" && previous.completed_at) {\n return previous;\n }\n const now = new Date().toISOString();\n const cancelled: LocalRunState = {\n ...previous,\n status: \"cancelled\",\n current_stage: \"cancelled\",\n status_message: \"Run cancelled.\",\n error: undefined,\n completed_at: now,\n updated_at: now,\n };\n await writeRunState(cancelled);\n await appendRunEvent(cancelled, { stage: \"cancelled\", status: \"cancelled\", message: \"Run cancelled.\" });\n return cancelled;\n }\n\n async function preserveCancellationRequestState(runId: string): Promise<LocalRunState> {\n const previous = await getRun(runId);\n if (isTerminalRunState(previous)) return previous;\n if (previous.status === \"cancelled\" && previous.current_stage === \"cancel_requested\") return previous;\n const requested: LocalRunState = {\n ...previous,\n status: \"cancelled\",\n current_stage: \"cancel_requested\",\n status_message: \"Cancellation requested; waiting for the active worker to stop.\",\n error: undefined,\n completed_at: undefined,\n updated_at: new Date().toISOString(),\n };\n return writeRunState(requested);\n }\n\n async function resolveRunId(id: string): Promise<string> {\n await ensure();\n if (await exists(runStatePath(id))) return id;\n const record = findByIdOrPrefix(await listRunRecords(), id);\n if (!record) throw new Error(`Run not found: ${id}`);\n return record.id;\n }\n\n async function getRun(id: string): Promise<LocalRunState> {\n return readJson<LocalRunState>(runStatePath(await resolveRunId(id)));\n }\n\n async function registerModelRecord(args: {\n request: FineTuneRunRequest;\n training: TrainingReport;\n artifactDir: string;\n createdAt?: string;\n }): Promise<LocalModelRecord | null> {\n if (!args.training.model_artifact_uri || args.training.metrics?.dry_run === true) return null;\n const previous = await getRun(args.request.run_id);\n const modelId = `local-${args.request.run_id}`;\n const existingModel = await exists(modelPath(modelId))\n ? await readJson<LocalModelRecord>(modelPath(modelId))\n : undefined;\n const now = new Date().toISOString();\n const model: LocalModelRecord = {\n id: modelId,\n run_id: args.request.run_id,\n behavior_spec_id: args.request.behavior_spec_id,\n name: `${args.request.spec_snapshot.base_model} (${args.request.run_id.slice(0, 8)})`,\n provider: args.training.provider,\n base_model: args.request.spec_snapshot.base_model,\n artifact_uri: args.training.model_artifact_uri,\n artifact_dir: args.artifactDir,\n metrics: args.training.metrics,\n created_at: existingModel?.created_at ?? args.createdAt ?? now,\n };\n await writeJsonAtomic(modelPath(model.id), model);\n const alreadyRegistered = previous.model_id === modelId;\n const state: LocalRunState = {\n ...previous,\n model_id: modelId,\n updated_at: now,\n };\n await writeRunState(state);\n if (!alreadyRegistered) {\n await appendRunEvent(state, {\n stage: \"model_registered\",\n status: \"running\",\n message: \"Local model artifact registered.\",\n details: { model_id: modelId, artifact_uri: model.artifact_uri },\n });\n }\n return model;\n }\n\n return {\n root: resolvedRoot,\n paths,\n ensure,\n\n importSpec: importSpecRecord,\n\n async listSpecs() {\n return listSpecRecords();\n },\n\n async getSpec(id) {\n const record = findByIdOrPrefix(await listSpecRecords(), id);\n if (!record) throw new Error(`Spec not found: ${id}`);\n return { ...record, spec: await readJson<SpecSnapshot>(record.path) };\n },\n\n async startRun({ request, artifactDir }) {\n await ensure();\n await importSpecRecord(request.behavior_spec_id, request.spec_snapshot);\n const now = new Date().toISOString();\n const state: LocalRunState = {\n id: request.run_id,\n behavior_spec_id: request.behavior_spec_id,\n user_id: request.user_id,\n run_number: request.run_number,\n status: \"queued\",\n current_stage: \"queued\",\n status_message: \"Run queued.\",\n artifact_dir: artifactDir,\n base_model: request.spec_snapshot.base_model,\n spec_name: request.spec_snapshot.name,\n created_at: now,\n updated_at: now,\n started_at: now,\n };\n await writeJsonAtomic(runRequestPath(request.run_id), request);\n await writeRunState(state);\n await appendRunEvent(state, { stage: \"queued\", status: \"queued\", message: \"Run queued.\" });\n return state;\n },\n\n async syncRunRequest(request, artifactDir) {\n const previous = await getRun(request.run_id);\n if (\n previous.behavior_spec_id !== request.behavior_spec_id\n || previous.user_id !== request.user_id\n || previous.run_number !== request.run_number\n ) {\n throw new Error(\n `Run ${request.run_id} cannot be reused with different user, behavior spec, or run number identity.`,\n );\n }\n await importSpecRecord(request.behavior_spec_id, request.spec_snapshot);\n await writeJsonAtomic(runRequestPath(request.run_id), request);\n const state: LocalRunState = {\n ...previous,\n artifact_dir: artifactDir ?? previous.artifact_dir,\n base_model: request.spec_snapshot.base_model,\n spec_name: request.spec_snapshot.name,\n updated_at: new Date().toISOString(),\n };\n await writeRunState(state);\n return state;\n },\n\n async updateRun({ runId, status, stage, message, details }) {\n const previous = await getRun(runId);\n if (status !== \"cancelled\" && await exists(cancellationPath(previous.id))) {\n return preserveCancellationRequestState(previous.id);\n }\n const active = status !== \"stage_completed\" && status !== \"completed\" && status !== \"failed\" && status !== \"cancelled\";\n const successful = status === \"stage_completed\" || status === \"completed\";\n const now = new Date().toISOString();\n const state: LocalRunState = {\n ...previous,\n status,\n current_stage: stage,\n status_message: message,\n ...(active\n ? { error: undefined, completed_at: undefined }\n : successful\n ? { error: undefined, completed_at: now }\n : {}),\n updated_at: now,\n };\n await writeRunState(state);\n if (status !== \"cancelled\" && await exists(cancellationPath(previous.id))) {\n return preserveCancellationRequestState(previous.id);\n }\n await appendRunEvent(state, {\n stage,\n status: successful ? \"completed\" : status === \"failed\" ? \"failed\" : \"running\",\n message,\n details,\n });\n return state;\n },\n\n async completeRun(report, artifactDir, reportPath) {\n if (await exists(cancellationPath(report.run_id))) {\n return preserveCancellationRequestState(report.run_id);\n }\n const request = await readJson<FineTuneRunRequest>(runRequestPath(report.run_id));\n const completedAt = report.created_at ?? new Date().toISOString();\n const model = await registerModelRecord({\n request,\n training: report.training,\n artifactDir,\n createdAt: completedAt,\n });\n if (!model) {\n await rm(join(paths.modelsDir, `local-${report.run_id}`), { recursive: true, force: true });\n }\n const previous = await getRun(report.run_id);\n const state: LocalRunState = {\n ...previous,\n status: \"completed\",\n current_stage: \"completed\",\n status_message: \"Run completed successfully.\",\n report_path: reportPath,\n model_id: model?.id,\n error: undefined,\n completed_at: completedAt,\n updated_at: completedAt,\n };\n await writeRunState(state);\n if (await exists(cancellationPath(report.run_id))) {\n return preserveCancellationRequestState(report.run_id);\n }\n await copyIfExists(reportPath, runReportPath(report.run_id));\n await appendRunEvent(state, {\n stage: \"completed\",\n status: \"completed\",\n message: \"Run completed successfully.\",\n details: { report_path: reportPath, ...(model ? { model_id: model.id } : {}) },\n });\n return state;\n },\n\n registerModel: registerModelRecord,\n\n async invalidateRunOutputs(runId, options) {\n const previous = await getRun(runId);\n if (options.report) await rm(runReportPath(previous.id), { force: true });\n if (options.model) {\n await rm(join(paths.modelsDir, `local-${previous.id}`), { recursive: true, force: true });\n }\n const state: LocalRunState = {\n ...previous,\n ...(options.report ? { report_path: undefined } : {}),\n ...(options.model ? { model_id: undefined } : {}),\n error: undefined,\n completed_at: undefined,\n updated_at: new Date().toISOString(),\n };\n return writeRunState(state);\n },\n\n async failRun(runId, error) {\n const previous = await getRun(runId);\n const now = new Date().toISOString();\n if (await exists(cancellationPath(previous.id))) {\n return preserveCancellationRequestState(previous.id);\n }\n const state: LocalRunState = {\n ...previous,\n status: \"failed\",\n current_stage: \"failed\",\n status_message: error,\n error,\n completed_at: now,\n updated_at: now,\n };\n await writeRunState(state);\n if (await exists(cancellationPath(previous.id))) {\n return preserveCancellationRequestState(previous.id);\n }\n await appendRunEvent(state, { stage: \"failed\", status: \"failed\", message: error });\n return state;\n },\n\n async cancelRun(runId) {\n const state = await getRun(runId);\n if (isTerminalRunState(state) || (state.status === \"cancelled\" && state.current_stage === \"cancel_requested\")) {\n return;\n }\n await writeFile(cancellationPath(state.id), `${new Date().toISOString()}\\n`, \"utf8\");\n const latest = await getRun(state.id);\n if (isTerminalRunState(latest)) {\n if (latest.status !== \"cancelled\") await rm(cancellationPath(state.id), { force: true });\n return;\n }\n const updated: LocalRunState = {\n ...latest,\n status: \"cancelled\",\n current_stage: \"cancel_requested\",\n status_message: \"Cancellation requested; waiting for the active worker to stop.\",\n error: undefined,\n completed_at: undefined,\n updated_at: new Date().toISOString(),\n };\n await writeRunState(updated);\n await appendRunEvent(updated, { stage: \"cancel_requested\", status: \"cancelled\", message: \"Cancellation requested.\" });\n },\n\n async finalizeCancellation(runId) {\n return finalizeCancellationState(runId);\n },\n\n async isCancellationRequested(runId) {\n const state = await getRun(runId);\n return state.status === \"cancelled\" || await exists(cancellationPath(state.id));\n },\n\n async listRuns() {\n return listRunRecords();\n },\n\n getRun,\n\n async getRunEvents(id) {\n const state = await getRun(id);\n return readJsonl<LocalRunEvent>(runEventsPath(state.id));\n },\n\n async getRunReport(id) {\n const state = await getRun(id);\n if (state.report_path && await exists(state.report_path)) {\n return readJson<RunReport>(state.report_path);\n }\n const copiedReportPath = runReportPath(state.id);\n if (await exists(copiedReportPath)) return readJson<RunReport>(copiedReportPath);\n throw new Error(`Run has no report yet: ${id}`);\n },\n\n async listModels() {\n return listModelRecords();\n },\n\n async getModel(id) {\n const record = findByIdOrPrefix(await listModelRecords(), id);\n if (!record) throw new Error(`Model not found: ${id}`);\n return record;\n },\n };\n}\n","import { lstat, mkdir, readFile, readdir, stat } from \"node:fs/promises\";\nimport { join, resolve } 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 resolveTrainingModel,\n} from \"./model-registry.js\";\nimport {\n buildBundledPythonCommand,\n runLoggedProcess,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\nimport type { LocalRunReporter } from \"./run-reporter.js\";\nimport { minimalMachineLearningEnvironment, withHuggingFaceCacheEnvironment } 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}\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}\n\nexport function buildModelPrefetchPayload(\n request: FineTuneRunRequest,\n config: LocalRunnerConfig,\n): ModelPrefetchPayload {\n const model = resolveTrainingModel(request.spec_snapshot.base_model);\n return {\n base_model: model.id,\n ...(request.hyperparameters.base_model_revision\n ? { revision: request.hyperparameters.base_model_revision }\n : {}),\n ...(config.paths.modelCache ? { model_cache: resolve(config.paths.modelCache) } : {}),\n };\n}\n\nfunction 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(path: string): 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.isDirectory()) {\n await visit(child);\n continue;\n }\n const metadata = await stat(child);\n if (entry.isSymbolicLink() && !metadata.isFile()) {\n throw new Error(`Local base model contains a non-file symbolic link: ${child}`);\n }\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(config, `Local base-model config ${join(path, \"config.json\")}`);\n } catch (error) {\n throw new Error(`Local base-model directory has an invalid or unsupported config.json: ${path}`, { cause: error });\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 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\" || !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 request: FineTuneRunRequest;\n config: LocalRunnerConfig;\n reporter?: LocalRunReporter;\n localOnly?: boolean;\n}): Promise<ModelPrefetchReport> {\n const artifactDir = resolve(\n args.config.artifactRoot,\n args.localOnly ? \"verify-base\" : \"prefetch\",\n `${safeName(args.request.spec_snapshot.base_model)}-${new Date().toISOString().replace(/[:.]/g, \"-\")}`,\n );\n await mkdir(artifactDir, { recursive: true });\n\n if (args.config.paths.baseModel) {\n const localPath = resolve(args.config.paths.baseModel);\n const verified = await verifyLocalBaseModel(localPath);\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 payload: ModelPrefetchPayload = {\n ...buildModelPrefetchPayload(args.request, args.config),\n ...(args.localOnly ? { local_files_only: true } : {}),\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 await args.reporter?.onEvent?.({\n stage: \"model_prefetch\",\n status: \"running\",\n message: args.localOnly\n ? \"Verifying the Hugging Face base model is available in the local cache.\"\n : \"Prefetching Hugging Face base model.\",\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 env = withBundledPythonEnvironment(\n withHuggingFaceCacheEnvironment(\n minimalMachineLearningEnvironment(process.env),\n payload.model_cache,\n ),\n );\n\n const { exitCode } = await 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\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: output.hf_home ?? output.model_cache ?? payload.model_cache ?? null,\n hub_cache: output.hub_cache ?? null,\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: output.model_cache ?? payload.model_cache,\n hf_home: output.hf_home ?? output.model_cache ?? payload.model_cache,\n hub_cache: output.hub_cache,\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 };\n}\n","import { createHash } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { createWriteStream, readFileSync, type WriteStream } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { forwardStreamLines, reportInBackground, type LocalRunReporter } from \"./run-reporter.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\n\nconst packageRoot = localRuntimePackageRoot(import.meta.url);\nconst bundledProject = join(packageRoot, \"training/local-runner\");\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 = join(\n resolve(process.env.XDG_CACHE_HOME ?? join(homedir(), \".cache\")),\n \"tuned-tensor-local\",\n \"uv\",\n bundledRuntimeHash,\n);\ntype BundledPythonEntrypoint =\n | \"train.py\"\n | \"evaluate.py\"\n | \"prefetch.py\"\n | \"serve.py\"\n | \"-c\";\n\n/** Build a command for the one locked Python runtime shipped with TT Local. */\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 \"--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\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): Promise<WriteStream> {\n const stream = createWriteStream(path, {\n flags: exclusive ? \"wx\" : \"w\",\n mode: 0o600,\n });\n await new Promise<void>((resolveOpen, reject) => {\n const onOpen = () => {\n stream.off(\"error\", onError);\n resolveOpen();\n };\n const onError = (error: Error) => {\n stream.off(\"open\", onOpen);\n reject(error);\n };\n stream.once(\"open\", onOpen);\n stream.once(\"error\", onError);\n });\n return stream;\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}): 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)\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\"), 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 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 { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/**\n * TT Local 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\", \"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 Local\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","import type { ComparisonReport } from \"./contracts.js\";\n\nexport interface GeneralRegressionPolicy {\n maxScoreDrop: number;\n maxPassRateDrop: number;\n}\n\nexport interface GeneralRegressionGate {\n passed: boolean;\n failures: string[];\n}\n\nexport function evaluateGeneralRegressionGate(\n comparison: ComparisonReport,\n policy: GeneralRegressionPolicy,\n): GeneralRegressionGate {\n const failures: string[] = [];\n const scoreDrop = Math.max(0, -comparison.avg_score_delta);\n const passRateDrop = Math.max(0, -comparison.pass_rate_delta);\n const tolerance = 1e-12;\n if (scoreDrop > policy.maxScoreDrop + tolerance) {\n failures.push(\n `Average score dropped ${scoreDrop.toFixed(4)}, `\n + `exceeding the ${policy.maxScoreDrop.toFixed(4)} budget.`,\n );\n }\n if (passRateDrop > policy.maxPassRateDrop + tolerance) {\n failures.push(\n `Pass rate dropped ${passRateDrop.toFixed(4)}, `\n + `exceeding the ${policy.maxPassRateDrop.toFixed(4)} budget.`,\n );\n }\n return { passed: failures.length === 0, failures };\n}\n","import { lstat, mkdir, open, readFile, readdir, rename, rm, stat } from \"node:fs/promises\";\nimport { createReadStream } from \"node:fs\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { performance } from \"node:perf_hooks\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n defaultArtifactPrefix,\n fileUri,\n assertArtifactManifest,\n ARTIFACT_WORKFLOW_LOCK_FILE,\n claimRunArtifactDirectory,\n prepareRunDirectories,\n readJson,\n resolveRunArtifacts,\n writeArtifactManifest,\n writeFileAtomic,\n writeJsonAtomic,\n type ArtifactManifestModel,\n type RunArtifacts,\n} from \"./artifacts.js\";\nimport {\n evalReportSchema,\n fineTuneRunRequestSchema,\n localRunnerConfigSchema,\n runReportSchema,\n trainingReportSchema,\n type BehaviorSpecExample,\n type EvalReport,\n type EvalSplit,\n type FineTuneRunRequest,\n type LocalRunnerConfig,\n type RunReport,\n type TrainingReport,\n} from \"./contracts.js\";\nimport {\n buildSystemMessage,\n compileSpecToJsonl,\n evaluationSuiteFromChatJsonl,\n examplesFromChatJsonl,\n examplesFromSpec,\n normalizeChatJsonlForRelocation,\n} from \"./dataset.js\";\nimport {\n INFERENCE_PROTOCOL_VERSION,\n compareEvalReports,\n deriveSampleSeed,\n evaluateExamples,\n splitSpecExamples,\n} from \"./evaluation.js\";\nimport { launchProcessTraining } from \"./process-training.js\";\nimport { assertUsableModelArtifact, localModelArtifactPath } from \"./model-registry.js\";\nimport { ProcessCancelledError } from \"./process-runner.js\";\nimport type { LocalRunReporter } from \"./run-reporter.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\nimport { createLocalStore, type LocalRunStatus, type LocalStore } from \"./store.js\";\nimport { withHuggingFaceCacheEnvironment } from \"./huggingface-cache.js\";\nimport { verifyLocalBaseModel } from \"./prefetch.js\";\nimport { evaluateGeneralRegressionGate } from \"./general-regression.js\";\n\nexport interface LocalRunResult {\n request: FineTuneRunRequest;\n report: RunReport;\n reportPath: string;\n artifactDir: string;\n}\n\nexport type LocalPipelineModel = \"base\" | { from: string };\nexport type LocalPipelineReference = { from: string };\n\nexport interface LocalPipelineStep {\n id: string;\n uses: \"train\" | \"evaluate\" | \"compare\";\n target: \"local\";\n with?: {\n model?: LocalPipelineModel;\n evaluator?: \"behavior\";\n before?: LocalPipelineReference;\n after?: LocalPipelineReference;\n };\n}\n\n/** Version-one ordered recipe executed by the local runtime. */\nexport interface LocalPipeline {\n version: 1;\n name?: string;\n steps: LocalPipelineStep[];\n}\n\nexport interface LocalPipelineOutput {\n modelArtifactUri?: string;\n report?: EvalReport;\n reportPath?: string;\n training?: TrainingReport;\n comparison?: ReturnType<typeof compareEvalReports>;\n}\n\nexport interface LocalPipelineResult {\n request: FineTuneRunRequest;\n pipeline: LocalPipeline;\n status: \"completed\" | \"stage_completed\";\n outputs: Record<string, LocalPipelineOutput>;\n report?: RunReport;\n reportPath?: string;\n artifactDir: string;\n}\n\nexport function canonicalLocalPipeline(): LocalPipeline {\n return {\n version: 1,\n name: \"local-fine-tune\",\n steps: [\n { id: \"baseline\", uses: \"evaluate\", target: \"local\", with: { model: \"base\", evaluator: \"behavior\" } },\n { id: \"train\", uses: \"train\", target: \"local\" },\n { id: \"candidate\", uses: \"evaluate\", target: \"local\", with: { model: { from: \"train.model\" }, evaluator: \"behavior\" } },\n { id: \"compare\", uses: \"compare\", target: \"local\", with: { before: { from: \"baseline.report\" }, after: { from: \"candidate.report\" } } },\n ],\n };\n}\n\nfunction referenceParts(reference: unknown): [string, string] | null {\n const value = typeof reference === \"string\"\n ? reference.replace(/^\\$/, \"\")\n : reference && typeof reference === \"object\" && !Array.isArray(reference)\n ? (reference as { from?: unknown }).from\n : undefined;\n if (typeof value !== \"string\") return null;\n const match = /^([A-Za-z][A-Za-z0-9_-]*)\\.(model|report)$/.exec(value);\n return match ? [match[1]!, match[2]!] : null;\n}\n\n/**\n * Validate every dependency before the runtime creates a store, claims an\n * artifact directory, or acquires a lock. The executor intentionally remains\n * an ordered list rather than a DAG scheduler.\n */\nexport function validateLocalPipeline(pipeline: LocalPipeline): LocalPipeline {\n if (!pipeline || pipeline.version !== 1 || !Array.isArray(pipeline.steps)) {\n throw new Error(\"Local pipeline must be a version 1 document with a steps array.\");\n }\n const seen = new Map<string, LocalPipelineStep>();\n let hasTrainStep = false;\n for (const step of pipeline.steps) {\n if (!step || typeof step.id !== \"string\" || !/^[A-Za-z][A-Za-z0-9_-]*$/.test(step.id)) {\n throw new Error(\"Each local pipeline step requires an identifier starting with a letter.\");\n }\n if (seen.has(step.id)) throw new Error(`Local pipeline step IDs must be unique: ${step.id}`);\n if (step.target !== \"local\") throw new Error(`Local pipeline step ${step.id} only supports target local.`);\n if (step.uses !== \"train\" && step.uses !== \"evaluate\" && step.uses !== \"compare\") {\n throw new Error(`Local pipeline step ${step.id} uses an unsupported component.`);\n }\n if (step.uses === \"train\") {\n if (hasTrainStep) {\n throw new Error(\"Local pipeline v1 supports at most one train step because model artifacts are run-scoped.\");\n }\n hasTrainStep = true;\n }\n if (step.uses === \"evaluate\") {\n if (step.with?.evaluator !== \"behavior\") {\n throw new Error(`Local evaluate step ${step.id} requires the behavior evaluator.`);\n }\n if (step.with?.model !== \"base\") {\n const modelReference = referenceParts(step.with?.model);\n if (!modelReference || modelReference[0] === step.id || modelReference[1] !== \"model\") {\n throw new Error(`Local evaluate step ${step.id} requires model base or { from: '<earlier-train>.model' }.`);\n }\n const producer = seen.get(modelReference[0]);\n if (!producer) throw new Error(`Local evaluate step ${step.id} must reference an earlier train step.`);\n if (producer.uses !== \"train\") throw new Error(`Local evaluate step ${step.id} model reference must name a train step.`);\n }\n }\n if (step.uses === \"compare\") {\n for (const field of [\"before\", \"after\"] as const) {\n const reportReference = referenceParts(step.with?.[field]);\n if (!reportReference || reportReference[1] !== \"report\") {\n throw new Error(`Local compare step ${step.id} requires ${field}: { from: '<earlier-evaluate>.report' }.`);\n }\n const producer = seen.get(reportReference[0]);\n if (!producer) throw new Error(`Local compare step ${step.id} must reference an earlier evaluate step.`);\n if (producer.uses !== \"evaluate\") throw new Error(`Local compare step ${step.id} report reference must name an evaluate step.`);\n }\n }\n seen.set(step.id, step);\n }\n return pipeline;\n}\n\ninterface StageMetadata {\n run_id: string;\n behavior_spec_id: string;\n user_id: string;\n request_fingerprint: string;\n runtime_fingerprint: string;\n source_fingerprint: string;\n eval_split: EvalSplit;\n eval_sample_seed: number;\n eval_examples_total: number;\n eval_examples_used: number;\n max_eval_examples: number | null;\n training_example_count: number | null;\n dataset_prebuilt: boolean;\n dataset_format: NonNullable<FineTuneRunRequest[\"dataset_prebuilt\"]>[\"format\"] | null;\n dataset_fingerprints: Record<string, string>;\n dataset_uri: string;\n base_model_for_evaluation: string;\n base_model_revision: string | null;\n base_model_fingerprint: string | null;\n system_prompt_sha256: string;\n prepared_at: string;\n}\n\ninterface PreparedRun {\n request: FineTuneRunRequest;\n artifacts: RunArtifacts;\n metadata: StageMetadata;\n examples: BehaviorSpecExample[];\n system: string;\n baseModelForEvaluation: string;\n maxEvalExamples?: number;\n generalRegression?: {\n datasetPath: string;\n datasetSha256: string;\n examples: BehaviorSpecExample[];\n system: string;\n };\n}\n\nexport async function loadJsonFile<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nexport async function loadRunRequest(path: string): Promise<FineTuneRunRequest> {\n return fineTuneRunRequestSchema.parse(await loadJsonFile<unknown>(path));\n}\n\nexport async function loadLocalRunnerConfig(path?: string): Promise<LocalRunnerConfig> {\n if (!path) return localRunnerConfigSchema.parse({});\n const configPath = resolve(path);\n const base = dirname(configPath);\n const config = localRunnerConfigSchema.parse(await loadJsonFile<unknown>(configPath));\n const configPathValue = (value: string | undefined): string | undefined => {\n if (!value) return undefined;\n if (value === \"~\") return homedir();\n if (value.startsWith(\"~/\")) return resolve(homedir(), value.slice(2));\n return resolve(base, value);\n };\n return {\n ...config,\n artifactRoot: configPathValue(config.artifactRoot)!,\n storeRoot: configPathValue(config.storeRoot),\n paths: {\n baseModel: configPathValue(config.paths.baseModel),\n modelCache: configPathValue(config.paths.modelCache),\n },\n evaluation: {\n ...config.evaluation,\n generalRegression: config.evaluation.generalRegression\n ? {\n ...config.evaluation.generalRegression,\n dataset: configPathValue(config.evaluation.generalRegression.dataset)!,\n }\n : undefined,\n },\n };\n}\n\nfunction elapsed(started: number): { ms: number; seconds: number } {\n const ms = Math.max(0, Math.round(performance.now() - started));\n return { ms, seconds: Math.round((ms / 1000) * 1000) / 1000 };\n}\n\nfunction stripFileUri(path: string): string {\n return path.replace(/^file:\\/\\//, \"\");\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction selectPrebuiltEvaluationSplit(dataset: FineTuneRunRequest[\"dataset_prebuilt\"]): EvalSplit {\n if (!dataset) throw new Error(\"dataset_prebuilt is required\");\n if (dataset.validation) return \"prebuilt_validation\";\n if (dataset.test) return \"prebuilt_test\";\n throw new Error(\"dataset_prebuilt requires a distinct validation or test split\");\n}\n\ninterface ValidatedDataset {\n trainingJsonl: string;\n trainingExampleCount: number;\n evaluationExamples: BehaviorSpecExample[];\n evalSplit: EvalSplit;\n}\n\nfunction assertMatchingDatasetSystems(\n jsonl: string,\n expectedSystem: string,\n split: string,\n): void {\n for (const [index, line] of jsonl.split(/\\r?\\n/).entries()) {\n if (!line.trim()) continue;\n const row = JSON.parse(line) as {\n messages: Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>;\n };\n const actualSystem = row.messages.find((message) => message.role === \"system\")?.content ?? \"\";\n if (actualSystem !== expectedSystem) {\n throw new Error(\n `Prebuilt ${split} row ${index + 1} system message must match the behavior spec system message.`,\n );\n }\n }\n}\n\nfunction addDryRunPlaceholders(request: unknown, dryRun: boolean): unknown {\n if (!dryRun || !request || typeof request !== \"object\" || Array.isArray(request)) return request;\n const candidate = request as Record<string, unknown>;\n if (candidate.dataset_prebuilt) return request;\n const snapshot = candidate.spec_snapshot;\n if (!snapshot || typeof snapshot !== \"object\" || Array.isArray(snapshot)) return request;\n const examples = (snapshot as Record<string, unknown>).examples;\n if (!Array.isArray(examples) || examples.length > 0) return request;\n return {\n ...candidate,\n spec_snapshot: {\n ...(snapshot as Record<string, unknown>),\n examples: [\n { input: \"Dry-run placeholder input A\", output: \"Dry-run placeholder output A\" },\n { input: \"Dry-run placeholder input B\", output: \"Dry-run placeholder output B\" },\n ],\n },\n };\n}\n\nasync function validateDatasetInputs(\n request: FineTuneRunRequest,\n config: LocalRunnerConfig,\n): Promise<ValidatedDataset> {\n const inputIdentity = (value: string) =>\n value.normalize(\"NFKC\").trim().replace(/\\s+/g, \" \").toLocaleLowerCase(\"en\");\n const evalSampleSeed = config.evaluation.sampleSeed\n ?? deriveSampleSeed(request.behavior_spec_id);\n if (!request.dataset_prebuilt) {\n const inlineExamples = examplesFromSpec(request.spec_snapshot);\n const seenInputs = new Map<string, number>();\n for (const [index, example] of inlineExamples.entries()) {\n const identity = inputIdentity(example.input);\n const previous = seenInputs.get(identity);\n if (previous !== undefined) {\n throw new Error(\n `Inline examples ${previous + 1} and ${index + 1} have duplicate inputs; `\n + \"training and held-out evaluation require distinct prompts.\",\n );\n }\n seenInputs.set(identity, index);\n }\n if (!config.dryRun && inlineExamples.length < 2) {\n throw new Error(\n \"A real local fine-tune requires at least 2 inline examples so training and evaluation use distinct data.\",\n );\n }\n const split = splitSpecExamples(inlineExamples, evalSampleSeed);\n const hasHoldout = split.holdout.length > 0;\n const trainingExamples = hasHoldout ? split.train : inlineExamples;\n const evaluationExamples = hasHoldout ? split.holdout : inlineExamples;\n return {\n trainingJsonl: compileSpecToJsonl({ ...request.spec_snapshot, examples: trainingExamples }),\n trainingExampleCount: trainingExamples.length,\n evaluationExamples,\n evalSplit: hasHoldout ? \"spec_holdout\" : \"spec_examples\",\n };\n }\n\n const dataset = request.dataset_prebuilt;\n const splitEntries = [\n [\"training\", dataset.training],\n [\"validation\", dataset.validation],\n [\"test\", dataset.test],\n ] as const;\n const normalized = new Map<string, { jsonl: string; examples: BehaviorSpecExample[] }>();\n const expectedSystem = buildSystemMessage(request.spec_snapshot);\n for (const [name, value] of splitEntries) {\n if (!value) continue;\n const path = stripFileUri(value);\n const jsonl = await normalizeChatJsonlForRelocation(path);\n assertMatchingDatasetSystems(jsonl, expectedSystem, name);\n normalized.set(name, {\n jsonl,\n examples: await examplesFromChatJsonl(path),\n });\n }\n\n const evaluationSplit = selectPrebuiltEvaluationSplit(dataset);\n const evaluationKey = evaluationSplit === \"prebuilt_validation\"\n ? \"validation\"\n : \"test\";\n const training = normalized.get(\"training\");\n const evaluationData = normalized.get(evaluationKey);\n if (!training || !evaluationData) {\n throw new Error(\"Unable to load the configured prebuilt training and evaluation datasets.\");\n }\n const trainingInputs = new Set(\n training.examples.map((example) => inputIdentity(example.input)),\n );\n for (const splitName of [\"validation\", \"test\"] as const) {\n const split = normalized.get(splitName);\n if (!split) continue;\n const splitInputs = new Set<string>();\n for (const example of split.examples) {\n const identity = inputIdentity(example.input);\n if (splitInputs.has(identity)) {\n throw new Error(\n `Prebuilt ${splitName} data contains duplicate inputs; `\n + \"evaluation prompts must be unique so metrics and comparisons remain well-defined.\",\n );\n }\n splitInputs.add(identity);\n }\n const overlap = split.examples.filter((example) =>\n trainingInputs.has(inputIdentity(example.input))\n );\n if (overlap.length > 0) {\n throw new Error(\n `Prebuilt training and ${splitName} data overlap on ${overlap.length} input(s); `\n + \"evaluation examples must be held out from training.\",\n );\n }\n }\n return {\n trainingJsonl: training.jsonl,\n trainingExampleCount: training.examples.length,\n evaluationExamples: evaluationData.examples,\n evalSplit: evaluationSplit,\n };\n}\n\n/**\n * Parses the public contracts and fully validates every dataset before a run\n * lock, store record, or artifact-directory claim is created.\n */\nexport async function validateLocalFineTuneInput(input: {\n request: unknown;\n config: unknown;\n}): Promise<{ request: FineTuneRunRequest; config: LocalRunnerConfig }> {\n const config = localRunnerConfigSchema.parse(input.config);\n const request = fineTuneRunRequestSchema.parse(addDryRunPlaceholders(input.request, config.dryRun));\n await validateDatasetInputs(request, config);\n if (config.evaluation.generalRegression) {\n await evaluationSuiteFromChatJsonl(\n config.evaluation.generalRegression.dataset,\n config.evaluation.generalRegression.systemPrompt,\n );\n }\n return { request, config };\n}\n\nfunction artifactPrefix(request: FineTuneRunRequest): string {\n return defaultArtifactPrefix({\n userId: request.user_id,\n behaviorSpecId: request.behavior_spec_id,\n runId: request.run_id,\n });\n}\n\nfunction canonicalJson(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? \"null\";\n if (Array.isArray(value)) return `[${value.map((entry) => canonicalJson(entry)).join(\",\")}]`;\n const object = value as Record<string, unknown>;\n return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(object[key])}`).join(\",\")}}`;\n}\n\nfunction hashJson(value: unknown): string {\n return createHash(\"sha256\").update(canonicalJson(value)).digest(\"hex\");\n}\n\nconst packageRoot = localRuntimePackageRoot(import.meta.url);\n\nasync function hashFileIfPresent(path: string): Promise<string | null> {\n try {\n return await hashFile(path);\n } catch {\n return null;\n }\n}\n\nasync function packageVersion(): Promise<string> {\n try {\n const parsed = JSON.parse(await readFile(resolve(packageRoot, \"package.json\"), \"utf8\")) as { version?: unknown };\n return typeof parsed.version === \"string\" ? parsed.version : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nasync function runtimeFingerprint(): Promise<string> {\n const bundledProject = resolve(packageRoot, \"training/local-runner\");\n return hashJson({\n tt_local_version: await packageVersion(),\n node_version: process.version,\n platform: process.platform,\n architecture: process.arch,\n runner_pyproject: await hashFileIfPresent(resolve(bundledProject, \"pyproject.toml\")),\n runner_uv_lock: await hashFileIfPresent(resolve(bundledProject, \"uv.lock\")),\n });\n}\n\nfunction preparedSourceFingerprint(args: {\n requestFingerprint: string;\n runtimeFingerprint: string;\n preparationConfig: unknown;\n baseModelRevision?: string;\n baseModelFingerprint?: string;\n datasetFingerprints: Record<string, string>;\n}): string {\n return hashJson({\n request_fingerprint: args.requestFingerprint,\n runtime_fingerprint: args.runtimeFingerprint,\n preparation_config: args.preparationConfig,\n base_model_revision: args.baseModelRevision ?? null,\n base_model_fingerprint: args.baseModelFingerprint ?? null,\n dataset_fingerprints: args.datasetFingerprints,\n });\n}\n\nasync function hashFile(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 datasetFingerprints(request: FineTuneRunRequest): Promise<Record<string, string>> {\n const dataset = request.dataset_prebuilt;\n const entries: Array<[string, string | undefined]> = [\n [\"training\", dataset?.training],\n [\"validation\", dataset?.validation],\n [\"test\", dataset?.test],\n ];\n const fingerprints: Record<string, string> = {};\n for (const [key, value] of entries) {\n if (!value) continue;\n const datasetPath = stripFileUri(value);\n fingerprints[key] = await hashFile(datasetPath);\n }\n return fingerprints;\n}\n\nasync function resolveBaseModelRevision(\n request: FineTuneRunRequest,\n config: LocalRunnerConfig,\n): Promise<string | undefined> {\n const explicit = request.hyperparameters.base_model_revision;\n if (explicit) return explicit;\n if (config.paths.baseModel) {\n const match = resolve(config.paths.baseModel).match(/[\\\\/]snapshots[\\\\/]([^\\\\/]+)(?:[\\\\/]|$)/);\n if (match?.[1]) return match[1];\n }\n if (!request.spec_snapshot.base_model.includes(\"/\")) return undefined;\n const repository = `models--${request.spec_snapshot.base_model.replaceAll(\"/\", \"--\")}`;\n const cacheEnvironment = withHuggingFaceCacheEnvironment(process.env, config.paths.modelCache);\n const refPath = resolve(cacheEnvironment.HF_HUB_CACHE!, repository, \"refs\", \"main\");\n try {\n const revision = (await readFile(refPath, \"utf8\")).trim();\n return revision || undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Hash a local base model while permitting Hugging Face snapshot file links. */\nexport async function fingerprintLocalBaseModel(uri: string): Promise<string> {\n const root = localModelArtifactPath(uri);\n const rootMetadata = await lstat(root);\n if (rootMetadata.isSymbolicLink()) {\n throw new Error(`Local base model path must not itself be a symbolic link: ${root}`);\n }\n if (!rootMetadata.isDirectory()) {\n throw new Error(`Local base model must be a Hugging Face snapshot directory: ${root}`);\n }\n await verifyLocalBaseModel(root);\n const files: Array<{ path: string; size_bytes: number; sha256: string }> = [];\n const visit = async (directory: string): Promise<void> => {\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const child = resolve(directory, entry.name);\n if (entry.isDirectory()) {\n await visit(child);\n continue;\n }\n const childMetadata = await stat(child);\n if (entry.isSymbolicLink() && !childMetadata.isFile()) {\n throw new Error(`Local base model contains a non-file symbolic link: ${child}`);\n }\n if (!childMetadata.isFile()) continue;\n files.push({\n path: relative(root, child).split(\"\\\\\").join(\"/\"),\n size_bytes: childMetadata.size,\n sha256: await hashFile(child),\n });\n }\n };\n await visit(root);\n files.sort((left, right) => left.path.localeCompare(right.path));\n if (files.length === 0) throw new Error(`Local base model directory is empty: ${root}`);\n return hashJson({ kind: \"directory\", files });\n}\n\nfunction statusForProgressStage(stage: string): LocalRunStatus {\n if (stage === \"evaluating_baseline\") return \"evaluating_baseline\";\n if (stage === \"evaluating_candidate\") return \"evaluating_candidate\";\n if (stage === \"training\") return \"training\";\n if (stage === \"preparing\") return \"preparing\";\n if (stage === \"reporting\") return \"reporting\";\n return \"training\";\n}\n\nasync function readStageMetadata(path: string): Promise<StageMetadata | null> {\n try {\n const metadata = await readJson<Partial<StageMetadata>>(path);\n return typeof metadata.source_fingerprint === \"string\"\n ? metadata as StageMetadata\n : null;\n } catch {\n return null;\n }\n}\n\nasync function removePrefixedArtifacts(path: string): Promise<void> {\n const directory = dirname(path);\n const prefix = `${basename(path)}.`;\n const names = await readdir(directory).catch(() => []);\n await Promise.all([\n rm(path, { force: true }),\n ...names.filter((name) => name.startsWith(prefix)).map((name) => rm(resolve(directory, name), { recursive: true, force: true })),\n ]);\n}\n\nasync function cleanupStageArtifacts(\n artifacts: RunArtifacts,\n stage: \"prepare\" | \"baseline\" | \"train\" | \"candidate\" | \"report\",\n): Promise<void> {\n const removeReport = async () => rm(artifacts.runReportJson, { force: true });\n if (stage === \"prepare\") {\n await Promise.all([\n removePrefixedArtifacts(artifacts.baselineEvalJson),\n removePrefixedArtifacts(artifacts.candidateEvalJson),\n removePrefixedArtifacts(artifacts.generalBaselineEvalJson),\n removePrefixedArtifacts(artifacts.generalCandidateEvalJson),\n rm(artifacts.trainingDir, { recursive: true, force: true }),\n removePrefixedArtifacts(artifacts.trainingReportJson),\n rm(resolve(artifacts.runDir, \"model.tar.gz\"), { force: true }),\n removeReport(),\n rm(artifacts.artifactManifestJson, { force: true }),\n ]);\n return;\n }\n if (stage === \"baseline\") {\n await Promise.all([\n removePrefixedArtifacts(artifacts.baselineEvalJson),\n removePrefixedArtifacts(artifacts.generalBaselineEvalJson),\n removeReport(),\n ]);\n return;\n }\n if (stage === \"train\") {\n await Promise.all([\n rm(artifacts.trainingDir, { recursive: true, force: true }),\n removePrefixedArtifacts(artifacts.trainingReportJson),\n rm(resolve(artifacts.runDir, \"model.tar.gz\"), { force: true }),\n removePrefixedArtifacts(artifacts.candidateEvalJson),\n removePrefixedArtifacts(artifacts.generalCandidateEvalJson),\n removeReport(),\n ]);\n await prepareRunDirectories(artifacts);\n return;\n }\n if (stage === \"candidate\") {\n await Promise.all([\n removePrefixedArtifacts(artifacts.candidateEvalJson),\n removePrefixedArtifacts(artifacts.generalCandidateEvalJson),\n removeReport(),\n ]);\n return;\n }\n await removeReport();\n}\n\nfunction manifestRelativePath(artifacts: RunArtifacts, path: string): string {\n return relative(artifacts.runDir, path).split(\"\\\\\").join(\"/\");\n}\n\nasync function verifyReusableArtifacts(\n artifacts: RunArtifacts,\n paths: string[],\n options: { verifyModel?: boolean } = {},\n): Promise<boolean> {\n if (!await pathExists(artifacts.artifactManifestJson)) return false;\n await assertArtifactManifest(artifacts.artifactManifestJson, {\n requiredPaths: paths.map((path) => manifestRelativePath(artifacts, path)),\n scopeToRequired: true,\n verifyModel: options.verifyModel,\n });\n return true;\n}\n\nasync function throwIfCancelled(store: LocalStore, request: FineTuneRunRequest): Promise<void> {\n if (await store.isCancellationRequested(request.run_id)) {\n throw new ProcessCancelledError(`Run ${request.run_id} was cancelled.`);\n }\n}\n\nasync function acquireWorkflowLock(lockPath: string, description: string): Promise<() => Promise<void>> {\n await mkdir(dirname(lockPath), { recursive: true });\n const token = randomUUID();\n for (let attempt = 0; attempt < 3; attempt += 1) {\n try {\n const handle = await open(lockPath, \"wx\", 0o600);\n try {\n await handle.writeFile(`${JSON.stringify({ token, pid: process.pid, created_at: new Date().toISOString() })}\\n`);\n } finally {\n await handle.close();\n }\n return async () => {\n try {\n const owner = JSON.parse(await readFile(lockPath, \"utf8\")) as { token?: unknown };\n if (owner.token === token) await rm(lockPath, { force: true });\n } catch {\n // The lock may already have been removed during process shutdown.\n }\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n const metadata = await stat(lockPath).catch(() => null);\n let owner: { pid?: unknown; created_at?: unknown } | null = null;\n try {\n owner = JSON.parse(await readFile(lockPath, \"utf8\")) as { pid?: unknown; created_at?: unknown };\n } catch {\n owner = null;\n }\n let ownerAlive = false;\n if (typeof owner?.pid === \"number\" && Number.isSafeInteger(owner.pid) && owner.pid > 0) {\n try {\n process.kill(owner.pid, 0);\n ownerAlive = true;\n } catch (killError) {\n ownerAlive = (killError as NodeJS.ErrnoException).code !== \"ESRCH\";\n }\n }\n const recent = metadata ? Date.now() - metadata.mtimeMs < 10_000 : true;\n if (ownerAlive || (!owner && recent)) {\n throw new Error(\n `${description} already has an active local workflow (lock: ${lockPath}).`,\n );\n }\n const stalePath = `${lockPath}.stale.${randomUUID()}`;\n try {\n await rename(lockPath, stalePath);\n await rm(stalePath, { force: true });\n } catch (renameError) {\n if ((renameError as NodeJS.ErrnoException).code !== \"ENOENT\") throw renameError;\n }\n }\n }\n throw new Error(`Unable to acquire local workflow lock for ${description}.`);\n}\n\nasync function acquireRunLock(store: LocalStore, runId: string): Promise<() => Promise<void>> {\n return acquireWorkflowLock(resolve(store.paths.runsDir, runId, \"workflow.lock\"), `Run ${runId}`);\n}\n\nasync function acquireArtifactLock(artifacts: RunArtifacts): Promise<() => Promise<void>> {\n return acquireWorkflowLock(\n join(artifacts.runDir, ARTIFACT_WORKFLOW_LOCK_FILE),\n `Artifact directory ${artifacts.runDir}`,\n );\n}\n\nfunction isDryTraining(training: TrainingReport): boolean {\n return training.metrics?.dry_run === true;\n}\n\nasync function modelManifestContract(\n prepared: PreparedRun,\n training: TrainingReport,\n): Promise<Omit<ArtifactManifestModel, \"files\"> | undefined> {\n if (isDryTraining(training) || !training.model_artifact_uri) return undefined;\n const inspection = await assertUsableModelArtifact(training.model_artifact_uri);\n const adapterWeights = inspection.adapter_weight_file_count > 0\n && inspection.adapter_weight_bytes > 0;\n if (!adapterWeights || !inspection.has_adapter_config) {\n throw new Error(\n `Local training must produce a PEFT adapter with adapter_model.safetensors or adapter_model.bin and `\n + `a non-empty adapter_config.json: ${inspection.path}`,\n );\n }\n const format = inspection.kind === \"file\" ? \"tar.gz\" : \"huggingface-directory\";\n return {\n artifact_kind: inspection.kind,\n format,\n framework: \"transformers-peft\",\n base_model: prepared.request.spec_snapshot.base_model,\n base_model_revision: prepared.metadata.base_model_revision\n ?? prepared.request.hyperparameters.base_model_revision,\n base_model_artifact_uri: training.base_model_artifact_uri,\n base_model_fingerprint: prepared.metadata.base_model_fingerprint ?? undefined,\n artifact_uri: training.model_artifact_uri,\n artifact_root: inspection.path,\n servable: true,\n };\n}\n\nasync function refreshArtifactManifest(\n prepared: PreparedRun,\n): Promise<void> {\n let model: Omit<ArtifactManifestModel, \"files\"> | undefined;\n if (await pathExists(prepared.artifacts.trainingReportJson)) {\n const training = trainingReportSchema.parse(await readJson<unknown>(prepared.artifacts.trainingReportJson));\n model = await modelManifestContract(prepared, training);\n }\n await writeArtifactManifest(prepared.artifacts, { model });\n}\n\ntype FingerprintedStage = \"baseline\" | \"train\" | \"candidate\";\n\nfunction stageOutputPath(prepared: PreparedRun, stage: FingerprintedStage): string {\n if (stage === \"baseline\") return prepared.artifacts.baselineEvalJson;\n if (stage === \"train\") return prepared.artifacts.trainingReportJson;\n return prepared.artifacts.candidateEvalJson;\n}\n\nfunction stageFingerprintPath(prepared: PreparedRun, stage: FingerprintedStage): string {\n return `${stageOutputPath(prepared, stage)}.stage.json`;\n}\n\nasync function runnerFileFingerprints(): Promise<Record<string, string | null>> {\n const project = resolve(packageRoot, \"training/local-runner\");\n const bundledSource = resolve(packageRoot, \"training/local-runner/src\");\n const pythonSources = (await readdir(bundledSource, { withFileTypes: true }))\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".py\"))\n .map((entry) => resolve(bundledSource, entry.name));\n const candidates = [...new Set([\n ...pythonSources,\n resolve(project, \"pyproject.toml\"),\n resolve(project, \"uv.lock\"),\n ])];\n const fingerprints: Record<string, string | null> = {};\n for (const path of candidates.sort()) fingerprints[path] = await hashFileIfPresent(path);\n return fingerprints;\n}\n\nasync function stageFingerprint(args: {\n stage: FingerprintedStage;\n prepared: PreparedRun;\n config: LocalRunnerConfig;\n training?: TrainingReport;\n}): Promise<string> {\n const common = {\n source_fingerprint: args.prepared.metadata.source_fingerprint,\n runtime_fingerprint: args.prepared.metadata.runtime_fingerprint,\n dry_run: args.config.dryRun,\n };\n if (args.stage === \"train\") {\n const entrypointFiles = await runnerFileFingerprints();\n return hashJson({\n ...common,\n paths: args.config.paths,\n entrypoint_files: entrypointFiles,\n });\n }\n const entrypointFiles = await runnerFileFingerprints();\n const evaluation = {\n inference_protocol_version: INFERENCE_PROTOCOL_VERSION,\n inference: args.config.evaluation.inference,\n scoring: args.config.evaluation.scoring,\n timeout_ms: args.config.evaluation.timeoutMs,\n baseline_cache: args.config.evaluation.baselineCache,\n general_regression: args.prepared.generalRegression\n ? {\n dataset_sha256: args.prepared.generalRegression.datasetSha256,\n system_prompt: args.prepared.generalRegression.system,\n }\n : null,\n model_cache: args.config.paths.modelCache,\n };\n return hashJson({\n ...common,\n evaluation,\n entrypoint_files: entrypointFiles,\n });\n}\n\nasync function writeStageFingerprint(args: {\n stage: FingerprintedStage;\n prepared: PreparedRun;\n config: LocalRunnerConfig;\n training?: TrainingReport;\n}): Promise<void> {\n await writeJsonAtomic(stageFingerprintPath(args.prepared, args.stage), {\n schema_version: 1,\n stage: args.stage,\n fingerprint: await stageFingerprint(args),\n written_at: new Date().toISOString(),\n });\n}\n\nasync function hasCurrentStageFingerprint(args: {\n stage: FingerprintedStage;\n prepared: PreparedRun;\n config: LocalRunnerConfig;\n training?: TrainingReport;\n}): Promise<boolean> {\n try {\n const record = await readJson<{ fingerprint?: unknown }>(stageFingerprintPath(args.prepared, args.stage));\n return record.fingerprint === await stageFingerprint(args);\n } catch {\n return false;\n }\n}\n\nasync function canReuseStageArtifact(args: {\n stage: FingerprintedStage;\n prepared: PreparedRun;\n config: LocalRunnerConfig;\n training?: TrainingReport;\n verifyModel?: boolean;\n additionalPaths?: string[];\n}): Promise<boolean> {\n const output = stageOutputPath(args.prepared, args.stage);\n if (!await pathExists(output) || !await hasCurrentStageFingerprint(args)) return false;\n return verifyReusableArtifacts(\n args.prepared.artifacts,\n [output, stageFingerprintPath(args.prepared, args.stage), ...(args.additionalPaths ?? [])],\n { verifyModel: args.verifyModel },\n );\n}\n\nfunction createStoreReporter(input: {\n request: FineTuneRunRequest;\n store: LocalStore;\n reporter?: LocalRunReporter;\n}): LocalRunReporter {\n return {\n verbose: input.reporter?.verbose,\n async onEvent(event) {\n const state = await input.store.updateRun({\n runId: input.request.run_id,\n status: statusForProgressStage(event.stage),\n stage: event.stage,\n message: event.message,\n details: event.details,\n });\n if (state.status === \"cancelled\") throw new ProcessCancelledError(`Run ${input.request.run_id} was cancelled.`);\n await input.reporter?.onEvent?.(event);\n },\n async onLog(log) {\n await input.reporter?.onLog?.(log);\n },\n };\n}\n\nasync function updateRun(input: {\n store: LocalStore;\n reporter?: LocalRunReporter;\n request: FineTuneRunRequest;\n status: LocalRunStatus;\n stage: string;\n message: string;\n details?: Record<string, unknown>;\n}) {\n const state = await input.store.updateRun({\n runId: input.request.run_id,\n status: input.status,\n stage: input.stage,\n message: input.message,\n details: input.details,\n });\n if (state.status === \"cancelled\") throw new ProcessCancelledError(`Run ${input.request.run_id} was cancelled.`);\n await input.reporter?.onEvent?.({\n stage: input.stage,\n status: input.status,\n message: input.message,\n details: input.details,\n });\n return state;\n}\n\nasync function ensureRunRecord(args: {\n request: FineTuneRunRequest;\n artifacts: RunArtifacts;\n store: LocalStore;\n reporter?: LocalRunReporter;\n}): Promise<void> {\n await prepareRunDirectories(args.artifacts);\n let existing: Awaited<ReturnType<LocalStore[\"getRun\"]>> | null = null;\n try {\n existing = await args.store.getRun(args.request.run_id);\n } catch (error) {\n if (!(error instanceof Error) || !error.message.startsWith(\"Run not found:\")) throw error;\n }\n if (existing) {\n if (\n existing.behavior_spec_id !== args.request.behavior_spec_id\n || existing.user_id !== args.request.user_id\n || existing.run_number !== args.request.run_number\n ) {\n throw new Error(\n `Run ${args.request.run_id} cannot be reused with different user, behavior spec, or run number identity.`,\n );\n }\n if (resolve(existing.artifact_dir) !== resolve(args.artifacts.runDir)) {\n throw new Error(\n `Run ${args.request.run_id} is already bound to artifact directory ${existing.artifact_dir}; `\n + `it cannot be resumed with ${args.artifacts.runDir}.`,\n );\n }\n } else {\n await args.store.startRun({ request: args.request, artifactDir: args.artifacts.runDir });\n await args.reporter?.onEvent?.({\n stage: \"queued\",\n status: \"queued\",\n message: \"Run queued.\",\n details: { run_id: args.request.run_id, artifact_dir: args.artifacts.runDir },\n });\n }\n}\n\nasync function computePreparedRun(args: {\n request: FineTuneRunRequest;\n config: LocalRunnerConfig;\n artifacts: RunArtifacts;\n writeArtifacts: boolean;\n}): Promise<PreparedRun> {\n const { request, config, artifacts } = args;\n const evalSampleSeed = config.evaluation.sampleSeed\n ?? deriveSampleSeed(request.behavior_spec_id);\n const dataset = await validateDatasetInputs(request, config);\n const examples = dataset.evaluationExamples;\n if (args.writeArtifacts) {\n await writeFileAtomic(artifacts.trainingJsonl, `${dataset.trainingJsonl}\\n`);\n }\n\n const system = buildSystemMessage(request.spec_snapshot);\n const baseModelForEvaluation = config.paths.baseModel ?? request.spec_snapshot.base_model;\n const maxEvalExamples = config.evaluation.maxExamples ?? request.hyperparameters.max_eval_examples;\n const evalExamplesUsed = Math.min(maxEvalExamples ?? examples.length, examples.length);\n const fingerprints = await datasetFingerprints(request);\n const generalRegressionConfig = config.evaluation.generalRegression;\n const generalRegression = generalRegressionConfig\n ? {\n datasetPath: generalRegressionConfig.dataset,\n datasetSha256: await hashFile(generalRegressionConfig.dataset),\n ...await evaluationSuiteFromChatJsonl(\n generalRegressionConfig.dataset,\n generalRegressionConfig.systemPrompt,\n ),\n }\n : undefined;\n const requestFingerprint = hashJson(request);\n const runtimeFingerprintValue = await runtimeFingerprint();\n const baseModelRevision = await resolveBaseModelRevision(request, config);\n const baseModelFingerprint = config.paths.baseModel\n ? await fingerprintLocalBaseModel(config.paths.baseModel)\n : undefined;\n const metadata: StageMetadata = {\n run_id: request.run_id,\n behavior_spec_id: request.behavior_spec_id,\n user_id: request.user_id,\n request_fingerprint: requestFingerprint,\n runtime_fingerprint: runtimeFingerprintValue,\n source_fingerprint: preparedSourceFingerprint({\n requestFingerprint,\n runtimeFingerprint: runtimeFingerprintValue,\n preparationConfig: {\n dry_run: config.dryRun,\n base_model_path: config.paths.baseModel,\n max_eval_examples: config.evaluation.maxExamples,\n eval_sample_seed: config.evaluation.sampleSeed,\n },\n baseModelRevision,\n baseModelFingerprint,\n datasetFingerprints: fingerprints,\n }),\n eval_split: dataset.evalSplit,\n eval_sample_seed: evalSampleSeed,\n eval_examples_total: examples.length,\n eval_examples_used: evalExamplesUsed,\n max_eval_examples: maxEvalExamples ?? null,\n training_example_count: dataset.trainingExampleCount,\n dataset_prebuilt: Boolean(request.dataset_prebuilt),\n dataset_format: request.dataset_prebuilt?.format ?? null,\n dataset_fingerprints: fingerprints,\n dataset_uri: fileUri(artifacts.trainingJsonl),\n base_model_for_evaluation: baseModelForEvaluation,\n base_model_revision: baseModelRevision ?? null,\n base_model_fingerprint: baseModelFingerprint ?? null,\n system_prompt_sha256: createHash(\"sha256\").update(system).digest(\"hex\"),\n prepared_at: new Date().toISOString(),\n };\n if (args.writeArtifacts) await writeJsonAtomic(artifacts.stageMetadataJson, metadata);\n return {\n request,\n artifacts,\n metadata,\n examples,\n system,\n baseModelForEvaluation,\n maxEvalExamples,\n generalRegression,\n };\n}\n\nfunction generalRegressionEvaluationConfig(config: LocalRunnerConfig): LocalRunnerConfig {\n const { maxExamples: _maxExamples, sampleSeed: _sampleSeed, ...evaluation } = config.evaluation;\n return { ...config, evaluation };\n}\n\nfunction generalRegressionRequiredPaths(\n prepared: PreparedRun,\n kind: \"baseline\" | \"candidate\",\n): string[] {\n if (!prepared.generalRegression) return [];\n return [\n kind === \"baseline\"\n ? prepared.artifacts.generalBaselineEvalJson\n : prepared.artifacts.generalCandidateEvalJson,\n ];\n}\n\nasync function prepareStage(args: {\n request: FineTuneRunRequest;\n config: LocalRunnerConfig;\n artifacts: RunArtifacts;\n store: LocalStore;\n reporter?: LocalRunReporter;\n}): Promise<PreparedRun> {\n const preparedExists = await pathExists(args.artifacts.stageMetadataJson)\n && await pathExists(args.artifacts.trainingJsonl);\n const prepared = await computePreparedRun({ ...args, writeArtifacts: false });\n await args.store.syncRunRequest(args.request, args.artifacts.runDir);\n await writeJsonAtomic(resolve(args.artifacts.runDir, \"request.json\"), args.request);\n const existingMetadata = preparedExists\n ? await readStageMetadata(args.artifacts.stageMetadataJson)\n : null;\n let canReuse = preparedExists\n && existingMetadata?.source_fingerprint === prepared.metadata.source_fingerprint;\n if (canReuse) {\n canReuse = await verifyReusableArtifacts(args.artifacts, [\n args.artifacts.stageMetadataJson,\n args.artifacts.trainingJsonl,\n ]);\n }\n if (canReuse) {\n await throwIfCancelled(args.store, args.request);\n await updateRun({\n ...args,\n status: \"preparing\",\n stage: \"preparing\",\n message: \"Reusing prepared local run artifacts.\",\n details: { artifact_dir: args.artifacts.runDir },\n });\n return prepared;\n }\n\n await updateRun({\n ...args,\n status: \"preparing\",\n stage: \"preparing\",\n message: \"Preparing local run artifacts.\",\n details: { artifact_dir: args.artifacts.runDir },\n });\n await throwIfCancelled(args.store, args.request);\n await args.store.invalidateRunOutputs(args.request.run_id, { report: true, model: true });\n await cleanupStageArtifacts(args.artifacts, \"prepare\");\n const refreshed = await computePreparedRun({ ...args, writeArtifacts: true });\n await refreshArtifactManifest(refreshed);\n return refreshed;\n}\n\nasync function runBaselineStage(args: {\n prepared: PreparedRun;\n config: LocalRunnerConfig;\n store: LocalStore;\n reporter?: LocalRunReporter;\n runReporter: LocalRunReporter;\n}): Promise<EvalReport> {\n if (\n await canReuseStageArtifact({\n stage: \"baseline\",\n prepared: args.prepared,\n config: args.config,\n additionalPaths: generalRegressionRequiredPaths(args.prepared, \"baseline\"),\n })\n ) {\n await throwIfCancelled(args.store, args.prepared.request);\n await updateRun({\n store: args.store,\n reporter: args.reporter,\n request: args.prepared.request,\n status: \"evaluating_baseline\",\n stage: \"evaluating_baseline\",\n message: \"Reusing existing baseline evaluation.\",\n details: { path: args.prepared.artifacts.baselineEvalJson },\n });\n const report = evalReportSchema.parse(await readJson<unknown>(args.prepared.artifacts.baselineEvalJson));\n await throwIfCancelled(args.store, args.prepared.request);\n return report;\n }\n await throwIfCancelled(args.store, args.prepared.request);\n await args.store.invalidateRunOutputs(args.prepared.request.run_id, { report: true });\n await cleanupStageArtifacts(args.prepared.artifacts, \"baseline\");\n await updateRun({\n store: args.store,\n reporter: args.reporter,\n request: args.prepared.request,\n status: \"evaluating_baseline\",\n stage: \"evaluating_baseline\",\n message: \"Running baseline evaluation.\",\n details: {\n examples: args.prepared.examples.length,\n eval_examples_used: args.prepared.metadata.eval_examples_used,\n eval_split: args.prepared.metadata.eval_split,\n model_id: args.prepared.baseModelForEvaluation,\n },\n });\n const report = await evaluateExamples({\n kind: \"baseline\",\n modelId: args.prepared.baseModelForEvaluation,\n baseModelId: args.prepared.baseModelForEvaluation,\n baseModelRevision: args.config.paths.baseModel\n ? undefined\n : args.prepared.metadata.base_model_revision ?? undefined,\n sourceFingerprint: args.prepared.metadata.base_model_fingerprint ?? undefined,\n examples: args.prepared.examples,\n system: args.prepared.system,\n config: args.config,\n outputPath: args.prepared.artifacts.baselineEvalJson,\n reporter: args.runReporter,\n maxExamples: args.prepared.maxEvalExamples,\n evalSplit: args.prepared.metadata.eval_split,\n sampleSeed: args.prepared.metadata.eval_sample_seed,\n shouldCancel: () => args.store.isCancellationRequested(args.prepared.request.run_id),\n });\n if (args.prepared.generalRegression) {\n await updateRun({\n store: args.store,\n reporter: args.reporter,\n request: args.prepared.request,\n status: \"evaluating_baseline\",\n stage: \"evaluating_baseline\",\n message: \"Running baseline general regression evaluation.\",\n details: {\n examples: args.prepared.generalRegression.examples.length,\n dataset: args.prepared.generalRegression.datasetPath,\n },\n });\n await evaluateExamples({\n kind: \"baseline\",\n modelId: args.prepared.baseModelForEvaluation,\n baseModelId: args.prepared.baseModelForEvaluation,\n baseModelRevision: args.config.paths.baseModel\n ? undefined\n : args.prepared.metadata.base_model_revision ?? undefined,\n sourceFingerprint: args.prepared.metadata.base_model_fingerprint ?? undefined,\n examples: args.prepared.generalRegression.examples,\n system: args.prepared.generalRegression.system,\n config: generalRegressionEvaluationConfig(args.config),\n outputPath: args.prepared.artifacts.generalBaselineEvalJson,\n reporter: args.runReporter,\n evalSplit: \"general_regression\",\n shouldCancel: () => args.store.isCancellationRequested(args.prepared.request.run_id),\n });\n }\n await throwIfCancelled(args.store, args.prepared.request);\n await writeStageFingerprint({ stage: \"baseline\", prepared: args.prepared, config: args.config });\n return report;\n}\n\nasync function runTrainStage(args: {\n prepared: PreparedRun;\n config: LocalRunnerConfig;\n store: LocalStore;\n reporter?: LocalRunReporter;\n runReporter: LocalRunReporter;\n}): Promise<TrainingReport> {\n if (\n await canReuseStageArtifact({\n stage: \"train\",\n prepared: args.prepared,\n config: args.config,\n verifyModel: true,\n })\n ) {\n await throwIfCancelled(args.store, args.prepared.request);\n await updateRun({\n store: args.store,\n reporter: args.reporter,\n request: args.prepared.request,\n status: \"training\",\n stage: \"training\",\n message: \"Reusing existing training result.\",\n details: { path: args.prepared.artifacts.trainingReportJson },\n });\n const training = trainingReportSchema.parse(await readJson<unknown>(args.prepared.artifacts.trainingReportJson));\n if (!isDryTraining(training)) {\n await modelManifestContract(args.prepared, training);\n await throwIfCancelled(args.store, args.prepared.request);\n await args.store.registerModel({\n request: args.prepared.request,\n training,\n artifactDir: args.prepared.artifacts.runDir,\n });\n }\n await throwIfCancelled(args.store, args.prepared.request);\n return training;\n }\n await throwIfCancelled(args.store, args.prepared.request);\n await args.store.invalidateRunOutputs(args.prepared.request.run_id, { report: true, model: true });\n await cleanupStageArtifacts(args.prepared.artifacts, \"train\");\n await updateRun({\n store: args.store,\n reporter: args.reporter,\n request: args.prepared.request,\n status: \"training\",\n stage: \"training\",\n message: args.config.dryRun ? \"Recording dry-run training result.\" : \"Launching local training process.\",\n details: { training_backend: \"local-uv\", dry_run: args.config.dryRun },\n });\n const training = await launchProcessTraining({\n request: args.prepared.request,\n artifacts: args.prepared.artifacts,\n config: args.config,\n baseModelRevision: args.config.paths.baseModel\n ? undefined\n : args.prepared.metadata.base_model_revision ?? undefined,\n reporter: args.runReporter,\n shouldCancel: () => args.store.isCancellationRequested(args.prepared.request.run_id),\n });\n await throwIfCancelled(args.store, args.prepared.request);\n if (!isDryTraining(training)) {\n if (!training.model_artifact_uri) {\n throw new Error(\"Training process completed without a model_artifact_uri.\");\n }\n await modelManifestContract(args.prepared, training);\n }\n await writeJsonAtomic(args.prepared.artifacts.trainingReportJson, training);\n await writeStageFingerprint({ stage: \"train\", prepared: args.prepared, config: args.config });\n await refreshArtifactManifest(args.prepared);\n await throwIfCancelled(args.store, args.prepared.request);\n if (!isDryTraining(training)) {\n await args.store.registerModel({\n request: args.prepared.request,\n training,\n artifactDir: args.prepared.artifacts.runDir,\n });\n }\n return training;\n}\n\nasync function runCandidateStage(args: {\n prepared: PreparedRun;\n config: LocalRunnerConfig;\n store: LocalStore;\n reporter?: LocalRunReporter;\n runReporter: LocalRunReporter;\n}): Promise<EvalReport> {\n let verifiedTraining: TrainingReport | undefined;\n if (await pathExists(args.prepared.artifacts.trainingReportJson)) {\n const trainingCurrent = await canReuseStageArtifact({\n stage: \"train\",\n prepared: args.prepared,\n config: args.config,\n verifyModel: true,\n });\n if (trainingCurrent) {\n verifiedTraining = trainingReportSchema.parse(\n await readJson<unknown>(args.prepared.artifacts.trainingReportJson),\n );\n }\n }\n if (\n verifiedTraining\n && await canReuseStageArtifact({\n stage: \"candidate\",\n prepared: args.prepared,\n config: args.config,\n verifyModel: true,\n additionalPaths: [\n args.prepared.artifacts.trainingReportJson,\n stageFingerprintPath(args.prepared, \"train\"),\n ...generalRegressionRequiredPaths(args.prepared, \"candidate\"),\n ],\n })\n ) {\n await throwIfCancelled(args.store, args.prepared.request);\n await updateRun({\n store: args.store,\n reporter: args.reporter,\n request: args.prepared.request,\n status: \"evaluating_candidate\",\n stage: \"evaluating_candidate\",\n message: \"Reusing existing candidate evaluation.\",\n details: { path: args.prepared.artifacts.candidateEvalJson },\n });\n const training = verifiedTraining;\n if (!isDryTraining(training)) {\n await throwIfCancelled(args.store, args.prepared.request);\n await args.store.registerModel({\n request: args.prepared.request,\n training,\n artifactDir: args.prepared.artifacts.runDir,\n });\n }\n const report = evalReportSchema.parse(await readJson<unknown>(args.prepared.artifacts.candidateEvalJson));\n await throwIfCancelled(args.store, args.prepared.request);\n return report;\n }\n if (!verifiedTraining) {\n throw new Error(\"Candidate evaluation requires current verified training output.\");\n }\n await throwIfCancelled(args.store, args.prepared.request);\n await args.store.invalidateRunOutputs(args.prepared.request.run_id, { report: true });\n await cleanupStageArtifacts(args.prepared.artifacts, \"candidate\");\n const training = verifiedTraining;\n const modelArtifact = training.model_artifact_uri;\n if (!modelArtifact) throw new Error(\"candidate stage requires a model_artifact_uri in training-report.json.\");\n if (!isDryTraining(training)) {\n await modelManifestContract(args.prepared, training);\n await refreshArtifactManifest(args.prepared);\n await throwIfCancelled(args.store, args.prepared.request);\n await args.store.registerModel({\n request: args.prepared.request,\n training,\n artifactDir: args.prepared.artifacts.runDir,\n });\n }\n await updateRun({\n store: args.store,\n reporter: args.reporter,\n request: args.prepared.request,\n status: \"evaluating_candidate\",\n stage: \"evaluating_candidate\",\n message: \"Running candidate evaluation.\",\n details: { model_artifact_uri: modelArtifact },\n });\n const report = await evaluateExamples({\n kind: \"candidate\",\n modelId: modelArtifact,\n baseModelId: args.prepared.baseModelForEvaluation,\n baseModelRevision: args.config.paths.baseModel\n ? undefined\n : args.prepared.metadata.base_model_revision ?? undefined,\n adapterPath: modelArtifact,\n examples: args.prepared.examples,\n system: args.prepared.system,\n config: args.config,\n outputPath: args.prepared.artifacts.candidateEvalJson,\n reporter: args.runReporter,\n maxExamples: args.prepared.maxEvalExamples,\n evalSplit: args.prepared.metadata.eval_split,\n sampleSeed: args.prepared.metadata.eval_sample_seed,\n shouldCancel: () => args.store.isCancellationRequested(args.prepared.request.run_id),\n });\n if (args.prepared.generalRegression) {\n await updateRun({\n store: args.store,\n reporter: args.reporter,\n request: args.prepared.request,\n status: \"evaluating_candidate\",\n stage: \"evaluating_candidate\",\n message: \"Running candidate general regression evaluation.\",\n details: {\n examples: args.prepared.generalRegression.examples.length,\n dataset: args.prepared.generalRegression.datasetPath,\n },\n });\n await evaluateExamples({\n kind: \"candidate\",\n modelId: modelArtifact,\n baseModelId: args.prepared.baseModelForEvaluation,\n baseModelRevision: args.config.paths.baseModel\n ? undefined\n : args.prepared.metadata.base_model_revision ?? undefined,\n adapterPath: modelArtifact,\n examples: args.prepared.generalRegression.examples,\n system: args.prepared.generalRegression.system,\n config: generalRegressionEvaluationConfig(args.config),\n outputPath: args.prepared.artifacts.generalCandidateEvalJson,\n reporter: args.runReporter,\n evalSplit: \"general_regression\",\n shouldCancel: () => args.store.isCancellationRequested(args.prepared.request.run_id),\n });\n }\n await throwIfCancelled(args.store, args.prepared.request);\n await writeStageFingerprint({\n stage: \"candidate\",\n prepared: args.prepared,\n config: args.config,\n training,\n });\n return report;\n}\n\nasync function runReportStage(args: {\n prepared: PreparedRun;\n config: LocalRunnerConfig;\n store: LocalStore;\n reporter?: LocalRunReporter;\n startedAt: string;\n startedPerf: number;\n}): Promise<RunReport> {\n if (!await pathExists(args.prepared.artifacts.baselineEvalJson)) {\n throw new Error(\"Run reporting requires baseline-eval.json.\");\n }\n if (!await pathExists(args.prepared.artifacts.candidateEvalJson)) {\n throw new Error(\"Run reporting requires candidate-eval.json.\");\n }\n if (!await pathExists(args.prepared.artifacts.trainingReportJson)) {\n throw new Error(\"Run reporting requires training-report.json.\");\n }\n if (\n args.prepared.generalRegression\n && (\n !await pathExists(args.prepared.artifacts.generalBaselineEvalJson)\n || !await pathExists(args.prepared.artifacts.generalCandidateEvalJson)\n )\n ) {\n throw new Error(\"Run reporting requires both general regression evaluations.\");\n }\n const currentTraining = await canReuseStageArtifact({\n stage: \"train\",\n prepared: args.prepared,\n config: args.config,\n verifyModel: true,\n });\n const currentBaseline = await canReuseStageArtifact({\n stage: \"baseline\",\n prepared: args.prepared,\n config: args.config,\n additionalPaths: generalRegressionRequiredPaths(args.prepared, \"baseline\"),\n });\n const currentCandidate = await canReuseStageArtifact({\n stage: \"candidate\",\n prepared: args.prepared,\n config: args.config,\n verifyModel: true,\n additionalPaths: [\n args.prepared.artifacts.trainingReportJson,\n stageFingerprintPath(args.prepared, \"train\"),\n ...generalRegressionRequiredPaths(args.prepared, \"candidate\"),\n ],\n });\n if (!currentTraining || !currentBaseline || !currentCandidate) {\n throw new Error(\"report stage inputs are stale for the current request/config. Re-run baseline, train, and candidate as needed.\");\n }\n await verifyReusableArtifacts(args.prepared.artifacts, [\n args.prepared.artifacts.baselineEvalJson,\n stageFingerprintPath(args.prepared, \"baseline\"),\n args.prepared.artifacts.candidateEvalJson,\n stageFingerprintPath(args.prepared, \"candidate\"),\n args.prepared.artifacts.trainingReportJson,\n stageFingerprintPath(args.prepared, \"train\"),\n ...generalRegressionRequiredPaths(args.prepared, \"baseline\"),\n ...generalRegressionRequiredPaths(args.prepared, \"candidate\"),\n ], { verifyModel: true });\n await throwIfCancelled(args.store, args.prepared.request);\n await args.store.invalidateRunOutputs(args.prepared.request.run_id, { report: true });\n await cleanupStageArtifacts(args.prepared.artifacts, \"report\");\n await updateRun({\n store: args.store,\n reporter: args.reporter,\n request: args.prepared.request,\n status: \"reporting\",\n stage: \"reporting\",\n message: \"Writing run report.\",\n details: { report_path: args.prepared.artifacts.runReportJson },\n });\n const baseline = evalReportSchema.parse(await readJson<unknown>(args.prepared.artifacts.baselineEvalJson));\n const candidate = evalReportSchema.parse(await readJson<unknown>(args.prepared.artifacts.candidateEvalJson));\n const training = trainingReportSchema.parse(await readJson<unknown>(args.prepared.artifacts.trainingReportJson));\n const comparison = compareEvalReports(baseline, candidate);\n let generalRegression: RunReport[\"general_regression\"];\n if (args.prepared.generalRegression) {\n const generalBaseline = evalReportSchema.parse(\n await readJson<unknown>(args.prepared.artifacts.generalBaselineEvalJson),\n );\n const generalCandidate = evalReportSchema.parse(\n await readJson<unknown>(args.prepared.artifacts.generalCandidateEvalJson),\n );\n const generalComparison = compareEvalReports(generalBaseline, generalCandidate);\n const policy = args.config.evaluation.generalRegression!;\n const gate = evaluateGeneralRegressionGate(generalComparison, policy);\n generalRegression = {\n dataset_uri: fileUri(args.prepared.generalRegression.datasetPath),\n dataset_sha256: args.prepared.generalRegression.datasetSha256,\n baseline: generalBaseline,\n candidate: generalCandidate,\n comparison: generalComparison,\n policy: {\n max_score_drop: policy.maxScoreDrop,\n max_pass_rate_drop: policy.maxPassRateDrop,\n },\n passed: gate.passed,\n failures: gate.failures,\n };\n }\n const completedAt = new Date().toISOString();\n const duration = elapsed(args.startedPerf);\n const report = runReportSchema.parse({\n run_id: args.prepared.request.run_id,\n behavior_spec_id: args.prepared.request.behavior_spec_id,\n user_id: args.prepared.request.user_id,\n run_number: args.prepared.request.run_number,\n base_model: args.prepared.request.spec_snapshot.base_model,\n fine_tuned_model_id: training.model_artifact_uri ?? training.training_job_name,\n status: \"completed\",\n baseline,\n candidate,\n comparison,\n general_regression: generalRegression,\n training,\n artifact_uris: {\n dataset: fileUri(args.prepared.artifacts.trainingJsonl),\n baseline_eval: fileUri(args.prepared.artifacts.baselineEvalJson),\n candidate_eval: fileUri(args.prepared.artifacts.candidateEvalJson),\n general_baseline_eval: generalRegression\n ? fileUri(args.prepared.artifacts.generalBaselineEvalJson)\n : undefined,\n general_candidate_eval: generalRegression\n ? fileUri(args.prepared.artifacts.generalCandidateEvalJson)\n : undefined,\n report: fileUri(args.prepared.artifacts.runReportJson),\n },\n run_metadata: {\n base_model: args.prepared.request.spec_snapshot.base_model,\n fine_tuned_model_id: training.model_artifact_uri ?? training.training_job_name,\n dataset_prebuilt: args.prepared.metadata.dataset_prebuilt,\n dataset_format: args.prepared.metadata.dataset_format,\n dataset_uri: fileUri(args.prepared.artifacts.trainingJsonl),\n spec_example_count: args.prepared.request.spec_snapshot.examples.length,\n training_example_count: args.prepared.metadata.training_example_count,\n eval_examples_total: baseline.eval_examples_total,\n eval_examples_used: baseline.eval_examples_used,\n eval_split: baseline.eval_split,\n eval_sample_seed: baseline.eval_sample_seed ?? null,\n started_at: args.startedAt,\n completed_at: completedAt,\n elapsed_ms: duration.ms,\n elapsed_seconds: duration.seconds,\n },\n created_at: completedAt,\n });\n await writeJsonAtomic(args.prepared.artifacts.runReportJson, report);\n await refreshArtifactManifest(args.prepared);\n await throwIfCancelled(args.store, args.prepared.request);\n const completedState = await args.store.completeRun(\n report,\n args.prepared.artifacts.runDir,\n args.prepared.artifacts.runReportJson,\n );\n if (completedState.status === \"cancelled\") {\n throw new ProcessCancelledError(`Run ${args.prepared.request.run_id} was cancelled.`);\n }\n await args.reporter?.onEvent?.({\n stage: \"completed\",\n status: \"completed\",\n message: \"Run completed successfully.\",\n details: {\n report_path: args.prepared.artifacts.runReportJson,\n ...(!isDryTraining(training) ? { model_id: `local-${args.prepared.request.run_id}` } : {}),\n avg_score_delta: comparison.avg_score_delta,\n general_regression_passed: generalRegression?.passed,\n elapsed_seconds: duration.seconds,\n },\n });\n return report;\n}\n\nexport async function runLocalPipeline(input: {\n request: FineTuneRunRequest;\n config: LocalRunnerConfig;\n pipeline: LocalPipeline;\n reporter?: LocalRunReporter;\n}): Promise<LocalPipelineResult> {\n const pipeline = validateLocalPipeline(input.pipeline);\n const validated = await validateLocalFineTuneInput({\n request: input.request,\n config: input.config,\n });\n input = { ...input, ...validated };\n const startedPerf = performance.now();\n const startedAt = new Date().toISOString();\n const prefix = artifactPrefix(input.request);\n const artifacts = resolveRunArtifacts({ artifactRoot: input.config.artifactRoot, prefix });\n const store = createLocalStore(input.config.storeRoot);\n const releaseRunLock = await acquireRunLock(store, input.request.run_id);\n let releaseArtifactLock: (() => Promise<void>) | undefined;\n try {\n await claimRunArtifactDirectory({\n artifacts,\n runId: input.request.run_id,\n userId: input.request.user_id,\n behaviorSpecId: input.request.behavior_spec_id,\n });\n releaseArtifactLock = await acquireArtifactLock(artifacts);\n await ensureRunRecord({ request: input.request, artifacts, store, reporter: input.reporter });\n const runReporter = createStoreReporter({ request: input.request, store, reporter: input.reporter });\n let prepared: PreparedRun | undefined;\n\n try {\n await throwIfCancelled(store, input.request);\n prepared = await prepareStage({\n request: input.request,\n config: input.config,\n artifacts,\n store,\n reporter: input.reporter,\n });\n const outputs: Record<string, LocalPipelineOutput> = {};\n for (const step of pipeline.steps) {\n await throwIfCancelled(store, input.request);\n if (step.uses === \"train\") {\n const training = await runTrainStage({ prepared, config: input.config, store, reporter: input.reporter, runReporter });\n outputs[step.id] = { training, modelArtifactUri: training.model_artifact_uri };\n await refreshArtifactManifest(prepared);\n continue;\n }\n if (step.uses === \"evaluate\") {\n const isBase = step.with!.model === \"base\";\n const report = isBase\n ? await runBaselineStage({ prepared, config: input.config, store, reporter: input.reporter, runReporter })\n : await runCandidateStage({ prepared, config: input.config, store, reporter: input.reporter, runReporter });\n const reportPath = join(artifacts.runDir, \"evaluations\", `${step.id}.json`);\n await writeJsonAtomic(reportPath, { ...report, artifact_uri: fileUri(reportPath) });\n outputs[step.id] = { report: { ...report, artifact_uri: fileUri(reportPath) }, reportPath };\n await refreshArtifactManifest(prepared);\n continue;\n }\n const before = outputs[referenceParts(step.with!.before)![0]]?.report;\n const after = outputs[referenceParts(step.with!.after)![0]]?.report;\n if (!before || !after) throw new Error(`Local compare step ${step.id} is missing validated evaluation outputs.`);\n outputs[step.id] = { comparison: compareEvalReports(before, after) };\n }\n const compatibilityRecipe = pipeline.steps.length === 4\n && pipeline.steps.map((step) => `${step.id}:${step.uses}`).join(\",\")\n === \"baseline:evaluate,train:train,candidate:evaluate,compare:compare\";\n if (compatibilityRecipe) {\n const report = await runReportStage({\n prepared,\n config: input.config,\n store,\n reporter: input.reporter,\n startedAt,\n startedPerf,\n });\n return { request: input.request, pipeline, status: \"completed\", outputs, report, reportPath: artifacts.runReportJson, artifactDir: artifacts.runDir };\n }\n await store.updateRun({\n runId: input.request.run_id,\n status: \"stage_completed\",\n stage: \"stage_completed\",\n message: \"Pipeline steps completed; no full compatibility report was requested.\",\n details: { completed_steps: pipeline.steps.map((step) => step.id) },\n });\n await input.reporter?.onEvent?.({\n stage: \"stage_completed\",\n status: \"stage_completed\",\n message: \"Pipeline steps completed without a full compatibility report.\",\n });\n return { request: input.request, pipeline, status: \"stage_completed\", outputs, artifactDir: artifacts.runDir };\n } catch (error) {\n const cancelled = error instanceof ProcessCancelledError\n || await store.isCancellationRequested(input.request.run_id).catch(() => false);\n if (cancelled) {\n const state = await store.getRun(input.request.run_id).catch(() => null);\n if (state?.status !== \"cancelled\") await store.cancelRun(input.request.run_id).catch(() => undefined);\n await store.finalizeCancellation(input.request.run_id).catch(() => undefined);\n await input.reporter?.onEvent?.({\n stage: \"cancelled\",\n status: \"cancelled\",\n message: \"Run cancelled.\",\n });\n } else {\n await store.failRun(input.request.run_id, error instanceof Error ? error.message : String(error)).catch(() => undefined);\n await input.reporter?.onEvent?.({\n stage: \"failed\",\n status: \"failed\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n throw error;\n }\n } finally {\n await releaseArtifactLock?.();\n await releaseRunLock();\n }\n}\n\n/** Backwards-compatible one-command entry point for the canonical v1 recipe. */\nexport async function runLocalFineTune(input: {\n request: FineTuneRunRequest;\n config: LocalRunnerConfig;\n reporter?: LocalRunReporter;\n}): Promise<LocalRunResult> {\n const result = await runLocalPipeline({ ...input, pipeline: canonicalLocalPipeline() });\n if (!result.report || !result.reportPath) {\n throw new Error(\"Canonical local pipeline completed without a compatibility report.\");\n }\n return {\n request: result.request,\n report: result.report,\n reportPath: result.reportPath,\n artifactDir: result.artifactDir,\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n evalReportSchema,\n type BehaviorSpecExample,\n type EvalExampleResult,\n type EvalReport,\n type EvalSplit,\n type LocalRunnerConfig,\n} from \"./contracts.js\";\nimport { fileUri, writeJson } from \"./artifacts.js\";\nimport {\n buildBundledPythonCommand,\n runLoggedProcess,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\nimport type { LocalRunReporter } from \"./run-reporter.js\";\nimport { defaultLocalHome } from \"./store.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\nimport {\n minimalMachineLearningEnvironment,\n withOfflineHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\n\nfunction normalize(value: string): string {\n return value.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nfunction exactScore(expected: string, actual: string): number {\n return normalize(expected) === normalize(actual) ? 1 : 0;\n}\n\n/** Cheap deterministic free-text similarity reported beside exact match. */\nexport function tokenF1(expected: string, actual: string): number {\n const tokenize = (value: string): string[] =>\n normalize(value).match(/[\\p{L}\\p{N}]+/gu) ?? [];\n const expectedTokens = tokenize(expected);\n const actualTokens = tokenize(actual);\n if (expectedTokens.length === 0 || actualTokens.length === 0) {\n return expectedTokens.length === actualTokens.length ? 1 : 0;\n }\n const counts = new Map<string, number>();\n for (const token of expectedTokens) {\n counts.set(token, (counts.get(token) ?? 0) + 1);\n }\n let overlap = 0;\n for (const token of actualTokens) {\n const remaining = counts.get(token) ?? 0;\n if (remaining > 0) {\n overlap += 1;\n counts.set(token, remaining - 1);\n }\n }\n if (overlap === 0) return 0;\n const precision = overlap / actualTokens.length;\n const recall = overlap / expectedTokens.length;\n return 2 * precision * recall / (precision + recall);\n}\n\n/** Deterministic 32-bit FNV-1a seed. */\nexport function deriveSampleSeed(value: string): number {\n let hash = 0x811c9dc5;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return hash >>> 0;\n}\n\nfunction mulberry32(seed: number): () => number {\n let state = seed >>> 0;\n return () => {\n state = (state + 0x6d2b79f5) | 0;\n let value = Math.imul(state ^ (state >>> 15), 1 | state);\n value = (value + Math.imul(value ^ (value >>> 7), 61 | value)) ^ value;\n return ((value ^ (value >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport function sampleExamples<T>(examples: T[], count: number, seed: number): T[] {\n if (count >= examples.length) return examples;\n const indices = examples.map((_, index) => index);\n const random = mulberry32(seed);\n for (let index = indices.length - 1; index > 0; index -= 1) {\n const swap = Math.floor(random() * (index + 1));\n [indices[index], indices[swap]] = [indices[swap], indices[index]];\n }\n return indices\n .slice(0, count)\n .sort((left, right) => left - right)\n .map((index) => examples[index]);\n}\n\n/**\n * Inline specs get a deterministic holdout. A real run with fewer than two\n * examples is rejected by the shared validator before this function is used.\n */\nexport function splitSpecExamples<T>(\n examples: T[],\n seed: number,\n holdoutRatio = 0.2,\n): { train: T[]; holdout: T[] } {\n if (examples.length < 2) return { train: examples, holdout: [] };\n const holdoutCount = Math.min(\n examples.length - 1,\n Math.max(1, Math.round(examples.length * holdoutRatio)),\n );\n const indices = examples.map((_, index) => index);\n const random = mulberry32(seed);\n for (let index = indices.length - 1; index > 0; index -= 1) {\n const swap = Math.floor(random() * (index + 1));\n [indices[index], indices[swap]] = [indices[swap], indices[index]];\n }\n const heldOut = new Set(indices.slice(0, holdoutCount));\n return {\n train: examples.filter((_, index) => !heldOut.has(index)),\n holdout: examples.filter((_, index) => heldOut.has(index)),\n };\n}\n\nfunction extractJsonObject(value: string): Record<string, unknown> | null {\n const trimmed = value.trim();\n const candidates = [trimmed];\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n if (fenced?.[1]) candidates.push(fenced[1].trim());\n const objectLike = trimmed.match(/\\{[\\s\\S]*\\}/);\n if (objectLike?.[0]) candidates.push(objectLike[0]);\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // Try the next representation.\n }\n }\n return null;\n}\n\nfunction canonicalJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalJson);\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, canonicalJson(item)]),\n );\n }\n return value;\n}\n\ninterface JsonFieldScore {\n score: number;\n passed: boolean;\n reasoning: string;\n actualJsonValid: boolean;\n schemaMatch: boolean;\n fields: string[];\n fieldResults: Record<string, boolean>;\n}\n\nfunction scoreJsonFields(\n expected: string,\n actual: string,\n configuredFields?: string[],\n): JsonFieldScore {\n const expectedJson = extractJsonObject(expected);\n const actualJson = extractJsonObject(actual);\n if (!expectedJson) {\n const score = exactScore(expected, actual);\n return {\n score,\n passed: score === 1,\n reasoning: \"Expected output is not JSON; used normalized exact match.\",\n actualJsonValid: Boolean(actualJson),\n schemaMatch: false,\n fields: [],\n fieldResults: {},\n };\n }\n const fields = configuredFields?.length\n ? configuredFields\n : Object.keys(expectedJson).sort();\n const expectedKeys = Object.keys(expectedJson).sort();\n const actualKeys = actualJson ? Object.keys(actualJson).sort() : [];\n const schemaMatch = Boolean(actualJson)\n && expectedKeys.length === actualKeys.length\n && expectedKeys.every((key, index) => key === actualKeys[index]);\n const fieldResults: Record<string, boolean> = {};\n for (const field of fields) {\n fieldResults[field] = Object.prototype.hasOwnProperty.call(expectedJson, field)\n && Boolean(actualJson)\n && JSON.stringify(canonicalJson(expectedJson[field]))\n === JSON.stringify(canonicalJson(actualJson?.[field]));\n }\n const correct = Object.values(fieldResults).filter(Boolean).length;\n const score = fields.length > 0 ? correct / fields.length : 0;\n return {\n score,\n passed: fields.length > 0 && correct === fields.length,\n reasoning: actualJson\n ? `JSON field score: ${correct}/${fields.length} fields matched.`\n : \"Actual output is not a JSON object.\",\n actualJsonValid: Boolean(actualJson),\n schemaMatch,\n fields,\n fieldResults,\n };\n}\n\nfunction aggregateJsonFieldMetrics(scores: JsonFieldScore[], total: number) {\n if (total === 0 || scores.length === 0) return undefined;\n const fields = [...new Set(scores.flatMap((score) => score.fields))].sort();\n const field_accuracy: Record<string, {\n correct: number;\n total: number;\n accuracy: number;\n }> = {};\n for (const field of fields) {\n const applicable = scores.filter((score) => score.fields.includes(field));\n const correct = applicable.filter((score) => score.fieldResults[field]).length;\n field_accuracy[field] = {\n correct,\n total: applicable.length,\n accuracy: applicable.length > 0 ? correct / applicable.length : 0,\n };\n }\n const validJsonCount = scores.filter((score) => score.actualJsonValid).length;\n const schemaMatchCount = scores.filter((score) => score.schemaMatch).length;\n const allFieldsMatchCount = scores.filter((score) => score.passed).length;\n return {\n fields,\n valid_json_count: validJsonCount,\n valid_json_rate: validJsonCount / total,\n schema_match_count: schemaMatchCount,\n schema_match_rate: schemaMatchCount / total,\n all_fields_match_count: allFieldsMatchCount,\n all_fields_match_rate: allFieldsMatchCount / total,\n field_accuracy,\n };\n}\n\nfunction fileUriToPath(value?: string): string | undefined {\n if (!value) return undefined;\n return value.startsWith(\"file://\") ? value.slice(\"file://\".length) : value;\n}\n\nexport const INFERENCE_PROTOCOL_VERSION = 2;\n\ninterface BatchInferenceResult {\n model_id?: string;\n base_model?: string;\n adapter_path?: string;\n generation_config?: Record<string, unknown>;\n results: Array<{ id: string; actual: string; latency_ms: number }>;\n}\n\nfunction parseBatchInferenceResult(\n value: unknown,\n expectedIds: string[],\n): BatchInferenceResult {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Transformers inference output must be a JSON object\");\n }\n const output = value as Record<string, unknown>;\n if (!Array.isArray(output.results) || output.results.length !== expectedIds.length) {\n throw new Error(\n `Transformers inference returned ${Array.isArray(output.results) ? output.results.length : 0} `\n + `predictions; expected ${expectedIds.length}`,\n );\n }\n const expected = new Set(expectedIds);\n const byId = new Map<string, BatchInferenceResult[\"results\"][number]>();\n for (const [index, entry] of output.results.entries()) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(`Transformers prediction ${index} must be an object`);\n }\n const prediction = entry as Record<string, unknown>;\n if (typeof prediction.id !== \"string\" || !expected.has(prediction.id)) {\n throw new Error(`Transformers prediction ${index} has an unknown or missing id`);\n }\n if (byId.has(prediction.id)) {\n throw new Error(`Transformers inference returned duplicate id ${prediction.id}`);\n }\n if (typeof prediction.actual !== \"string\") {\n throw new Error(`Transformers prediction ${index} must include string actual`);\n }\n if (\n typeof prediction.latency_ms !== \"number\"\n || !Number.isInteger(prediction.latency_ms)\n || prediction.latency_ms < 0\n ) {\n throw new Error(\n `Transformers prediction ${index} must include non-negative integer latency_ms`,\n );\n }\n byId.set(prediction.id, {\n id: prediction.id,\n actual: prediction.actual,\n latency_ms: prediction.latency_ms,\n });\n }\n const optionalString = (key: string) =>\n typeof output[key] === \"string\" ? output[key] as string : undefined;\n return {\n ...(optionalString(\"model_id\") ? { model_id: optionalString(\"model_id\") } : {}),\n ...(optionalString(\"base_model\") ? { base_model: optionalString(\"base_model\") } : {}),\n ...(optionalString(\"adapter_path\") ? { adapter_path: optionalString(\"adapter_path\") } : {}),\n ...(output.generation_config\n && typeof output.generation_config === \"object\"\n && !Array.isArray(output.generation_config)\n ? { generation_config: output.generation_config as Record<string, unknown> }\n : {}),\n results: expectedIds.map((id) => byId.get(id)!),\n };\n}\n\nasync function runTransformersInference(args: {\n kind: \"baseline\" | \"candidate\";\n modelId: string;\n baseModelId: string;\n baseModelRevision?: string;\n adapterPath?: string;\n examples: BehaviorSpecExample[];\n system: string;\n config: LocalRunnerConfig;\n outputPath: string;\n reporter?: LocalRunReporter;\n shouldCancel?: () => boolean | Promise<boolean>;\n}): Promise<BatchInferenceResult> {\n const inputPath = `${args.outputPath}.inference-input.json`;\n const outputPath = `${args.outputPath}.inference-output.json`;\n const logPath = `${args.outputPath}.inference.log`;\n await mkdir(dirname(inputPath), { recursive: true });\n await writeFile(inputPath, `${JSON.stringify({\n protocol_version: INFERENCE_PROTOCOL_VERSION,\n kind: args.kind,\n model_id: args.modelId,\n base_model: args.baseModelId,\n base_model_revision: args.baseModelRevision,\n model_loader: \"causal_lm\",\n adapter_path: fileUriToPath(args.adapterPath),\n system: args.system,\n examples: args.examples.map((example, index) => ({\n id: String(index),\n input: example.input,\n })),\n model_cache: args.config.paths.modelCache\n ? resolve(args.config.paths.modelCache)\n : undefined,\n trust_remote_code: false,\n device: args.config.evaluation.inference.device,\n generation: {\n max_new_tokens: args.config.evaluation.inference.maxNewTokens,\n temperature: args.config.evaluation.inference.temperature,\n top_p: args.config.evaluation.inference.topP,\n },\n }, null, 2)}\\n`, \"utf8\");\n await rm(outputPath, { force: true });\n const entrypoint = buildBundledPythonCommand(\n \"evaluate.py\",\n [\"--input\", inputPath, \"--output\", outputPath],\n );\n await args.reporter?.onEvent?.({\n stage: `evaluating_${args.kind}`,\n status: \"running\",\n message: `Starting ${args.kind} Transformers inference.`,\n details: {\n model_id: args.modelId,\n examples: args.examples.length,\n command: entrypoint.displayCommand,\n log_path: logPath,\n },\n });\n const result = await runLoggedProcess({\n command: entrypoint.command,\n commandArgs: entrypoint.commandArgs,\n env: withBundledPythonEnvironment(\n withOfflineHuggingFaceCacheEnvironment(\n minimalMachineLearningEnvironment(process.env),\n args.config.paths.modelCache,\n ),\n ),\n logPath,\n timeoutMs: args.config.evaluation.timeoutMs,\n timeoutMessage:\n `Transformers inference timed out after ${args.config.evaluation.timeoutMs}ms`,\n reporter: args.reporter,\n stage: `evaluating_${args.kind}`,\n shouldCancel: args.shouldCancel,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Transformers inference exited ${result.exitCode}: ${result.stderr.slice(0, 1000)}`,\n );\n }\n let output: unknown;\n try {\n output = JSON.parse(await readFile(outputPath, \"utf8\"));\n } catch (error) {\n throw new Error(\n `Transformers inference did not write valid JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return parseBatchInferenceResult(\n output,\n args.examples.map((_, index) => String(index)),\n );\n}\n\n/**\n * Deterministic local scoring needs no network credentials. This function is\n * kept as the shared preflight hook used by validate, doctor, and run.\n */\nexport function assertEvaluationScoringReady(config: LocalRunnerConfig): void {\n if (\n config.evaluation.scoring.mode === \"json_fields\"\n && config.evaluation.scoring.fields?.some((field) => !field.trim())\n ) {\n throw new Error(\"evaluation.scoring.fields must contain non-empty field names\");\n }\n}\n\nexport function baselineCacheKey(args: {\n modelId: string;\n baseModelRevision?: string;\n sourceFingerprint?: string;\n system: string;\n examples: BehaviorSpecExample[];\n evalExamplesTotal: number;\n evalSplit?: EvalSplit;\n evalSampleSeed?: number | null;\n config: LocalRunnerConfig;\n packageVersion: string;\n}): string {\n return createHash(\"sha256\").update(JSON.stringify({\n v: 6,\n inference_protocol_version: INFERENCE_PROTOCOL_VERSION,\n package_version: args.packageVersion,\n model_id: args.modelId,\n base_model_revision: args.baseModelRevision ?? null,\n source_fingerprint: args.sourceFingerprint ?? null,\n system: args.system,\n examples: args.examples,\n eval_examples_total: args.evalExamplesTotal,\n eval_split: args.evalSplit ?? null,\n eval_sample_seed: args.evalSampleSeed ?? null,\n inference: args.config.evaluation.inference,\n scoring: args.config.evaluation.scoring,\n })).digest(\"hex\");\n}\n\nfunction baselineInputsAreStable(args: {\n baseModelRevision?: string;\n sourceFingerprint?: string;\n config: LocalRunnerConfig;\n}): boolean {\n return args.config.paths.baseModel\n ? Boolean(args.sourceFingerprint)\n : Boolean(args.baseModelRevision);\n}\n\nfunction baselineCachePath(config: LocalRunnerConfig, key: string): string {\n const root = config.storeRoot ? resolve(config.storeRoot) : defaultLocalHome();\n return join(root, \"cache\", \"baseline-evals\", `${key}.json`);\n}\n\nasync function readBaselineCache(path: string): Promise<EvalReport | null> {\n try {\n return evalReportSchema.parse(JSON.parse(await readFile(path, \"utf8\")));\n } catch {\n return null;\n }\n}\n\nlet cachedPackageVersion: string | null = null;\n\nasync function packageVersion(): Promise<string> {\n if (cachedPackageVersion !== null) return cachedPackageVersion;\n try {\n const raw = await readFile(resolve(localRuntimePackageRoot(import.meta.url), \"package.json\"), \"utf8\");\n cachedPackageVersion = String(\n (JSON.parse(raw) as { version?: unknown }).version ?? \"unknown\",\n );\n } catch {\n cachedPackageVersion = \"unknown\";\n }\n return cachedPackageVersion;\n}\n\ninterface GeneratedEvalResult {\n prompt: string;\n expected: string;\n actual: string;\n latency_ms: number;\n}\n\nasync function scoreGenerated(args: {\n kind: \"baseline\" | \"candidate\";\n modelId: string;\n generated: GeneratedEvalResult[];\n evalExamplesTotal: number;\n config: LocalRunnerConfig;\n outputPath: string;\n inferenceProvider: \"none\" | \"transformers\";\n evalSplit?: EvalSplit;\n evalSampleSeed?: number | null;\n generationConfig?: Record<string, unknown>;\n logUri?: string;\n}): Promise<EvalReport> {\n const jsonScores: JsonFieldScore[] = [];\n const results: EvalExampleResult[] = args.generated.map((generated) => {\n const json = args.config.evaluation.scoring.mode === \"json_fields\"\n ? scoreJsonFields(\n generated.expected,\n generated.actual,\n args.config.evaluation.scoring.fields,\n )\n : null;\n if (json) jsonScores.push(json);\n const score = json?.score ?? exactScore(generated.expected, generated.actual);\n return {\n prompt: generated.prompt,\n expected: generated.expected,\n actual: generated.actual,\n passed: json?.passed ?? score === 1,\n score,\n reasoning: json?.reasoning ?? (\n args.inferenceProvider === \"none\"\n ? \"Dry run: model inference was not executed.\"\n : \"Scored by normalized exact match.\"\n ),\n latency_ms: generated.latency_ms,\n scored_by: json\n ? \"json_fields\"\n : args.inferenceProvider === \"none\"\n ? \"heuristic\"\n : \"exact_match\",\n };\n });\n const total = results.length;\n const mean = (values: number[]) =>\n values.length > 0\n ? values.reduce((sum, value) => sum + value, 0) / values.length\n : 0;\n const report = evalReportSchema.parse({\n kind: args.kind,\n model_id: args.modelId,\n total,\n eval_examples_total: args.evalExamplesTotal,\n eval_examples_used: total,\n eval_truncated: args.evalExamplesTotal > total,\n eval_split: args.evalSplit,\n eval_sample_seed: args.evalSampleSeed ?? null,\n avg_score: mean(results.map((result) => result.score)),\n pass_rate: mean(results.map((result) => result.passed ? 1 : 0)),\n exact_match_rate: mean(\n results.map((result) => exactScore(result.expected, result.actual)),\n ),\n avg_token_f1: mean(\n results.map((result) => tokenF1(result.expected, result.actual)),\n ),\n avg_latency_ms: Math.round(mean(results.map((result) => result.latency_ms))),\n results,\n artifact_uri: fileUri(args.outputPath),\n scoring_method: args.config.evaluation.scoring.mode === \"json_fields\"\n ? \"json_fields\"\n : args.inferenceProvider === \"none\"\n ? \"heuristic\"\n : \"exact_match\",\n inference_provider: args.inferenceProvider,\n scoring_mode: args.config.evaluation.scoring.mode,\n json_field_metrics: args.config.evaluation.scoring.mode === \"json_fields\"\n ? aggregateJsonFieldMetrics(jsonScores, total)\n : undefined,\n generation_config: args.generationConfig,\n log_uri: args.logUri,\n });\n await writeJson(args.outputPath, report);\n return report;\n}\n\nexport async function evaluateExamples(args: {\n kind: \"baseline\" | \"candidate\";\n modelId: string;\n baseModelId?: string;\n baseModelRevision?: string;\n sourceFingerprint?: string;\n adapterPath?: string;\n examples: BehaviorSpecExample[];\n system: string;\n config: LocalRunnerConfig;\n outputPath: string;\n reporter?: LocalRunReporter;\n maxExamples?: number;\n evalSplit?: EvalSplit;\n sampleSeed?: number;\n shouldCancel?: () => boolean | Promise<boolean>;\n}): Promise<EvalReport> {\n assertEvaluationScoringReady(args.config);\n const maxExamples = args.config.evaluation.maxExamples\n ?? args.maxExamples\n ?? args.examples.length;\n const truncated = args.examples.length > maxExamples;\n const seed = args.config.evaluation.sampleSeed ?? args.sampleSeed ?? 0;\n const examples = truncated\n ? sampleExamples(args.examples, maxExamples, seed)\n : args.examples;\n const evalSampleSeed = truncated || args.evalSplit === \"spec_holdout\" ? seed : null;\n const cacheEligible = args.kind === \"baseline\"\n && args.config.evaluation.baselineCache\n && !args.config.dryRun\n && baselineInputsAreStable({\n baseModelRevision: args.baseModelRevision,\n sourceFingerprint: args.sourceFingerprint,\n config: args.config,\n });\n const cacheKey = cacheEligible\n ? baselineCacheKey({\n modelId: args.modelId,\n baseModelRevision: args.baseModelRevision,\n sourceFingerprint: args.sourceFingerprint,\n system: args.system,\n examples,\n evalExamplesTotal: args.examples.length,\n evalSplit: args.evalSplit,\n evalSampleSeed,\n config: args.config,\n packageVersion: await packageVersion(),\n })\n : null;\n if (cacheKey) {\n const cached = await readBaselineCache(baselineCachePath(args.config, cacheKey));\n if (cached) {\n const report = evalReportSchema.parse({\n ...cached,\n cached: true,\n cache_key: cacheKey,\n artifact_uri: fileUri(args.outputPath),\n eval_split: args.evalSplit ?? cached.eval_split,\n eval_examples_total: args.examples.length,\n eval_examples_used: examples.length,\n eval_truncated: truncated,\n eval_sample_seed: evalSampleSeed,\n });\n await writeJson(args.outputPath, report);\n return report;\n }\n }\n\n const inference = args.config.dryRun\n ? null\n : await runTransformersInference({\n kind: args.kind,\n modelId: args.modelId,\n baseModelId: args.baseModelId ?? args.modelId,\n baseModelRevision: args.baseModelRevision,\n adapterPath: args.adapterPath,\n examples,\n system: args.system,\n config: args.config,\n outputPath: args.outputPath,\n reporter: args.reporter,\n shouldCancel: args.shouldCancel,\n });\n const generated = examples.map((example, index) => ({\n prompt: example.input,\n expected: example.output,\n actual: inference?.results[index]?.actual ?? \"\",\n latency_ms: inference?.results[index]?.latency_ms ?? 0,\n }));\n const report = await scoreGenerated({\n kind: args.kind,\n modelId: args.modelId,\n generated,\n evalExamplesTotal: args.examples.length,\n config: args.config,\n outputPath: args.outputPath,\n inferenceProvider: inference ? \"transformers\" : \"none\",\n evalSplit: args.evalSplit,\n evalSampleSeed,\n generationConfig: inference?.generation_config,\n logUri: inference ? fileUri(`${args.outputPath}.inference.log`) : undefined,\n });\n if (cacheKey) {\n await writeJson(\n baselineCachePath(args.config, cacheKey),\n { ...report, cache_key: cacheKey },\n );\n }\n return report;\n}\n\nexport function compareEvalReports(baseline: EvalReport, candidate: EvalReport) {\n let regressions = 0;\n let improvements = 0;\n const regressedExamples: Array<{\n prompt: string;\n old_score: number;\n new_score: number;\n }> = [];\n const count = Math.min(baseline.results.length, candidate.results.length);\n for (let index = 0; index < count; index += 1) {\n const oldScore = baseline.results[index]?.score ?? 0;\n const result = candidate.results[index];\n const newScore = result?.score ?? 0;\n if (newScore < oldScore) {\n regressions += 1;\n regressedExamples.push({\n prompt: baseline.results[index]?.prompt ?? \"\",\n old_score: oldScore,\n new_score: newScore,\n });\n } else if (newScore > oldScore) {\n improvements += 1;\n }\n }\n return {\n avg_score_delta: candidate.avg_score - baseline.avg_score,\n pass_rate_delta: candidate.pass_rate - baseline.pass_rate,\n exact_match_rate_delta:\n candidate.exact_match_rate - baseline.exact_match_rate,\n token_f1_delta:\n (candidate.avg_token_f1 ?? 0) - (baseline.avg_token_f1 ?? 0),\n regressions,\n improvements,\n regressed_examples: regressedExamples,\n };\n}\n","import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport type { FineTuneRunRequest, LocalRunnerConfig, TrainingReport } from \"./contracts.js\";\nimport type { RunArtifacts } from \"./artifacts.js\";\nimport { copyDatasetToTrainingChannel, fileUri, writeJson } from \"./artifacts.js\";\nimport { resolveTrainingModel } from \"./model-registry.js\";\nimport {\n buildBundledPythonCommand,\n runLoggedProcess,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\nimport { reportInBackground, type LocalRunReporter } from \"./run-reporter.js\";\nimport {\n minimalMachineLearningEnvironment,\n withOfflineHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\n\nexport function buildTrainingHyperparameters(\n request: FineTuneRunRequest,\n options: { baseModelRevision?: string } = {},\n): Record<string, string> {\n const model = resolveTrainingModel(request.spec_snapshot.base_model);\n const hyper = request.hyperparameters;\n return {\n base_model: model.id,\n ...(options.baseModelRevision ? { base_model_revision: options.baseModelRevision } : {}),\n n_epochs: String(hyper.n_epochs),\n learning_rate: String(hyper.learning_rate ?? model.defaultLearningRate),\n per_device_train_batch_size: String(hyper.batch_size ?? model.defaultPerDeviceBatchSize),\n gradient_accumulation_steps: String(\n hyper.gradient_accumulation_steps ?? model.defaultGradientAccumulationSteps,\n ),\n lora_rank: String(hyper.lora_rank ?? model.defaultLoraRank),\n lora_alpha: String(hyper.lora_alpha ?? model.defaultLoraAlpha),\n lora_dropout: String(hyper.lora_dropout ?? model.defaultLoraDropout),\n max_seq_length: String(hyper.max_seq_length ?? model.defaultMaxSeqLength),\n };\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface TrainingProgressSnapshot {\n percent?: number;\n step?: number;\n total_steps?: number;\n elapsed?: string;\n eta?: string;\n rate?: string;\n loss?: number;\n grad_norm?: number;\n learning_rate?: number;\n epoch?: number;\n}\n\nfunction numberFromMetric(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function parseTrainingProgressLine(line: string): TrainingProgressSnapshot | null {\n // Transformers uses tqdm while loading checkpoint shards. Those counters\n // describe model startup, not optimizer steps, and previously appeared as\n // misleading \"Training progress 320/320\" events.\n if (/loading (?:checkpoint )?shards|loading weights/i.test(line)) return null;\n const snapshot: TrainingProgressSnapshot = {};\n const metricMatches = [...line.matchAll(/'([^']+)':\\s*'([^']*)'/g)];\n for (const match of metricMatches) {\n const key = match[1];\n const value = numberFromMetric(match[2]);\n if (value === undefined) continue;\n if (key === \"loss\") snapshot.loss = value;\n if (key === \"grad_norm\") snapshot.grad_norm = value;\n if (key === \"learning_rate\") snapshot.learning_rate = value;\n if (key === \"epoch\") {\n snapshot.epoch = value;\n snapshot.percent = Math.max(0, Math.min(100, Math.round(value * 100)));\n }\n }\n\n const progress = line.match(/(\\d+)%\\|[^|]*\\|\\s*(\\d+)\\/(\\d+)\\s*\\[([^<,\\]]+)(?:<([^,\\]]+))?,\\s*([^\\]]+)\\]/);\n if (progress) {\n snapshot.percent = Number(progress[1]);\n snapshot.step = Number(progress[2]);\n snapshot.total_steps = Number(progress[3]);\n snapshot.elapsed = progress[4]?.trim();\n snapshot.eta = progress[5]?.trim();\n snapshot.rate = progress[6]?.trim();\n }\n\n return Object.keys(snapshot).length > 0 ? snapshot : null;\n}\n\nexport function createTrainingProgressForwarder(reporter?: LocalRunReporter): (line: string) => void {\n let lastPercent = -1;\n let lastStep = -1;\n let lastEmittedAt = 0;\n let latestMetrics: TrainingProgressSnapshot = {};\n\n return (line: string) => {\n const parsed = parseTrainingProgressLine(line);\n if (!parsed) return;\n latestMetrics = { ...latestMetrics, ...parsed };\n const percent = latestMetrics.percent;\n const step = latestMetrics.step;\n const totalSteps = latestMetrics.total_steps;\n const now = Date.now();\n const shouldEmit = Boolean(reporter?.onEvent)\n && (\n (percent !== undefined && (percent >= lastPercent + 5 || percent === 100))\n || (step !== undefined && totalSteps !== undefined && step === totalSteps && step !== lastStep)\n || now - lastEmittedAt > 30_000\n );\n if (!shouldEmit) return;\n\n lastEmittedAt = now;\n if (percent !== undefined) lastPercent = percent;\n if (step !== undefined) lastStep = step;\n reportInBackground(() => reporter?.onEvent?.({\n stage: \"training\",\n status: \"running\",\n message: step !== undefined && totalSteps !== undefined\n ? `Training progress ${step}/${totalSteps}${percent !== undefined ? ` (${percent}%)` : \"\"}.`\n : `Training progress${percent !== undefined ? ` ${percent}%` : \"\"}.`,\n details: latestMetrics as Record<string, unknown>,\n }));\n };\n}\n\nexport async function launchProcessTraining(args: {\n request: FineTuneRunRequest;\n artifacts: RunArtifacts;\n config: LocalRunnerConfig;\n baseModelRevision?: string;\n reporter?: LocalRunReporter;\n shouldCancel?: () => boolean | Promise<boolean>;\n}): Promise<TrainingReport> {\n const { request, artifacts, config } = args;\n const jobName = `tt-local-${request.run_id}`;\n await mkdir(artifacts.trainingDir, { recursive: true });\n await copyDatasetToTrainingChannel(artifacts);\n const hyperparameters = buildTrainingHyperparameters(request, {\n baseModelRevision: args.baseModelRevision,\n });\n await writeJson(join(artifacts.trainingConfigDir, \"hyperparameters.json\"), hyperparameters);\n\n const entrypoint = buildBundledPythonCommand(\"train.py\");\n\n if (config.dryRun) {\n await writeFile(\n artifacts.trainingLog,\n \"Dry run enabled. Training process was not launched.\\n\",\n \"utf8\",\n );\n return {\n provider: \"local-uv\",\n training_job_name: jobName,\n model_artifact_uri: fileUri(artifacts.trainingModelDir),\n base_model_artifact_uri: config.paths.baseModel ? fileUri(config.paths.baseModel) : undefined,\n metrics: { dry_run: true },\n exit_code: 0,\n log_uri: fileUri(artifacts.trainingLog),\n command: entrypoint.displayCommand,\n };\n }\n\n const command = entrypoint.displayCommand;\n const inheritedEnv = minimalMachineLearningEnvironment(process.env);\n const childEnv: NodeJS.ProcessEnv = withBundledPythonEnvironment(\n withOfflineHuggingFaceCacheEnvironment({\n ...inheritedEnv,\n BACKEND: \"local\",\n SM_CHANNEL_TRAINING: resolve(artifacts.trainingInputDir),\n SM_CHANNEL_BASE_MODEL: config.paths.baseModel ? resolve(config.paths.baseModel) : undefined,\n SM_MODEL_DIR: resolve(artifacts.trainingModelDir),\n SM_OUTPUT_DIR: resolve(artifacts.trainingOutputDir),\n TT_HYPERPARAMETERS_PATH: resolve(artifacts.trainingConfigDir, \"hyperparameters.json\"),\n }, config.paths.modelCache),\n );\n for (const [key, value] of Object.entries(childEnv)) {\n if (value === undefined) delete childEnv[key];\n }\n\n if (config.paths.modelCache) await mkdir(resolve(config.paths.modelCache), { recursive: true });\n\n await args.reporter?.onEvent?.({\n stage: \"training\",\n status: \"running\",\n message: \"Starting local training process.\",\n details: {\n command,\n log_path: artifacts.trainingLog,\n model_dir: artifacts.trainingModelDir,\n output_dir: artifacts.trainingOutputDir,\n },\n });\n\n const forwardTrainingProgress = createTrainingProgressForwarder(args.reporter);\n const { exitCode } = await runLoggedProcess({\n command: entrypoint.command,\n commandArgs: entrypoint.commandArgs,\n env: childEnv,\n logPath: artifacts.trainingLog,\n reporter: args.reporter,\n stage: \"training\",\n onLine: (line) => forwardTrainingProgress(line),\n shouldCancel: args.shouldCancel,\n });\n\n const metricsPath = join(artifacts.trainingModelDir, \"training-metrics.json\");\n const metrics = await pathExists(metricsPath)\n ? JSON.parse(await readFile(metricsPath, \"utf8\")) as Record<string, unknown>\n : null;\n\n if (exitCode !== 0) {\n throw new Error(`Training process exited with code ${exitCode}. See ${artifacts.trainingLog}.`);\n }\n\n const modelTarPath = join(artifacts.trainingOutputDir, \"model.tar.gz\");\n const modelUri = await pathExists(modelTarPath)\n ? fileUri(modelTarPath)\n : fileUri(artifacts.trainingModelDir);\n await args.reporter?.onEvent?.({\n stage: \"training\",\n status: \"running\",\n message: \"Training process completed.\",\n details: {\n exit_code: exitCode,\n model_artifact_uri: modelUri,\n log_path: artifacts.trainingLog,\n metrics,\n },\n });\n\n return {\n provider: \"local-uv\",\n training_job_name: jobName,\n model_artifact_uri: modelUri,\n base_model_artifact_uri: config.paths.baseModel ? fileUri(config.paths.baseModel) : undefined,\n metrics,\n exit_code: exitCode,\n log_uri: fileUri(artifacts.trainingLog),\n command,\n };\n}\n"],"mappings":"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","names":["lstat","readdir","resolve","resolve","readdir","lstat","createHash","randomUUID","readFile","stat","writeFile","dirname","isAbsolute","resolve","mkdir","isAbsolute","resolve","dirname","stat","randomUUID","mkdir","writeFile","createHash","readFile","readFile","dirname","resolve","fileURLToPath","copyFile","mkdir","readdir","readFile","rename","stat","writeFile","homedir","dirname","join","resolve","randomUUID","exists","writeJsonAtomic","readJson","lstat","mkdir","readFile","readdir","stat","join","resolve","createHash","mkdir","homedir","dirname","join","resolve","join","createHash","resolve","homedir","mkdir","dirname","homedir","dirname","join","resolve","resolve","lstat","readdir","join","stat","readFile","mkdir","lstat","mkdir","open","readFile","readdir","rename","rm","stat","createReadStream","createHash","randomUUID","homedir","dirname","join","relative","resolve","createHash","mkdir","readFile","rm","writeFile","dirname","join","resolve","score","mkdir","dirname","writeFile","resolve","rm","readFile","createHash","join","report","mkdir","readFile","writeFile","join","resolve","mkdir","join","writeFile","resolve","readFile","readFile","resolve","dirname","homedir","pathExists","stat","canonicalJson","createHash","packageRoot","packageVersion","bundledProject","createReadStream","lstat","readdir","relative","rm","mkdir","randomUUID","open","rename","join","entrypointFiles","report","training"]}