@tuned-tensor/cli 0.25.0 → 0.26.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.
- package/README.md +89 -12
- package/dist/{chunk-UCJCWJ6F.js → chunk-4BHDPRYD.js} +17 -13
- package/dist/chunk-4BHDPRYD.js.map +1 -0
- package/dist/{chunk-7RJGLRMO.js → chunk-FLRRDP3M.js} +1985 -576
- package/dist/chunk-FLRRDP3M.js.map +1 -0
- package/dist/index.js +2136 -1852
- package/dist/index.js.map +1 -1
- package/dist/local-runtime.js +47 -3
- package/dist/local-runtime.js.map +1 -1
- package/dist/{prefetch-GP3OPUUL.js → prefetch-DH365HNN.js} +2 -2
- package/docs/local-runtime/architecture.md +51 -0
- package/docs/local-runtime/aws-gpu.md +15 -0
- package/docs/local-runtime/background-runs.md +77 -0
- package/docs/local-runtime/decision.md +5 -0
- package/docs/local-runtime/serving.md +11 -2
- package/docs/spec-workflow.md +72 -2
- package/package.json +1 -1
- package/training/adapter/src/evaluate.py +127 -34
- package/training/adapter/src/model_contract.py +13 -0
- package/training/adapter/src/serve.py +30 -0
- package/training/adapter/src/train.py +5 -1
- package/dist/chunk-7RJGLRMO.js.map +0 -1
- package/dist/chunk-UCJCWJ6F.js.map +0 -1
- /package/dist/{prefetch-GP3OPUUL.js.map → prefetch-DH365HNN.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/local-runtime/dataset.ts","../src/local-runtime/local-project.ts","../src/eval/rules.ts","../src/pipeline.ts","../src/local-runtime/audit.ts","../src/local-runtime/store.ts","../src/local-runtime/dataset-prefetch.ts","../src/local-runtime/general-regression.ts","../src/local-runtime/orchestrator.ts","../src/local-runtime/gpu-executor.ts","../src/local-runtime/evaluation.ts","../src/local-runtime/process-training.ts","../src/local-runtime/project-workflow.ts","../src/local-runtime/capability-profiles.ts","../src/local-runtime/capability.ts","../src/local-runtime/host-inventory.ts","../src/local-runtime/hardware-snapshot.ts","../src/local-runtime/hardware.ts","../src/local-runtime/console-reporter.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport type { BehaviorSpec, 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\n/** Normalized prompt identity used for duplicate and train/eval overlap checks. */\nexport function datasetInputIdentity(value: string): string {\n return value.normalize(\"NFKC\").trim().replace(/\\s+/g, \" \").toLocaleLowerCase(\"en\");\n}\n\n/** Compile the shared behavior fields into the instruction seen by either engine. */\nexport function buildSystemMessage(\n spec: Pick<BehaviorSpec, \"system_prompt\" | \"guidelines\" | \"constraints\">,\n): string {\n const parts: string[] = [];\n const guidelines = spec.guidelines.map((value) => value.trim()).filter(Boolean);\n const constraints = spec.constraints.map((value) => value.trim()).filter(Boolean);\n if (spec.system_prompt.trim()) parts.push(spec.system_prompt.trim());\n if (guidelines.length > 0) {\n parts.push(`Guidelines:\\n${guidelines.map((guideline) => `- ${guideline}`).join(\"\\n\")}`);\n }\n if (constraints.length > 0) {\n parts.push(`Constraints:\\n${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","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdir } from \"node:fs/promises\";\nimport {\n DEFAULT_ARTIFACT_ROOT,\n DEFAULT_PROJECT_STORE_ROOT,\n} from \"../paths.js\";\nimport {\n decisionLabels,\n fineTuneRunRequestSchema,\n isDecisionSpecFile,\n isFoundationSpecFile,\n localAdapterSpecFileSchema,\n localBehaviorSpecFileSchema,\n localDecisionSpecFileSchema,\n localFoundationSpecFileSchema,\n type FineTuneRunRequest,\n type LocalAdapterSpecFile,\n type LocalBehaviorSpecFile,\n type LocalDecisionSpecFile,\n type LocalFoundationSpecFile,\n} from \"./contracts.js\";\nimport { buildSystemMessage } from \"./dataset.js\";\nimport { DEFAULT_DECISION_MODEL } from \"./decision-models.js\";\nimport { checkConstraints } from \"../eval/rules.js\";\n\nexport const DEFAULT_LOCAL_SPEC_PATH = \"tunedtensor.json\";\n\nexport interface CreateLocalSpecArgs {\n name: string;\n baseModel?: string;\n engine?: \"adapter\" | \"foundation\" | \"decision\";\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 type LocalRunInput =\n | { kind: \"request\"; path: string; request: FineTuneRunRequest }\n | { kind: \"spec\"; path: string; request: FineTuneRunRequest; spec: LocalAdapterSpecFile }\n | { kind: \"foundation-spec\"; path: string; spec: LocalFoundationSpecFile }\n | { kind: \"decision-spec\"; path: string; spec: LocalDecisionSpecFile };\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\nexport function localPathsOverlap(left: string, right: string): boolean {\n const contains = (parent: string, candidate: string): boolean => {\n const relation = relative(resolve(parent), resolve(candidate));\n return relation === \"\"\n || (!isAbsolute(relation) && relation !== \"..\" && !relation.startsWith(`..${sep}`));\n };\n return contains(left, right) || contains(right, left);\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 // Hugging Face split paths name files inside the dataset repo; they are\n // resolved against the cached snapshot, not the spec directory.\n if (fields.huggingface === undefined) for (const key of [\"training\", \"validation\", \"test\"] as const) {\n if (fields[key] !== undefined) fields[key] = resolveLocalReference(fields[key], baseDirectory);\n }\n }\n const runtime = value.runtime as Record<string, unknown> | undefined;\n if (runtime && typeof runtime === \"object\") {\n for (const key of [\"artifactRoot\", \"storeRoot\"]) if (runtime[key] !== undefined) runtime[key] = resolveLocalReference(runtime[key], baseDirectory);\n const gpu = runtime.gpu as Record<string, unknown> | undefined;\n if (gpu?.identityFile !== undefined) gpu.identityFile = resolveLocalReference(gpu.identityFile, baseDirectory);\n const paths = runtime.paths as Record<string, unknown> | undefined;\n if (paths && typeof paths === \"object\") for (const key of [\"baseModel\", \"modelCache\"]) if (paths[key] !== undefined) paths[key] = resolveLocalReference(paths[key], baseDirectory);\n }\n const regression = (value.evaluation as { generalRegression?: Record<string, unknown> } | undefined)?.generalRegression;\n if (regression?.dataset !== undefined) regression.dataset = resolveLocalReference(regression.dataset, baseDirectory);\n const foundation = value.foundation;\n if (foundation && typeof foundation === \"object\" && !Array.isArray(foundation)) {\n const fields = foundation as Record<string, unknown>;\n for (const key of [\"corpus_path\", \"validation_path\", \"checkpoint_backup_dir\"] 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 if (args.engine === \"foundation\") {\n const spec = localFoundationSpecFileSchema.parse({\n engine: \"foundation\",\n id: randomUUID(),\n name: args.name,\n description: \"From-scratch tokenizer, pretrain, chat SFT, and eval.\",\n system_prompt: \"You are a helpful assistant.\",\n guidelines: [\n \"Answer the user request directly.\",\n ],\n constraints: [],\n examples: [\n {\n input: \"Replace this with representative chat input.\",\n output: \"Replace this with the expected assistant reply.\",\n },\n {\n input: \"Replace this with a different chat input.\",\n output: \"Replace this with the expected assistant reply.\",\n },\n ],\n foundation: {\n depth: 2,\n pretrain_steps: 2,\n finetune_steps: 2,\n rl_steps: 0,\n vocab_size: 256,\n max_chars: 20_000,\n sequence_length: 64,\n batch_size: 2,\n nproc_per_node: 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\n if (args.engine === \"decision\") {\n const spec = localDecisionSpecFileSchema.parse({\n engine: \"decision\",\n id: randomUUID(),\n name: args.name,\n description: \"Typed decision model: one labelled answer per input.\",\n system_prompt: \"Describe the decision this local model should make.\",\n guidelines: [],\n constraints: [],\n base_model: args.baseModel ?? DEFAULT_DECISION_MODEL,\n decision: {\n type: \"choice\",\n criteria: {\n first_label: \"Replace this with what the first label means.\",\n second_label: \"Replace this with what the second label means.\",\n },\n },\n examples: [\n { input: \"Replace this with a representative input.\", output: \"first_label\" },\n { input: \"Replace this with a different input.\", output: \"second_label\" },\n ],\n hyperparameters: { n_epochs: 3 },\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\n if (!args.baseModel) {\n throw new Error(\"Adapter specs require --model.\");\n }\n const spec = localAdapterSpecFileSchema.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: DEFAULT_ARTIFACT_ROOT,\n storeRoot: DEFAULT_PROJECT_STORE_ROOT,\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\nfunction placeholderIssues(\n systemPrompt: string,\n examples: Array<{ input: string; output: string }>,\n): string[] {\n const issues: string[] = [];\n if (/describe the (behavior|decision) this local model should (learn|make)/i.test(systemPrompt)) {\n issues.push(\"system_prompt still contains the generated placeholder\");\n }\n 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 generatedPlaceholderIssues(request: FineTuneRunRequest): string[] {\n return placeholderIssues(request.spec_snapshot.system_prompt, request.spec_snapshot.examples);\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 foundationPlaceholderIssues(spec: LocalFoundationSpecFile): string[] {\n return placeholderIssues(spec.system_prompt, spec.examples);\n}\n\nexport function decisionPlaceholderIssues(spec: LocalDecisionSpecFile): string[] {\n const issues = placeholderIssues(spec.system_prompt, spec.examples);\n const descriptions = spec.decision.type === \"noul\"\n ? Object.values(spec.decision.criteria ?? {})\n : Object.values(spec.decision.criteria);\n if (descriptions.some((value) => /replace this with/i.test(value ?? \"\"))) {\n issues.push(\"decision.criteria still contains generated placeholder text\");\n }\n return issues;\n}\n\nexport function assertFoundationSpecReady(spec: LocalFoundationSpecFile): void {\n const issues = foundationPlaceholderIssues(spec);\n if (issues.length > 0) {\n throw new Error(`Edit the generated foundation spec before training: ${issues.join(\"; \")}.`);\n }\n}\n\nexport function runRequestFromLocalSpec(\n spec: LocalBehaviorSpecFile,\n options: RunRequestFromSpecOptions = {},\n): FineTuneRunRequest {\n if (isFoundationSpecFile(spec) || isDecisionSpecFile(spec)) {\n throw new Error(\n `${isFoundationSpecFile(spec) ? \"Foundation\" : \"Decision\"} specs cannot be converted into a LoRA run request. Use \\`tt pipeline run --spec\\`.`,\n );\n }\n const {\n id,\n engine: _engine,\n evaluation: _evaluation,\n runtime: _runtime,\n pipeline: _pipeline,\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 function parseLocalRunInput(\n rawInput: unknown,\n path: string,\n options: RunRequestFromSpecOptions = {},\n): LocalRunInput {\n const raw = resolveLocalRunInputPaths(rawInput, 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 if (isFoundationSpecFile(spec)) {\n return { kind: \"foundation-spec\", path, spec };\n }\n if (isDecisionSpecFile(spec)) {\n return { kind: \"decision-spec\", path, spec };\n }\n return {\n kind: \"spec\",\n path,\n spec,\n request: runRequestFromLocalSpec(spec, options),\n };\n}\n\nexport async function loadLocalRunInput(\n path: string,\n options: RunRequestFromSpecOptions = {},\n): Promise<LocalRunInput> {\n return parseLocalRunInput(\n JSON.parse(await readFile(path, \"utf8\")) as unknown,\n path,\n options,\n );\n}\n\nexport function specHash(source: string): string {\n return createHash(\"sha256\").update(source).digest(\"hex\");\n}\n\nexport interface SpecValidation {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/** Business rules shared by spec review, edits, planning and execution. */\nexport function validateBehaviorSpec(input: LocalRunInput): SpecValidation {\n const errors: string[] = [];\n const warnings: string[] = [];\n if (input.kind === \"request\") {\n return { valid: false, errors: [\"Use a behavior spec, not a run request.\"], warnings };\n }\n\n const { spec } = input;\n const placeholders = input.kind === \"foundation-spec\"\n ? foundationPlaceholderIssues(input.spec)\n : input.kind === \"decision-spec\"\n ? decisionPlaceholderIssues(input.spec)\n : generatedPlaceholderIssues(input.request);\n if (placeholders.length) {\n errors.push(`Edit the generated behavior spec before training: ${placeholders.join(\"; \")}.`);\n }\n if (input.kind === \"foundation-spec\") {\n if (input.spec.foundation.nproc_per_node !== 1) {\n errors.push(\"Foundation nproc_per_node must be 1 for this runtime.\");\n }\n const nonNumericOutput = spec.examples.some(example =>\n !/-?\\d+(?:\\.\\d+)?/.test(example.output.replaceAll(\",\", \"\")),\n );\n if (input.spec.foundation.rl_steps > 0 && nonNumericOutput) {\n errors.push(\"Foundation RL requires numeric expected outputs in every example.\");\n }\n }\n if (input.kind === \"decision-spec\") {\n const labels = decisionLabels(input.spec.decision);\n const normalized = new Map(labels.map((label) => [label.trim().toLowerCase(), label]));\n if (normalized.size !== labels.length) {\n errors.push(\"decision labels must stay distinct ignoring case and surrounding spaces.\");\n }\n const counts = new Map<string, number>();\n for (const [index, example] of spec.examples.entries()) {\n const label = normalized.get(example.output.trim().toLowerCase());\n if (!label) {\n errors.push(`examples[${index}].output must be one of the decision labels: ${labels.join(\", \")}.`);\n } else {\n counts.set(label, (counts.get(label) ?? 0) + 1);\n }\n }\n const missing = labels.filter((label) => !counts.has(label));\n if (missing.length && spec.examples.length) {\n warnings.push(`No examples use decision label(s) ${missing.join(\", \")}; the tuned model learns those only from their descriptions.`);\n }\n if (buildSystemMessage(spec).length > 600) {\n warnings.push(\"The compiled decision instruction exceeds 600 characters; the decision model reads about 190 tokens of instruction and options, so later text may be truncated.\");\n }\n }\n for (const key of [\"name\", \"system_prompt\"] as const) {\n if (!spec[key].trim()) errors.push(`${key} must not be blank.`);\n }\n if (spec.examples.length < 2 && !(input.kind === \"spec\" && input.spec.dataset_prebuilt)) {\n errors.push(\"Add at least two examples for training and evaluation.\");\n }\n const seen = new Set<string>();\n for (const [index, example] of spec.examples.entries()) {\n if (!example.input.trim() || !example.output.trim()) {\n errors.push(`examples[${index}] input and output must not be blank.`);\n }\n const key = example.input.trim();\n if (seen.has(key)) {\n errors.push(`examples[${index}] repeats an input; use distinct examples to avoid conflicting labels or train/eval overlap.`);\n }\n seen.add(key);\n }\n for (const [index, example] of spec.examples.entries()) {\n for (const result of checkConstraints(example.output, spec.constraints ?? [])) {\n if (!result.passed) warnings.push(`examples[${index}] may violate ${result.assertion} (${result.message})`);\n }\n }\n if (!spec.guidelines.length) {\n warnings.push(\"Add guidelines to make expected behavior explicit.\");\n }\n if (spec.examples.length < 10 && !(input.kind === \"spec\" && input.spec.dataset_prebuilt)) {\n warnings.push(\"This is a small example set; passing validation does not establish model quality.\");\n }\n return { valid: errors.length === 0, errors, warnings };\n}\n","import type {\n AssertionResult,\n LocalSpec,\n ValidationCheck,\n ValidationResult,\n} from \"./types.js\";\n\nexport function validateSpec(spec: LocalSpec): ValidationResult {\n const checks: ValidationCheck[] = [];\n\n checks.push({\n name: \"Has name\",\n passed: Boolean(spec.name?.trim()),\n message: spec.name?.trim() ? undefined : \"Spec is missing a name\",\n });\n\n checks.push({\n name: \"Has system prompt\",\n passed: Boolean(spec.system_prompt?.trim()),\n message: spec.system_prompt?.trim()\n ? undefined\n : \"Spec is missing a system_prompt\",\n });\n\n const isFoundation = spec.engine === \"foundation\";\n checks.push({\n name: isFoundation ? \"Has foundation engine\" : \"Has base model\",\n passed: isFoundation\n ? spec.foundation != null && typeof spec.foundation === \"object\"\n : Boolean(spec.base_model?.trim()),\n message: isFoundation\n ? (spec.foundation != null ? undefined : \"Foundation spec is missing a foundation block\")\n : spec.base_model?.trim()\n ? undefined\n : \"Spec is missing a base_model\",\n });\n\n const exCount = spec.examples?.length ?? 0;\n const minExamples = isFoundation ? 2 : 1;\n checks.push({\n name: \"Has examples\",\n passed: exCount >= minExamples,\n message: exCount >= minExamples\n ? `${exCount} example(s)`\n : isFoundation\n ? \"Add at least two chat examples\"\n : \"Add at least one example\",\n });\n\n checks.push({\n name: \"Has guidelines\",\n passed: (spec.guidelines?.length ?? 0) > 0,\n message:\n (spec.guidelines?.length ?? 0) > 0\n ? undefined\n : \"Consider adding guidelines for better eval coverage\",\n });\n\n if (spec.constraints?.length && spec.examples?.length) {\n const violations = checkExamplesAgainstConstraints(spec);\n checks.push({\n name: \"Examples satisfy constraints\",\n passed: violations.length === 0,\n message:\n violations.length === 0\n ? undefined\n : violations.join(\"; \"),\n });\n }\n\n const evalCaseErrors = validateEvalCases(spec);\n checks.push({\n name: \"Eval cases valid\",\n passed: evalCaseErrors.length === 0,\n message:\n evalCaseErrors.length === 0\n ? spec.eval_cases?.length\n ? `${spec.eval_cases.length} executable eval case(s)`\n : undefined\n : evalCaseErrors.join(\"; \"),\n });\n\n return {\n valid: checks.every((c) => c.passed),\n checks,\n };\n}\n\nexport function validateEvalCases(spec: Pick<LocalSpec, \"eval_cases\">): string[] {\n const errors: string[] = [];\n const cases = spec.eval_cases ?? [];\n for (const [caseIndex, evalCase] of cases.entries()) {\n const label = `eval_cases[${caseIndex}]`;\n if (!evalCase || typeof evalCase !== \"object\") {\n errors.push(`${label} must be an object`);\n continue;\n }\n if (typeof evalCase.input !== \"string\" || evalCase.input.trim().length === 0) {\n errors.push(`${label}.input must be a non-empty string`);\n }\n if (evalCase.runtime !== \"python\") {\n errors.push(`${label}.runtime must be \"python\"`);\n }\n if (!Array.isArray(evalCase.tests) || evalCase.tests.length === 0) {\n errors.push(`${label}.tests must contain at least one test`);\n continue;\n }\n\n for (const [testIndex, test] of evalCase.tests.entries()) {\n const testLabel = `${label}.tests[${testIndex}]`;\n if (!test || typeof test !== \"object\") {\n errors.push(`${testLabel} must be an object`);\n continue;\n }\n if (test.name !== undefined && (typeof test.name !== \"string\" || test.name.trim().length === 0)) {\n errors.push(`${testLabel}.name must be a non-empty string when provided`);\n }\n if (test.args !== undefined && (!Array.isArray(test.args) || !test.args.every((arg) => typeof arg === \"string\"))) {\n errors.push(`${testLabel}.args must be an array of strings`);\n }\n if (test.stdin !== undefined && typeof test.stdin !== \"string\") {\n errors.push(`${testLabel}.stdin must be a string`);\n }\n if (\n test.expected_exit_code !== undefined\n && (\n typeof test.expected_exit_code !== \"number\"\n || !Number.isInteger(test.expected_exit_code)\n || test.expected_exit_code < 0\n || test.expected_exit_code > 255\n )\n ) {\n errors.push(`${testLabel}.expected_exit_code must be an integer between 0 and 255`);\n }\n if (test.expected_stdout !== undefined && typeof test.expected_stdout !== \"string\") {\n errors.push(`${testLabel}.expected_stdout must be a string`);\n }\n validateFiles(test.files, `${testLabel}.files`, errors);\n validateFiles(test.expected_files, `${testLabel}.expected_files`, errors);\n }\n }\n return errors;\n}\n\nfunction validateFiles(\n files: unknown,\n label: string,\n errors: string[],\n): void {\n if (files === undefined) return;\n if (!Array.isArray(files)) {\n errors.push(`${label} must be an array`);\n return;\n }\n for (const [index, file] of files.entries()) {\n const fileLabel = `${label}[${index}]`;\n if (!file || typeof file !== \"object\") {\n errors.push(`${fileLabel} must be an object`);\n continue;\n }\n const row = file as { path?: unknown; content?: unknown };\n if (typeof row.path !== \"string\" || !isSafeRelativePath(row.path)) {\n errors.push(`${fileLabel}.path must be a safe relative path`);\n }\n if (row.content !== undefined && typeof row.content !== \"string\") {\n errors.push(`${fileLabel}.content must be a string`);\n }\n }\n}\n\nfunction isSafeRelativePath(value: string): boolean {\n if (value.length === 0 || value.length > 240) return false;\n if (value.includes(\"\\0\") || value.startsWith(\"/\")) return false;\n const normalized = value.replace(/\\\\/g, \"/\");\n return !normalized.split(\"/\").some((part) => part === \"\" || part === \".\" || part === \"..\");\n}\n\nfunction checkExamplesAgainstConstraints(spec: LocalSpec): string[] {\n const violations: string[] = [];\n for (const [i, ex] of spec.examples.entries()) {\n for (const constraint of spec.constraints) {\n const result = evaluateConstraint(ex.output, constraint);\n if (!result.passed) {\n violations.push(`Example ${i + 1} violates \"${constraint}\": ${result.message}`);\n }\n }\n }\n return violations;\n}\n\nfunction evaluateConstraint(\n text: string,\n constraint: string,\n): { passed: boolean; message?: string } {\n const lower = constraint.toLowerCase();\n\n const neverMatch = lower.match(/^never (?:share|mention|include|reveal|use|say|output|return|give|provide|show|disclose|expose)\\s+(.+)/);\n if (neverMatch) {\n const forbidden = neverMatch[1].replace(/['\"]/g, \"\").trim();\n if (text.toLowerCase().includes(forbidden.toLowerCase())) {\n return { passed: false, message: `Output contains \"${forbidden}\"` };\n }\n return { passed: true };\n }\n\n const alwaysMatch = lower.match(/^always (?:include|use|start with|end with|contain|respond in|reply in)\\s+(.+)/);\n if (alwaysMatch) {\n const required = alwaysMatch[1].replace(/['\"]/g, \"\").trim();\n if (!text.toLowerCase().includes(required.toLowerCase())) {\n return { passed: false, message: `Output missing \"${required}\"` };\n }\n return { passed: true };\n }\n\n return {\n passed: true,\n message: `Constraint not enforceable by rules: \"${constraint}\" (will be checked by LLM judge if a provider is configured)`,\n };\n}\n\nexport function runAssertions(\n text: string,\n assertions: string[],\n): AssertionResult[] {\n return assertions.map((assertion) => runSingleAssertion(text, assertion));\n}\n\nfunction runSingleAssertion(text: string, assertion: string): AssertionResult {\n const [type, ...rest] = assertion.split(\":\");\n const value = rest.join(\":\");\n\n switch (type) {\n case \"contains\":\n return {\n assertion,\n passed: text.includes(value),\n message: text.includes(value)\n ? undefined\n : `Expected output to contain \"${value}\"`,\n };\n\n case \"not-contains\":\n return {\n assertion,\n passed: !text.includes(value),\n message: !text.includes(value)\n ? undefined\n : `Expected output to not contain \"${value}\"`,\n };\n\n case \"matches\": {\n const re = new RegExp(value);\n const match = re.test(text);\n return {\n assertion,\n passed: match,\n message: match ? undefined : `Output did not match pattern /${value}/`,\n };\n }\n\n case \"max-length\": {\n const max = Number(value);\n return {\n assertion,\n passed: text.length <= max,\n message:\n text.length <= max\n ? undefined\n : `Output length ${text.length} exceeds max ${max}`,\n };\n }\n\n case \"min-length\": {\n const min = Number(value);\n return {\n assertion,\n passed: text.length >= min,\n message:\n text.length >= min\n ? undefined\n : `Output length ${text.length} below min ${min}`,\n };\n }\n\n case \"is-json\": {\n let valid = false;\n try {\n JSON.parse(text);\n valid = true;\n } catch {}\n return {\n assertion,\n passed: valid,\n message: valid ? undefined : \"Output is not valid JSON\",\n };\n }\n\n default:\n return {\n assertion,\n passed: true,\n message: `Unknown assertion type: ${type} (skipped)`,\n };\n }\n}\n\nexport function checkConstraints(\n text: string,\n constraints: string[],\n): AssertionResult[] {\n return constraints.map((constraint) => {\n const result = evaluateConstraint(text, constraint);\n return {\n assertion: `constraint: ${constraint}`,\n passed: result.passed,\n message: result.message,\n };\n });\n}\n","import {\n canonicalJson,\n canonicalFoundationPipeline,\n isFoundationPipeline,\n canonicalPipeline as canonicalPortablePipeline,\n parsePipeline,\n pipelineDocumentSchema,\n type PipelineArtifactReference,\n type PipelineDocumentInput,\n type PipelineStep,\n type PipelineTarget,\n type Pipeline as NormalizedPortablePipeline,\n} from \"@tuned-tensor/pipeline-contract\";\nimport {\n assertLocalRunInputReady,\n validateBehaviorSpec,\n type LocalRunInput,\n} from \"./local-runtime/local-project.js\";\n\n// The portable Pipeline v1 contract lives in `@tuned-tensor/pipeline-contract`.\n// This module re-exports it and adds CLI-only execution planning (step\n// selection and cross-target artifact transfers).\nexport {\n PIPELINE_DOCUMENT_VERSION,\n PIPELINE_EVALUATORS,\n PIPELINE_MAX_STEPS,\n PIPELINE_MAX_TRAIN_STEPS,\n PIPELINE_STEP_CAPABILITIES,\n PIPELINE_STEP_USES,\n PIPELINE_TARGETS,\n canonicalFoundationPipeline,\n canonicalJson,\n isFoundationPipeline,\n parsePipeline,\n pipelineDocumentSchema,\n pipelineHash,\n} from \"@tuned-tensor/pipeline-contract\";\nexport type {\n ComparePipelineStepInput,\n EvaluatePipelineStepInput,\n PipelineArtifactKind,\n PipelineArtifactReference,\n PipelineDocumentInput,\n PipelineStep,\n PipelineStepInput,\n PipelineStepUse,\n PipelineTarget,\n TrainPipelineStepInput,\n} from \"@tuned-tensor/pipeline-contract\";\n\n/** A user-authored Pipeline v1 document, before normalization. */\nexport type Pipeline = PipelineDocumentInput;\n/** A normalized Pipeline v1 document: targets resolved, evaluator defaulted. */\nexport type NormalizedPipeline = NormalizedPortablePipeline;\n\nexport interface ResolvedTransfer {\n from: string;\n from_target: PipelineTarget;\n to_target: PipelineTarget;\n}\n\nexport type ResolvedPipelineStep = PipelineStep & { transfers: ResolvedTransfer[] };\n\nexport interface ExecutionPlan {\n version: 1;\n name?: string;\n steps: ResolvedPipelineStep[];\n}\n\nfunction stepReferences(step: PipelineStep): PipelineArtifactReference[] {\n if (step.uses === \"evaluate\") return step.with.model === \"base\" ? [] : [step.with.model];\n if (step.uses === \"compare\") return [step.with.before, step.with.after];\n if (step.uses === \"pretrain\") return [step.with.tokenizer];\n if (step.uses === \"finetune\" || step.uses === \"rl\") return [step.with.model];\n return [];\n}\n\n/** Hyperparameters copied from a foundation `tunedtensor.json` into a Pipeline v1 DAG. */\nexport interface FoundationPipelineHyperparameters {\n vocab_size: number;\n max_chars: number;\n depth: number;\n pretrain_steps: number;\n finetune_steps: number;\n rl_steps: number;\n batch_size: number;\n sequence_length: number;\n nproc_per_node: number;\n}\n\n/** Build the local foundation DAG from spec hyperparameters, including optional RL. */\nexport function pipelineFromFoundationHyperparameters(\n name: string,\n hp: FoundationPipelineHyperparameters,\n): Pipeline {\n const lastTrainId = hp.rl_steps > 0 ? \"rl\" : \"sft\";\n const steps: Pipeline[\"steps\"] = [\n {\n id: \"tokenize\",\n uses: \"tokenize\",\n target: \"local\",\n with: { vocabSize: hp.vocab_size, maxChars: hp.max_chars },\n },\n {\n id: \"pretrain\",\n uses: \"pretrain\",\n target: \"local\",\n with: {\n tokenizer: { from: \"tokenize.tokenizer\" },\n depth: hp.depth,\n steps: hp.pretrain_steps,\n batchSize: hp.batch_size,\n sequenceLength: hp.sequence_length,\n nprocPerNode: hp.nproc_per_node,\n },\n },\n {\n id: \"bpb\",\n uses: \"evaluate\",\n target: \"local\",\n with: { model: { from: \"pretrain.model\" }, evaluator: \"bpb\" },\n },\n {\n id: \"sft\",\n uses: \"finetune\",\n target: \"local\",\n with: {\n model: { from: \"pretrain.model\" },\n steps: hp.finetune_steps,\n batchSize: hp.batch_size,\n },\n },\n {\n id: \"chat\",\n uses: \"evaluate\",\n target: \"local\",\n with: { model: { from: \"sft.model\" }, evaluator: \"chat\" },\n },\n ];\n if (hp.rl_steps > 0) {\n steps.push(\n {\n id: \"rl\",\n uses: \"rl\",\n target: \"local\",\n with: { model: { from: \"sft.model\" }, steps: hp.rl_steps },\n },\n {\n id: \"chat_rl\",\n uses: \"evaluate\",\n target: \"local\",\n with: { model: { from: \"rl.model\" }, evaluator: \"chat\" },\n },\n );\n }\n steps.push({\n id: \"infer\",\n uses: \"evaluate\",\n target: \"local\",\n with: { model: { from: `${lastTrainId}.model` }, evaluator: \"inference\" },\n });\n return {\n version: 1,\n name,\n runtime: { engine: \"foundation\" },\n steps,\n };\n}\n\nfunction producerId(reference: PipelineArtifactReference): string {\n return reference.from.slice(0, reference.from.lastIndexOf(\".\"));\n}\n\n/** Validate an ordered, v1 pipeline without reading, writing, or executing anything. */\nexport function validatePipeline(pipeline: unknown): string[] {\n const structural = pipelineDocumentSchema.safeParse(pipeline);\n if (!structural.success) {\n return structural.error.issues.map((issue) => {\n const path = issue.path.map(String).join(\".\");\n return path ? `${path}: ${issue.message}` : issue.message;\n });\n }\n try {\n parsePipeline(pipeline);\n return [];\n } catch (error) {\n return [error instanceof Error ? error.message : String(error)];\n }\n}\n\n/** The named compatibility recipe retained by both local and cloud executors. */\nexport function canonicalPipeline(target: PipelineTarget = \"local\"): NormalizedPipeline {\n return canonicalPortablePipeline(target);\n}\n\n/** One spec-to-recipe path for CLI commands and agent proposals. */\nexport function pipelineForRunInput(input: LocalRunInput, requested?: unknown): NormalizedPipeline {\n if (input.kind === \"request\") {\n // Preserve the direct CLI's full run-request compatibility.\n assertLocalRunInputReady(input.request);\n } else {\n const validation = validateBehaviorSpec(input);\n if (!validation.valid) {\n throw new Error(`Invalid behavior spec:\\n${validation.errors.join(\"\\n\")}`);\n }\n }\n\n const foundation = input.kind === \"foundation-spec\";\n const embedded = input.kind === \"request\" ? undefined : input.spec.pipeline;\n if (embedded && requested !== undefined && canonicalJson(parsePipeline(embedded)) !== canonicalJson(parsePipeline(requested))) {\n throw new Error(\"Conflicting pipeline settings: update tunedtensor.json.pipeline before running a different recipe.\");\n }\n const recipe = requested !== undefined ? requested : embedded ?? (foundation\n ? pipelineFromFoundationHyperparameters(input.spec.name, input.spec.foundation)\n : canonicalPipeline(\"local\"));\n const pipeline = parsePipeline(recipe);\n if (isFoundationPipeline(pipeline) !== foundation) {\n // Decision specs reuse the adapter vocabulary: evaluate, train, compare.\n const recipeEngine = isFoundationPipeline(pipeline) ? \"a foundation\" : \"an adapter\";\n const specEngine = foundation ? \"a foundation\" : input.kind === \"decision-spec\" ? \"a decision\" : \"an adapter\";\n throw new Error(`Pipeline is ${recipeEngine} recipe, but the behavior spec is ${specEngine} spec. Use a matching recipe or omit --file.`);\n }\n if (foundation) assertFoundationSettingsMatch(input.spec.foundation, pipeline);\n return pipeline;\n}\n\n/** Resolve a valid pipeline into an ordered plan with explicit cross-target transfers. */\nexport function createExecutionPlan(pipeline: unknown, selection: { only?: string[]; skip?: string[] } = {}): ExecutionPlan {\n const errors = validatePipeline(pipeline);\n if (errors.length) throw new Error(`Invalid pipeline:\\n- ${errors.join(\"\\n- \")}`);\n const normalized = parsePipeline(pipeline);\n const allIds = new Set(normalized.steps.map((step) => step.id));\n for (const id of [...(selection.only ?? []), ...(selection.skip ?? [])]) {\n if (!allIds.has(id)) throw new Error(`Unknown pipeline step: ${id}.`);\n }\n const only = selection.only?.length ? new Set(selection.only) : undefined;\n const skip = new Set(selection.skip ?? []);\n const steps = normalized.steps.filter((step) => (!only || only.has(step.id)) && !skip.has(step.id));\n if (!steps.length) throw new Error(\"Selection leaves no pipeline steps to run.\");\n const retained = new Map(steps.map((step) => [step.id, step]));\n const resolved = steps.map((step): ResolvedPipelineStep => {\n const transfers: ResolvedTransfer[] = [];\n for (const reference of stepReferences(step)) {\n const producer = retained.get(producerId(reference));\n if (!producer) throw new Error(`Step ${step.id} has a dependency on ${producerId(reference)}, which was omitted by --only or --skip.`);\n if (producer.target !== step.target) transfers.push({ from: reference.from, from_target: producer.target, to_target: step.target });\n }\n return { ...step, transfers };\n });\n return { version: 1, ...(normalized.name ? { name: normalized.name } : {}), steps: resolved };\n}\n\n/** Pipeline recipes may select stages, but cannot override the behavior spec's training settings. */\nexport function assertFoundationSettingsMatch(\n hp: FoundationPipelineHyperparameters,\n plan: Pick<NormalizedPipeline, \"steps\">,\n): void {\n const settings: Record<string, Record<string, number>> = {\n tokenize: { vocabSize: hp.vocab_size, maxChars: hp.max_chars },\n pretrain: { depth: hp.depth, steps: hp.pretrain_steps, batchSize: hp.batch_size, sequenceLength: hp.sequence_length, nprocPerNode: hp.nproc_per_node },\n finetune: { steps: hp.finetune_steps, batchSize: hp.batch_size },\n rl: { steps: hp.rl_steps },\n };\n for (const step of plan.steps) {\n const fields = \"with\" in step ? step.with as Record<string, unknown> : undefined;\n for (const [key, expected] of Object.entries(settings[step.uses] ?? {})) {\n if (fields?.[key] !== undefined && fields[key] !== expected) {\n throw new Error(`Pipeline step ${step.id}.${key} conflicts with the behavior spec. Edit tunedtensor.json and regenerate the recipe, or omit --file.`);\n }\n }\n if (step.uses === \"rl\" && hp.rl_steps === 0) throw new Error(\"The behavior spec disables RL; update foundation.rl_steps before adding an RL stage.\");\n }\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { mkdir, open, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport { hostname } from \"node:os\";\nimport { join } from \"node:path\";\n\n/**\n * Tamper-evident run event log.\n *\n * Each event stores its sequence number, the previous event's hash and its own\n * hash over a canonical JSON form. Editing, reordering or deleting an event\n * (other than truncating the newest ones) breaks the chain, and\n * `tt runs audit` reports where. The chain makes accidental or casual edits\n * evident; it is not a signature, since anyone who can write the store can\n * rewrite the whole log.\n */\n\nexport const AUDIT_CHAIN_VERSION = 1;\n\nexport interface ChainedFields {\n seq?: number;\n prev_hash?: string | null;\n hash?: string;\n}\n\n/** JSON with object keys sorted at every level, after dropping undefined values. */\nexport function canonicalJson(value: unknown): string {\n const normalized = JSON.parse(JSON.stringify(value ?? null)) as unknown;\n const encode = (entry: unknown): string => {\n if (entry === null || typeof entry !== \"object\") return JSON.stringify(entry);\n if (Array.isArray(entry)) return `[${entry.map(encode).join(\",\")}]`;\n const object = entry as Record<string, unknown>;\n return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${encode(object[key])}`).join(\",\")}}`;\n };\n return encode(normalized);\n}\n\nexport function eventHash(event: Record<string, unknown>): string {\n const { hash: _hash, ...body } = event;\n return createHash(\"sha256\").update(canonicalJson(body)).digest(\"hex\");\n}\n\n/** Add seq, prev_hash and hash to a new event that follows `previous`. */\nexport function chainEvent<T extends Record<string, unknown>>(\n event: T,\n previous: (ChainedFields & Record<string, unknown>) | undefined,\n): T & Required<ChainedFields> {\n const body = JSON.parse(JSON.stringify({\n ...event,\n seq: typeof previous?.seq === \"number\" ? previous.seq + 1 : 0,\n prev_hash: previous?.hash ?? null,\n })) as T & { seq: number; prev_hash: string | null };\n return { ...body, hash: eventHash(body) };\n}\n\nexport type ChainStatus = \"verified\" | \"legacy\" | \"mixed\" | \"broken\" | \"empty\";\n\nexport interface ChainVerification {\n status: ChainStatus;\n events: number;\n chained_events: number;\n /** Events recorded before the chain existed (older TT versions). */\n legacy_events: number;\n /** Unchained events written after chaining began, e.g. by an older TT process still running. */\n unchained_after_chain: number;\n head_hash: string | null;\n break?: { index: number; seq: number | null; reason: string };\n}\n\n/**\n * Verify an event list. Chained events must form one unbroken chain; events\n * without hashes (written by older TT versions) are skipped and counted, so\n * they make a log unverifiable rather than tampered.\n */\nexport function verifyEventChain(events: ReadonlyArray<Record<string, unknown>>): ChainVerification {\n let legacy = 0;\n let unchainedAfter = 0;\n let previous: (ChainedFields & Record<string, unknown>) | undefined;\n const result = (status: ChainStatus, brk?: ChainVerification[\"break\"]): ChainVerification => ({\n status,\n events: events.length,\n chained_events: events.filter((event) => (event as ChainedFields).hash !== undefined).length,\n legacy_events: legacy,\n unchained_after_chain: unchainedAfter,\n head_hash: (previous?.hash as string | undefined) ?? null,\n ...(brk ? { break: brk } : {}),\n });\n for (const [index, event] of events.entries()) {\n const chained = event as ChainedFields & Record<string, unknown>;\n if (chained.hash === undefined) {\n if (previous) unchainedAfter += 1;\n else legacy += 1;\n continue;\n }\n const expectedSeq = previous ? (previous.seq ?? -1) + 1 : 0;\n if (chained.seq !== expectedSeq) {\n return result(\"broken\", { index, seq: chained.seq ?? null, reason: `Expected sequence ${expectedSeq}; an event was removed, reordered or inserted.` });\n }\n if ((chained.prev_hash ?? null) !== (previous?.hash ?? null)) {\n return result(\"broken\", { index, seq: chained.seq, reason: \"The previous-event hash does not match; an earlier event was changed or removed.\" });\n }\n if (eventHash(chained) !== chained.hash) {\n return result(\"broken\", { index, seq: chained.seq, reason: \"The event's contents do not match its hash; it was edited.\" });\n }\n previous = chained;\n }\n if (events.length === 0) return result(\"empty\");\n if (!previous) return result(\"legacy\");\n if (unchainedAfter > 0) return result(\"mixed\");\n return result(legacy > 0 ? \"legacy\" : \"verified\");\n}\n\nexport async 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\ninterface LockOwner {\n token: string;\n pid: number;\n host: string;\n}\n\nfunction processAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nasync function readLockOwner(lockPath: string): Promise<LockOwner | null> {\n try {\n return JSON.parse(await readFile(join(lockPath, \"owner.json\"), \"utf8\")) as LockOwner;\n } catch {\n return null;\n }\n}\n\n/**\n * A lock is abandoned when its owner process is gone. Owners hold the lock\n * only for one read and append, so a live owner (even a suspended laptop\n * process) is always waited for rather than broken.\n */\nasync function abandonedLockOwner(lockPath: string, orphanMs: number, remoteMs: number): Promise<LockOwner | \"ownerless\" | null> {\n const metadata = await stat(lockPath).catch(() => null);\n if (!metadata) return null;\n const owner = await readLockOwner(lockPath);\n const age = Date.now() - metadata.mtimeMs;\n // Created but the owner record never written: the writer died in between.\n if (!owner) return age > orphanMs ? \"ownerless\" : null;\n if (owner.host === hostname()) return processAlive(owner.pid) ? null : owner;\n return age > remoteMs ? owner : null;\n}\n\nasync function breakAbandonedLock(lockPath: string, abandoned: LockOwner | \"ownerless\"): Promise<void> {\n const moved = `${lockPath}.abandoned-${randomUUID()}`;\n try {\n await rename(lockPath, moved);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return; // another waiter broke it\n throw error;\n }\n const owner = await readLockOwner(moved);\n const expected = abandoned === \"ownerless\" ? undefined : abandoned.token;\n if (owner?.token !== expected) {\n // A new owner took the lock between our check and the rename: give it back.\n await rename(moved, lockPath).catch(() => undefined);\n }\n await rm(moved, { recursive: true, force: true });\n}\n\n/**\n * Cross-process mutual exclusion for appending to one event log. `mkdir` is\n * atomic; the owner record names the holder so a crashed holder's lock is\n * reclaimed as soon as its process is gone, and release only removes a lock\n * this holder still owns.\n */\nexport async function withAppendLock<T>(\n lockPath: string,\n action: () => Promise<T>,\n options: { timeoutMs?: number; orphanMs?: number; remoteMs?: number } = {},\n): Promise<T> {\n const timeoutMs = options.timeoutMs ?? 60_000;\n const token = randomUUID();\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n try {\n await mkdir(lockPath, { mode: 0o700 });\n await writeFile(join(lockPath, \"owner.json\"), JSON.stringify({ token, pid: process.pid, host: hostname() }), { mode: 0o600 });\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n const abandoned = await abandonedLockOwner(lockPath, options.orphanMs ?? 5_000, options.remoteMs ?? 600_000);\n if (abandoned) {\n await breakAbandonedLock(lockPath, abandoned);\n continue;\n }\n if (Date.now() > deadline) throw new Error(`Timed out waiting for the run event log lock: ${lockPath}`);\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n }\n try {\n return await action();\n } finally {\n if ((await readLockOwner(lockPath))?.token === token) await rm(lockPath, { recursive: true, force: true });\n }\n}\n\n/**\n * Read the last parsable JSON line of a JSONL file without reading it all,\n * and whether the file ends mid-line (an interrupted write).\n */\nexport async function readJsonlTail<T>(\n path: string,\n accept: (row: T) => boolean = () => true,\n): Promise<{ last: T | undefined; partial: boolean }> {\n let handle;\n try {\n handle = await open(path, \"r\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { last: undefined, partial: false };\n throw error;\n }\n try {\n const size = (await handle.stat()).size;\n if (size === 0) return { last: undefined, partial: false };\n let window = Math.min(size, 64 * 1024);\n for (;;) {\n const buffer = Buffer.alloc(window);\n await handle.read(buffer, 0, window, size - window);\n const text = buffer.toString(\"utf8\");\n const partial = !text.endsWith(\"\\n\");\n const lines = text.split(\"\\n\");\n // The first line may be cut by the window unless it starts the file.\n const complete = window === size ? lines : lines.slice(1);\n for (const line of complete.reverse()) {\n if (!line.trim()) continue;\n let row: T;\n try {\n row = JSON.parse(line) as T;\n } catch {\n continue; // a torn line from an interrupted write\n }\n if (row === null || typeof row !== \"object\" || Array.isArray(row)) continue;\n if (accept(row)) return { last: row, partial };\n }\n if (window === size) return { last: undefined, partial };\n window = Math.min(size, window * 4);\n }\n } finally {\n await handle.close();\n }\n}\n\n/** Parse JSONL, skipping and counting lines an interrupted write left unreadable. */\nexport function parseJsonlTolerant<T>(text: string): { rows: T[]; unreadable: number } {\n const rows: T[] = [];\n let unreadable = 0;\n for (const line of text.split(/\\r?\\n/)) {\n if (!line.trim()) continue;\n try {\n const row: unknown = JSON.parse(line);\n if (row === null || typeof row !== \"object\" || Array.isArray(row)) {\n unreadable += 1;\n continue;\n }\n rows.push(row as T);\n } catch {\n unreadable += 1;\n }\n }\n return { rows, unreadable };\n}\n\nexport interface TimelineEntry {\n stage: string;\n status: string;\n message: string;\n started_at: string;\n ended_at: string | null;\n duration_seconds: number | null;\n}\n\n/** Collapse consecutive events of the same stage into timed segments. */\nexport function buildTimeline(events: ReadonlyArray<{ stage: string; status: string; message: string; occurred_at: string }>): TimelineEntry[] {\n const timeline: TimelineEntry[] = [];\n for (const event of events) {\n const last = timeline.at(-1);\n if (last && last.stage === event.stage) {\n last.status = event.status;\n last.message = event.message;\n continue;\n }\n if (last) {\n last.ended_at = event.occurred_at;\n last.duration_seconds = Math.max(0, (Date.parse(event.occurred_at) - Date.parse(last.started_at)) / 1000);\n }\n timeline.push({\n stage: event.stage,\n status: event.status,\n message: event.message,\n started_at: event.occurred_at,\n ended_at: null,\n duration_seconds: null,\n });\n }\n const last = timeline.at(-1);\n if (last && [\"completed\", \"failed\", \"cancelled\", \"stage_completed\"].includes(last.stage)) {\n last.ended_at = last.started_at;\n last.duration_seconds = 0;\n }\n return timeline;\n}\n\nexport type AuditVerdict = \"verified\" | \"incomplete\" | \"tampered\";\n\ninterface DigestCheck {\n path: string;\n sha256: string;\n matches_recorded: boolean | null;\n}\n\nexport interface RunAudit {\n run_id: string;\n status: string;\n verdict: AuditVerdict;\n findings: string[];\n chain: ChainVerification & { unreadable_lines: number };\n report: { recorded_sha256: string | null; files: DigestCheck[] };\n artifact_manifest: { recorded_sha256: string | null; file: DigestCheck | null };\n timeline: TimelineEntry[];\n provenance: unknown;\n}\n\ntype AuditEvent = { stage: string; status: string; message: string; occurred_at: string; details?: Record<string, unknown> };\n\n/**\n * Check a run's evidence: the event chain, and that the report and artifact\n * manifest still match the digests recorded when the run completed.\n * `verified` needs all of it; records from older TT versions or unfinished\n * runs are `incomplete`; any mismatch or truncation is `tampered`.\n */\nexport async function auditRun(store: {\n getRun(id: string): Promise<{ id: string; status: string; artifact_dir?: string }>;\n getRunEventLog(id: string): Promise<{ events: AuditEvent[]; unreadable_lines: number }>;\n getRunReportPaths(id: string): Promise<string[]>;\n getRunReport(id: string): Promise<unknown>;\n}, runId: string): Promise<RunAudit> {\n const state = await store.getRun(runId);\n const log = await store.getRunEventLog(state.id);\n const events = log.events;\n const chain = verifyEventChain(events as unknown as Array<Record<string, unknown>>);\n const completion = [...events].reverse().find((event) => event.stage === \"completed\");\n const recorded = typeof completion?.details?.report_sha256 === \"string\" ? completion.details.report_sha256 : null;\n const recordedManifest = typeof completion?.details?.artifact_manifest_sha256 === \"string\"\n ? completion.details.artifact_manifest_sha256\n : null;\n const files = await Promise.all((await store.getRunReportPaths(state.id)).map(async (path) => {\n const sha256 = await sha256File(path);\n return { path, sha256, matches_recorded: recorded ? sha256 === recorded : null };\n }));\n const manifestPath = state.artifact_dir ? join(state.artifact_dir, \"artifact-manifest.json\") : null;\n const manifestFile = manifestPath && (await stat(manifestPath).catch(() => null))?.isFile()\n ? await sha256File(manifestPath).then((sha256) => ({\n path: manifestPath,\n sha256,\n matches_recorded: recordedManifest ? sha256 === recordedManifest : null,\n }))\n : null;\n const report = await store.getRunReport(state.id).catch(() => null) as { provenance?: unknown } | null;\n\n const findings: string[] = [];\n let verdict: AuditVerdict = \"verified\";\n const tampered = (finding: string) => {\n findings.push(finding);\n verdict = \"tampered\";\n };\n const incomplete = (finding: string) => {\n findings.push(finding);\n if (verdict === \"verified\") verdict = \"incomplete\";\n };\n const completed = state.status === \"completed\";\n if (chain.status === \"broken\") {\n tampered(`Event log chain is broken at event ${chain.break!.index}: ${chain.break!.reason}`);\n } else if (chain.status === \"empty\") {\n if (completed) tampered(\"The run is completed but its event log is missing or empty.\");\n else incomplete(\"The run has no events.\");\n } else if (chain.status === \"legacy\") {\n incomplete(`${chain.legacy_events} event(s) were recorded before event chaining (older TT version) and cannot be verified.`);\n } else if (chain.status === \"mixed\") {\n incomplete(`${chain.unchained_after_chain} event(s) were written without hashes after chaining began, e.g. by an older TT process.`);\n }\n if (log.unreadable_lines > 0) incomplete(`${log.unreadable_lines} event line(s) are unreadable, likely from an interrupted write.`);\n for (const file of files) {\n if (file.matches_recorded === false) {\n tampered(`Report ${file.path} changed after the run completed (sha256 ${file.sha256.slice(0, 12)}, recorded ${recorded!.slice(0, 12)}).`);\n }\n }\n if (manifestFile?.matches_recorded === false) {\n tampered(`Artifact manifest ${manifestFile.path} changed after the run completed.`);\n }\n if (!completed) {\n incomplete(`The run is ${state.status}; only completed runs have recorded report digests.`);\n } else if (!recorded) {\n // A fully chained log always ends with a completion event carrying the digest.\n if (chain.status === \"verified\") tampered(\"The completion event is missing from a chained event log; the log was truncated.\");\n else if (chain.status !== \"broken\" && chain.status !== \"empty\") incomplete(\"No report digest was recorded at completion (older TT version).\");\n } else if (files.length === 0) {\n incomplete(\"The recorded report file is missing.\");\n }\n if (completed && recordedManifest && !manifestFile) incomplete(\"The artifact manifest recorded at completion is missing.\");\n if (completed && report && !report.provenance) incomplete(\"The report has no provenance block (older TT version).\");\n return {\n run_id: state.id,\n status: state.status,\n verdict,\n findings,\n chain: { ...chain, unreadable_lines: log.unreadable_lines },\n report: { recorded_sha256: recorded, files },\n artifact_manifest: { recorded_sha256: recordedManifest, file: manifestFile },\n timeline: buildTimeline(events),\n provenance: report?.provenance ?? null,\n };\n}\n","import { appendFile, chmod, copyFile, lstat, mkdir, readdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { defaultStoreRoot } from \"../paths.js\";\nimport type { FineTuneRunRequest, RunReport, SpecSnapshot, TrainingReport } from \"./contracts.js\";\nimport { chainEvent, parseJsonlTolerant, readJsonlTail, sha256File, withAppendLock } from \"./audit.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 /** Hash chain (see audit.ts); absent on events written by older TT versions. */\n seq?: number;\n prev_hash?: string | null;\n hash?: 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\" | \"aws-ssh\";\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 /** Events plus the number of lines an interrupted write left unreadable. */\n getRunEventLog(id: string): Promise<{ events: LocalRunEvent[]; unreadable_lines: number }>;\n getRunReport(id: string): Promise<RunReport>;\n /** Existing report files for a run: the artifact copy and the store copy. */\n getRunReportPaths(id: string): Promise<string[]>;\n listModels(): Promise<LocalModelRecord[]>;\n getModel(id: string): Promise<LocalModelRecord>;\n}\n\nexport function defaultLocalHome(): string {\n return defaultStoreRoot();\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 ensurePrivateDirectory(path: string): Promise<void> {\n await mkdir(path, { recursive: true, mode: 0o700 });\n const metadata = await lstat(path);\n if (metadata.isSymbolicLink()) {\n throw new Error(`Refusing symbolic link in local store: ${path}`);\n }\n if (!metadata.isDirectory()) {\n throw new Error(`Expected local store directory: ${path}`);\n }\n await chmod(path, 0o700);\n}\n\nasync function hardenPrivateTree(path: string): Promise<void> {\n const metadata = await lstat(path);\n if (metadata.isSymbolicLink()) {\n throw new Error(`Refusing symbolic link in local store: ${path}`);\n }\n if (metadata.isDirectory()) {\n await chmod(path, 0o700);\n for (const entry of await readdir(path)) {\n await hardenPrivateTree(join(path, entry));\n }\n return;\n }\n if (metadata.isFile()) {\n await chmod(path, 0o600);\n return;\n }\n throw new Error(`Refusing unsupported filesystem entry in local store: ${path}`);\n}\n\n/** Repair an existing store without creating one when it is absent. */\nexport async function hardenExistingLocalStore(root: string): Promise<boolean> {\n const resolvedRoot = resolve(root);\n let metadata;\n try {\n metadata = await lstat(resolvedRoot);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n if (metadata.isSymbolicLink()) {\n throw new Error(`Refusing symbolic link in local store: ${resolvedRoot}`);\n }\n if (!metadata.isDirectory()) {\n throw new Error(`Expected local store directory: ${resolvedRoot}`);\n }\n await hardenPrivateTree(resolvedRoot);\n return true;\n}\n\nexport async function writePrivateJsonAtomic(path: string, value: unknown): Promise<void> {\n await ensurePrivateDirectory(dirname(path));\n const tmp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`;\n await writeFile(tmp, `${JSON.stringify(value, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(tmp, path);\n await chmod(path, 0o600);\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 ensurePrivateDirectory(dirname(path));\n await appendFile(path, `${JSON.stringify(value)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await chmod(path, 0o600);\n}\n\nasync function writePrivateText(path: string, value: string): Promise<void> {\n await ensurePrivateDirectory(dirname(path));\n await writeFile(path, value, { encoding: \"utf8\", mode: 0o600 });\n await chmod(path, 0o600);\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 ensurePrivateDirectory(dirname(to));\n await copyFile(from, to);\n await chmod(to, 0o600);\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\nfunction isPathInside(root: string, candidate: string): boolean {\n const resolvedRoot = resolve(root);\n const resolvedCandidate = resolve(candidate);\n return resolvedCandidate === resolvedRoot\n || resolvedCandidate.startsWith(`${resolvedRoot}${sep}`);\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 let ensurePromise: Promise<void> | undefined;\n\n async function ensureOnce(): Promise<void> {\n await ensurePrivateDirectory(paths.root);\n await Promise.all([\n ensurePrivateDirectory(paths.specsDir),\n ensurePrivateDirectory(paths.runsDir),\n ensurePrivateDirectory(paths.modelsDir),\n ensurePrivateDirectory(paths.datasetsDir),\n ]);\n await hardenExistingLocalStore(paths.root);\n }\n\n async function ensure(): Promise<void> {\n ensurePromise ??= ensureOnce().catch((error: unknown) => {\n ensurePromise = undefined;\n throw error;\n });\n await ensurePromise;\n }\n\n async function writeRunState(state: LocalRunState): Promise<LocalRunState> {\n await writePrivateJsonAtomic(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 ensurePrivateDirectory(specDir(specId));\n await writePrivateJsonAtomic(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 readRunEventLog(id: string): Promise<{ events: LocalRunEvent[]; unreadable_lines: number }> {\n const state = await getRun(id);\n const path = runEventsPath(state.id);\n if (!await exists(path)) return { events: [], unreadable_lines: 0 };\n const parsed = parseJsonlTolerant<LocalRunEvent>(await readFile(path, \"utf8\"));\n return { events: parsed.rows, unreadable_lines: parsed.unreadable };\n }\n\n async function appendRunEvent(\n state: LocalRunState,\n event: Omit<LocalRunEvent, \"id\" | \"run_id\" | \"occurred_at\" | \"seq\" | \"prev_hash\" | \"hash\">,\n ): Promise<void> {\n const path = runEventsPath(state.id);\n await ensurePrivateDirectory(dirname(path));\n // Serialize appends across processes so each event links to the last one.\n const row = await withAppendLock(`${path}.lock`, async () => {\n // Link to the newest chained event; an older TT process may append unchained ones.\n const { partial } = await readJsonlTail<LocalRunEvent>(path);\n const { last: previous } = await readJsonlTail<LocalRunEvent>(path, (row) => typeof row.hash === \"string\");\n // Terminate a line an interrupted write left open, so this event starts\n // on its own line; the torn fragment stays visible to `tt runs audit`.\n if (partial) await appendFile(path, \"\\n\", { encoding: \"utf8\", mode: 0o600 });\n const chained = chainEvent({\n id: randomUUID(),\n run_id: state.id,\n occurred_at: new Date().toISOString(),\n ...event,\n }, previous as (LocalRunEvent & Record<string, unknown>) | undefined) as LocalRunEvent;\n await appendJsonl(path, chained);\n return chained;\n });\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 await Promise.all([\n rm(join(paths.modelsDir, `local-${previous.id}`), { recursive: true, force: true }),\n rm(runReportPath(previous.id), { force: true }),\n ]);\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 await ensure();\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 writePrivateJsonAtomic(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 writePrivateJsonAtomic(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 writePrivateJsonAtomic(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 await ensure();\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 if (!await exists(reportPath)) {\n throw new Error(`Run report not found: ${reportPath}`);\n }\n await copyIfExists(reportPath, runReportPath(report.run_id));\n if (await exists(cancellationPath(report.run_id))) {\n return preserveCancellationRequestState(report.run_id);\n }\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 if (await exists(cancellationPath(report.run_id))) {\n return preserveCancellationRequestState(report.run_id);\n }\n await writeRunState(state);\n if (await exists(cancellationPath(report.run_id))) {\n return preserveCancellationRequestState(report.run_id);\n }\n const manifestPath = join(artifactDir, \"artifact-manifest.json\");\n await appendRunEvent(state, {\n stage: \"completed\",\n status: \"completed\",\n message: \"Run completed successfully.\",\n details: {\n report_path: reportPath,\n // Pin the published evidence: `tt runs audit` re-hashes these files.\n report_sha256: await sha256File(runReportPath(report.run_id)),\n ...(await exists(manifestPath) ? { artifact_manifest_sha256: await sha256File(manifestPath) } : {}),\n ...(model ? { model_id: model.id } : {}),\n },\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 writePrivateText(cancellationPath(state.id), `${new Date().toISOString()}\\n`);\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 return (await readRunEventLog(id)).events;\n },\n\n getRunEventLog: readRunEventLog,\n\n async getRunReportPaths(id) {\n const state = await getRun(id);\n const candidates: string[] = [];\n // Same containment rule as getRunReport: only the store or the run's artifacts.\n if (state.report_path) {\n const reportPath = resolve(state.report_path);\n const allowedRoots = [resolvedRoot, ...(state.artifact_dir ? [resolve(state.artifact_dir)] : [])];\n if (allowedRoots.some((allowed) => isPathInside(allowed, reportPath))) candidates.push(reportPath);\n }\n candidates.push(runReportPath(state.id));\n const existing: string[] = [];\n for (const path of new Set(candidates)) {\n if ((await lstat(path).catch(() => null))?.isFile()) existing.push(path);\n }\n return existing;\n },\n\n async getRunReport(id) {\n const state = await getRun(id);\n const candidates: string[] = [];\n if (state.report_path) {\n const reportPath = resolve(state.report_path);\n const allowedRoots = [resolvedRoot];\n if (state.artifact_dir) allowedRoots.push(resolve(state.artifact_dir));\n if (allowedRoots.some((allowed) => isPathInside(allowed, reportPath))) {\n candidates.push(reportPath);\n }\n }\n candidates.push(runReportPath(state.id));\n\n for (const path of candidates) {\n if (await exists(path)) return readJson<RunReport>(path);\n }\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 { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { mkdir, readFile, realpath, stat } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline\";\nimport { basename, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { asyncBufferFromFile, parquetMetadataAsync, parquetReadObjects, parquetSchema } from \"hyparquet\";\nimport { compressors } from \"hyparquet-compressors\";\nimport {\n baseModelRevisionSchema,\n datasetSourceSchema,\n fineTuneRunRequestSchema,\n type DatasetSource,\n type FineTuneRunRequest,\n type HuggingFaceDatasetSource,\n type LocalRunnerConfig,\n type BehaviorSpecExample,\n type SpecSnapshot,\n} from \"./contracts.js\";\nimport { buildSystemMessage, datasetInputIdentity, exampleToChatRow } from \"./dataset.js\";\nimport { fileUri, writeFileAtomic, writeJson } from \"./artifacts.js\";\nimport { safeName } from \"./prefetch.js\";\nimport {\n minimalMachineLearningEnvironment,\n withHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport {\n buildBundledPythonCommand,\n runLoggedProcess,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\nimport type { LocalRunReporter } from \"./run-reporter.js\";\nimport { recordAssetDownload } from \"./assets.js\";\n\ntype Split = \"training\" | \"validation\" | \"test\";\nconst SPLITS: readonly Split[] = [\"training\", \"validation\", \"test\"];\n\n/** The spec names a Hugging Face dataset that is not in the local cache yet. */\nexport class DatasetNotDownloadedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DatasetNotDownloadedError\";\n }\n}\n\nexport interface ResolvedHuggingFaceDataset {\n source: DatasetSource;\n localPaths: Partial<Record<Split, string>>;\n}\n\nexport interface DatasetPrefetchReport extends DatasetSource {\n ok: true;\n status: \"completed\" | \"verified\";\n local_files_only: boolean;\n hub_cache: string;\n size_bytes: number;\n artifact_dir?: string;\n log_uri?: string;\n command?: string[];\n manifest_path?: string;\n}\n\ntype HuggingFaceDatasetPrebuilt = NonNullable<FineTuneRunRequest[\"dataset_prebuilt\"]> & {\n huggingface: HuggingFaceDatasetSource;\n};\n\nexport function huggingFaceDataset(\n request: Pick<FineTuneRunRequest, \"dataset_prebuilt\">,\n): HuggingFaceDatasetPrebuilt | undefined {\n const dataset = request.dataset_prebuilt;\n return dataset?.huggingface ? dataset as HuggingFaceDatasetPrebuilt : undefined;\n}\n\nfunction datasetFiles(dataset: HuggingFaceDatasetPrebuilt): Partial<Record<Split, string>> {\n const files: Partial<Record<Split, string>> = {};\n for (const split of SPLITS) if (dataset[split]) files[split] = dataset[split];\n return files;\n}\n\nexport function huggingFaceHubCache(modelCache?: string): string {\n return withHuggingFaceCacheEnvironment(process.env, modelCache).HF_HUB_CACHE!;\n}\n\nfunction repositoryDirectory(hubCache: string, repo: string): string {\n return join(hubCache, `datasets--${repo.replaceAll(\"/\", \"--\")}`);\n}\n\nfunction isStrictDescendant(parent: string, child: string): boolean {\n const path = relative(parent, child);\n return path !== \"\" && path !== \"..\" && !path.startsWith(`..${sep}`) && !isAbsolute(path);\n}\n\nasync function digestFile(path: string, size: number): Promise<{ sha256: string; gitSha1: string }> {\n const sha256 = createHash(\"sha256\");\n const gitSha1 = createHash(\"sha1\").update(`blob ${size}\\0`);\n for await (const chunk of createReadStream(path)) {\n sha256.update(chunk);\n gitSha1.update(chunk);\n }\n return { sha256: sha256.digest(\"hex\"), gitSha1: gitSha1.digest(\"hex\") };\n}\n\nfunction describe(dataset: HuggingFaceDatasetSource): string {\n return `${dataset.repo}@${dataset.revision ?? \"main\"}`;\n}\n\n/**\n * Resolve a Hugging Face dataset from the local cache without network access.\n *\n * Each split file must be a symlink into the repo's content-addressed blob\n * store, and its digest must match the blob name, so a corrupted or tampered\n * cache entry fails here instead of silently training on different data.\n */\nexport async function resolveCachedHuggingFaceDataset(args: {\n dataset: HuggingFaceDatasetPrebuilt;\n modelCache?: string;\n}): Promise<ResolvedHuggingFaceDataset> {\n const source = args.dataset.huggingface;\n const hubCache = huggingFaceHubCache(args.modelCache);\n const repository = repositoryDirectory(hubCache, source.repo);\n const prefetchHint = \"Run `tt datasets prefetch` with this spec (for example `tt datasets prefetch tunedtensor.json`) to download it.\";\n let revision = source.revision;\n if (!revision) {\n const ref = await readFile(join(repository, \"refs\", \"main\"), \"utf8\").catch(() => null);\n const parsed = baseModelRevisionSchema.safeParse(ref?.trim());\n if (!parsed.success) {\n throw new DatasetNotDownloadedError(\n `Hugging Face dataset ${describe(source)} is not in the local cache (${hubCache}). ${prefetchHint}`,\n );\n }\n revision = parsed.data;\n }\n const snapshot = join(repository, \"snapshots\", revision);\n const physicalRepository = await realpath(repository).catch(() => null);\n const blobs = physicalRepository ? join(physicalRepository, \"blobs\") : null;\n const files: Partial<Record<Split, DatasetSource[\"files\"][\"training\"]>> = {};\n const localPaths: ResolvedHuggingFaceDataset[\"localPaths\"] = {};\n for (const [split, path] of Object.entries(datasetFiles(args.dataset)) as Array<[Split, string]>) {\n const local = join(snapshot, ...path.split(/[/\\\\]/));\n const metadata = await stat(local).catch(() => null);\n if (!metadata || !physicalRepository || !blobs) {\n throw new DatasetNotDownloadedError(\n `Hugging Face dataset file ${path} (${split}) from ${source.repo}@${revision} is not in the local cache (${hubCache}). ${prefetchHint}`,\n );\n }\n const target = await realpath(local);\n // Normal caches link into content-addressed blobs. Caches without symlink\n // support (Windows without Developer Mode) hold plain copies in snapshots/.\n if (!metadata.isFile() || !isStrictDescendant(physicalRepository, target)) {\n throw new Error(`Cached dataset file ${local} must resolve inside its Hugging Face cache repository ${physicalRepository}.`);\n }\n if (metadata.size === 0) throw new Error(`Cached dataset file ${path} (${split}) is empty: ${local}`);\n const digests = await digestFile(target, metadata.size);\n const blobName = isStrictDescendant(blobs, target) ? basename(target).toLowerCase() : \"\";\n const expected = /^[0-9a-f]{64}$/.test(blobName) ? digests.sha256 : /^[0-9a-f]{40}$/.test(blobName) ? digests.gitSha1 : null;\n if (expected !== null && expected !== blobName) {\n throw new Error(\n `Cached dataset file ${path} (${split}) failed its checksum (${local}). Delete ${target} and run \\`tt datasets prefetch\\` again.`,\n );\n }\n files[split] = { path, size_bytes: metadata.size, sha256: digests.sha256 };\n localPaths[split] = local;\n }\n return {\n source: datasetSourceSchema.parse({\n provider: \"huggingface\",\n repo: source.repo,\n requested_revision: source.revision ?? null,\n revision,\n pinned: Boolean(source.revision),\n columns: source.columns ?? null,\n snapshot_path: snapshot,\n files,\n }),\n localPaths,\n };\n}\n\ntype ConversionStats = NonNullable<NonNullable<DatasetSource[\"conversion\"]>[\"validation\"]>;\n\ntype DatasetColumns = NonNullable<HuggingFaceDatasetSource[\"columns\"]>;\n\nfunction mappedField(row: Record<string, unknown>, name: string): string | null {\n const value = row[name];\n if (typeof value === \"string\") return value.trim() ? value : null;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") return String(value);\n return null;\n}\n\n/** The first user turn and the assistant reply that directly follows it. */\nfunction firstExchange(value: unknown): BehaviorSpecExample | null {\n if (!Array.isArray(value)) return null;\n const turn = (index: number, role: string) => {\n const message = value[index] as { role?: unknown; content?: unknown } | undefined;\n return message?.role === role && typeof message.content === \"string\" && message.content.trim() ? message.content : null;\n };\n const user = value.findIndex((message) => (message as { role?: unknown } | null)?.role === \"user\");\n const input = user === -1 ? null : turn(user, \"user\");\n const output = user === -1 ? null : turn(user + 1, \"assistant\");\n return input !== null && output !== null ? { input, output } : null;\n}\n\nfunction columnNames(columns: DatasetColumns): string[] {\n return \"messages\" in columns ? [columns.messages] : [columns.input, columns.output];\n}\n\n/** Stream JSONL objects: Hub splits can exceed the maximum string length of a single read. */\nasync function* jsonlRecords(path: string, split: Split): AsyncGenerator<Record<string, unknown>> {\n const lines = createInterface({ input: createReadStream(path, { encoding: \"utf8\" }), crlfDelay: Infinity });\n let index = -1;\n for await (const line of lines) {\n index += 1;\n if (!line.trim()) continue;\n let value: unknown;\n try {\n value = JSON.parse(line);\n } catch (error) {\n throw new Error(`${split} line ${index + 1}: malformed JSON in ${path}`, { cause: error });\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${split} line ${index + 1}: expected a JSON object in ${path}`);\n }\n yield value as Record<string, unknown>;\n }\n}\n\n/** Read only the mapped Parquet columns, one row group at a time to bound memory. */\nasync function* parquetRecords(path: string, split: Split, columns: DatasetColumns): AsyncGenerator<Record<string, unknown>> {\n const file = await asyncBufferFromFile(path);\n const metadata = await parquetMetadataAsync(file);\n const available = parquetSchema(metadata).children.map((child) => child.element.name);\n const missing = columnNames(columns).find((name) => !available.includes(name));\n if (missing) {\n throw new Error(\n `${split} records have no \"${missing}\" field (dataset_prebuilt.huggingface.columns). Available fields: ${available.join(\", \")}`,\n );\n }\n let rowStart = 0;\n for (const group of metadata.row_groups) {\n const rowEnd = rowStart + Number(group.num_rows);\n yield* await parquetReadObjects({ file, metadata, compressors, columns: columnNames(columns), rowStart, rowEnd });\n rowStart = rowEnd;\n }\n}\n\nasync function readMappedRecords(path: string, split: Split, columns: DatasetColumns) {\n const examples: BehaviorSpecExample[] = [];\n let records = 0;\n let skipped = 0;\n const availableFields = new Set<string>();\n const rows = path.toLowerCase().endsWith(\".parquet\") ? parquetRecords(path, split, columns) : jsonlRecords(path, split);\n for await (const row of rows) {\n records += 1;\n for (const name of Object.keys(row)) availableFields.add(name);\n const example = \"messages\" in columns\n ? firstExchange(row[columns.messages])\n : { input: mappedField(row, columns.input), output: mappedField(row, columns.output) };\n if (example === null || example.input === null || example.output === null) {\n skipped += 1;\n continue;\n }\n examples.push({ input: example.input, output: example.output });\n }\n // Diagnose a misspelled mapping only after considering all records. A sparse\n // first record follows the same skip rule as a sparse record anywhere else.\n if (records > 0) {\n for (const name of columnNames(columns)) {\n if (!availableFields.has(name)) {\n throw new Error(\n `${split} records have no \"${name}\" field (dataset_prebuilt.huggingface.columns). `\n + `Available fields: ${[...availableFields].join(\", \")}`,\n );\n }\n }\n }\n return { examples, records, skipped };\n}\n\n/**\n * Convert plain JSONL or Parquet records into TT chat rows with the spec's compiled\n * system message. Hub datasets cannot be edited in place, so the conversion\n * applies three deterministic, recorded rules: records with a missing or blank\n * mapped field are skipped, evaluation splits keep the first of any duplicate\n * input, and training drops inputs that also appear in an evaluation split so\n * held-out metrics stay held out. Output paths are content-addressed by the\n * source digests, mapping and system message, so conversions are reused.\n */\nasync function convertMappedDataset(args: {\n resolved: ResolvedHuggingFaceDataset;\n columns: DatasetColumns;\n spec: SpecSnapshot;\n outputRoot: string;\n}): Promise<{ localPaths: ResolvedHuggingFaceDataset[\"localPaths\"]; conversion: NonNullable<DatasetSource[\"conversion\"]> }> {\n const system = buildSystemMessage(args.spec);\n const splits = Object.keys(args.resolved.localPaths) as Split[];\n const key = createHash(\"sha256\")\n .update(JSON.stringify({\n version: 1,\n sources: splits.map((split) => [split, args.resolved.source.files[split]?.sha256]),\n columns: args.columns,\n system,\n }))\n .digest(\"hex\")\n .slice(0, 16);\n const loaded = new Map<Split, Awaited<ReturnType<typeof readMappedRecords>>>();\n for (const split of splits) {\n loaded.set(split, await readMappedRecords(args.resolved.localPaths[split]!, split, args.columns));\n }\n const evaluationInputs = new Set<string>();\n const kept = new Map<Split, BehaviorSpecExample[]>();\n const conversion: Partial<Record<Split, ConversionStats>> = {};\n for (const split of splits.filter((name) => name !== \"training\")) {\n const seen = new Set<string>();\n const data = loaded.get(split)!;\n const examples = data.examples.filter((example) => {\n const identity = datasetInputIdentity(example.input);\n if (seen.has(identity)) return false;\n seen.add(identity);\n evaluationInputs.add(identity);\n return true;\n });\n kept.set(split, examples);\n conversion[split] = {\n records: data.records,\n kept: examples.length,\n skipped_missing_fields: data.skipped,\n dropped_duplicate_inputs: data.examples.length - examples.length,\n dropped_eval_overlap: 0,\n };\n }\n const training = loaded.get(\"training\")!;\n const trainingExamples = training.examples.filter((example) => !evaluationInputs.has(datasetInputIdentity(example.input)));\n kept.set(\"training\", trainingExamples);\n conversion.training = {\n records: training.records,\n kept: trainingExamples.length,\n skipped_missing_fields: training.skipped,\n dropped_duplicate_inputs: 0,\n dropped_eval_overlap: training.examples.length - trainingExamples.length,\n };\n await mkdir(args.outputRoot, { recursive: true });\n const localPaths: ResolvedHuggingFaceDataset[\"localPaths\"] = {};\n for (const split of splits) {\n const examples = kept.get(split)!;\n if (examples.length === 0) {\n throw new Error(`No usable ${split} records remain after applying dataset_prebuilt.huggingface.columns.`);\n }\n const output = join(args.outputRoot, `${split}-${key}.jsonl`);\n const content = `${examples.map((example) => JSON.stringify(exampleToChatRow(args.spec, example))).join(\"\\n\")}\\n`;\n // A content-addressed name does not guarantee that a local file stayed intact.\n // Regenerate changed conversions from the independently verified source.\n if (await readFile(output, \"utf8\").catch(() => null) !== content) {\n await writeFileAtomic(output, content);\n }\n localPaths[split] = output;\n }\n return { localPaths, conversion: conversion as NonNullable<DatasetSource[\"conversion\"]> };\n}\n\n/**\n * Replace a Hugging Face `dataset_prebuilt` with its cached local files and\n * record the resolved provenance on the request. Requests with local files are\n * returned unchanged, so the call is idempotent.\n */\nexport async function resolveRequestDataset(\n request: FineTuneRunRequest,\n config: Pick<LocalRunnerConfig, \"paths\" | \"artifactRoot\">,\n): Promise<FineTuneRunRequest> {\n const dataset = huggingFaceDataset(request);\n if (!dataset) return request;\n const resolved = await resolveCachedHuggingFaceDataset({ dataset, modelCache: config.paths.modelCache });\n let localPaths = resolved.localPaths;\n let source = resolved.source;\n const columns = dataset.huggingface.columns;\n if (columns) {\n const converted = await convertMappedDataset({\n resolved,\n columns,\n spec: request.spec_snapshot,\n outputRoot: resolve(config.artifactRoot, \"datasets\", \"huggingface\", safeName(dataset.huggingface.repo), resolved.source.revision),\n });\n localPaths = converted.localPaths;\n source = datasetSourceSchema.parse({ ...source, conversion: converted.conversion });\n }\n return fineTuneRunRequestSchema.parse({\n ...request,\n dataset_prebuilt: {\n ...localPaths,\n format: dataset.format,\n },\n dataset_source: source,\n });\n}\n\n/**\n * Download the spec's Hugging Face dataset files into the shared cache, the\n * same way `tt models prefetch` fetches a base model. With `localOnly`, only\n * verify what is already cached (no Python, no network).\n */\nexport async function prefetchHuggingFaceDataset(args: {\n request: Pick<FineTuneRunRequest, \"dataset_prebuilt\">;\n config: LocalRunnerConfig;\n reporter?: LocalRunReporter;\n localOnly?: boolean;\n}): Promise<DatasetPrefetchReport> {\n const dataset = huggingFaceDataset(args.request);\n if (!dataset) {\n throw new Error(\n \"This spec has no dataset_prebuilt.huggingface source. Local dataset files need no download; \"\n + \"set dataset_prebuilt.huggingface.repo to train on a Hugging Face dataset.\",\n );\n }\n const modelCache = args.config.paths.modelCache ? resolve(args.config.paths.modelCache) : undefined;\n const hubCache = huggingFaceHubCache(modelCache);\n if (args.localOnly) {\n const resolved = await resolveCachedHuggingFaceDataset({ dataset, modelCache });\n return {\n ok: true,\n status: \"verified\",\n local_files_only: true,\n hub_cache: hubCache,\n size_bytes: Object.values(resolved.source.files).reduce((total, file) => total + (file?.size_bytes ?? 0), 0),\n ...resolved.source,\n };\n }\n\n const artifactDir = resolve(\n args.config.artifactRoot,\n \"dataset-prefetch\",\n `${safeName(dataset.huggingface.repo)}-${new Date().toISOString().replace(/[:.]/g, \"-\")}`,\n );\n await mkdir(artifactDir, { recursive: true });\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, {\n repo: dataset.huggingface.repo,\n ...(dataset.huggingface.revision ? { revision: dataset.huggingface.revision } : {}),\n files: datasetFiles(dataset),\n ...(modelCache ? { model_cache: modelCache } : {}),\n });\n const entrypoint = buildBundledPythonCommand(\"prefetch_dataset.py\", [\"--input\", inputPath, \"--output\", outputPath]);\n await args.reporter?.onEvent?.({\n stage: \"dataset_prefetch\",\n status: \"running\",\n message: \"Downloading Hugging Face dataset files.\",\n details: { repo: dataset.huggingface.repo, revision: dataset.huggingface.revision ?? \"main\", hub_cache: hubCache, log_path: logPath },\n });\n const { exitCode, stderr } = await runLoggedProcess({\n command: entrypoint.command,\n commandArgs: entrypoint.commandArgs,\n env: withBundledPythonEnvironment(withHuggingFaceCacheEnvironment(minimalMachineLearningEnvironment(process.env), modelCache)),\n logPath,\n reporter: args.reporter ? { ...args.reporter, verbose: true } : undefined,\n stage: \"dataset_prefetch\",\n });\n if (exitCode !== 0) {\n const reason = stderr.trim().split(\"\\n\").filter(Boolean).at(-1);\n throw new Error(\n `Dataset prefetch exited with code ${exitCode}${reason ? `: ${reason}` : \"\"}. See ${logPath}. `\n + \"Rerunning resumes from the files already downloaded.\",\n );\n }\n const output = JSON.parse(await readFile(outputPath, \"utf8\")) as {\n snapshot_revision?: string;\n files?: Record<string, { sha256?: string }>;\n };\n const revision = baseModelRevisionSchema.parse(output.snapshot_revision);\n // Verify independently from Node; this is the same check every run performs.\n const resolved = await resolveCachedHuggingFaceDataset({\n dataset: { ...dataset, huggingface: { ...dataset.huggingface, revision } },\n modelCache,\n });\n for (const [split, file] of Object.entries(resolved.source.files)) {\n if (output.files?.[split]?.sha256 !== file?.sha256) {\n throw new Error(`Dataset prefetch reported a different digest for ${split} than the cached file.`);\n }\n }\n const source = datasetSourceSchema.parse({\n ...resolved.source,\n requested_revision: dataset.huggingface.revision ?? null,\n pinned: Boolean(dataset.huggingface.revision),\n });\n const sizeBytes = Object.values(source.files).reduce((total, file) => total + (file?.size_bytes ?? 0), 0);\n const recorded = await recordAssetDownload({\n kind: \"dataset\",\n repo: source.repo,\n revision: source.revision,\n snapshotPath: source.snapshot_path,\n paths: Object.values(source.files).flatMap((file) => file ? [file.path] : []),\n });\n await args.reporter?.onEvent?.({\n stage: \"dataset_prefetch\",\n status: \"completed\",\n message: \"Dataset files are available in the local Hugging Face cache.\",\n details: { repo: source.repo, revision: source.revision, pinned: source.pinned, size_bytes: sizeBytes },\n });\n return {\n ok: true,\n status: \"completed\",\n local_files_only: false,\n hub_cache: hubCache,\n size_bytes: sizeBytes,\n ...source,\n artifact_dir: artifactDir,\n log_uri: fileUri(logPath),\n command: entrypoint.displayCommand,\n manifest_path: recorded.path,\n };\n}\n\n/**\n * Make sure a Hugging Face dataset is cached before a run, downloading it with\n * progress when it is missing. Returns the request with its dataset resolved\n * to local files, so later validation does not hash the files again.\n */\nexport async function ensureDatasetCached<T extends FineTuneRunRequest>(args: {\n request: T;\n config: LocalRunnerConfig;\n reporter?: LocalRunReporter;\n}): Promise<{ request: FineTuneRunRequest; prefetch: DatasetPrefetchReport | null }> {\n if (!huggingFaceDataset(args.request)) return { request: args.request, prefetch: null };\n try {\n return { request: await resolveRequestDataset(args.request, args.config), prefetch: null };\n } catch (error) {\n if (!(error instanceof DatasetNotDownloadedError) || args.config.dryRun) throw error;\n }\n const prefetch = await prefetchHuggingFaceDataset(args);\n return { request: await resolveRequestDataset(args.request, args.config), prefetch };\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 runProvenanceSchema,\n runReportSchema,\n trainingReportSchema,\n type BehaviorSpecExample,\n type EvalReport,\n type EvalSplit,\n type FineTuneRunRequest,\n type LocalRunnerConfig,\n type RunProvenance,\n type RunReport,\n type TrainingReport,\n} from \"./contracts.js\";\nimport {\n buildSystemMessage,\n compileSpecToJsonl,\n datasetInputIdentity,\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 {\n assertUsableModelArtifact,\n defaultBaseModelRevision,\n isCertifiedTrainingModel,\n localModelArtifactPath,\n resolveRequestedBaseModelRevision,\n} 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 { resolveRequestDataset } from \"./dataset-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 function parseLocalRunnerConfig(\n document: unknown,\n path?: string,\n): LocalRunnerConfig {\n const config = localRunnerConfigSchema.parse(document);\n if (!path) return config;\n const configPath = resolve(path);\n const base = dirname(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 gpu: config.gpu ? { ...config.gpu, identityFile: configPathValue(config.gpu.identityFile) } : undefined,\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\nexport async function loadLocalRunnerConfig(path?: string): Promise<LocalRunnerConfig> {\n if (!path) return parseLocalRunnerConfig({});\n const configPath = resolve(path);\n return parseLocalRunnerConfig(\n await loadJsonFile<unknown>(configPath),\n configPath,\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 = datasetInputIdentity;\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 // A Hugging Face dataset resolves to its cached, checksum-verified files.\n const request = await resolveRequestDataset(\n fineTuneRunRequestSchema.parse(addDryRunPlaceholders(input.request, config.dryRun)),\n config,\n );\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/adapter\");\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 requested = resolveRequestedBaseModelRevision(\n request.spec_snapshot.base_model,\n request.hyperparameters.base_model_revision,\n );\n if (config.paths.baseModel) {\n // A configured directory is certified by content. Only a registry-pinned\n // model may therefore claim a revision; an arbitrary Qwen directory keeps\n // its content fingerprint but does not inherit a user-supplied repo SHA.\n // An uncertified model has no registry pin, so its declared SHA is kept.\n return isCertifiedTrainingModel(request.spec_snapshot.base_model)\n ? defaultBaseModelRevision(request.spec_snapshot.base_model)\n : requested;\n }\n if (requested) return requested;\n if (!request.spec_snapshot.base_model.includes(\"/\")) {\n return defaultBaseModelRevision(request.spec_snapshot.base_model);\n }\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 if (revision) return revision;\n } catch {\n // Fall through to the registered immutable revision, if any.\n }\n return defaultBaseModelRevision(request.spec_snapshot.base_model);\n}\n\n/** Hash a local base model while permitting Hugging Face snapshot file links. */\nexport async function fingerprintLocalBaseModel(\n uri: string,\n expectedModelId?: string,\n modelCache?: string,\n): 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, expectedModelId, modelCache);\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 await store.ensure();\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 ?? undefined,\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/adapter\");\n const bundledSource = resolve(packageRoot, \"training/adapter/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(\n config.paths.baseModel,\n request.spec_snapshot.base_model,\n config.paths.modelCache,\n )\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 // A reused baseline can refresh the manifest before the train stage runs.\n // Verify existing adapter bytes first so that refresh cannot bless changes.\n canReuse = await verifyReusableArtifacts(args.artifacts, [\n args.artifacts.stageMetadataJson,\n args.artifacts.trainingJsonl,\n ], { verifyModel: true });\n }\n if (canReuse) {\n // Each pipeline step refreshes the whole manifest. Check all reusable stage\n // evidence before the first refresh can replace its recorded checksums.\n // Absent outputs or stale fingerprints still follow normal recomputation.\n for (const stage of [\"baseline\", \"train\", \"candidate\"] as const) {\n await canReuseStageArtifact({\n stage,\n prepared,\n config: args.config,\n additionalPaths: stage === \"train\"\n ? []\n : generalRegressionRequiredPaths(prepared, stage),\n });\n }\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.request.spec_snapshot.base_model,\n modelSource: 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.request.spec_snapshot.base_model,\n modelSource: 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.\" : args.config.gpu ? \"Launching training on your AWS GPU.\" : \"Launching local training process.\",\n details: { training_backend: args.config.gpu && !args.config.dryRun ? \"aws-ssh\" : \"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 // Python loads a configured snapshot by local path, but still needs this\n // certified revision to enforce registry-pinned model provenance.\n baseModelRevision: 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.request.spec_snapshot.base_model,\n modelSource: 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.request.spec_snapshot.base_model,\n modelSource: 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\nexport interface SpecFileIdentity {\n path: string;\n sha256: string;\n}\n\nasync function buildRunProvenance(args: {\n prepared: PreparedRun;\n config: LocalRunnerConfig;\n training: TrainingReport;\n recordedAt: string;\n specFile?: SpecFileIdentity;\n}): Promise<RunProvenance> {\n const { metadata, request } = args.prepared;\n const gpu = args.config.gpu;\n return runProvenanceSchema.parse({\n schema_version: 1,\n recorded_at: args.recordedAt,\n software: {\n tt_version: await packageVersion(),\n node_version: process.version,\n platform: process.platform,\n arch: process.arch,\n runtime_fingerprint: metadata.runtime_fingerprint,\n python_lock_sha256: await hashFileIfPresent(resolve(packageRoot, \"training/adapter/uv.lock\")),\n },\n execution: {\n target: gpu ? \"aws\" : \"local\",\n training_backend: args.training.provider,\n ...(gpu ? { instance_id: gpu.instanceId, ...(gpu.region ? { region: gpu.region } : {}) } : {}),\n },\n spec: {\n behavior_spec_id: request.behavior_spec_id,\n run_number: request.run_number,\n snapshot_sha256: hashJson(request.spec_snapshot),\n system_prompt_sha256: metadata.system_prompt_sha256,\n ...(args.specFile ? { file_path: args.specFile.path, file_sha256: args.specFile.sha256 } : {}),\n },\n base_model: {\n id: request.spec_snapshot.base_model,\n revision: metadata.base_model_revision,\n fingerprint: metadata.base_model_fingerprint,\n },\n data: {\n prebuilt: metadata.dataset_prebuilt,\n format: metadata.dataset_format,\n file_sha256: metadata.dataset_fingerprints,\n compiled_training_sha256: await hashFileIfPresent(args.prepared.artifacts.trainingJsonl),\n training_examples: metadata.training_example_count,\n eval_split: metadata.eval_split,\n eval_sample_seed: metadata.eval_sample_seed,\n eval_examples_total: metadata.eval_examples_total,\n eval_examples_used: metadata.eval_examples_used,\n },\n training: {\n hyperparameters: request.hyperparameters,\n exit_code: args.training.exit_code,\n log_uri: args.training.log_uri,\n },\n source_fingerprint: metadata.source_fingerprint,\n });\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 specFile?: SpecFileIdentity;\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 provenance = await buildRunProvenance({\n prepared: args.prepared,\n config: args.config,\n training,\n recordedAt: completedAt,\n specFile: args.specFile,\n });\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 provenance,\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 ...(args.prepared.request.dataset_source ? { dataset_source: args.prepared.request.dataset_source } : {}),\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 projectSpec?: import(\"./contracts.js\").LocalBehaviorSpecFile;\n reporter?: LocalRunReporter;\n /** The spec file this run was planned from, recorded in provenance. */\n specFile?: SpecFileIdentity;\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 await writeJsonAtomic(join(artifacts.runDir, \"resolved-workflow.json\"), {\n spec: input.projectSpec ?? {\n ...input.request.spec_snapshot,\n hyperparameters: input.request.hyperparameters,\n dataset_prebuilt: input.request.dataset_prebuilt,\n },\n request: input.request,\n runtime: input.config,\n pipeline,\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 specFile: input.specFile,\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 specFile?: SpecFileIdentity;\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, randomUUID } from \"node:crypto\";\nimport { mkdtemp, mkdir, realpath, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type { LocalRunnerConfig } from \"./contracts.js\";\nimport { runLoggedProcess, ProcessCancelledError } from \"./process-runner.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\nimport { withHuggingFaceCacheEnvironment } from \"./huggingface-cache.js\";\n\nexport type AwsGpuConfig = NonNullable<LocalRunnerConfig[\"gpu\"]>;\ntype ProcessArgs = Parameters<typeof runLoggedProcess>[0];\nexport interface GpuFile {\n path: string;\n direction: \"input\" | \"output\" | \"both\";\n directory?: boolean;\n}\n\nexport function shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\n/** Resolve with the user's normal AWS CLI credential chain; credentials never go to EC2. */\nexport async function resolveGpuHost(gpu: AwsGpuConfig): Promise<string> {\n let stdout = \"\";\n const result = await runLoggedProcess({\n command: \"aws\",\n commandArgs: [\"ec2\", \"describe-instances\", \"--instance-ids\", gpu.instanceId,\n ...(gpu.profile ? [\"--profile\", gpu.profile] : []),\n ...(gpu.region ? [\"--region\", gpu.region] : []), \"--output\", \"json\", \"--no-cli-pager\"],\n timeoutMs: 30_000,\n stage: \"gpu_connect\",\n onLine: (line, stream) => { if (stream === \"stdout\") stdout += line; },\n });\n if (result.exitCode !== 0) throw new Error(`AWS GPU lookup failed: ${result.stderr}`);\n const instances = JSON.parse(stdout).Reservations?.flatMap((r: { Instances?: unknown[] }) => r.Instances ?? []);\n const instance = instances?.find((i: { InstanceId: string }) => i.InstanceId === gpu.instanceId);\n if (instance?.State?.Name !== \"running\") throw new Error(`AWS GPU instance ${gpu.instanceId} must already be running.`);\n const host = gpu.privateIp ? instance.PrivateIpAddress : instance.PublicIpAddress;\n if (typeof host !== \"string\" || !/^[0-9.]+$/.test(host)) {\n throw new Error(\"AWS GPU instance has no selected IP address. Use privateIp with a reachable VPC/VPN, or assign a public IP.\");\n }\n return `${gpu.user}@${host}`;\n}\n\nfunction sshOptions(gpu: AwsGpuConfig): string[] {\n return [\"-o\", \"BatchMode=yes\", \"-o\", \"StrictHostKeyChecking=yes\", \"-o\", \"ConnectTimeout=15\",\n \"-o\", \"ServerAliveInterval=15\", \"-o\", \"ServerAliveCountMax=3\",\n ...(gpu.identityFile ? [\"-i\", gpu.identityFile] : [])];\n}\n\nexport async function checkAwsGpu(gpu: AwsGpuConfig): Promise<void> {\n const host = await resolveGpuHost(gpu);\n const result = await runLoggedProcess({ command: \"ssh\", commandArgs: [...sshOptions(gpu), host,\n `bash -lc ${shellQuote(\"command -v uv && command -v rsync && command -v timeout && command -v setsid && nvidia-smi\")}`],\n stage: \"gpu_check\", timeoutMs: 30_000 });\n if (result.exitCode !== 0) throw new Error(`AWS GPU preflight failed: ${result.stderr}`);\n}\n\n/** Only transfer the verified snapshot, never the Hugging Face cache's token files. */\nexport function gpuBaseModelPath(config: LocalRunnerConfig, model: string, revision?: string): string {\n if (config.paths.baseModel) return resolve(config.paths.baseModel);\n if (!revision || !/^[a-f0-9]{40}$/i.test(revision)) {\n throw new Error(\"AWS GPU execution needs an immutable base-model revision. Run tt models prefetch first or configure paths.baseModel.\");\n }\n const env = withHuggingFaceCacheEnvironment(process.env, config.paths.modelCache);\n return join(env.HF_HUB_CACHE!, `models--${model.replaceAll(\"/\", \"--\")}`, \"snapshots\", revision);\n}\n\n/** Resolve existing parents too, so a symlink cannot disguise overlapping output trees. */\nasync function physicalTransferPath(path: string): Promise<string> {\n try { return await realpath(path); }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\" || dirname(path) === path) throw error;\n return join(await physicalTransferPath(dirname(path)), basename(path));\n }\n}\n\nasync function assertSeparateTransferPaths(files: GpuFile[]): Promise<void> {\n const paths = await Promise.all(files.map((file) => physicalTransferPath(resolve(file.path))));\n for (let i = 0; i < files.length; i += 1) {\n for (let j = 0; j < i; j += 1) {\n if (files[i]!.direction === \"input\" && files[j]!.direction === \"input\") continue;\n const left = paths[i]!;\n const right = paths[j]!;\n if (left === right || (files[i]!.directory && right.startsWith(`${left}/`))\n || (files[j]!.directory && left.startsWith(`${right}/`))) {\n throw new Error(`GPU transfer paths overlap: ${files[i]!.path} and ${files[j]!.path}. Use separate input, output, recovery, and backup directories.`);\n }\n }\n }\n}\n\n/** One process boundary: the orchestrator and all output validation remain local. */\nexport async function runGpuProcess(args: ProcessArgs & {\n gpu: AwsGpuConfig;\n runtime: \"adapter\" | \"foundation\";\n files: GpuFile[];\n document?: { path: string; value: Record<string, unknown>; pathKeys: string[] };\n}): Promise<Awaited<ReturnType<typeof runLoggedProcess>>> {\n if (await args.shouldCancel?.()) throw new ProcessCancelledError();\n await assertSeparateTransferPaths(args.files);\n const host = await resolveGpuHost(args.gpu);\n const options = sshOptions(args.gpu);\n // Stable paths preserve foundation checkpoint corpus identities across resume.\n // An exclusive directory below prevents simultaneous use or accidental deletion of old work.\n const identity = args.logPath ? createHash(\"sha256\").update(resolve(args.logPath)).digest(\"hex\").slice(0, 32) : randomUUID();\n const root = `/tmp/tt-gpu-${identity}`;\n const scratch = await mkdtemp(join(tmpdir(), \"tt-gpu-\"));\n const runtime = join(localRuntimePackageRoot(import.meta.url), \"training\", args.runtime);\n const mappings = args.files.map((file, index) => ({ ...file, path: resolve(file.path), remote: `${root}/files/${index}/${basename(file.path)}` }));\n const mapPath = (path: string): string => {\n const absolute = resolve(path);\n const match = [...mappings].sort((a, b) => b.path.length - a.path.length)\n .find((file) => absolute === file.path || (file.directory && absolute.startsWith(`${file.path}/`)));\n if (match) return match.remote + absolute.slice(match.path.length);\n if (absolute === runtime || absolute.startsWith(`${runtime}/`)) return `${root}/runtime${absolute.slice(runtime.length)}`;\n throw new Error(`GPU process path is not declared for transfer: ${path}`);\n };\n const transport = async (command: string, commandArgs: string[], cancellable = true) => {\n const result = await runLoggedProcess({ command, commandArgs, stage: args.stage,\n reporter: args.reporter, timeoutMs: 30 * 60_000,\n shouldCancel: cancellable ? args.shouldCancel : undefined });\n if (result.exitCode !== 0) throw new Error(`${command} failed for ${host}: ${result.stderr}`);\n };\n const ssh = async (script: string, cancellable = true) => transport(\"ssh\", [...options, host, script], cancellable);\n const sync = async (source: string, destination: string, upload: boolean, cancellable = true, mirror = false) => {\n await transport(\"rsync\", [\"-rlt\", \"--copy-links\", \"--protect-args\", \"--modify-window=-1\", \"--chmod=Du=rwx,Dgo=,Fu=rw,Fgo=\",\n ...(!upload ? [\"--delay-updates\", ...(mirror ? [\"--delete-delay\"] : [])] : []),\n \"--exclude=.venv\", \"--exclude=__pycache__\", \"--exclude=.git\",\n \"-e\", [\"ssh\", ...options].map(shellQuote).join(\" \"), \"--\",\n upload ? source : `${host}:${source}`, upload ? `${host}:${destination}` : destination], cancellable);\n };\n const grace = Math.ceil((args.shutdownGraceMs ?? 5_000) / 1000);\n const stop = `kill -TERM -- -\"$pid\" 2>/dev/null || true; remaining=${grace}; while kill -0 -- -\"$pid\" 2>/dev/null && [ \"$remaining\" -gt 0 ]; do sleep 1; remaining=$((remaining - 1)); done; kill -KILL -- -\"$pid\" 2>/dev/null || true`;\n const owner = randomUUID();\n let reservationAttempted = false;\n let started = false;\n let completed = false;\n try {\n reservationAttempted = true;\n await ssh(`umask 077; mkdir ${root} && printf '%s' ${shellQuote(owner)} > ${root}/.owner && mkdir ${root}/runtime ${root}/files`).catch((error) => {\n if (error instanceof ProcessCancelledError) throw error;\n throw new Error(`Cannot reserve GPU staging directory ${host}:${root}. Another process or unrecovered artifacts may be present. ${error instanceof Error ? error.message : error}`);\n });\n for (const name of [\"pyproject.toml\", \"uv.lock\", \"src\"]) {\n await sync(join(runtime, name), `${root}/runtime/`, true);\n }\n for (const file of mappings) {\n await ssh(`mkdir -p ${shellQuote(file.directory ? file.remote : dirname(file.remote))}`);\n if (file.direction !== \"output\") {\n const exists = await stat(file.path).catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\" && file.direction === \"both\") return undefined;\n throw error;\n });\n if (exists) await sync(file.path + (file.directory ? \"/\" : \"\"), file.remote + (file.directory ? \"/\" : \"\"), true);\n }\n }\n if (args.document) {\n const value = { ...args.document.value };\n for (const key of args.document.pathKeys) if (typeof value[key] === \"string\") value[key] = mapPath(value[key]);\n const path = join(scratch, \"document.json\");\n await writeFile(path, JSON.stringify(value), { mode: 0o600 });\n await sync(path, mapPath(args.document.path), true);\n }\n // Deliberately forward only process settings, not the laptop's environment or credentials.\n const env: Record<string, string> = { UV_PROJECT_ENVIRONMENT: `${root}/venv`, TORCH_DISABLE_NATIVE_JIT: \"1\",\n HF_HUB_OFFLINE: \"1\", TRANSFORMERS_OFFLINE: \"1\" };\n for (const [key, value] of Object.entries(args.env ?? {})) {\n if (value === undefined) continue;\n if (key === \"BACKEND\") env[key] = value;\n if ([\"SM_CHANNEL_TRAINING\", \"SM_CHANNEL_BASE_MODEL\", \"SM_MODEL_DIR\", \"SM_OUTPUT_DIR\", \"TT_HYPERPARAMETERS_PATH\"].includes(key)) env[key] = mapPath(value);\n }\n const commandArgs = args.commandArgs.map((value) => value.startsWith(\"/\") ? mapPath(value) : value);\n const command = [\"env\", ...Object.entries(env).map(([key, value]) => `${key}=${value}`), args.command, ...commandArgs].map(shellQuote).join(\" \");\n // The remote deadline also bounds orphaned work after a lost connection or laptop power loss.\n const script = `umask 077; cd ${root}; setsid timeout -k 120 ${args.gpu.maxSeconds}s ${command} & pid=$!; echo \"$pid\" > pid; trap ${shellQuote(stop)} HUP INT TERM; wait \"$pid\"`;\n await args.reporter?.onEvent?.({ stage: args.stage, status: \"running\", message: `Running GPU process on ${args.gpu.instanceId}.`, details: { remote_directory: root } });\n started = true;\n const result = await runLoggedProcess({ ...args, env: process.env, command: \"ssh\",\n commandArgs: [...options, \"-tt\", host, `bash -lc ${shellQuote(script)}`] });\n completed = result.exitCode === 0;\n return result;\n } finally {\n try {\n if (started) {\n await ssh(`bash -c ${shellQuote(`if test -f ${root}/pid; then pid=$(cat ${root}/pid); ${stop}; fi`)}`, false);\n for (const file of mappings.filter((file) => file.direction !== \"input\")) {\n await mkdir(file.directory ? file.path : dirname(file.path), { recursive: true });\n if (!completed && !file.directory) {\n const exists = await runLoggedProcess({ command: \"ssh\", commandArgs: [...options, host, `test -e ${shellQuote(file.remote)}`], stage: args.stage, timeoutMs: 30_000 });\n if (exists.exitCode === 1) continue;\n if (exists.exitCode !== 0) throw new Error(\"Cannot inspect remote outputs.\");\n }\n await sync(file.remote + (file.directory ? \"/\" : \"\"), file.path + (file.directory ? \"/\" : \"\"), false, false, file.directory === true && file.direction === \"both\");\n }\n }\n // SSH may have been interrupted after reserving the directory but before replying.\n // Only remove a reservation made by this invocation, never another run's files.\n if (reservationAttempted) await ssh(`if [ \"$(cat ${root}/.owner 2>/dev/null)\" = ${shellQuote(owner)} ]; then rm -rf -- ${root}; fi`, false);\n } catch (error) {\n throw new Error(`GPU cleanup or artifact retrieval failed. Remote files remain at ${host}:${root}. ${error instanceof Error ? error.message : error}`);\n } finally {\n await rm(scratch, { recursive: true, force: true });\n }\n }\n}\n","import { runGpuProcess, gpuBaseModelPath, type GpuFile } from \"./gpu-executor.js\";\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, stat, 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 {\n createLocalStore,\n defaultLocalHome,\n hardenExistingLocalStore,\n writePrivateJsonAtomic,\n} from \"./store.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\nimport {\n minimalMachineLearningEnvironment,\n withOfflineHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport { defaultBaseModelRevision, resolveModelLoader, resolveRequestedBaseModelRevision } from \"./model-registry.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 modelSource: 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 model_source: args.modelSource,\n base_model_revision: args.baseModelRevision,\n model_loader: resolveModelLoader(args.baseModelId),\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\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 gpu = args.config.evaluation.inference.device === \"cuda\" ? args.config.gpu : undefined;\n const execute = gpu ? async (processArgs: Parameters<typeof runLoggedProcess>[0]) => {\n const document = JSON.parse(await readFile(inputPath, \"utf8\"));\n document.model_source = gpuBaseModelPath(args.config, args.baseModelId, args.baseModelRevision);\n delete document.model_cache;\n const files: GpuFile[] = [\n { path: inputPath, direction: \"input\" },\n { path: outputPath, direction: \"output\" },\n { path: document.model_source, direction: \"input\", directory: true },\n ...(document.adapter_path ? [{ path: document.adapter_path, direction: \"input\" as const,\n directory: (await stat(document.adapter_path)).isDirectory() }] : []),\n ];\n return runGpuProcess({ ...processArgs, gpu, runtime: \"adapter\", files,\n document: { path: inputPath, value: document, pathKeys: [\"model_source\", \"adapter_path\"] } });\n } : runLoggedProcess;\n const result = await execute({\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 baselineStoreRoot(config: LocalRunnerConfig): string {\n return config.storeRoot ? resolve(config.storeRoot) : defaultLocalHome();\n}\n\nfunction baselineCachePath(config: LocalRunnerConfig, key: string): string {\n return join(baselineStoreRoot(config), \"cache\", \"baseline-evals\", `${key}.json`);\n}\n\nasync function readBaselineCache(config: LocalRunnerConfig, path: string): Promise<EvalReport | null> {\n await hardenExistingLocalStore(baselineStoreRoot(config));\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 modelSource?: 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 baseModelId = args.baseModelId ?? args.modelId;\n const requestedBaseModelRevision = resolveRequestedBaseModelRevision(\n baseModelId,\n args.baseModelRevision,\n );\n const localModelSource = args.modelSource\n ? resolve(args.modelSource) !== resolve(baseModelId)\n : false;\n const baseModelRevision = localModelSource\n ? defaultBaseModelRevision(baseModelId)\n : requestedBaseModelRevision;\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,\n sourceFingerprint: args.sourceFingerprint,\n config: args.config,\n });\n const cacheKey = cacheEligible\n ? baselineCacheKey({\n modelId: args.modelId,\n 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(args.config, 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,\n modelSource: args.modelSource ?? args.modelId,\n 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 createLocalStore(baselineStoreRoot(args.config)).ensure();\n await writePrivateJsonAtomic(\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 { runGpuProcess, gpuBaseModelPath } from \"./gpu-executor.js\";\nimport { 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\";\nimport { verifyLocalBaseModel } from \"./prefetch.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 model_loader: model.modelLoader,\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 lora_target_modules: Array.isArray(model.loraTargetModules)\n ? model.loraTargetModules.join(\",\")\n : model.loraTargetModules,\n gradient_checkpointing: String(model.gradientCheckpointing),\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 const remoteBaseModel = config.gpu\n ? gpuBaseModelPath(config, request.spec_snapshot.base_model, args.baseModelRevision)\n : undefined;\n if (remoteBaseModel) childEnv.SM_CHANNEL_BASE_MODEL = remoteBaseModel;\n\n if (config.paths.modelCache) await mkdir(resolve(config.paths.modelCache), { recursive: true });\n if (config.paths.baseModel) {\n await verifyLocalBaseModel(\n resolve(config.paths.baseModel),\n request.spec_snapshot.base_model,\n config.paths.modelCache,\n );\n }\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 execute = config.gpu ? (processArgs: Parameters<typeof runLoggedProcess>[0]) => runGpuProcess({\n ...processArgs, gpu: config.gpu!, runtime: \"adapter\",\n files: [\n { path: artifacts.trainingInputDir, direction: \"input\", directory: true },\n { path: artifacts.trainingConfigDir, direction: \"input\", directory: true },\n { path: remoteBaseModel!, direction: \"input\", directory: true },\n { path: artifacts.trainingModelDir, direction: \"output\", directory: true },\n { path: artifacts.trainingOutputDir, direction: \"output\", directory: true },\n ],\n }) : runLoggedProcess;\n const { exitCode } = await execute({\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: config.gpu ? \"aws-ssh\" : \"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","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { loadLocalRunInput, type LocalRunInput } from \"./local-project.js\";\nimport { parseLocalRunnerConfig } from \"./orchestrator.js\";\nimport type { LocalBehaviorSpecFile, LocalRunnerConfig } from \"./contracts.js\";\nimport { DEFAULT_PROJECT_STORE_ROOT, expandUserPath } from \"../paths.js\";\n\nexport function configForSpec(spec: LocalBehaviorSpecFile, specPath: string): LocalRunnerConfig {\n return parseLocalRunnerConfig({\n storeRoot: process.env.TT_LOCAL_HOME?.trim() ? expandUserPath(process.env.TT_LOCAL_HOME.trim()) : DEFAULT_PROJECT_STORE_ROOT,\n ...spec.runtime,\n ...(spec.evaluation ? { evaluation: spec.evaluation } : {}),\n }, specPath);\n}\n\n/** Direct downloads can run before a valid adapter spec exists. */\nexport async function resolveDownloadConfig(specPath: string, configPath?: string, warn?: (message: string) => void): Promise<LocalRunnerConfig> {\n let input: LocalRunInput | undefined;\n try {\n if (existsSync(specPath)) input = await loadLocalRunInput(specPath);\n } catch (error) {\n // Invalid documents cannot contribute settings, but I/O failures should remain visible.\n if ((error as NodeJS.ErrnoException).code) throw error;\n }\n if (input?.kind === \"spec\") return (await resolveProjectConfig(specPath, configPath, warn, input)).config;\n return configPath\n ? parseLocalRunnerConfig(JSON.parse(await readFile(configPath, \"utf8\")), resolve(configPath))\n : parseLocalRunnerConfig({});\n}\n\nexport async function resolveProjectConfig(specPath: string, configPath?: string, warn?: (message: string) => void, loaded?: LocalRunInput): Promise<{ config: LocalRunnerConfig; legacyConfigPath?: string }> {\n const input = loaded ?? (existsSync(specPath) ? await loadLocalRunInput(specPath) : undefined);\n const spec = input && input.kind !== \"request\" ? input.spec : undefined;\n // Approval snapshots already contain the reviewed, resolved configuration.\n // Do not reopen an adjacent mutable legacy config in the child process.\n if (!configPath && spec?.runtime && /^\\..+\\.tt-agent-[0-9a-f-]+\\.json$/.test(basename(specPath))) {\n return { config: configForSpec(spec, specPath) };\n }\n const candidate = configPath ? resolve(configPath) : join(dirname(resolve(specPath)), \"local-runner.json\");\n if (configPath || existsSync(candidate)) {\n const legacy = parseLocalRunnerConfig(JSON.parse(await readFile(candidate, \"utf8\")), candidate);\n if (spec?.runtime || spec?.evaluation) {\n throw new Error(\"Conflicting configuration sources: tunedtensor.json contains runtime/evaluation settings and a legacy runner config is present. Migrate to tunedtensor.json; do not silently override the spec.\");\n }\n warn?.(\"Legacy local-runner.json detected; migrate its settings into tunedtensor.json with tt pipeline migrate.\");\n return { config: legacy, legacyConfigPath: candidate };\n }\n return { config: spec ? configForSpec(spec, specPath) : parseLocalRunnerConfig({}) };\n}\n","/** Bytes in one gibibyte. */\nexport const GIB = 1024 ** 3;\n\nexport function gib(n: number): number {\n return Math.round(n * GIB);\n}\n\nexport const FOUNDATION_DEFAULT_DEPTH = 2;\nexport const FOUNDATION_MAX_DEPTH = 64;\nexport const FOUNDATION_DEFAULT_VOCAB = 256;\nexport const FOUNDATION_DEFAULT_SEQUENCE = 64;\nexport const FOUNDATION_DEFAULT_BATCH = 2;\n\n/**\n * Conservative disk/VRAM bands for certified adapter workloads.\n * Headroom is intentional; these are not generic Hugging Face size charts.\n */\nexport interface AdapterMemoryProfile {\n id: string;\n /** Hugging Face cache / snapshot size. */\n diskBytes: number;\n /** Weights + KV/overhead for eval or serve. */\n inferenceBytes: number;\n /** LoRA SFT at the model's default seq/batch. */\n trainBytes: number;\n sparkClass: boolean;\n}\n\nexport const ADAPTER_MEMORY_PROFILES: readonly AdapterMemoryProfile[] = [\n {\n id: \"Qwen/Qwen3.5-2B\",\n diskBytes: gib(8),\n inferenceBytes: gib(8),\n trainBytes: gib(16),\n sparkClass: false,\n },\n {\n id: \"nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16\",\n diskBytes: gib(80),\n inferenceBytes: gib(80),\n trainBytes: gib(96),\n sparkClass: true,\n },\n {\n id: \"meta-models/Muse-Glimmer-30B\",\n diskBytes: gib(80),\n inferenceBytes: gib(80),\n trainBytes: gib(96),\n sparkClass: true,\n },\n];\n\nexport function adapterMemoryProfile(modelId: string): AdapterMemoryProfile | undefined {\n const normalized = modelId.trim().toLowerCase();\n return ADAPTER_MEMORY_PROFILES.find((profile) => profile.id.toLowerCase() === normalized);\n}\n\n/** Same width derivation as training/foundation/src/model.py. */\nexport function foundationWidth(depth: number): number {\n return 32 * depth;\n}\n\n/**\n * Approximate parameter count for the bundled FoundationGPT\n * (tied embeddings, width = 32 * depth).\n */\nexport function foundationParamCount(\n depth: number,\n vocabSize = FOUNDATION_DEFAULT_VOCAB,\n sequenceLength = FOUNDATION_DEFAULT_SEQUENCE,\n): number {\n const width = foundationWidth(depth);\n return 12 * depth * width * width + vocabSize * width + sequenceLength * width;\n}\n\n/**\n * Conservative training-byte estimate: 16 bytes/param (weights + Adam)\n * plus activation slack at default batch/sequence.\n */\nexport function foundationTrainBytes(\n depth: number,\n options: {\n vocabSize?: number;\n sequenceLength?: number;\n batchSize?: number;\n } = {},\n): number {\n const vocabSize = options.vocabSize ?? FOUNDATION_DEFAULT_VOCAB;\n const sequenceLength = options.sequenceLength ?? FOUNDATION_DEFAULT_SEQUENCE;\n const batchSize = options.batchSize ?? FOUNDATION_DEFAULT_BATCH;\n const params = foundationParamCount(depth, vocabSize, sequenceLength);\n const width = foundationWidth(depth);\n const activationSlack = batchSize * sequenceLength * width * depth * 64;\n return 16 * params + activationSlack;\n}\n\nexport function foundationInferenceBytes(\n depth: number,\n options: { vocabSize?: number; sequenceLength?: number } = {},\n): number {\n const params = foundationParamCount(\n depth,\n options.vocabSize ?? FOUNDATION_DEFAULT_VOCAB,\n options.sequenceLength ?? FOUNDATION_DEFAULT_SEQUENCE,\n );\n return 4 * params + gib(0.25);\n}\n\nexport function isUnifiedGpuName(name: string | undefined): boolean {\n if (!name) return false;\n return /spark|gb10/i.test(name);\n}\n","import {\n ADAPTER_MEMORY_PROFILES,\n FOUNDATION_DEFAULT_DEPTH,\n FOUNDATION_MAX_DEPTH,\n adapterMemoryProfile,\n foundationInferenceBytes,\n foundationTrainBytes,\n isUnifiedGpuName,\n type AdapterMemoryProfile,\n} from \"./capability-profiles.js\";\nimport type { HostGpu, HostInventory } from \"./host-inventory.js\";\n\nexport type CapabilityVerdictStatus = \"ready\" | \"tight\" | \"not_possible\";\nexport type CapabilityWorkload = \"train\" | \"finetune\" | \"inference\";\n\nexport interface CapabilityVerdict {\n status: CapabilityVerdictStatus;\n reason: string;\n required_bytes?: number;\n available_bytes?: number;\n}\n\nexport interface AdapterCapability {\n id: string;\n spark_class: boolean;\n train: CapabilityVerdict;\n finetune: CapabilityVerdict;\n inference: CapabilityVerdict;\n}\n\nexport interface FoundationCapability {\n default_depth: number;\n suggested_max_depth: number;\n train: CapabilityVerdict;\n finetune: CapabilityVerdict;\n inference: CapabilityVerdict;\n serve: CapabilityVerdict;\n}\n\nexport interface CapabilityReport {\n cuda_available: boolean;\n gpu?: HostGpu;\n adapters: AdapterCapability[];\n foundation: FoundationCapability;\n notes: string[];\n}\n\nconst HEADROOM = 1.2;\nconst FIT_RATIO = 0.7;\n\nfunction formatGiB(bytes: number): string {\n const amount = bytes / (1024 ** 3);\n const precision = amount >= 10 ? 0 : 1;\n return `${amount.toFixed(precision)} GiB`;\n}\n\nfunction compareFit(available: number | undefined, required: number, missing: string): CapabilityVerdict {\n if (available === undefined) {\n return { status: \"not_possible\", reason: missing, required_bytes: required };\n }\n if (available < required) {\n return {\n status: \"not_possible\",\n reason: `needs ~${formatGiB(required)}; ${formatGiB(available)} available`,\n required_bytes: required,\n available_bytes: available,\n };\n }\n if (available < required * HEADROOM) {\n return {\n status: \"tight\",\n reason: `fits in ${formatGiB(available)} with little headroom (needs ~${formatGiB(required)})`,\n required_bytes: required,\n available_bytes: available,\n };\n }\n return {\n status: \"ready\",\n reason: `${formatGiB(available)} available (needs ~${formatGiB(required)})`,\n required_bytes: required,\n available_bytes: available,\n };\n}\n\nfunction trainingBlockers(inventory: HostInventory): string[] {\n const blockers: string[] = [];\n if (!inventory.node.ok) blockers.push(`Node ${inventory.node.version} is below 22`);\n if (inventory.uv && !inventory.uv.ok) blockers.push(inventory.uv.message);\n if (inventory.python && !inventory.python.ok) blockers.push(inventory.python.message);\n return blockers;\n}\n\nfunction cudaAvailable(inventory: HostInventory): boolean {\n if (inventory.python?.ok && inventory.python.cuda_available !== undefined) {\n return inventory.python.cuda_available;\n }\n return inventory.nvidia_smi.ok && inventory.gpus.length > 0;\n}\n\nfunction trainingGpu(inventory: HostInventory): HostGpu | undefined {\n const listed = inventory.gpus.find((gpu) => gpu.index === 0) ?? inventory.gpus[0];\n if (listed) {\n if (!listed.memory_total_bytes && inventory.python?.total_memory_bytes) {\n return { ...listed, memory_total_bytes: inventory.python.total_memory_bytes };\n }\n // nvidia-smi reports memory.total as [N/A] on unified-memory GPUs (GB10 /\n // DGX Spark); the GPU's pool is system RAM.\n if (!listed.memory_total_bytes && (listed.unified_memory || isUnifiedGpuName(listed.name))) {\n return { ...listed, memory_total_bytes: inventory.os.total_memory_bytes, unified_memory: true };\n }\n return listed;\n }\n if (inventory.python?.cuda_device) {\n return {\n index: 0,\n name: inventory.python.cuda_device,\n memory_total_bytes: inventory.python.total_memory_bytes,\n unified_memory: isUnifiedGpuName(inventory.python.cuda_device),\n };\n }\n return undefined;\n}\n\nfunction gpuMemory(gpu: HostGpu | undefined): number | undefined {\n return gpu?.memory_total_bytes;\n}\n\nfunction diskForCache(inventory: HostInventory): number | undefined {\n return inventory.disks.find((disk) => disk.name === \"model-cache\")?.free_bytes;\n}\n\nfunction worse(left: CapabilityVerdict, right: CapabilityVerdict): CapabilityVerdict {\n const rank = { not_possible: 2, tight: 1, ready: 0 };\n return rank[left.status] >= rank[right.status] ? left : right;\n}\n\nfunction withBlockers(verdict: CapabilityVerdict, blockers: string[]): CapabilityVerdict {\n if (blockers.length === 0) return verdict;\n return {\n status: \"not_possible\",\n reason: blockers.join(\"; \"),\n required_bytes: verdict.required_bytes,\n available_bytes: verdict.available_bytes,\n };\n}\n\nfunction adapterVerdicts(\n profile: AdapterMemoryProfile,\n inventory: HostInventory,\n gpu: HostGpu | undefined,\n hasCuda: boolean,\n): AdapterCapability {\n const blockers = trainingBlockers(inventory);\n const gpuBytes = gpuMemory(gpu);\n const ram = inventory.os.total_memory_bytes;\n const disk = diskForCache(inventory);\n\n let train: CapabilityVerdict;\n if (!hasCuda) {\n train = {\n status: \"not_possible\",\n reason: \"LoRA training requires CUDA\",\n required_bytes: profile.trainBytes,\n };\n } else {\n train = compareFit(gpuBytes, profile.trainBytes, \"GPU memory is unknown\");\n }\n train = withBlockers(train, blockers);\n if (disk !== undefined && disk < profile.diskBytes && train.status !== \"not_possible\") {\n train = worse(train, compareFit(disk, profile.diskBytes, \"model cache disk is unknown\"));\n }\n\n const finetune = train;\n\n let inference: CapabilityVerdict;\n if (hasCuda) {\n inference = compareFit(gpuBytes, profile.inferenceBytes, \"GPU memory is unknown\");\n } else {\n inference = compareFit(ram, profile.inferenceBytes, \"system RAM is unknown\");\n if (inference.status !== \"not_possible\") {\n inference = {\n ...inference,\n reason: `CPU inference: ${inference.reason}`,\n };\n }\n }\n\n return {\n id: profile.id,\n spark_class: profile.sparkClass,\n train,\n finetune,\n inference,\n };\n}\n\nfunction suggestedFoundationDepth(availableBytes: number | undefined): number {\n if (availableBytes === undefined) return FOUNDATION_DEFAULT_DEPTH;\n const budget = availableBytes * FIT_RATIO;\n let suggested = FOUNDATION_DEFAULT_DEPTH;\n for (let depth = FOUNDATION_DEFAULT_DEPTH; depth <= FOUNDATION_MAX_DEPTH; depth += 1) {\n if (foundationTrainBytes(depth) <= budget) suggested = depth;\n else break;\n }\n return suggested;\n}\n\nexport function evaluateCapabilities(inventory: HostInventory): CapabilityReport {\n const hasCuda = cudaAvailable(inventory);\n const gpu = trainingGpu(inventory);\n const notes: string[] = [];\n if (gpu?.unified_memory || isUnifiedGpuName(gpu?.name)) {\n notes.push(\"GPU memory is a unified pool shared with system RAM (Spark-class).\");\n }\n if (inventory.quick) {\n notes.push(\"Quick probe skipped the bundled torch/uv runtime.\");\n }\n if (!inventory.node.ok) {\n notes.push(`Node ${inventory.node.version} is below the 22.x required by the local runner.`);\n }\n\n const adapters = ADAPTER_MEMORY_PROFILES.map((profile) =>\n adapterVerdicts(profile, inventory, gpu, hasCuda)\n );\n\n const blockers = trainingBlockers(inventory);\n const gpuBytes = gpuMemory(gpu);\n const ram = inventory.os.total_memory_bytes;\n const trainBudget = hasCuda ? gpuBytes : undefined;\n const suggested = suggestedFoundationDepth(trainBudget);\n const defaultTrain = foundationTrainBytes(FOUNDATION_DEFAULT_DEPTH);\n const inferBudget = hasCuda ? gpuBytes : ram;\n\n let train: CapabilityVerdict;\n if (!hasCuda) {\n train = {\n status: \"not_possible\",\n reason: \"Foundation pretrain, SFT, and RL require CUDA\",\n required_bytes: defaultTrain,\n };\n } else {\n train = compareFit(gpuBytes, defaultTrain, \"GPU memory is unknown\");\n }\n train = withBlockers(train, blockers);\n\n const inference = compareFit(\n inferBudget,\n foundationInferenceBytes(FOUNDATION_DEFAULT_DEPTH),\n hasCuda ? \"GPU memory is unknown\" : \"system RAM is unknown\",\n );\n\n const foundation: FoundationCapability = {\n default_depth: FOUNDATION_DEFAULT_DEPTH,\n suggested_max_depth: hasCuda && blockers.length === 0 ? suggested : FOUNDATION_DEFAULT_DEPTH,\n train,\n finetune: train,\n inference: hasCuda\n ? inference\n : { ...inference, reason: `CPU eval: ${inference.reason}` },\n serve: hasCuda && inventory.os.platform === \"linux\"\n ? inference\n : { status: \"not_possible\", reason: \"Foundation serving requires Linux and an NVIDIA CUDA GPU\" },\n };\n\n return { cuda_available: hasCuda, gpu, adapters, foundation, notes };\n}\n\nexport function formatCapabilitySummary(report: CapabilityReport): string {\n const gpu = report.gpu;\n const gpuLabel = gpu\n ? `${gpu.name}${gpu.memory_total_bytes ? `, ${formatGiB(gpu.memory_total_bytes)}` : \"\"}${gpu.unified_memory ? \" unified\" : \"\"}`\n : \"no NVIDIA GPU\";\n const adapterBits = report.adapters.map((adapter) => {\n const short = adapter.id.split(\"/\").at(-1) ?? adapter.id;\n return `${short} train ${adapter.train.status}`;\n });\n return [\n `GPU ${gpuLabel}, CUDA ${report.cuda_available ? \"yes\" : \"no\"}`,\n `Adapter: ${adapterBits.join(\"; \")}`,\n `Foundation: train ${report.foundation.train.status}, suggested max depth ${report.foundation.suggested_max_depth}; serve ${report.foundation.serve.status}`,\n ].join(\". \");\n}\n\nexport function warningsFromSnapshot(\n report: CapabilityReport,\n target: { engine: \"adapter\" | \"foundation\" | \"decision\"; baseModel?: string },\n): string[] {\n const warnings: string[] = [];\n if (target.engine === \"decision\") {\n // Decision models are small enough for CPU or Apple MPS; CUDA only makes them faster.\n if (!report.cuda_available) {\n warnings.push(\"No CUDA GPU detected: decision training runs on CPU or Apple MPS (roughly 15 s per 8-example step on a 4-core CPU).\");\n }\n return warnings;\n }\n if (target.engine === \"foundation\") {\n for (const kind of [\"train\", \"finetune\"] as const) {\n const verdict = report.foundation[kind];\n if (verdict.status === \"not_possible\" || verdict.status === \"tight\") {\n warnings.push(`Foundation ${kind} is ${verdict.status}: ${verdict.reason}`);\n }\n }\n return warnings;\n }\n const modelId = target.baseModel;\n const adapter = modelId\n ? report.adapters.find((item) => item.id.toLowerCase() === modelId.trim().toLowerCase())\n : undefined;\n if (!adapter) {\n if (modelId && !adapterMemoryProfile(modelId)) return warnings;\n const blocked = report.adapters.filter((item) => item.train.status === \"not_possible\");\n if (blocked.length === report.adapters.length) {\n warnings.push(`Adapter train is not_possible: ${report.adapters[0]?.train.reason ?? \"CUDA required\"}`);\n }\n return warnings;\n }\n for (const kind of [\"train\", \"finetune\", \"inference\"] as const) {\n const verdict = adapter[kind];\n if (verdict.status === \"not_possible\" || verdict.status === \"tight\") {\n warnings.push(`${adapter.id} ${kind} is ${verdict.status}: ${verdict.reason}`);\n }\n }\n return warnings;\n}\n\nexport { formatGiB };\n","import { constants } from \"node:fs\";\nimport { access, statfs } from \"node:fs/promises\";\nimport { cpus, freemem, homedir, totalmem, type } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { DEFAULT_ARTIFACT_ROOT, defaultStoreRoot } from \"../paths.js\";\nimport type { LocalRunnerConfig } from \"./contracts.js\";\nimport {\n minimalMachineLearningEnvironment,\n withHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport {\n buildBundledPythonCommand,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\n\nexport interface CommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n error?: string;\n}\n\ninterface CommandOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n timeoutMs?: number;\n}\n\nasync function runCommand(command: string, args: string[], options: CommandOptions = {}): Promise<CommandResult> {\n const timeoutMs = options.timeoutMs ?? 10_000;\n let interrupted: string | undefined;\n const result = await new Promise<CommandResult>((resolveResult) => {\n let settled = false;\n let stdout = \"\";\n let stderr = \"\";\n let stopError: string | undefined;\n let forceKillTimer: NodeJS.Timeout | null = null;\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env ?? process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\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 interrupted = \"interrupted by SIGINT\";\n stopError = interrupted;\n requestStop(\"SIGINT\");\n };\n const onSigterm = () => {\n interrupted = \"interrupted by SIGTERM\";\n stopError = interrupted;\n requestStop(\"SIGTERM\");\n };\n const finish = (result: CommandResult) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n resolveResult(result);\n };\n const timer = setTimeout(() => {\n stopError = `timed out after ${timeoutMs}ms`;\n requestStop();\n }, timeoutMs);\n timer.unref();\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk) => { stdout += chunk; });\n child.stderr.on(\"data\", (chunk) => { stderr += chunk; });\n child.on(\"error\", (error) => {\n finish({ code: null, stdout, stderr, error: error.message });\n });\n child.on(\"close\", (code) => {\n finish({ code: stopError ? null : code, stdout, stderr, error: stopError });\n });\n });\n if (interrupted) throw new Error(interrupted);\n return result;\n}\n\nfunction firstLine(value: string): string {\n return value.trim().split(/\\r?\\n/)[0] ?? \"\";\n}\n\nexport interface HostGpu {\n index: number;\n name: string;\n driver_version?: string;\n memory_total_bytes?: number;\n memory_free_bytes?: number;\n compute_cap?: string;\n unified_memory: boolean;\n}\n\nexport interface HostDisk {\n name: string;\n path: string;\n free_bytes?: number;\n ok: boolean;\n message: string;\n}\n\nexport interface HostPythonRuntime {\n ok: boolean;\n message: string;\n torch?: string;\n transformers?: string;\n peft?: string;\n cuda_available?: boolean;\n cuda_device?: string;\n compute_capability?: number[];\n total_memory_bytes?: number;\n bf16_supported?: boolean;\n}\n\nexport interface HostInventory {\n collected_at: string;\n quick: boolean;\n node: { version: string; major: number; ok: boolean };\n os: {\n platform: string;\n arch: string;\n type: string;\n cpu_count: number;\n total_memory_bytes: number;\n free_memory_bytes: number;\n };\n uv?: { ok: boolean; version?: string; message: string };\n gpus: HostGpu[];\n nvidia_smi: { ok: boolean; message: string };\n python?: HostPythonRuntime;\n disks: HostDisk[];\n}\n\nexport interface CollectHostInventoryOptions {\n config?: LocalRunnerConfig;\n quick?: boolean;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nfunction parseMiB(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const parsed = Number(value.replace(/[^\\d.]/g, \"\"));\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return Math.round(parsed * 1024 * 1024);\n}\n\nfunction isNvidiaSmiDecorativeLine(line: string): boolean {\n return /^(?:mon|tue|wed|thu|fri|sat|sun)\\b/i.test(line)\n || line.startsWith(\"+---\")\n || line.startsWith(\"|\");\n}\n\nfunction gpuFromName(name: string, index: number, extras: Partial<HostGpu> = {}): HostGpu {\n return {\n index,\n name,\n unified_memory: /spark|gb10/i.test(name),\n ...extras,\n };\n}\n\n/**\n * Parse `nvidia-smi --query-gpu=... --format=csv` rows.\n * Supports `index,name,...` and `name,driver,...` (no unused compute_cap field).\n */\nexport function parseNvidiaGpus(stdout: string): HostGpu[] {\n const gpus: HostGpu[] = [];\n for (const line of stdout.split(/\\r?\\n/).map((item) => item.trim()).filter(Boolean)) {\n if (isNvidiaSmiDecorativeLine(line)) continue;\n const parts = line.split(\",\").map((part) => part.trim());\n if (parts[0] && /^\\d+$/.test(parts[0]) && parts.length >= 2) {\n const name = parts[1] || \"NVIDIA GPU\";\n gpus.push(gpuFromName(name, Number(parts[0]), {\n driver_version: parts[2] || undefined,\n memory_total_bytes: parseMiB(parts[3]),\n memory_free_bytes: parseMiB(parts[4]),\n compute_cap: parts[5] || undefined,\n }));\n continue;\n }\n if (parts.length >= 2 && parts[0] && !/^(?:NVIDIA-SMI|Fail|Error)/i.test(parts[0])) {\n const name = parts[0];\n gpus.push(gpuFromName(name, gpus.length, {\n driver_version: parts[1] || undefined,\n memory_total_bytes: parseMiB(parts[2]),\n memory_free_bytes: parseMiB(parts[3]),\n }));\n }\n }\n return gpus;\n}\n\n/** Parse default `nvidia-smi` process-table rows; skip the weekday timestamp header. */\nexport function parseNvidiaTableGpus(stdout: string): HostGpu[] {\n const gpus: HostGpu[] = [];\n for (const line of stdout.split(/\\r?\\n/)) {\n const match = line.match(/^\\|\\s+(\\d+)\\s+(.+?)\\s+(?:On|Off|N\\/A)\\s+\\|/);\n if (!match) continue;\n const name = (match[2] ?? \"\").trim();\n if (!name || /^NVIDIA-SMI/i.test(name)) continue;\n gpus.push(gpuFromName(name, Number(match[1])));\n }\n return gpus;\n}\n\nconst NVIDIA_CSV_QUERIES: string[][] = [\n [\"--query-gpu=index,name,driver_version,memory.total,memory.free\", \"--format=csv,noheader,nounits\"],\n [\"--query-gpu=name,driver_version,memory.total,memory.free\", \"--format=csv,noheader,nounits\"],\n [\"--query-gpu=name,driver_version\", \"--format=csv,noheader\"],\n];\n\nasync function queryNvidiaGpus(env: NodeJS.ProcessEnv): Promise<{ result: CommandResult; gpus: HostGpu[] }> {\n let last: CommandResult | undefined;\n for (const args of NVIDIA_CSV_QUERIES) {\n const result = await runCommand(\"nvidia-smi\", args, { env, timeoutMs: 10_000 });\n last = result;\n if (result.code !== 0) continue;\n const gpus = parseNvidiaGpus(result.stdout);\n if (gpus.length > 0) return { result, gpus };\n }\n const table = await runCommand(\"nvidia-smi\", [], { env, timeoutMs: 10_000 });\n const gpus = table.code === 0 ? parseNvidiaTableGpus(table.stdout) : [];\n return { result: table.code === 0 || !last ? table : last, gpus };\n}\n\nasync function diskCheck(name: string, path: string): Promise<HostDisk> {\n const resolvedPath = resolve(path);\n try {\n await access(resolvedPath, constants.R_OK);\n const fs = await statfs(resolvedPath);\n const freeBytes = Number(fs.bavail) * Number(fs.bsize);\n return {\n name,\n path: resolvedPath,\n free_bytes: freeBytes,\n ok: true,\n message: `${resolvedPath} (${Math.round(freeBytes / (1024 ** 3) * 10) / 10} GiB available)`,\n };\n } catch (error) {\n let probe = resolvedPath;\n for (let i = 0; i < 6; i += 1) {\n const parent = dirname(probe);\n if (parent === probe) break;\n probe = parent;\n try {\n const fs = await statfs(probe);\n const freeBytes = Number(fs.bavail) * Number(fs.bsize);\n return {\n name,\n path: resolvedPath,\n free_bytes: freeBytes,\n ok: true,\n message: `${resolvedPath} not created yet; ${probe} has ${Math.round(freeBytes / (1024 ** 3) * 10) / 10} GiB available`,\n };\n } catch {\n continue;\n }\n }\n return {\n name,\n path: resolvedPath,\n ok: false,\n message: `${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nfunction pythonProbeSource(): string {\n return [\n \"import json\",\n \"import torch, transformers, peft, huggingface_hub\",\n \"payload = {'python_ok': True, 'torch': torch.__version__, 'transformers': transformers.__version__, 'peft': getattr(peft, '__version__', None), 'cuda_available': bool(torch.cuda.is_available())}\",\n \"cuda = torch.cuda.is_available()\",\n \"payload.update({'cuda_device': torch.cuda.get_device_name(0), 'compute_capability': list(torch.cuda.get_device_capability(0)), 'total_memory_bytes': torch.cuda.get_device_properties(0).total_memory, 'bf16_supported': bool(torch.cuda.is_bf16_supported())} if cuda else {})\",\n \"print(json.dumps(payload))\",\n ].join(\"; \");\n}\n\nexport function parsePythonProbeJson(text: string): HostPythonRuntime | undefined {\n const line = [...text.split(/\\r?\\n/)].reverse().find((item) => item.trim().startsWith(\"{\"));\n if (!line) return undefined;\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n if (parsed.python_ok !== true) return undefined;\n return {\n ok: true,\n message: line.trim(),\n torch: typeof parsed.torch === \"string\" ? parsed.torch : undefined,\n transformers: typeof parsed.transformers === \"string\" ? parsed.transformers : undefined,\n peft: typeof parsed.peft === \"string\" ? parsed.peft : undefined,\n cuda_available: parsed.cuda_available === true,\n cuda_device: typeof parsed.cuda_device === \"string\" ? parsed.cuda_device : undefined,\n compute_capability: Array.isArray(parsed.compute_capability)\n ? parsed.compute_capability.filter((value): value is number => typeof value === \"number\")\n : undefined,\n total_memory_bytes: typeof parsed.total_memory_bytes === \"number\"\n ? parsed.total_memory_bytes\n : undefined,\n bf16_supported: parsed.bf16_supported === true,\n };\n } catch {\n return undefined;\n }\n}\n\nasync function collectPythonRuntime(\n config: LocalRunnerConfig | undefined,\n env: NodeJS.ProcessEnv,\n): Promise<HostPythonRuntime> {\n const entrypoint = buildBundledPythonCommand(\"-c\", [pythonProbeSource()]);\n const childEnv = withBundledPythonEnvironment(\n withHuggingFaceCacheEnvironment(\n minimalMachineLearningEnvironment(env),\n config?.paths.modelCache,\n ),\n );\n const result = await runCommand(entrypoint.command, entrypoint.commandArgs, {\n env: childEnv,\n timeoutMs: 1_800_000,\n });\n if (result.code === 0) {\n return parsePythonProbeJson(result.stdout) ?? {\n ok: true,\n message: firstLine(result.stdout) || \"Python runtime probe succeeded\",\n };\n }\n return {\n ok: false,\n message: result.error ?? (firstLine(result.stderr) || `uv exited ${result.code}`),\n };\n}\n\nexport async function collectHostInventory(\n options: CollectHostInventoryOptions = {},\n): Promise<HostInventory> {\n const env = options.env ?? process.env;\n const config = options.config;\n const cwd = options.cwd ?? process.cwd();\n const nodeVersion = process.versions.node;\n const nodeMajor = Number(nodeVersion.split(\".\")[0]);\n const artifactRoot = resolve(cwd, config?.artifactRoot ?? join(cwd, DEFAULT_ARTIFACT_ROOT));\n const storeRoot = resolve(config?.storeRoot ?? defaultStoreRoot(env));\n const modelCache = resolve(\n config?.paths.modelCache ?? env.HF_HOME ?? join(homedir(), \".cache\", \"huggingface\"),\n );\n\n const [artifactDisk, storeDisk, cacheDisk, uvVersion, nvidiaQueried] = await Promise.all([\n diskCheck(\"artifact-root\", artifactRoot),\n diskCheck(\"store-root\", storeRoot),\n diskCheck(\"model-cache\", modelCache),\n runCommand(\"uv\", [\"--version\"], { env, timeoutMs: 10_000 }),\n queryNvidiaGpus(env),\n ]);\n\n const nvidia = nvidiaQueried.result;\n const gpus = nvidiaQueried.gpus;\n\n const inventory: HostInventory = {\n collected_at: new Date().toISOString(),\n quick: options.quick === true,\n node: {\n version: nodeVersion,\n major: nodeMajor,\n ok: nodeMajor >= 22,\n },\n os: {\n platform: process.platform,\n arch: process.arch,\n type: type(),\n cpu_count: cpus().length,\n total_memory_bytes: totalmem(),\n free_memory_bytes: freemem(),\n },\n uv: {\n ok: uvVersion.code === 0,\n version: uvVersion.code === 0 ? firstLine(uvVersion.stdout) : undefined,\n message: uvVersion.code === 0\n ? firstLine(uvVersion.stdout)\n : uvVersion.error ?? (firstLine(uvVersion.stderr) || \"uv is not available\"),\n },\n gpus,\n nvidia_smi: {\n ok: nvidia.code === 0,\n message: nvidia.code === 0\n ? (gpus[0] ? `${gpus[0].name}${gpus[0].memory_total_bytes ? ` (${Math.round((gpus[0].memory_total_bytes) / (1024 ** 3))} GiB)` : \"\"}` : firstLine(nvidia.stdout) || \"nvidia-smi reported a GPU\")\n : nvidia.error ?? (firstLine(nvidia.stderr) || \"nvidia-smi not available\"),\n },\n disks: [artifactDisk, storeDisk, cacheDisk],\n };\n\n if (options.quick !== true) {\n inventory.python = uvVersion.code === 0\n ? await collectPythonRuntime(config, env)\n : { ok: false, message: \"Python probe skipped because uv is not available\" };\n }\n\n return inventory;\n}\n","import { chmod, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { getTunedTensorHome } from \"../paths.js\";\nimport type { CapabilityReport } from \"./capability.js\";\nimport { formatCapabilitySummary } from \"./capability.js\";\nimport type { HostInventory } from \"./host-inventory.js\";\n\nexport const HARDWARE_SNAPSHOT_VERSION = 1;\nexport const HARDWARE_SNAPSHOT_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface HardwareSnapshot {\n version: typeof HARDWARE_SNAPSHOT_VERSION;\n collected_at: string;\n quick: boolean;\n gpu_fingerprint?: { name: string; total_memory_bytes?: number };\n inventory: HostInventory;\n capabilities: CapabilityReport;\n summary: string;\n}\n\nexport interface LoadedHardwareSnapshot extends HardwareSnapshot {\n stale: boolean;\n path: string;\n}\n\nexport function hardwareSnapshotPath(env: NodeJS.ProcessEnv = process.env): string {\n return join(getTunedTensorHome(env), \"hardware.json\");\n}\n\nexport async function readHardwareSnapshot(\n env: NodeJS.ProcessEnv = process.env,\n): Promise<LoadedHardwareSnapshot | undefined> {\n const path = hardwareSnapshotPath(env);\n try {\n const parsed = JSON.parse(await readFile(path, \"utf8\")) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return undefined;\n const snapshot = parsed as HardwareSnapshot;\n if (snapshot.version !== HARDWARE_SNAPSHOT_VERSION) return undefined;\n if (typeof snapshot.collected_at !== \"string\" || !snapshot.capabilities || !snapshot.inventory) {\n return undefined;\n }\n const age = Date.now() - Date.parse(snapshot.collected_at);\n const stale = !Number.isFinite(age) || age > HARDWARE_SNAPSHOT_TTL_MS || age < 0;\n return { ...snapshot, stale, path };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n return undefined;\n }\n}\n\nexport async function writeHardwareSnapshot(\n snapshot: Omit<HardwareSnapshot, \"version\" | \"summary\"> & { summary?: string },\n env: NodeJS.ProcessEnv = process.env,\n): Promise<HardwareSnapshot> {\n const path = hardwareSnapshotPath(env);\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n const gpu = snapshot.capabilities.gpu;\n const record: HardwareSnapshot = {\n version: HARDWARE_SNAPSHOT_VERSION,\n collected_at: snapshot.collected_at,\n quick: snapshot.quick,\n gpu_fingerprint: gpu\n ? { name: gpu.name, total_memory_bytes: gpu.memory_total_bytes }\n : undefined,\n inventory: snapshot.inventory,\n capabilities: snapshot.capabilities,\n summary: snapshot.summary ?? formatCapabilitySummary(snapshot.capabilities),\n };\n await writeFile(path, `${JSON.stringify(record, null, 2)}\\n`, { mode: 0o600 });\n await chmod(path, 0o600);\n return record;\n}\n\nexport function formatHostStatusLine(snapshot: LoadedHardwareSnapshot | undefined): string {\n if (!snapshot) return \"not inventoried (run tt hardware)\";\n const stale = snapshot.stale ? `; stale — run tt hardware` : \"\";\n return `${snapshot.summary}${stale}`;\n}\n\nexport function formatAgentHostBlock(snapshot: LoadedHardwareSnapshot | undefined): string {\n if (!snapshot) {\n return [\n \"Host capability is not inventoried yet.\",\n \"When the user asks to examine this machine, GPU, VRAM, CUDA, or what can train, fine-tune, or infer here, call examine_hardware before recommending a base model, engine, or pipeline.\",\n ].join(\" \");\n }\n const stale = snapshot.stale ? \" (stale — call examine_hardware to refresh)\" : \"\";\n return [\n `Host capability (cached ${snapshot.collected_at}${stale}):`,\n snapshot.summary,\n \"When the user wants to examine this host, GPU, or decide what can train/fine-tune/infer here, call examine_hardware before recommending a base model, engine, or pipeline.\",\n \"Recommend only workloads marked ready; mention tight as a caution. Never invent generic 7B/70B sizing.\",\n ].join(\"\\n\");\n}\n","import { evaluateCapabilities, formatCapabilitySummary } from \"./capability.js\";\nimport type { LocalRunnerConfig } from \"./contracts.js\";\nimport { collectHostInventory } from \"./host-inventory.js\";\nimport {\n readHardwareSnapshot,\n writeHardwareSnapshot,\n type HardwareSnapshot,\n} from \"./hardware-snapshot.js\";\n\nexport interface AssessHardwareOptions {\n config?: LocalRunnerConfig;\n /** Skip the bundled torch/uv probe. */\n quick?: boolean;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nexport type HardwareReport = HardwareSnapshot;\n\nexport async function assessHardware(\n options: AssessHardwareOptions = {},\n): Promise<HardwareReport> {\n const env = options.env ?? process.env;\n // Doctor and `examine_hardware --quick` must not replace a fresh full\n // probe with nvidia-smi-only verdicts (for example flipping CUDA after\n // torch reported it unavailable).\n if (options.quick === true) {\n const existing = await readHardwareSnapshot(env);\n if (existing && !existing.quick && !existing.stale) {\n return {\n version: existing.version,\n collected_at: existing.collected_at,\n quick: existing.quick,\n gpu_fingerprint: existing.gpu_fingerprint,\n inventory: existing.inventory,\n capabilities: existing.capabilities,\n summary: existing.summary,\n };\n }\n }\n const inventory = await collectHostInventory({\n config: options.config,\n quick: options.quick === true,\n env,\n cwd: options.cwd,\n });\n const capabilities = evaluateCapabilities(inventory);\n return await writeHardwareSnapshot({\n collected_at: inventory.collected_at,\n quick: inventory.quick,\n inventory,\n capabilities,\n summary: formatCapabilitySummary(capabilities),\n }, env);\n}\n","import { createProgressRenderer, progressTty, progressColumns } from \"./progress-bar.js\";\nimport { sanitizeLogLine, type LocalRunProgressEvent, type LocalRunReporter } from \"./run-reporter.js\";\n\nfunction shortValue(value: unknown): string | null {\n if (value === undefined || value === null) return null;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) return `[${value.length} items]`;\n return null;\n}\n\n/** One line for a run event: stage, message and up to five scalar details. */\nexport function formatRunEvent(event: LocalRunProgressEvent): string {\n const detailText = Object.entries(event.details ?? {})\n .filter(([key]) => key !== \"metrics\")\n .map(([key, value]) => {\n const formatted = key === \"command\" && Array.isArray(value)\n ? value.join(\" \")\n : shortValue(value);\n return formatted ? `${key}=${formatted}` : null;\n })\n .filter((value): value is string => Boolean(value))\n .slice(0, 5)\n .join(\" \");\n return sanitizeLogLine(`[tt] ${event.stage}: ${event.message}${detailText ? ` (${detailText})` : \"\"}`);\n}\n\nfunction elapsedLabel(milliseconds: number): string {\n const total = Math.max(0, Math.floor(milliseconds / 1000));\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const seconds = total % 60;\n return `+${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n}\n\n/**\n * Live run output on stderr for `tt run` and `tt pipeline run`. Each line is\n * stamped with the time since the run started, so a long run shows where its\n * hours went. Process logs appear only with `verbose`; full logs and the event\n * record stay in the run directory either way.\n */\nexport function createRunConsoleReporter(options: {\n write?: (text: string) => void;\n verbose?: boolean;\n now?: () => number;\n} = {}): LocalRunReporter {\n const write = options.write ?? ((text: string) => { process.stderr.write(text); });\n const now = options.now ?? (() => Date.now());\n const started = now();\n const stamp = (line: string) => line.replace(/^\\[tt\\] /, `[tt] ${elapsedLabel(now() - started)} `);\n const progress = createProgressRenderer({ write, tty: progressTty(), columns: progressColumns() });\n let lastLog = \"\";\n return {\n verbose: options.verbose ?? false,\n onProgress(update) { progress.update(update); },\n onEvent(event) {\n progress.interrupt();\n write(`${stamp(formatRunEvent(event))}\\n`);\n },\n onLog(log) {\n const line = sanitizeLogLine(`[tt] ${log.stage}${log.stream ? ` ${log.stream}` : \"\"}: ${log.message}`);\n // tqdm redraws one line many times; keep consecutive duplicates out.\n if (line === lastLog) return;\n lastLog = line;\n progress.interrupt();\n write(`${stamp(line)}\\n`);\n },\n };\n}\n"],"mappings":"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","names":["readFile","spec","readFile","canonicalFoundationPipeline","canonicalJson","isFoundationPipeline","parsePipeline","pipelineDocumentSchema","createHash","randomUUID","mkdir","readFile","stat","writeFile","canonicalJson","createHash","readFile","stat","randomUUID","mkdir","writeFile","resolve","last","mkdir","readFile","rename","rm","stat","writeFile","dirname","join","resolve","sep","randomUUID","join","exists","stat","mkdir","resolve","dirname","randomUUID","writeFile","rename","readJson","readFile","exists","dirname","resolve","sep","join","readJson","stat","readFile","row","randomUUID","rm","createHash","createReadStream","mkdir","readFile","stat","isAbsolute","join","relative","resolve","sep","join","relative","sep","isAbsolute","createHash","createReadStream","readFile","stat","mkdir","resolve","resolved","lstat","mkdir","open","readFile","readdir","rename","rm","stat","createReadStream","createHash","randomUUID","homedir","basename","dirname","join","relative","resolve","createHash","randomUUID","mkdir","realpath","rm","stat","writeFile","basename","dirname","join","resolve","resolve","join","realpath","dirname","basename","createHash","randomUUID","exists","stat","writeFile","file","mkdir","rm","createHash","mkdir","readFile","rm","stat","writeFile","dirname","join","resolve","canonicalJson","score","mkdir","dirname","writeFile","resolve","rm","readFile","stat","createHash","join","report","mkdir","readFile","writeFile","join","resolve","mkdir","join","writeFile","resolve","readFile","readFile","resolve","dirname","homedir","pathExists","stat","canonicalJson","createHash","packageVersion","createReadStream","lstat","readdir","relative","basename","rm","mkdir","randomUUID","open","rename","join","entrypointFiles","report","training","readFile","basename","dirname","join","resolve","readFile","resolve","basename","join","dirname","access","homedir","dirname","join","resolve","result","gpus","resolve","access","dirname","join","homedir","chmod","mkdir","readFile","writeFile","dirname","join","join","readFile","mkdir","dirname","writeFile","chmod"]}
|