@tuned-tensor/cli 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/local-runtime/index.ts","../src/local-runtime/compare.ts","../src/local-runtime/doctor.ts","../src/local-runtime/model-server.ts","../src/local-runtime/serving-runtime.ts","../src/local-runtime/active-model.ts"],"sourcesContent":["import { readFileSync, realpathSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { cwd } from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport { compareRuns } from \"./compare.js\";\nimport { assertArtifactManifest } from \"./artifacts.js\";\nimport { fineTuneRunRequestSchema, isFoundationSpecFile, localBehaviorSpecFileSchema, localRunnerConfigSchema, type FineTuneRunRequest, type LocalRunnerConfig, type SpecSnapshot } from \"./contracts.js\";\nimport { buildSystemMessage } from \"./dataset.js\";\nimport {\n loadLocalRunnerConfig,\n fingerprintLocalBaseModel,\n runLocalFineTune,\n validateLocalFineTuneInput,\n} from \"./orchestrator.js\";\nimport { runDoctor } from \"./doctor.js\";\nimport { assessHardware } from \"./hardware.js\";\nimport { assertUsableModelArtifact, defaultBaseModelRevision } from \"./model-registry.js\";\nimport {\n buildFoundationModelServerLaunch,\n buildLocalBaseModelServerLaunch,\n buildLocalModelServerLaunch,\n serveLocalModel,\n type LocalModelServerLaunch,\n} from \"./model-server.js\";\nimport { prefetchBaseModel } from \"./prefetch.js\";\nimport { createLocalStore, type LocalModelRecord, type LocalStore } from \"./store.js\";\nimport {\n DEFAULT_LOCAL_SPEC_PATH,\n assertFoundationSpecReady,\n assertLocalRunInputReady,\n initLocalRunnerConfigFile,\n initLocalSpecFile,\n loadLocalRunInput,\n} from \"./local-project.js\";\nimport { sanitizeLogLine, type LocalRunProgressEvent, type LocalRunReporter } from \"./run-reporter.js\";\nimport { activateModel, getActiveModel, rollbackActiveModel } from \"./active-model.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\n\nexport * from \"./compare.js\";\nexport * from \"./contracts.js\";\nexport * from \"./dataset.js\";\nexport * from \"./model-server.js\";\nexport * from \"./orchestrator.js\";\nexport * from \"./local-project.js\";\nexport * from \"./prefetch.js\";\nexport * from \"./run-reporter.js\";\nexport * from \"./store.js\";\nexport * from \"./general-regression.js\";\nexport * from \"./active-model.js\";\n\nexport interface LocalRunnerInfo {\n name: \"tuned-tensor-local\";\n status: \"local\";\n description: string;\n version: string;\n}\n\nfunction packageVersion(): string {\n try {\n const packageJson = JSON.parse(\n readFileSync(resolve(localRuntimePackageRoot(import.meta.url), \"package.json\"), \"utf8\"),\n ) as { version?: unknown };\n return typeof packageJson.version === \"string\" ? packageJson.version : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport const TT_LOCAL_VERSION = packageVersion();\n\nexport function getLocalRunnerInfo(): LocalRunnerInfo {\n return {\n name: \"tuned-tensor-local\",\n status: \"local\",\n description: \"Local CUDA LoRA fine-tuning with held-out base-versus-tuned evaluation.\",\n version: TT_LOCAL_VERSION,\n };\n}\n\nfunction readOption(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name);\n if (index !== -1) return argv[index + 1];\n const inline = argv.find((value) => value.startsWith(`${name}=`));\n return inline?.slice(name.length + 1);\n}\n\nfunction hasFlag(argv: string[], name: string): boolean {\n return argv.includes(name);\n}\n\nfunction printHelp(): void {\n console.log(`Usage: tt <command> [options]\n\nCommands:\n info Show package and runner information\n init [--name \"My Local Model\"] [--model Qwen/Qwen3.5-2B] [--output tunedtensor.json] [--profile spark] [--force]\n doctor [tunedtensor.json] [--config local-runner.json]\n hardware [--config local-runner.json] [--quick]\n validate [tunedtensor.json] [--config local-runner.json]\n run [tunedtensor.json] [--config local-runner.json] [--dry-run] [--verbose] [--quiet]\n serve <model-id|active|base|foundation> [--config local-runner.json] [--host 127.0.0.1] [--port 8000]\n runs list|get|events|report|compare [args] [--config local-runner.json]\n models list|get|verify|prefetch|verify-base|active|activate|rollback|serve [args] [--config local-runner.json]\n\nGlobal options:\n -h, --help Show help\n -V, --version Show the installed version\n\nThe run command writes local artifacts under config.artifactRoot, defaulting to\n.tuned-tensor/artifacts. The file-backed local store defaults to\n~/.tuned-tensor/store unless config.storeRoot, TT_LOCAL_HOME, or\nTUNED_TENSOR_HOME is set.`);\n}\n\ninterface CliOptionDefinition {\n name: string;\n value?: string;\n description: string;\n}\n\ninterface CliCommandDefinition {\n usage: string;\n description: string;\n options: readonly CliOptionDefinition[];\n minPositionals?: number;\n maxPositionals?: number;\n missingPositionalsMessage?: string;\n}\n\ninterface CliCommandGroup {\n description: string;\n defaultSubcommand?: string;\n subcommands: Record<string, CliCommandDefinition>;\n}\n\ninterface ParsedCli {\n command: string;\n subcommand?: string;\n positionals: string[];\n help: \"top\" | \"command\" | \"group\";\n definition?: CliCommandDefinition;\n}\n\nconst CONFIG_OPTION = { name: \"--config\", value: \"path\", description: \"Local runner config JSON path\" } as const;\nconst VERBOSE_OPTION = { name: \"--verbose\", description: \"Stream subprocess output\" } as const;\nconst QUIET_OPTION = { name: \"--quiet\", description: \"Suppress progress output on stderr\" } as const;\nconst MODEL_SERVE_OPTIONS = [\n CONFIG_OPTION,\n { name: \"--checkpoint\", value: \"path\", description: \"Foundation model directory (target: foundation)\" },\n { name: \"--tokenizer\", value: \"path\", description: \"Foundation tokenizer.json (target: foundation)\" },\n { name: \"--host\", value: \"host\", description: \"Bind host (localhost by default)\" },\n { name: \"--port\", value: \"port\", description: \"Bind port\" },\n { name: \"--device\", value: \"device\", description: \"cuda (pinned vLLM runtime)\" },\n { name: \"--max-tokens\", value: \"count\", description: \"Default response token limit\" },\n { name: \"--temperature\", value: \"number\", description: \"Default sampling temperature\" },\n { name: \"--top-p\", value: \"number\", description: \"Default nucleus sampling threshold\" },\n { name: \"--max-concurrent-requests\", value: \"count\", description: \"Maximum sequences in an upstream generation batch\" },\n { name: \"--context-length\", value: \"count\", description: \"Total context token budget (foundation: checkpoint limit; otherwise 16384)\" },\n { name: \"--gpu-memory-utilization\", value: \"fraction\", description: \"vLLM GPU memory budget fraction (default 0.8)\" },\n { name: \"--spec\", value: \"path\", description: \"Behavior spec whose instructions are enforced\" },\n { name: \"--no-spec-prompt\", description: \"Do not enforce the stored behavior-spec prompt\" },\n { name: \"--allow-remote\", description: \"Allow a non-loopback bind\" },\n { name: \"--api-key-env\", value: \"name\", description: \"Environment variable containing a bearer token\" },\n { name: \"--print-command\", description: \"Validate and print the launch plan without starting\" },\n { name: \"--print-client-config\", value: \"client\", description: \"Print Pi models.json; does not start serving\" },\n] as const satisfies readonly CliOptionDefinition[];\n\nconst COMMAND_DEFINITIONS: Record<string, CliCommandDefinition> = {\n info: {\n usage: \"tt info\",\n description: \"Show the installed TT local runtime version and runner status.\",\n options: [],\n maxPositionals: 0,\n },\n init: {\n usage: \"tt init [options]\",\n description: \"Create a local tunedtensor.json behavior spec.\",\n options: [\n { name: \"--name\", value: \"name\", description: \"Behavior spec name\" },\n { name: \"--engine\", value: \"engine\", description: \"adapter (default) or foundation\" },\n { name: \"--model\", value: \"model\", description: \"Base model ID\" },\n { name: \"--output\", value: \"path\", description: \"Output spec path\" },\n { name: \"--profile\", value: \"profile\", description: \"Write a durable runner config (spark)\" },\n { name: \"--config\", value: \"path\", description: \"Runner config path (written with --profile)\" },\n { name: \"--force\", description: \"Overwrite an existing output file\" },\n ],\n maxPositionals: 0,\n },\n doctor: {\n usage: \"tt doctor [tunedtensor.json] [--config path]\",\n description: \"Check the host and optional run input before starting work.\",\n options: [CONFIG_OPTION],\n maxPositionals: 1,\n },\n hardware: {\n usage: \"tt hardware [--config path] [--quick]\",\n description: \"Inventory this host and report what TT can train, fine-tune, or infer.\",\n options: [\n CONFIG_OPTION,\n { name: \"--quick\", description: \"Skip the bundled torch/uv runtime probe\" },\n ],\n maxPositionals: 0,\n },\n validate: {\n usage: \"tt validate [tunedtensor.json] [options]\",\n description: \"Validate a local behavior spec without executing it.\",\n options: [CONFIG_OPTION],\n maxPositionals: 1,\n },\n run: {\n usage: \"tt run [tunedtensor.json] [options]\",\n description: \"Run the baseline, fine-tuning, tuned evaluation, and report workflow.\",\n options: [\n CONFIG_OPTION,\n { name: \"--dry-run\", description: \"Write representative artifacts without GPU work\" },\n VERBOSE_OPTION,\n QUIET_OPTION,\n ],\n maxPositionals: 1,\n },\n serve: {\n usage: \"tt serve <model-id|active|base|foundation> [options]\",\n description: \"Serve an adapter, pretrained base, or foundation checkpoint with vLLM.\",\n options: MODEL_SERVE_OPTIONS,\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"serve requires <model-id>\",\n },\n};\n\nconst COMMAND_GROUPS: Record<string, CliCommandGroup> = {\n runs: {\n description: \"Inspect locally stored runs.\",\n defaultSubcommand: \"list\",\n subcommands: {\n list: { usage: \"tt runs list [--config path]\", description: \"List local runs.\", options: [CONFIG_OPTION], maxPositionals: 0 },\n get: { usage: \"tt runs get <run-id> [--config path]\", description: \"Get a local run.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs get requires <run-id>\" },\n events: { usage: \"tt runs events <run-id> [--config path]\", description: \"List run events.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs events requires <run-id>\" },\n report: { usage: \"tt runs report <run-id> [--config path]\", description: \"Show the baseline-vs-tuned report, including deltas and regressions.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs report requires <run-id>\" },\n compare: { usage: \"tt runs compare <run-id-a> <run-id-b> [--config path]\", description: \"Compare two run reports.\", options: [CONFIG_OPTION], minPositionals: 2, maxPositionals: 2, missingPositionalsMessage: \"runs compare requires <run-id-a> <run-id-b>\" },\n },\n },\n models: {\n description: \"Inspect, verify, prefetch, or serve local models.\",\n defaultSubcommand: \"list\",\n subcommands: {\n list: { usage: \"tt models list [--config path]\", description: \"List local models.\", options: [CONFIG_OPTION], maxPositionals: 0 },\n get: { usage: \"tt models get <model-id> [--config path]\", description: \"Get a local model.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"models get requires <model-id>\" },\n verify: {\n usage: \"tt models verify <model-id-or-artifact-path> [--config path]\",\n description: \"Verify a stored model or manifested artifact path.\",\n options: [CONFIG_OPTION],\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models verify requires <model-id-or-artifact-path>\",\n },\n prefetch: {\n usage: \"tt models prefetch [tunedtensor.json] [options]\",\n description: \"Download the configured base model before a run.\",\n options: [CONFIG_OPTION, VERBOSE_OPTION, QUIET_OPTION],\n maxPositionals: 1,\n },\n \"verify-base\": {\n usage: \"tt models verify-base [tunedtensor.json] [options]\",\n description: \"Verify that the configured base-model snapshot is complete and locally available.\",\n options: [CONFIG_OPTION, VERBOSE_OPTION, QUIET_OPTION],\n maxPositionals: 1,\n },\n active: {\n usage: \"tt models active [--config path]\",\n description: \"Show the active adapter, or the protected base when none is active.\",\n options: [CONFIG_OPTION],\n maxPositionals: 0,\n },\n activate: {\n usage: \"tt models activate <model-id> [--config path]\",\n description: \"Activate a verified model whose general regression gate passed.\",\n options: [CONFIG_OPTION],\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models activate requires <model-id>\",\n },\n rollback: {\n usage: \"tt models rollback [--config path]\",\n description: \"Restore the previously active adapter or protected base.\",\n options: [CONFIG_OPTION],\n maxPositionals: 0,\n },\n serve: {\n usage: \"tt models serve <model-id|active|base|foundation> [options]\",\n description: \"Alias for `tt serve`.\",\n options: MODEL_SERVE_OPTIONS,\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models serve requires <model-id>\",\n },\n },\n },\n};\n\nfunction hasHelpFlag(argv: string[]): boolean {\n return argv.includes(\"--help\") || argv.includes(\"-h\");\n}\n\nfunction printCommandHelp(definition: CliCommandDefinition): void {\n console.log(`Usage: ${definition.usage}\\n\\n${definition.description}`);\n if (definition.options.length > 0) {\n console.log(\"\\nOptions:\");\n for (const option of definition.options) {\n const label = option.value ? `${option.name} <${option.value}>` : option.name;\n console.log(` ${label.padEnd(34)} ${option.description}`);\n }\n }\n console.log(\" -h, --help Show help\");\n}\n\nfunction printGroupHelp(command: string, group: CliCommandGroup): void {\n console.log(`Usage: tt ${command} <command> [options]\\n\\n${group.description}\\n\\nCommands:`);\n for (const [name, definition] of Object.entries(group.subcommands)) {\n console.log(` ${name.padEnd(16)} ${definition.description}`);\n }\n console.log(\"\\nRun `tt \" + command + \" <command> --help` for command-specific help.\");\n}\n\nfunction parseCommandArguments(tokens: string[], definition: CliCommandDefinition): string[] {\n const options = new Map(definition.options.map((option) => [option.name, option]));\n const seen = new Set<string>();\n const positionals: string[] = [];\n let optionsEnded = false;\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index]!;\n if (!optionsEnded && token === \"--\") {\n optionsEnded = true;\n continue;\n }\n if (!optionsEnded && token.startsWith(\"-\")) {\n const equalsIndex = token.indexOf(\"=\");\n const name = equalsIndex === -1 ? token : token.slice(0, equalsIndex);\n const inlineValue = equalsIndex === -1 ? undefined : token.slice(equalsIndex + 1);\n const option = options.get(name);\n if (!option) throw new Error(`Unknown option: ${name}`);\n if (seen.has(name)) throw new Error(`Option ${name} may only be specified once.`);\n seen.add(name);\n if (option.value) {\n if (inlineValue !== undefined) {\n if (!inlineValue) throw new Error(`Option ${name} requires a value.`);\n continue;\n }\n const value = tokens[index + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`Option ${name} requires a value.`);\n }\n index += 1;\n } else if (inlineValue !== undefined) {\n throw new Error(`Option ${name} does not accept a value.`);\n }\n continue;\n }\n positionals.push(token);\n }\n\n if (positionals.length < (definition.minPositionals ?? 0)) {\n throw new Error(definition.missingPositionalsMessage ?? `Missing required argument. Usage: ${definition.usage}`);\n }\n if (definition.maxPositionals !== undefined && positionals.length > definition.maxPositionals) {\n throw new Error(`Too many arguments. Usage: ${definition.usage}`);\n }\n return positionals;\n}\n\nfunction parseCli(argv: string[]): ParsedCli {\n const command = argv[2] ?? \"info\";\n if (command === \"--help\" || command === \"-h\") {\n return { command: \"info\", positionals: [], help: \"top\" };\n }\n if (command === \"--version\" || command === \"-V\") {\n if (argv.length > 3) throw new Error(`${command} does not accept arguments.`);\n return { command, positionals: [], help: \"command\" };\n }\n if (command.startsWith(\"-\")) throw new Error(`Unknown option: ${command}`);\n\n const definition = COMMAND_DEFINITIONS[command];\n if (definition) {\n if (hasHelpFlag(argv.slice(3))) {\n return { command, positionals: [], help: \"command\", definition };\n }\n return {\n command,\n positionals: parseCommandArguments(argv.slice(3), definition),\n help: \"top\",\n definition,\n };\n }\n\n const group = COMMAND_GROUPS[command];\n if (!group) throw new Error(`Unknown command: ${command}`);\n if (argv[3] === \"--help\" || argv[3] === \"-h\") {\n return { command, positionals: [], help: \"group\" };\n }\n\n const candidate = argv[3];\n let subcommand: string;\n let tokenStart: number;\n if (candidate && !candidate.startsWith(\"-\")) {\n subcommand = candidate;\n tokenStart = 4;\n } else if (group.defaultSubcommand) {\n subcommand = group.defaultSubcommand;\n tokenStart = 3;\n } else {\n throw new Error(`${command} requires a subcommand. Run 'tt ${command} --help'.`);\n }\n const subcommandDefinition = group.subcommands[subcommand];\n if (!subcommandDefinition) throw new Error(`Unknown ${command} command: ${subcommand}`);\n if (hasHelpFlag(argv.slice(tokenStart))) {\n return { command, subcommand, positionals: [], help: \"command\", definition: subcommandDefinition };\n }\n return {\n command,\n subcommand,\n positionals: parseCommandArguments(argv.slice(tokenStart), subcommandDefinition),\n help: \"top\",\n definition: subcommandDefinition,\n };\n}\n\nfunction readNumberOption(argv: string[], name: string): number | undefined {\n const value = readOption(argv, name);\n return value ? Number(value) : undefined;\n}\n\ninterface LocalConfigSelection {\n config: LocalRunnerConfig;\n path?: string;\n}\n\nasync function selectedConfigPath(argv: string[], adjacentTo?: string): Promise<string | undefined> {\n const explicitPath = readOption(argv, \"--config\");\n if (explicitPath) return resolve(explicitPath);\n const candidate = join(adjacentTo ? dirname(resolve(adjacentTo)) : cwd(), \"local-runner.json\");\n const metadata = await stat(candidate).catch(() => null);\n return metadata?.isFile() ? candidate : undefined;\n}\n\nasync function configSelectionFromArgv(argv: string[], adjacentTo?: string): Promise<LocalConfigSelection> {\n const path = await selectedConfigPath(argv, adjacentTo);\n return {\n config: await loadLocalRunnerConfig(path),\n ...(path ? { path } : {}),\n };\n}\n\nasync function configFromArgv(argv: string[], adjacentTo?: string): Promise<LocalRunnerConfig> {\n return (await configSelectionFromArgv(argv, adjacentTo)).config;\n}\n\nasync function loadCliBehaviorSpec(inputPath: string, runId?: string) {\n const input = await loadLocalRunInput(inputPath, {\n ...(runId ? { runId } : {}),\n });\n if (input.kind === \"foundation-spec\") {\n throw new Error(\n `This spec uses engine \"foundation\". Use \\`tt pipeline run --spec ${input.path}\\`; the legacy adapter runner cannot execute foundation specs.`,\n );\n }\n if (input.kind !== \"spec\") {\n throw new Error(`TT expects a tunedtensor.json behavior spec, not a full run request: ${input.path}`);\n }\n return input;\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\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\nfunction formatEvent(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 createConsoleReporter(options: { verbose: boolean; quiet: boolean }): LocalRunReporter | undefined {\n if (options.quiet) return undefined;\n let lastLogLine = \"\";\n return {\n verbose: options.verbose,\n onEvent(event) {\n process.stderr.write(`${formatEvent(event)}\\n`);\n },\n onLog(log) {\n const line = sanitizeLogLine(`[tt] ${log.stage}${log.stream ? ` ${log.stream}` : \"\"}: ${log.message}`);\n // tqdm redraws the same progress line several times per step; collapse\n // consecutive duplicates so --verbose output stays readable.\n if (line === lastLogLine) return;\n lastLogLine = line;\n process.stderr.write(`${line}\\n`);\n },\n };\n}\n\nasync function verifyStoredModel(model: LocalModelRecord, config: LocalRunnerConfig): Promise<{\n manifest_path: string;\n integrity: Awaited<ReturnType<typeof assertArtifactManifest>>;\n artifact: Awaited<ReturnType<typeof assertUsableModelArtifact>>;\n contract: unknown;\n}> {\n const manifestPath = join(model.artifact_dir, \"artifact-manifest.json\");\n const integrity = await assertArtifactManifest(manifestPath, {\n requiredPaths: [\"stage-metadata.json\", \"training-report.json\"],\n scopeToRequired: true,\n verifyModel: true,\n });\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as {\n model?: {\n artifact_root?: unknown;\n base_model?: unknown;\n format?: unknown;\n framework?: unknown;\n servable?: unknown;\n base_model_artifact_uri?: unknown;\n base_model_fingerprint?: unknown;\n };\n };\n if (!manifest.model) {\n throw new Error(`Artifact manifest does not contain a model contract: ${manifestPath}`);\n }\n const artifact = await assertUsableModelArtifact(model.artifact_uri);\n if (\n typeof manifest.model.base_model_artifact_uri === \"string\"\n && typeof manifest.model.base_model_fingerprint === \"string\"\n ) {\n const actualBaseFingerprint = await fingerprintLocalBaseModel(\n manifest.model.base_model_artifact_uri,\n typeof manifest.model.base_model === \"string\"\n ? manifest.model.base_model\n : undefined,\n config.paths.modelCache,\n );\n if (actualBaseFingerprint !== manifest.model.base_model_fingerprint) {\n throw new Error(\"Recorded local base-model content no longer matches the model artifact contract.\");\n }\n }\n if (\n typeof manifest.model.artifact_root !== \"string\"\n || resolve(manifest.model.artifact_root) !== resolve(artifact.path)\n ) {\n throw new Error(\"Stored model record does not match the artifact covered by its manifest.\");\n }\n if (manifest.model.base_model !== model.base_model) {\n throw new Error(\"Stored model base model does not match its artifact manifest.\");\n }\n return {\n manifest_path: manifestPath,\n integrity,\n artifact,\n contract: manifest.model,\n };\n}\n\nasync function verifyActivationEvidence(model: LocalModelRecord): Promise<void> {\n const generalBaseline = join(model.artifact_dir, \"general-baseline-eval.json\");\n const generalCandidate = join(model.artifact_dir, \"general-candidate-eval.json\");\n const [hasBaseline, hasCandidate] = await Promise.all([\n stat(generalBaseline).then((metadata) => metadata.isFile(), () => false),\n stat(generalCandidate).then((metadata) => metadata.isFile(), () => false),\n ]);\n if (!hasBaseline || !hasCandidate) {\n throw new Error(\n \"This model cannot be activated because the run did not include a general-regression suite. \"\n + \"Add evaluation.generalRegression to local-runner.json with a held-out dataset, re-run training, then activate. \"\n + \"Until then, serve the adapter with `tt serve local-<run-id>`.\",\n );\n }\n await assertArtifactManifest(join(model.artifact_dir, \"artifact-manifest.json\"), {\n requiredPaths: [\n \"run-report.json\",\n \"general-baseline-eval.json\",\n \"general-candidate-eval.json\",\n ],\n scopeToRequired: true,\n verifyModel: true,\n });\n}\n\nasync function verifyModelArtifactPath(input: string, config: LocalRunnerConfig): Promise<{\n manifest_path: string;\n integrity: Awaited<ReturnType<typeof assertArtifactManifest>>;\n artifact: Awaited<ReturnType<typeof assertUsableModelArtifact>>;\n contract: unknown;\n}> {\n const inputPath = resolve(input);\n let manifestPath: string | undefined;\n let artifactUri = inputPath;\n if (basename(inputPath) === \"artifact-manifest.json\") {\n manifestPath = inputPath;\n const raw = JSON.parse(await readFile(inputPath, \"utf8\")) as { model?: { artifact_root?: unknown } };\n if (typeof raw.model?.artifact_root !== \"string\") {\n throw new Error(`Artifact manifest does not contain a model contract: ${inputPath}`);\n }\n artifactUri = raw.model.artifact_root;\n } else {\n const metadata = await stat(inputPath).catch(() => null);\n if (!metadata) throw new Error(`Model not found and artifact path does not exist: ${input}`);\n let current = metadata.isDirectory() ? inputPath : dirname(inputPath);\n for (let depth = 0; depth < 8; depth += 1) {\n const candidate = join(current, \"artifact-manifest.json\");\n const raw = await readFile(candidate, \"utf8\").catch(() => null);\n if (raw) {\n const parsed = JSON.parse(raw) as { model?: { artifact_root?: unknown } };\n if (\n typeof parsed.model?.artifact_root === \"string\"\n && resolve(parsed.model.artifact_root) === resolve(inputPath)\n ) {\n manifestPath = candidate;\n break;\n }\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n }\n if (!manifestPath) {\n throw new Error(`No artifact manifest covering model path ${inputPath} was found in its parent run directory.`);\n }\n const integrity = await assertArtifactManifest(manifestPath, {\n requiredPaths: [\"stage-metadata.json\", \"training-report.json\"],\n scopeToRequired: true,\n verifyModel: true,\n });\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as { model?: Record<string, unknown> };\n if (!manifest.model) throw new Error(`Artifact manifest does not contain a model contract: ${manifestPath}`);\n const artifact = await assertUsableModelArtifact(artifactUri);\n if (\n typeof manifest.model.base_model_artifact_uri === \"string\"\n && typeof manifest.model.base_model_fingerprint === \"string\"\n ) {\n const actualBaseFingerprint = await fingerprintLocalBaseModel(\n manifest.model.base_model_artifact_uri,\n typeof manifest.model.base_model === \"string\"\n ? manifest.model.base_model\n : undefined,\n config.paths.modelCache,\n );\n if (actualBaseFingerprint !== manifest.model.base_model_fingerprint) {\n throw new Error(\"Recorded local base-model content no longer matches the model artifact contract.\");\n }\n }\n if (\n typeof manifest.model.artifact_root !== \"string\"\n || resolve(manifest.model.artifact_root) !== resolve(artifact.path)\n ) {\n throw new Error(\"Model path does not match the artifact covered by its manifest.\");\n }\n return { manifest_path: manifestPath, integrity, artifact, contract: manifest.model };\n}\n\nasync function modelSystemPrompt(args: {\n argv: string[];\n model: LocalModelRecord;\n store: LocalStore;\n}): Promise<string | undefined> {\n const specPath = readOption(args.argv, \"--spec\");\n if (specPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n if (hasFlag(args.argv, \"--no-spec-prompt\")) return undefined;\n\n let spec: SpecSnapshot;\n if (specPath) {\n const input = JSON.parse(await readFile(resolve(specPath), \"utf8\")) as unknown;\n const local = localBehaviorSpecFileSchema.safeParse(input);\n if (!local.success) {\n throw new Error(`--spec must contain a tunedtensor.json behavior spec: ${resolve(specPath)}`);\n }\n if (isFoundationSpecFile(local.data)) {\n throw new Error(\"Foundation specs have no Hugging Face base model. Use `tt serve foundation --checkpoint <model-dir> --tokenizer <tokenizer.json>`.\");\n }\n spec = local.data;\n } else {\n const runRequestPath = join(args.store.paths.runsDir, args.model.run_id, \"request.json\");\n let persistedRequest: FineTuneRunRequest | null = null;\n try {\n persistedRequest = fineTuneRunRequestSchema.parse(JSON.parse(await readFile(runRequestPath, \"utf8\")));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n spec = persistedRequest?.spec_snapshot\n ?? (await args.store.getSpec(args.model.behavior_spec_id)).spec;\n }\n if (spec.base_model !== args.model.base_model) {\n throw new Error(\n `Behavior spec base model ${spec.base_model} does not match stored model base ${args.model.base_model}.`,\n );\n }\n const prompt = buildSystemMessage(spec);\n const metadata = JSON.parse(\n await readFile(join(args.model.artifact_dir, \"stage-metadata.json\"), \"utf8\"),\n ) as { system_prompt_sha256?: unknown };\n const promptHash = createHash(\"sha256\").update(prompt).digest(\"hex\");\n if (metadata.system_prompt_sha256 !== promptHash) {\n throw new Error(\n \"Behavior spec instructions do not match the prompt fingerprint used for this trained model. \"\n + \"Pass the original --spec, or use --no-spec-prompt only when this change is intentional.\",\n );\n }\n return prompt;\n}\n\nfunction modelServeDevice(argv: string[]): \"cpu\" | \"cuda\" | undefined {\n const value = readOption(argv, \"--device\");\n if (value === undefined || value === \"cpu\" || value === \"cuda\") {\n return value;\n }\n throw new Error(`--device must be cuda or cpu; got: ${value}`);\n}\n\nfunction printServeClientConfig(argv: string[], launch: LocalModelServerLaunch): boolean {\n const client = readOption(argv, \"--print-client-config\");\n if (client === undefined) return false;\n if (client !== \"pi\") throw new Error(\"--print-client-config must be pi.\");\n if (hasFlag(argv, \"--print-command\")) throw new Error(\"Use only one of --print-command or --print-client-config.\");\n const apiKeyEnv = readOption(argv, \"--api-key-env\");\n if (apiKeyEnv && !/^[A-Za-z_][A-Za-z0-9_]*$/.test(apiKeyEnv)) {\n throw new Error(\"--api-key-env must be a plain environment variable name for Pi config.\");\n }\n const url = new URL(launch.url);\n if (url.hostname === \"0.0.0.0\") url.hostname = \"127.0.0.1\";\n if (url.hostname === \"[::]\") url.hostname = \"[::1]\";\n url.pathname = \"/v1\";\n printJson({\n providers: {\n \"tt-local\": {\n baseUrl: url.toString(),\n api: \"openai-completions\",\n apiKey: apiKeyEnv ? \"${\" + apiKeyEnv + \"}\" : \"tt-local\",\n compat: {\n supportsStore: false,\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n supportsUsageInStreaming: true,\n maxTokensField: \"max_tokens\",\n },\n models: [...new Set(launch.env.TT_FOUNDATION_CHECKPOINT ? [launch.modelName] : [launch.modelName, `base:${launch.env.TT_BASE_MODEL}`])].map((id) => ({\n id,\n name: id,\n // This endpoint exports ordinary text/tool calls, not reasoning-effort controls.\n reasoning: false,\n input: [\"text\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: Number(launch.env.TT_CONTEXT_LENGTH),\n maxTokens: Number(launch.env.TT_MAX_TOKENS),\n })),\n },\n },\n });\n return true;\n}\n\nasync function serveStoredModelFromCli(args: {\n argv: string[];\n modelId: string;\n config: LocalRunnerConfig;\n}): Promise<void> {\n const store = createLocalStore(args.config.storeRoot);\n const model = await store.getModel(args.modelId);\n const verified = await verifyStoredModel(model, args.config);\n const launch = buildLocalModelServerLaunch({\n model,\n config: args.config,\n options: {\n host: readOption(args.argv, \"--host\"),\n port: readNumberOption(args.argv, \"--port\"),\n device: modelServeDevice(args.argv),\n maxTokens: readNumberOption(args.argv, \"--max-tokens\"),\n temperature: readNumberOption(args.argv, \"--temperature\"),\n topP: readNumberOption(args.argv, \"--top-p\"),\n maxConcurrentRequests: readNumberOption(args.argv, \"--max-concurrent-requests\"),\n contextLength: readNumberOption(args.argv, \"--context-length\"),\n gpuMemoryUtilization: readNumberOption(args.argv, \"--gpu-memory-utilization\"),\n systemPrompt: await modelSystemPrompt({ argv: args.argv, model, store }),\n allowRemote: hasFlag(args.argv, \"--allow-remote\"),\n apiKeyEnv: readOption(args.argv, \"--api-key-env\"),\n baseModelRevision: (() => {\n const contract = verified.contract as { base_model_revision?: unknown };\n return typeof contract.base_model_revision === \"string\" ? contract.base_model_revision : undefined;\n })(),\n baseModelArtifactUri: (() => {\n const contract = verified.contract as { base_model_artifact_uri?: unknown };\n return typeof contract.base_model_artifact_uri === \"string\" ? contract.base_model_artifact_uri : undefined;\n })(),\n },\n });\n if (printServeClientConfig(args.argv, launch)) return;\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: model.id,\n url: launch.url,\n command: launch.displayCommand,\n artifact_path: launch.artifactPath,\n manifest_path: verified.manifest_path,\n integrity: verified.integrity,\n });\n return;\n }\n process.stderr.write(`[tt] verified ${verified.integrity.checked} artifact file(s)\\n`);\n await serveLocalModel(launch);\n}\n\nfunction serveOptionsFromArgv(argv: string[]) {\n return {\n host: readOption(argv, \"--host\"),\n port: readNumberOption(argv, \"--port\"),\n device: modelServeDevice(argv),\n maxTokens: readNumberOption(argv, \"--max-tokens\"),\n temperature: readNumberOption(argv, \"--temperature\"),\n topP: readNumberOption(argv, \"--top-p\"),\n maxConcurrentRequests: readNumberOption(argv, \"--max-concurrent-requests\"),\n contextLength: readNumberOption(argv, \"--context-length\"),\n gpuMemoryUtilization: readNumberOption(argv, \"--gpu-memory-utilization\"),\n allowRemote: hasFlag(argv, \"--allow-remote\"),\n apiKeyEnv: readOption(argv, \"--api-key-env\"),\n };\n}\n\nasync function serveBaseModelFromCli(args: {\n argv: string[];\n config: LocalRunnerConfig;\n}): Promise<void> {\n const explicitSpecPath = readOption(args.argv, \"--spec\");\n if (explicitSpecPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n const defaultSpecPath = resolve(DEFAULT_LOCAL_SPEC_PATH);\n const specPath = explicitSpecPath\n ? resolve(explicitSpecPath)\n : (await stat(defaultSpecPath).catch(() => null))?.isFile()\n ? defaultSpecPath\n : undefined;\n const spec = specPath\n ? localBehaviorSpecFileSchema.parse(\n JSON.parse(await readFile(specPath, \"utf8\")) as unknown,\n )\n : undefined;\n if (spec && isFoundationSpecFile(spec)) {\n throw new Error(\"Foundation specs have no Hugging Face base model. Use `tt serve foundation --checkpoint <model-dir> --tokenizer <tokenizer.json>`.\");\n }\n let baseModel = spec?.base_model;\n if (!baseModel) {\n const store = createLocalStore(args.config.storeRoot);\n const active = await getActiveModel(store);\n const referenceModel = active.model\n ?? (active.pointer?.previous_model_id\n ? await store.getModel(active.pointer.previous_model_id)\n : null);\n baseModel = referenceModel?.base_model;\n }\n if (!baseModel) {\n throw new Error(\n \"Cannot identify the protected base model. Pass --spec <tunedtensor.json> \"\n + \"or activate a model first.\",\n );\n }\n const launch = buildLocalBaseModelServerLaunch({\n baseModel,\n config: args.config,\n options: {\n ...serveOptionsFromArgv(args.argv),\n systemPrompt: explicitSpecPath && !hasFlag(args.argv, \"--no-spec-prompt\")\n ? buildSystemMessage(spec!)\n : undefined,\n baseModelRevision: spec?.hyperparameters?.base_model_revision ?? defaultBaseModelRevision(baseModel),\n },\n });\n if (printServeClientConfig(args.argv, launch)) return;\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: null,\n base_model: baseModel,\n url: launch.url,\n command: launch.displayCommand,\n });\n return;\n }\n await serveLocalModel(launch);\n}\n\nasync function serveModelTargetFromCli(args: {\n argv: string[];\n target: string;\n config: LocalRunnerConfig;\n}): Promise<void> {\n if (args.target === \"foundation\") {\n const checkpoint = readOption(args.argv, \"--checkpoint\");\n const tokenizer = readOption(args.argv, \"--tokenizer\");\n if (!checkpoint || !tokenizer) {\n throw new Error(\"Foundation serving requires --checkpoint <model-dir> and --tokenizer <tokenizer.json>.\");\n }\n const specPath = readOption(args.argv, \"--spec\");\n if (specPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n const spec = specPath\n ? localBehaviorSpecFileSchema.parse(JSON.parse(await readFile(resolve(specPath), \"utf8\")))\n : undefined;\n if (spec && !isFoundationSpecFile(spec)) throw new Error(\"Foundation serving requires a foundation spec.\");\n const launch = buildFoundationModelServerLaunch({\n checkpoint,\n tokenizer,\n config: args.config,\n options: {\n ...serveOptionsFromArgv(args.argv),\n systemPrompt: spec ? buildSystemMessage(spec) : undefined,\n },\n });\n if (printServeClientConfig(args.argv, launch)) return;\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: launch.modelName,\n url: launch.url,\n command: launch.displayCommand,\n checkpoint: launch.env.TT_FOUNDATION_CHECKPOINT,\n tokenizer: launch.env.TT_FOUNDATION_TOKENIZER,\n });\n return;\n }\n await serveLocalModel(launch);\n return;\n }\n if (readOption(args.argv, \"--checkpoint\") || readOption(args.argv, \"--tokenizer\")) {\n throw new Error(\"--checkpoint and --tokenizer require the foundation target.\");\n }\n if (args.target === \"base\") {\n return serveBaseModelFromCli(args);\n }\n if (args.target === \"active\") {\n const store = createLocalStore(args.config.storeRoot);\n const active = await getActiveModel(store);\n if (!active.model) {\n throw new Error(\n \"No adapter is active. `tt serve active` would serve the protected base model. \"\n + \"Activate a verified adapter first with `tt models activate <model-id>`, or pass `tt serve base` explicitly.\",\n );\n }\n return serveStoredModelFromCli({\n argv: args.argv,\n modelId: active.model.id,\n config: args.config,\n });\n }\n return serveStoredModelFromCli({\n argv: args.argv,\n modelId: args.target,\n config: args.config,\n });\n}\n\nasync function main(argv: string[]): Promise<void> {\n const cli = parseCli(argv);\n const command = cli.command;\n\n if (command === \"--version\" || command === \"-V\") {\n console.log(TT_LOCAL_VERSION);\n return;\n }\n if (cli.help === \"top\" && (argv[2] === \"--help\" || argv[2] === \"-h\")) {\n printHelp();\n return;\n }\n if (cli.help === \"group\") {\n printGroupHelp(command, COMMAND_GROUPS[command]!);\n return;\n }\n if (cli.help === \"command\" && cli.definition) {\n printCommandHelp(cli.definition);\n return;\n }\n\n if (command === \"info\") {\n const info = getLocalRunnerInfo();\n console.log(`${info.name}: ${info.description}`);\n console.log(`Version: ${info.version}`);\n console.log(`Status: ${info.status}`);\n return;\n }\n\n if (command === \"doctor\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const hasDefaultSpec = cli.positionals[0]\n ? true\n : Boolean((await stat(inputPath).catch(() => null))?.isFile());\n let request: FineTuneRunRequest | undefined;\n let foundationSpec: import(\"./contracts.js\").LocalFoundationSpecFile | undefined;\n if (hasDefaultSpec) {\n const input = await loadLocalRunInput(inputPath);\n if (input.kind === \"foundation-spec\") {\n foundationSpec = input.spec;\n } else if (input.kind === \"spec\") {\n request = input.request;\n } else {\n throw new Error(`TT expects a tunedtensor.json behavior spec, not a full run request: ${input.path}`);\n }\n }\n const checks = await runDoctor(configSelection.config, request, foundationSpec);\n const ok = checks.every((check) => check.ok);\n printJson({\n ok,\n config_path: configSelection.path ?? null,\n checks,\n });\n try {\n await assessHardware({\n config: configSelection.config,\n quick: true,\n });\n } catch {\n // Status/context still work without a snapshot; doctor remains the gate.\n // A quick write fills an empty cache and will not replace a fresh full probe.\n }\n if (!ok) process.exitCode = 1;\n return;\n }\n\n if (command === \"hardware\") {\n const configSelection = await configSelectionFromArgv(argv);\n const report = await assessHardware({\n config: configSelection.config,\n quick: hasFlag(argv, \"--quick\"),\n });\n printJson({\n ...report,\n config_path: configSelection.path ?? null,\n });\n return;\n }\n\n if (command === \"init\") {\n const outputPath = resolve(readOption(argv, \"--output\") ?? DEFAULT_LOCAL_SPEC_PATH);\n const profile = readOption(argv, \"--profile\");\n if (profile !== undefined && profile !== \"spark\") {\n throw new Error(`--profile must be spark, got: ${profile}`);\n }\n const engine = readOption(argv, \"--engine\") ?? \"adapter\";\n if (engine !== \"adapter\" && engine !== \"foundation\") {\n throw new Error(`--engine must be adapter or foundation, got: ${engine}`);\n }\n if (engine === \"foundation\" && readOption(argv, \"--model\")) {\n throw new Error(\"Foundation specs do not take --model; they train a tokenizer and GPT from scratch.\");\n }\n const spec = await initLocalSpecFile({\n outputPath,\n name: readOption(argv, \"--name\") ?? (engine === \"foundation\" ? \"Foundation chat model\" : \"Local Tuned Tensor Spec\"),\n engine,\n baseModel: engine === \"foundation\" ? undefined : (readOption(argv, \"--model\") ?? \"Qwen/Qwen3.5-2B\"),\n force: hasFlag(argv, \"--force\"),\n });\n const configPath = profile\n ? resolve(readOption(argv, \"--config\") ?? resolve(dirname(outputPath), \"local-runner.json\"))\n : await selectedConfigPath(argv, outputPath);\n if (profile) {\n await initLocalRunnerConfigFile({\n outputPath: configPath!,\n profile,\n force: hasFlag(argv, \"--force\"),\n });\n } else if (configPath) {\n await loadLocalRunnerConfig(configPath);\n }\n printJson({\n ok: true,\n path: outputPath,\n id: spec.id,\n name: spec.name,\n engine: spec.engine ?? \"adapter\",\n base_model: isFoundationSpecFile(spec) ? null : spec.base_model,\n config_path: configPath ?? null,\n });\n return;\n }\n\n if (command === \"validate\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const loaded = await loadLocalRunInput(inputPath);\n if (loaded.kind === \"foundation-spec\") {\n assertFoundationSpecReady(loaded.spec);\n printJson({\n ok: true,\n input_path: loaded.path,\n engine: \"foundation\",\n pipeline: \"tt pipeline run --spec\",\n });\n return;\n }\n if (loaded.kind !== \"spec\") {\n throw new Error(`TT expects a tunedtensor.json behavior spec, not a full run request: ${loaded.path}`);\n }\n const input = loaded;\n assertLocalRunInputReady(input.request);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const validated = await validateLocalFineTuneInput({\n request: input.request,\n config: configSelection.config,\n });\n const request = validated.request;\n const config = validated.config;\n printJson({\n ok: true,\n input_path: input.path,\n config_path: configSelection.path ?? null,\n behavior_spec_id: request.behavior_spec_id,\n base_model: request.spec_snapshot.base_model,\n dataset_format: request.dataset_prebuilt?.format ?? null,\n artifact_root: config.artifactRoot,\n store_root: config.storeRoot,\n dry_run: config.dryRun,\n });\n return;\n }\n\n if (command === \"run\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const configInput = configSelection.config;\n const config = localRunnerConfigSchema.parse({\n ...configInput,\n dryRun: hasFlag(argv, \"--dry-run\") ? true : configInput.dryRun,\n });\n const input = await loadCliBehaviorSpec(inputPath);\n assertLocalRunInputReady(input.request);\n const validated = await validateLocalFineTuneInput({\n request: input.request,\n config,\n });\n let request = validated.request;\n const reporter = createConsoleReporter({\n verbose: hasFlag(argv, \"--verbose\"),\n quiet: hasFlag(argv, \"--quiet\"),\n });\n if (\n !config.dryRun\n && !config.paths.baseModel\n && !request.hyperparameters.base_model_revision\n ) {\n const prefetch = await prefetchBaseModel({\n request,\n config,\n reporter,\n });\n if (!prefetch.snapshot_revision) {\n throw new Error(\"Base-model prefetch did not return an immutable snapshot revision.\");\n }\n request = fineTuneRunRequestSchema.parse({\n ...request,\n hyperparameters: {\n ...request.hyperparameters,\n base_model_revision: prefetch.snapshot_revision,\n },\n });\n }\n const result = await runLocalFineTune({\n request,\n config,\n reporter,\n });\n printJson({\n status: result.report.status,\n run_id: result.report.run_id,\n behavior_spec_id: result.report.behavior_spec_id,\n report_path: result.reportPath,\n artifact_dir: result.artifactDir,\n ...(!config.dryRun ? {\n model_id: `local-${result.report.run_id}`,\n fine_tuned_model_id: result.report.fine_tuned_model_id,\n } : {}),\n training_log: result.report.training.log_uri,\n baseline_eval: result.report.artifact_uris.baseline_eval,\n candidate_eval: result.report.artifact_uris.candidate_eval,\n comparison: result.report.comparison,\n general_regression: result.report.general_regression,\n });\n return;\n }\n\n if (command === \"serve\") {\n const config = await configFromArgv(argv);\n await serveModelTargetFromCli({\n argv,\n target: cli.positionals[0]!,\n config,\n });\n return;\n }\n\n if (command === \"runs\") {\n const subcommand = cli.subcommand!;\n const config = await configFromArgv(argv);\n const store = createLocalStore(config.storeRoot);\n if (subcommand === \"list\") return printJson(await store.listRuns());\n if (subcommand === \"get\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs get requires <run-id>\");\n return printJson(await store.getRun(id));\n }\n if (subcommand === \"events\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs events requires <run-id>\");\n return printJson(await store.getRunEvents(id));\n }\n if (subcommand === \"report\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs report requires <run-id>\");\n return printJson(await store.getRunReport(id));\n }\n if (subcommand === \"compare\") {\n const idA = cli.positionals[0];\n const idB = cli.positionals[1];\n if (!idA || !idB) throw new Error(\"runs compare requires <run-id-a> <run-id-b>\");\n const [reportA, reportB] = await Promise.all([\n store.getRunReport(idA),\n store.getRunReport(idB),\n ]);\n return printJson(compareRuns(reportA, reportB));\n }\n throw new Error(`Unknown runs command: ${subcommand}`);\n }\n\n if (command === \"models\") {\n const subcommand = cli.subcommand!;\n const modelInputPath = subcommand === \"prefetch\" || subcommand === \"verify-base\"\n ? resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH)\n : undefined;\n const config = await configFromArgv(argv, modelInputPath);\n const store = createLocalStore(config.storeRoot);\n if (subcommand === \"list\") return printJson(await store.listModels());\n if (subcommand === \"get\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models get requires <model-id>\");\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model, config);\n return printJson({\n ok: true,\n model,\n ...verified,\n });\n }\n if (subcommand === \"verify\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models verify requires <model-id-or-artifact-path>\");\n if (await stat(resolve(id)).then(() => true, () => false)) {\n return printJson({ ok: true, model: null, ...await verifyModelArtifactPath(id, config) });\n }\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model, config);\n return printJson({ ok: true, model, ...verified });\n }\n if (subcommand === \"active\") {\n const active = await getActiveModel(store);\n return printJson({\n active: active.model?.id ?? \"base\",\n pointer: active.pointer,\n model: active.model,\n });\n }\n if (subcommand === \"activate\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models activate requires <model-id>\");\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model, config);\n await verifyActivationEvidence(model);\n const pointer = await activateModel(store, model.id);\n return printJson({\n active: pointer.model_id,\n pointer,\n manifest_path: verified.manifest_path,\n integrity: verified.integrity,\n });\n }\n if (subcommand === \"rollback\") {\n const current = await getActiveModel(store);\n if (current.pointer?.previous_model_id) {\n const previous = await store.getModel(current.pointer.previous_model_id);\n await verifyStoredModel(previous, config);\n await verifyActivationEvidence(previous);\n }\n const pointer = await rollbackActiveModel(store);\n return printJson({ active: pointer.model_id ?? \"base\", pointer });\n }\n if (subcommand === \"prefetch\" || subcommand === \"verify-base\") {\n const input = await loadCliBehaviorSpec(modelInputPath!);\n const report = await prefetchBaseModel({\n request: input.request,\n config,\n localOnly: subcommand === \"verify-base\",\n reporter: createConsoleReporter({\n verbose: hasFlag(argv, \"--verbose\"),\n quiet: hasFlag(argv, \"--quiet\"),\n }),\n });\n return printJson({\n ...report,\n input_path: input.path,\n });\n }\n if (subcommand === \"serve\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models serve requires <model-id>\");\n await serveModelTargetFromCli({ argv, target: id, config });\n return;\n }\n throw new Error(`Unknown models command: ${subcommand}`);\n }\n\n console.error(`Unknown command: ${command}`);\n process.exitCode = 1;\n}\n\nfunction isCliEntrypoint(): boolean {\n if (!process.argv[1]) return false;\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1]);\n}\n\nif (isCliEntrypoint()) {\n main(process.argv).catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n });\n}\n","import type { EvalExampleResult, EvalReport, RunReport } from \"./contracts.js\";\nimport { tokenF1 } from \"./evaluation.js\";\n\ninterface SubsetSide {\n baseline_avg_score: number | null;\n candidate_avg_score: number | null;\n candidate_avg_token_f1: number | null;\n}\n\ninterface RunSummary {\n run_id: string;\n started_at: string;\n base_model: string;\n training_example_count: number | null;\n eval_examples_used: number;\n baseline_avg_score: number;\n candidate_avg_score: number;\n candidate_avg_token_f1: number | null;\n avg_score_delta: number;\n}\n\nexport interface RunComparison {\n run_a: RunSummary;\n run_b: RunSummary;\n shared: {\n examples: number;\n run_a: SubsetSide;\n run_b: SubsetSide;\n candidate_avg_score_delta: number | null;\n candidate_avg_token_f1_delta: number | null;\n };\n b_only: SubsetSide & { examples: number };\n notes: string[];\n}\n\nfunction byPrompt(report: EvalReport): Map<string, EvalExampleResult> {\n return new Map(report.results.map((result) => [result.prompt, result]));\n}\n\nfunction avg(values: number[]): number | null {\n return values.length > 0 ? values.reduce((sum, value) => sum + value, 0) / values.length : null;\n}\n\nfunction summarizeRun(report: RunReport): RunSummary {\n return {\n run_id: report.run_id,\n started_at: report.run_metadata.started_at,\n base_model: report.base_model,\n training_example_count: report.run_metadata.training_example_count,\n eval_examples_used: report.run_metadata.eval_examples_used,\n baseline_avg_score: report.baseline.avg_score,\n candidate_avg_score: report.candidate.avg_score,\n candidate_avg_token_f1: report.candidate.avg_token_f1 ?? null,\n avg_score_delta: report.comparison.avg_score_delta,\n };\n}\n\nfunction subsetSide(\n prompts: string[],\n baseline: Map<string, EvalExampleResult>,\n candidate: Map<string, EvalExampleResult>,\n): SubsetSide {\n const candidateResults = prompts\n .map((prompt) => candidate.get(prompt))\n .filter((result): result is EvalExampleResult => Boolean(result));\n return {\n baseline_avg_score: avg(prompts\n .map((prompt) => baseline.get(prompt)?.score)\n .filter((score): score is number => typeof score === \"number\")),\n candidate_avg_score: avg(candidateResults.map((result) => result.score)),\n candidate_avg_token_f1: avg(candidateResults.map((result) => tokenF1(result.expected, result.actual))),\n };\n}\n\n/**\n * Aligns two run reports on their shared eval prompts so recipe changes can\n * be compared apples-to-apples even when the eval set grew or shifted between\n * runs. Headline avg_score_delta values are not comparable across different\n * eval subsets; the shared subset is.\n */\nexport function compareRuns(a: RunReport, b: RunReport): RunComparison {\n const aCandidate = byPrompt(a.candidate);\n const bCandidate = byPrompt(b.candidate);\n const aBaseline = byPrompt(a.baseline);\n const bBaseline = byPrompt(b.baseline);\n const sharedPrompts = [...bCandidate.keys()].filter((prompt) => aCandidate.has(prompt));\n const bOnlyPrompts = [...bCandidate.keys()].filter((prompt) => !aCandidate.has(prompt));\n\n const sharedA = subsetSide(sharedPrompts, aBaseline, aCandidate);\n const sharedB = subsetSide(sharedPrompts, bBaseline, bCandidate);\n const runA = summarizeRun(a);\n const runB = summarizeRun(b);\n\n const notes: string[] = [];\n if (bOnlyPrompts.length > 0) {\n notes.push(\n `run_b evaluated ${bOnlyPrompts.length} example(s) run_a never saw; headline avg_score_delta values `\n + \"are not directly comparable across the two runs. Use the shared subset for recipe comparisons.\",\n );\n }\n return {\n run_a: runA,\n run_b: runB,\n shared: {\n examples: sharedPrompts.length,\n run_a: sharedA,\n run_b: sharedB,\n candidate_avg_score_delta:\n sharedA.candidate_avg_score !== null && sharedB.candidate_avg_score !== null\n ? sharedB.candidate_avg_score - sharedA.candidate_avg_score\n : null,\n candidate_avg_token_f1_delta:\n sharedA.candidate_avg_token_f1 !== null && sharedB.candidate_avg_token_f1 !== null\n ? sharedB.candidate_avg_token_f1 - sharedA.candidate_avg_token_f1\n : null,\n },\n b_only: { examples: bOnlyPrompts.length, ...subsetSide(bOnlyPrompts, bBaseline, bCandidate) },\n notes,\n };\n}\n","import { checkAwsGpu, runGpuProcess } from \"./gpu-executor.js\";\nimport { constants } from \"node:fs\";\nimport { access, lstat, mkdir, statfs, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport type { FineTuneRunRequest, LocalFoundationSpecFile, LocalRunnerConfig } from \"./contracts.js\";\nimport { foundationPlaceholderIssues, localPathsOverlap } from \"./local-project.js\";\nimport {\n minimalMachineLearningEnvironment,\n withHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport {\n buildBundledPythonCommand,\n buildFoundationPythonCommand,\n withBundledPythonEnvironment,\n withFoundationPythonEnvironment,\n} from \"./process-runner.js\";\nimport { resolveTrainingModel } from \"./model-registry.js\";\nimport { defaultLocalHome } from \"./store.js\";\nimport { verifyLocalBaseModel } from \"./prefetch.js\";\n\nexport interface DoctorCheck {\n name: string;\n ok: boolean;\n message: string;\n details?: Record<string, unknown>;\n}\n\ninterface 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\nfunction nvidiaSmiSummary(stdout: string): string {\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n const queried = lines.find((line) =>\n !/^(?:mon|tue|wed|thu|fri|sat|sun)\\b/i.test(line)\n && !line.startsWith(\"+---\")\n && !line.startsWith(\"|\")\n );\n if (queried) return queried;\n return firstLine(stdout) || \"nvidia-smi reported a GPU\";\n}\n\nfunction commandText(command: string, args: string[]): string {\n return [command, ...args].map((part) => /\\s/.test(part) ? JSON.stringify(part) : part).join(\" \");\n}\n\nasync function writableDirectoryCheck(name: string, path: string): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n const probePath = join(resolvedPath, `.tt-local-write-probe-${process.pid}-${Date.now()}`);\n try {\n await mkdir(resolvedPath, { recursive: true });\n await access(resolvedPath, constants.R_OK | constants.W_OK);\n await writeFile(probePath, \"ok\\n\", { flag: \"wx\" });\n await unlink(probePath);\n const fs = await statfs(resolvedPath);\n const freeBytes = Number(fs.bavail) * Number(fs.bsize);\n return {\n name,\n ok: true,\n message: `${resolvedPath} is writable (${Math.round(freeBytes / (1024 ** 3) * 10) / 10} GiB available)`,\n details: { path: resolvedPath, free_bytes: freeBytes },\n };\n } catch (error) {\n await unlink(probePath).catch(() => undefined);\n return {\n name,\n ok: false,\n message: `${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`,\n details: { path: resolvedPath },\n };\n }\n}\n\ninterface PythonProbePlan {\n name: \"python-runtime\";\n command: string;\n args: string[];\n env: NodeJS.ProcessEnv;\n}\n\nfunction foundationPythonProbePlan(requireBf16: boolean): PythonProbePlan {\n const source = [\n \"import json\",\n \"import numpy, safetensors, tokenizers, torch\",\n \"assert torch.cuda.is_available(), 'TT Foundation training requires CUDA but torch.cuda.is_available() is false'\",\n ...(requireBf16\n ? [\"assert torch.cuda.is_bf16_supported(), 'TT Foundation BF16 training was requested but this device does not support BF16'\"]\n : []),\n \"props = torch.cuda.get_device_properties(0)\",\n \"print(json.dumps({'python_ok': True, 'torch': torch.__version__, 'cuda_available': True, 'bf16': torch.cuda.is_bf16_supported(), 'cuda_device': torch.cuda.get_device_name(0), 'compute_capability': list(torch.cuda.get_device_capability(0)), 'total_memory_bytes': props.total_memory}))\",\n ].join(\"; \");\n const entrypoint = buildFoundationPythonCommand(\"-c\", [source]);\n return {\n name: \"python-runtime\",\n command: entrypoint.command,\n args: entrypoint.commandArgs,\n env: withFoundationPythonEnvironment(process.env),\n };\n}\n\n/** Preparation still runs on the laptop when GPU work is remote. */\nfunction localPreparationProbePlan(foundation: boolean): PythonProbePlan {\n const source = [\n \"import json\",\n foundation ? \"import numpy, safetensors, tokenizers, torch\" : \"import torch, transformers, peft, huggingface_hub\",\n \"assert torch.ones(1, device='cpu').item() == 1\",\n \"print(json.dumps({'python_ok': True, 'device': 'cpu', 'purpose': 'local preparation and CPU work'}))\",\n ].join(\"; \");\n const entrypoint = foundation\n ? buildFoundationPythonCommand(\"-c\", [source])\n : buildBundledPythonCommand(\"-c\", [source]);\n const env = minimalMachineLearningEnvironment(process.env);\n return {\n name: \"python-runtime\",\n command: entrypoint.command,\n args: entrypoint.commandArgs,\n env: foundation ? withFoundationPythonEnvironment(env) : withBundledPythonEnvironment(env),\n };\n}\n\nfunction pythonProbeSource(device: LocalRunnerConfig[\"evaluation\"][\"inference\"][\"device\"]): string {\n return [\n \"import json\",\n \"import torch, transformers, peft, huggingface_hub\",\n `requested = ${JSON.stringify(device)}`,\n \"assert torch.cuda.is_available(), 'TT local training requires CUDA but torch.cuda.is_available() is false'\",\n \"props = torch.cuda.get_device_properties(0)\",\n \"print(json.dumps({'python_ok': True, 'torch': torch.__version__, 'transformers': transformers.__version__, 'cuda_available': True, 'cuda_device': torch.cuda.get_device_name(0), 'compute_capability': list(torch.cuda.get_device_capability(0)), 'total_memory_bytes': props.total_memory, 'evaluation_device': requested}))\",\n ].join(\"; \");\n}\n\nfunction pythonProbePlan(args: {\n device: LocalRunnerConfig[\"evaluation\"][\"inference\"][\"device\"];\n modelCache?: string;\n}): PythonProbePlan {\n const entrypoint = buildBundledPythonCommand(\n \"-c\",\n [pythonProbeSource(args.device)],\n );\n const env = withBundledPythonEnvironment(\n withHuggingFaceCacheEnvironment(\n minimalMachineLearningEnvironment(process.env),\n args.modelCache,\n ),\n );\n return {\n name: \"python-runtime\",\n command: entrypoint.command,\n args: entrypoint.commandArgs,\n env,\n };\n}\n\n/** Build the exact bundled uv environment that every real stage uses. */\nexport function buildDoctorPythonPlans(config: LocalRunnerConfig): PythonProbePlan[] {\n if (config.dryRun) return [];\n return [\n pythonProbePlan({\n device: config.evaluation.inference.device,\n modelCache: config.paths.modelCache,\n }),\n ];\n}\n\nfunction foundationPlaceholderCheck(spec: LocalFoundationSpecFile): DoctorCheck {\n const issues = foundationPlaceholderIssues(spec);\n return {\n name: \"spec-content\",\n ok: issues.length === 0,\n message: issues.length > 0\n ? \"The spec still contains generated placeholder content; edit it before training.\"\n : `${spec.examples.length} spec example(s); foundation engine`,\n };\n}\n\nasync function foundationCorpusCheck(name: string, path: string): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n try {\n const info = await lstat(resolvedPath);\n const supported = info.isFile() || info.isDirectory();\n return {\n name,\n ok: supported && !info.isSymbolicLink(),\n message: supported && !info.isSymbolicLink()\n ? `${resolvedPath} is available for streaming.`\n : `${resolvedPath} must be a regular file or directory, not a symbolic link.`,\n details: { path: resolvedPath },\n };\n } catch (error) {\n return {\n name,\n ok: false,\n message: `${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`,\n details: { path: resolvedPath },\n };\n }\n}\n\nfunction placeholderSpecCheck(request: FineTuneRunRequest): DoctorCheck {\n const placeholder = request.spec_snapshot.examples.some((example) =>\n /replace this with/i.test(example.input) || /replace this with/i.test(example.output)\n ) || /describe the behavior this local model should learn/i.test(request.spec_snapshot.system_prompt);\n return {\n name: \"spec-content\",\n ok: !placeholder,\n message: placeholder\n ? \"The spec still contains generated placeholder content; edit it before training.\"\n : `${request.spec_snapshot.examples.length} spec example(s); base model ${request.spec_snapshot.base_model}`,\n };\n}\n\nasync function localBaseModelCheck(\n path: string,\n expectedModelId?: string,\n modelCache?: string,\n): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n try {\n const verified = await verifyLocalBaseModel(resolvedPath, expectedModelId, modelCache);\n return {\n name: \"local-base-model\",\n ok: true,\n message: `${resolvedPath} is a valid local Hugging Face snapshot directory.`,\n details: { path: resolvedPath, file_count: verified.fileCount, size_bytes: verified.sizeBytes },\n };\n } catch (error) {\n return {\n name: \"local-base-model\",\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n details: { path: resolvedPath },\n };\n }\n}\n\nexport async function runDoctor(\n config: LocalRunnerConfig,\n request?: FineTuneRunRequest,\n foundationSpec?: LocalFoundationSpecFile,\n): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n const nodeVersion = process.versions.node;\n const nodeMajor = Number(nodeVersion.split(\".\")[0]);\n checks.push({ name: \"node\", ok: nodeMajor >= 22, message: `Node ${nodeVersion}` });\n\n checks.push(await writableDirectoryCheck(\"artifact-root\", config.artifactRoot));\n checks.push(await writableDirectoryCheck(\"store-root\", config.storeRoot ?? defaultLocalHome()));\n checks.push(await writableDirectoryCheck(\n \"model-cache\",\n config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), \".cache\", \"huggingface\"),\n ));\n if (config.paths.baseModel) {\n checks.push(await localBaseModelCheck(\n config.paths.baseModel,\n request?.spec_snapshot.base_model,\n config.paths.modelCache,\n ));\n }\n\n if (foundationSpec) {\n checks.push(foundationPlaceholderCheck(foundationSpec));\n if (foundationSpec.foundation.corpus_path) {\n checks.push(await foundationCorpusCheck(\"pretraining-corpus\", foundationSpec.foundation.corpus_path));\n }\n if (foundationSpec.foundation.validation_path) {\n checks.push(await foundationCorpusCheck(\"validation-corpus\", foundationSpec.foundation.validation_path));\n }\n if (\n foundationSpec.foundation.corpus_path\n && foundationSpec.foundation.validation_path\n && localPathsOverlap(\n foundationSpec.foundation.corpus_path,\n foundationSpec.foundation.validation_path,\n )\n ) {\n checks.push({\n name: \"held-out-corpus\",\n ok: false,\n message: \"foundation.corpus_path and foundation.validation_path must be distinct.\",\n });\n }\n if (foundationSpec.foundation.checkpoint_backup_dir) {\n checks.push(await writableDirectoryCheck(\n \"checkpoint-backup\",\n foundationSpec.foundation.checkpoint_backup_dir,\n ));\n }\n } else if (request) {\n checks.push(placeholderSpecCheck(request));\n resolveTrainingModel(request.spec_snapshot.base_model);\n }\n const pythonPlans = config.dryRun ? [] : config.gpu\n ? [localPreparationProbePlan(Boolean(foundationSpec))]\n : foundationSpec\n ? [foundationPythonProbePlan(foundationSpec.foundation.bf16 !== false)]\n : buildDoctorPythonPlans(config);\n if (pythonPlans.length > 0) {\n const uvVersion = await runCommand(\"uv\", [\"--version\"]);\n checks.push({\n name: \"uv\",\n ok: uvVersion.code === 0,\n message: uvVersion.code === 0\n ? firstLine(uvVersion.stdout)\n : uvVersion.error ?? (firstLine(uvVersion.stderr) || \"uv is not available\"),\n });\n\n if (uvVersion.code === 0) {\n const uniquePlans = new Map<string, PythonProbePlan>();\n for (const plan of pythonPlans) {\n const key = JSON.stringify([plan.command, plan.args, plan.env]);\n if (!uniquePlans.has(key)) uniquePlans.set(key, plan);\n }\n for (const plan of uniquePlans.values()) {\n const result = await runCommand(plan.command, plan.args, {\n env: plan.env,\n timeoutMs: 1_800_000,\n });\n checks.push({\n name: plan.name,\n ok: result.code === 0,\n message: result.code === 0\n ? firstLine(result.stdout)\n : result.error ?? (firstLine(result.stderr) || `${plan.command} exited ${result.code}`),\n details: { command: commandText(plan.command, plan.args) },\n });\n }\n }\n } else {\n checks.push({\n name: \"python-runtime\",\n ok: true,\n message: config.dryRun\n ? \"Python dependency checks skipped because dryRun is enabled.\"\n : \"Python dependency checks were skipped.\",\n });\n }\n\n const device = config.evaluation.inference.device;\n if (config.gpu && !config.dryRun) {\n try {\n await checkAwsGpu(config.gpu);\n const plans = foundationSpec\n ? [foundationPythonProbePlan(foundationSpec.foundation.bf16 !== false)]\n : buildDoctorPythonPlans(config);\n for (const plan of plans) {\n const result = await runGpuProcess({ gpu: config.gpu, runtime: foundationSpec ? \"foundation\" : \"adapter\",\n files: [], command: plan.command, commandArgs: plan.args, env: plan.env,\n stage: \"gpu_check\", timeoutMs: 1_800_000 });\n if (result.exitCode !== 0) throw new Error(`Remote Python/CUDA check failed: ${result.stderr}`);\n }\n checks.push({ name: \"aws-gpu\", ok: true, message: `GPU execution on ${config.gpu.instanceId}; orchestration stays local.` });\n } catch (error) {\n checks.push({ name: \"aws-gpu\", ok: false, message: error instanceof Error ? error.message : String(error) });\n }\n } else if (!config.dryRun) {\n const queried = await runCommand(\"nvidia-smi\", [\n \"--query-gpu=name,driver_version\",\n \"--format=csv,noheader\",\n ]);\n const nvidiaSmi = queried.code === 0 ? queried : await runCommand(\"nvidia-smi\", []);\n checks.push({\n name: \"nvidia-smi\",\n ok: nvidiaSmi.code === 0,\n message: nvidiaSmi.code === 0\n ? nvidiaSmiSummary(nvidiaSmi.stdout)\n : nvidiaSmi.error ?? (firstLine(nvidiaSmi.stderr) || \"nvidia-smi not available\"),\n });\n } else {\n checks.push({\n name: \"nvidia-smi\",\n ok: true,\n message: config.dryRun\n ? \"GPU checks skipped because dryRun is enabled.\"\n : `nvidia-smi is not required for device=${device}.`,\n });\n }\n\n const trainingCommand = foundationSpec\n ? buildFoundationPythonCommand(\"pretrain.py\").displayCommand\n : buildBundledPythonCommand(\"train.py\").displayCommand;\n checks.push({\n name: \"effective-plan\",\n ok: true,\n message: \"Resolved the configured training and evaluation plan.\",\n details: {\n training_command: trainingCommand ?? null,\n evaluation_provider: foundationSpec ? \"foundation\" : \"transformers\",\n evaluation_device: device,\n artifact_root: resolve(config.artifactRoot),\n store_root: resolve(config.storeRoot ?? defaultLocalHome()),\n model_cache: resolve(config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), \".cache\", \"huggingface\")),\n base_model: request?.spec_snapshot.base_model ?? null,\n scoring_mode: foundationSpec ? \"bpb/chat\" : config.evaluation.scoring.mode,\n },\n });\n\n return checks;\n}\n","import { readFileSync, statSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { resolve, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { LocalRunnerConfig } from \"./contracts.js\";\nimport {\n minimalMachineLearningEnvironment,\n withOfflineHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport {\n defaultBaseModelRevision,\n resolveModelLoader,\n resolveRequestedBaseModelRevision,\n} from \"./model-registry.js\";\nimport {\n buildServingPythonCommand,\n withServingPythonEnvironment,\n} from \"./serving-runtime.js\";\nimport type { LocalModelRecord } from \"./store.js\";\nimport { verifyLocalBaseModel } from \"./prefetch.js\";\n\nexport interface LocalModelServeOptions {\n host?: string;\n port?: number;\n device?: \"cpu\" | \"cuda\";\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n systemPrompt?: string;\n allowRemote?: boolean;\n apiKeyEnv?: string;\n maxConcurrentRequests?: number;\n contextLength?: number;\n gpuMemoryUtilization?: number;\n baseModelRevision?: string;\n baseModelArtifactUri?: string;\n}\n\nexport interface LocalModelServerLaunch {\n command: string;\n commandArgs: string[];\n displayCommand: string[];\n env: NodeJS.ProcessEnv;\n url: string;\n modelName: string;\n artifactPath?: string;\n}\n\nfunction localArtifactPath(uri: string): string {\n if (uri.startsWith(\"file://\")) return fileURLToPath(uri);\n if (/^[a-z][a-z0-9+.-]*:/i.test(uri)) {\n throw new Error(`Local TT serving requires a local file artifact, got: ${uri}`);\n }\n return resolve(uri);\n}\n\nfunction boundedNumber(name: string, value: number, minimum: number, maximum: number, integer = false): number {\n if (!Number.isFinite(value) || value < minimum || value > maximum || (integer && !Number.isInteger(value))) {\n throw new Error(`${name} must be between ${minimum} and ${maximum}`);\n }\n return value;\n}\n\nfunction isLoopbackHost(host: string): boolean {\n return host === \"127.0.0.1\" || host === \"localhost\" || host === \"::1\" || host === \"[::1]\";\n}\n\nfunction httpHost(host: string): string {\n return host.includes(\":\") && !host.startsWith(\"[\") ? `[${host}]` : host;\n}\n\nfunction buildModelServerLaunch(args: {\n modelName: string;\n baseModel: string;\n artifactUri?: string;\n config: LocalRunnerConfig;\n foundation?: { checkpoint: string; tokenizer: string; contextLength: number };\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n const options = args.options ?? {};\n const device = options.device ?? args.config.evaluation.inference.device;\n if (device !== \"cuda\") throw new Error(\"The pinned vLLM serving runtime requires CUDA; CPU serving is not supported.\");\n const contextLength = boundedNumber(\n \"contextLength\", options.contextLength ?? args.foundation?.contextLength ?? 16384,\n args.foundation ? 1 : 512, 131072, true,\n );\n if (args.foundation && contextLength > args.foundation.contextLength) {\n throw new Error(\"Context length exceeds the foundation checkpoint sequence_length.\");\n }\n const gpuMemoryUtilization = boundedNumber(\"gpuMemoryUtilization\", options.gpuMemoryUtilization ?? 0.8, 0.05, 0.95);\n const host = options.host ?? \"127.0.0.1\";\n const remote = !isLoopbackHost(host);\n if (remote && !options.allowRemote) {\n throw new Error(\"Refusing a non-loopback model server bind without --allow-remote.\");\n }\n const apiKey = options.apiKeyEnv ? process.env[options.apiKeyEnv]?.trim() : undefined;\n if (options.apiKeyEnv && !apiKey) throw new Error(`${options.apiKeyEnv} is not set.`);\n if (remote && !apiKey) {\n throw new Error(\"Non-loopback serving requires --api-key-env with a populated environment variable.\");\n }\n const port = boundedNumber(\"port\", options.port ?? 8000, 1, 65_535, true);\n const maxTokens = boundedNumber(\"maxTokens\", options.maxTokens ?? Math.min(512, contextLength), 1, 8192, true);\n const temperature = boundedNumber(\"temperature\", options.temperature ?? 0, 0, 5);\n const topP = boundedNumber(\"topP\", options.topP ?? 1, 0, 1);\n const maxConcurrentRequests = boundedNumber(\n \"maxConcurrentRequests\",\n options.maxConcurrentRequests ?? 1,\n 1,\n 8,\n true,\n );\n const artifactPath = args.artifactUri\n ? localArtifactPath(args.artifactUri)\n : undefined;\n const recordedBaseModelPath = options.baseModelArtifactUri\n ? localArtifactPath(options.baseModelArtifactUri)\n : undefined;\n const configuredBaseModelPath = !args.foundation && args.config.paths.baseModel\n ? resolve(args.config.paths.baseModel)\n : undefined;\n if (\n recordedBaseModelPath\n && configuredBaseModelPath\n && resolve(recordedBaseModelPath) !== configuredBaseModelPath\n ) {\n throw new Error(\n `Configured paths.baseModel ${configuredBaseModelPath} does not match the base model recorded for this artifact: `\n + recordedBaseModelPath,\n );\n }\n const localBaseModelPath = recordedBaseModelPath ?? configuredBaseModelPath;\n const requestedBaseModelRevision = args.foundation ? undefined : resolveRequestedBaseModelRevision(\n args.baseModel,\n options.baseModelRevision,\n );\n const baseModelRevision = localBaseModelPath\n ? defaultBaseModelRevision(args.baseModel)\n : requestedBaseModelRevision;\n const entrypoint = buildServingPythonCommand();\n const env = withServingPythonEnvironment(\n withOfflineHuggingFaceCacheEnvironment({\n ...minimalMachineLearningEnvironment(process.env),\n ...(artifactPath ? { TT_MODEL_ARTIFACT: artifactPath } : {}),\n TT_BASE_MODEL: args.baseModel,\n ...(localBaseModelPath ? { TT_MODEL_SOURCE: localBaseModelPath } : {}),\n ...(baseModelRevision\n ? { TT_BASE_MODEL_REVISION: baseModelRevision }\n : {}),\n TT_MODEL_NAME: args.modelName,\n TT_CONTEXT_LENGTH: String(contextLength),\n TT_GPU_MEMORY_UTILIZATION: String(gpuMemoryUtilization),\n TT_MODEL_LOADER: args.foundation ? \"foundation\" : resolveModelLoader(args.baseModel),\n ...(args.foundation ? {\n TT_FOUNDATION_CHECKPOINT: args.foundation.checkpoint,\n TT_FOUNDATION_TOKENIZER: args.foundation.tokenizer,\n } : {}),\n TT_HOST: host,\n TT_PORT: String(port),\n TT_DEVICE: device,\n TT_MAX_TOKENS: String(maxTokens),\n TT_TEMPERATURE: String(temperature),\n TT_TOP_P: String(topP),\n TT_TRUST_REMOTE_CODE: \"false\",\n TT_MAX_CONCURRENT_REQUESTS: String(maxConcurrentRequests),\n ...(options.systemPrompt ? { TT_SYSTEM_PROMPT: options.systemPrompt } : {}),\n ...(apiKey ? { TT_API_KEY: apiKey } : {}),\n }, args.config.paths.modelCache),\n );\n return {\n command: entrypoint.command,\n commandArgs: entrypoint.commandArgs,\n displayCommand: entrypoint.displayCommand,\n env,\n url: `http://${httpHost(host)}:${port}`,\n modelName: args.modelName,\n artifactPath,\n };\n}\n\nexport function buildLocalModelServerLaunch(args: {\n model: LocalModelRecord;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n return buildModelServerLaunch({\n modelName: args.model.id,\n baseModel: args.model.base_model,\n artifactUri: args.model.artifact_uri,\n config: args.config,\n options: args.options,\n });\n}\n\nexport function buildLocalBaseModelServerLaunch(args: {\n baseModel: string;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n return buildModelServerLaunch({\n modelName: `base:${args.baseModel}`,\n baseModel: args.baseModel,\n config: args.config,\n options: args.options,\n });\n}\n\nexport async function verifyLocalModelServerLaunch(\n launch: LocalModelServerLaunch,\n): Promise<void> {\n const modelSource = launch.env.TT_MODEL_SOURCE;\n const expectedModelId = launch.env.TT_BASE_MODEL;\n if (modelSource && expectedModelId) {\n await verifyLocalBaseModel(modelSource, expectedModelId, launch.env.HF_HOME);\n }\n}\n\nexport async function serveLocalModel(launch: LocalModelServerLaunch): Promise<void> {\n if (process.platform !== \"linux\") throw new Error(\"Local vLLM serving requires Linux and an NVIDIA CUDA GPU.\");\n await verifyLocalModelServerLaunch(launch);\n await new Promise<void>((resolveServer, reject) => {\n const child = spawn(launch.command, launch.commandArgs, {\n env: launch.env,\n stdio: \"inherit\",\n detached: process.platform !== \"win32\",\n });\n let stopping = false;\n let forceKillTimer: NodeJS.Timeout | undefined;\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 // Fall through when the process group has already exited.\n }\n }\n child.kill(signal);\n };\n const stop = (signal: NodeJS.Signals) => {\n if (stopping) return;\n stopping = true;\n killProcessGroup(signal);\n forceKillTimer = setTimeout(() => killProcessGroup(\"SIGKILL\"), 5_000);\n forceKillTimer.unref();\n };\n const onSigint = () => stop(\"SIGINT\");\n const onSigterm = () => stop(\"SIGTERM\");\n const cleanup = () => {\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n };\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n child.once(\"error\", (error) => {\n cleanup();\n reject(error);\n });\n child.once(\"close\", (code, signal) => {\n cleanup();\n if (stopping || signal === \"SIGINT\" || signal === \"SIGTERM\") {\n resolveServer();\n } else if (code === 0) {\n resolveServer();\n } else {\n reject(new Error(`Local model server exited with code ${code ?? \"unknown\"}.`));\n }\n });\n });\n}\n\nexport function buildFoundationModelServerLaunch(args: {\n checkpoint: string;\n tokenizer: string;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n const checkpoint = resolve(args.checkpoint);\n const tokenizer = resolve(args.tokenizer);\n for (const path of [join(checkpoint, \"model.safetensors\"), tokenizer]) {\n if (!statSync(path).isFile()) throw new Error(`Expected foundation artifact file: ${path}`);\n }\n const metadata = JSON.parse(readFileSync(join(checkpoint, \"config.json\"), \"utf8\"));\n const contextLength = boundedNumber(\"sequence_length\", metadata.sequence_length, 1, 131072, true);\n return buildModelServerLaunch({\n modelName: \"foundation\", baseModel: \"foundation\", config: args.config, options: args.options,\n foundation: { checkpoint, tokenizer, contextLength },\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { pythonEnvironmentPath } from \"../paths.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\n\nconst root = localRuntimePackageRoot(import.meta.url);\nconst project = join(root, \"training/serving\");\nconst hash = createHash(\"sha256\");\nfor (const name of [\"pyproject.toml\", \"uv.lock\"]) hash.update(readFileSync(join(project, name)));\nexport const SERVING_PYTHON_ENVIRONMENT = pythonEnvironmentPath(\"uv-serving\", hash.digest(\"hex\").slice(0, 20));\n\nexport function buildServingPythonCommand() {\n const commandArgs = [\"run\", \"--frozen\", \"--quiet\", \"--project\", project,\n \"python\", join(root, \"training/adapter/src/serve.py\")];\n return { command: \"uv\", commandArgs, displayCommand: [\"uv\", ...commandArgs] };\n}\n\nexport function withServingPythonEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n return {\n ...env,\n UV_PROJECT_ENVIRONMENT: SERVING_PYTHON_ENVIRONMENT,\n VLLM_NO_USAGE_STATS: \"1\",\n DO_NOT_TRACK: \"1\",\n VLLM_ALLOW_RUNTIME_LORA_UPDATING: \"0\",\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { appendFile, chmod, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { runReportSchema } from \"./contracts.js\";\nimport { hardenExistingLocalStore, type LocalModelRecord, type LocalStore } from \"./store.js\";\n\nexport interface ActiveModelPointer {\n schema_version: 1;\n model_id: string | null;\n run_id: string | null;\n previous_model_id: string | null;\n activated_at: string;\n action: \"activate\" | \"rollback\";\n}\n\nexport interface ActiveModelState {\n pointer: ActiveModelPointer | null;\n model: LocalModelRecord | null;\n}\n\nfunction pointerPath(store: LocalStore): string {\n return join(store.root, \"active-model.json\");\n}\n\nfunction historyPath(store: LocalStore): string {\n return join(store.root, \"activation-history.jsonl\");\n}\n\nasync function readPointer(store: LocalStore): Promise<ActiveModelPointer | null> {\n if (!await hardenExistingLocalStore(store.root)) return null;\n try {\n const value = JSON.parse(await readFile(pointerPath(store), \"utf8\")) as ActiveModelPointer;\n if (\n value.schema_version !== 1\n || ![\"activate\", \"rollback\"].includes(value.action)\n || (value.model_id !== null && typeof value.model_id !== \"string\")\n || (value.run_id !== null && typeof value.run_id !== \"string\")\n || (value.previous_model_id !== null && typeof value.previous_model_id !== \"string\")\n ) {\n throw new Error(\"Active model pointer has an invalid shape.\");\n }\n return value;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nasync function writePrivatePointer(path: string, pointer: ActiveModelPointer): Promise<void> {\n const temporary = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`;\n await writeFile(temporary, `${JSON.stringify(pointer, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporary, path);\n await chmod(path, 0o600);\n}\n\nasync function appendPrivateHistory(path: string, pointer: ActiveModelPointer): Promise<void> {\n await appendFile(path, `${JSON.stringify(pointer)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await chmod(path, 0o600);\n}\n\nasync function assertModelCanActivate(\n store: LocalStore,\n modelId: string,\n): Promise<LocalModelRecord> {\n const model = await store.getModel(modelId);\n const run = await store.getRun(model.run_id);\n if (run.status !== \"completed\") {\n throw new Error(`Model ${model.id} belongs to run ${run.id}, which is not completed.`);\n }\n const report = runReportSchema.parse(\n JSON.parse(await readFile(join(model.artifact_dir, \"run-report.json\"), \"utf8\")),\n );\n if (!report.general_regression) {\n throw new Error(`Model ${model.id} has no general regression evaluation.`);\n }\n if (!report.general_regression.passed) {\n throw new Error(\n `Model ${model.id} failed general regression: `\n + (report.general_regression.failures.join(\" \") || \"regression budget exceeded\"),\n );\n }\n return model;\n}\n\nasync function publishPointer(\n store: LocalStore,\n pointer: ActiveModelPointer,\n): Promise<ActiveModelPointer> {\n await store.ensure();\n await writePrivatePointer(pointerPath(store), pointer);\n await appendPrivateHistory(historyPath(store), pointer);\n return pointer;\n}\n\nexport async function getActiveModel(store: LocalStore): Promise<ActiveModelState> {\n const pointer = await readPointer(store);\n if (!pointer?.model_id) return { pointer, model: null };\n return { pointer, model: await store.getModel(pointer.model_id) };\n}\n\nexport async function activateModel(\n store: LocalStore,\n modelId: string,\n): Promise<ActiveModelPointer> {\n const [model, current] = await Promise.all([\n assertModelCanActivate(store, modelId),\n readPointer(store),\n ]);\n if (current?.model_id === model.id) return current;\n return publishPointer(store, {\n schema_version: 1,\n model_id: model.id,\n run_id: model.run_id,\n previous_model_id: current?.model_id ?? null,\n activated_at: new Date().toISOString(),\n action: \"activate\",\n });\n}\n\nexport async function rollbackActiveModel(store: LocalStore): Promise<ActiveModelPointer> {\n const current = await readPointer(store);\n if (!current) throw new Error(\"No active-model history exists to roll back.\");\n const targetId = current.previous_model_id;\n const target = targetId ? await assertModelCanActivate(store, targetId) : null;\n return publishPointer(store, {\n schema_version: 1,\n model_id: target?.id ?? null,\n run_id: target?.run_id ?? null,\n previous_model_id: current.model_id,\n activated_at: new Date().toISOString(),\n action: \"rollback\",\n });\n}\n"],"mappings":"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","names":["readFileSync","createHash","readFile","join","resolve","fileURLToPath","result","readFileSync","spawn","resolve","join","join","join","resolve","spawn","join","readFileSync","writeFile","join","join","writeFile","readFileSync","resolve","join","readFile","createHash","fileURLToPath"]}
1
+ {"version":3,"sources":["../src/local-runtime/index.ts","../src/local-runtime/compare.ts","../src/local-runtime/doctor.ts","../src/local-runtime/model-server.ts","../src/local-runtime/serving-runtime.ts","../src/local-runtime/active-model.ts"],"sourcesContent":["import { pipelineForRunInput } from \"../pipeline.js\";\nimport { resolveProjectConfig } from \"./project-workflow.js\";\nimport { readFileSync, realpathSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { cwd } from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport { compareRuns } from \"./compare.js\";\nimport { assertArtifactManifest } from \"./artifacts.js\";\nimport { fineTuneRunRequestSchema, isFoundationSpecFile, localBehaviorSpecFileSchema, localRunnerConfigSchema, type FineTuneRunRequest, type LocalRunnerConfig, type SpecSnapshot } from \"./contracts.js\";\nimport { buildSystemMessage } from \"./dataset.js\";\nimport {\n fingerprintLocalBaseModel,\n runLocalFineTune,\n runLocalPipeline,\n type LocalPipeline,\n validateLocalFineTuneInput,\n} from \"./orchestrator.js\";\nimport { runDoctor } from \"./doctor.js\";\nimport { assessHardware } from \"./hardware.js\";\nimport { assertUsableModelArtifact, defaultBaseModelRevision } from \"./model-registry.js\";\nimport {\n buildFoundationModelServerLaunch,\n buildLocalBaseModelServerLaunch,\n buildLocalModelServerLaunch,\n serveLocalModel,\n type LocalModelServerLaunch,\n} from \"./model-server.js\";\nimport { prefetchBaseModel } from \"./prefetch.js\";\nimport { createLocalStore, type LocalModelRecord, type LocalStore } from \"./store.js\";\nimport {\n DEFAULT_LOCAL_SPEC_PATH,\n assertFoundationSpecReady,\n assertLocalRunInputReady,\n initLocalSpecFile,\n loadLocalRunInput,\n type LocalRunInput,\n} from \"./local-project.js\";\nimport { sanitizeLogLine, type LocalRunProgressEvent, type LocalRunReporter } from \"./run-reporter.js\";\nimport { activateModel, getActiveModel, rollbackActiveModel } from \"./active-model.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\n\nexport * from \"./compare.js\";\nexport * from \"./contracts.js\";\nexport * from \"./dataset.js\";\nexport * from \"./model-server.js\";\nexport * from \"./orchestrator.js\";\nexport * from \"./local-project.js\";\nexport * from \"./prefetch.js\";\nexport * from \"./run-reporter.js\";\nexport * from \"./store.js\";\nexport * from \"./general-regression.js\";\nexport * from \"./active-model.js\";\n\nexport interface LocalRunnerInfo {\n name: \"tuned-tensor-local\";\n status: \"local\";\n description: string;\n version: string;\n}\n\nfunction packageVersion(): string {\n try {\n const packageJson = JSON.parse(\n readFileSync(resolve(localRuntimePackageRoot(import.meta.url), \"package.json\"), \"utf8\"),\n ) as { version?: unknown };\n return typeof packageJson.version === \"string\" ? packageJson.version : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport const TT_LOCAL_VERSION = packageVersion();\n\nexport function getLocalRunnerInfo(): LocalRunnerInfo {\n return {\n name: \"tuned-tensor-local\",\n status: \"local\",\n description: \"Local CUDA LoRA fine-tuning with held-out base-versus-tuned evaluation.\",\n version: TT_LOCAL_VERSION,\n };\n}\n\nfunction readOption(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name);\n if (index !== -1) return argv[index + 1];\n const inline = argv.find((value) => value.startsWith(`${name}=`));\n return inline?.slice(name.length + 1);\n}\n\nfunction hasFlag(argv: string[], name: string): boolean {\n return argv.includes(name);\n}\n\nfunction printHelp(): void {\n console.log(`Usage: tt <command> [options]\n\nCommands:\n info Show package and runner information\n init [--name \"My Local Model\"] [--model Qwen/Qwen3.5-2B] [--output tunedtensor.json] [--profile spark] [--force]\n doctor [tunedtensor.json] [--config local-runner.json]\n hardware [--config local-runner.json] [--quick]\n validate [tunedtensor.json] [--config local-runner.json]\n run [tunedtensor.json] [--config local-runner.json] [--dry-run] [--verbose] [--quiet]\n serve <model-id|active|base|foundation> [--config local-runner.json] [--host 127.0.0.1] [--port 8000]\n runs list|get|events|report|compare [args] [--config local-runner.json]\n models list|get|verify|prefetch|verify-base|active|activate|rollback|serve [args] [--config local-runner.json]\n\nGlobal options:\n -h, --help Show help\n -V, --version Show the installed version\n\ntunedtensor.json owns behavior, evaluation, runtime overrides and optional pipeline.\nProject artifacts and state default to .tuned-tensor/artifacts and .tuned-tensor/store.\nTT_LOCAL_HOME overrides the default store. --config is a legacy migration option.`);\n}\n\ninterface CliOptionDefinition {\n name: string;\n value?: string;\n description: string;\n}\n\ninterface CliCommandDefinition {\n usage: string;\n description: string;\n options: readonly CliOptionDefinition[];\n minPositionals?: number;\n maxPositionals?: number;\n missingPositionalsMessage?: string;\n}\n\ninterface CliCommandGroup {\n description: string;\n defaultSubcommand?: string;\n subcommands: Record<string, CliCommandDefinition>;\n}\n\ninterface ParsedCli {\n command: string;\n subcommand?: string;\n positionals: string[];\n help: \"top\" | \"command\" | \"group\";\n definition?: CliCommandDefinition;\n}\n\nconst CONFIG_OPTION = { name: \"--config\", value: \"path\", description: \"Legacy runner config (prefer runtime/evaluation in tunedtensor.json)\" } as const;\nconst VERBOSE_OPTION = { name: \"--verbose\", description: \"Stream subprocess output\" } as const;\nconst QUIET_OPTION = { name: \"--quiet\", description: \"Suppress progress output on stderr\" } as const;\nconst MODEL_SERVE_OPTIONS = [\n CONFIG_OPTION,\n { name: \"--checkpoint\", value: \"path\", description: \"Foundation model directory (target: foundation)\" },\n { name: \"--tokenizer\", value: \"path\", description: \"Foundation tokenizer.json (target: foundation)\" },\n { name: \"--host\", value: \"host\", description: \"Bind host (localhost by default)\" },\n { name: \"--port\", value: \"port\", description: \"Bind port\" },\n { name: \"--device\", value: \"device\", description: \"cuda (pinned vLLM runtime)\" },\n { name: \"--max-tokens\", value: \"count\", description: \"Default response token limit\" },\n { name: \"--temperature\", value: \"number\", description: \"Default sampling temperature\" },\n { name: \"--top-p\", value: \"number\", description: \"Default nucleus sampling threshold\" },\n { name: \"--max-concurrent-requests\", value: \"count\", description: \"Maximum sequences in an upstream generation batch\" },\n { name: \"--context-length\", value: \"count\", description: \"Total context token budget (foundation: checkpoint limit; otherwise 16384)\" },\n { name: \"--gpu-memory-utilization\", value: \"fraction\", description: \"vLLM GPU memory budget fraction (default 0.8)\" },\n { name: \"--spec\", value: \"path\", description: \"Behavior spec whose instructions are enforced\" },\n { name: \"--no-spec-prompt\", description: \"Do not enforce the stored behavior-spec prompt\" },\n { name: \"--allow-remote\", description: \"Allow a non-loopback bind\" },\n { name: \"--api-key-env\", value: \"name\", description: \"Environment variable containing a bearer token\" },\n { name: \"--print-command\", description: \"Validate and print the launch plan without starting\" },\n { name: \"--print-client-config\", value: \"client\", description: \"Print Pi models.json; does not start serving\" },\n] as const satisfies readonly CliOptionDefinition[];\n\nconst COMMAND_DEFINITIONS: Record<string, CliCommandDefinition> = {\n info: {\n usage: \"tt info\",\n description: \"Show the installed TT local runtime version and runner status.\",\n options: [],\n maxPositionals: 0,\n },\n init: {\n usage: \"tt init [options]\",\n description: \"Create a local tunedtensor.json behavior spec.\",\n options: [\n { name: \"--name\", value: \"name\", description: \"Behavior spec name\" },\n { name: \"--engine\", value: \"engine\", description: \"adapter (default) or foundation\" },\n { name: \"--model\", value: \"model\", description: \"Base model ID\" },\n { name: \"--output\", value: \"path\", description: \"Output spec path\" },\n { name: \"--profile\", value: \"profile\", description: \"Compatibility host profile (spark); creates only tunedtensor.json\" },\n { name: \"--config\", value: \"path\", description: \"Deprecated; put runtime/evaluation in tunedtensor.json\" },\n { name: \"--force\", description: \"Overwrite an existing output file\" },\n ],\n maxPositionals: 0,\n },\n doctor: {\n usage: \"tt doctor [tunedtensor.json] [--config path]\",\n description: \"Check the host and optional run input before starting work.\",\n options: [CONFIG_OPTION],\n maxPositionals: 1,\n },\n hardware: {\n usage: \"tt hardware [--config path] [--quick]\",\n description: \"Inventory this host and report what TT can train, fine-tune, or infer.\",\n options: [\n CONFIG_OPTION,\n { name: \"--quick\", description: \"Skip the bundled torch/uv runtime probe\" },\n ],\n maxPositionals: 0,\n },\n validate: {\n usage: \"tt validate [tunedtensor.json] [options]\",\n description: \"Validate a local behavior spec without executing it.\",\n options: [CONFIG_OPTION],\n maxPositionals: 1,\n },\n run: {\n usage: \"tt run [tunedtensor.json] [options]\",\n description: \"Run the baseline, fine-tuning, tuned evaluation, and report workflow.\",\n options: [\n CONFIG_OPTION,\n { name: \"--dry-run\", description: \"Write representative artifacts without GPU work\" },\n VERBOSE_OPTION,\n QUIET_OPTION,\n ],\n maxPositionals: 1,\n },\n serve: {\n usage: \"tt serve <model-id|active|base|foundation> [options]\",\n description: \"Serve an adapter, pretrained base, or foundation checkpoint with vLLM.\",\n options: MODEL_SERVE_OPTIONS,\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"serve requires <model-id>\",\n },\n};\n\nconst COMMAND_GROUPS: Record<string, CliCommandGroup> = {\n runs: {\n description: \"Inspect locally stored runs.\",\n defaultSubcommand: \"list\",\n subcommands: {\n list: { usage: \"tt runs list [--config path]\", description: \"List local runs.\", options: [CONFIG_OPTION], maxPositionals: 0 },\n get: { usage: \"tt runs get <run-id> [--config path]\", description: \"Get a local run.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs get requires <run-id>\" },\n events: { usage: \"tt runs events <run-id> [--config path]\", description: \"List run events.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs events requires <run-id>\" },\n report: { usage: \"tt runs report <run-id> [--config path]\", description: \"Show the baseline-vs-tuned report, including deltas and regressions.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs report requires <run-id>\" },\n compare: { usage: \"tt runs compare <run-id-a> <run-id-b> [--config path]\", description: \"Compare two run reports.\", options: [CONFIG_OPTION], minPositionals: 2, maxPositionals: 2, missingPositionalsMessage: \"runs compare requires <run-id-a> <run-id-b>\" },\n },\n },\n models: {\n description: \"Inspect, verify, prefetch, or serve local models.\",\n defaultSubcommand: \"list\",\n subcommands: {\n list: { usage: \"tt models list [--config path]\", description: \"List local models.\", options: [CONFIG_OPTION], maxPositionals: 0 },\n get: { usage: \"tt models get <model-id> [--config path]\", description: \"Get a local model.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"models get requires <model-id>\" },\n verify: {\n usage: \"tt models verify <model-id-or-artifact-path> [--config path]\",\n description: \"Verify a stored model or manifested artifact path.\",\n options: [CONFIG_OPTION],\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models verify requires <model-id-or-artifact-path>\",\n },\n prefetch: {\n usage: \"tt models prefetch [tunedtensor.json] [options]\",\n description: \"Download the configured base model before a run.\",\n options: [CONFIG_OPTION, VERBOSE_OPTION, QUIET_OPTION],\n maxPositionals: 1,\n },\n \"verify-base\": {\n usage: \"tt models verify-base [tunedtensor.json] [options]\",\n description: \"Verify that the configured base-model snapshot is complete and locally available.\",\n options: [CONFIG_OPTION, VERBOSE_OPTION, QUIET_OPTION],\n maxPositionals: 1,\n },\n active: {\n usage: \"tt models active [--config path]\",\n description: \"Show the active adapter, or the protected base when none is active.\",\n options: [CONFIG_OPTION],\n maxPositionals: 0,\n },\n activate: {\n usage: \"tt models activate <model-id> [--config path]\",\n description: \"Activate a verified model whose general regression gate passed.\",\n options: [CONFIG_OPTION],\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models activate requires <model-id>\",\n },\n rollback: {\n usage: \"tt models rollback [--config path]\",\n description: \"Restore the previously active adapter or protected base.\",\n options: [CONFIG_OPTION],\n maxPositionals: 0,\n },\n serve: {\n usage: \"tt models serve <model-id|active|base|foundation> [options]\",\n description: \"Alias for `tt serve`.\",\n options: MODEL_SERVE_OPTIONS,\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models serve requires <model-id>\",\n },\n },\n },\n};\n\nfunction hasHelpFlag(argv: string[]): boolean {\n return argv.includes(\"--help\") || argv.includes(\"-h\");\n}\n\nfunction printCommandHelp(definition: CliCommandDefinition): void {\n console.log(`Usage: ${definition.usage}\\n\\n${definition.description}`);\n if (definition.options.length > 0) {\n console.log(\"\\nOptions:\");\n for (const option of definition.options) {\n const label = option.value ? `${option.name} <${option.value}>` : option.name;\n console.log(` ${label.padEnd(34)} ${option.description}`);\n }\n }\n console.log(\" -h, --help Show help\");\n}\n\nfunction printGroupHelp(command: string, group: CliCommandGroup): void {\n console.log(`Usage: tt ${command} <command> [options]\\n\\n${group.description}\\n\\nCommands:`);\n for (const [name, definition] of Object.entries(group.subcommands)) {\n console.log(` ${name.padEnd(16)} ${definition.description}`);\n }\n console.log(\"\\nRun `tt \" + command + \" <command> --help` for command-specific help.\");\n}\n\nfunction parseCommandArguments(tokens: string[], definition: CliCommandDefinition): string[] {\n const options = new Map(definition.options.map((option) => [option.name, option]));\n const seen = new Set<string>();\n const positionals: string[] = [];\n let optionsEnded = false;\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index]!;\n if (!optionsEnded && token === \"--\") {\n optionsEnded = true;\n continue;\n }\n if (!optionsEnded && token.startsWith(\"-\")) {\n const equalsIndex = token.indexOf(\"=\");\n const name = equalsIndex === -1 ? token : token.slice(0, equalsIndex);\n const inlineValue = equalsIndex === -1 ? undefined : token.slice(equalsIndex + 1);\n const option = options.get(name);\n if (!option) throw new Error(`Unknown option: ${name}`);\n if (seen.has(name)) throw new Error(`Option ${name} may only be specified once.`);\n seen.add(name);\n if (option.value) {\n if (inlineValue !== undefined) {\n if (!inlineValue) throw new Error(`Option ${name} requires a value.`);\n continue;\n }\n const value = tokens[index + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`Option ${name} requires a value.`);\n }\n index += 1;\n } else if (inlineValue !== undefined) {\n throw new Error(`Option ${name} does not accept a value.`);\n }\n continue;\n }\n positionals.push(token);\n }\n\n if (positionals.length < (definition.minPositionals ?? 0)) {\n throw new Error(definition.missingPositionalsMessage ?? `Missing required argument. Usage: ${definition.usage}`);\n }\n if (definition.maxPositionals !== undefined && positionals.length > definition.maxPositionals) {\n throw new Error(`Too many arguments. Usage: ${definition.usage}`);\n }\n return positionals;\n}\n\nfunction parseCli(argv: string[]): ParsedCli {\n const command = argv[2] ?? \"info\";\n if (command === \"--help\" || command === \"-h\") {\n return { command: \"info\", positionals: [], help: \"top\" };\n }\n if (command === \"--version\" || command === \"-V\") {\n if (argv.length > 3) throw new Error(`${command} does not accept arguments.`);\n return { command, positionals: [], help: \"command\" };\n }\n if (command.startsWith(\"-\")) throw new Error(`Unknown option: ${command}`);\n\n const definition = COMMAND_DEFINITIONS[command];\n if (definition) {\n if (hasHelpFlag(argv.slice(3))) {\n return { command, positionals: [], help: \"command\", definition };\n }\n return {\n command,\n positionals: parseCommandArguments(argv.slice(3), definition),\n help: \"top\",\n definition,\n };\n }\n\n const group = COMMAND_GROUPS[command];\n if (!group) throw new Error(`Unknown command: ${command}`);\n if (argv[3] === \"--help\" || argv[3] === \"-h\") {\n return { command, positionals: [], help: \"group\" };\n }\n\n const candidate = argv[3];\n let subcommand: string;\n let tokenStart: number;\n if (candidate && !candidate.startsWith(\"-\")) {\n subcommand = candidate;\n tokenStart = 4;\n } else if (group.defaultSubcommand) {\n subcommand = group.defaultSubcommand;\n tokenStart = 3;\n } else {\n throw new Error(`${command} requires a subcommand. Run 'tt ${command} --help'.`);\n }\n const subcommandDefinition = group.subcommands[subcommand];\n if (!subcommandDefinition) throw new Error(`Unknown ${command} command: ${subcommand}`);\n if (hasHelpFlag(argv.slice(tokenStart))) {\n return { command, subcommand, positionals: [], help: \"command\", definition: subcommandDefinition };\n }\n return {\n command,\n subcommand,\n positionals: parseCommandArguments(argv.slice(tokenStart), subcommandDefinition),\n help: \"top\",\n definition: subcommandDefinition,\n };\n}\n\nfunction readNumberOption(argv: string[], name: string): number | undefined {\n const value = readOption(argv, name);\n return value ? Number(value) : undefined;\n}\n\ninterface LocalConfigSelection {\n config: LocalRunnerConfig;\n path?: string;\n}\n\nasync function configSelectionFromArgv(argv: string[], adjacentTo?: string, input?: LocalRunInput): Promise<LocalConfigSelection> {\n const specPath = adjacentTo ?? readOption(argv, \"--spec\") ?? resolve(cwd(), DEFAULT_LOCAL_SPEC_PATH);\n const resolved = await resolveProjectConfig(specPath, readOption(argv, \"--config\"), (message) => console.error(message), input);\n return { config: resolved.config, ...(resolved.legacyConfigPath ? { path: resolved.legacyConfigPath } : {}) };\n}\n\nasync function configFromArgv(argv: string[], adjacentTo?: string): Promise<LocalRunnerConfig> {\n return (await configSelectionFromArgv(argv, adjacentTo)).config;\n}\n\nasync function loadCliBehaviorSpec(inputPath: string, runId?: string) {\n const input = await loadLocalRunInput(inputPath, {\n ...(runId ? { runId } : {}),\n });\n if (input.kind === \"foundation-spec\") {\n throw new Error(\n `This spec uses engine \"foundation\". Use \\`tt pipeline run --spec ${input.path}\\`; the legacy adapter runner cannot execute foundation specs.`,\n );\n }\n if (input.kind !== \"spec\") {\n throw new Error(`TT expects a tunedtensor.json behavior spec, not a full run request: ${input.path}`);\n }\n return input;\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\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\nfunction formatEvent(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 createConsoleReporter(options: { verbose: boolean; quiet: boolean }): LocalRunReporter | undefined {\n if (options.quiet) return undefined;\n let lastLogLine = \"\";\n return {\n verbose: options.verbose,\n onEvent(event) {\n process.stderr.write(`${formatEvent(event)}\\n`);\n },\n onLog(log) {\n const line = sanitizeLogLine(`[tt] ${log.stage}${log.stream ? ` ${log.stream}` : \"\"}: ${log.message}`);\n // tqdm redraws the same progress line several times per step; collapse\n // consecutive duplicates so --verbose output stays readable.\n if (line === lastLogLine) return;\n lastLogLine = line;\n process.stderr.write(`${line}\\n`);\n },\n };\n}\n\nasync function verifyStoredModel(model: LocalModelRecord, config: LocalRunnerConfig): Promise<{\n manifest_path: string;\n integrity: Awaited<ReturnType<typeof assertArtifactManifest>>;\n artifact: Awaited<ReturnType<typeof assertUsableModelArtifact>>;\n contract: unknown;\n}> {\n const manifestPath = join(model.artifact_dir, \"artifact-manifest.json\");\n const integrity = await assertArtifactManifest(manifestPath, {\n requiredPaths: [\"stage-metadata.json\", \"training-report.json\"],\n scopeToRequired: true,\n verifyModel: true,\n });\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as {\n model?: {\n artifact_root?: unknown;\n base_model?: unknown;\n format?: unknown;\n framework?: unknown;\n servable?: unknown;\n base_model_artifact_uri?: unknown;\n base_model_fingerprint?: unknown;\n };\n };\n if (!manifest.model) {\n throw new Error(`Artifact manifest does not contain a model contract: ${manifestPath}`);\n }\n const artifact = await assertUsableModelArtifact(model.artifact_uri);\n if (\n typeof manifest.model.base_model_artifact_uri === \"string\"\n && typeof manifest.model.base_model_fingerprint === \"string\"\n ) {\n const actualBaseFingerprint = await fingerprintLocalBaseModel(\n manifest.model.base_model_artifact_uri,\n typeof manifest.model.base_model === \"string\"\n ? manifest.model.base_model\n : undefined,\n config.paths.modelCache,\n );\n if (actualBaseFingerprint !== manifest.model.base_model_fingerprint) {\n throw new Error(\"Recorded local base-model content no longer matches the model artifact contract.\");\n }\n }\n if (\n typeof manifest.model.artifact_root !== \"string\"\n || resolve(manifest.model.artifact_root) !== resolve(artifact.path)\n ) {\n throw new Error(\"Stored model record does not match the artifact covered by its manifest.\");\n }\n if (manifest.model.base_model !== model.base_model) {\n throw new Error(\"Stored model base model does not match its artifact manifest.\");\n }\n return {\n manifest_path: manifestPath,\n integrity,\n artifact,\n contract: manifest.model,\n };\n}\n\nasync function verifyActivationEvidence(model: LocalModelRecord): Promise<void> {\n const generalBaseline = join(model.artifact_dir, \"general-baseline-eval.json\");\n const generalCandidate = join(model.artifact_dir, \"general-candidate-eval.json\");\n const [hasBaseline, hasCandidate] = await Promise.all([\n stat(generalBaseline).then((metadata) => metadata.isFile(), () => false),\n stat(generalCandidate).then((metadata) => metadata.isFile(), () => false),\n ]);\n if (!hasBaseline || !hasCandidate) {\n throw new Error(\n \"This model cannot be activated because the run did not include a general-regression suite. \"\n + \"Add evaluation.generalRegression to tunedtensor.json with a held-out dataset, re-run training, then activate. \"\n + \"Until then, serve the adapter with `tt serve local-<run-id>`.\",\n );\n }\n await assertArtifactManifest(join(model.artifact_dir, \"artifact-manifest.json\"), {\n requiredPaths: [\n \"run-report.json\",\n \"general-baseline-eval.json\",\n \"general-candidate-eval.json\",\n ],\n scopeToRequired: true,\n verifyModel: true,\n });\n}\n\nasync function verifyModelArtifactPath(input: string, config: LocalRunnerConfig): Promise<{\n manifest_path: string;\n integrity: Awaited<ReturnType<typeof assertArtifactManifest>>;\n artifact: Awaited<ReturnType<typeof assertUsableModelArtifact>>;\n contract: unknown;\n}> {\n const inputPath = resolve(input);\n let manifestPath: string | undefined;\n let artifactUri = inputPath;\n if (basename(inputPath) === \"artifact-manifest.json\") {\n manifestPath = inputPath;\n const raw = JSON.parse(await readFile(inputPath, \"utf8\")) as { model?: { artifact_root?: unknown } };\n if (typeof raw.model?.artifact_root !== \"string\") {\n throw new Error(`Artifact manifest does not contain a model contract: ${inputPath}`);\n }\n artifactUri = raw.model.artifact_root;\n } else {\n const metadata = await stat(inputPath).catch(() => null);\n if (!metadata) throw new Error(`Model not found and artifact path does not exist: ${input}`);\n let current = metadata.isDirectory() ? inputPath : dirname(inputPath);\n for (let depth = 0; depth < 8; depth += 1) {\n const candidate = join(current, \"artifact-manifest.json\");\n const raw = await readFile(candidate, \"utf8\").catch(() => null);\n if (raw) {\n const parsed = JSON.parse(raw) as { model?: { artifact_root?: unknown } };\n if (\n typeof parsed.model?.artifact_root === \"string\"\n && resolve(parsed.model.artifact_root) === resolve(inputPath)\n ) {\n manifestPath = candidate;\n break;\n }\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n }\n if (!manifestPath) {\n throw new Error(`No artifact manifest covering model path ${inputPath} was found in its parent run directory.`);\n }\n const integrity = await assertArtifactManifest(manifestPath, {\n requiredPaths: [\"stage-metadata.json\", \"training-report.json\"],\n scopeToRequired: true,\n verifyModel: true,\n });\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as { model?: Record<string, unknown> };\n if (!manifest.model) throw new Error(`Artifact manifest does not contain a model contract: ${manifestPath}`);\n const artifact = await assertUsableModelArtifact(artifactUri);\n if (\n typeof manifest.model.base_model_artifact_uri === \"string\"\n && typeof manifest.model.base_model_fingerprint === \"string\"\n ) {\n const actualBaseFingerprint = await fingerprintLocalBaseModel(\n manifest.model.base_model_artifact_uri,\n typeof manifest.model.base_model === \"string\"\n ? manifest.model.base_model\n : undefined,\n config.paths.modelCache,\n );\n if (actualBaseFingerprint !== manifest.model.base_model_fingerprint) {\n throw new Error(\"Recorded local base-model content no longer matches the model artifact contract.\");\n }\n }\n if (\n typeof manifest.model.artifact_root !== \"string\"\n || resolve(manifest.model.artifact_root) !== resolve(artifact.path)\n ) {\n throw new Error(\"Model path does not match the artifact covered by its manifest.\");\n }\n return { manifest_path: manifestPath, integrity, artifact, contract: manifest.model };\n}\n\nasync function modelSystemPrompt(args: {\n argv: string[];\n model: LocalModelRecord;\n store: LocalStore;\n}): Promise<string | undefined> {\n const specPath = readOption(args.argv, \"--spec\");\n if (specPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n if (hasFlag(args.argv, \"--no-spec-prompt\")) return undefined;\n\n let spec: SpecSnapshot;\n if (specPath) {\n const input = JSON.parse(await readFile(resolve(specPath), \"utf8\")) as unknown;\n const local = localBehaviorSpecFileSchema.safeParse(input);\n if (!local.success) {\n throw new Error(`--spec must contain a tunedtensor.json behavior spec: ${resolve(specPath)}`);\n }\n if (isFoundationSpecFile(local.data)) {\n throw new Error(\"Foundation specs have no Hugging Face base model. Use `tt serve foundation --checkpoint <model-dir> --tokenizer <tokenizer.json>`.\");\n }\n spec = local.data;\n } else {\n const runRequestPath = join(args.store.paths.runsDir, args.model.run_id, \"request.json\");\n let persistedRequest: FineTuneRunRequest | null = null;\n try {\n persistedRequest = fineTuneRunRequestSchema.parse(JSON.parse(await readFile(runRequestPath, \"utf8\")));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n spec = persistedRequest?.spec_snapshot\n ?? (await args.store.getSpec(args.model.behavior_spec_id)).spec;\n }\n if (spec.base_model !== args.model.base_model) {\n throw new Error(\n `Behavior spec base model ${spec.base_model} does not match stored model base ${args.model.base_model}.`,\n );\n }\n const prompt = buildSystemMessage(spec);\n const metadata = JSON.parse(\n await readFile(join(args.model.artifact_dir, \"stage-metadata.json\"), \"utf8\"),\n ) as { system_prompt_sha256?: unknown };\n const promptHash = createHash(\"sha256\").update(prompt).digest(\"hex\");\n if (metadata.system_prompt_sha256 !== promptHash) {\n throw new Error(\n \"Behavior spec instructions do not match the prompt fingerprint used for this trained model. \"\n + \"Pass the original --spec, or use --no-spec-prompt only when this change is intentional.\",\n );\n }\n return prompt;\n}\n\nfunction modelServeDevice(argv: string[]): \"cpu\" | \"cuda\" | undefined {\n const value = readOption(argv, \"--device\");\n if (value === undefined || value === \"cpu\" || value === \"cuda\") {\n return value;\n }\n throw new Error(`--device must be cuda or cpu; got: ${value}`);\n}\n\nfunction printServeClientConfig(argv: string[], launch: LocalModelServerLaunch): boolean {\n const client = readOption(argv, \"--print-client-config\");\n if (client === undefined) return false;\n if (client !== \"pi\") throw new Error(\"--print-client-config must be pi.\");\n if (hasFlag(argv, \"--print-command\")) throw new Error(\"Use only one of --print-command or --print-client-config.\");\n const apiKeyEnv = readOption(argv, \"--api-key-env\");\n if (apiKeyEnv && !/^[A-Za-z_][A-Za-z0-9_]*$/.test(apiKeyEnv)) {\n throw new Error(\"--api-key-env must be a plain environment variable name for Pi config.\");\n }\n const url = new URL(launch.url);\n if (url.hostname === \"0.0.0.0\") url.hostname = \"127.0.0.1\";\n if (url.hostname === \"[::]\") url.hostname = \"[::1]\";\n url.pathname = \"/v1\";\n printJson({\n providers: {\n \"tt-local\": {\n baseUrl: url.toString(),\n api: \"openai-completions\",\n apiKey: apiKeyEnv ? \"${\" + apiKeyEnv + \"}\" : \"tt-local\",\n compat: {\n supportsStore: false,\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n supportsUsageInStreaming: true,\n maxTokensField: \"max_tokens\",\n },\n models: [...new Set(launch.env.TT_FOUNDATION_CHECKPOINT ? [launch.modelName] : [launch.modelName, `base:${launch.env.TT_BASE_MODEL}`])].map((id) => ({\n id,\n name: id,\n // This endpoint exports ordinary text/tool calls, not reasoning-effort controls.\n reasoning: false,\n input: [\"text\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: Number(launch.env.TT_CONTEXT_LENGTH),\n maxTokens: Number(launch.env.TT_MAX_TOKENS),\n })),\n },\n },\n });\n return true;\n}\n\nasync function serveStoredModelFromCli(args: {\n argv: string[];\n modelId: string;\n config: LocalRunnerConfig;\n}): Promise<void> {\n const store = createLocalStore(args.config.storeRoot);\n const model = await store.getModel(args.modelId);\n const verified = await verifyStoredModel(model, args.config);\n const launch = buildLocalModelServerLaunch({\n model,\n config: args.config,\n options: {\n host: readOption(args.argv, \"--host\"),\n port: readNumberOption(args.argv, \"--port\"),\n device: modelServeDevice(args.argv),\n maxTokens: readNumberOption(args.argv, \"--max-tokens\"),\n temperature: readNumberOption(args.argv, \"--temperature\"),\n topP: readNumberOption(args.argv, \"--top-p\"),\n maxConcurrentRequests: readNumberOption(args.argv, \"--max-concurrent-requests\"),\n contextLength: readNumberOption(args.argv, \"--context-length\"),\n gpuMemoryUtilization: readNumberOption(args.argv, \"--gpu-memory-utilization\"),\n systemPrompt: await modelSystemPrompt({ argv: args.argv, model, store }),\n allowRemote: hasFlag(args.argv, \"--allow-remote\"),\n apiKeyEnv: readOption(args.argv, \"--api-key-env\"),\n baseModelRevision: (() => {\n const contract = verified.contract as { base_model_revision?: unknown };\n return typeof contract.base_model_revision === \"string\" ? contract.base_model_revision : undefined;\n })(),\n baseModelArtifactUri: (() => {\n const contract = verified.contract as { base_model_artifact_uri?: unknown };\n return typeof contract.base_model_artifact_uri === \"string\" ? contract.base_model_artifact_uri : undefined;\n })(),\n },\n });\n if (printServeClientConfig(args.argv, launch)) return;\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: model.id,\n url: launch.url,\n command: launch.displayCommand,\n artifact_path: launch.artifactPath,\n manifest_path: verified.manifest_path,\n integrity: verified.integrity,\n });\n return;\n }\n process.stderr.write(`[tt] verified ${verified.integrity.checked} artifact file(s)\\n`);\n await serveLocalModel(launch);\n}\n\nfunction serveOptionsFromArgv(argv: string[]) {\n return {\n host: readOption(argv, \"--host\"),\n port: readNumberOption(argv, \"--port\"),\n device: modelServeDevice(argv),\n maxTokens: readNumberOption(argv, \"--max-tokens\"),\n temperature: readNumberOption(argv, \"--temperature\"),\n topP: readNumberOption(argv, \"--top-p\"),\n maxConcurrentRequests: readNumberOption(argv, \"--max-concurrent-requests\"),\n contextLength: readNumberOption(argv, \"--context-length\"),\n gpuMemoryUtilization: readNumberOption(argv, \"--gpu-memory-utilization\"),\n allowRemote: hasFlag(argv, \"--allow-remote\"),\n apiKeyEnv: readOption(argv, \"--api-key-env\"),\n };\n}\n\nasync function serveBaseModelFromCli(args: {\n argv: string[];\n config: LocalRunnerConfig;\n}): Promise<void> {\n const explicitSpecPath = readOption(args.argv, \"--spec\");\n if (explicitSpecPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n const defaultSpecPath = resolve(DEFAULT_LOCAL_SPEC_PATH);\n const specPath = explicitSpecPath\n ? resolve(explicitSpecPath)\n : (await stat(defaultSpecPath).catch(() => null))?.isFile()\n ? defaultSpecPath\n : undefined;\n const spec = specPath\n ? localBehaviorSpecFileSchema.parse(\n JSON.parse(await readFile(specPath, \"utf8\")) as unknown,\n )\n : undefined;\n if (spec && isFoundationSpecFile(spec)) {\n throw new Error(\"Foundation specs have no Hugging Face base model. Use `tt serve foundation --checkpoint <model-dir> --tokenizer <tokenizer.json>`.\");\n }\n let baseModel = spec?.base_model;\n if (!baseModel) {\n const store = createLocalStore(args.config.storeRoot);\n const active = await getActiveModel(store);\n const referenceModel = active.model\n ?? (active.pointer?.previous_model_id\n ? await store.getModel(active.pointer.previous_model_id)\n : null);\n baseModel = referenceModel?.base_model;\n }\n if (!baseModel) {\n throw new Error(\n \"Cannot identify the protected base model. Pass --spec <tunedtensor.json> \"\n + \"or activate a model first.\",\n );\n }\n const launch = buildLocalBaseModelServerLaunch({\n baseModel,\n config: args.config,\n options: {\n ...serveOptionsFromArgv(args.argv),\n systemPrompt: explicitSpecPath && !hasFlag(args.argv, \"--no-spec-prompt\")\n ? buildSystemMessage(spec!)\n : undefined,\n baseModelRevision: spec?.hyperparameters?.base_model_revision ?? defaultBaseModelRevision(baseModel),\n },\n });\n if (printServeClientConfig(args.argv, launch)) return;\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: null,\n base_model: baseModel,\n url: launch.url,\n command: launch.displayCommand,\n });\n return;\n }\n await serveLocalModel(launch);\n}\n\nasync function serveModelTargetFromCli(args: {\n argv: string[];\n target: string;\n config: LocalRunnerConfig;\n}): Promise<void> {\n if (args.target === \"foundation\") {\n const checkpoint = readOption(args.argv, \"--checkpoint\");\n const tokenizer = readOption(args.argv, \"--tokenizer\");\n if (!checkpoint || !tokenizer) {\n throw new Error(\"Foundation serving requires --checkpoint <model-dir> and --tokenizer <tokenizer.json>.\");\n }\n const specPath = readOption(args.argv, \"--spec\");\n if (specPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n const spec = specPath\n ? localBehaviorSpecFileSchema.parse(JSON.parse(await readFile(resolve(specPath), \"utf8\")))\n : undefined;\n if (spec && !isFoundationSpecFile(spec)) throw new Error(\"Foundation serving requires a foundation spec.\");\n const launch = buildFoundationModelServerLaunch({\n checkpoint,\n tokenizer,\n config: args.config,\n options: {\n ...serveOptionsFromArgv(args.argv),\n systemPrompt: spec ? buildSystemMessage(spec) : undefined,\n },\n });\n if (printServeClientConfig(args.argv, launch)) return;\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: launch.modelName,\n url: launch.url,\n command: launch.displayCommand,\n checkpoint: launch.env.TT_FOUNDATION_CHECKPOINT,\n tokenizer: launch.env.TT_FOUNDATION_TOKENIZER,\n });\n return;\n }\n await serveLocalModel(launch);\n return;\n }\n if (readOption(args.argv, \"--checkpoint\") || readOption(args.argv, \"--tokenizer\")) {\n throw new Error(\"--checkpoint and --tokenizer require the foundation target.\");\n }\n if (args.target === \"base\") {\n return serveBaseModelFromCli(args);\n }\n if (args.target === \"active\") {\n const store = createLocalStore(args.config.storeRoot);\n const active = await getActiveModel(store);\n if (!active.model) {\n throw new Error(\n \"No adapter is active. `tt serve active` would serve the protected base model. \"\n + \"Activate a verified adapter first with `tt models activate <model-id>`, or pass `tt serve base` explicitly.\",\n );\n }\n return serveStoredModelFromCli({\n argv: args.argv,\n modelId: active.model.id,\n config: args.config,\n });\n }\n return serveStoredModelFromCli({\n argv: args.argv,\n modelId: args.target,\n config: args.config,\n });\n}\n\nasync function main(argv: string[]): Promise<void> {\n const cli = parseCli(argv);\n const command = cli.command;\n\n if (command === \"--version\" || command === \"-V\") {\n console.log(TT_LOCAL_VERSION);\n return;\n }\n if (cli.help === \"top\" && (argv[2] === \"--help\" || argv[2] === \"-h\")) {\n printHelp();\n return;\n }\n if (cli.help === \"group\") {\n printGroupHelp(command, COMMAND_GROUPS[command]!);\n return;\n }\n if (cli.help === \"command\" && cli.definition) {\n printCommandHelp(cli.definition);\n return;\n }\n\n if (command === \"info\") {\n const info = getLocalRunnerInfo();\n console.log(`${info.name}: ${info.description}`);\n console.log(`Version: ${info.version}`);\n console.log(`Status: ${info.status}`);\n return;\n }\n\n if (command === \"doctor\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const hasDefaultSpec = cli.positionals[0]\n ? true\n : Boolean((await stat(inputPath).catch(() => null))?.isFile());\n let request: FineTuneRunRequest | undefined;\n let foundationSpec: import(\"./contracts.js\").LocalFoundationSpecFile | undefined;\n if (hasDefaultSpec) {\n const input = await loadLocalRunInput(inputPath);\n if (input.kind === \"foundation-spec\") {\n foundationSpec = input.spec;\n } else if (input.kind === \"spec\") {\n request = input.request;\n } else {\n throw new Error(`TT expects a tunedtensor.json behavior spec, not a full run request: ${input.path}`);\n }\n }\n const checks = await runDoctor(configSelection.config, request, foundationSpec);\n const ok = checks.every((check) => check.ok);\n printJson({\n ok,\n config_path: configSelection.path ?? null,\n checks,\n });\n try {\n await assessHardware({\n config: configSelection.config,\n quick: true,\n });\n } catch {\n // Status/context still work without a snapshot; doctor remains the gate.\n // A quick write fills an empty cache and will not replace a fresh full probe.\n }\n if (!ok) process.exitCode = 1;\n return;\n }\n\n if (command === \"hardware\") {\n const configSelection = await configSelectionFromArgv(argv);\n const report = await assessHardware({\n config: configSelection.config,\n quick: hasFlag(argv, \"--quick\"),\n });\n printJson({\n ...report,\n config_path: configSelection.path ?? null,\n });\n return;\n }\n\n if (command === \"init\") {\n const outputPath = resolve(readOption(argv, \"--output\") ?? DEFAULT_LOCAL_SPEC_PATH);\n const profile = readOption(argv, \"--profile\");\n if (profile !== undefined && profile !== \"spark\") {\n throw new Error(`--profile must be spark, got: ${profile}`);\n }\n const engine = readOption(argv, \"--engine\") ?? \"adapter\";\n if (engine !== \"adapter\" && engine !== \"foundation\") {\n throw new Error(`--engine must be adapter or foundation, got: ${engine}`);\n }\n if (engine === \"foundation\" && readOption(argv, \"--model\")) {\n throw new Error(\"Foundation specs do not take --model; they train a tokenizer and GPT from scratch.\");\n }\n if (readOption(argv, \"--config\")) throw new Error(\"tt init uses one tunedtensor.json; put overrides in runtime/evaluation instead of --config.\");\n const spec = await initLocalSpecFile({\n outputPath,\n name: readOption(argv, \"--name\") ?? (engine === \"foundation\" ? \"Foundation chat model\" : \"Local Tuned Tensor Spec\"),\n engine,\n baseModel: engine === \"foundation\" ? undefined : (readOption(argv, \"--model\") ?? \"Qwen/Qwen3.5-2B\"),\n force: hasFlag(argv, \"--force\"),\n });\n // Spark uses the same defaults; initialization creates only the core spec.\n const configPath = undefined;\n printJson({\n ok: true,\n path: outputPath,\n id: spec.id,\n name: spec.name,\n engine: spec.engine ?? \"adapter\",\n base_model: isFoundationSpecFile(spec) ? null : spec.base_model,\n config_path: configPath ?? null,\n });\n return;\n }\n\n if (command === \"validate\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const loaded = await loadLocalRunInput(inputPath);\n if (loaded.kind === \"foundation-spec\") {\n assertFoundationSpecReady(loaded.spec);\n printJson({\n ok: true,\n input_path: loaded.path,\n engine: \"foundation\",\n pipeline: \"tt pipeline run --spec\",\n });\n return;\n }\n if (loaded.kind !== \"spec\") {\n throw new Error(`TT expects a tunedtensor.json behavior spec, not a full run request: ${loaded.path}`);\n }\n const input = loaded;\n assertLocalRunInputReady(input.request);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const validated = await validateLocalFineTuneInput({\n request: input.request,\n config: configSelection.config,\n });\n const request = validated.request;\n const config = validated.config;\n printJson({\n ok: true,\n input_path: input.path,\n config_path: configSelection.path ?? null,\n behavior_spec_id: request.behavior_spec_id,\n base_model: request.spec_snapshot.base_model,\n dataset_format: request.dataset_prebuilt?.format ?? null,\n artifact_root: config.artifactRoot,\n store_root: config.storeRoot,\n dry_run: config.dryRun,\n });\n return;\n }\n\n if (command === \"run\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const input = await loadCliBehaviorSpec(inputPath);\n const configSelection = await configSelectionFromArgv(argv, inputPath, input);\n const configInput = configSelection.config;\n const config = localRunnerConfigSchema.parse({\n ...configInput,\n dryRun: hasFlag(argv, \"--dry-run\") ? true : configInput.dryRun,\n });\n assertLocalRunInputReady(input.request);\n const validated = await validateLocalFineTuneInput({\n request: input.request,\n config,\n });\n let request = validated.request;\n const reporter = createConsoleReporter({\n verbose: hasFlag(argv, \"--verbose\"),\n quiet: hasFlag(argv, \"--quiet\"),\n });\n if (\n !config.dryRun\n && !config.paths.baseModel\n && !request.hyperparameters.base_model_revision\n ) {\n const prefetch = await prefetchBaseModel({\n request,\n config,\n reporter,\n });\n if (!prefetch.snapshot_revision) {\n throw new Error(\"Base-model prefetch did not return an immutable snapshot revision.\");\n }\n request = fineTuneRunRequestSchema.parse({\n ...request,\n hyperparameters: {\n ...request.hyperparameters,\n base_model_revision: prefetch.snapshot_revision,\n },\n });\n }\n if (input.spec.pipeline) {\n const result = await runLocalPipeline({ request, config, reporter, pipeline: pipelineForRunInput(input) as LocalPipeline, projectSpec: input.spec });\n printJson(result);\n return;\n }\n const result = await runLocalFineTune({ request, config, reporter });\n printJson({\n status: result.report.status,\n run_id: result.report.run_id,\n behavior_spec_id: result.report.behavior_spec_id,\n report_path: result.reportPath,\n artifact_dir: result.artifactDir,\n ...(!config.dryRun ? {\n model_id: `local-${result.report.run_id}`,\n fine_tuned_model_id: result.report.fine_tuned_model_id,\n } : {}),\n training_log: result.report.training.log_uri,\n baseline_eval: result.report.artifact_uris.baseline_eval,\n candidate_eval: result.report.artifact_uris.candidate_eval,\n comparison: result.report.comparison,\n general_regression: result.report.general_regression,\n });\n return;\n }\n\n if (command === \"serve\") {\n const config = await configFromArgv(argv);\n await serveModelTargetFromCli({\n argv,\n target: cli.positionals[0]!,\n config,\n });\n return;\n }\n\n if (command === \"runs\") {\n const subcommand = cli.subcommand!;\n const config = await configFromArgv(argv);\n const store = createLocalStore(config.storeRoot);\n if (subcommand === \"list\") return printJson(await store.listRuns());\n if (subcommand === \"get\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs get requires <run-id>\");\n return printJson(await store.getRun(id));\n }\n if (subcommand === \"events\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs events requires <run-id>\");\n return printJson(await store.getRunEvents(id));\n }\n if (subcommand === \"report\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs report requires <run-id>\");\n return printJson(await store.getRunReport(id));\n }\n if (subcommand === \"compare\") {\n const idA = cli.positionals[0];\n const idB = cli.positionals[1];\n if (!idA || !idB) throw new Error(\"runs compare requires <run-id-a> <run-id-b>\");\n const [reportA, reportB] = await Promise.all([\n store.getRunReport(idA),\n store.getRunReport(idB),\n ]);\n return printJson(compareRuns(reportA, reportB));\n }\n throw new Error(`Unknown runs command: ${subcommand}`);\n }\n\n if (command === \"models\") {\n const subcommand = cli.subcommand!;\n const modelInputPath = subcommand === \"prefetch\" || subcommand === \"verify-base\"\n ? resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH)\n : undefined;\n const config = await configFromArgv(argv, modelInputPath);\n const store = createLocalStore(config.storeRoot);\n if (subcommand === \"list\") return printJson(await store.listModels());\n if (subcommand === \"get\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models get requires <model-id>\");\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model, config);\n return printJson({\n ok: true,\n model,\n ...verified,\n });\n }\n if (subcommand === \"verify\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models verify requires <model-id-or-artifact-path>\");\n if (await stat(resolve(id)).then(() => true, () => false)) {\n return printJson({ ok: true, model: null, ...await verifyModelArtifactPath(id, config) });\n }\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model, config);\n return printJson({ ok: true, model, ...verified });\n }\n if (subcommand === \"active\") {\n const active = await getActiveModel(store);\n return printJson({\n active: active.model?.id ?? \"base\",\n pointer: active.pointer,\n model: active.model,\n });\n }\n if (subcommand === \"activate\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models activate requires <model-id>\");\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model, config);\n await verifyActivationEvidence(model);\n const pointer = await activateModel(store, model.id);\n return printJson({\n active: pointer.model_id,\n pointer,\n manifest_path: verified.manifest_path,\n integrity: verified.integrity,\n });\n }\n if (subcommand === \"rollback\") {\n const current = await getActiveModel(store);\n if (current.pointer?.previous_model_id) {\n const previous = await store.getModel(current.pointer.previous_model_id);\n await verifyStoredModel(previous, config);\n await verifyActivationEvidence(previous);\n }\n const pointer = await rollbackActiveModel(store);\n return printJson({ active: pointer.model_id ?? \"base\", pointer });\n }\n if (subcommand === \"prefetch\" || subcommand === \"verify-base\") {\n const input = await loadCliBehaviorSpec(modelInputPath!);\n const report = await prefetchBaseModel({\n request: input.request,\n config,\n localOnly: subcommand === \"verify-base\",\n reporter: createConsoleReporter({\n verbose: hasFlag(argv, \"--verbose\"),\n quiet: hasFlag(argv, \"--quiet\"),\n }),\n });\n return printJson({\n ...report,\n input_path: input.path,\n });\n }\n if (subcommand === \"serve\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models serve requires <model-id>\");\n await serveModelTargetFromCli({ argv, target: id, config });\n return;\n }\n throw new Error(`Unknown models command: ${subcommand}`);\n }\n\n console.error(`Unknown command: ${command}`);\n process.exitCode = 1;\n}\n\nfunction isCliEntrypoint(): boolean {\n if (!process.argv[1]) return false;\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1]);\n}\n\nif (isCliEntrypoint()) {\n main(process.argv).catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n });\n}\n","import type { EvalExampleResult, EvalReport, RunReport } from \"./contracts.js\";\nimport { tokenF1 } from \"./evaluation.js\";\n\ninterface SubsetSide {\n baseline_avg_score: number | null;\n candidate_avg_score: number | null;\n candidate_avg_token_f1: number | null;\n}\n\ninterface RunSummary {\n run_id: string;\n started_at: string;\n base_model: string;\n training_example_count: number | null;\n eval_examples_used: number;\n baseline_avg_score: number;\n candidate_avg_score: number;\n candidate_avg_token_f1: number | null;\n avg_score_delta: number;\n}\n\nexport interface RunComparison {\n run_a: RunSummary;\n run_b: RunSummary;\n shared: {\n examples: number;\n run_a: SubsetSide;\n run_b: SubsetSide;\n candidate_avg_score_delta: number | null;\n candidate_avg_token_f1_delta: number | null;\n };\n b_only: SubsetSide & { examples: number };\n notes: string[];\n}\n\nfunction byPrompt(report: EvalReport): Map<string, EvalExampleResult> {\n return new Map(report.results.map((result) => [result.prompt, result]));\n}\n\nfunction avg(values: number[]): number | null {\n return values.length > 0 ? values.reduce((sum, value) => sum + value, 0) / values.length : null;\n}\n\nfunction summarizeRun(report: RunReport): RunSummary {\n return {\n run_id: report.run_id,\n started_at: report.run_metadata.started_at,\n base_model: report.base_model,\n training_example_count: report.run_metadata.training_example_count,\n eval_examples_used: report.run_metadata.eval_examples_used,\n baseline_avg_score: report.baseline.avg_score,\n candidate_avg_score: report.candidate.avg_score,\n candidate_avg_token_f1: report.candidate.avg_token_f1 ?? null,\n avg_score_delta: report.comparison.avg_score_delta,\n };\n}\n\nfunction subsetSide(\n prompts: string[],\n baseline: Map<string, EvalExampleResult>,\n candidate: Map<string, EvalExampleResult>,\n): SubsetSide {\n const candidateResults = prompts\n .map((prompt) => candidate.get(prompt))\n .filter((result): result is EvalExampleResult => Boolean(result));\n return {\n baseline_avg_score: avg(prompts\n .map((prompt) => baseline.get(prompt)?.score)\n .filter((score): score is number => typeof score === \"number\")),\n candidate_avg_score: avg(candidateResults.map((result) => result.score)),\n candidate_avg_token_f1: avg(candidateResults.map((result) => tokenF1(result.expected, result.actual))),\n };\n}\n\n/**\n * Aligns two run reports on their shared eval prompts so recipe changes can\n * be compared apples-to-apples even when the eval set grew or shifted between\n * runs. Headline avg_score_delta values are not comparable across different\n * eval subsets; the shared subset is.\n */\nexport function compareRuns(a: RunReport, b: RunReport): RunComparison {\n const aCandidate = byPrompt(a.candidate);\n const bCandidate = byPrompt(b.candidate);\n const aBaseline = byPrompt(a.baseline);\n const bBaseline = byPrompt(b.baseline);\n const sharedPrompts = [...bCandidate.keys()].filter((prompt) => aCandidate.has(prompt));\n const bOnlyPrompts = [...bCandidate.keys()].filter((prompt) => !aCandidate.has(prompt));\n\n const sharedA = subsetSide(sharedPrompts, aBaseline, aCandidate);\n const sharedB = subsetSide(sharedPrompts, bBaseline, bCandidate);\n const runA = summarizeRun(a);\n const runB = summarizeRun(b);\n\n const notes: string[] = [];\n if (bOnlyPrompts.length > 0) {\n notes.push(\n `run_b evaluated ${bOnlyPrompts.length} example(s) run_a never saw; headline avg_score_delta values `\n + \"are not directly comparable across the two runs. Use the shared subset for recipe comparisons.\",\n );\n }\n return {\n run_a: runA,\n run_b: runB,\n shared: {\n examples: sharedPrompts.length,\n run_a: sharedA,\n run_b: sharedB,\n candidate_avg_score_delta:\n sharedA.candidate_avg_score !== null && sharedB.candidate_avg_score !== null\n ? sharedB.candidate_avg_score - sharedA.candidate_avg_score\n : null,\n candidate_avg_token_f1_delta:\n sharedA.candidate_avg_token_f1 !== null && sharedB.candidate_avg_token_f1 !== null\n ? sharedB.candidate_avg_token_f1 - sharedA.candidate_avg_token_f1\n : null,\n },\n b_only: { examples: bOnlyPrompts.length, ...subsetSide(bOnlyPrompts, bBaseline, bCandidate) },\n notes,\n };\n}\n","import { checkAwsGpu, runGpuProcess } from \"./gpu-executor.js\";\nimport { constants } from \"node:fs\";\nimport { access, lstat, mkdir, statfs, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport type { FineTuneRunRequest, LocalFoundationSpecFile, LocalRunnerConfig } from \"./contracts.js\";\nimport { foundationPlaceholderIssues, localPathsOverlap } from \"./local-project.js\";\nimport {\n minimalMachineLearningEnvironment,\n withHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport {\n buildBundledPythonCommand,\n buildFoundationPythonCommand,\n withBundledPythonEnvironment,\n withFoundationPythonEnvironment,\n} from \"./process-runner.js\";\nimport { resolveTrainingModel } from \"./model-registry.js\";\nimport { defaultLocalHome } from \"./store.js\";\nimport { verifyLocalBaseModel } from \"./prefetch.js\";\n\nexport interface DoctorCheck {\n name: string;\n ok: boolean;\n message: string;\n details?: Record<string, unknown>;\n}\n\ninterface 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\nfunction nvidiaSmiSummary(stdout: string): string {\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n const queried = lines.find((line) =>\n !/^(?:mon|tue|wed|thu|fri|sat|sun)\\b/i.test(line)\n && !line.startsWith(\"+---\")\n && !line.startsWith(\"|\")\n );\n if (queried) return queried;\n return firstLine(stdout) || \"nvidia-smi reported a GPU\";\n}\n\nfunction commandText(command: string, args: string[]): string {\n return [command, ...args].map((part) => /\\s/.test(part) ? JSON.stringify(part) : part).join(\" \");\n}\n\nasync function writableDirectoryCheck(name: string, path: string): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n const probePath = join(resolvedPath, `.tt-local-write-probe-${process.pid}-${Date.now()}`);\n try {\n await mkdir(resolvedPath, { recursive: true });\n await access(resolvedPath, constants.R_OK | constants.W_OK);\n await writeFile(probePath, \"ok\\n\", { flag: \"wx\" });\n await unlink(probePath);\n const fs = await statfs(resolvedPath);\n const freeBytes = Number(fs.bavail) * Number(fs.bsize);\n return {\n name,\n ok: true,\n message: `${resolvedPath} is writable (${Math.round(freeBytes / (1024 ** 3) * 10) / 10} GiB available)`,\n details: { path: resolvedPath, free_bytes: freeBytes },\n };\n } catch (error) {\n await unlink(probePath).catch(() => undefined);\n return {\n name,\n ok: false,\n message: `${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`,\n details: { path: resolvedPath },\n };\n }\n}\n\ninterface PythonProbePlan {\n name: \"python-runtime\";\n command: string;\n args: string[];\n env: NodeJS.ProcessEnv;\n}\n\nfunction foundationPythonProbePlan(requireBf16: boolean): PythonProbePlan {\n const source = [\n \"import json\",\n \"import numpy, safetensors, tokenizers, torch\",\n \"assert torch.cuda.is_available(), 'TT Foundation training requires CUDA but torch.cuda.is_available() is false'\",\n ...(requireBf16\n ? [\"assert torch.cuda.is_bf16_supported(), 'TT Foundation BF16 training was requested but this device does not support BF16'\"]\n : []),\n \"props = torch.cuda.get_device_properties(0)\",\n \"print(json.dumps({'python_ok': True, 'torch': torch.__version__, 'cuda_available': True, 'bf16': torch.cuda.is_bf16_supported(), 'cuda_device': torch.cuda.get_device_name(0), 'compute_capability': list(torch.cuda.get_device_capability(0)), 'total_memory_bytes': props.total_memory}))\",\n ].join(\"; \");\n const entrypoint = buildFoundationPythonCommand(\"-c\", [source]);\n return {\n name: \"python-runtime\",\n command: entrypoint.command,\n args: entrypoint.commandArgs,\n env: withFoundationPythonEnvironment(process.env),\n };\n}\n\n/** Preparation still runs on the laptop when GPU work is remote. */\nfunction localPreparationProbePlan(foundation: boolean): PythonProbePlan {\n const source = [\n \"import json\",\n foundation ? \"import numpy, safetensors, tokenizers, torch\" : \"import torch, transformers, peft, huggingface_hub\",\n \"assert torch.ones(1, device='cpu').item() == 1\",\n \"print(json.dumps({'python_ok': True, 'device': 'cpu', 'purpose': 'local preparation and CPU work'}))\",\n ].join(\"; \");\n const entrypoint = foundation\n ? buildFoundationPythonCommand(\"-c\", [source])\n : buildBundledPythonCommand(\"-c\", [source]);\n const env = minimalMachineLearningEnvironment(process.env);\n return {\n name: \"python-runtime\",\n command: entrypoint.command,\n args: entrypoint.commandArgs,\n env: foundation ? withFoundationPythonEnvironment(env) : withBundledPythonEnvironment(env),\n };\n}\n\nfunction pythonProbeSource(device: LocalRunnerConfig[\"evaluation\"][\"inference\"][\"device\"]): string {\n return [\n \"import json\",\n \"import torch, transformers, peft, huggingface_hub\",\n `requested = ${JSON.stringify(device)}`,\n \"assert torch.cuda.is_available(), 'TT local training requires CUDA but torch.cuda.is_available() is false'\",\n \"props = torch.cuda.get_device_properties(0)\",\n \"print(json.dumps({'python_ok': True, 'torch': torch.__version__, 'transformers': transformers.__version__, 'cuda_available': True, 'cuda_device': torch.cuda.get_device_name(0), 'compute_capability': list(torch.cuda.get_device_capability(0)), 'total_memory_bytes': props.total_memory, 'evaluation_device': requested}))\",\n ].join(\"; \");\n}\n\nfunction pythonProbePlan(args: {\n device: LocalRunnerConfig[\"evaluation\"][\"inference\"][\"device\"];\n modelCache?: string;\n}): PythonProbePlan {\n const entrypoint = buildBundledPythonCommand(\n \"-c\",\n [pythonProbeSource(args.device)],\n );\n const env = withBundledPythonEnvironment(\n withHuggingFaceCacheEnvironment(\n minimalMachineLearningEnvironment(process.env),\n args.modelCache,\n ),\n );\n return {\n name: \"python-runtime\",\n command: entrypoint.command,\n args: entrypoint.commandArgs,\n env,\n };\n}\n\n/** Build the exact bundled uv environment that every real stage uses. */\nexport function buildDoctorPythonPlans(config: LocalRunnerConfig): PythonProbePlan[] {\n if (config.dryRun) return [];\n return [\n pythonProbePlan({\n device: config.evaluation.inference.device,\n modelCache: config.paths.modelCache,\n }),\n ];\n}\n\nfunction foundationPlaceholderCheck(spec: LocalFoundationSpecFile): DoctorCheck {\n const issues = foundationPlaceholderIssues(spec);\n return {\n name: \"spec-content\",\n ok: issues.length === 0,\n message: issues.length > 0\n ? \"The spec still contains generated placeholder content; edit it before training.\"\n : `${spec.examples.length} spec example(s); foundation engine`,\n };\n}\n\nasync function foundationCorpusCheck(name: string, path: string): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n try {\n const info = await lstat(resolvedPath);\n const supported = info.isFile() || info.isDirectory();\n return {\n name,\n ok: supported && !info.isSymbolicLink(),\n message: supported && !info.isSymbolicLink()\n ? `${resolvedPath} is available for streaming.`\n : `${resolvedPath} must be a regular file or directory, not a symbolic link.`,\n details: { path: resolvedPath },\n };\n } catch (error) {\n return {\n name,\n ok: false,\n message: `${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`,\n details: { path: resolvedPath },\n };\n }\n}\n\nfunction placeholderSpecCheck(request: FineTuneRunRequest): DoctorCheck {\n const placeholder = request.spec_snapshot.examples.some((example) =>\n /replace this with/i.test(example.input) || /replace this with/i.test(example.output)\n ) || /describe the behavior this local model should learn/i.test(request.spec_snapshot.system_prompt);\n return {\n name: \"spec-content\",\n ok: !placeholder,\n message: placeholder\n ? \"The spec still contains generated placeholder content; edit it before training.\"\n : `${request.spec_snapshot.examples.length} spec example(s); base model ${request.spec_snapshot.base_model}`,\n };\n}\n\nasync function localBaseModelCheck(\n path: string,\n expectedModelId?: string,\n modelCache?: string,\n): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n try {\n const verified = await verifyLocalBaseModel(resolvedPath, expectedModelId, modelCache);\n return {\n name: \"local-base-model\",\n ok: true,\n message: `${resolvedPath} is a valid local Hugging Face snapshot directory.`,\n details: { path: resolvedPath, file_count: verified.fileCount, size_bytes: verified.sizeBytes },\n };\n } catch (error) {\n return {\n name: \"local-base-model\",\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n details: { path: resolvedPath },\n };\n }\n}\n\nexport async function runDoctor(\n config: LocalRunnerConfig,\n request?: FineTuneRunRequest,\n foundationSpec?: LocalFoundationSpecFile,\n): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n const nodeVersion = process.versions.node;\n const nodeMajor = Number(nodeVersion.split(\".\")[0]);\n checks.push({ name: \"node\", ok: nodeMajor >= 22, message: `Node ${nodeVersion}` });\n\n checks.push(await writableDirectoryCheck(\"artifact-root\", config.artifactRoot));\n checks.push(await writableDirectoryCheck(\"store-root\", config.storeRoot ?? defaultLocalHome()));\n checks.push(await writableDirectoryCheck(\n \"model-cache\",\n config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), \".cache\", \"huggingface\"),\n ));\n if (config.paths.baseModel) {\n checks.push(await localBaseModelCheck(\n config.paths.baseModel,\n request?.spec_snapshot.base_model,\n config.paths.modelCache,\n ));\n }\n\n if (foundationSpec) {\n checks.push(foundationPlaceholderCheck(foundationSpec));\n if (foundationSpec.foundation.corpus_path) {\n checks.push(await foundationCorpusCheck(\"pretraining-corpus\", foundationSpec.foundation.corpus_path));\n }\n if (foundationSpec.foundation.validation_path) {\n checks.push(await foundationCorpusCheck(\"validation-corpus\", foundationSpec.foundation.validation_path));\n }\n if (\n foundationSpec.foundation.corpus_path\n && foundationSpec.foundation.validation_path\n && localPathsOverlap(\n foundationSpec.foundation.corpus_path,\n foundationSpec.foundation.validation_path,\n )\n ) {\n checks.push({\n name: \"held-out-corpus\",\n ok: false,\n message: \"foundation.corpus_path and foundation.validation_path must be distinct.\",\n });\n }\n if (foundationSpec.foundation.checkpoint_backup_dir) {\n checks.push(await writableDirectoryCheck(\n \"checkpoint-backup\",\n foundationSpec.foundation.checkpoint_backup_dir,\n ));\n }\n } else if (request) {\n checks.push(placeholderSpecCheck(request));\n resolveTrainingModel(request.spec_snapshot.base_model);\n }\n const pythonPlans = config.dryRun ? [] : config.gpu\n ? [localPreparationProbePlan(Boolean(foundationSpec))]\n : foundationSpec\n ? [foundationPythonProbePlan(foundationSpec.foundation.bf16 !== false)]\n : buildDoctorPythonPlans(config);\n if (pythonPlans.length > 0) {\n const uvVersion = await runCommand(\"uv\", [\"--version\"]);\n checks.push({\n name: \"uv\",\n ok: uvVersion.code === 0,\n message: uvVersion.code === 0\n ? firstLine(uvVersion.stdout)\n : uvVersion.error ?? (firstLine(uvVersion.stderr) || \"uv is not available\"),\n });\n\n if (uvVersion.code === 0) {\n const uniquePlans = new Map<string, PythonProbePlan>();\n for (const plan of pythonPlans) {\n const key = JSON.stringify([plan.command, plan.args, plan.env]);\n if (!uniquePlans.has(key)) uniquePlans.set(key, plan);\n }\n for (const plan of uniquePlans.values()) {\n const result = await runCommand(plan.command, plan.args, {\n env: plan.env,\n timeoutMs: 1_800_000,\n });\n checks.push({\n name: plan.name,\n ok: result.code === 0,\n message: result.code === 0\n ? firstLine(result.stdout)\n : result.error ?? (firstLine(result.stderr) || `${plan.command} exited ${result.code}`),\n details: { command: commandText(plan.command, plan.args) },\n });\n }\n }\n } else {\n checks.push({\n name: \"python-runtime\",\n ok: true,\n message: config.dryRun\n ? \"Python dependency checks skipped because dryRun is enabled.\"\n : \"Python dependency checks were skipped.\",\n });\n }\n\n const device = config.evaluation.inference.device;\n if (config.gpu && !config.dryRun) {\n try {\n await checkAwsGpu(config.gpu);\n const plans = foundationSpec\n ? [foundationPythonProbePlan(foundationSpec.foundation.bf16 !== false)]\n : buildDoctorPythonPlans(config);\n for (const plan of plans) {\n const result = await runGpuProcess({ gpu: config.gpu, runtime: foundationSpec ? \"foundation\" : \"adapter\",\n files: [], command: plan.command, commandArgs: plan.args, env: plan.env,\n stage: \"gpu_check\", timeoutMs: 1_800_000 });\n if (result.exitCode !== 0) throw new Error(`Remote Python/CUDA check failed: ${result.stderr}`);\n }\n checks.push({ name: \"aws-gpu\", ok: true, message: `GPU execution on ${config.gpu.instanceId}; orchestration stays local.` });\n } catch (error) {\n checks.push({ name: \"aws-gpu\", ok: false, message: error instanceof Error ? error.message : String(error) });\n }\n } else if (!config.dryRun) {\n const queried = await runCommand(\"nvidia-smi\", [\n \"--query-gpu=name,driver_version\",\n \"--format=csv,noheader\",\n ]);\n const nvidiaSmi = queried.code === 0 ? queried : await runCommand(\"nvidia-smi\", []);\n checks.push({\n name: \"nvidia-smi\",\n ok: nvidiaSmi.code === 0,\n message: nvidiaSmi.code === 0\n ? nvidiaSmiSummary(nvidiaSmi.stdout)\n : nvidiaSmi.error ?? (firstLine(nvidiaSmi.stderr) || \"nvidia-smi not available\"),\n });\n } else {\n checks.push({\n name: \"nvidia-smi\",\n ok: true,\n message: config.dryRun\n ? \"GPU checks skipped because dryRun is enabled.\"\n : `nvidia-smi is not required for device=${device}.`,\n });\n }\n\n const trainingCommand = foundationSpec\n ? buildFoundationPythonCommand(\"pretrain.py\").displayCommand\n : buildBundledPythonCommand(\"train.py\").displayCommand;\n checks.push({\n name: \"effective-plan\",\n ok: true,\n message: \"Resolved the configured training and evaluation plan.\",\n details: {\n training_command: trainingCommand ?? null,\n evaluation_provider: foundationSpec ? \"foundation\" : \"transformers\",\n evaluation_device: device,\n artifact_root: resolve(config.artifactRoot),\n store_root: resolve(config.storeRoot ?? defaultLocalHome()),\n model_cache: resolve(config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), \".cache\", \"huggingface\")),\n base_model: request?.spec_snapshot.base_model ?? null,\n scoring_mode: foundationSpec ? \"bpb/chat\" : config.evaluation.scoring.mode,\n },\n });\n\n return checks;\n}\n","import { readFileSync, statSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { resolve, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { LocalRunnerConfig } from \"./contracts.js\";\nimport {\n minimalMachineLearningEnvironment,\n withOfflineHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport {\n defaultBaseModelRevision,\n resolveModelLoader,\n resolveRequestedBaseModelRevision,\n} from \"./model-registry.js\";\nimport {\n buildServingPythonCommand,\n withServingPythonEnvironment,\n} from \"./serving-runtime.js\";\nimport type { LocalModelRecord } from \"./store.js\";\nimport { verifyLocalBaseModel } from \"./prefetch.js\";\n\nexport interface LocalModelServeOptions {\n host?: string;\n port?: number;\n device?: \"cpu\" | \"cuda\";\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n systemPrompt?: string;\n allowRemote?: boolean;\n apiKeyEnv?: string;\n maxConcurrentRequests?: number;\n contextLength?: number;\n gpuMemoryUtilization?: number;\n baseModelRevision?: string;\n baseModelArtifactUri?: string;\n}\n\nexport interface LocalModelServerLaunch {\n command: string;\n commandArgs: string[];\n displayCommand: string[];\n env: NodeJS.ProcessEnv;\n url: string;\n modelName: string;\n artifactPath?: string;\n}\n\nfunction localArtifactPath(uri: string): string {\n if (uri.startsWith(\"file://\")) return fileURLToPath(uri);\n if (/^[a-z][a-z0-9+.-]*:/i.test(uri)) {\n throw new Error(`Local TT serving requires a local file artifact, got: ${uri}`);\n }\n return resolve(uri);\n}\n\nfunction boundedNumber(name: string, value: number, minimum: number, maximum: number, integer = false): number {\n if (!Number.isFinite(value) || value < minimum || value > maximum || (integer && !Number.isInteger(value))) {\n throw new Error(`${name} must be between ${minimum} and ${maximum}`);\n }\n return value;\n}\n\nfunction isLoopbackHost(host: string): boolean {\n return host === \"127.0.0.1\" || host === \"localhost\" || host === \"::1\" || host === \"[::1]\";\n}\n\nfunction httpHost(host: string): string {\n return host.includes(\":\") && !host.startsWith(\"[\") ? `[${host}]` : host;\n}\n\nfunction buildModelServerLaunch(args: {\n modelName: string;\n baseModel: string;\n artifactUri?: string;\n config: LocalRunnerConfig;\n foundation?: { checkpoint: string; tokenizer: string; contextLength: number };\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n const options = args.options ?? {};\n const device = options.device ?? args.config.evaluation.inference.device;\n if (device !== \"cuda\") throw new Error(\"The pinned vLLM serving runtime requires CUDA; CPU serving is not supported.\");\n const contextLength = boundedNumber(\n \"contextLength\", options.contextLength ?? args.foundation?.contextLength ?? 16384,\n args.foundation ? 1 : 512, 131072, true,\n );\n if (args.foundation && contextLength > args.foundation.contextLength) {\n throw new Error(\"Context length exceeds the foundation checkpoint sequence_length.\");\n }\n const gpuMemoryUtilization = boundedNumber(\"gpuMemoryUtilization\", options.gpuMemoryUtilization ?? 0.8, 0.05, 0.95);\n const host = options.host ?? \"127.0.0.1\";\n const remote = !isLoopbackHost(host);\n if (remote && !options.allowRemote) {\n throw new Error(\"Refusing a non-loopback model server bind without --allow-remote.\");\n }\n const apiKey = options.apiKeyEnv ? process.env[options.apiKeyEnv]?.trim() : undefined;\n if (options.apiKeyEnv && !apiKey) throw new Error(`${options.apiKeyEnv} is not set.`);\n if (remote && !apiKey) {\n throw new Error(\"Non-loopback serving requires --api-key-env with a populated environment variable.\");\n }\n const port = boundedNumber(\"port\", options.port ?? 8000, 1, 65_535, true);\n const maxTokens = boundedNumber(\"maxTokens\", options.maxTokens ?? Math.min(512, contextLength), 1, 8192, true);\n const temperature = boundedNumber(\"temperature\", options.temperature ?? 0, 0, 5);\n const topP = boundedNumber(\"topP\", options.topP ?? 1, 0, 1);\n const maxConcurrentRequests = boundedNumber(\n \"maxConcurrentRequests\",\n options.maxConcurrentRequests ?? 1,\n 1,\n 8,\n true,\n );\n const artifactPath = args.artifactUri\n ? localArtifactPath(args.artifactUri)\n : undefined;\n const recordedBaseModelPath = options.baseModelArtifactUri\n ? localArtifactPath(options.baseModelArtifactUri)\n : undefined;\n const configuredBaseModelPath = !args.foundation && args.config.paths.baseModel\n ? resolve(args.config.paths.baseModel)\n : undefined;\n if (\n recordedBaseModelPath\n && configuredBaseModelPath\n && resolve(recordedBaseModelPath) !== configuredBaseModelPath\n ) {\n throw new Error(\n `Configured paths.baseModel ${configuredBaseModelPath} does not match the base model recorded for this artifact: `\n + recordedBaseModelPath,\n );\n }\n const localBaseModelPath = recordedBaseModelPath ?? configuredBaseModelPath;\n const requestedBaseModelRevision = args.foundation ? undefined : resolveRequestedBaseModelRevision(\n args.baseModel,\n options.baseModelRevision,\n );\n const baseModelRevision = localBaseModelPath\n ? defaultBaseModelRevision(args.baseModel)\n : requestedBaseModelRevision;\n const entrypoint = buildServingPythonCommand();\n const env = withServingPythonEnvironment(\n withOfflineHuggingFaceCacheEnvironment({\n ...minimalMachineLearningEnvironment(process.env),\n ...(artifactPath ? { TT_MODEL_ARTIFACT: artifactPath } : {}),\n TT_BASE_MODEL: args.baseModel,\n ...(localBaseModelPath ? { TT_MODEL_SOURCE: localBaseModelPath } : {}),\n ...(baseModelRevision\n ? { TT_BASE_MODEL_REVISION: baseModelRevision }\n : {}),\n TT_MODEL_NAME: args.modelName,\n TT_CONTEXT_LENGTH: String(contextLength),\n TT_GPU_MEMORY_UTILIZATION: String(gpuMemoryUtilization),\n TT_MODEL_LOADER: args.foundation ? \"foundation\" : resolveModelLoader(args.baseModel),\n ...(args.foundation ? {\n TT_FOUNDATION_CHECKPOINT: args.foundation.checkpoint,\n TT_FOUNDATION_TOKENIZER: args.foundation.tokenizer,\n } : {}),\n TT_HOST: host,\n TT_PORT: String(port),\n TT_DEVICE: device,\n TT_MAX_TOKENS: String(maxTokens),\n TT_TEMPERATURE: String(temperature),\n TT_TOP_P: String(topP),\n TT_TRUST_REMOTE_CODE: \"false\",\n TT_MAX_CONCURRENT_REQUESTS: String(maxConcurrentRequests),\n ...(options.systemPrompt ? { TT_SYSTEM_PROMPT: options.systemPrompt } : {}),\n ...(apiKey ? { TT_API_KEY: apiKey } : {}),\n }, args.config.paths.modelCache),\n );\n return {\n command: entrypoint.command,\n commandArgs: entrypoint.commandArgs,\n displayCommand: entrypoint.displayCommand,\n env,\n url: `http://${httpHost(host)}:${port}`,\n modelName: args.modelName,\n artifactPath,\n };\n}\n\nexport function buildLocalModelServerLaunch(args: {\n model: LocalModelRecord;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n return buildModelServerLaunch({\n modelName: args.model.id,\n baseModel: args.model.base_model,\n artifactUri: args.model.artifact_uri,\n config: args.config,\n options: args.options,\n });\n}\n\nexport function buildLocalBaseModelServerLaunch(args: {\n baseModel: string;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n return buildModelServerLaunch({\n modelName: `base:${args.baseModel}`,\n baseModel: args.baseModel,\n config: args.config,\n options: args.options,\n });\n}\n\nexport async function verifyLocalModelServerLaunch(\n launch: LocalModelServerLaunch,\n): Promise<void> {\n const modelSource = launch.env.TT_MODEL_SOURCE;\n const expectedModelId = launch.env.TT_BASE_MODEL;\n if (modelSource && expectedModelId) {\n await verifyLocalBaseModel(modelSource, expectedModelId, launch.env.HF_HOME);\n }\n}\n\nexport async function serveLocalModel(launch: LocalModelServerLaunch): Promise<void> {\n if (process.platform !== \"linux\") throw new Error(\"Local vLLM serving requires Linux and an NVIDIA CUDA GPU.\");\n await verifyLocalModelServerLaunch(launch);\n await new Promise<void>((resolveServer, reject) => {\n const child = spawn(launch.command, launch.commandArgs, {\n env: launch.env,\n stdio: \"inherit\",\n detached: process.platform !== \"win32\",\n });\n let stopping = false;\n let forceKillTimer: NodeJS.Timeout | undefined;\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 // Fall through when the process group has already exited.\n }\n }\n child.kill(signal);\n };\n const stop = (signal: NodeJS.Signals) => {\n if (stopping) return;\n stopping = true;\n killProcessGroup(signal);\n forceKillTimer = setTimeout(() => killProcessGroup(\"SIGKILL\"), 5_000);\n forceKillTimer.unref();\n };\n const onSigint = () => stop(\"SIGINT\");\n const onSigterm = () => stop(\"SIGTERM\");\n const cleanup = () => {\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n };\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n child.once(\"error\", (error) => {\n cleanup();\n reject(error);\n });\n child.once(\"close\", (code, signal) => {\n cleanup();\n if (stopping || signal === \"SIGINT\" || signal === \"SIGTERM\") {\n resolveServer();\n } else if (code === 0) {\n resolveServer();\n } else {\n reject(new Error(`Local model server exited with code ${code ?? \"unknown\"}.`));\n }\n });\n });\n}\n\nexport function buildFoundationModelServerLaunch(args: {\n checkpoint: string;\n tokenizer: string;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n const checkpoint = resolve(args.checkpoint);\n const tokenizer = resolve(args.tokenizer);\n for (const path of [join(checkpoint, \"model.safetensors\"), tokenizer]) {\n if (!statSync(path).isFile()) throw new Error(`Expected foundation artifact file: ${path}`);\n }\n const metadata = JSON.parse(readFileSync(join(checkpoint, \"config.json\"), \"utf8\"));\n const contextLength = boundedNumber(\"sequence_length\", metadata.sequence_length, 1, 131072, true);\n return buildModelServerLaunch({\n modelName: \"foundation\", baseModel: \"foundation\", config: args.config, options: args.options,\n foundation: { checkpoint, tokenizer, contextLength },\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { pythonEnvironmentPath } from \"../paths.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\n\nconst root = localRuntimePackageRoot(import.meta.url);\nconst project = join(root, \"training/serving\");\nconst hash = createHash(\"sha256\");\nfor (const name of [\"pyproject.toml\", \"uv.lock\"]) hash.update(readFileSync(join(project, name)));\nexport const SERVING_PYTHON_ENVIRONMENT = pythonEnvironmentPath(\"uv-serving\", hash.digest(\"hex\").slice(0, 20));\n\nexport function buildServingPythonCommand() {\n const commandArgs = [\"run\", \"--frozen\", \"--quiet\", \"--project\", project,\n \"python\", join(root, \"training/adapter/src/serve.py\")];\n return { command: \"uv\", commandArgs, displayCommand: [\"uv\", ...commandArgs] };\n}\n\nexport function withServingPythonEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n return {\n ...env,\n UV_PROJECT_ENVIRONMENT: SERVING_PYTHON_ENVIRONMENT,\n VLLM_NO_USAGE_STATS: \"1\",\n DO_NOT_TRACK: \"1\",\n VLLM_ALLOW_RUNTIME_LORA_UPDATING: \"0\",\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { appendFile, chmod, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { runReportSchema } from \"./contracts.js\";\nimport { hardenExistingLocalStore, type LocalModelRecord, type LocalStore } from \"./store.js\";\n\nexport interface ActiveModelPointer {\n schema_version: 1;\n model_id: string | null;\n run_id: string | null;\n previous_model_id: string | null;\n activated_at: string;\n action: \"activate\" | \"rollback\";\n}\n\nexport interface ActiveModelState {\n pointer: ActiveModelPointer | null;\n model: LocalModelRecord | null;\n}\n\nfunction pointerPath(store: LocalStore): string {\n return join(store.root, \"active-model.json\");\n}\n\nfunction historyPath(store: LocalStore): string {\n return join(store.root, \"activation-history.jsonl\");\n}\n\nasync function readPointer(store: LocalStore): Promise<ActiveModelPointer | null> {\n if (!await hardenExistingLocalStore(store.root)) return null;\n try {\n const value = JSON.parse(await readFile(pointerPath(store), \"utf8\")) as ActiveModelPointer;\n if (\n value.schema_version !== 1\n || ![\"activate\", \"rollback\"].includes(value.action)\n || (value.model_id !== null && typeof value.model_id !== \"string\")\n || (value.run_id !== null && typeof value.run_id !== \"string\")\n || (value.previous_model_id !== null && typeof value.previous_model_id !== \"string\")\n ) {\n throw new Error(\"Active model pointer has an invalid shape.\");\n }\n return value;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nasync function writePrivatePointer(path: string, pointer: ActiveModelPointer): Promise<void> {\n const temporary = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`;\n await writeFile(temporary, `${JSON.stringify(pointer, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporary, path);\n await chmod(path, 0o600);\n}\n\nasync function appendPrivateHistory(path: string, pointer: ActiveModelPointer): Promise<void> {\n await appendFile(path, `${JSON.stringify(pointer)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await chmod(path, 0o600);\n}\n\nasync function assertModelCanActivate(\n store: LocalStore,\n modelId: string,\n): Promise<LocalModelRecord> {\n const model = await store.getModel(modelId);\n const run = await store.getRun(model.run_id);\n if (run.status !== \"completed\") {\n throw new Error(`Model ${model.id} belongs to run ${run.id}, which is not completed.`);\n }\n const report = runReportSchema.parse(\n JSON.parse(await readFile(join(model.artifact_dir, \"run-report.json\"), \"utf8\")),\n );\n if (!report.general_regression) {\n throw new Error(`Model ${model.id} has no general regression evaluation.`);\n }\n if (!report.general_regression.passed) {\n throw new Error(\n `Model ${model.id} failed general regression: `\n + (report.general_regression.failures.join(\" \") || \"regression budget exceeded\"),\n );\n }\n return model;\n}\n\nasync function publishPointer(\n store: LocalStore,\n pointer: ActiveModelPointer,\n): Promise<ActiveModelPointer> {\n await store.ensure();\n await writePrivatePointer(pointerPath(store), pointer);\n await appendPrivateHistory(historyPath(store), pointer);\n return pointer;\n}\n\nexport async function getActiveModel(store: LocalStore): Promise<ActiveModelState> {\n const pointer = await readPointer(store);\n if (!pointer?.model_id) return { pointer, model: null };\n return { pointer, model: await store.getModel(pointer.model_id) };\n}\n\nexport async function activateModel(\n store: LocalStore,\n modelId: string,\n): Promise<ActiveModelPointer> {\n const [model, current] = await Promise.all([\n assertModelCanActivate(store, modelId),\n readPointer(store),\n ]);\n if (current?.model_id === model.id) return current;\n return publishPointer(store, {\n schema_version: 1,\n model_id: model.id,\n run_id: model.run_id,\n previous_model_id: current?.model_id ?? null,\n activated_at: new Date().toISOString(),\n action: \"activate\",\n });\n}\n\nexport async function rollbackActiveModel(store: LocalStore): Promise<ActiveModelPointer> {\n const current = await readPointer(store);\n if (!current) throw new Error(\"No active-model history exists to roll back.\");\n const targetId = current.previous_model_id;\n const target = targetId ? await assertModelCanActivate(store, targetId) : null;\n return publishPointer(store, {\n schema_version: 1,\n model_id: target?.id ?? null,\n run_id: target?.run_id ?? null,\n previous_model_id: current.model_id,\n activated_at: new Date().toISOString(),\n action: \"rollback\",\n });\n}\n"],"mappings":"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","names":["readFileSync","createHash","readFile","join","resolve","fileURLToPath","result","readFileSync","spawn","resolve","join","join","join","resolve","spawn","join","readFileSync","writeFile","join","join","writeFile","readFileSync","resolve","join","readFile","createHash","result","fileURLToPath"]}