ollama-agent-router 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/cli.ts
3
+ // src/cli-program.ts
4
4
  import { readFile as readFile4 } from "fs/promises";
5
+ import { readFileSync } from "fs";
5
6
  import { Command } from "commander";
6
7
 
7
8
  // src/config.ts
@@ -1636,69 +1637,69 @@ function escapeMetricLabel(label) {
1636
1637
  return label.replaceAll("\\", "\\\\").replaceAll('"', '\\"');
1637
1638
  }
1638
1639
 
1639
- // src/cli.ts
1640
- var program = new Command();
1641
- program.name("ollama-agent-router").alias("oar").description("Intelligent HTTP/CLI router for Ollama").option("-c, --config <path>", "config file path").option("-u, --url <url>", "router URL for client commands", "http://127.0.0.1:11435").option("--base-path <path>", "router API base path for client commands", "/");
1642
- program.command("serve").description("start the router server").option("-c, --config <path>", "config file path").action(async (options) => {
1643
- const { config, path } = await loadConfig(options.config ?? program.opts().config);
1644
- const jobs = new InMemoryJobStore(config.jobs);
1645
- const ollama = new HttpOllamaClient(config.ollama);
1646
- const gpu = new NvidiaGpuMonitor(config.gpu);
1647
- const queue = new QueueManager(config, ollama, jobs);
1648
- const cleanup = setInterval(() => jobs.cleanupExpired(), config.jobs.cleanupIntervalMs);
1649
- const server = await startServer(config, { ollama, gpu, jobs, queue });
1650
- logger.info({ configPath: path }, "loaded config");
1651
- const shutdown = async () => {
1652
- clearInterval(cleanup);
1653
- await server.close();
1654
- jobs.close();
1655
- process.exit(0);
1656
- };
1657
- process.once("SIGINT", shutdown);
1658
- process.once("SIGTERM", shutdown);
1659
- });
1660
- program.command("init").description("write a starter config").option("-o, --output <path>", "output path", "./ollama-agent-router.yaml").option("--wizard", "run the detect-first configuration wizard").action(async (options) => {
1661
- if (options.wizard) {
1662
- await runConfigure({ outputPath: options.output });
1663
- return;
1664
- }
1665
- await writeDefaultConfig(options.output);
1666
- console.log(`Wrote ${options.output}`);
1667
- });
1668
- program.command("configure").description("run the detect-first configuration wizard").option("-o, --output <path>", "output path", "./ollama-agent-router.yaml").option("--answers <path>", "answers YAML for non-interactive mode").option("--non-interactive", "generate config without interactive prompts").option("--detect", "print detected environment and exit").option("--dry-run", "print generated YAML without writing").option("--overwrite", "overwrite output if it already exists").option("-y, --yes", "accept detected values and write without confirmation").action(async (options) => {
1669
- await runConfigure({
1670
- outputPath: options.output,
1671
- answersPath: options.answers,
1672
- nonInteractive: options.nonInteractive || options.yes,
1673
- detectOnly: options.detect,
1674
- dryRun: options.dryRun,
1675
- overwrite: options.overwrite,
1676
- assumeYes: options.yes
1640
+ // src/cli-program.ts
1641
+ var packageJson = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
1642
+ function createProgram() {
1643
+ const program = new Command();
1644
+ program.name("ollama-agent-router").alias("oar").description("Intelligent HTTP/CLI router for Ollama").version(packageJson.version, "-v, --version", "display version").option("-c, --config <path>", "config file path").option("-u, --url <url>", "router URL for client commands", "http://127.0.0.1:11435").option("--base-path <path>", "router API base path for client commands", "/");
1645
+ program.command("serve").description("start the router server").option("-c, --config <path>", "config file path").action(async (options) => {
1646
+ const { config, path } = await loadConfig(options.config ?? program.opts().config);
1647
+ const jobs = new InMemoryJobStore(config.jobs);
1648
+ const ollama = new HttpOllamaClient(config.ollama);
1649
+ const gpu = new NvidiaGpuMonitor(config.gpu);
1650
+ const queue = new QueueManager(config, ollama, jobs);
1651
+ const cleanup = setInterval(() => jobs.cleanupExpired(), config.jobs.cleanupIntervalMs);
1652
+ const server = await startServer(config, { ollama, gpu, jobs, queue });
1653
+ logger.info({ configPath: path }, "loaded config");
1654
+ const shutdown = async () => {
1655
+ clearInterval(cleanup);
1656
+ await server.close();
1657
+ jobs.close();
1658
+ process.exit(0);
1659
+ };
1660
+ process.once("SIGINT", shutdown);
1661
+ process.once("SIGTERM", shutdown);
1677
1662
  });
1678
- });
1679
- program.command("validate-config").description("validate YAML configuration").option("-c, --config <path>", "config file path").action(async (options) => {
1680
- const path = options.config ?? program.opts().config;
1681
- if (path) {
1682
- parseConfig(await readFile4(path, "utf8"));
1683
- console.log(`Config is valid: ${path}`);
1684
- return;
1685
- }
1686
- const found = await loadConfig();
1687
- console.log(`Config is valid: ${found.path}`);
1688
- });
1689
- program.command("status").description("show router status").action(() => printJson("/v1/router/status"));
1690
- program.command("models").description("show configured and Ollama models").action(() => printJson("/v1/router/models"));
1691
- program.command("gpu").description("show GPU state").action(() => printJson("/v1/router/gpu"));
1692
- program.command("jobs").description("list jobs").action(() => printJson("/v1/jobs"));
1693
- program.command("job <jobId>").description("show job").action((jobId) => printJson(`/v1/jobs/${jobId}`));
1694
- program.command("result <jobId>").description("show job result").action((jobId) => printJson(`/v1/jobs/${jobId}/result`));
1695
- program.command("cancel <jobId>").description("cancel a job").action((jobId) => printJson(`/v1/jobs/${jobId}`, { method: "DELETE" }));
1696
- program.parseAsync().catch((error) => {
1697
- console.error(error instanceof Error ? error.message : String(error));
1698
- process.exitCode = 1;
1699
- });
1700
- async function printJson(path, init) {
1701
- const response = await fetch(buildClientUrl(path), init);
1663
+ program.command("init").description("write a starter config").option("-o, --output <path>", "output path", "./ollama-agent-router.yaml").option("--wizard", "run the detect-first configuration wizard").action(async (options) => {
1664
+ if (options.wizard) {
1665
+ await runConfigure({ outputPath: options.output });
1666
+ return;
1667
+ }
1668
+ await writeDefaultConfig(options.output);
1669
+ console.log(`Wrote ${options.output}`);
1670
+ });
1671
+ program.command("configure").description("run the detect-first configuration wizard").option("-o, --output <path>", "output path", "./ollama-agent-router.yaml").option("--answers <path>", "answers YAML for non-interactive mode").option("--non-interactive", "generate config without interactive prompts").option("--detect", "print detected environment and exit").option("--dry-run", "print generated YAML without writing").option("--overwrite", "overwrite output if it already exists").option("-y, --yes", "accept detected values and write without confirmation").action(async (options) => {
1672
+ await runConfigure({
1673
+ outputPath: options.output,
1674
+ answersPath: options.answers,
1675
+ nonInteractive: options.nonInteractive || options.yes,
1676
+ detectOnly: options.detect,
1677
+ dryRun: options.dryRun,
1678
+ overwrite: options.overwrite,
1679
+ assumeYes: options.yes
1680
+ });
1681
+ });
1682
+ program.command("validate-config").description("validate YAML configuration").option("-c, --config <path>", "config file path").action(async (options) => {
1683
+ const path = options.config ?? program.opts().config;
1684
+ if (path) {
1685
+ parseConfig(await readFile4(path, "utf8"));
1686
+ console.log(`Config is valid: ${path}`);
1687
+ return;
1688
+ }
1689
+ const found = await loadConfig();
1690
+ console.log(`Config is valid: ${found.path}`);
1691
+ });
1692
+ program.command("status").description("show router status").action(() => printJson(program, "/v1/router/status"));
1693
+ program.command("models").description("show configured and Ollama models").action(() => printJson(program, "/v1/router/models"));
1694
+ program.command("gpu").description("show GPU state").action(() => printJson(program, "/v1/router/gpu"));
1695
+ program.command("jobs").description("list jobs").action(() => printJson(program, "/v1/jobs"));
1696
+ program.command("job <jobId>").description("show job").action((jobId) => printJson(program, `/v1/jobs/${jobId}`));
1697
+ program.command("result <jobId>").description("show job result").action((jobId) => printJson(program, `/v1/jobs/${jobId}/result`));
1698
+ program.command("cancel <jobId>").description("cancel a job").action((jobId) => printJson(program, `/v1/jobs/${jobId}`, { method: "DELETE" }));
1699
+ return program;
1700
+ }
1701
+ async function printJson(program, path, init) {
1702
+ const response = await fetch(buildClientUrl(program, path), init);
1702
1703
  const text = await response.text();
1703
1704
  if (!response.ok) {
1704
1705
  throw new Error(text || `HTTP ${response.status}`);
@@ -1709,7 +1710,7 @@ async function printJson(path, init) {
1709
1710
  console.log(text);
1710
1711
  }
1711
1712
  }
1712
- function buildClientUrl(path) {
1713
+ function buildClientUrl(program, path) {
1713
1714
  const options = program.opts();
1714
1715
  const url = new URL(options.url);
1715
1716
  const basePath = normalizeBasePath2(options.basePath);
@@ -1722,4 +1723,10 @@ function normalizeBasePath2(basePath) {
1722
1723
  if (!trimmed || trimmed === "/") return "/";
1723
1724
  return `/${trimmed.replace(/^\/+|\/+$/g, "")}`;
1724
1725
  }
1726
+
1727
+ // src/cli.ts
1728
+ createProgram().parseAsync().catch((error) => {
1729
+ console.error(error instanceof Error ? error.message : String(error));
1730
+ process.exitCode = 1;
1731
+ });
1725
1732
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/types.ts","../src/configurator.ts","../src/gpu.ts","../src/ollama.ts","../src/job-store.ts","../src/queue-manager.ts","../src/server.ts","../src/classifier.ts","../src/router-engine.ts","../src/logger.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFile } from 'node:fs/promises';\nimport { Command } from 'commander';\nimport { loadConfig, parseConfig, writeDefaultConfig } from './config.js';\nimport { runConfigure } from './configurator.js';\nimport { NvidiaGpuMonitor } from './gpu.js';\nimport { InMemoryJobStore } from './job-store.js';\nimport { HttpOllamaClient } from './ollama.js';\nimport { QueueManager } from './queue-manager.js';\nimport { startServer } from './server.js';\nimport { logger } from './logger.js';\n\nconst program = new Command();\n\nprogram\n .name('ollama-agent-router')\n .alias('oar')\n .description('Intelligent HTTP/CLI router for Ollama')\n .option('-c, --config <path>', 'config file path')\n .option('-u, --url <url>', 'router URL for client commands', 'http://127.0.0.1:11435')\n .option('--base-path <path>', 'router API base path for client commands', '/');\n\nprogram\n .command('serve')\n .description('start the router server')\n .option('-c, --config <path>', 'config file path')\n .action(async (options) => {\n const { config, path } = await loadConfig(options.config ?? program.opts().config);\n const jobs = new InMemoryJobStore(config.jobs);\n const ollama = new HttpOllamaClient(config.ollama);\n const gpu = new NvidiaGpuMonitor(config.gpu);\n const queue = new QueueManager(config, ollama, jobs);\n const cleanup = setInterval(() => jobs.cleanupExpired(), config.jobs.cleanupIntervalMs);\n const server = await startServer(config, { ollama, gpu, jobs, queue });\n logger.info({ configPath: path }, 'loaded config');\n\n const shutdown = async () => {\n clearInterval(cleanup);\n await server.close();\n jobs.close();\n process.exit(0);\n };\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n });\n\nprogram\n .command('init')\n .description('write a starter config')\n .option('-o, --output <path>', 'output path', './ollama-agent-router.yaml')\n .option('--wizard', 'run the detect-first configuration wizard')\n .action(async (options) => {\n if (options.wizard) {\n await runConfigure({ outputPath: options.output });\n return;\n }\n await writeDefaultConfig(options.output);\n console.log(`Wrote ${options.output}`);\n });\n\nprogram\n .command('configure')\n .description('run the detect-first configuration wizard')\n .option('-o, --output <path>', 'output path', './ollama-agent-router.yaml')\n .option('--answers <path>', 'answers YAML for non-interactive mode')\n .option('--non-interactive', 'generate config without interactive prompts')\n .option('--detect', 'print detected environment and exit')\n .option('--dry-run', 'print generated YAML without writing')\n .option('--overwrite', 'overwrite output if it already exists')\n .option('-y, --yes', 'accept detected values and write without confirmation')\n .action(async (options) => {\n await runConfigure({\n outputPath: options.output,\n answersPath: options.answers,\n nonInteractive: options.nonInteractive || options.yes,\n detectOnly: options.detect,\n dryRun: options.dryRun,\n overwrite: options.overwrite,\n assumeYes: options.yes\n });\n });\n\nprogram\n .command('validate-config')\n .description('validate YAML configuration')\n .option('-c, --config <path>', 'config file path')\n .action(async (options) => {\n const path = options.config ?? program.opts().config;\n if (path) {\n parseConfig(await readFile(path, 'utf8'));\n console.log(`Config is valid: ${path}`);\n return;\n }\n const found = await loadConfig();\n console.log(`Config is valid: ${found.path}`);\n });\n\nprogram.command('status').description('show router status').action(() => printJson('/v1/router/status'));\nprogram.command('models').description('show configured and Ollama models').action(() => printJson('/v1/router/models'));\nprogram.command('gpu').description('show GPU state').action(() => printJson('/v1/router/gpu'));\nprogram.command('jobs').description('list jobs').action(() => printJson('/v1/jobs'));\nprogram.command('job <jobId>').description('show job').action((jobId) => printJson(`/v1/jobs/${jobId}`));\nprogram.command('result <jobId>').description('show job result').action((jobId) => printJson(`/v1/jobs/${jobId}/result`));\nprogram\n .command('cancel <jobId>')\n .description('cancel a job')\n .action((jobId) => printJson(`/v1/jobs/${jobId}`, { method: 'DELETE' }));\n\nprogram.parseAsync().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n\nasync function printJson(path: string, init?: RequestInit): Promise<void> {\n const response = await fetch(buildClientUrl(path), init);\n const text = await response.text();\n if (!response.ok) {\n throw new Error(text || `HTTP ${response.status}`);\n }\n try {\n console.log(JSON.stringify(JSON.parse(text), null, 2));\n } catch {\n console.log(text);\n }\n}\n\nfunction buildClientUrl(path: string): URL {\n const options = program.opts() as { url: string; basePath: string };\n const url = new URL(options.url);\n const basePath = normalizeBasePath(options.basePath);\n const pieces = [url.pathname, basePath, path].map((piece) => piece.replace(/^\\/+|\\/+$/g, '')).filter(Boolean);\n url.pathname = `/${pieces.join('/')}`;\n return url;\n}\n\nfunction normalizeBasePath(basePath: string): string {\n const trimmed = basePath.trim();\n if (!trimmed || trimmed === '/') return '/';\n return `/${trimmed.replace(/^\\/+|\\/+$/g, '')}`;\n}\n","import { existsSync } from 'node:fs';\nimport { access, readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport YAML from 'yaml';\nimport { z } from 'zod';\nimport { AppConfig, taskTypes } from './types.js';\n\nconst taskTypeSchema = z.enum(taskTypes);\nconst optionalStringSchema = z.preprocess((value) => (value === null ? undefined : value), z.string().min(1).optional());\n\nexport const modelSpecSchema = z.object({\n name: z.string().min(1),\n sizeGb: z.number().positive(),\n purpose: z.array(z.string()).default([]),\n priority: z.number().default(50),\n maxConcurrent: z.number().int().positive(),\n defaultContext: z.number().int().positive(),\n maxContext: z.number().int().positive(),\n timeoutMs: z.number().int().positive(),\n costClass: z.enum(['low', 'medium', 'high']).default('medium'),\n exclusive: z.boolean().default(false),\n allowWhenBusy: z.boolean().default(false),\n tags: z.array(z.string()).default([])\n});\n\nexport const appConfigSchema = z.object({\n server: z.object({\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n basePath: z.string().min(1).default('/'),\n requestBodyLimit: z.string().min(1),\n https: z\n .object({\n enabled: z.boolean().default(false),\n certPath: optionalStringSchema,\n keyPath: optionalStringSchema,\n caPath: optionalStringSchema\n })\n .default({ enabled: false })\n }),\n ollama: z.object({\n baseUrl: z.string().url(),\n openAiCompatiblePath: z.string().min(1).default('/v1/chat/completions'),\n nativeApiBasePath: z.string().min(1).default('/api'),\n keepAlive: z.string().default('5m'),\n requestTimeoutMs: z.number().int().positive()\n }),\n gpu: z.object({\n provider: z.enum(['none', 'nvidia']).default('none'),\n name: z.string().optional(),\n vramTotalMb: z.number().nonnegative(),\n vramSafetyReserveMb: z.number().nonnegative(),\n maxGpuUtilizationPct: z.number().min(1).max(100),\n requireGpuOnlyByDefault: z.boolean().default(false),\n monitor: z.object({\n enabled: z.boolean().default(false),\n intervalMs: z.number().int().positive(),\n nvidiaSmiPath: z.string().min(1).default('nvidia-smi')\n })\n }),\n router: z.object({\n defaultMode: z.enum(['auto', 'sync', 'async']).default('auto'),\n syncMaxQueueTimeMs: z.number().int().nonnegative(),\n heavyLoadQueueDepth: z.number().int().nonnegative(),\n heavyLoadGpuFreeMbThreshold: z.number().int().nonnegative(),\n defaultTaskType: taskTypeSchema.default('unknown'),\n classification: z.object({\n mode: z.enum(['heuristic', 'model']).default('heuristic'),\n optionalClassifierModel: z.string().optional(),\n classifierTimeoutMs: z.number().int().positive()\n })\n }),\n jobs: z.object({\n store: z.literal('memory').default('memory'),\n resultTtlSeconds: z.number().int().positive(),\n maxAttempts: z.number().int().positive(),\n cleanupIntervalMs: z.number().int().positive()\n }),\n models: z.array(modelSpecSchema).min(1),\n routes: z.record(z.string(), z.array(z.string())),\n queue: z.object({\n globalMaxConcurrent: z.number().int().positive(),\n globalMaxQueued: z.number().int().nonnegative(),\n perUserMaxQueued: z.number().int().nonnegative(),\n defaultPriority: z.enum(['low', 'normal', 'high']).default('normal'),\n timeoutMs: z.number().int().positive()\n })\n});\n\nexport const configLookupOrder = (explicitPath?: string): string[] => {\n const paths = [\n './ollama-agent-router.yaml',\n `${homedir()}/.config/ollama-agent-router/config.yaml`,\n '/etc/ollama-agent-router/config.yaml'\n ];\n return explicitPath ? [explicitPath, ...paths] : paths;\n};\n\nexport async function findConfigPath(explicitPath?: string): Promise<string> {\n for (const candidate of configLookupOrder(explicitPath)) {\n const path = resolve(candidate);\n try {\n await access(path);\n return path;\n } catch {\n // Try the next lookup path.\n }\n }\n throw new Error(`No config file found. Tried: ${configLookupOrder(explicitPath).join(', ')}`);\n}\n\nexport async function loadConfig(explicitPath?: string): Promise<{ path: string; config: AppConfig }> {\n const path = await findConfigPath(explicitPath);\n const raw = await readFile(path, 'utf8');\n return { path, config: parseConfig(raw) };\n}\n\nexport function parseConfig(raw: string): AppConfig {\n const parsed = YAML.parse(raw);\n const config = appConfigSchema.parse(parsed) as AppConfig;\n if (config.server.https.enabled && (!config.server.https.certPath || !config.server.https.keyPath)) {\n throw new Error('server.https.certPath and server.https.keyPath are required when HTTPS is enabled');\n }\n const modelNames = new Set(config.models.map((model) => model.name));\n const missingRoutes = Object.entries(config.routes)\n .flatMap(([taskType, names]) => (names ?? []).map((name) => ({ taskType, name })))\n .filter(({ name }) => !modelNames.has(name));\n if (missingRoutes.length > 0) {\n const formatted = missingRoutes.map((route) => `${route.taskType}:${route.name}`).join(', ');\n throw new Error(`Routes reference unknown models: ${formatted}`);\n }\n return config;\n}\n\nexport async function writeDefaultConfig(path: string): Promise<void> {\n const target = resolve(path);\n if (existsSync(target)) {\n throw new Error(`Refusing to overwrite existing config: ${target}`);\n }\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, defaultConfigYaml, 'utf8');\n}\n\nexport const defaultConfigYaml = `server:\n host: 127.0.0.1\n port: 11435\n basePath: /\n requestBodyLimit: 4mb\n https:\n enabled: false\n certPath:\n keyPath:\n caPath:\nollama:\n baseUrl: http://127.0.0.1:11434\n openAiCompatiblePath: /v1/chat/completions\n nativeApiBasePath: /api\n keepAlive: 5m\n requestTimeoutMs: 120000\ngpu:\n provider: none\n name: Local GPU\n vramTotalMb: 0\n vramSafetyReserveMb: 1024\n maxGpuUtilizationPct: 95\n requireGpuOnlyByDefault: false\n monitor:\n enabled: false\n intervalMs: 5000\n nvidiaSmiPath: nvidia-smi\nrouter:\n defaultMode: auto\n syncMaxQueueTimeMs: 250\n heavyLoadQueueDepth: 4\n heavyLoadGpuFreeMbThreshold: 2048\n defaultTaskType: unknown\n classification:\n mode: heuristic\n optionalClassifierModel:\n classifierTimeoutMs: 1500\njobs:\n store: memory\n resultTtlSeconds: 86400\n maxAttempts: 2\n cleanupIntervalMs: 60000\nmodels:\n - name: llama3.2:3b\n sizeGb: 2.0\n purpose: [simple_chat, summarize, triage]\n priority: 50\n maxConcurrent: 1\n defaultContext: 4096\n maxContext: 8192\n timeoutMs: 120000\n costClass: low\n exclusive: false\n allowWhenBusy: true\n tags: [general]\nroutes:\n triage: [llama3.2:3b]\n simple_chat: [llama3.2:3b]\n summarize: [llama3.2:3b]\n code_generate: [llama3.2:3b]\n code_review: [llama3.2:3b]\n code_fix: [llama3.2:3b]\n agentic_reasoning: [llama3.2:3b]\n large_context: [llama3.2:3b]\n tool_use: [llama3.2:3b]\n unknown: [llama3.2:3b]\nqueue:\n globalMaxConcurrent: 2\n globalMaxQueued: 100\n perUserMaxQueued: 20\n defaultPriority: normal\n timeoutMs: 120000\n`;\n","export const taskTypes = [\n 'triage',\n 'simple_chat',\n 'summarize',\n 'code_generate',\n 'code_review',\n 'code_fix',\n 'agentic_reasoning',\n 'large_context',\n 'tool_use',\n 'unknown'\n] as const;\n\nexport type TaskType = (typeof taskTypes)[number];\nexport type RouterMode = 'auto' | 'sync' | 'async';\nexport type PriorityName = 'low' | 'normal' | 'high';\nexport type Complexity = 'light' | 'medium' | 'heavy';\nexport type JobStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled' | 'expired';\n\nexport interface RouterRequestMetadata {\n mode?: RouterMode;\n allowAsync?: boolean;\n taskType?: TaskType | 'auto';\n priority?: PriorityName;\n preferredModels?: string[];\n forbiddenModels?: string[];\n maxQueueTimeMs?: number;\n maxExecutionTimeMs?: number;\n requireGpuOnly?: boolean;\n}\n\nexport interface ChatCompletionRequest {\n model?: string;\n messages: Array<{ role: string; content: unknown }>;\n stream?: boolean;\n router?: RouterRequestMetadata;\n [key: string]: unknown;\n}\n\nexport interface Classification {\n taskType: TaskType;\n complexity: Complexity;\n requiresLargeContext: boolean;\n requiresToolUse: boolean;\n confidence: number;\n}\n\nexport interface GpuSnapshot {\n name: string;\n vramTotalMb: number;\n vramUsedMb: number;\n vramFreeMb: number;\n utilizationPct: number;\n}\n\nexport interface LoadedModel {\n name: string;\n id?: string;\n size?: string;\n processor?: string;\n until?: string;\n}\n\nexport interface ModelSpec {\n name: string;\n sizeGb: number;\n purpose: string[];\n priority: number;\n maxConcurrent: number;\n defaultContext: number;\n maxContext: number;\n timeoutMs: number;\n costClass: 'low' | 'medium' | 'high';\n exclusive: boolean;\n allowWhenBusy: boolean;\n tags: string[];\n}\n\nexport interface AppConfig {\n server: {\n host: string;\n port: number;\n basePath: string;\n requestBodyLimit: string;\n https: {\n enabled: boolean;\n certPath?: string;\n keyPath?: string;\n caPath?: string;\n };\n };\n ollama: {\n baseUrl: string;\n openAiCompatiblePath: string;\n nativeApiBasePath: string;\n keepAlive: string;\n requestTimeoutMs: number;\n };\n gpu: {\n provider: 'none' | 'nvidia';\n name?: string;\n vramTotalMb: number;\n vramSafetyReserveMb: number;\n maxGpuUtilizationPct: number;\n requireGpuOnlyByDefault: boolean;\n monitor: {\n enabled: boolean;\n intervalMs: number;\n nvidiaSmiPath: string;\n };\n };\n router: {\n defaultMode: RouterMode;\n syncMaxQueueTimeMs: number;\n heavyLoadQueueDepth: number;\n heavyLoadGpuFreeMbThreshold: number;\n defaultTaskType: TaskType;\n classification: {\n mode: 'heuristic' | 'model';\n optionalClassifierModel?: string;\n classifierTimeoutMs: number;\n };\n };\n jobs: {\n store: 'memory';\n resultTtlSeconds: number;\n maxAttempts: number;\n cleanupIntervalMs: number;\n };\n models: ModelSpec[];\n routes: Partial<Record<TaskType | string, string[]>>;\n queue: {\n globalMaxConcurrent: number;\n globalMaxQueued: number;\n perUserMaxQueued: number;\n defaultPriority: PriorityName;\n timeoutMs: number;\n };\n}\n\nexport interface RouteContext {\n request: ChatCompletionRequest;\n router: Required<RouterRequestMetadata>;\n classification: Classification;\n gpu?: GpuSnapshot;\n loadedModels: LoadedModel[];\n queueDepthByModel: Map<string, number>;\n runningByModel: Map<string, number>;\n}\n\nexport type RouteDecision =\n | {\n type: 'sync';\n model: ModelSpec;\n fallbackModels: string[];\n reason: string;\n score: number;\n }\n | {\n type: 'async';\n model: ModelSpec;\n fallbackModels: string[];\n reason: string;\n score: number;\n position: number;\n }\n | {\n type: 'reject';\n reason: string;\n statusCode: number;\n };\n\nexport interface JobRecord {\n id: string;\n status: JobStatus;\n task_type: TaskType;\n selected_model: string | null;\n request_json: string;\n result_json: string | null;\n error_json: string | null;\n attempts: number;\n priority: number;\n created_at: string;\n started_at: string | null;\n finished_at: string | null;\n expires_at: string | null;\n}\n","import { access, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { createInterface } from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'node:process';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport os from 'node:os';\nimport YAML from 'yaml';\nimport { z } from 'zod';\nimport { parseConfig } from './config.js';\nimport { parseNvidiaSmi } from './gpu.js';\nimport { parseOllamaPs } from './ollama.js';\nimport { AppConfig, LoadedModel, ModelSpec, TaskType } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface DetectionResult<T> {\n value?: T;\n source: 'command' | 'env' | 'default' | 'manual' | 'not_found';\n confidence: 'high' | 'medium' | 'low';\n message?: string;\n}\n\nexport interface DetectedOllamaModel {\n name: string;\n id?: string;\n size?: string;\n sizeGb?: number;\n modified?: string;\n}\n\nexport interface MachineProfile {\n platform: NodeJS.Platform;\n arch: string;\n cpuCores: number;\n totalMemoryMb: number;\n class: 'small' | 'medium' | 'large';\n}\n\nexport interface WizardDetection {\n ollamaBinary: DetectionResult<string>;\n ollamaBaseUrl: DetectionResult<string>;\n ollamaReachable: DetectionResult<boolean>;\n ollamaModels: DetectionResult<DetectedOllamaModel[]>;\n loadedModels: DetectionResult<LoadedModel[]>;\n nvidiaSmiPath: DetectionResult<string>;\n gpu: DetectionResult<AppConfig['gpu']>;\n machine: DetectionResult<MachineProfile>;\n}\n\nexport interface CommandRunner {\n (command: string, args: string[]): Promise<{ stdout: string; stderr?: string }>;\n}\n\nexport interface DetectOptions {\n platform?: NodeJS.Platform;\n arch?: string;\n env?: NodeJS.ProcessEnv;\n commandRunner?: CommandRunner;\n fetchImpl?: typeof fetch;\n pathLookup?: (command: string, platform: NodeJS.Platform, env: NodeJS.ProcessEnv) => Promise<string | undefined>;\n totalMemoryMb?: number;\n cpuCores?: number;\n}\n\nexport interface ConfigureOptions extends DetectOptions {\n outputPath: string;\n answersPath?: string;\n nonInteractive?: boolean;\n dryRun?: boolean;\n overwrite?: boolean;\n detectOnly?: boolean;\n assumeYes?: boolean;\n silent?: boolean;\n}\n\nexport interface ConfigureAnswers {\n server?: Partial<AppConfig['server']> & { https?: Partial<AppConfig['server']['https']> | boolean };\n ollama?: Partial<AppConfig['ollama']>;\n gpu?: Partial<AppConfig['gpu']>;\n router?: Partial<AppConfig['router']>;\n jobs?: Partial<AppConfig['jobs']>;\n queue?: Partial<AppConfig['queue']>;\n models?: {\n mode?: 'detected' | 'manual';\n items?: Array<Partial<ModelSpec> & { role?: ModelRole }>;\n };\n routes?: Partial<Record<TaskType | string, string[]>>;\n}\n\ntype ModelRole = 'fast' | 'code' | 'review' | 'heavy' | 'tool';\n\nconst answersSchema = z.object({\n server: z.record(z.unknown()).optional(),\n ollama: z.record(z.unknown()).optional(),\n gpu: z.record(z.unknown()).optional(),\n router: z.record(z.unknown()).optional(),\n jobs: z.record(z.unknown()).optional(),\n queue: z.record(z.unknown()).optional(),\n models: z\n .object({\n mode: z.enum(['detected', 'manual']).optional(),\n items: z.array(z.record(z.unknown())).optional()\n })\n .optional(),\n routes: z.record(z.array(z.string())).optional()\n});\n\nconst coreTaskTypes: TaskType[] = [\n 'triage',\n 'simple_chat',\n 'summarize',\n 'code_generate',\n 'code_review',\n 'code_fix',\n 'agentic_reasoning',\n 'large_context',\n 'tool_use',\n 'unknown'\n];\n\nexport async function runConfigure(options: ConfigureOptions): Promise<void> {\n const detection = await detectEnvironment(options);\n\n if (options.detectOnly) {\n emit(options, `${formatDetectionSummary(detection)}\\n`);\n return;\n }\n\n const answers = options.answersPath ? await loadAnswers(options.answersPath) : {};\n const config = options.nonInteractive\n ? generateConfigFromDetection(detection, answers)\n : await promptForConfig(detection, answers, options);\n const yaml = serializeConfig(config);\n parseConfig(yaml);\n\n emit(options, `${formatConfigSummary(config, detection, options.outputPath)}\\n`);\n if (options.dryRun) {\n emit(options, `${yaml}\\n`);\n return;\n }\n\n if (!options.overwrite && (await fileExists(options.outputPath))) {\n throw new Error(`Refusing to overwrite existing config: ${options.outputPath}`);\n }\n await mkdir(dirname(resolve(options.outputPath)), { recursive: true });\n await writeFile(options.outputPath, yaml, 'utf8');\n emit(options, `Wrote ${options.outputPath}\\n`);\n}\n\nexport async function detectEnvironment(options: DetectOptions = {}): Promise<WizardDetection> {\n const platform = options.platform ?? process.platform;\n const arch = options.arch ?? process.arch;\n const env = options.env ?? process.env;\n const commandRunner = options.commandRunner ?? defaultCommandRunner;\n const pathLookup = options.pathLookup ?? findExecutable;\n\n const machine = detectMachine(platform, arch, options);\n const ollamaBinary = await detectOllamaBinary(platform, env, pathLookup);\n const ollamaBaseUrl = detectOllamaBaseUrl(env);\n const ollamaReachable = await detectOllamaReachable(ollamaBaseUrl.value, options.fetchImpl ?? fetch);\n const ollamaModels = await detectOllamaModels(ollamaBinary.value, commandRunner);\n const loadedModels = await detectLoadedModels(ollamaBinary.value, commandRunner);\n const nvidiaSmiPath: DetectionResult<string> =\n platform === 'darwin' ? notFound<string>('nvidia-smi is normally unavailable on macOS') : await detectNvidiaSmi(platform, env, pathLookup);\n const gpu = await detectGpu(platform, arch, nvidiaSmiPath.value, commandRunner);\n\n return {\n ollamaBinary,\n ollamaBaseUrl,\n ollamaReachable,\n ollamaModels,\n loadedModels,\n nvidiaSmiPath,\n gpu,\n machine\n };\n}\n\nexport function generateConfigFromDetection(detection: WizardDetection, answers: ConfigureAnswers = {}): AppConfig {\n const machine = detection.machine.value ?? detectMachine(process.platform, process.arch, {}).value!;\n const gpu = mergeGpu(detection.gpu.value ?? defaultGpuForPlatform(machine.platform, machine.arch), answers.gpu);\n const cpuOnly = gpu.provider === 'none';\n const detectedModels = detection.ollamaModels.value ?? [];\n const models = buildModels(detectedModels, answers.models, cpuOnly);\n if (models.length === 0) {\n throw new Error('No models detected or provided. Add at least one model to generate a config.');\n }\n const routes = ensureCoreRoutes({ ...generateRoutes(models), ...(answers.routes ?? {}) }, models);\n const queue = {\n ...defaultQueue(machine, models, cpuOnly),\n ...(answers.queue ?? {})\n };\n\n const httpsAnswer = answers.server?.https;\n const serverHttps =\n typeof httpsAnswer === 'boolean'\n ? { enabled: httpsAnswer }\n : { enabled: false, ...(httpsAnswer ?? {}) };\n\n const config: AppConfig = {\n server: {\n host: '127.0.0.1',\n port: 11435,\n basePath: '/',\n requestBodyLimit: '8mb',\n https: serverHttps,\n ...omit(answers.server ?? {}, ['https'])\n },\n ollama: {\n baseUrl: detection.ollamaBaseUrl.value ?? 'http://127.0.0.1:11434',\n openAiCompatiblePath: '/v1/chat/completions',\n nativeApiBasePath: '/api',\n keepAlive: '10m',\n requestTimeoutMs: 180000,\n ...(answers.ollama ?? {})\n },\n gpu,\n router: {\n defaultMode: 'auto',\n syncMaxQueueTimeMs: cpuOnly ? 100 : 250,\n heavyLoadQueueDepth: cpuOnly ? 1 : models.some((model) => model.exclusive) ? 3 : 4,\n heavyLoadGpuFreeMbThreshold: gpu.provider === 'nvidia' ? Math.max(2048, gpu.vramSafetyReserveMb * 2) : 1024,\n defaultTaskType: 'unknown',\n classification: {\n mode: 'heuristic',\n optionalClassifierModel: models.find((model) => model.costClass === 'low')?.name,\n classifierTimeoutMs: 1500\n },\n ...(answers.router ?? {})\n },\n jobs: {\n store: 'memory',\n resultTtlSeconds: 86400,\n maxAttempts: 2,\n cleanupIntervalMs: 60000,\n ...(answers.jobs ?? {})\n },\n models,\n routes,\n queue\n };\n\n return parseConfig(serializeConfig(config));\n}\n\nexport function parseOllamaList(outputText: string): DetectedOllamaModel[] {\n const lines = outputText\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n if (lines.length <= 1) return [];\n return lines.slice(1).map((line) => {\n const wideParts = line.split(/\\s{2,}/).filter(Boolean);\n const parts = wideParts.length >= 3 ? wideParts : line.split(/\\s+/).filter(Boolean);\n const [name, id] = parts;\n const size = wideParts.length >= 3 ? parts[2] : [parts[2], parts[3]].filter(Boolean).join(' ');\n const modified = wideParts.length >= 3 ? parts[3] : parts.slice(4).join(' ');\n return {\n name: name ?? line,\n id,\n size,\n sizeGb: parseSizeGb(size),\n modified: modified || undefined\n };\n });\n}\n\nexport function inferModelRole(model: Pick<DetectedOllamaModel, 'name' | 'sizeGb'>): ModelRole {\n const name = model.name.toLowerCase();\n if (name.includes('review')) return 'review';\n if (name.includes('coder') || name.includes('code') || name.includes('deepseek') || name.includes('qwen')) return 'code';\n if ((model.sizeGb ?? 0) >= 12 || name.includes('gpt-oss') || name.includes('reason')) return 'heavy';\n if (name.includes('tool')) return 'tool';\n return 'fast';\n}\n\nexport function serializeConfig(config: AppConfig): string {\n return YAML.stringify(config, { lineWidth: 0 });\n}\n\nexport function formatDetectionSummary(detection: WizardDetection): string {\n const machine = detection.machine.value;\n const gpu = detection.gpu.value;\n return [\n 'Detected environment',\n '',\n 'Ollama:',\n ` binary: ${detection.ollamaBinary.value ?? 'not found'} (${detection.ollamaBinary.source}, ${detection.ollamaBinary.confidence})`,\n ` base URL: ${detection.ollamaBaseUrl.value ?? 'not detected'} (${detection.ollamaBaseUrl.source})`,\n ` reachable: ${detection.ollamaReachable.value === true ? 'yes' : 'no'}`,\n ` models: ${detection.ollamaModels.value?.length ?? 0} found`,\n '',\n 'GPU:',\n ` provider: ${gpu?.provider ?? 'none'}`,\n ` name: ${gpu?.name ?? 'not detected'}`,\n ` VRAM: ${gpu?.vramTotalMb ?? 0} MB`,\n ` monitor: ${gpu?.monitor.enabled ? `enabled through ${gpu.monitor.nvidiaSmiPath}` : 'disabled'}`,\n '',\n 'Machine:',\n ` OS: ${machine?.platform ?? process.platform} ${machine?.arch ?? process.arch}`,\n ` CPU cores: ${machine?.cpuCores ?? os.cpus().length}`,\n ` RAM: ${machine?.totalMemoryMb ?? Math.round(os.totalmem() / 1024 / 1024)} MB`\n ].join('\\n');\n}\n\nfunction formatConfigSummary(config: AppConfig, detection: WizardDetection, outputPath: string): string {\n const protocol = config.server.https.enabled ? 'https' : 'http';\n const basePath = config.server.basePath === '/' ? '/' : config.server.basePath;\n return [\n '',\n 'Configuration summary',\n '',\n `Output: ${outputPath}`,\n `Server: ${protocol}://${config.server.host}:${config.server.port}${basePath}`,\n `Ollama: ${config.ollama.baseUrl}`,\n `GPU: ${config.gpu.provider}${config.gpu.name ? `, ${config.gpu.name}` : ''}, ${config.gpu.vramTotalMb} MB VRAM`,\n `Models: ${config.models.length} configured`,\n `Heavy model: ${config.models.find((model) => model.exclusive)?.name ?? 'none'}`,\n `Queue: global concurrency ${config.queue.globalMaxConcurrent}, max queued ${config.queue.globalMaxQueued}`,\n `Jobs: ${config.jobs.store} store, result TTL ${config.jobs.resultTtlSeconds}s`,\n '',\n 'Detected:',\n ` Ollama models: ${detection.ollamaModels.value?.length ?? 0}`,\n ` Machine: ${detection.machine.value?.platform ?? process.platform} ${detection.machine.value?.arch ?? process.arch}`,\n ''\n ].join('\\n');\n}\n\nasync function promptForConfig(\n detection: WizardDetection,\n answers: ConfigureAnswers,\n options: ConfigureOptions\n): Promise<AppConfig> {\n const rl = createInterface({ input, output });\n try {\n output.write(`${formatDetectionSummary(detection)}\\n\\n`);\n const useDetected = options.assumeYes || (await confirm(rl, 'Use these detected values?', true));\n let mergedAnswers = answers;\n if (!useDetected) {\n mergedAnswers = await promptCorrections(rl, detection, answers);\n }\n const config = generateConfigFromDetection(detection, mergedAnswers);\n if (!options.assumeYes && !(await confirm(rl, 'Write this config?', true))) {\n throw new Error('Configuration cancelled');\n }\n return config;\n } finally {\n rl.close();\n }\n}\n\nasync function promptCorrections(\n rl: ReturnType<typeof createInterface>,\n detection: WizardDetection,\n answers: ConfigureAnswers\n): Promise<ConfigureAnswers> {\n const baseUrl = await ask(rl, 'Ollama base URL', detection.ollamaBaseUrl.value ?? 'http://127.0.0.1:11434');\n const host = await ask(rl, 'Server host', '127.0.0.1');\n const port = Number(await ask(rl, 'Server port', '11435'));\n const basePath = await ask(rl, 'Server base path', '/');\n const gpu = detection.gpu.value ?? defaultGpuForPlatform(process.platform, process.arch);\n const vramTotalMb = Number(await ask(rl, 'GPU VRAM total MB', String(gpu.vramTotalMb)));\n const models = detection.ollamaModels.value?.length\n ? undefined\n : {\n mode: 'manual' as const,\n items: [\n {\n name: await ask(rl, 'First Ollama model name', 'llama3.2:3b'),\n role: 'fast' as const,\n sizeGb: Number(await ask(rl, 'First model size GB', '2'))\n }\n ]\n };\n\n return {\n ...answers,\n server: { ...(answers.server ?? {}), host, port, basePath },\n ollama: { ...(answers.ollama ?? {}), baseUrl },\n gpu: { ...(answers.gpu ?? {}), vramTotalMb },\n models: answers.models ?? models\n };\n}\n\nasync function loadAnswers(path: string): Promise<ConfigureAnswers> {\n const raw = await readFile(path, 'utf8');\n const parsed = answersSchema.parse(YAML.parse(raw));\n return parsed as ConfigureAnswers;\n}\n\nasync function detectOllamaBinary(\n platform: NodeJS.Platform,\n env: NodeJS.ProcessEnv,\n pathLookup: (command: string, platform: NodeJS.Platform, env: NodeJS.ProcessEnv) => Promise<string | undefined>\n): Promise<DetectionResult<string>> {\n const pathResult = await pathLookup('ollama', platform, env);\n if (pathResult) return { value: pathResult, source: 'command', confidence: 'high' };\n\n const candidates =\n platform === 'darwin'\n ? ['/opt/homebrew/bin/ollama', '/usr/local/bin/ollama', '/Applications/Ollama.app/Contents/Resources/ollama']\n : ['/usr/bin/ollama', '/usr/local/bin/ollama', '/snap/bin/ollama'];\n for (const candidate of candidates) {\n if (await executableExists(candidate)) return { value: candidate, source: 'command', confidence: 'medium' };\n }\n return notFound('ollama binary not found');\n}\n\nfunction detectOllamaBaseUrl(env: NodeJS.ProcessEnv): DetectionResult<string> {\n if (env.OLLAMA_HOST) return { value: normalizeOllamaHost(env.OLLAMA_HOST), source: 'env', confidence: 'high' };\n return { value: 'http://127.0.0.1:11434', source: 'default', confidence: 'medium' };\n}\n\nasync function detectOllamaReachable(baseUrl: string | undefined, fetchImpl: typeof fetch): Promise<DetectionResult<boolean>> {\n if (!baseUrl) return notFound('ollama base URL is unknown');\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 700);\n try {\n const response = await fetchImpl(new URL('/api/tags', baseUrl), { signal: controller.signal });\n return { value: response.ok, source: 'command', confidence: response.ok ? 'high' : 'low' };\n } catch {\n return { value: false, source: 'not_found', confidence: 'low', message: 'Ollama API did not respond' };\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function detectOllamaModels(\n ollamaBinary: string | undefined,\n commandRunner: CommandRunner\n): Promise<DetectionResult<DetectedOllamaModel[]>> {\n if (!ollamaBinary) return notFound('ollama binary not found');\n try {\n const { stdout } = await commandRunner(ollamaBinary, ['list']);\n return { value: parseOllamaList(stdout), source: 'command', confidence: 'high' };\n } catch {\n return { value: [], source: 'not_found', confidence: 'low', message: 'ollama list failed' };\n }\n}\n\nasync function detectLoadedModels(\n ollamaBinary: string | undefined,\n commandRunner: CommandRunner\n): Promise<DetectionResult<LoadedModel[]>> {\n if (!ollamaBinary) return notFound('ollama binary not found');\n try {\n const { stdout } = await commandRunner(ollamaBinary, ['ps']);\n return { value: parseOllamaPs(stdout), source: 'command', confidence: 'high' };\n } catch {\n return { value: [], source: 'not_found', confidence: 'low', message: 'ollama ps failed' };\n }\n}\n\nasync function detectNvidiaSmi(\n platform: NodeJS.Platform,\n env: NodeJS.ProcessEnv,\n pathLookup: (command: string, platform: NodeJS.Platform, env: NodeJS.ProcessEnv) => Promise<string | undefined>\n): Promise<DetectionResult<string>> {\n const found = await pathLookup('nvidia-smi', platform, env);\n return found ? { value: found, source: 'command', confidence: 'high' } : notFound('nvidia-smi not found');\n}\n\nasync function detectGpu(\n platform: NodeJS.Platform,\n arch: string,\n nvidiaSmiPath: string | undefined,\n commandRunner: CommandRunner\n): Promise<DetectionResult<AppConfig['gpu']>> {\n if (platform === 'darwin') {\n return { value: defaultGpuForPlatform(platform, arch), source: 'default', confidence: arch === 'arm64' ? 'medium' : 'low' };\n }\n if (!nvidiaSmiPath) {\n return { value: defaultGpuForPlatform(platform, arch), source: 'not_found', confidence: 'medium' };\n }\n try {\n const { stdout } = await commandRunner(nvidiaSmiPath, [\n '--query-gpu=name,memory.total,memory.used,memory.free,utilization.gpu',\n '--format=csv,noheader,nounits'\n ]);\n const gpu = parseNvidiaSmi(stdout)[0];\n if (!gpu) return { value: defaultGpuForPlatform(platform, arch), source: 'not_found', confidence: 'low' };\n return {\n value: {\n provider: 'nvidia',\n name: gpu.name,\n vramTotalMb: gpu.vramTotalMb,\n vramSafetyReserveMb: safetyReserveMb(gpu.vramTotalMb),\n maxGpuUtilizationPct: 92,\n requireGpuOnlyByDefault: true,\n monitor: {\n enabled: true,\n intervalMs: 5000,\n nvidiaSmiPath\n }\n },\n source: 'command',\n confidence: 'high'\n };\n } catch {\n return { value: defaultGpuForPlatform(platform, arch), source: 'not_found', confidence: 'low' };\n }\n}\n\nfunction detectMachine(platform: NodeJS.Platform, arch: string, options: DetectOptions): DetectionResult<MachineProfile> {\n const totalMemoryMb = options.totalMemoryMb ?? Math.round(os.totalmem() / 1024 / 1024);\n const cpuCores = options.cpuCores ?? os.cpus().length;\n return {\n value: {\n platform,\n arch,\n cpuCores,\n totalMemoryMb,\n class: totalMemoryMb < 16_384 || cpuCores < 4 ? 'small' : totalMemoryMb > 65_536 || cpuCores > 16 ? 'large' : 'medium'\n },\n source: 'command',\n confidence: 'high'\n };\n}\n\nfunction buildModels(detectedModels: DetectedOllamaModel[], answers?: ConfigureAnswers['models'], cpuOnly = false): ModelSpec[] {\n const source = answers?.mode === 'manual' ? answers.items ?? [] : answers?.items ?? detectedModels;\n return source\n .filter((model) => Boolean(model.name))\n .map((model) =>\n buildModelSpec(\n model.name as string,\n (model as { role?: ModelRole }).role ?? inferModelRole(model as DetectedOllamaModel),\n Number(model.sizeGb ?? 2),\n cpuOnly\n )\n );\n}\n\nfunction buildModelSpec(name: string, role: ModelRole, sizeGb: number, cpuOnly: boolean): ModelSpec {\n const heavy = role === 'heavy';\n const code = role === 'code' || role === 'review' || role === 'tool';\n const naturalMaxConcurrent = heavy ? 1 : role === 'fast' ? 2 : 1;\n return {\n name,\n sizeGb,\n purpose: purposesForRole(role),\n priority: heavy ? 95 : code ? 70 : 50,\n maxConcurrent: cpuOnly ? 1 : naturalMaxConcurrent,\n defaultContext: heavy ? 16_384 : code ? 8192 : 4096,\n maxContext: heavy ? 65_536 : code ? 32_768 : 8192,\n timeoutMs: heavy ? 300_000 : code ? 180_000 : 90_000,\n costClass: heavy ? 'high' : code ? 'medium' : 'low',\n exclusive: heavy,\n allowWhenBusy: !heavy,\n tags: tagsForRole(role)\n };\n}\n\nfunction purposesForRole(role: ModelRole): string[] {\n switch (role) {\n case 'code':\n return ['code_generate', 'code_fix', 'tool_use'];\n case 'review':\n return ['code_review', 'code_generate', 'code_fix'];\n case 'heavy':\n return ['agentic_reasoning', 'large_context', 'planning', 'tool_use'];\n case 'tool':\n return ['tool_use', 'code_generate'];\n case 'fast':\n default:\n return ['triage', 'simple_chat', 'summarize'];\n }\n}\n\nfunction tagsForRole(role: ModelRole): string[] {\n switch (role) {\n case 'code':\n return ['code', 'fallback'];\n case 'review':\n return ['code', 'review'];\n case 'heavy':\n return ['reasoning', 'large_context'];\n case 'tool':\n return ['tool_use'];\n case 'fast':\n default:\n return ['fast', 'chat'];\n }\n}\n\nfunction generateRoutes(models: ModelSpec[]): Record<string, string[]> {\n const fast = models.filter((model) => model.costClass === 'low').map((model) => model.name);\n const code = models.filter((model) => model.purpose.includes('code_generate')).map((model) => model.name);\n const review = models.filter((model) => model.purpose.includes('code_review')).map((model) => model.name);\n const heavy = models.filter((model) => model.exclusive || model.costClass === 'high').map((model) => model.name);\n const tool = models.filter((model) => model.purpose.includes('tool_use')).map((model) => model.name);\n const fallback = [...fast, ...code, ...models.map((model) => model.name)];\n return {\n triage: firstNonEmpty(fast, fallback),\n simple_chat: firstNonEmpty(fast, fallback),\n summarize: firstNonEmpty(fast, fallback),\n code_generate: firstNonEmpty(code, fallback),\n code_review: firstNonEmpty(review, code, fallback),\n code_fix: firstNonEmpty(code, review, fallback),\n agentic_reasoning: firstNonEmpty(heavy, code, fallback),\n large_context: firstNonEmpty(heavy, code, fallback),\n tool_use: firstNonEmpty(tool, code, heavy, fallback),\n unknown: firstNonEmpty(fast, code, fallback)\n };\n}\n\nfunction ensureCoreRoutes(routes: Partial<Record<string, string[]>>, models: ModelSpec[]): Record<string, string[]> {\n const fallback = [models[0].name];\n return Object.fromEntries(coreTaskTypes.map((taskType) => [taskType, routes[taskType]?.length ? routes[taskType] : fallback]));\n}\n\nfunction defaultQueue(machine: MachineProfile, models: ModelSpec[], cpuOnly = false): AppConfig['queue'] {\n const maxByModels = models.reduce((sum, model) => sum + model.maxConcurrent, 0);\n const suggested = cpuOnly ? 1 : machine.class === 'small' ? 1 : machine.class === 'large' ? 4 : 3;\n return {\n globalMaxConcurrent: Math.max(1, Math.min(maxByModels, suggested)),\n globalMaxQueued: cpuOnly || machine.class === 'small' ? 50 : 100,\n perUserMaxQueued: cpuOnly || machine.class === 'small' ? 10 : 20,\n defaultPriority: 'normal',\n timeoutMs: 180_000\n };\n}\n\nfunction mergeGpu(base: AppConfig['gpu'], override: Partial<AppConfig['gpu']> | undefined): AppConfig['gpu'] {\n return {\n ...base,\n ...(override ?? {}),\n monitor: {\n ...base.monitor,\n ...(override?.monitor ?? {})\n }\n };\n}\n\nfunction defaultGpuForPlatform(platform: NodeJS.Platform, arch: string): AppConfig['gpu'] {\n const mac = platform === 'darwin';\n return {\n provider: 'none',\n name: mac && arch === 'arm64' ? 'Apple Silicon / macOS GPU' : mac ? 'macOS GPU' : 'No NVIDIA GPU detected',\n vramTotalMb: 0,\n vramSafetyReserveMb: 1024,\n maxGpuUtilizationPct: 95,\n requireGpuOnlyByDefault: false,\n monitor: {\n enabled: false,\n intervalMs: 5000,\n nvidiaSmiPath: 'nvidia-smi'\n }\n };\n}\n\nfunction safetyReserveMb(totalMb: number): number {\n if (totalMb < 8192) return 1024;\n if (totalMb <= 24_576) return 1536;\n return 2048;\n}\n\nfunction firstNonEmpty(...lists: string[][]): string[] {\n return lists.find((list) => list.length > 0) ?? [];\n}\n\nfunction parseSizeGb(size: string | undefined): number | undefined {\n if (!size) return undefined;\n const match = size.match(/([\\d.]+)\\s*([kmgt]i?b|[kmgt]b)?/i);\n if (!match) return undefined;\n const value = Number(match[1]);\n const unit = (match[2] ?? 'GB').toLowerCase();\n if (!Number.isFinite(value)) return undefined;\n if (unit.startsWith('m')) return value / 1024;\n if (unit.startsWith('k')) return value / 1024 / 1024;\n if (unit.startsWith('t')) return value * 1024;\n return value;\n}\n\nfunction normalizeOllamaHost(host: string): string {\n if (host.startsWith('http://') || host.startsWith('https://')) return host;\n return `http://${host}`;\n}\n\nasync function findExecutable(command: string, _platform: NodeJS.Platform, env: NodeJS.ProcessEnv): Promise<string | undefined> {\n const pathValue = env.PATH ?? '';\n for (const entry of pathValue.split(':').filter(Boolean)) {\n const candidate = resolve(entry, command);\n if (await executableExists(candidate)) return candidate;\n }\n return undefined;\n}\n\nasync function executableExists(path: string): Promise<boolean> {\n try {\n await access(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function defaultCommandRunner(command: string, args: string[]): Promise<{ stdout: string; stderr?: string }> {\n const { stdout, stderr } = await execFileAsync(command, args, { timeout: 5000 });\n return { stdout, stderr };\n}\n\nfunction notFound<T>(message: string): DetectionResult<T> {\n return { source: 'not_found', confidence: 'low', message };\n}\n\nasync function confirm(rl: ReturnType<typeof createInterface>, question: string, defaultValue: boolean): Promise<boolean> {\n const suffix = defaultValue ? '[Y/n]' : '[y/N]';\n const answer = (await rl.question(`${question} ${suffix} `)).trim().toLowerCase();\n if (!answer) return defaultValue;\n return answer === 'y' || answer === 'yes';\n}\n\nasync function ask(rl: ReturnType<typeof createInterface>, question: string, defaultValue: string): Promise<string> {\n const answer = await rl.question(`${question} (${defaultValue}): `);\n return answer.trim() || defaultValue;\n}\n\nfunction omit<T extends Record<string, unknown>, K extends keyof T>(value: T, keys: K[]): Omit<T, K> {\n return Object.fromEntries(Object.entries(value).filter(([key]) => !keys.includes(key as K))) as Omit<T, K>;\n}\n\nfunction emit(options: ConfigureOptions, text: string): void {\n if (!options.silent) output.write(text);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { AppConfig, GpuSnapshot } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface GpuMonitor {\n snapshot(): Promise<GpuSnapshot | undefined>;\n}\n\nexport class StaticGpuMonitor implements GpuMonitor {\n constructor(private readonly config: AppConfig['gpu']) {}\n\n async snapshot(): Promise<GpuSnapshot | undefined> {\n if (this.config.provider === 'none') return undefined;\n return {\n name: this.config.name ?? 'Configured GPU',\n vramTotalMb: this.config.vramTotalMb,\n vramUsedMb: 0,\n vramFreeMb: this.config.vramTotalMb,\n utilizationPct: 0\n };\n }\n}\n\nexport class NvidiaGpuMonitor implements GpuMonitor {\n constructor(\n private readonly config: AppConfig['gpu'],\n private readonly commandRunner: (command: string, args: string[]) => Promise<{ stdout: string }> = defaultCommandRunner\n ) {}\n\n async snapshot(): Promise<GpuSnapshot | undefined> {\n if (!this.config.monitor.enabled || this.config.provider !== 'nvidia') {\n return new StaticGpuMonitor(this.config).snapshot();\n }\n\n const args = [\n '--query-gpu=name,memory.total,memory.used,memory.free,utilization.gpu',\n '--format=csv,noheader,nounits'\n ];\n const { stdout } = await this.commandRunner(this.config.monitor.nvidiaSmiPath, args);\n return parseNvidiaSmi(stdout)[0];\n }\n}\n\nexport function parseNvidiaSmi(output: string): GpuSnapshot[] {\n return output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const [name, total, used, free, utilization] = line.split(',').map((part) => part.trim());\n return {\n name,\n vramTotalMb: Number(total),\n vramUsedMb: Number(used),\n vramFreeMb: Number(free),\n utilizationPct: Number(utilization)\n };\n })\n .filter((gpu) => gpu.name && Number.isFinite(gpu.vramTotalMb));\n}\n\nasync function defaultCommandRunner(command: string, args: string[]): Promise<{ stdout: string }> {\n const { stdout } = await execFileAsync(command, args, { timeout: 5000 });\n return { stdout };\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { AppConfig, ChatCompletionRequest, LoadedModel } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface OllamaClient {\n chat(request: ChatCompletionRequest, model: string, timeoutMs?: number): Promise<unknown>;\n tags(): Promise<unknown>;\n ps(): Promise<LoadedModel[]>;\n}\n\nexport class HttpOllamaClient implements OllamaClient {\n constructor(\n private readonly config: AppConfig['ollama'],\n private readonly commandRunner: (command: string, args: string[]) => Promise<{ stdout: string }> = defaultCommandRunner\n ) {}\n\n async chat(request: ChatCompletionRequest, model: string, timeoutMs = this.config.requestTimeoutMs): Promise<unknown> {\n const url = new URL(this.config.openAiCompatiblePath, this.config.baseUrl);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const body = { ...request, model };\n delete body.router;\n if (!('stream' in body)) body.stream = false;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal\n });\n const payload = await safeJson(response);\n if (!response.ok) {\n throw new OllamaHttpError(response.status, payload);\n }\n return payload;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async tags(): Promise<unknown> {\n const response = await fetch(new URL(`${this.config.nativeApiBasePath}/tags`, this.config.baseUrl));\n const payload = await safeJson(response);\n if (!response.ok) throw new OllamaHttpError(response.status, payload);\n return payload;\n }\n\n async ps(): Promise<LoadedModel[]> {\n try {\n const { stdout } = await this.commandRunner('ollama', ['ps']);\n return parseOllamaPs(stdout);\n } catch {\n return [];\n }\n }\n}\n\nexport class OllamaHttpError extends Error {\n constructor(\n readonly statusCode: number,\n readonly payload: unknown\n ) {\n super(`Ollama HTTP request failed with status ${statusCode}`);\n }\n}\n\nexport function parseOllamaPs(output: string): LoadedModel[] {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n if (lines.length <= 1) return [];\n\n return lines.slice(1).map((line) => {\n const parts = line.split(/\\s{2,}/).filter(Boolean);\n if (parts.length >= 5) {\n return {\n name: parts[0],\n id: parts[1],\n size: parts[2],\n processor: parts[3],\n until: parts.slice(4).join(' ')\n };\n }\n\n const fallback = line.match(/^(\\S+)\\s+(\\S+)\\s+(.+?)\\s+((?:\\d+%\\s+)?(?:GPU|CPU)(?:\\/GPU)?)\\s+(.+)$/i);\n if (fallback) {\n return {\n name: fallback[1],\n id: fallback[2],\n size: fallback[3].trim(),\n processor: fallback[4].trim(),\n until: fallback[5].trim()\n };\n }\n\n return { name: parts[0] ?? line };\n });\n}\n\nasync function safeJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n return { raw: text };\n }\n}\n\nasync function defaultCommandRunner(command: string, args: string[]): Promise<{ stdout: string }> {\n const { stdout } = await execFileAsync(command, args, { timeout: 5000 });\n return { stdout };\n}\n","import { nanoid } from 'nanoid';\nimport { AppConfig, ChatCompletionRequest, JobRecord, JobStatus, TaskType } from './types.js';\n\nexport class InMemoryJobStore {\n private readonly jobs = new Map<string, JobRecord>();\n\n constructor(private readonly config: AppConfig['jobs']) {}\n\n create(input: {\n taskType: TaskType;\n selectedModel: string;\n request: ChatCompletionRequest;\n priority: number;\n }): JobRecord {\n const now = new Date();\n const record: JobRecord = {\n id: `job_${nanoid(16)}`,\n status: 'queued',\n task_type: input.taskType,\n selected_model: input.selectedModel,\n request_json: JSON.stringify(input.request),\n result_json: null,\n error_json: null,\n attempts: 0,\n priority: input.priority,\n created_at: now.toISOString(),\n started_at: null,\n finished_at: null,\n expires_at: new Date(now.getTime() + this.config.resultTtlSeconds * 1000).toISOString()\n };\n this.jobs.set(record.id, record);\n return { ...record };\n }\n\n get(id: string): JobRecord | undefined {\n const job = this.jobs.get(id);\n return job ? { ...job } : undefined;\n }\n\n list(limit = 50): JobRecord[] {\n return [...this.jobs.values()]\n .sort((a, b) => b.created_at.localeCompare(a.created_at))\n .slice(0, limit)\n .map((job) => ({ ...job }));\n }\n\n markRunning(id: string): JobRecord | undefined {\n const job = this.jobs.get(id);\n if (!job || (job.status !== 'queued' && job.status !== 'running')) return this.get(id);\n const now = new Date().toISOString();\n job.status = 'running';\n job.started_at ??= now;\n job.attempts += 1;\n return this.get(id);\n }\n\n markSucceeded(id: string, result: unknown): JobRecord | undefined {\n this.finish(id, 'succeeded', JSON.stringify(result), null);\n return this.get(id);\n }\n\n markFailed(id: string, error: unknown): JobRecord | undefined {\n this.finish(id, 'failed', null, JSON.stringify(normalizeError(error)));\n return this.get(id);\n }\n\n cancel(id: string): JobRecord | undefined {\n const job = this.jobs.get(id);\n if (!job) return undefined;\n if (job.status === 'queued' || job.status === 'running') {\n job.status = 'cancelled';\n job.finished_at = new Date().toISOString();\n }\n return this.get(id);\n }\n\n cleanupExpired(now = new Date()): number {\n let changed = 0;\n for (const job of this.jobs.values()) {\n if (\n job.expires_at &&\n job.expires_at < now.toISOString() &&\n ['queued', 'running', 'succeeded', 'failed'].includes(job.status)\n ) {\n job.status = 'expired';\n changed += 1;\n }\n }\n return changed;\n }\n\n close(): void {\n this.jobs.clear();\n }\n\n private finish(id: string, status: JobStatus, resultJson: string | null, errorJson: string | null): void {\n const job = this.jobs.get(id);\n if (!job || (job.status !== 'queued' && job.status !== 'running')) return;\n job.status = status;\n job.result_json = resultJson;\n job.error_json = errorJson;\n job.finished_at = new Date().toISOString();\n }\n}\n\nexport function parseJobResult(job: JobRecord): unknown {\n if (!job.result_json) return undefined;\n return JSON.parse(job.result_json);\n}\n\nexport function parseJobError(job: JobRecord): unknown {\n if (!job.error_json) return undefined;\n return JSON.parse(job.error_json);\n}\n\nfunction normalizeError(error: unknown): Record<string, unknown> {\n if (error instanceof Error) {\n return { message: error.message, name: error.name, stack: error.stack };\n }\n return { message: String(error), value: error };\n}\n","import PQueue from 'p-queue';\nimport { AppConfig, ChatCompletionRequest, Classification, ModelSpec } from './types.js';\nimport { OllamaClient } from './ollama.js';\nimport { InMemoryJobStore } from './job-store.js';\n\nexport interface QueueSnapshot {\n globalQueued: number;\n globalRunning: number;\n byModel: Array<{ model: string; queued: number; running: number; concurrency: number }>;\n}\n\nexport class QueueManager {\n private readonly queues = new Map<string, PQueue>();\n\n constructor(\n private readonly config: AppConfig,\n private readonly ollama: OllamaClient,\n private readonly jobs: InMemoryJobStore\n ) {\n for (const model of config.models) {\n this.queues.set(model.name, new PQueue({ concurrency: model.maxConcurrent }));\n }\n }\n\n async runSync(input: {\n model: ModelSpec;\n request: ChatCompletionRequest;\n priority: number;\n timeoutMs: number;\n }): Promise<{ result: unknown; queueTimeMs: number; executionTimeMs: number }> {\n this.ensureQueueCapacity();\n const queuedAt = Date.now();\n const result = await this.queueFor(input.model.name).add(\n async () => {\n const startedAt = Date.now();\n const result = await this.ollama.chat(input.request, input.model.name, Math.min(input.timeoutMs, input.model.timeoutMs));\n return { result, queueTimeMs: startedAt - queuedAt, executionTimeMs: Date.now() - startedAt };\n },\n { priority: input.priority, timeout: input.timeoutMs, throwOnTimeout: true }\n );\n return result;\n }\n\n enqueueAsync(input: {\n model: ModelSpec;\n request: ChatCompletionRequest;\n classification: Classification;\n priority: number;\n }): { id: string; position: number } {\n this.ensureQueueCapacity();\n const job = this.jobs.create({\n taskType: input.classification.taskType,\n selectedModel: input.model.name,\n request: input.request,\n priority: input.priority\n });\n\n const queue = this.queueFor(input.model.name);\n const position = queue.size + 1;\n void queue.add(() => this.runJob(job.id), {\n priority: input.priority,\n timeout: input.model.timeoutMs,\n throwOnTimeout: true\n });\n\n return { id: job.id, position };\n }\n\n snapshot(): QueueSnapshot {\n const byModel = [...this.queues.entries()].map(([model, queue]) => ({\n model,\n queued: queue.size,\n running: queue.pending,\n concurrency: this.config.models.find((spec) => spec.name === model)?.maxConcurrent ?? 1\n }));\n return {\n globalQueued: byModel.reduce((sum, item) => sum + item.queued, 0),\n globalRunning: byModel.reduce((sum, item) => sum + item.running, 0),\n byModel\n };\n }\n\n queueDepthByModel(): Map<string, number> {\n return new Map([...this.queues.entries()].map(([model, queue]) => [model, queue.size]));\n }\n\n runningByModel(): Map<string, number> {\n return new Map([...this.queues.entries()].map(([model, queue]) => [model, queue.pending]));\n }\n\n private async runJob(jobId: string): Promise<void> {\n const job = this.jobs.get(jobId);\n if (!job || job.status === 'cancelled') return;\n const modelName = job.selected_model;\n const model = this.config.models.find((spec) => spec.name === modelName);\n if (!model) {\n this.jobs.markFailed(jobId, new Error(`Configured model disappeared: ${modelName}`));\n return;\n }\n\n this.jobs.markRunning(jobId);\n try {\n const request = JSON.parse(job.request_json) as ChatCompletionRequest;\n const result = await this.ollama.chat(request, model.name, model.timeoutMs);\n this.jobs.markSucceeded(jobId, result);\n } catch (error) {\n const latest = this.jobs.get(jobId);\n if (latest && latest.attempts < this.config.jobs.maxAttempts && latest.status !== 'cancelled') {\n const queue = this.queueFor(model.name);\n void queue.add(() => this.runJob(jobId), {\n priority: latest.priority,\n timeout: model.timeoutMs,\n throwOnTimeout: true\n });\n } else {\n this.jobs.markFailed(jobId, error);\n }\n }\n }\n\n private ensureQueueCapacity(): void {\n const snapshot = this.snapshot();\n if (snapshot.globalQueued >= this.config.queue.globalMaxQueued) {\n throw new Error(`Global queue limit exceeded: ${this.config.queue.globalMaxQueued}`);\n }\n }\n\n private queueFor(model: string): PQueue {\n const queue = this.queues.get(model);\n if (!queue) throw new Error(`No queue configured for model: ${model}`);\n return queue;\n }\n}\n","import http from 'node:http';\nimport https from 'node:https';\nimport { readFile } from 'node:fs/promises';\nimport express, { NextFunction, Request, Response } from 'express';\nimport { pinoHttp } from 'pino-http';\nimport { z } from 'zod';\nimport { classifyTask } from './classifier.js';\nimport { AppConfig, ChatCompletionRequest } from './types.js';\nimport { GpuMonitor } from './gpu.js';\nimport { OllamaClient } from './ollama.js';\nimport { RoutingEngine, normalizeRouterMetadata, priorityWeights } from './router-engine.js';\nimport { QueueManager } from './queue-manager.js';\nimport { InMemoryJobStore, parseJobError, parseJobResult } from './job-store.js';\nimport { logger } from './logger.js';\n\nconst chatRequestSchema = z\n .object({\n model: z.string().optional(),\n messages: z.array(z.object({ role: z.string(), content: z.unknown() })).min(1),\n stream: z.boolean().optional(),\n router: z\n .object({\n mode: z.enum(['auto', 'sync', 'async']).optional(),\n allowAsync: z.boolean().optional(),\n taskType: z.string().optional(),\n priority: z.enum(['low', 'normal', 'high']).optional(),\n preferredModels: z.array(z.string()).optional(),\n forbiddenModels: z.array(z.string()).optional(),\n maxQueueTimeMs: z.number().int().nonnegative().optional(),\n maxExecutionTimeMs: z.number().int().positive().optional(),\n requireGpuOnly: z.boolean().optional()\n })\n .optional()\n })\n .passthrough();\n\nexport interface ServerDependencies {\n ollama: OllamaClient;\n gpu: GpuMonitor;\n jobs: InMemoryJobStore;\n queue: QueueManager;\n}\n\nexport function createApp(config: AppConfig, deps: ServerDependencies): express.Express {\n const app = express();\n const api = express.Router();\n const routing = new RoutingEngine(config);\n\n if (process.env.NODE_ENV !== 'test') {\n app.use(pinoHttp({ logger }));\n }\n app.use(express.json({ limit: config.server.requestBodyLimit }));\n\n api.get('/health', (_req, res) => {\n res.json({ status: 'ok', service: 'ollama-agent-router' });\n });\n\n api.get('/metrics', (_req, res) => {\n const snapshot = deps.queue.snapshot();\n res.type('text/plain').send(\n [\n `oar_queue_global_queued ${snapshot.globalQueued}`,\n `oar_queue_global_running ${snapshot.globalRunning}`,\n ...snapshot.byModel.flatMap((item) => [\n `oar_model_queue_depth{model=\"${escapeMetricLabel(item.model)}\"} ${item.queued}`,\n `oar_model_running{model=\"${escapeMetricLabel(item.model)}\"} ${item.running}`\n ])\n ].join('\\n')\n );\n });\n\n api.get('/v1/router/status', async (_req, res, next) => {\n try {\n res.json({\n service: 'ollama-agent-router',\n queue: deps.queue.snapshot(),\n gpu: await safeGpu(deps.gpu),\n loadedModels: await safeLoadedModels(deps.ollama),\n config: {\n models: config.models.length,\n routes: Object.keys(config.routes),\n basePath: normalizeBasePath(config.server.basePath),\n protocol: config.server.https.enabled ? 'https' : 'http'\n }\n });\n } catch (error) {\n next(error);\n }\n });\n\n api.get('/v1/router/models', async (_req, res, next) => {\n try {\n res.json({\n configured: config.models,\n ollama: await deps.ollama.tags(),\n loaded: await safeLoadedModels(deps.ollama)\n });\n } catch (error) {\n next(error);\n }\n });\n\n api.get('/v1/router/gpu', async (_req, res, next) => {\n try {\n res.json((await safeGpu(deps.gpu)) ?? { provider: config.gpu.provider, available: false });\n } catch (error) {\n next(error);\n }\n });\n\n api.get('/v1/jobs', (_req, res) => {\n res.json({ jobs: deps.jobs.list() });\n });\n\n api.get('/v1/jobs/:jobId', (req, res) => {\n const job = deps.jobs.get(req.params.jobId);\n if (!job) return res.status(404).json({ error: { message: 'Job not found' } });\n return res.json(job);\n });\n\n api.get('/v1/jobs/:jobId/result', (req, res) => {\n const job = deps.jobs.get(req.params.jobId);\n if (!job) return res.status(404).json({ error: { message: 'Job not found' } });\n if (job.status === 'failed') return res.status(500).json({ status: job.status, error: parseJobError(job) });\n if (job.status !== 'succeeded') return res.status(202).json({ status: job.status });\n return res.json(parseJobResult(job));\n });\n\n api.delete('/v1/jobs/:jobId', (req, res) => {\n const job = deps.jobs.cancel(req.params.jobId);\n if (!job) return res.status(404).json({ error: { message: 'Job not found' } });\n return res.json(job);\n });\n\n api.post('/v1/chat/completions', async (req, res, next) => {\n try {\n const request = chatRequestSchema.parse(req.body) as ChatCompletionRequest;\n if (request.stream) {\n return res.status(400).json({ error: { message: 'Streaming is not supported by ollama-agent-router v1' } });\n }\n\n const router = normalizeRouterMetadata(config, request.router);\n const classification = classifyTask(request, router.taskType);\n const loadedModels = await safeLoadedModels(deps.ollama);\n const gpu = await safeGpu(deps.gpu);\n const decision = routing.decide({\n request,\n router,\n classification,\n loadedModels,\n gpu,\n queueDepthByModel: deps.queue.queueDepthByModel(),\n runningByModel: deps.queue.runningByModel()\n });\n\n if (decision.type === 'reject') {\n return res.status(decision.statusCode).json({ error: { message: decision.reason } });\n }\n\n const priority = priorityWeights[router.priority];\n if (decision.type === 'async') {\n const job = deps.queue.enqueueAsync({\n model: decision.model,\n request,\n classification,\n priority\n });\n return res.status(202).json({\n id: job.id,\n object: 'router.job',\n status: 'queued',\n message: 'Heavy load. Job accepted for asynchronous processing.',\n router: {\n mode: 'async',\n taskType: classification.taskType,\n preferredModel: decision.model.name,\n position: job.position,\n estimatedClass: classification.complexity\n }\n });\n }\n\n const output = await deps.queue.runSync({\n model: decision.model,\n request,\n priority,\n timeoutMs: router.maxExecutionTimeMs\n });\n return res.json(\n withRouterMetadata(output.result, {\n mode: 'sync',\n taskType: classification.taskType,\n selectedModel: decision.model.name,\n fallbackModels: decision.fallbackModels.filter((name) => name !== decision.model.name),\n queueTimeMs: output.queueTimeMs,\n executionTimeMs: output.executionTimeMs,\n decisionReason: decision.reason\n })\n );\n } catch (error) {\n next(error);\n }\n });\n\n app.use(normalizeBasePath(config.server.basePath), api);\n\n app.use((error: unknown, _req: Request, res: Response, _next: NextFunction) => {\n const message = error instanceof Error ? error.message : String(error);\n const status = error instanceof z.ZodError ? 400 : 500;\n res.status(status).json({ error: { message } });\n });\n\n return app;\n}\n\nexport async function startServer(config: AppConfig, deps: ServerDependencies): Promise<{ close: () => Promise<void> }> {\n const app = createApp(config, deps);\n const server = await createHttpServer(config, app);\n server.listen(config.server.port, config.server.host);\n await new Promise<void>((resolve) => server.once('listening', resolve));\n logger.info(\n {\n host: config.server.host,\n port: config.server.port,\n basePath: normalizeBasePath(config.server.basePath),\n protocol: config.server.https.enabled ? 'https' : 'http'\n },\n 'ollama-agent-router listening'\n );\n return {\n close: () =>\n new Promise((resolve, reject) => {\n server.close((error) => (error ? reject(error) : resolve()));\n })\n };\n}\n\nexport function normalizeBasePath(basePath: string): string {\n const trimmed = basePath.trim();\n if (!trimmed || trimmed === '/') return '/';\n return `/${trimmed.replace(/^\\/+|\\/+$/g, '')}`;\n}\n\nasync function createHttpServer(config: AppConfig, app: express.Express): Promise<http.Server | https.Server> {\n if (!config.server.https.enabled) {\n return http.createServer(app);\n }\n if (!config.server.https.certPath || !config.server.https.keyPath) {\n throw new Error('server.https.certPath and server.https.keyPath are required when HTTPS is enabled');\n }\n return https.createServer(\n {\n cert: await readFile(config.server.https.certPath),\n key: await readFile(config.server.https.keyPath),\n ca: config.server.https.caPath ? await readFile(config.server.https.caPath) : undefined\n },\n app\n );\n}\n\nfunction withRouterMetadata(result: unknown, router: Record<string, unknown>): unknown {\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n return { ...(result as Record<string, unknown>), router };\n }\n return { result, router };\n}\n\nasync function safeLoadedModels(ollama: OllamaClient) {\n try {\n return await ollama.ps();\n } catch {\n return [];\n }\n}\n\nasync function safeGpu(gpu: GpuMonitor) {\n try {\n return await gpu.snapshot();\n } catch {\n return undefined;\n }\n}\n\nfunction escapeMetricLabel(label: string): string {\n return label.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"');\n}\n","import { ChatCompletionRequest, Classification, TaskType } from './types.js';\n\nconst codeMarkers = [\n 'typescript',\n 'javascript',\n 'node.js',\n 'python',\n 'function',\n 'class ',\n 'stack trace',\n 'exception',\n 'compile',\n 'refactor',\n 'pull request',\n 'diff --git',\n '```'\n];\n\nconst toolMarkers = ['tool', 'function call', 'json schema', 'api call', 'webhook', 'bash', 'shell command'];\nconst reasoningMarkers = ['plan', 'architecture', 'design', 'debug', 'investigate', 'root cause', 'step by step'];\nconst summarizeMarkers = ['summarize', 'summary', 'tl;dr', 'extract key points'];\nconst reviewMarkers = ['review', 'audit', 'risks', 'find bugs', 'code review'];\nconst fixMarkers = ['fix', 'bug', 'failing test', 'patch', 'regression'];\nconst generateMarkers = ['write', 'implement', 'create', 'generate', 'build'];\n\nexport function classifyTask(request: ChatCompletionRequest, explicitTaskType?: TaskType | 'auto'): Classification {\n if (explicitTaskType && explicitTaskType !== 'auto') {\n return {\n taskType: explicitTaskType,\n complexity: explicitTaskType === 'agentic_reasoning' || explicitTaskType === 'large_context' ? 'heavy' : 'medium',\n requiresLargeContext: explicitTaskType === 'large_context',\n requiresToolUse: explicitTaskType === 'tool_use',\n confidence: 1\n };\n }\n\n const text = extractMessageText(request).toLowerCase();\n const tokenEstimate = Math.ceil(text.length / 4);\n const hasCode = containsAny(text, codeMarkers);\n const requiresToolUse = containsAny(text, toolMarkers);\n const requiresLargeContext = tokenEstimate > 12000 || text.includes('large context') || text.includes('entire repository');\n\n let taskType: TaskType = 'simple_chat';\n let confidence = 0.55;\n\n if (requiresLargeContext) {\n taskType = 'large_context';\n confidence = 0.8;\n } else if (requiresToolUse) {\n taskType = 'tool_use';\n confidence = 0.75;\n } else if (containsAny(text, reviewMarkers) && hasCode) {\n taskType = 'code_review';\n confidence = 0.82;\n } else if (containsAny(text, fixMarkers) && hasCode) {\n taskType = 'code_fix';\n confidence = 0.8;\n } else if (containsAny(text, generateMarkers) && hasCode) {\n taskType = 'code_generate';\n confidence = 0.78;\n } else if (containsAny(text, summarizeMarkers)) {\n taskType = 'summarize';\n confidence = 0.86;\n } else if (containsAny(text, reasoningMarkers) && (text.length > 1200 || text.includes('multi-step'))) {\n taskType = 'agentic_reasoning';\n confidence = 0.72;\n } else if (text.length < 180 && (text.includes('classify') || text.includes('route') || text.includes('triage'))) {\n taskType = 'triage';\n confidence = 0.7;\n }\n\n const complexity = classifyComplexity(text, taskType, tokenEstimate);\n return { taskType, complexity, requiresLargeContext, requiresToolUse, confidence };\n}\n\nexport function extractMessageText(request: Pick<ChatCompletionRequest, 'messages'>): string {\n return request.messages\n .map((message) => {\n if (typeof message.content === 'string') return message.content;\n if (Array.isArray(message.content)) {\n return message.content\n .map((part) => {\n if (typeof part === 'string') return part;\n if (part && typeof part === 'object' && 'text' in part) return String(part.text ?? '');\n return '';\n })\n .join('\\n');\n }\n return JSON.stringify(message.content ?? '');\n })\n .join('\\n');\n}\n\nfunction classifyComplexity(text: string, taskType: TaskType, tokenEstimate: number): Classification['complexity'] {\n if (taskType === 'large_context' || taskType === 'agentic_reasoning' || tokenEstimate > 12000) return 'heavy';\n if (tokenEstimate > 3000 || text.includes('architecture') || text.includes('debug')) return 'medium';\n if (taskType.startsWith('code_') || taskType === 'tool_use') return 'medium';\n return 'light';\n}\n\nfunction containsAny(text: string, markers: string[]): boolean {\n return markers.some((marker) => text.includes(marker));\n}\n","import { AppConfig, ModelSpec, RouteContext, RouteDecision, RouterRequestMetadata } from './types.js';\n\nexport const priorityWeights = {\n low: 10,\n normal: 50,\n high: 90\n} as const;\n\nexport function normalizeRouterMetadata(config: AppConfig, metadata: RouterRequestMetadata = {}): Required<RouterRequestMetadata> {\n return {\n mode: metadata.mode ?? config.router.defaultMode,\n allowAsync: metadata.allowAsync ?? true,\n taskType: metadata.taskType ?? 'auto',\n priority: metadata.priority ?? config.queue.defaultPriority,\n preferredModels: metadata.preferredModels ?? [],\n forbiddenModels: metadata.forbiddenModels ?? [],\n maxQueueTimeMs: metadata.maxQueueTimeMs ?? config.router.syncMaxQueueTimeMs,\n maxExecutionTimeMs: metadata.maxExecutionTimeMs ?? config.queue.timeoutMs,\n requireGpuOnly: metadata.requireGpuOnly ?? config.gpu.requireGpuOnlyByDefault\n };\n}\n\nexport class RoutingEngine {\n private readonly modelsByName: Map<string, ModelSpec>;\n\n constructor(private readonly config: AppConfig) {\n this.modelsByName = new Map(config.models.map((model) => [model.name, model]));\n }\n\n decide(context: RouteContext): RouteDecision {\n const candidates = this.getCandidates(context);\n if (candidates.length === 0) {\n return { type: 'reject', statusCode: 503, reason: 'No configured model can satisfy this request' };\n }\n\n const blocked = candidates\n .map((model) => ({ model, blockReason: this.blockReason(model, context) }))\n .filter((entry) => entry.blockReason);\n const available = candidates.filter((model) => !this.blockReason(model, context));\n const scoredAvailable = available.map((model) => this.score(model, context)).sort((a, b) => b.score - a.score);\n const fallbackModels = candidates.map((model) => model.name);\n\n if (context.router.mode === 'async') {\n const model = (scoredAvailable[0]?.model ?? candidates[0]) as ModelSpec;\n return {\n type: 'async',\n model,\n fallbackModels,\n reason: 'Request explicitly requested async mode',\n score: scoredAvailable[0]?.score ?? 0,\n position: (context.queueDepthByModel.get(model.name) ?? 0) + 1\n };\n }\n\n const preferredBusy = this.preferredBusyModel(candidates, context);\n const totalQueueDepth = [...context.queueDepthByModel.values()].reduce((sum, depth) => sum + depth, 0);\n const gpuHeavy = Boolean(\n context.gpu && context.gpu.vramFreeMb < this.config.router.heavyLoadGpuFreeMbThreshold\n );\n const heavyLoad = totalQueueDepth >= this.config.router.heavyLoadQueueDepth || gpuHeavy;\n\n if (context.router.mode !== 'sync' && context.router.allowAsync && (heavyLoad || preferredBusy)) {\n const model = preferredBusy ?? scoredAvailable[0]?.model ?? candidates[0];\n return {\n type: 'async',\n model,\n fallbackModels,\n reason: preferredBusy ? 'Preferred model is busy; accepted for async processing' : 'Heavy load detected',\n score: this.score(model, context).score,\n position: (context.queueDepthByModel.get(model.name) ?? 0) + 1\n };\n }\n\n if (scoredAvailable.length > 0) {\n return {\n type: 'sync',\n model: scoredAvailable[0].model,\n fallbackModels,\n reason: scoredAvailable[0].reason,\n score: scoredAvailable[0].score\n };\n }\n\n if (blocked.some((entry) => entry.blockReason === 'busy') && context.router.allowAsync && context.router.mode !== 'sync') {\n const model = blocked[0].model;\n return {\n type: 'async',\n model,\n fallbackModels,\n reason: 'Selected model is busy; accepted for async processing',\n score: 0,\n position: (context.queueDepthByModel.get(model.name) ?? 0) + 1\n };\n }\n\n const reason = blocked.map((entry) => `${entry.model.name}: ${entry.blockReason}`).join('; ');\n return { type: 'reject', statusCode: 503, reason: reason || 'No model available' };\n }\n\n score(model: ModelSpec, context: RouteContext): { model: ModelSpec; score: number; reason: string } {\n const route = this.config.routes[context.classification.taskType] ?? this.config.routes.unknown ?? [];\n const routeIndex = route.indexOf(model.name);\n const loaded = context.loadedModels.some((loadedModel) => loadedModel.name === model.name);\n const queueDepth = context.queueDepthByModel.get(model.name) ?? 0;\n const running = context.runningByModel.get(model.name) ?? 0;\n const preferredIndex = context.router.preferredModels.indexOf(model.name);\n const freeMb = context.gpu?.vramFreeMb ?? this.config.gpu.vramTotalMb;\n const requiredMb = model.sizeGb * 1024 + this.config.gpu.vramSafetyReserveMb;\n\n let score = 100;\n score += Math.max(0, 50 - routeIndex * 8);\n score += model.priority;\n if (model.purpose.includes(context.classification.taskType)) score += 25;\n if (model.tags.includes(context.classification.taskType)) score += 15;\n if (preferredIndex >= 0) score += 80 - preferredIndex * 10;\n if (loaded) score += 20;\n if (context.classification.complexity === 'heavy' && model.costClass === 'high') score += 20;\n if (context.classification.complexity === 'light' && model.costClass === 'low') score += 15;\n if (freeMb > requiredMb) score += Math.min(25, (freeMb - requiredMb) / 512);\n if (freeMb < requiredMb) score -= 60;\n score -= queueDepth * 18;\n score -= running * 25;\n if (model.exclusive) score -= running * 80;\n\n return {\n model,\n score,\n reason: `Selected ${model.name} for ${context.classification.taskType} with score ${score.toFixed(1)}`\n };\n }\n\n private getCandidates(context: RouteContext): ModelSpec[] {\n const routeNames = this.config.routes[context.classification.taskType] ?? this.config.routes.unknown ?? [];\n const names = new Set<string>();\n for (const name of context.router.preferredModels) names.add(name);\n for (const name of routeNames) names.add(name);\n for (const model of this.config.models) {\n if (model.purpose.includes(context.classification.taskType) || model.tags.includes(context.classification.taskType)) {\n names.add(model.name);\n }\n }\n\n return [...names]\n .map((name) => this.modelsByName.get(name))\n .filter((model): model is ModelSpec => Boolean(model))\n .filter((model) => !context.router.forbiddenModels.includes(model.name));\n }\n\n private blockReason(model: ModelSpec, context: RouteContext): 'gpu_only' | 'busy' | undefined {\n const loaded = context.loadedModels.find((loadedModel) => loadedModel.name === model.name);\n const processor = loaded?.processor?.toLowerCase() ?? '';\n if (context.router.requireGpuOnly) {\n if (!context.gpu && this.config.gpu.vramTotalMb <= 0) return 'gpu_only';\n if (processor.includes('cpu') && !processor.includes('100% gpu')) return 'gpu_only';\n const freeMb = context.gpu?.vramFreeMb ?? this.config.gpu.vramTotalMb;\n if (model.sizeGb * 1024 + this.config.gpu.vramSafetyReserveMb > freeMb && !loaded) return 'gpu_only';\n }\n\n const running = context.runningByModel.get(model.name) ?? 0;\n if ((model.exclusive && running > 0) || (!model.allowWhenBusy && running >= model.maxConcurrent)) {\n return 'busy';\n }\n return undefined;\n }\n\n private preferredBusyModel(candidates: ModelSpec[], context: RouteContext): ModelSpec | undefined {\n const preferredNames = new Set(context.router.preferredModels);\n const ordered = preferredNames.size > 0 ? candidates.filter((model) => preferredNames.has(model.name)) : candidates.slice(0, 1);\n return ordered.find((model) => this.blockReason(model, context) === 'busy');\n }\n}\n","import pino from 'pino';\n\nexport const logger = pino({\n level: process.env.LOG_LEVEL ?? 'info'\n});\n"],"mappings":"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","names":["readFile","access","mkdir","readFile","writeFile","dirname","resolve","execFile","promisify","YAML","z","output","execFile","promisify","execFileAsync","defaultCommandRunner","output","execFileAsync","promisify","execFile","z","mkdir","dirname","resolve","writeFile","defaultCommandRunner","YAML","readFile","access","input","input","result","readFile","z","z","output","resolve","readFile","readFile","normalizeBasePath"]}
1
+ {"version":3,"sources":["../src/cli-program.ts","../src/config.ts","../src/types.ts","../src/configurator.ts","../src/gpu.ts","../src/ollama.ts","../src/job-store.ts","../src/queue-manager.ts","../src/server.ts","../src/classifier.ts","../src/router-engine.ts","../src/logger.ts","../src/cli.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { readFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { loadConfig, parseConfig, writeDefaultConfig } from './config.js';\nimport { runConfigure } from './configurator.js';\nimport { NvidiaGpuMonitor } from './gpu.js';\nimport { InMemoryJobStore } from './job-store.js';\nimport { HttpOllamaClient } from './ollama.js';\nimport { QueueManager } from './queue-manager.js';\nimport { startServer } from './server.js';\nimport { logger } from './logger.js';\n\nconst packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { version: string };\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('ollama-agent-router')\n .alias('oar')\n .description('Intelligent HTTP/CLI router for Ollama')\n .version(packageJson.version, '-v, --version', 'display version')\n .option('-c, --config <path>', 'config file path')\n .option('-u, --url <url>', 'router URL for client commands', 'http://127.0.0.1:11435')\n .option('--base-path <path>', 'router API base path for client commands', '/');\n\n program\n .command('serve')\n .description('start the router server')\n .option('-c, --config <path>', 'config file path')\n .action(async (options) => {\n const { config, path } = await loadConfig(options.config ?? program.opts().config);\n const jobs = new InMemoryJobStore(config.jobs);\n const ollama = new HttpOllamaClient(config.ollama);\n const gpu = new NvidiaGpuMonitor(config.gpu);\n const queue = new QueueManager(config, ollama, jobs);\n const cleanup = setInterval(() => jobs.cleanupExpired(), config.jobs.cleanupIntervalMs);\n const server = await startServer(config, { ollama, gpu, jobs, queue });\n logger.info({ configPath: path }, 'loaded config');\n\n const shutdown = async () => {\n clearInterval(cleanup);\n await server.close();\n jobs.close();\n process.exit(0);\n };\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n });\n\n program\n .command('init')\n .description('write a starter config')\n .option('-o, --output <path>', 'output path', './ollama-agent-router.yaml')\n .option('--wizard', 'run the detect-first configuration wizard')\n .action(async (options) => {\n if (options.wizard) {\n await runConfigure({ outputPath: options.output });\n return;\n }\n await writeDefaultConfig(options.output);\n console.log(`Wrote ${options.output}`);\n });\n\n program\n .command('configure')\n .description('run the detect-first configuration wizard')\n .option('-o, --output <path>', 'output path', './ollama-agent-router.yaml')\n .option('--answers <path>', 'answers YAML for non-interactive mode')\n .option('--non-interactive', 'generate config without interactive prompts')\n .option('--detect', 'print detected environment and exit')\n .option('--dry-run', 'print generated YAML without writing')\n .option('--overwrite', 'overwrite output if it already exists')\n .option('-y, --yes', 'accept detected values and write without confirmation')\n .action(async (options) => {\n await runConfigure({\n outputPath: options.output,\n answersPath: options.answers,\n nonInteractive: options.nonInteractive || options.yes,\n detectOnly: options.detect,\n dryRun: options.dryRun,\n overwrite: options.overwrite,\n assumeYes: options.yes\n });\n });\n\n program\n .command('validate-config')\n .description('validate YAML configuration')\n .option('-c, --config <path>', 'config file path')\n .action(async (options) => {\n const path = options.config ?? program.opts().config;\n if (path) {\n parseConfig(await readFile(path, 'utf8'));\n console.log(`Config is valid: ${path}`);\n return;\n }\n const found = await loadConfig();\n console.log(`Config is valid: ${found.path}`);\n });\n\n program.command('status').description('show router status').action(() => printJson(program, '/v1/router/status'));\n program.command('models').description('show configured and Ollama models').action(() => printJson(program, '/v1/router/models'));\n program.command('gpu').description('show GPU state').action(() => printJson(program, '/v1/router/gpu'));\n program.command('jobs').description('list jobs').action(() => printJson(program, '/v1/jobs'));\n program.command('job <jobId>').description('show job').action((jobId) => printJson(program, `/v1/jobs/${jobId}`));\n program.command('result <jobId>').description('show job result').action((jobId) => printJson(program, `/v1/jobs/${jobId}/result`));\n program\n .command('cancel <jobId>')\n .description('cancel a job')\n .action((jobId) => printJson(program, `/v1/jobs/${jobId}`, { method: 'DELETE' }));\n\n return program;\n}\n\nasync function printJson(program: Command, path: string, init?: RequestInit): Promise<void> {\n const response = await fetch(buildClientUrl(program, path), init);\n const text = await response.text();\n if (!response.ok) {\n throw new Error(text || `HTTP ${response.status}`);\n }\n try {\n console.log(JSON.stringify(JSON.parse(text), null, 2));\n } catch {\n console.log(text);\n }\n}\n\nfunction buildClientUrl(program: Command, path: string): URL {\n const options = program.opts() as { url: string; basePath: string };\n const url = new URL(options.url);\n const basePath = normalizeBasePath(options.basePath);\n const pieces = [url.pathname, basePath, path].map((piece) => piece.replace(/^\\/+|\\/+$/g, '')).filter(Boolean);\n url.pathname = `/${pieces.join('/')}`;\n return url;\n}\n\nfunction normalizeBasePath(basePath: string): string {\n const trimmed = basePath.trim();\n if (!trimmed || trimmed === '/') return '/';\n return `/${trimmed.replace(/^\\/+|\\/+$/g, '')}`;\n}\n","import { existsSync } from 'node:fs';\nimport { access, readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport YAML from 'yaml';\nimport { z } from 'zod';\nimport { AppConfig, taskTypes } from './types.js';\n\nconst taskTypeSchema = z.enum(taskTypes);\nconst optionalStringSchema = z.preprocess((value) => (value === null ? undefined : value), z.string().min(1).optional());\n\nexport const modelSpecSchema = z.object({\n name: z.string().min(1),\n sizeGb: z.number().positive(),\n purpose: z.array(z.string()).default([]),\n priority: z.number().default(50),\n maxConcurrent: z.number().int().positive(),\n defaultContext: z.number().int().positive(),\n maxContext: z.number().int().positive(),\n timeoutMs: z.number().int().positive(),\n costClass: z.enum(['low', 'medium', 'high']).default('medium'),\n exclusive: z.boolean().default(false),\n allowWhenBusy: z.boolean().default(false),\n tags: z.array(z.string()).default([])\n});\n\nexport const appConfigSchema = z.object({\n server: z.object({\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n basePath: z.string().min(1).default('/'),\n requestBodyLimit: z.string().min(1),\n https: z\n .object({\n enabled: z.boolean().default(false),\n certPath: optionalStringSchema,\n keyPath: optionalStringSchema,\n caPath: optionalStringSchema\n })\n .default({ enabled: false })\n }),\n ollama: z.object({\n baseUrl: z.string().url(),\n openAiCompatiblePath: z.string().min(1).default('/v1/chat/completions'),\n nativeApiBasePath: z.string().min(1).default('/api'),\n keepAlive: z.string().default('5m'),\n requestTimeoutMs: z.number().int().positive()\n }),\n gpu: z.object({\n provider: z.enum(['none', 'nvidia']).default('none'),\n name: z.string().optional(),\n vramTotalMb: z.number().nonnegative(),\n vramSafetyReserveMb: z.number().nonnegative(),\n maxGpuUtilizationPct: z.number().min(1).max(100),\n requireGpuOnlyByDefault: z.boolean().default(false),\n monitor: z.object({\n enabled: z.boolean().default(false),\n intervalMs: z.number().int().positive(),\n nvidiaSmiPath: z.string().min(1).default('nvidia-smi')\n })\n }),\n router: z.object({\n defaultMode: z.enum(['auto', 'sync', 'async']).default('auto'),\n syncMaxQueueTimeMs: z.number().int().nonnegative(),\n heavyLoadQueueDepth: z.number().int().nonnegative(),\n heavyLoadGpuFreeMbThreshold: z.number().int().nonnegative(),\n defaultTaskType: taskTypeSchema.default('unknown'),\n classification: z.object({\n mode: z.enum(['heuristic', 'model']).default('heuristic'),\n optionalClassifierModel: z.string().optional(),\n classifierTimeoutMs: z.number().int().positive()\n })\n }),\n jobs: z.object({\n store: z.literal('memory').default('memory'),\n resultTtlSeconds: z.number().int().positive(),\n maxAttempts: z.number().int().positive(),\n cleanupIntervalMs: z.number().int().positive()\n }),\n models: z.array(modelSpecSchema).min(1),\n routes: z.record(z.string(), z.array(z.string())),\n queue: z.object({\n globalMaxConcurrent: z.number().int().positive(),\n globalMaxQueued: z.number().int().nonnegative(),\n perUserMaxQueued: z.number().int().nonnegative(),\n defaultPriority: z.enum(['low', 'normal', 'high']).default('normal'),\n timeoutMs: z.number().int().positive()\n })\n});\n\nexport const configLookupOrder = (explicitPath?: string): string[] => {\n const paths = [\n './ollama-agent-router.yaml',\n `${homedir()}/.config/ollama-agent-router/config.yaml`,\n '/etc/ollama-agent-router/config.yaml'\n ];\n return explicitPath ? [explicitPath, ...paths] : paths;\n};\n\nexport async function findConfigPath(explicitPath?: string): Promise<string> {\n for (const candidate of configLookupOrder(explicitPath)) {\n const path = resolve(candidate);\n try {\n await access(path);\n return path;\n } catch {\n // Try the next lookup path.\n }\n }\n throw new Error(`No config file found. Tried: ${configLookupOrder(explicitPath).join(', ')}`);\n}\n\nexport async function loadConfig(explicitPath?: string): Promise<{ path: string; config: AppConfig }> {\n const path = await findConfigPath(explicitPath);\n const raw = await readFile(path, 'utf8');\n return { path, config: parseConfig(raw) };\n}\n\nexport function parseConfig(raw: string): AppConfig {\n const parsed = YAML.parse(raw);\n const config = appConfigSchema.parse(parsed) as AppConfig;\n if (config.server.https.enabled && (!config.server.https.certPath || !config.server.https.keyPath)) {\n throw new Error('server.https.certPath and server.https.keyPath are required when HTTPS is enabled');\n }\n const modelNames = new Set(config.models.map((model) => model.name));\n const missingRoutes = Object.entries(config.routes)\n .flatMap(([taskType, names]) => (names ?? []).map((name) => ({ taskType, name })))\n .filter(({ name }) => !modelNames.has(name));\n if (missingRoutes.length > 0) {\n const formatted = missingRoutes.map((route) => `${route.taskType}:${route.name}`).join(', ');\n throw new Error(`Routes reference unknown models: ${formatted}`);\n }\n return config;\n}\n\nexport async function writeDefaultConfig(path: string): Promise<void> {\n const target = resolve(path);\n if (existsSync(target)) {\n throw new Error(`Refusing to overwrite existing config: ${target}`);\n }\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, defaultConfigYaml, 'utf8');\n}\n\nexport const defaultConfigYaml = `server:\n host: 127.0.0.1\n port: 11435\n basePath: /\n requestBodyLimit: 4mb\n https:\n enabled: false\n certPath:\n keyPath:\n caPath:\nollama:\n baseUrl: http://127.0.0.1:11434\n openAiCompatiblePath: /v1/chat/completions\n nativeApiBasePath: /api\n keepAlive: 5m\n requestTimeoutMs: 120000\ngpu:\n provider: none\n name: Local GPU\n vramTotalMb: 0\n vramSafetyReserveMb: 1024\n maxGpuUtilizationPct: 95\n requireGpuOnlyByDefault: false\n monitor:\n enabled: false\n intervalMs: 5000\n nvidiaSmiPath: nvidia-smi\nrouter:\n defaultMode: auto\n syncMaxQueueTimeMs: 250\n heavyLoadQueueDepth: 4\n heavyLoadGpuFreeMbThreshold: 2048\n defaultTaskType: unknown\n classification:\n mode: heuristic\n optionalClassifierModel:\n classifierTimeoutMs: 1500\njobs:\n store: memory\n resultTtlSeconds: 86400\n maxAttempts: 2\n cleanupIntervalMs: 60000\nmodels:\n - name: llama3.2:3b\n sizeGb: 2.0\n purpose: [simple_chat, summarize, triage]\n priority: 50\n maxConcurrent: 1\n defaultContext: 4096\n maxContext: 8192\n timeoutMs: 120000\n costClass: low\n exclusive: false\n allowWhenBusy: true\n tags: [general]\nroutes:\n triage: [llama3.2:3b]\n simple_chat: [llama3.2:3b]\n summarize: [llama3.2:3b]\n code_generate: [llama3.2:3b]\n code_review: [llama3.2:3b]\n code_fix: [llama3.2:3b]\n agentic_reasoning: [llama3.2:3b]\n large_context: [llama3.2:3b]\n tool_use: [llama3.2:3b]\n unknown: [llama3.2:3b]\nqueue:\n globalMaxConcurrent: 2\n globalMaxQueued: 100\n perUserMaxQueued: 20\n defaultPriority: normal\n timeoutMs: 120000\n`;\n","export const taskTypes = [\n 'triage',\n 'simple_chat',\n 'summarize',\n 'code_generate',\n 'code_review',\n 'code_fix',\n 'agentic_reasoning',\n 'large_context',\n 'tool_use',\n 'unknown'\n] as const;\n\nexport type TaskType = (typeof taskTypes)[number];\nexport type RouterMode = 'auto' | 'sync' | 'async';\nexport type PriorityName = 'low' | 'normal' | 'high';\nexport type Complexity = 'light' | 'medium' | 'heavy';\nexport type JobStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled' | 'expired';\n\nexport interface RouterRequestMetadata {\n mode?: RouterMode;\n allowAsync?: boolean;\n taskType?: TaskType | 'auto';\n priority?: PriorityName;\n preferredModels?: string[];\n forbiddenModels?: string[];\n maxQueueTimeMs?: number;\n maxExecutionTimeMs?: number;\n requireGpuOnly?: boolean;\n}\n\nexport interface ChatCompletionRequest {\n model?: string;\n messages: Array<{ role: string; content: unknown }>;\n stream?: boolean;\n router?: RouterRequestMetadata;\n [key: string]: unknown;\n}\n\nexport interface Classification {\n taskType: TaskType;\n complexity: Complexity;\n requiresLargeContext: boolean;\n requiresToolUse: boolean;\n confidence: number;\n}\n\nexport interface GpuSnapshot {\n name: string;\n vramTotalMb: number;\n vramUsedMb: number;\n vramFreeMb: number;\n utilizationPct: number;\n}\n\nexport interface LoadedModel {\n name: string;\n id?: string;\n size?: string;\n processor?: string;\n until?: string;\n}\n\nexport interface ModelSpec {\n name: string;\n sizeGb: number;\n purpose: string[];\n priority: number;\n maxConcurrent: number;\n defaultContext: number;\n maxContext: number;\n timeoutMs: number;\n costClass: 'low' | 'medium' | 'high';\n exclusive: boolean;\n allowWhenBusy: boolean;\n tags: string[];\n}\n\nexport interface AppConfig {\n server: {\n host: string;\n port: number;\n basePath: string;\n requestBodyLimit: string;\n https: {\n enabled: boolean;\n certPath?: string;\n keyPath?: string;\n caPath?: string;\n };\n };\n ollama: {\n baseUrl: string;\n openAiCompatiblePath: string;\n nativeApiBasePath: string;\n keepAlive: string;\n requestTimeoutMs: number;\n };\n gpu: {\n provider: 'none' | 'nvidia';\n name?: string;\n vramTotalMb: number;\n vramSafetyReserveMb: number;\n maxGpuUtilizationPct: number;\n requireGpuOnlyByDefault: boolean;\n monitor: {\n enabled: boolean;\n intervalMs: number;\n nvidiaSmiPath: string;\n };\n };\n router: {\n defaultMode: RouterMode;\n syncMaxQueueTimeMs: number;\n heavyLoadQueueDepth: number;\n heavyLoadGpuFreeMbThreshold: number;\n defaultTaskType: TaskType;\n classification: {\n mode: 'heuristic' | 'model';\n optionalClassifierModel?: string;\n classifierTimeoutMs: number;\n };\n };\n jobs: {\n store: 'memory';\n resultTtlSeconds: number;\n maxAttempts: number;\n cleanupIntervalMs: number;\n };\n models: ModelSpec[];\n routes: Partial<Record<TaskType | string, string[]>>;\n queue: {\n globalMaxConcurrent: number;\n globalMaxQueued: number;\n perUserMaxQueued: number;\n defaultPriority: PriorityName;\n timeoutMs: number;\n };\n}\n\nexport interface RouteContext {\n request: ChatCompletionRequest;\n router: Required<RouterRequestMetadata>;\n classification: Classification;\n gpu?: GpuSnapshot;\n loadedModels: LoadedModel[];\n queueDepthByModel: Map<string, number>;\n runningByModel: Map<string, number>;\n}\n\nexport type RouteDecision =\n | {\n type: 'sync';\n model: ModelSpec;\n fallbackModels: string[];\n reason: string;\n score: number;\n }\n | {\n type: 'async';\n model: ModelSpec;\n fallbackModels: string[];\n reason: string;\n score: number;\n position: number;\n }\n | {\n type: 'reject';\n reason: string;\n statusCode: number;\n };\n\nexport interface JobRecord {\n id: string;\n status: JobStatus;\n task_type: TaskType;\n selected_model: string | null;\n request_json: string;\n result_json: string | null;\n error_json: string | null;\n attempts: number;\n priority: number;\n created_at: string;\n started_at: string | null;\n finished_at: string | null;\n expires_at: string | null;\n}\n","import { access, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { createInterface } from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'node:process';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport os from 'node:os';\nimport YAML from 'yaml';\nimport { z } from 'zod';\nimport { parseConfig } from './config.js';\nimport { parseNvidiaSmi } from './gpu.js';\nimport { parseOllamaPs } from './ollama.js';\nimport { AppConfig, LoadedModel, ModelSpec, TaskType } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface DetectionResult<T> {\n value?: T;\n source: 'command' | 'env' | 'default' | 'manual' | 'not_found';\n confidence: 'high' | 'medium' | 'low';\n message?: string;\n}\n\nexport interface DetectedOllamaModel {\n name: string;\n id?: string;\n size?: string;\n sizeGb?: number;\n modified?: string;\n}\n\nexport interface MachineProfile {\n platform: NodeJS.Platform;\n arch: string;\n cpuCores: number;\n totalMemoryMb: number;\n class: 'small' | 'medium' | 'large';\n}\n\nexport interface WizardDetection {\n ollamaBinary: DetectionResult<string>;\n ollamaBaseUrl: DetectionResult<string>;\n ollamaReachable: DetectionResult<boolean>;\n ollamaModels: DetectionResult<DetectedOllamaModel[]>;\n loadedModels: DetectionResult<LoadedModel[]>;\n nvidiaSmiPath: DetectionResult<string>;\n gpu: DetectionResult<AppConfig['gpu']>;\n machine: DetectionResult<MachineProfile>;\n}\n\nexport interface CommandRunner {\n (command: string, args: string[]): Promise<{ stdout: string; stderr?: string }>;\n}\n\nexport interface DetectOptions {\n platform?: NodeJS.Platform;\n arch?: string;\n env?: NodeJS.ProcessEnv;\n commandRunner?: CommandRunner;\n fetchImpl?: typeof fetch;\n pathLookup?: (command: string, platform: NodeJS.Platform, env: NodeJS.ProcessEnv) => Promise<string | undefined>;\n totalMemoryMb?: number;\n cpuCores?: number;\n}\n\nexport interface ConfigureOptions extends DetectOptions {\n outputPath: string;\n answersPath?: string;\n nonInteractive?: boolean;\n dryRun?: boolean;\n overwrite?: boolean;\n detectOnly?: boolean;\n assumeYes?: boolean;\n silent?: boolean;\n}\n\nexport interface ConfigureAnswers {\n server?: Partial<AppConfig['server']> & { https?: Partial<AppConfig['server']['https']> | boolean };\n ollama?: Partial<AppConfig['ollama']>;\n gpu?: Partial<AppConfig['gpu']>;\n router?: Partial<AppConfig['router']>;\n jobs?: Partial<AppConfig['jobs']>;\n queue?: Partial<AppConfig['queue']>;\n models?: {\n mode?: 'detected' | 'manual';\n items?: Array<Partial<ModelSpec> & { role?: ModelRole }>;\n };\n routes?: Partial<Record<TaskType | string, string[]>>;\n}\n\ntype ModelRole = 'fast' | 'code' | 'review' | 'heavy' | 'tool';\n\nconst answersSchema = z.object({\n server: z.record(z.unknown()).optional(),\n ollama: z.record(z.unknown()).optional(),\n gpu: z.record(z.unknown()).optional(),\n router: z.record(z.unknown()).optional(),\n jobs: z.record(z.unknown()).optional(),\n queue: z.record(z.unknown()).optional(),\n models: z\n .object({\n mode: z.enum(['detected', 'manual']).optional(),\n items: z.array(z.record(z.unknown())).optional()\n })\n .optional(),\n routes: z.record(z.array(z.string())).optional()\n});\n\nconst coreTaskTypes: TaskType[] = [\n 'triage',\n 'simple_chat',\n 'summarize',\n 'code_generate',\n 'code_review',\n 'code_fix',\n 'agentic_reasoning',\n 'large_context',\n 'tool_use',\n 'unknown'\n];\n\nexport async function runConfigure(options: ConfigureOptions): Promise<void> {\n const detection = await detectEnvironment(options);\n\n if (options.detectOnly) {\n emit(options, `${formatDetectionSummary(detection)}\\n`);\n return;\n }\n\n const answers = options.answersPath ? await loadAnswers(options.answersPath) : {};\n const config = options.nonInteractive\n ? generateConfigFromDetection(detection, answers)\n : await promptForConfig(detection, answers, options);\n const yaml = serializeConfig(config);\n parseConfig(yaml);\n\n emit(options, `${formatConfigSummary(config, detection, options.outputPath)}\\n`);\n if (options.dryRun) {\n emit(options, `${yaml}\\n`);\n return;\n }\n\n if (!options.overwrite && (await fileExists(options.outputPath))) {\n throw new Error(`Refusing to overwrite existing config: ${options.outputPath}`);\n }\n await mkdir(dirname(resolve(options.outputPath)), { recursive: true });\n await writeFile(options.outputPath, yaml, 'utf8');\n emit(options, `Wrote ${options.outputPath}\\n`);\n}\n\nexport async function detectEnvironment(options: DetectOptions = {}): Promise<WizardDetection> {\n const platform = options.platform ?? process.platform;\n const arch = options.arch ?? process.arch;\n const env = options.env ?? process.env;\n const commandRunner = options.commandRunner ?? defaultCommandRunner;\n const pathLookup = options.pathLookup ?? findExecutable;\n\n const machine = detectMachine(platform, arch, options);\n const ollamaBinary = await detectOllamaBinary(platform, env, pathLookup);\n const ollamaBaseUrl = detectOllamaBaseUrl(env);\n const ollamaReachable = await detectOllamaReachable(ollamaBaseUrl.value, options.fetchImpl ?? fetch);\n const ollamaModels = await detectOllamaModels(ollamaBinary.value, commandRunner);\n const loadedModels = await detectLoadedModels(ollamaBinary.value, commandRunner);\n const nvidiaSmiPath: DetectionResult<string> =\n platform === 'darwin' ? notFound<string>('nvidia-smi is normally unavailable on macOS') : await detectNvidiaSmi(platform, env, pathLookup);\n const gpu = await detectGpu(platform, arch, nvidiaSmiPath.value, commandRunner);\n\n return {\n ollamaBinary,\n ollamaBaseUrl,\n ollamaReachable,\n ollamaModels,\n loadedModels,\n nvidiaSmiPath,\n gpu,\n machine\n };\n}\n\nexport function generateConfigFromDetection(detection: WizardDetection, answers: ConfigureAnswers = {}): AppConfig {\n const machine = detection.machine.value ?? detectMachine(process.platform, process.arch, {}).value!;\n const gpu = mergeGpu(detection.gpu.value ?? defaultGpuForPlatform(machine.platform, machine.arch), answers.gpu);\n const cpuOnly = gpu.provider === 'none';\n const detectedModels = detection.ollamaModels.value ?? [];\n const models = buildModels(detectedModels, answers.models, cpuOnly);\n if (models.length === 0) {\n throw new Error('No models detected or provided. Add at least one model to generate a config.');\n }\n const routes = ensureCoreRoutes({ ...generateRoutes(models), ...(answers.routes ?? {}) }, models);\n const queue = {\n ...defaultQueue(machine, models, cpuOnly),\n ...(answers.queue ?? {})\n };\n\n const httpsAnswer = answers.server?.https;\n const serverHttps =\n typeof httpsAnswer === 'boolean'\n ? { enabled: httpsAnswer }\n : { enabled: false, ...(httpsAnswer ?? {}) };\n\n const config: AppConfig = {\n server: {\n host: '127.0.0.1',\n port: 11435,\n basePath: '/',\n requestBodyLimit: '8mb',\n https: serverHttps,\n ...omit(answers.server ?? {}, ['https'])\n },\n ollama: {\n baseUrl: detection.ollamaBaseUrl.value ?? 'http://127.0.0.1:11434',\n openAiCompatiblePath: '/v1/chat/completions',\n nativeApiBasePath: '/api',\n keepAlive: '10m',\n requestTimeoutMs: 180000,\n ...(answers.ollama ?? {})\n },\n gpu,\n router: {\n defaultMode: 'auto',\n syncMaxQueueTimeMs: cpuOnly ? 100 : 250,\n heavyLoadQueueDepth: cpuOnly ? 1 : models.some((model) => model.exclusive) ? 3 : 4,\n heavyLoadGpuFreeMbThreshold: gpu.provider === 'nvidia' ? Math.max(2048, gpu.vramSafetyReserveMb * 2) : 1024,\n defaultTaskType: 'unknown',\n classification: {\n mode: 'heuristic',\n optionalClassifierModel: models.find((model) => model.costClass === 'low')?.name,\n classifierTimeoutMs: 1500\n },\n ...(answers.router ?? {})\n },\n jobs: {\n store: 'memory',\n resultTtlSeconds: 86400,\n maxAttempts: 2,\n cleanupIntervalMs: 60000,\n ...(answers.jobs ?? {})\n },\n models,\n routes,\n queue\n };\n\n return parseConfig(serializeConfig(config));\n}\n\nexport function parseOllamaList(outputText: string): DetectedOllamaModel[] {\n const lines = outputText\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n if (lines.length <= 1) return [];\n return lines.slice(1).map((line) => {\n const wideParts = line.split(/\\s{2,}/).filter(Boolean);\n const parts = wideParts.length >= 3 ? wideParts : line.split(/\\s+/).filter(Boolean);\n const [name, id] = parts;\n const size = wideParts.length >= 3 ? parts[2] : [parts[2], parts[3]].filter(Boolean).join(' ');\n const modified = wideParts.length >= 3 ? parts[3] : parts.slice(4).join(' ');\n return {\n name: name ?? line,\n id,\n size,\n sizeGb: parseSizeGb(size),\n modified: modified || undefined\n };\n });\n}\n\nexport function inferModelRole(model: Pick<DetectedOllamaModel, 'name' | 'sizeGb'>): ModelRole {\n const name = model.name.toLowerCase();\n if (name.includes('review')) return 'review';\n if (name.includes('coder') || name.includes('code') || name.includes('deepseek') || name.includes('qwen')) return 'code';\n if ((model.sizeGb ?? 0) >= 12 || name.includes('gpt-oss') || name.includes('reason')) return 'heavy';\n if (name.includes('tool')) return 'tool';\n return 'fast';\n}\n\nexport function serializeConfig(config: AppConfig): string {\n return YAML.stringify(config, { lineWidth: 0 });\n}\n\nexport function formatDetectionSummary(detection: WizardDetection): string {\n const machine = detection.machine.value;\n const gpu = detection.gpu.value;\n return [\n 'Detected environment',\n '',\n 'Ollama:',\n ` binary: ${detection.ollamaBinary.value ?? 'not found'} (${detection.ollamaBinary.source}, ${detection.ollamaBinary.confidence})`,\n ` base URL: ${detection.ollamaBaseUrl.value ?? 'not detected'} (${detection.ollamaBaseUrl.source})`,\n ` reachable: ${detection.ollamaReachable.value === true ? 'yes' : 'no'}`,\n ` models: ${detection.ollamaModels.value?.length ?? 0} found`,\n '',\n 'GPU:',\n ` provider: ${gpu?.provider ?? 'none'}`,\n ` name: ${gpu?.name ?? 'not detected'}`,\n ` VRAM: ${gpu?.vramTotalMb ?? 0} MB`,\n ` monitor: ${gpu?.monitor.enabled ? `enabled through ${gpu.monitor.nvidiaSmiPath}` : 'disabled'}`,\n '',\n 'Machine:',\n ` OS: ${machine?.platform ?? process.platform} ${machine?.arch ?? process.arch}`,\n ` CPU cores: ${machine?.cpuCores ?? os.cpus().length}`,\n ` RAM: ${machine?.totalMemoryMb ?? Math.round(os.totalmem() / 1024 / 1024)} MB`\n ].join('\\n');\n}\n\nfunction formatConfigSummary(config: AppConfig, detection: WizardDetection, outputPath: string): string {\n const protocol = config.server.https.enabled ? 'https' : 'http';\n const basePath = config.server.basePath === '/' ? '/' : config.server.basePath;\n return [\n '',\n 'Configuration summary',\n '',\n `Output: ${outputPath}`,\n `Server: ${protocol}://${config.server.host}:${config.server.port}${basePath}`,\n `Ollama: ${config.ollama.baseUrl}`,\n `GPU: ${config.gpu.provider}${config.gpu.name ? `, ${config.gpu.name}` : ''}, ${config.gpu.vramTotalMb} MB VRAM`,\n `Models: ${config.models.length} configured`,\n `Heavy model: ${config.models.find((model) => model.exclusive)?.name ?? 'none'}`,\n `Queue: global concurrency ${config.queue.globalMaxConcurrent}, max queued ${config.queue.globalMaxQueued}`,\n `Jobs: ${config.jobs.store} store, result TTL ${config.jobs.resultTtlSeconds}s`,\n '',\n 'Detected:',\n ` Ollama models: ${detection.ollamaModels.value?.length ?? 0}`,\n ` Machine: ${detection.machine.value?.platform ?? process.platform} ${detection.machine.value?.arch ?? process.arch}`,\n ''\n ].join('\\n');\n}\n\nasync function promptForConfig(\n detection: WizardDetection,\n answers: ConfigureAnswers,\n options: ConfigureOptions\n): Promise<AppConfig> {\n const rl = createInterface({ input, output });\n try {\n output.write(`${formatDetectionSummary(detection)}\\n\\n`);\n const useDetected = options.assumeYes || (await confirm(rl, 'Use these detected values?', true));\n let mergedAnswers = answers;\n if (!useDetected) {\n mergedAnswers = await promptCorrections(rl, detection, answers);\n }\n const config = generateConfigFromDetection(detection, mergedAnswers);\n if (!options.assumeYes && !(await confirm(rl, 'Write this config?', true))) {\n throw new Error('Configuration cancelled');\n }\n return config;\n } finally {\n rl.close();\n }\n}\n\nasync function promptCorrections(\n rl: ReturnType<typeof createInterface>,\n detection: WizardDetection,\n answers: ConfigureAnswers\n): Promise<ConfigureAnswers> {\n const baseUrl = await ask(rl, 'Ollama base URL', detection.ollamaBaseUrl.value ?? 'http://127.0.0.1:11434');\n const host = await ask(rl, 'Server host', '127.0.0.1');\n const port = Number(await ask(rl, 'Server port', '11435'));\n const basePath = await ask(rl, 'Server base path', '/');\n const gpu = detection.gpu.value ?? defaultGpuForPlatform(process.platform, process.arch);\n const vramTotalMb = Number(await ask(rl, 'GPU VRAM total MB', String(gpu.vramTotalMb)));\n const models = detection.ollamaModels.value?.length\n ? undefined\n : {\n mode: 'manual' as const,\n items: [\n {\n name: await ask(rl, 'First Ollama model name', 'llama3.2:3b'),\n role: 'fast' as const,\n sizeGb: Number(await ask(rl, 'First model size GB', '2'))\n }\n ]\n };\n\n return {\n ...answers,\n server: { ...(answers.server ?? {}), host, port, basePath },\n ollama: { ...(answers.ollama ?? {}), baseUrl },\n gpu: { ...(answers.gpu ?? {}), vramTotalMb },\n models: answers.models ?? models\n };\n}\n\nasync function loadAnswers(path: string): Promise<ConfigureAnswers> {\n const raw = await readFile(path, 'utf8');\n const parsed = answersSchema.parse(YAML.parse(raw));\n return parsed as ConfigureAnswers;\n}\n\nasync function detectOllamaBinary(\n platform: NodeJS.Platform,\n env: NodeJS.ProcessEnv,\n pathLookup: (command: string, platform: NodeJS.Platform, env: NodeJS.ProcessEnv) => Promise<string | undefined>\n): Promise<DetectionResult<string>> {\n const pathResult = await pathLookup('ollama', platform, env);\n if (pathResult) return { value: pathResult, source: 'command', confidence: 'high' };\n\n const candidates =\n platform === 'darwin'\n ? ['/opt/homebrew/bin/ollama', '/usr/local/bin/ollama', '/Applications/Ollama.app/Contents/Resources/ollama']\n : ['/usr/bin/ollama', '/usr/local/bin/ollama', '/snap/bin/ollama'];\n for (const candidate of candidates) {\n if (await executableExists(candidate)) return { value: candidate, source: 'command', confidence: 'medium' };\n }\n return notFound('ollama binary not found');\n}\n\nfunction detectOllamaBaseUrl(env: NodeJS.ProcessEnv): DetectionResult<string> {\n if (env.OLLAMA_HOST) return { value: normalizeOllamaHost(env.OLLAMA_HOST), source: 'env', confidence: 'high' };\n return { value: 'http://127.0.0.1:11434', source: 'default', confidence: 'medium' };\n}\n\nasync function detectOllamaReachable(baseUrl: string | undefined, fetchImpl: typeof fetch): Promise<DetectionResult<boolean>> {\n if (!baseUrl) return notFound('ollama base URL is unknown');\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 700);\n try {\n const response = await fetchImpl(new URL('/api/tags', baseUrl), { signal: controller.signal });\n return { value: response.ok, source: 'command', confidence: response.ok ? 'high' : 'low' };\n } catch {\n return { value: false, source: 'not_found', confidence: 'low', message: 'Ollama API did not respond' };\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function detectOllamaModels(\n ollamaBinary: string | undefined,\n commandRunner: CommandRunner\n): Promise<DetectionResult<DetectedOllamaModel[]>> {\n if (!ollamaBinary) return notFound('ollama binary not found');\n try {\n const { stdout } = await commandRunner(ollamaBinary, ['list']);\n return { value: parseOllamaList(stdout), source: 'command', confidence: 'high' };\n } catch {\n return { value: [], source: 'not_found', confidence: 'low', message: 'ollama list failed' };\n }\n}\n\nasync function detectLoadedModels(\n ollamaBinary: string | undefined,\n commandRunner: CommandRunner\n): Promise<DetectionResult<LoadedModel[]>> {\n if (!ollamaBinary) return notFound('ollama binary not found');\n try {\n const { stdout } = await commandRunner(ollamaBinary, ['ps']);\n return { value: parseOllamaPs(stdout), source: 'command', confidence: 'high' };\n } catch {\n return { value: [], source: 'not_found', confidence: 'low', message: 'ollama ps failed' };\n }\n}\n\nasync function detectNvidiaSmi(\n platform: NodeJS.Platform,\n env: NodeJS.ProcessEnv,\n pathLookup: (command: string, platform: NodeJS.Platform, env: NodeJS.ProcessEnv) => Promise<string | undefined>\n): Promise<DetectionResult<string>> {\n const found = await pathLookup('nvidia-smi', platform, env);\n return found ? { value: found, source: 'command', confidence: 'high' } : notFound('nvidia-smi not found');\n}\n\nasync function detectGpu(\n platform: NodeJS.Platform,\n arch: string,\n nvidiaSmiPath: string | undefined,\n commandRunner: CommandRunner\n): Promise<DetectionResult<AppConfig['gpu']>> {\n if (platform === 'darwin') {\n return { value: defaultGpuForPlatform(platform, arch), source: 'default', confidence: arch === 'arm64' ? 'medium' : 'low' };\n }\n if (!nvidiaSmiPath) {\n return { value: defaultGpuForPlatform(platform, arch), source: 'not_found', confidence: 'medium' };\n }\n try {\n const { stdout } = await commandRunner(nvidiaSmiPath, [\n '--query-gpu=name,memory.total,memory.used,memory.free,utilization.gpu',\n '--format=csv,noheader,nounits'\n ]);\n const gpu = parseNvidiaSmi(stdout)[0];\n if (!gpu) return { value: defaultGpuForPlatform(platform, arch), source: 'not_found', confidence: 'low' };\n return {\n value: {\n provider: 'nvidia',\n name: gpu.name,\n vramTotalMb: gpu.vramTotalMb,\n vramSafetyReserveMb: safetyReserveMb(gpu.vramTotalMb),\n maxGpuUtilizationPct: 92,\n requireGpuOnlyByDefault: true,\n monitor: {\n enabled: true,\n intervalMs: 5000,\n nvidiaSmiPath\n }\n },\n source: 'command',\n confidence: 'high'\n };\n } catch {\n return { value: defaultGpuForPlatform(platform, arch), source: 'not_found', confidence: 'low' };\n }\n}\n\nfunction detectMachine(platform: NodeJS.Platform, arch: string, options: DetectOptions): DetectionResult<MachineProfile> {\n const totalMemoryMb = options.totalMemoryMb ?? Math.round(os.totalmem() / 1024 / 1024);\n const cpuCores = options.cpuCores ?? os.cpus().length;\n return {\n value: {\n platform,\n arch,\n cpuCores,\n totalMemoryMb,\n class: totalMemoryMb < 16_384 || cpuCores < 4 ? 'small' : totalMemoryMb > 65_536 || cpuCores > 16 ? 'large' : 'medium'\n },\n source: 'command',\n confidence: 'high'\n };\n}\n\nfunction buildModels(detectedModels: DetectedOllamaModel[], answers?: ConfigureAnswers['models'], cpuOnly = false): ModelSpec[] {\n const source = answers?.mode === 'manual' ? answers.items ?? [] : answers?.items ?? detectedModels;\n return source\n .filter((model) => Boolean(model.name))\n .map((model) =>\n buildModelSpec(\n model.name as string,\n (model as { role?: ModelRole }).role ?? inferModelRole(model as DetectedOllamaModel),\n Number(model.sizeGb ?? 2),\n cpuOnly\n )\n );\n}\n\nfunction buildModelSpec(name: string, role: ModelRole, sizeGb: number, cpuOnly: boolean): ModelSpec {\n const heavy = role === 'heavy';\n const code = role === 'code' || role === 'review' || role === 'tool';\n const naturalMaxConcurrent = heavy ? 1 : role === 'fast' ? 2 : 1;\n return {\n name,\n sizeGb,\n purpose: purposesForRole(role),\n priority: heavy ? 95 : code ? 70 : 50,\n maxConcurrent: cpuOnly ? 1 : naturalMaxConcurrent,\n defaultContext: heavy ? 16_384 : code ? 8192 : 4096,\n maxContext: heavy ? 65_536 : code ? 32_768 : 8192,\n timeoutMs: heavy ? 300_000 : code ? 180_000 : 90_000,\n costClass: heavy ? 'high' : code ? 'medium' : 'low',\n exclusive: heavy,\n allowWhenBusy: !heavy,\n tags: tagsForRole(role)\n };\n}\n\nfunction purposesForRole(role: ModelRole): string[] {\n switch (role) {\n case 'code':\n return ['code_generate', 'code_fix', 'tool_use'];\n case 'review':\n return ['code_review', 'code_generate', 'code_fix'];\n case 'heavy':\n return ['agentic_reasoning', 'large_context', 'planning', 'tool_use'];\n case 'tool':\n return ['tool_use', 'code_generate'];\n case 'fast':\n default:\n return ['triage', 'simple_chat', 'summarize'];\n }\n}\n\nfunction tagsForRole(role: ModelRole): string[] {\n switch (role) {\n case 'code':\n return ['code', 'fallback'];\n case 'review':\n return ['code', 'review'];\n case 'heavy':\n return ['reasoning', 'large_context'];\n case 'tool':\n return ['tool_use'];\n case 'fast':\n default:\n return ['fast', 'chat'];\n }\n}\n\nfunction generateRoutes(models: ModelSpec[]): Record<string, string[]> {\n const fast = models.filter((model) => model.costClass === 'low').map((model) => model.name);\n const code = models.filter((model) => model.purpose.includes('code_generate')).map((model) => model.name);\n const review = models.filter((model) => model.purpose.includes('code_review')).map((model) => model.name);\n const heavy = models.filter((model) => model.exclusive || model.costClass === 'high').map((model) => model.name);\n const tool = models.filter((model) => model.purpose.includes('tool_use')).map((model) => model.name);\n const fallback = [...fast, ...code, ...models.map((model) => model.name)];\n return {\n triage: firstNonEmpty(fast, fallback),\n simple_chat: firstNonEmpty(fast, fallback),\n summarize: firstNonEmpty(fast, fallback),\n code_generate: firstNonEmpty(code, fallback),\n code_review: firstNonEmpty(review, code, fallback),\n code_fix: firstNonEmpty(code, review, fallback),\n agentic_reasoning: firstNonEmpty(heavy, code, fallback),\n large_context: firstNonEmpty(heavy, code, fallback),\n tool_use: firstNonEmpty(tool, code, heavy, fallback),\n unknown: firstNonEmpty(fast, code, fallback)\n };\n}\n\nfunction ensureCoreRoutes(routes: Partial<Record<string, string[]>>, models: ModelSpec[]): Record<string, string[]> {\n const fallback = [models[0].name];\n return Object.fromEntries(coreTaskTypes.map((taskType) => [taskType, routes[taskType]?.length ? routes[taskType] : fallback]));\n}\n\nfunction defaultQueue(machine: MachineProfile, models: ModelSpec[], cpuOnly = false): AppConfig['queue'] {\n const maxByModels = models.reduce((sum, model) => sum + model.maxConcurrent, 0);\n const suggested = cpuOnly ? 1 : machine.class === 'small' ? 1 : machine.class === 'large' ? 4 : 3;\n return {\n globalMaxConcurrent: Math.max(1, Math.min(maxByModels, suggested)),\n globalMaxQueued: cpuOnly || machine.class === 'small' ? 50 : 100,\n perUserMaxQueued: cpuOnly || machine.class === 'small' ? 10 : 20,\n defaultPriority: 'normal',\n timeoutMs: 180_000\n };\n}\n\nfunction mergeGpu(base: AppConfig['gpu'], override: Partial<AppConfig['gpu']> | undefined): AppConfig['gpu'] {\n return {\n ...base,\n ...(override ?? {}),\n monitor: {\n ...base.monitor,\n ...(override?.monitor ?? {})\n }\n };\n}\n\nfunction defaultGpuForPlatform(platform: NodeJS.Platform, arch: string): AppConfig['gpu'] {\n const mac = platform === 'darwin';\n return {\n provider: 'none',\n name: mac && arch === 'arm64' ? 'Apple Silicon / macOS GPU' : mac ? 'macOS GPU' : 'No NVIDIA GPU detected',\n vramTotalMb: 0,\n vramSafetyReserveMb: 1024,\n maxGpuUtilizationPct: 95,\n requireGpuOnlyByDefault: false,\n monitor: {\n enabled: false,\n intervalMs: 5000,\n nvidiaSmiPath: 'nvidia-smi'\n }\n };\n}\n\nfunction safetyReserveMb(totalMb: number): number {\n if (totalMb < 8192) return 1024;\n if (totalMb <= 24_576) return 1536;\n return 2048;\n}\n\nfunction firstNonEmpty(...lists: string[][]): string[] {\n return lists.find((list) => list.length > 0) ?? [];\n}\n\nfunction parseSizeGb(size: string | undefined): number | undefined {\n if (!size) return undefined;\n const match = size.match(/([\\d.]+)\\s*([kmgt]i?b|[kmgt]b)?/i);\n if (!match) return undefined;\n const value = Number(match[1]);\n const unit = (match[2] ?? 'GB').toLowerCase();\n if (!Number.isFinite(value)) return undefined;\n if (unit.startsWith('m')) return value / 1024;\n if (unit.startsWith('k')) return value / 1024 / 1024;\n if (unit.startsWith('t')) return value * 1024;\n return value;\n}\n\nfunction normalizeOllamaHost(host: string): string {\n if (host.startsWith('http://') || host.startsWith('https://')) return host;\n return `http://${host}`;\n}\n\nasync function findExecutable(command: string, _platform: NodeJS.Platform, env: NodeJS.ProcessEnv): Promise<string | undefined> {\n const pathValue = env.PATH ?? '';\n for (const entry of pathValue.split(':').filter(Boolean)) {\n const candidate = resolve(entry, command);\n if (await executableExists(candidate)) return candidate;\n }\n return undefined;\n}\n\nasync function executableExists(path: string): Promise<boolean> {\n try {\n await access(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function defaultCommandRunner(command: string, args: string[]): Promise<{ stdout: string; stderr?: string }> {\n const { stdout, stderr } = await execFileAsync(command, args, { timeout: 5000 });\n return { stdout, stderr };\n}\n\nfunction notFound<T>(message: string): DetectionResult<T> {\n return { source: 'not_found', confidence: 'low', message };\n}\n\nasync function confirm(rl: ReturnType<typeof createInterface>, question: string, defaultValue: boolean): Promise<boolean> {\n const suffix = defaultValue ? '[Y/n]' : '[y/N]';\n const answer = (await rl.question(`${question} ${suffix} `)).trim().toLowerCase();\n if (!answer) return defaultValue;\n return answer === 'y' || answer === 'yes';\n}\n\nasync function ask(rl: ReturnType<typeof createInterface>, question: string, defaultValue: string): Promise<string> {\n const answer = await rl.question(`${question} (${defaultValue}): `);\n return answer.trim() || defaultValue;\n}\n\nfunction omit<T extends Record<string, unknown>, K extends keyof T>(value: T, keys: K[]): Omit<T, K> {\n return Object.fromEntries(Object.entries(value).filter(([key]) => !keys.includes(key as K))) as Omit<T, K>;\n}\n\nfunction emit(options: ConfigureOptions, text: string): void {\n if (!options.silent) output.write(text);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { AppConfig, GpuSnapshot } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface GpuMonitor {\n snapshot(): Promise<GpuSnapshot | undefined>;\n}\n\nexport class StaticGpuMonitor implements GpuMonitor {\n constructor(private readonly config: AppConfig['gpu']) {}\n\n async snapshot(): Promise<GpuSnapshot | undefined> {\n if (this.config.provider === 'none') return undefined;\n return {\n name: this.config.name ?? 'Configured GPU',\n vramTotalMb: this.config.vramTotalMb,\n vramUsedMb: 0,\n vramFreeMb: this.config.vramTotalMb,\n utilizationPct: 0\n };\n }\n}\n\nexport class NvidiaGpuMonitor implements GpuMonitor {\n constructor(\n private readonly config: AppConfig['gpu'],\n private readonly commandRunner: (command: string, args: string[]) => Promise<{ stdout: string }> = defaultCommandRunner\n ) {}\n\n async snapshot(): Promise<GpuSnapshot | undefined> {\n if (!this.config.monitor.enabled || this.config.provider !== 'nvidia') {\n return new StaticGpuMonitor(this.config).snapshot();\n }\n\n const args = [\n '--query-gpu=name,memory.total,memory.used,memory.free,utilization.gpu',\n '--format=csv,noheader,nounits'\n ];\n const { stdout } = await this.commandRunner(this.config.monitor.nvidiaSmiPath, args);\n return parseNvidiaSmi(stdout)[0];\n }\n}\n\nexport function parseNvidiaSmi(output: string): GpuSnapshot[] {\n return output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const [name, total, used, free, utilization] = line.split(',').map((part) => part.trim());\n return {\n name,\n vramTotalMb: Number(total),\n vramUsedMb: Number(used),\n vramFreeMb: Number(free),\n utilizationPct: Number(utilization)\n };\n })\n .filter((gpu) => gpu.name && Number.isFinite(gpu.vramTotalMb));\n}\n\nasync function defaultCommandRunner(command: string, args: string[]): Promise<{ stdout: string }> {\n const { stdout } = await execFileAsync(command, args, { timeout: 5000 });\n return { stdout };\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { AppConfig, ChatCompletionRequest, LoadedModel } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface OllamaClient {\n chat(request: ChatCompletionRequest, model: string, timeoutMs?: number): Promise<unknown>;\n tags(): Promise<unknown>;\n ps(): Promise<LoadedModel[]>;\n}\n\nexport class HttpOllamaClient implements OllamaClient {\n constructor(\n private readonly config: AppConfig['ollama'],\n private readonly commandRunner: (command: string, args: string[]) => Promise<{ stdout: string }> = defaultCommandRunner\n ) {}\n\n async chat(request: ChatCompletionRequest, model: string, timeoutMs = this.config.requestTimeoutMs): Promise<unknown> {\n const url = new URL(this.config.openAiCompatiblePath, this.config.baseUrl);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const body = { ...request, model };\n delete body.router;\n if (!('stream' in body)) body.stream = false;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal\n });\n const payload = await safeJson(response);\n if (!response.ok) {\n throw new OllamaHttpError(response.status, payload);\n }\n return payload;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async tags(): Promise<unknown> {\n const response = await fetch(new URL(`${this.config.nativeApiBasePath}/tags`, this.config.baseUrl));\n const payload = await safeJson(response);\n if (!response.ok) throw new OllamaHttpError(response.status, payload);\n return payload;\n }\n\n async ps(): Promise<LoadedModel[]> {\n try {\n const { stdout } = await this.commandRunner('ollama', ['ps']);\n return parseOllamaPs(stdout);\n } catch {\n return [];\n }\n }\n}\n\nexport class OllamaHttpError extends Error {\n constructor(\n readonly statusCode: number,\n readonly payload: unknown\n ) {\n super(`Ollama HTTP request failed with status ${statusCode}`);\n }\n}\n\nexport function parseOllamaPs(output: string): LoadedModel[] {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n if (lines.length <= 1) return [];\n\n return lines.slice(1).map((line) => {\n const parts = line.split(/\\s{2,}/).filter(Boolean);\n if (parts.length >= 5) {\n return {\n name: parts[0],\n id: parts[1],\n size: parts[2],\n processor: parts[3],\n until: parts.slice(4).join(' ')\n };\n }\n\n const fallback = line.match(/^(\\S+)\\s+(\\S+)\\s+(.+?)\\s+((?:\\d+%\\s+)?(?:GPU|CPU)(?:\\/GPU)?)\\s+(.+)$/i);\n if (fallback) {\n return {\n name: fallback[1],\n id: fallback[2],\n size: fallback[3].trim(),\n processor: fallback[4].trim(),\n until: fallback[5].trim()\n };\n }\n\n return { name: parts[0] ?? line };\n });\n}\n\nasync function safeJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n return { raw: text };\n }\n}\n\nasync function defaultCommandRunner(command: string, args: string[]): Promise<{ stdout: string }> {\n const { stdout } = await execFileAsync(command, args, { timeout: 5000 });\n return { stdout };\n}\n","import { nanoid } from 'nanoid';\nimport { AppConfig, ChatCompletionRequest, JobRecord, JobStatus, TaskType } from './types.js';\n\nexport class InMemoryJobStore {\n private readonly jobs = new Map<string, JobRecord>();\n\n constructor(private readonly config: AppConfig['jobs']) {}\n\n create(input: {\n taskType: TaskType;\n selectedModel: string;\n request: ChatCompletionRequest;\n priority: number;\n }): JobRecord {\n const now = new Date();\n const record: JobRecord = {\n id: `job_${nanoid(16)}`,\n status: 'queued',\n task_type: input.taskType,\n selected_model: input.selectedModel,\n request_json: JSON.stringify(input.request),\n result_json: null,\n error_json: null,\n attempts: 0,\n priority: input.priority,\n created_at: now.toISOString(),\n started_at: null,\n finished_at: null,\n expires_at: new Date(now.getTime() + this.config.resultTtlSeconds * 1000).toISOString()\n };\n this.jobs.set(record.id, record);\n return { ...record };\n }\n\n get(id: string): JobRecord | undefined {\n const job = this.jobs.get(id);\n return job ? { ...job } : undefined;\n }\n\n list(limit = 50): JobRecord[] {\n return [...this.jobs.values()]\n .sort((a, b) => b.created_at.localeCompare(a.created_at))\n .slice(0, limit)\n .map((job) => ({ ...job }));\n }\n\n markRunning(id: string): JobRecord | undefined {\n const job = this.jobs.get(id);\n if (!job || (job.status !== 'queued' && job.status !== 'running')) return this.get(id);\n const now = new Date().toISOString();\n job.status = 'running';\n job.started_at ??= now;\n job.attempts += 1;\n return this.get(id);\n }\n\n markSucceeded(id: string, result: unknown): JobRecord | undefined {\n this.finish(id, 'succeeded', JSON.stringify(result), null);\n return this.get(id);\n }\n\n markFailed(id: string, error: unknown): JobRecord | undefined {\n this.finish(id, 'failed', null, JSON.stringify(normalizeError(error)));\n return this.get(id);\n }\n\n cancel(id: string): JobRecord | undefined {\n const job = this.jobs.get(id);\n if (!job) return undefined;\n if (job.status === 'queued' || job.status === 'running') {\n job.status = 'cancelled';\n job.finished_at = new Date().toISOString();\n }\n return this.get(id);\n }\n\n cleanupExpired(now = new Date()): number {\n let changed = 0;\n for (const job of this.jobs.values()) {\n if (\n job.expires_at &&\n job.expires_at < now.toISOString() &&\n ['queued', 'running', 'succeeded', 'failed'].includes(job.status)\n ) {\n job.status = 'expired';\n changed += 1;\n }\n }\n return changed;\n }\n\n close(): void {\n this.jobs.clear();\n }\n\n private finish(id: string, status: JobStatus, resultJson: string | null, errorJson: string | null): void {\n const job = this.jobs.get(id);\n if (!job || (job.status !== 'queued' && job.status !== 'running')) return;\n job.status = status;\n job.result_json = resultJson;\n job.error_json = errorJson;\n job.finished_at = new Date().toISOString();\n }\n}\n\nexport function parseJobResult(job: JobRecord): unknown {\n if (!job.result_json) return undefined;\n return JSON.parse(job.result_json);\n}\n\nexport function parseJobError(job: JobRecord): unknown {\n if (!job.error_json) return undefined;\n return JSON.parse(job.error_json);\n}\n\nfunction normalizeError(error: unknown): Record<string, unknown> {\n if (error instanceof Error) {\n return { message: error.message, name: error.name, stack: error.stack };\n }\n return { message: String(error), value: error };\n}\n","import PQueue from 'p-queue';\nimport { AppConfig, ChatCompletionRequest, Classification, ModelSpec } from './types.js';\nimport { OllamaClient } from './ollama.js';\nimport { InMemoryJobStore } from './job-store.js';\n\nexport interface QueueSnapshot {\n globalQueued: number;\n globalRunning: number;\n byModel: Array<{ model: string; queued: number; running: number; concurrency: number }>;\n}\n\nexport class QueueManager {\n private readonly queues = new Map<string, PQueue>();\n\n constructor(\n private readonly config: AppConfig,\n private readonly ollama: OllamaClient,\n private readonly jobs: InMemoryJobStore\n ) {\n for (const model of config.models) {\n this.queues.set(model.name, new PQueue({ concurrency: model.maxConcurrent }));\n }\n }\n\n async runSync(input: {\n model: ModelSpec;\n request: ChatCompletionRequest;\n priority: number;\n timeoutMs: number;\n }): Promise<{ result: unknown; queueTimeMs: number; executionTimeMs: number }> {\n this.ensureQueueCapacity();\n const queuedAt = Date.now();\n const result = await this.queueFor(input.model.name).add(\n async () => {\n const startedAt = Date.now();\n const result = await this.ollama.chat(input.request, input.model.name, Math.min(input.timeoutMs, input.model.timeoutMs));\n return { result, queueTimeMs: startedAt - queuedAt, executionTimeMs: Date.now() - startedAt };\n },\n { priority: input.priority, timeout: input.timeoutMs, throwOnTimeout: true }\n );\n return result;\n }\n\n enqueueAsync(input: {\n model: ModelSpec;\n request: ChatCompletionRequest;\n classification: Classification;\n priority: number;\n }): { id: string; position: number } {\n this.ensureQueueCapacity();\n const job = this.jobs.create({\n taskType: input.classification.taskType,\n selectedModel: input.model.name,\n request: input.request,\n priority: input.priority\n });\n\n const queue = this.queueFor(input.model.name);\n const position = queue.size + 1;\n void queue.add(() => this.runJob(job.id), {\n priority: input.priority,\n timeout: input.model.timeoutMs,\n throwOnTimeout: true\n });\n\n return { id: job.id, position };\n }\n\n snapshot(): QueueSnapshot {\n const byModel = [...this.queues.entries()].map(([model, queue]) => ({\n model,\n queued: queue.size,\n running: queue.pending,\n concurrency: this.config.models.find((spec) => spec.name === model)?.maxConcurrent ?? 1\n }));\n return {\n globalQueued: byModel.reduce((sum, item) => sum + item.queued, 0),\n globalRunning: byModel.reduce((sum, item) => sum + item.running, 0),\n byModel\n };\n }\n\n queueDepthByModel(): Map<string, number> {\n return new Map([...this.queues.entries()].map(([model, queue]) => [model, queue.size]));\n }\n\n runningByModel(): Map<string, number> {\n return new Map([...this.queues.entries()].map(([model, queue]) => [model, queue.pending]));\n }\n\n private async runJob(jobId: string): Promise<void> {\n const job = this.jobs.get(jobId);\n if (!job || job.status === 'cancelled') return;\n const modelName = job.selected_model;\n const model = this.config.models.find((spec) => spec.name === modelName);\n if (!model) {\n this.jobs.markFailed(jobId, new Error(`Configured model disappeared: ${modelName}`));\n return;\n }\n\n this.jobs.markRunning(jobId);\n try {\n const request = JSON.parse(job.request_json) as ChatCompletionRequest;\n const result = await this.ollama.chat(request, model.name, model.timeoutMs);\n this.jobs.markSucceeded(jobId, result);\n } catch (error) {\n const latest = this.jobs.get(jobId);\n if (latest && latest.attempts < this.config.jobs.maxAttempts && latest.status !== 'cancelled') {\n const queue = this.queueFor(model.name);\n void queue.add(() => this.runJob(jobId), {\n priority: latest.priority,\n timeout: model.timeoutMs,\n throwOnTimeout: true\n });\n } else {\n this.jobs.markFailed(jobId, error);\n }\n }\n }\n\n private ensureQueueCapacity(): void {\n const snapshot = this.snapshot();\n if (snapshot.globalQueued >= this.config.queue.globalMaxQueued) {\n throw new Error(`Global queue limit exceeded: ${this.config.queue.globalMaxQueued}`);\n }\n }\n\n private queueFor(model: string): PQueue {\n const queue = this.queues.get(model);\n if (!queue) throw new Error(`No queue configured for model: ${model}`);\n return queue;\n }\n}\n","import http from 'node:http';\nimport https from 'node:https';\nimport { readFile } from 'node:fs/promises';\nimport express, { NextFunction, Request, Response } from 'express';\nimport { pinoHttp } from 'pino-http';\nimport { z } from 'zod';\nimport { classifyTask } from './classifier.js';\nimport { AppConfig, ChatCompletionRequest } from './types.js';\nimport { GpuMonitor } from './gpu.js';\nimport { OllamaClient } from './ollama.js';\nimport { RoutingEngine, normalizeRouterMetadata, priorityWeights } from './router-engine.js';\nimport { QueueManager } from './queue-manager.js';\nimport { InMemoryJobStore, parseJobError, parseJobResult } from './job-store.js';\nimport { logger } from './logger.js';\n\nconst chatRequestSchema = z\n .object({\n model: z.string().optional(),\n messages: z.array(z.object({ role: z.string(), content: z.unknown() })).min(1),\n stream: z.boolean().optional(),\n router: z\n .object({\n mode: z.enum(['auto', 'sync', 'async']).optional(),\n allowAsync: z.boolean().optional(),\n taskType: z.string().optional(),\n priority: z.enum(['low', 'normal', 'high']).optional(),\n preferredModels: z.array(z.string()).optional(),\n forbiddenModels: z.array(z.string()).optional(),\n maxQueueTimeMs: z.number().int().nonnegative().optional(),\n maxExecutionTimeMs: z.number().int().positive().optional(),\n requireGpuOnly: z.boolean().optional()\n })\n .optional()\n })\n .passthrough();\n\nexport interface ServerDependencies {\n ollama: OllamaClient;\n gpu: GpuMonitor;\n jobs: InMemoryJobStore;\n queue: QueueManager;\n}\n\nexport function createApp(config: AppConfig, deps: ServerDependencies): express.Express {\n const app = express();\n const api = express.Router();\n const routing = new RoutingEngine(config);\n\n if (process.env.NODE_ENV !== 'test') {\n app.use(pinoHttp({ logger }));\n }\n app.use(express.json({ limit: config.server.requestBodyLimit }));\n\n api.get('/health', (_req, res) => {\n res.json({ status: 'ok', service: 'ollama-agent-router' });\n });\n\n api.get('/metrics', (_req, res) => {\n const snapshot = deps.queue.snapshot();\n res.type('text/plain').send(\n [\n `oar_queue_global_queued ${snapshot.globalQueued}`,\n `oar_queue_global_running ${snapshot.globalRunning}`,\n ...snapshot.byModel.flatMap((item) => [\n `oar_model_queue_depth{model=\"${escapeMetricLabel(item.model)}\"} ${item.queued}`,\n `oar_model_running{model=\"${escapeMetricLabel(item.model)}\"} ${item.running}`\n ])\n ].join('\\n')\n );\n });\n\n api.get('/v1/router/status', async (_req, res, next) => {\n try {\n res.json({\n service: 'ollama-agent-router',\n queue: deps.queue.snapshot(),\n gpu: await safeGpu(deps.gpu),\n loadedModels: await safeLoadedModels(deps.ollama),\n config: {\n models: config.models.length,\n routes: Object.keys(config.routes),\n basePath: normalizeBasePath(config.server.basePath),\n protocol: config.server.https.enabled ? 'https' : 'http'\n }\n });\n } catch (error) {\n next(error);\n }\n });\n\n api.get('/v1/router/models', async (_req, res, next) => {\n try {\n res.json({\n configured: config.models,\n ollama: await deps.ollama.tags(),\n loaded: await safeLoadedModels(deps.ollama)\n });\n } catch (error) {\n next(error);\n }\n });\n\n api.get('/v1/router/gpu', async (_req, res, next) => {\n try {\n res.json((await safeGpu(deps.gpu)) ?? { provider: config.gpu.provider, available: false });\n } catch (error) {\n next(error);\n }\n });\n\n api.get('/v1/jobs', (_req, res) => {\n res.json({ jobs: deps.jobs.list() });\n });\n\n api.get('/v1/jobs/:jobId', (req, res) => {\n const job = deps.jobs.get(req.params.jobId);\n if (!job) return res.status(404).json({ error: { message: 'Job not found' } });\n return res.json(job);\n });\n\n api.get('/v1/jobs/:jobId/result', (req, res) => {\n const job = deps.jobs.get(req.params.jobId);\n if (!job) return res.status(404).json({ error: { message: 'Job not found' } });\n if (job.status === 'failed') return res.status(500).json({ status: job.status, error: parseJobError(job) });\n if (job.status !== 'succeeded') return res.status(202).json({ status: job.status });\n return res.json(parseJobResult(job));\n });\n\n api.delete('/v1/jobs/:jobId', (req, res) => {\n const job = deps.jobs.cancel(req.params.jobId);\n if (!job) return res.status(404).json({ error: { message: 'Job not found' } });\n return res.json(job);\n });\n\n api.post('/v1/chat/completions', async (req, res, next) => {\n try {\n const request = chatRequestSchema.parse(req.body) as ChatCompletionRequest;\n if (request.stream) {\n return res.status(400).json({ error: { message: 'Streaming is not supported by ollama-agent-router v1' } });\n }\n\n const router = normalizeRouterMetadata(config, request.router);\n const classification = classifyTask(request, router.taskType);\n const loadedModels = await safeLoadedModels(deps.ollama);\n const gpu = await safeGpu(deps.gpu);\n const decision = routing.decide({\n request,\n router,\n classification,\n loadedModels,\n gpu,\n queueDepthByModel: deps.queue.queueDepthByModel(),\n runningByModel: deps.queue.runningByModel()\n });\n\n if (decision.type === 'reject') {\n return res.status(decision.statusCode).json({ error: { message: decision.reason } });\n }\n\n const priority = priorityWeights[router.priority];\n if (decision.type === 'async') {\n const job = deps.queue.enqueueAsync({\n model: decision.model,\n request,\n classification,\n priority\n });\n return res.status(202).json({\n id: job.id,\n object: 'router.job',\n status: 'queued',\n message: 'Heavy load. Job accepted for asynchronous processing.',\n router: {\n mode: 'async',\n taskType: classification.taskType,\n preferredModel: decision.model.name,\n position: job.position,\n estimatedClass: classification.complexity\n }\n });\n }\n\n const output = await deps.queue.runSync({\n model: decision.model,\n request,\n priority,\n timeoutMs: router.maxExecutionTimeMs\n });\n return res.json(\n withRouterMetadata(output.result, {\n mode: 'sync',\n taskType: classification.taskType,\n selectedModel: decision.model.name,\n fallbackModels: decision.fallbackModels.filter((name) => name !== decision.model.name),\n queueTimeMs: output.queueTimeMs,\n executionTimeMs: output.executionTimeMs,\n decisionReason: decision.reason\n })\n );\n } catch (error) {\n next(error);\n }\n });\n\n app.use(normalizeBasePath(config.server.basePath), api);\n\n app.use((error: unknown, _req: Request, res: Response, _next: NextFunction) => {\n const message = error instanceof Error ? error.message : String(error);\n const status = error instanceof z.ZodError ? 400 : 500;\n res.status(status).json({ error: { message } });\n });\n\n return app;\n}\n\nexport async function startServer(config: AppConfig, deps: ServerDependencies): Promise<{ close: () => Promise<void> }> {\n const app = createApp(config, deps);\n const server = await createHttpServer(config, app);\n server.listen(config.server.port, config.server.host);\n await new Promise<void>((resolve) => server.once('listening', resolve));\n logger.info(\n {\n host: config.server.host,\n port: config.server.port,\n basePath: normalizeBasePath(config.server.basePath),\n protocol: config.server.https.enabled ? 'https' : 'http'\n },\n 'ollama-agent-router listening'\n );\n return {\n close: () =>\n new Promise((resolve, reject) => {\n server.close((error) => (error ? reject(error) : resolve()));\n })\n };\n}\n\nexport function normalizeBasePath(basePath: string): string {\n const trimmed = basePath.trim();\n if (!trimmed || trimmed === '/') return '/';\n return `/${trimmed.replace(/^\\/+|\\/+$/g, '')}`;\n}\n\nasync function createHttpServer(config: AppConfig, app: express.Express): Promise<http.Server | https.Server> {\n if (!config.server.https.enabled) {\n return http.createServer(app);\n }\n if (!config.server.https.certPath || !config.server.https.keyPath) {\n throw new Error('server.https.certPath and server.https.keyPath are required when HTTPS is enabled');\n }\n return https.createServer(\n {\n cert: await readFile(config.server.https.certPath),\n key: await readFile(config.server.https.keyPath),\n ca: config.server.https.caPath ? await readFile(config.server.https.caPath) : undefined\n },\n app\n );\n}\n\nfunction withRouterMetadata(result: unknown, router: Record<string, unknown>): unknown {\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n return { ...(result as Record<string, unknown>), router };\n }\n return { result, router };\n}\n\nasync function safeLoadedModels(ollama: OllamaClient) {\n try {\n return await ollama.ps();\n } catch {\n return [];\n }\n}\n\nasync function safeGpu(gpu: GpuMonitor) {\n try {\n return await gpu.snapshot();\n } catch {\n return undefined;\n }\n}\n\nfunction escapeMetricLabel(label: string): string {\n return label.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"');\n}\n","import { ChatCompletionRequest, Classification, TaskType } from './types.js';\n\nconst codeMarkers = [\n 'typescript',\n 'javascript',\n 'node.js',\n 'python',\n 'function',\n 'class ',\n 'stack trace',\n 'exception',\n 'compile',\n 'refactor',\n 'pull request',\n 'diff --git',\n '```'\n];\n\nconst toolMarkers = ['tool', 'function call', 'json schema', 'api call', 'webhook', 'bash', 'shell command'];\nconst reasoningMarkers = ['plan', 'architecture', 'design', 'debug', 'investigate', 'root cause', 'step by step'];\nconst summarizeMarkers = ['summarize', 'summary', 'tl;dr', 'extract key points'];\nconst reviewMarkers = ['review', 'audit', 'risks', 'find bugs', 'code review'];\nconst fixMarkers = ['fix', 'bug', 'failing test', 'patch', 'regression'];\nconst generateMarkers = ['write', 'implement', 'create', 'generate', 'build'];\n\nexport function classifyTask(request: ChatCompletionRequest, explicitTaskType?: TaskType | 'auto'): Classification {\n if (explicitTaskType && explicitTaskType !== 'auto') {\n return {\n taskType: explicitTaskType,\n complexity: explicitTaskType === 'agentic_reasoning' || explicitTaskType === 'large_context' ? 'heavy' : 'medium',\n requiresLargeContext: explicitTaskType === 'large_context',\n requiresToolUse: explicitTaskType === 'tool_use',\n confidence: 1\n };\n }\n\n const text = extractMessageText(request).toLowerCase();\n const tokenEstimate = Math.ceil(text.length / 4);\n const hasCode = containsAny(text, codeMarkers);\n const requiresToolUse = containsAny(text, toolMarkers);\n const requiresLargeContext = tokenEstimate > 12000 || text.includes('large context') || text.includes('entire repository');\n\n let taskType: TaskType = 'simple_chat';\n let confidence = 0.55;\n\n if (requiresLargeContext) {\n taskType = 'large_context';\n confidence = 0.8;\n } else if (requiresToolUse) {\n taskType = 'tool_use';\n confidence = 0.75;\n } else if (containsAny(text, reviewMarkers) && hasCode) {\n taskType = 'code_review';\n confidence = 0.82;\n } else if (containsAny(text, fixMarkers) && hasCode) {\n taskType = 'code_fix';\n confidence = 0.8;\n } else if (containsAny(text, generateMarkers) && hasCode) {\n taskType = 'code_generate';\n confidence = 0.78;\n } else if (containsAny(text, summarizeMarkers)) {\n taskType = 'summarize';\n confidence = 0.86;\n } else if (containsAny(text, reasoningMarkers) && (text.length > 1200 || text.includes('multi-step'))) {\n taskType = 'agentic_reasoning';\n confidence = 0.72;\n } else if (text.length < 180 && (text.includes('classify') || text.includes('route') || text.includes('triage'))) {\n taskType = 'triage';\n confidence = 0.7;\n }\n\n const complexity = classifyComplexity(text, taskType, tokenEstimate);\n return { taskType, complexity, requiresLargeContext, requiresToolUse, confidence };\n}\n\nexport function extractMessageText(request: Pick<ChatCompletionRequest, 'messages'>): string {\n return request.messages\n .map((message) => {\n if (typeof message.content === 'string') return message.content;\n if (Array.isArray(message.content)) {\n return message.content\n .map((part) => {\n if (typeof part === 'string') return part;\n if (part && typeof part === 'object' && 'text' in part) return String(part.text ?? '');\n return '';\n })\n .join('\\n');\n }\n return JSON.stringify(message.content ?? '');\n })\n .join('\\n');\n}\n\nfunction classifyComplexity(text: string, taskType: TaskType, tokenEstimate: number): Classification['complexity'] {\n if (taskType === 'large_context' || taskType === 'agentic_reasoning' || tokenEstimate > 12000) return 'heavy';\n if (tokenEstimate > 3000 || text.includes('architecture') || text.includes('debug')) return 'medium';\n if (taskType.startsWith('code_') || taskType === 'tool_use') return 'medium';\n return 'light';\n}\n\nfunction containsAny(text: string, markers: string[]): boolean {\n return markers.some((marker) => text.includes(marker));\n}\n","import { AppConfig, ModelSpec, RouteContext, RouteDecision, RouterRequestMetadata } from './types.js';\n\nexport const priorityWeights = {\n low: 10,\n normal: 50,\n high: 90\n} as const;\n\nexport function normalizeRouterMetadata(config: AppConfig, metadata: RouterRequestMetadata = {}): Required<RouterRequestMetadata> {\n return {\n mode: metadata.mode ?? config.router.defaultMode,\n allowAsync: metadata.allowAsync ?? true,\n taskType: metadata.taskType ?? 'auto',\n priority: metadata.priority ?? config.queue.defaultPriority,\n preferredModels: metadata.preferredModels ?? [],\n forbiddenModels: metadata.forbiddenModels ?? [],\n maxQueueTimeMs: metadata.maxQueueTimeMs ?? config.router.syncMaxQueueTimeMs,\n maxExecutionTimeMs: metadata.maxExecutionTimeMs ?? config.queue.timeoutMs,\n requireGpuOnly: metadata.requireGpuOnly ?? config.gpu.requireGpuOnlyByDefault\n };\n}\n\nexport class RoutingEngine {\n private readonly modelsByName: Map<string, ModelSpec>;\n\n constructor(private readonly config: AppConfig) {\n this.modelsByName = new Map(config.models.map((model) => [model.name, model]));\n }\n\n decide(context: RouteContext): RouteDecision {\n const candidates = this.getCandidates(context);\n if (candidates.length === 0) {\n return { type: 'reject', statusCode: 503, reason: 'No configured model can satisfy this request' };\n }\n\n const blocked = candidates\n .map((model) => ({ model, blockReason: this.blockReason(model, context) }))\n .filter((entry) => entry.blockReason);\n const available = candidates.filter((model) => !this.blockReason(model, context));\n const scoredAvailable = available.map((model) => this.score(model, context)).sort((a, b) => b.score - a.score);\n const fallbackModels = candidates.map((model) => model.name);\n\n if (context.router.mode === 'async') {\n const model = (scoredAvailable[0]?.model ?? candidates[0]) as ModelSpec;\n return {\n type: 'async',\n model,\n fallbackModels,\n reason: 'Request explicitly requested async mode',\n score: scoredAvailable[0]?.score ?? 0,\n position: (context.queueDepthByModel.get(model.name) ?? 0) + 1\n };\n }\n\n const preferredBusy = this.preferredBusyModel(candidates, context);\n const totalQueueDepth = [...context.queueDepthByModel.values()].reduce((sum, depth) => sum + depth, 0);\n const gpuHeavy = Boolean(\n context.gpu && context.gpu.vramFreeMb < this.config.router.heavyLoadGpuFreeMbThreshold\n );\n const heavyLoad = totalQueueDepth >= this.config.router.heavyLoadQueueDepth || gpuHeavy;\n\n if (context.router.mode !== 'sync' && context.router.allowAsync && (heavyLoad || preferredBusy)) {\n const model = preferredBusy ?? scoredAvailable[0]?.model ?? candidates[0];\n return {\n type: 'async',\n model,\n fallbackModels,\n reason: preferredBusy ? 'Preferred model is busy; accepted for async processing' : 'Heavy load detected',\n score: this.score(model, context).score,\n position: (context.queueDepthByModel.get(model.name) ?? 0) + 1\n };\n }\n\n if (scoredAvailable.length > 0) {\n return {\n type: 'sync',\n model: scoredAvailable[0].model,\n fallbackModels,\n reason: scoredAvailable[0].reason,\n score: scoredAvailable[0].score\n };\n }\n\n if (blocked.some((entry) => entry.blockReason === 'busy') && context.router.allowAsync && context.router.mode !== 'sync') {\n const model = blocked[0].model;\n return {\n type: 'async',\n model,\n fallbackModels,\n reason: 'Selected model is busy; accepted for async processing',\n score: 0,\n position: (context.queueDepthByModel.get(model.name) ?? 0) + 1\n };\n }\n\n const reason = blocked.map((entry) => `${entry.model.name}: ${entry.blockReason}`).join('; ');\n return { type: 'reject', statusCode: 503, reason: reason || 'No model available' };\n }\n\n score(model: ModelSpec, context: RouteContext): { model: ModelSpec; score: number; reason: string } {\n const route = this.config.routes[context.classification.taskType] ?? this.config.routes.unknown ?? [];\n const routeIndex = route.indexOf(model.name);\n const loaded = context.loadedModels.some((loadedModel) => loadedModel.name === model.name);\n const queueDepth = context.queueDepthByModel.get(model.name) ?? 0;\n const running = context.runningByModel.get(model.name) ?? 0;\n const preferredIndex = context.router.preferredModels.indexOf(model.name);\n const freeMb = context.gpu?.vramFreeMb ?? this.config.gpu.vramTotalMb;\n const requiredMb = model.sizeGb * 1024 + this.config.gpu.vramSafetyReserveMb;\n\n let score = 100;\n score += Math.max(0, 50 - routeIndex * 8);\n score += model.priority;\n if (model.purpose.includes(context.classification.taskType)) score += 25;\n if (model.tags.includes(context.classification.taskType)) score += 15;\n if (preferredIndex >= 0) score += 80 - preferredIndex * 10;\n if (loaded) score += 20;\n if (context.classification.complexity === 'heavy' && model.costClass === 'high') score += 20;\n if (context.classification.complexity === 'light' && model.costClass === 'low') score += 15;\n if (freeMb > requiredMb) score += Math.min(25, (freeMb - requiredMb) / 512);\n if (freeMb < requiredMb) score -= 60;\n score -= queueDepth * 18;\n score -= running * 25;\n if (model.exclusive) score -= running * 80;\n\n return {\n model,\n score,\n reason: `Selected ${model.name} for ${context.classification.taskType} with score ${score.toFixed(1)}`\n };\n }\n\n private getCandidates(context: RouteContext): ModelSpec[] {\n const routeNames = this.config.routes[context.classification.taskType] ?? this.config.routes.unknown ?? [];\n const names = new Set<string>();\n for (const name of context.router.preferredModels) names.add(name);\n for (const name of routeNames) names.add(name);\n for (const model of this.config.models) {\n if (model.purpose.includes(context.classification.taskType) || model.tags.includes(context.classification.taskType)) {\n names.add(model.name);\n }\n }\n\n return [...names]\n .map((name) => this.modelsByName.get(name))\n .filter((model): model is ModelSpec => Boolean(model))\n .filter((model) => !context.router.forbiddenModels.includes(model.name));\n }\n\n private blockReason(model: ModelSpec, context: RouteContext): 'gpu_only' | 'busy' | undefined {\n const loaded = context.loadedModels.find((loadedModel) => loadedModel.name === model.name);\n const processor = loaded?.processor?.toLowerCase() ?? '';\n if (context.router.requireGpuOnly) {\n if (!context.gpu && this.config.gpu.vramTotalMb <= 0) return 'gpu_only';\n if (processor.includes('cpu') && !processor.includes('100% gpu')) return 'gpu_only';\n const freeMb = context.gpu?.vramFreeMb ?? this.config.gpu.vramTotalMb;\n if (model.sizeGb * 1024 + this.config.gpu.vramSafetyReserveMb > freeMb && !loaded) return 'gpu_only';\n }\n\n const running = context.runningByModel.get(model.name) ?? 0;\n if ((model.exclusive && running > 0) || (!model.allowWhenBusy && running >= model.maxConcurrent)) {\n return 'busy';\n }\n return undefined;\n }\n\n private preferredBusyModel(candidates: ModelSpec[], context: RouteContext): ModelSpec | undefined {\n const preferredNames = new Set(context.router.preferredModels);\n const ordered = preferredNames.size > 0 ? candidates.filter((model) => preferredNames.has(model.name)) : candidates.slice(0, 1);\n return ordered.find((model) => this.blockReason(model, context) === 'busy');\n }\n}\n","import pino from 'pino';\n\nexport const logger = pino({\n level: process.env.LOG_LEVEL ?? 'info'\n});\n","#!/usr/bin/env node\nimport { createProgram } from './cli-program.js';\n\ncreateProgram().parseAsync().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n"],"mappings":"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","names":["readFile","access","mkdir","readFile","writeFile","dirname","resolve","execFile","promisify","YAML","z","output","execFile","promisify","execFileAsync","defaultCommandRunner","output","execFileAsync","promisify","execFile","z","mkdir","dirname","resolve","writeFile","defaultCommandRunner","YAML","readFile","access","input","input","result","readFile","z","z","output","resolve","readFile","readFile","normalizeBasePath"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ollama-agent-router",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Intelligent OpenAI-compatible router for Ollama with model selection, GPU/CPU-aware queues, async jobs, and CLI configuration.",
5
5
  "type": "module",
6
6
  "license": "MIT",