@x12i/ai-tools 2.0.1 → 2.0.3

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.
Files changed (84) hide show
  1. package/dist/{AiModelsCatalogClient-B5FMI9gj.d.cts → AiModelsCatalogClient-C9ZJHhv3.d.ts} +4 -1
  2. package/dist/{AiModelsCatalogClient-CPPNI6Ry.d.ts → AiModelsCatalogClient-DgBdVFk-.d.cts} +4 -1
  3. package/dist/aliases/index.d.cts +3 -3
  4. package/dist/aliases/index.d.ts +3 -3
  5. package/dist/catalog/index.cjs +6 -5
  6. package/dist/catalog/index.cjs.map +1 -1
  7. package/dist/catalog/index.d.cts +4 -4
  8. package/dist/catalog/index.d.ts +4 -4
  9. package/dist/catalog/index.js +5 -4
  10. package/dist/{chunk-EYHMQVAL.js → chunk-54GKLIDW.js} +22 -10
  11. package/dist/chunk-54GKLIDW.js.map +1 -0
  12. package/dist/{chunk-XAWBTX3N.cjs → chunk-75ZVXZAV.cjs} +7 -7
  13. package/dist/{chunk-XAWBTX3N.cjs.map → chunk-75ZVXZAV.cjs.map} +1 -1
  14. package/dist/{chunk-YQDSN6R6.cjs → chunk-76FHWQH3.cjs} +3 -3
  15. package/dist/{chunk-YQDSN6R6.cjs.map → chunk-76FHWQH3.cjs.map} +1 -1
  16. package/dist/{chunk-EDMCKHO6.cjs → chunk-BCX5CLJJ.cjs} +15 -2
  17. package/dist/chunk-BCX5CLJJ.cjs.map +1 -0
  18. package/dist/{chunk-OPN6BGNH.js → chunk-D6OIUYNC.js} +117 -5
  19. package/dist/{chunk-OPN6BGNH.js.map → chunk-D6OIUYNC.js.map} +1 -1
  20. package/dist/{chunk-WOHMHXRZ.cjs → chunk-DDRWORUU.cjs} +30 -276
  21. package/dist/chunk-DDRWORUU.cjs.map +1 -0
  22. package/dist/{chunk-5XAAMBDO.cjs → chunk-HBNYVRLZ.cjs} +123 -11
  23. package/dist/chunk-HBNYVRLZ.cjs.map +1 -0
  24. package/dist/chunk-HEB73GKJ.js +263 -0
  25. package/dist/chunk-HEB73GKJ.js.map +1 -0
  26. package/dist/{chunk-VJHLO2R3.js → chunk-KSJSLKYI.js} +2 -2
  27. package/dist/{chunk-SIH4GPV4.js → chunk-MOLWV5LV.js} +2 -2
  28. package/dist/{chunk-CTM35DMA.js → chunk-PN4FF6YF.js} +10 -253
  29. package/dist/chunk-PN4FF6YF.js.map +1 -0
  30. package/dist/{chunk-DXZOL3VN.cjs → chunk-RSHI4OOY.cjs} +46 -34
  31. package/dist/chunk-RSHI4OOY.cjs.map +1 -0
  32. package/dist/{chunk-B3V2EHRY.js → chunk-SLSKQRMI.js} +15 -2
  33. package/dist/{chunk-B3V2EHRY.js.map → chunk-SLSKQRMI.js.map} +1 -1
  34. package/dist/{chunk-XOKUDUUI.cjs → chunk-TMA6QSNH.cjs} +3 -3
  35. package/dist/{chunk-XOKUDUUI.cjs.map → chunk-TMA6QSNH.cjs.map} +1 -1
  36. package/dist/{chunk-6BQBKROR.js → chunk-VBROBIVI.js} +3 -3
  37. package/dist/{chunk-6BQBKROR.js.map → chunk-VBROBIVI.js.map} +1 -1
  38. package/dist/chunk-WSUFQR3D.cjs +266 -0
  39. package/dist/chunk-WSUFQR3D.cjs.map +1 -0
  40. package/dist/{chunk-PRCICORG.cjs → chunk-X42KFOUO.cjs} +6 -6
  41. package/dist/{chunk-PRCICORG.cjs.map → chunk-X42KFOUO.cjs.map} +1 -1
  42. package/dist/{chunk-AB5GNXJ4.js → chunk-ZPUZ7DBO.js} +2 -2
  43. package/dist/cli/index.cjs +16 -15
  44. package/dist/cli/index.cjs.map +1 -1
  45. package/dist/cli/index.js +7 -6
  46. package/dist/cli/index.js.map +1 -1
  47. package/dist/cost/index.cjs +4 -3
  48. package/dist/cost/index.cjs.map +1 -1
  49. package/dist/cost/index.d.cts +4 -4
  50. package/dist/cost/index.d.ts +4 -4
  51. package/dist/cost/index.js +3 -2
  52. package/dist/index.cjs +12 -9
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.cts +6 -6
  55. package/dist/index.d.ts +6 -6
  56. package/dist/index.js +11 -8
  57. package/dist/{modelCache-CJftI-Ko.d.cts → modelCache-sL3dBfRM.d.cts} +1 -1
  58. package/dist/{modelCache-BzRn6t_C.d.ts → modelCache-xzoTUue2.d.ts} +1 -1
  59. package/dist/{modelNameResolver-5XkBMctP.d.ts → modelNameResolver-2WroQlqt.d.ts} +2 -1
  60. package/dist/{modelNameResolver-C5CSTGFF.d.cts → modelNameResolver-Bxlehrbp.d.cts} +2 -1
  61. package/dist/models/index.cjs +7 -6
  62. package/dist/models/index.cjs.map +1 -1
  63. package/dist/models/index.d.cts +3 -3
  64. package/dist/models/index.d.ts +3 -3
  65. package/dist/models/index.js +6 -5
  66. package/dist/{resolveUsageModel-BFwf80Hz.d.ts → resolveUsageModel-DrFuiuIW.d.ts} +2 -2
  67. package/dist/{resolveUsageModel-C_YmGR1M.d.cts → resolveUsageModel-xKZ2QpHy.d.cts} +2 -2
  68. package/dist/sync/index.cjs +7 -5
  69. package/dist/sync/index.cjs.map +1 -1
  70. package/dist/sync/index.d.cts +3 -3
  71. package/dist/sync/index.d.ts +3 -3
  72. package/dist/sync/index.js +6 -4
  73. package/dist/{types-BrzJWsTU.d.ts → types-BZYGjN2O.d.cts} +21 -2
  74. package/dist/{types-BrzJWsTU.d.cts → types-BZYGjN2O.d.ts} +21 -2
  75. package/package.json +2 -2
  76. package/dist/chunk-5XAAMBDO.cjs.map +0 -1
  77. package/dist/chunk-CTM35DMA.js.map +0 -1
  78. package/dist/chunk-DXZOL3VN.cjs.map +0 -1
  79. package/dist/chunk-EDMCKHO6.cjs.map +0 -1
  80. package/dist/chunk-EYHMQVAL.js.map +0 -1
  81. package/dist/chunk-WOHMHXRZ.cjs.map +0 -1
  82. /package/dist/{chunk-VJHLO2R3.js.map → chunk-KSJSLKYI.js.map} +0 -0
  83. /package/dist/{chunk-SIH4GPV4.js.map → chunk-MOLWV5LV.js.map} +0 -0
  84. /package/dist/{chunk-AB5GNXJ4.js.map → chunk-ZPUZ7DBO.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/cli/index.cjs","../../src/cli/index.ts","../../src/cli/commands/alias.ts","../../src/cli/report.ts","../../src/cli/commands/catalog.ts","../../src/cli/commands/cost.ts","../../src/cli/commands/models.ts"],"names":["program"],"mappings":"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","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/cli/index.cjs","sourcesContent":[null,"#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { registerAliasCommand } from \"./commands/alias.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerCostCommand } from \"./commands/cost.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\nconst pkg = JSON.parse(\n readFileSync(join(dirname(fileURLToPath(import.meta.url)), \"../../package.json\"), \"utf8\"),\n) as { version: string };\n\nconst program = new Command();\n\nprogram\n .name(\"ai-tools\")\n .description(\"@x12i/ai-tools — AI model catalog, cost calculation, and utilities\")\n .version(pkg.version);\n\nregisterCatalogCommand(program);\nregisterModelsCommand(program);\nregisterCostCommand(program);\nregisterAliasCommand(program);\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","import fs from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { AliasRegistry } from \"../../aliases/AliasRegistry.js\";\nimport { AliasResolver } from \"../../aliases/AliasResolver.js\";\nimport { AiModelsCatalogClient } from \"../../catalog/AiModelsCatalogClient.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction registry(path?: string) {\n return new AliasRegistry(path ? { aliasesPath: path } : {});\n}\n\nfunction resolver(path?: string) {\n return new AliasResolver({\n registry: registry(path),\n catalogClient: new AiModelsCatalogClient({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n }),\n });\n}\n\nexport function registerAliasCommand(program: Command): void {\n const alias = program.command(\"alias\").description(\"Manage project-local model aliases\");\n\n alias\n .command(\"init\")\n .description(\"Create an empty ai-tools/aliases.json\")\n .option(\"--path <path>\", \"Custom path\")\n .option(\"--force\", \"Overwrite if already exists\")\n .action((opts: { path?: string; force?: boolean }) => {\n const reg = registry(opts.path);\n if (reg.exists() && !opts.force) {\n console.log(`Aliases file already exists at ${reg.path}`);\n return;\n }\n if (opts.force && reg.exists()) {\n fs.unlinkSync(reg.path);\n }\n reg.init();\n console.log(`✔ Created ${reg.path}`);\n console.log(\n \" Tip: commit this file to your repository so aliases are consistent across environments.\",\n );\n });\n\n alias\n .command(\"set\")\n .description(\"Create or update an alias\")\n .argument(\"<name>\", \"Alias name\")\n .argument(\"<modelId>\", \"Model ID\")\n .option(\"--provider <p>\", \"Provider routing\", \"openrouter\")\n .option(\"--description <d>\", \"Human-readable note\")\n .option(\"--tag <t>\", \"Tag (repeatable)\", (v: string, prev: string[]) => [...prev, v], [] as string[])\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(\n (\n name: string,\n modelId: string,\n opts: { provider: string; description?: string; tag: string[]; path?: string },\n ) => {\n const reg = registry(opts.path);\n if (!reg.exists()) reg.init();\n reg.set(name, {\n modelId,\n provider: opts.provider,\n description: opts.description,\n tags: opts.tag.length ? opts.tag : undefined,\n });\n console.log(`✔ alias \"${name}\" → ${modelId} (via ${opts.provider})`);\n console.log(` Updated ${reg.path}`);\n },\n );\n\n alias\n .command(\"get\")\n .description(\"Show one alias (with catalog resolution when available)\")\n .argument(\"<name>\", \"Alias name\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (name: string, opts: { path?: string }) => {\n const ref = await resolver(opts.path).getModel(name);\n console.log(`Alias: ${ref.alias}`);\n console.log(`Model ID: ${ref.modelId}`);\n console.log(`Provider: ${ref.provider}`);\n if (ref.modelRecord) {\n console.log(`Name: ${ref.name}`);\n console.log(`Context: ${ref.modelRecord.contextLength.toLocaleString()} tokens`);\n console.log(`Status: ${ref.modelRecord.status} ✔`);\n } else {\n console.log(`Catalog: ✘ not found in ai-models catalog (local/custom model)`);\n }\n if (ref.entry.description) console.log(`Description: ${ref.entry.description}`);\n if (ref.entry.tags?.length) console.log(`Tags: ${ref.entry.tags.join(\", \")}`);\n });\n\n alias\n .command(\"list\")\n .description(\"List all aliases\")\n .option(\"--tag <t>\", \"Filter by tag\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--check\", \"Validate each alias against the catalog\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (opts: { tag?: string; json?: boolean; check?: boolean; path?: string }) => {\n const reg = registry(opts.path);\n const rows = reg.list(opts.tag ? { tag: opts.tag } : undefined);\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n if (opts.check) {\n const report = await resolver(opts.path).validate();\n console.log(\"NAME\".padEnd(14), \"MODEL ID\".padEnd(32), \"STATUS\");\n console.log(\"─\".repeat(60));\n for (const e of report.entries) {\n const status =\n e.status === \"ok\" ? \"✔ resolved\" : e.status === \"unknown\" ? \"✘ not in catalog\" : \"✗ broken\";\n console.log(e.name.padEnd(14), e.modelId.padEnd(32), status);\n }\n return;\n }\n\n console.log(\"NAME\".padEnd(14), \"MODEL ID\".padEnd(32), \"PROVIDER\".padEnd(12), \"DESCRIPTION\");\n console.log(\"─\".repeat(90));\n for (const row of rows) {\n console.log(\n row.name.padEnd(14),\n row.modelId.padEnd(32),\n row.provider.padEnd(12),\n (row.description ?? \"\").slice(0, 40),\n );\n }\n });\n\n alias\n .command(\"remove\")\n .description(\"Remove an alias\")\n .argument(\"<name>\", \"Alias name\")\n .option(\"--yes\", \"Skip confirmation\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action((name: string, opts: { yes?: boolean; path?: string }) => {\n if (!opts.yes) {\n console.log(`Remove alias \"${name}\"? Use --yes to confirm.`);\n process.exit(1);\n }\n const removed = registry(opts.path).remove(name);\n if (removed) console.log(`✔ Removed alias \"${name}\"`);\n else {\n console.error(`Alias not found: ${name}`);\n process.exit(1);\n }\n });\n\n alias\n .command(\"rename\")\n .description(\"Rename an alias\")\n .argument(\"<from>\", \"Current name\")\n .argument(\"<to>\", \"New name\")\n .option(\"--force\", \"Overwrite destination if it exists\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action((from: string, to: string, opts: { force?: boolean; path?: string }) => {\n registry(opts.path).rename(from, to, { force: opts.force });\n console.log(`✔ Renamed \"${from}\" → \"${to}\"`);\n });\n\n alias\n .command(\"check\")\n .description(\"Validate all aliases against the catalog (CI-friendly)\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (opts: { path?: string }) => {\n const report = await resolver(opts.path).validate();\n console.log(`Checking ${report.total} aliases against ai-models catalog…\\n`);\n\n for (const e of report.entries) {\n const icon = e.status === \"ok\" ? \"✔\" : e.status === \"unknown\" ? \"⚠\" : \"✗\";\n const extra = e.resolvedName ? ` (${e.resolvedName})` : e.issue ? ` (${e.issue})` : \"\";\n console.log(` ${icon} ${e.name.padEnd(12)} → ${e.modelId.padEnd(28)}${extra}`);\n }\n\n console.log(\n `\\n${report.total} total · ${report.ok} ok · ${report.unknown} unknown · ${report.broken} broken`,\n );\n\n if (report.broken > 0) process.exit(1);\n });\n}\n","export function emitJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function emitHuman(lines: string[]): void {\n for (const line of lines) {\n console.log(line);\n }\n}\n","import type { Command } from \"commander\";\nimport { refreshAiModelsCatalog, verifyAiModelsCatalog } from \"../../catalog/index.js\";\nimport { emitHuman, emitJson } from \"../report.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program.command(\"catalog\").description(\"Model catalog load and health commands\");\n\n catalog\n .command(\"refresh\")\n .description(\"Fetch catalogs from open-assets.x12i.com and warm the cache\")\n .option(\"--bundled-only\", \"Use bundled src/data catalogs only (no HTTP)\")\n .option(\"--json\", \"Machine-readable JSON on stdout\")\n .action(async (opts: { bundledOnly?: boolean; json?: boolean }) => {\n const result = await refreshAiModelsCatalog({ bundledOnly: opts.bundledOnly });\n if (opts.json) {\n emitJson(result);\n } else {\n emitHuman([\n \"✔ Catalog refresh complete\",\n ` Direct: ${result.directCount} (${result.directSource})`,\n ` OpenRouter: ${result.openRouterCount} (${result.openRouterSource})`,\n ]);\n }\n });\n\n catalog\n .command(\"verify\")\n .description(\"Validate direct + OpenRouter catalogs load successfully\")\n .option(\"--bundled-only\", \"Use bundled src/data catalogs only (no HTTP)\")\n .option(\"--json\", \"Machine-readable JSON on stdout\")\n .action(async (opts: { bundledOnly?: boolean; json?: boolean }) => {\n const report = await verifyAiModelsCatalog({ bundledOnly: opts.bundledOnly });\n\n if (opts.json) {\n emitJson(report);\n } else {\n emitHuman([\n report.ok ? \"✔ Catalog verification passed\" : \"✗ Catalog verification FAILED\",\n ` Direct models: ${report.directCount} (${report.directSource})`,\n ` OpenRouter models: ${report.openRouterCount} (${report.openRouterSource})`,\n ` Direct URL: ${report.directUrl}`,\n ` OpenRouter URL: ${report.openRouterUrl}`,\n ]);\n }\n\n if (!report.ok) {\n process.exit(1);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { AliasRegistry } from \"../../aliases/AliasRegistry.js\";\nimport { CostCalculator } from \"../../cost/CostCalculator.js\";\nimport { AiModelsCatalogClient } from \"../../catalog/AiModelsCatalogClient.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction formatUsd(n: number): string {\n return `$${n.toFixed(6)}`;\n}\n\nexport function registerCostCommand(program: Command): void {\n program\n .command(\"cost\")\n .description(\"Estimate cost from catalog pricing\")\n .requiredOption(\"--model <id>\", \"Model ID or alias\")\n .requiredOption(\"--prompt-tokens <n>\", \"Prompt token count\", (v) => Number.parseInt(v, 10))\n .requiredOption(\n \"--completion-tokens <n>\",\n \"Completion token count\",\n (v) => Number.parseInt(v, 10),\n )\n .option(\"--cached-tokens <n>\", \"Cached token count\", (v) => Number.parseInt(v, 10))\n .option(\"--reasoning-tokens <n>\", \"Reasoning token count\", (v) => Number.parseInt(v, 10))\n .option(\"--provider <id>\", \"Provider for pricing selection\", \"openrouter\")\n .option(\"--json\", \"Output raw AiCostResult JSON\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n promptTokens: number;\n completionTokens: number;\n cachedTokens?: number;\n reasoningTokens?: number;\n provider: string;\n json?: boolean;\n bundledOnly?: boolean;\n }) => {\n const catalogClient = new AiModelsCatalogClient({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n bundledOnly: opts.bundledOnly,\n });\n\n const calculator = new CostCalculator(catalogClient, {\n aliasRegistry: new AliasRegistry(),\n });\n\n const result = await calculator.calculate({\n tokens: {\n prompt: opts.promptTokens,\n completion: opts.completionTokens,\n total: opts.promptTokens + opts.completionTokens,\n cached: opts.cachedTokens,\n reasoning: opts.reasoningTokens,\n },\n provider: opts.provider,\n modelUsed: opts.model,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const b = result.breakdown;\n console.log(`Model: ${result.resolvedModelId}`);\n if (result.usedModel && result.usedModel !== result.resolvedModelId) {\n console.log(`Used model: ${result.usedModel}`);\n }\n console.log(\n `Prompt: ${opts.promptTokens.toLocaleString()} tokens → ${formatUsd(b?.promptCostUsd ?? 0)}`,\n );\n console.log(\n `Completion: ${opts.completionTokens.toLocaleString()} tokens → ${formatUsd(b?.completionCostUsd ?? 0)}`,\n );\n console.log(\n `Request fee: → ${formatUsd(b?.requestFlatCostUsd ?? 0)}`,\n );\n console.log(\"─\".repeat(38));\n console.log(`Total: → ${formatUsd(result.cost)}`);\n console.log(\n `Via OpenRouter: ${result.routedViaOpenRouter ? \"yes\" : \"no\"}`,\n );\n });\n}\n","import type { Command } from \"commander\";\nimport { AiModelsService } from \"../../models/AiModelsService.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction service(opts: { bundledOnly?: boolean }) {\n return new AiModelsService({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n bundledOnly: opts.bundledOnly,\n });\n}\n\nexport function registerModelsCommand(program: Command): void {\n const models = program.command(\"models\").description(\"Inspect model catalogs\");\n\n models\n .command(\"list\")\n .description(\"List models with optional filters\")\n .option(\"--provider <id>\", \"Filter by providerId (e.g. openai, anthropic)\")\n .option(\"--output-modality <m>\", \"Filter by output modality (text, image, audio, …)\")\n .option(\"--input-modality <m>\", \"Filter by input modality\")\n .option(\"--parameter <p>\", \"Filter by supported parameter (e.g. tools)\")\n .option(\"--tools\", \"Only models that support tools\")\n .option(\"--reasoning\", \"Only reasoning / thinking models\")\n .option(\"--search <q>\", \"Search name, id, description\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--limit <n>\", \"Max rows\", \"50\")\n .option(\"--offset <n>\", \"Skip rows\", \"0\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n provider?: string;\n outputModality?: string;\n inputModality?: string;\n parameter?: string;\n tools?: boolean;\n reasoning?: boolean;\n search?: string;\n json?: boolean;\n limit?: string;\n offset?: string;\n bundledOnly?: boolean;\n }) => {\n const { models: rows, total } = await service(opts).listModels({\n providerId: opts.provider,\n outputModality: opts.outputModality,\n inputModality: opts.inputModality,\n supportedParameter: opts.parameter,\n supportsTools: opts.tools ? true : undefined,\n supportsReasoning: opts.reasoning ? true : undefined,\n search: opts.search,\n limit: Number.parseInt(opts.limit ?? \"50\", 10),\n offset: Number.parseInt(opts.offset ?? \"0\", 10),\n });\n\n if (opts.json) {\n console.log(JSON.stringify({ total, models: rows }, null, 2));\n return;\n }\n\n console.log(\n \"MODEL ID\".padEnd(42),\n \"PROVIDER\".padEnd(14),\n \"OUTPUT\".padEnd(10),\n \"R\".padEnd(3),\n \"NAME\",\n );\n console.log(\"─\".repeat(104));\n for (const m of rows) {\n console.log(\n m.modelId.padEnd(42),\n m.providerId.padEnd(14),\n m.primaryOutputModality.padEnd(10),\n (m.supportsReasoning ? \"yes\" : \"no\").padEnd(3),\n m.name.slice(0, 40),\n );\n }\n console.log(`\\n${rows.length} shown · ${total} matching`);\n });\n\n models\n .command(\"get\")\n .description(\"Get full model record by ID or alias\")\n .argument(\"<modelId>\", \"Model ID or alias\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (modelId: string, opts: { bundledOnly?: boolean }) => {\n const model = await service(opts).getModelInfo(modelId);\n if (!model) {\n console.error(`Model not found: ${modelId}`);\n process.exit(1);\n }\n console.log(JSON.stringify(model, null, 2));\n });\n\n models\n .command(\"resolve\")\n .description(\"Resolve provider + model to canonical id\")\n .requiredOption(\"--model <m>\", \"Model string (required)\")\n .option(\"--provider <p>\", \"Provider hint (openrouter, openai, …)\")\n .option(\"--threshold <n>\", \"Confidence threshold 0–1\", \"0.6\")\n .option(\"--json\", \"Output raw ModelResolutionResult JSON\")\n .option(\"--verbose\", \"Show strategy trail\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n provider?: string;\n threshold?: string;\n json?: boolean;\n verbose?: boolean;\n bundledOnly?: boolean;\n }) => {\n const result = await service(opts).resolve(opts.model, opts.provider);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const providerLabel = opts.provider ?? \"unspecified\";\n console.log(`Input: provider=\"${providerLabel}\" model=\"${opts.model}\"`);\n\n if (opts.verbose && result.found) {\n console.log(`Normalised: model=\"${result.normalisedInput}\"`);\n console.log(\"\\nStrategy trail:\");\n for (const s of result.resolvedVia) {\n console.log(` • ${s}`);\n }\n console.log();\n }\n\n if (!result.found) {\n console.log(\"Result: NOT FOUND\");\n console.log(`Reason: ${result.reason}`);\n if (result.bestRejectedCandidate) {\n console.log(\n `Candidate: ${result.bestRejectedCandidate.modelId} (confidence ${result.bestRejectedCandidate.confidence.toFixed(2)})`,\n );\n }\n console.log('Tip: Run \"ai-tools catalog refresh\" or \"ai-tools alias set\".');\n process.exit(1);\n return;\n }\n\n console.log(`Resolved: ${result.modelId}`);\n console.log(`Name: ${result.record?.name ?? \"(no catalog record)\"}`);\n console.log(`Strategy: ${result.resolvedVia.join(\" → \")}`);\n console.log(`Confidence: ${result.confidence.toFixed(2)}`);\n console.log(`Via OR: ${result.routedViaOpenRouter ? \"yes\" : \"no\"}`);\n });\n\n models\n .command(\"count\")\n .description(\"Count models matching filters\")\n .option(\"--provider <id>\", \"Filter by providerId\")\n .option(\"--output-modality <m>\", \"Filter by output modality\")\n .option(\"--parameter <p>\", \"Filter by supported parameter\")\n .option(\"--tools\", \"Only models that support tools\")\n .option(\"--reasoning\", \"Only reasoning / thinking models\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n provider?: string;\n outputModality?: string;\n parameter?: string;\n tools?: boolean;\n reasoning?: boolean;\n bundledOnly?: boolean;\n }) => {\n const n = await service(opts).countModels({\n providerId: opts.provider,\n outputModality: opts.outputModality,\n supportedParameter: opts.parameter,\n supportsTools: opts.tools ? true : undefined,\n supportsReasoning: opts.reasoning ? true : undefined,\n });\n console.log(n);\n });\n}\n"]}
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/cli/index.cjs","../../src/cli/index.ts","../../src/cli/commands/alias.ts","../../src/cli/report.ts","../../src/cli/commands/catalog.ts","../../src/cli/commands/cost.ts","../../src/cli/commands/models.ts"],"names":["program"],"mappings":"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","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/cli/index.cjs","sourcesContent":[null,"#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { registerAliasCommand } from \"./commands/alias.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerCostCommand } from \"./commands/cost.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\nconst pkg = JSON.parse(\n readFileSync(join(dirname(fileURLToPath(import.meta.url)), \"../../package.json\"), \"utf8\"),\n) as { version: string };\n\nconst program = new Command();\n\nprogram\n .name(\"ai-tools\")\n .description(\"@x12i/ai-tools — AI model catalog, cost calculation, and utilities\")\n .version(pkg.version);\n\nregisterCatalogCommand(program);\nregisterModelsCommand(program);\nregisterCostCommand(program);\nregisterAliasCommand(program);\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","import fs from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { AliasRegistry } from \"../../aliases/AliasRegistry.js\";\nimport { AliasResolver } from \"../../aliases/AliasResolver.js\";\nimport { AiModelsCatalogClient } from \"../../catalog/AiModelsCatalogClient.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction registry(path?: string) {\n return new AliasRegistry(path ? { aliasesPath: path } : {});\n}\n\nfunction resolver(path?: string) {\n return new AliasResolver({\n registry: registry(path),\n catalogClient: new AiModelsCatalogClient({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n }),\n });\n}\n\nexport function registerAliasCommand(program: Command): void {\n const alias = program.command(\"alias\").description(\"Manage project-local model aliases\");\n\n alias\n .command(\"init\")\n .description(\"Create an empty ai-tools/aliases.json\")\n .option(\"--path <path>\", \"Custom path\")\n .option(\"--force\", \"Overwrite if already exists\")\n .action((opts: { path?: string; force?: boolean }) => {\n const reg = registry(opts.path);\n if (reg.exists() && !opts.force) {\n console.log(`Aliases file already exists at ${reg.path}`);\n return;\n }\n if (opts.force && reg.exists()) {\n fs.unlinkSync(reg.path);\n }\n reg.init();\n console.log(`✔ Created ${reg.path}`);\n console.log(\n \" Tip: commit this file to your repository so aliases are consistent across environments.\",\n );\n });\n\n alias\n .command(\"set\")\n .description(\"Create or update an alias\")\n .argument(\"<name>\", \"Alias name\")\n .argument(\"<modelId>\", \"Model ID\")\n .option(\"--provider <p>\", \"Provider routing\", \"openrouter\")\n .option(\"--description <d>\", \"Human-readable note\")\n .option(\"--tag <t>\", \"Tag (repeatable)\", (v: string, prev: string[]) => [...prev, v], [] as string[])\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(\n (\n name: string,\n modelId: string,\n opts: { provider: string; description?: string; tag: string[]; path?: string },\n ) => {\n const reg = registry(opts.path);\n if (!reg.exists()) reg.init();\n reg.set(name, {\n modelId,\n provider: opts.provider,\n description: opts.description,\n tags: opts.tag.length ? opts.tag : undefined,\n });\n console.log(`✔ alias \"${name}\" → ${modelId} (via ${opts.provider})`);\n console.log(` Updated ${reg.path}`);\n },\n );\n\n alias\n .command(\"get\")\n .description(\"Show one alias (with catalog resolution when available)\")\n .argument(\"<name>\", \"Alias name\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (name: string, opts: { path?: string }) => {\n const ref = await resolver(opts.path).getModel(name);\n console.log(`Alias: ${ref.alias}`);\n console.log(`Model ID: ${ref.modelId}`);\n console.log(`Provider: ${ref.provider}`);\n if (ref.modelRecord) {\n console.log(`Name: ${ref.name}`);\n console.log(`Context: ${ref.modelRecord.contextLength.toLocaleString()} tokens`);\n console.log(`Status: ${ref.modelRecord.status} ✔`);\n } else {\n console.log(`Catalog: ✘ not found in ai-models catalog (local/custom model)`);\n }\n if (ref.entry.description) console.log(`Description: ${ref.entry.description}`);\n if (ref.entry.tags?.length) console.log(`Tags: ${ref.entry.tags.join(\", \")}`);\n });\n\n alias\n .command(\"list\")\n .description(\"List all aliases\")\n .option(\"--tag <t>\", \"Filter by tag\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--check\", \"Validate each alias against the catalog\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (opts: { tag?: string; json?: boolean; check?: boolean; path?: string }) => {\n const reg = registry(opts.path);\n const rows = reg.list(opts.tag ? { tag: opts.tag } : undefined);\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n if (opts.check) {\n const report = await resolver(opts.path).validate();\n console.log(\"NAME\".padEnd(14), \"MODEL ID\".padEnd(32), \"STATUS\");\n console.log(\"─\".repeat(60));\n for (const e of report.entries) {\n const status =\n e.status === \"ok\" ? \"✔ resolved\" : e.status === \"unknown\" ? \"✘ not in catalog\" : \"✗ broken\";\n console.log(e.name.padEnd(14), e.modelId.padEnd(32), status);\n }\n return;\n }\n\n console.log(\"NAME\".padEnd(14), \"MODEL ID\".padEnd(32), \"PROVIDER\".padEnd(12), \"DESCRIPTION\");\n console.log(\"─\".repeat(90));\n for (const row of rows) {\n console.log(\n row.name.padEnd(14),\n row.modelId.padEnd(32),\n row.provider.padEnd(12),\n (row.description ?? \"\").slice(0, 40),\n );\n }\n });\n\n alias\n .command(\"remove\")\n .description(\"Remove an alias\")\n .argument(\"<name>\", \"Alias name\")\n .option(\"--yes\", \"Skip confirmation\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action((name: string, opts: { yes?: boolean; path?: string }) => {\n if (!opts.yes) {\n console.log(`Remove alias \"${name}\"? Use --yes to confirm.`);\n process.exit(1);\n }\n const removed = registry(opts.path).remove(name);\n if (removed) console.log(`✔ Removed alias \"${name}\"`);\n else {\n console.error(`Alias not found: ${name}`);\n process.exit(1);\n }\n });\n\n alias\n .command(\"rename\")\n .description(\"Rename an alias\")\n .argument(\"<from>\", \"Current name\")\n .argument(\"<to>\", \"New name\")\n .option(\"--force\", \"Overwrite destination if it exists\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action((from: string, to: string, opts: { force?: boolean; path?: string }) => {\n registry(opts.path).rename(from, to, { force: opts.force });\n console.log(`✔ Renamed \"${from}\" → \"${to}\"`);\n });\n\n alias\n .command(\"check\")\n .description(\"Validate all aliases against the catalog (CI-friendly)\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (opts: { path?: string }) => {\n const report = await resolver(opts.path).validate();\n console.log(`Checking ${report.total} aliases against ai-models catalog…\\n`);\n\n for (const e of report.entries) {\n const icon = e.status === \"ok\" ? \"✔\" : e.status === \"unknown\" ? \"⚠\" : \"✗\";\n const extra = e.resolvedName ? ` (${e.resolvedName})` : e.issue ? ` (${e.issue})` : \"\";\n console.log(` ${icon} ${e.name.padEnd(12)} → ${e.modelId.padEnd(28)}${extra}`);\n }\n\n console.log(\n `\\n${report.total} total · ${report.ok} ok · ${report.unknown} unknown · ${report.broken} broken`,\n );\n\n if (report.broken > 0) process.exit(1);\n });\n}\n","export function emitJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function emitHuman(lines: string[]): void {\n for (const line of lines) {\n console.log(line);\n }\n}\n","import type { Command } from \"commander\";\nimport { refreshAiModelsCatalog, verifyAiModelsCatalog } from \"../../catalog/index.js\";\nimport { emitHuman, emitJson } from \"../report.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program.command(\"catalog\").description(\"Model catalog load and health commands\");\n\n catalog\n .command(\"refresh\")\n .description(\"Fetch catalogs from open-assets.x12i.com and warm the cache\")\n .option(\"--bundled-only\", \"Use bundled src/data catalogs only (no HTTP)\")\n .option(\"--json\", \"Machine-readable JSON on stdout\")\n .action(async (opts: { bundledOnly?: boolean; json?: boolean }) => {\n const result = await refreshAiModelsCatalog({ bundledOnly: opts.bundledOnly });\n if (opts.json) {\n emitJson(result);\n } else {\n emitHuman([\n \"✔ Catalog refresh complete\",\n ` Direct: ${result.directCount} (${result.directSource})`,\n ` OpenRouter: ${result.openRouterCount} (${result.openRouterSource})`,\n ]);\n }\n });\n\n catalog\n .command(\"verify\")\n .description(\"Validate direct + OpenRouter catalogs load successfully\")\n .option(\"--bundled-only\", \"Use bundled src/data catalogs only (no HTTP)\")\n .option(\"--json\", \"Machine-readable JSON on stdout\")\n .action(async (opts: { bundledOnly?: boolean; json?: boolean }) => {\n const report = await verifyAiModelsCatalog({ bundledOnly: opts.bundledOnly });\n\n if (opts.json) {\n emitJson(report);\n } else {\n emitHuman([\n report.ok ? \"✔ Catalog verification passed\" : \"✗ Catalog verification FAILED\",\n ` Direct models: ${report.directCount} (${report.directSource})`,\n ` OpenRouter models: ${report.openRouterCount} (${report.openRouterSource})`,\n ` Direct URL: ${report.directUrl}`,\n ` OpenRouter URL: ${report.openRouterUrl}`,\n ]);\n }\n\n if (!report.ok) {\n process.exit(1);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { AliasRegistry } from \"../../aliases/AliasRegistry.js\";\nimport { CostCalculator } from \"../../cost/CostCalculator.js\";\nimport { AiModelsCatalogClient } from \"../../catalog/AiModelsCatalogClient.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction formatUsd(n: number): string {\n return `$${n.toFixed(6)}`;\n}\n\nexport function registerCostCommand(program: Command): void {\n program\n .command(\"cost\")\n .description(\"Estimate cost from catalog pricing\")\n .requiredOption(\"--model <id>\", \"Model ID or alias\")\n .requiredOption(\"--prompt-tokens <n>\", \"Prompt token count\", (v) => Number.parseInt(v, 10))\n .requiredOption(\n \"--completion-tokens <n>\",\n \"Completion token count\",\n (v) => Number.parseInt(v, 10),\n )\n .option(\"--cached-tokens <n>\", \"Cached token count\", (v) => Number.parseInt(v, 10))\n .option(\"--reasoning-tokens <n>\", \"Reasoning token count\", (v) => Number.parseInt(v, 10))\n .option(\"--provider <id>\", \"Provider for pricing selection\", \"openrouter\")\n .option(\"--json\", \"Output raw AiCostResult JSON\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n promptTokens: number;\n completionTokens: number;\n cachedTokens?: number;\n reasoningTokens?: number;\n provider: string;\n json?: boolean;\n bundledOnly?: boolean;\n }) => {\n const catalogClient = new AiModelsCatalogClient({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n bundledOnly: opts.bundledOnly,\n });\n\n const calculator = new CostCalculator(catalogClient, {\n aliasRegistry: new AliasRegistry(),\n });\n\n const result = await calculator.calculate({\n tokens: {\n prompt: opts.promptTokens,\n completion: opts.completionTokens,\n total: opts.promptTokens + opts.completionTokens,\n cached: opts.cachedTokens,\n reasoning: opts.reasoningTokens,\n },\n provider: opts.provider,\n modelUsed: opts.model,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const b = result.breakdown;\n console.log(`Model: ${result.resolvedModelId}`);\n if (result.usedModel && result.usedModel !== result.resolvedModelId) {\n console.log(`Used model: ${result.usedModel}`);\n }\n console.log(\n `Prompt: ${opts.promptTokens.toLocaleString()} tokens → ${formatUsd(b?.promptCostUsd ?? 0)}`,\n );\n console.log(\n `Completion: ${opts.completionTokens.toLocaleString()} tokens → ${formatUsd(b?.completionCostUsd ?? 0)}`,\n );\n console.log(\n `Request fee: → ${formatUsd(b?.requestFlatCostUsd ?? 0)}`,\n );\n console.log(\"─\".repeat(38));\n console.log(`Total: → ${formatUsd(result.cost)}`);\n console.log(\n `Via OpenRouter: ${result.routedViaOpenRouter ? \"yes\" : \"no\"}`,\n );\n });\n}\n","import type { Command } from \"commander\";\nimport { AiModelsService } from \"../../models/AiModelsService.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction service(opts: { bundledOnly?: boolean }) {\n return new AiModelsService({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n bundledOnly: opts.bundledOnly,\n });\n}\n\nexport function registerModelsCommand(program: Command): void {\n const models = program.command(\"models\").description(\"Inspect model catalogs\");\n\n models\n .command(\"list\")\n .description(\"List models with optional filters\")\n .option(\"--provider <id>\", \"Filter by providerId (e.g. openai, anthropic)\")\n .option(\"--output-modality <m>\", \"Filter by output modality (text, image, audio, …)\")\n .option(\"--input-modality <m>\", \"Filter by input modality\")\n .option(\"--parameter <p>\", \"Filter by supported parameter (e.g. tools)\")\n .option(\"--tools\", \"Only models that support tools\")\n .option(\"--reasoning\", \"Only reasoning / thinking models\")\n .option(\"--search <q>\", \"Search name, id, description\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--limit <n>\", \"Max rows\", \"50\")\n .option(\"--offset <n>\", \"Skip rows\", \"0\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n provider?: string;\n outputModality?: string;\n inputModality?: string;\n parameter?: string;\n tools?: boolean;\n reasoning?: boolean;\n search?: string;\n json?: boolean;\n limit?: string;\n offset?: string;\n bundledOnly?: boolean;\n }) => {\n const { models: rows, total } = await service(opts).listModels({\n providerId: opts.provider,\n outputModality: opts.outputModality,\n inputModality: opts.inputModality,\n supportedParameter: opts.parameter,\n supportsTools: opts.tools ? true : undefined,\n supportsReasoning: opts.reasoning ? true : undefined,\n search: opts.search,\n limit: Number.parseInt(opts.limit ?? \"50\", 10),\n offset: Number.parseInt(opts.offset ?? \"0\", 10),\n });\n\n if (opts.json) {\n console.log(JSON.stringify({ total, models: rows }, null, 2));\n return;\n }\n\n console.log(\n \"MODEL ID\".padEnd(42),\n \"PROVIDER\".padEnd(14),\n \"OUTPUT\".padEnd(10),\n \"R\".padEnd(3),\n \"NAME\",\n );\n console.log(\"─\".repeat(104));\n for (const m of rows) {\n console.log(\n m.modelId.padEnd(42),\n m.providerId.padEnd(14),\n m.primaryOutputModality.padEnd(10),\n (m.supportsReasoning ? \"yes\" : \"no\").padEnd(3),\n m.name.slice(0, 40),\n );\n }\n console.log(`\\n${rows.length} shown · ${total} matching`);\n });\n\n models\n .command(\"get\")\n .description(\"Get full model record by ID or alias\")\n .argument(\"<modelId>\", \"Model ID or alias\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (modelId: string, opts: { bundledOnly?: boolean }) => {\n const model = await service(opts).getModelInfo(modelId);\n if (!model) {\n console.error(`Model not found: ${modelId}`);\n process.exit(1);\n }\n console.log(JSON.stringify(model, null, 2));\n });\n\n models\n .command(\"resolve\")\n .description(\"Resolve provider + model to canonical id\")\n .requiredOption(\"--model <m>\", \"Model string (required)\")\n .option(\"--provider <p>\", \"Provider hint (openrouter, openai, …)\")\n .option(\"--threshold <n>\", \"Confidence threshold 0–1\", \"0.6\")\n .option(\"--json\", \"Output raw ModelResolutionResult JSON\")\n .option(\"--verbose\", \"Show strategy trail\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n provider?: string;\n threshold?: string;\n json?: boolean;\n verbose?: boolean;\n bundledOnly?: boolean;\n }) => {\n const result = await service(opts).resolve(opts.model, opts.provider);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const providerLabel = opts.provider ?? \"unspecified\";\n console.log(`Input: provider=\"${providerLabel}\" model=\"${opts.model}\"`);\n\n if (opts.verbose && result.found) {\n console.log(`Normalised: model=\"${result.normalisedInput}\"`);\n console.log(\"\\nStrategy trail:\");\n for (const s of result.resolvedVia) {\n console.log(` • ${s}`);\n }\n console.log();\n }\n\n if (!result.found) {\n console.log(\"Result: NOT FOUND\");\n console.log(`Reason: ${result.reason}`);\n if (result.bestRejectedCandidate) {\n console.log(\n `Candidate: ${result.bestRejectedCandidate.modelId} (confidence ${result.bestRejectedCandidate.confidence.toFixed(2)})`,\n );\n }\n console.log('Tip: Run \"ai-tools catalog refresh\" or \"ai-tools alias set\".');\n process.exit(1);\n return;\n }\n\n console.log(`Resolved: ${result.modelId}`);\n console.log(`Name: ${result.record?.name ?? \"(no catalog record)\"}`);\n console.log(`Strategy: ${result.resolvedVia.join(\" → \")}`);\n console.log(`Confidence: ${result.confidence.toFixed(2)}`);\n console.log(`Via OR: ${result.routedViaOpenRouter ? \"yes\" : \"no\"}`);\n });\n\n models\n .command(\"count\")\n .description(\"Count models matching filters\")\n .option(\"--provider <id>\", \"Filter by providerId\")\n .option(\"--output-modality <m>\", \"Filter by output modality\")\n .option(\"--parameter <p>\", \"Filter by supported parameter\")\n .option(\"--tools\", \"Only models that support tools\")\n .option(\"--reasoning\", \"Only reasoning / thinking models\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n provider?: string;\n outputModality?: string;\n parameter?: string;\n tools?: boolean;\n reasoning?: boolean;\n bundledOnly?: boolean;\n }) => {\n const n = await service(opts).countModels({\n providerId: opts.provider,\n outputModality: opts.outputModality,\n supportedParameter: opts.parameter,\n supportsTools: opts.tools ? true : undefined,\n supportsReasoning: opts.reasoning ? true : undefined,\n });\n console.log(n);\n });\n}\n"]}
package/dist/cli/index.js CHANGED
@@ -1,24 +1,25 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CostCalculator
4
- } from "../chunk-CTM35DMA.js";
4
+ } from "../chunk-PN4FF6YF.js";
5
5
  import {
6
6
  AliasRegistry,
7
7
  AliasResolver
8
8
  } from "../chunk-ANVONYJF.js";
9
9
  import {
10
10
  AiModelsService
11
- } from "../chunk-VJHLO2R3.js";
11
+ } from "../chunk-KSJSLKYI.js";
12
12
  import {
13
13
  refreshAiModelsCatalog,
14
14
  verifyAiModelsCatalog
15
- } from "../chunk-AB5GNXJ4.js";
15
+ } from "../chunk-ZPUZ7DBO.js";
16
16
  import {
17
17
  AiModelsCatalogClient,
18
18
  resolveCatalogCacheTtlMs
19
- } from "../chunk-OPN6BGNH.js";
20
- import "../chunk-EYHMQVAL.js";
21
- import "../chunk-B3V2EHRY.js";
19
+ } from "../chunk-D6OIUYNC.js";
20
+ import "../chunk-HEB73GKJ.js";
21
+ import "../chunk-54GKLIDW.js";
22
+ import "../chunk-SLSKQRMI.js";
22
23
  import "../chunk-2PTCWPHV.js";
23
24
 
24
25
  // src/cli/index.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/alias.ts","../../src/cli/report.ts","../../src/cli/commands/catalog.ts","../../src/cli/commands/cost.ts","../../src/cli/commands/models.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { registerAliasCommand } from \"./commands/alias.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerCostCommand } from \"./commands/cost.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\nconst pkg = JSON.parse(\n readFileSync(join(dirname(fileURLToPath(import.meta.url)), \"../../package.json\"), \"utf8\"),\n) as { version: string };\n\nconst program = new Command();\n\nprogram\n .name(\"ai-tools\")\n .description(\"@x12i/ai-tools — AI model catalog, cost calculation, and utilities\")\n .version(pkg.version);\n\nregisterCatalogCommand(program);\nregisterModelsCommand(program);\nregisterCostCommand(program);\nregisterAliasCommand(program);\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","import fs from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { AliasRegistry } from \"../../aliases/AliasRegistry.js\";\nimport { AliasResolver } from \"../../aliases/AliasResolver.js\";\nimport { AiModelsCatalogClient } from \"../../catalog/AiModelsCatalogClient.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction registry(path?: string) {\n return new AliasRegistry(path ? { aliasesPath: path } : {});\n}\n\nfunction resolver(path?: string) {\n return new AliasResolver({\n registry: registry(path),\n catalogClient: new AiModelsCatalogClient({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n }),\n });\n}\n\nexport function registerAliasCommand(program: Command): void {\n const alias = program.command(\"alias\").description(\"Manage project-local model aliases\");\n\n alias\n .command(\"init\")\n .description(\"Create an empty ai-tools/aliases.json\")\n .option(\"--path <path>\", \"Custom path\")\n .option(\"--force\", \"Overwrite if already exists\")\n .action((opts: { path?: string; force?: boolean }) => {\n const reg = registry(opts.path);\n if (reg.exists() && !opts.force) {\n console.log(`Aliases file already exists at ${reg.path}`);\n return;\n }\n if (opts.force && reg.exists()) {\n fs.unlinkSync(reg.path);\n }\n reg.init();\n console.log(`✔ Created ${reg.path}`);\n console.log(\n \" Tip: commit this file to your repository so aliases are consistent across environments.\",\n );\n });\n\n alias\n .command(\"set\")\n .description(\"Create or update an alias\")\n .argument(\"<name>\", \"Alias name\")\n .argument(\"<modelId>\", \"Model ID\")\n .option(\"--provider <p>\", \"Provider routing\", \"openrouter\")\n .option(\"--description <d>\", \"Human-readable note\")\n .option(\"--tag <t>\", \"Tag (repeatable)\", (v: string, prev: string[]) => [...prev, v], [] as string[])\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(\n (\n name: string,\n modelId: string,\n opts: { provider: string; description?: string; tag: string[]; path?: string },\n ) => {\n const reg = registry(opts.path);\n if (!reg.exists()) reg.init();\n reg.set(name, {\n modelId,\n provider: opts.provider,\n description: opts.description,\n tags: opts.tag.length ? opts.tag : undefined,\n });\n console.log(`✔ alias \"${name}\" → ${modelId} (via ${opts.provider})`);\n console.log(` Updated ${reg.path}`);\n },\n );\n\n alias\n .command(\"get\")\n .description(\"Show one alias (with catalog resolution when available)\")\n .argument(\"<name>\", \"Alias name\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (name: string, opts: { path?: string }) => {\n const ref = await resolver(opts.path).getModel(name);\n console.log(`Alias: ${ref.alias}`);\n console.log(`Model ID: ${ref.modelId}`);\n console.log(`Provider: ${ref.provider}`);\n if (ref.modelRecord) {\n console.log(`Name: ${ref.name}`);\n console.log(`Context: ${ref.modelRecord.contextLength.toLocaleString()} tokens`);\n console.log(`Status: ${ref.modelRecord.status} ✔`);\n } else {\n console.log(`Catalog: ✘ not found in ai-models catalog (local/custom model)`);\n }\n if (ref.entry.description) console.log(`Description: ${ref.entry.description}`);\n if (ref.entry.tags?.length) console.log(`Tags: ${ref.entry.tags.join(\", \")}`);\n });\n\n alias\n .command(\"list\")\n .description(\"List all aliases\")\n .option(\"--tag <t>\", \"Filter by tag\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--check\", \"Validate each alias against the catalog\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (opts: { tag?: string; json?: boolean; check?: boolean; path?: string }) => {\n const reg = registry(opts.path);\n const rows = reg.list(opts.tag ? { tag: opts.tag } : undefined);\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n if (opts.check) {\n const report = await resolver(opts.path).validate();\n console.log(\"NAME\".padEnd(14), \"MODEL ID\".padEnd(32), \"STATUS\");\n console.log(\"─\".repeat(60));\n for (const e of report.entries) {\n const status =\n e.status === \"ok\" ? \"✔ resolved\" : e.status === \"unknown\" ? \"✘ not in catalog\" : \"✗ broken\";\n console.log(e.name.padEnd(14), e.modelId.padEnd(32), status);\n }\n return;\n }\n\n console.log(\"NAME\".padEnd(14), \"MODEL ID\".padEnd(32), \"PROVIDER\".padEnd(12), \"DESCRIPTION\");\n console.log(\"─\".repeat(90));\n for (const row of rows) {\n console.log(\n row.name.padEnd(14),\n row.modelId.padEnd(32),\n row.provider.padEnd(12),\n (row.description ?? \"\").slice(0, 40),\n );\n }\n });\n\n alias\n .command(\"remove\")\n .description(\"Remove an alias\")\n .argument(\"<name>\", \"Alias name\")\n .option(\"--yes\", \"Skip confirmation\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action((name: string, opts: { yes?: boolean; path?: string }) => {\n if (!opts.yes) {\n console.log(`Remove alias \"${name}\"? Use --yes to confirm.`);\n process.exit(1);\n }\n const removed = registry(opts.path).remove(name);\n if (removed) console.log(`✔ Removed alias \"${name}\"`);\n else {\n console.error(`Alias not found: ${name}`);\n process.exit(1);\n }\n });\n\n alias\n .command(\"rename\")\n .description(\"Rename an alias\")\n .argument(\"<from>\", \"Current name\")\n .argument(\"<to>\", \"New name\")\n .option(\"--force\", \"Overwrite destination if it exists\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action((from: string, to: string, opts: { force?: boolean; path?: string }) => {\n registry(opts.path).rename(from, to, { force: opts.force });\n console.log(`✔ Renamed \"${from}\" → \"${to}\"`);\n });\n\n alias\n .command(\"check\")\n .description(\"Validate all aliases against the catalog (CI-friendly)\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (opts: { path?: string }) => {\n const report = await resolver(opts.path).validate();\n console.log(`Checking ${report.total} aliases against ai-models catalog…\\n`);\n\n for (const e of report.entries) {\n const icon = e.status === \"ok\" ? \"✔\" : e.status === \"unknown\" ? \"⚠\" : \"✗\";\n const extra = e.resolvedName ? ` (${e.resolvedName})` : e.issue ? ` (${e.issue})` : \"\";\n console.log(` ${icon} ${e.name.padEnd(12)} → ${e.modelId.padEnd(28)}${extra}`);\n }\n\n console.log(\n `\\n${report.total} total · ${report.ok} ok · ${report.unknown} unknown · ${report.broken} broken`,\n );\n\n if (report.broken > 0) process.exit(1);\n });\n}\n","export function emitJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function emitHuman(lines: string[]): void {\n for (const line of lines) {\n console.log(line);\n }\n}\n","import type { Command } from \"commander\";\nimport { refreshAiModelsCatalog, verifyAiModelsCatalog } from \"../../catalog/index.js\";\nimport { emitHuman, emitJson } from \"../report.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program.command(\"catalog\").description(\"Model catalog load and health commands\");\n\n catalog\n .command(\"refresh\")\n .description(\"Fetch catalogs from open-assets.x12i.com and warm the cache\")\n .option(\"--bundled-only\", \"Use bundled src/data catalogs only (no HTTP)\")\n .option(\"--json\", \"Machine-readable JSON on stdout\")\n .action(async (opts: { bundledOnly?: boolean; json?: boolean }) => {\n const result = await refreshAiModelsCatalog({ bundledOnly: opts.bundledOnly });\n if (opts.json) {\n emitJson(result);\n } else {\n emitHuman([\n \"✔ Catalog refresh complete\",\n ` Direct: ${result.directCount} (${result.directSource})`,\n ` OpenRouter: ${result.openRouterCount} (${result.openRouterSource})`,\n ]);\n }\n });\n\n catalog\n .command(\"verify\")\n .description(\"Validate direct + OpenRouter catalogs load successfully\")\n .option(\"--bundled-only\", \"Use bundled src/data catalogs only (no HTTP)\")\n .option(\"--json\", \"Machine-readable JSON on stdout\")\n .action(async (opts: { bundledOnly?: boolean; json?: boolean }) => {\n const report = await verifyAiModelsCatalog({ bundledOnly: opts.bundledOnly });\n\n if (opts.json) {\n emitJson(report);\n } else {\n emitHuman([\n report.ok ? \"✔ Catalog verification passed\" : \"✗ Catalog verification FAILED\",\n ` Direct models: ${report.directCount} (${report.directSource})`,\n ` OpenRouter models: ${report.openRouterCount} (${report.openRouterSource})`,\n ` Direct URL: ${report.directUrl}`,\n ` OpenRouter URL: ${report.openRouterUrl}`,\n ]);\n }\n\n if (!report.ok) {\n process.exit(1);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { AliasRegistry } from \"../../aliases/AliasRegistry.js\";\nimport { CostCalculator } from \"../../cost/CostCalculator.js\";\nimport { AiModelsCatalogClient } from \"../../catalog/AiModelsCatalogClient.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction formatUsd(n: number): string {\n return `$${n.toFixed(6)}`;\n}\n\nexport function registerCostCommand(program: Command): void {\n program\n .command(\"cost\")\n .description(\"Estimate cost from catalog pricing\")\n .requiredOption(\"--model <id>\", \"Model ID or alias\")\n .requiredOption(\"--prompt-tokens <n>\", \"Prompt token count\", (v) => Number.parseInt(v, 10))\n .requiredOption(\n \"--completion-tokens <n>\",\n \"Completion token count\",\n (v) => Number.parseInt(v, 10),\n )\n .option(\"--cached-tokens <n>\", \"Cached token count\", (v) => Number.parseInt(v, 10))\n .option(\"--reasoning-tokens <n>\", \"Reasoning token count\", (v) => Number.parseInt(v, 10))\n .option(\"--provider <id>\", \"Provider for pricing selection\", \"openrouter\")\n .option(\"--json\", \"Output raw AiCostResult JSON\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n promptTokens: number;\n completionTokens: number;\n cachedTokens?: number;\n reasoningTokens?: number;\n provider: string;\n json?: boolean;\n bundledOnly?: boolean;\n }) => {\n const catalogClient = new AiModelsCatalogClient({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n bundledOnly: opts.bundledOnly,\n });\n\n const calculator = new CostCalculator(catalogClient, {\n aliasRegistry: new AliasRegistry(),\n });\n\n const result = await calculator.calculate({\n tokens: {\n prompt: opts.promptTokens,\n completion: opts.completionTokens,\n total: opts.promptTokens + opts.completionTokens,\n cached: opts.cachedTokens,\n reasoning: opts.reasoningTokens,\n },\n provider: opts.provider,\n modelUsed: opts.model,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const b = result.breakdown;\n console.log(`Model: ${result.resolvedModelId}`);\n if (result.usedModel && result.usedModel !== result.resolvedModelId) {\n console.log(`Used model: ${result.usedModel}`);\n }\n console.log(\n `Prompt: ${opts.promptTokens.toLocaleString()} tokens → ${formatUsd(b?.promptCostUsd ?? 0)}`,\n );\n console.log(\n `Completion: ${opts.completionTokens.toLocaleString()} tokens → ${formatUsd(b?.completionCostUsd ?? 0)}`,\n );\n console.log(\n `Request fee: → ${formatUsd(b?.requestFlatCostUsd ?? 0)}`,\n );\n console.log(\"─\".repeat(38));\n console.log(`Total: → ${formatUsd(result.cost)}`);\n console.log(\n `Via OpenRouter: ${result.routedViaOpenRouter ? \"yes\" : \"no\"}`,\n );\n });\n}\n","import type { Command } from \"commander\";\nimport { AiModelsService } from \"../../models/AiModelsService.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction service(opts: { bundledOnly?: boolean }) {\n return new AiModelsService({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n bundledOnly: opts.bundledOnly,\n });\n}\n\nexport function registerModelsCommand(program: Command): void {\n const models = program.command(\"models\").description(\"Inspect model catalogs\");\n\n models\n .command(\"list\")\n .description(\"List models with optional filters\")\n .option(\"--provider <id>\", \"Filter by providerId (e.g. openai, anthropic)\")\n .option(\"--output-modality <m>\", \"Filter by output modality (text, image, audio, …)\")\n .option(\"--input-modality <m>\", \"Filter by input modality\")\n .option(\"--parameter <p>\", \"Filter by supported parameter (e.g. tools)\")\n .option(\"--tools\", \"Only models that support tools\")\n .option(\"--reasoning\", \"Only reasoning / thinking models\")\n .option(\"--search <q>\", \"Search name, id, description\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--limit <n>\", \"Max rows\", \"50\")\n .option(\"--offset <n>\", \"Skip rows\", \"0\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n provider?: string;\n outputModality?: string;\n inputModality?: string;\n parameter?: string;\n tools?: boolean;\n reasoning?: boolean;\n search?: string;\n json?: boolean;\n limit?: string;\n offset?: string;\n bundledOnly?: boolean;\n }) => {\n const { models: rows, total } = await service(opts).listModels({\n providerId: opts.provider,\n outputModality: opts.outputModality,\n inputModality: opts.inputModality,\n supportedParameter: opts.parameter,\n supportsTools: opts.tools ? true : undefined,\n supportsReasoning: opts.reasoning ? true : undefined,\n search: opts.search,\n limit: Number.parseInt(opts.limit ?? \"50\", 10),\n offset: Number.parseInt(opts.offset ?? \"0\", 10),\n });\n\n if (opts.json) {\n console.log(JSON.stringify({ total, models: rows }, null, 2));\n return;\n }\n\n console.log(\n \"MODEL ID\".padEnd(42),\n \"PROVIDER\".padEnd(14),\n \"OUTPUT\".padEnd(10),\n \"R\".padEnd(3),\n \"NAME\",\n );\n console.log(\"─\".repeat(104));\n for (const m of rows) {\n console.log(\n m.modelId.padEnd(42),\n m.providerId.padEnd(14),\n m.primaryOutputModality.padEnd(10),\n (m.supportsReasoning ? \"yes\" : \"no\").padEnd(3),\n m.name.slice(0, 40),\n );\n }\n console.log(`\\n${rows.length} shown · ${total} matching`);\n });\n\n models\n .command(\"get\")\n .description(\"Get full model record by ID or alias\")\n .argument(\"<modelId>\", \"Model ID or alias\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (modelId: string, opts: { bundledOnly?: boolean }) => {\n const model = await service(opts).getModelInfo(modelId);\n if (!model) {\n console.error(`Model not found: ${modelId}`);\n process.exit(1);\n }\n console.log(JSON.stringify(model, null, 2));\n });\n\n models\n .command(\"resolve\")\n .description(\"Resolve provider + model to canonical id\")\n .requiredOption(\"--model <m>\", \"Model string (required)\")\n .option(\"--provider <p>\", \"Provider hint (openrouter, openai, …)\")\n .option(\"--threshold <n>\", \"Confidence threshold 0–1\", \"0.6\")\n .option(\"--json\", \"Output raw ModelResolutionResult JSON\")\n .option(\"--verbose\", \"Show strategy trail\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n provider?: string;\n threshold?: string;\n json?: boolean;\n verbose?: boolean;\n bundledOnly?: boolean;\n }) => {\n const result = await service(opts).resolve(opts.model, opts.provider);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const providerLabel = opts.provider ?? \"unspecified\";\n console.log(`Input: provider=\"${providerLabel}\" model=\"${opts.model}\"`);\n\n if (opts.verbose && result.found) {\n console.log(`Normalised: model=\"${result.normalisedInput}\"`);\n console.log(\"\\nStrategy trail:\");\n for (const s of result.resolvedVia) {\n console.log(` • ${s}`);\n }\n console.log();\n }\n\n if (!result.found) {\n console.log(\"Result: NOT FOUND\");\n console.log(`Reason: ${result.reason}`);\n if (result.bestRejectedCandidate) {\n console.log(\n `Candidate: ${result.bestRejectedCandidate.modelId} (confidence ${result.bestRejectedCandidate.confidence.toFixed(2)})`,\n );\n }\n console.log('Tip: Run \"ai-tools catalog refresh\" or \"ai-tools alias set\".');\n process.exit(1);\n return;\n }\n\n console.log(`Resolved: ${result.modelId}`);\n console.log(`Name: ${result.record?.name ?? \"(no catalog record)\"}`);\n console.log(`Strategy: ${result.resolvedVia.join(\" → \")}`);\n console.log(`Confidence: ${result.confidence.toFixed(2)}`);\n console.log(`Via OR: ${result.routedViaOpenRouter ? \"yes\" : \"no\"}`);\n });\n\n models\n .command(\"count\")\n .description(\"Count models matching filters\")\n .option(\"--provider <id>\", \"Filter by providerId\")\n .option(\"--output-modality <m>\", \"Filter by output modality\")\n .option(\"--parameter <p>\", \"Filter by supported parameter\")\n .option(\"--tools\", \"Only models that support tools\")\n .option(\"--reasoning\", \"Only reasoning / thinking models\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n provider?: string;\n outputModality?: string;\n parameter?: string;\n tools?: boolean;\n reasoning?: boolean;\n bundledOnly?: boolean;\n }) => {\n const n = await service(opts).countModels({\n providerId: opts.provider,\n outputModality: opts.outputModality,\n supportedParameter: opts.parameter,\n supportsTools: opts.tools ? true : undefined,\n supportsReasoning: opts.reasoning ? true : undefined,\n });\n console.log(n);\n });\n}\n"],"mappings":"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","names":["program","program","program","program"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/alias.ts","../../src/cli/report.ts","../../src/cli/commands/catalog.ts","../../src/cli/commands/cost.ts","../../src/cli/commands/models.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { registerAliasCommand } from \"./commands/alias.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerCostCommand } from \"./commands/cost.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\nconst pkg = JSON.parse(\n readFileSync(join(dirname(fileURLToPath(import.meta.url)), \"../../package.json\"), \"utf8\"),\n) as { version: string };\n\nconst program = new Command();\n\nprogram\n .name(\"ai-tools\")\n .description(\"@x12i/ai-tools — AI model catalog, cost calculation, and utilities\")\n .version(pkg.version);\n\nregisterCatalogCommand(program);\nregisterModelsCommand(program);\nregisterCostCommand(program);\nregisterAliasCommand(program);\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","import fs from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { AliasRegistry } from \"../../aliases/AliasRegistry.js\";\nimport { AliasResolver } from \"../../aliases/AliasResolver.js\";\nimport { AiModelsCatalogClient } from \"../../catalog/AiModelsCatalogClient.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction registry(path?: string) {\n return new AliasRegistry(path ? { aliasesPath: path } : {});\n}\n\nfunction resolver(path?: string) {\n return new AliasResolver({\n registry: registry(path),\n catalogClient: new AiModelsCatalogClient({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n }),\n });\n}\n\nexport function registerAliasCommand(program: Command): void {\n const alias = program.command(\"alias\").description(\"Manage project-local model aliases\");\n\n alias\n .command(\"init\")\n .description(\"Create an empty ai-tools/aliases.json\")\n .option(\"--path <path>\", \"Custom path\")\n .option(\"--force\", \"Overwrite if already exists\")\n .action((opts: { path?: string; force?: boolean }) => {\n const reg = registry(opts.path);\n if (reg.exists() && !opts.force) {\n console.log(`Aliases file already exists at ${reg.path}`);\n return;\n }\n if (opts.force && reg.exists()) {\n fs.unlinkSync(reg.path);\n }\n reg.init();\n console.log(`✔ Created ${reg.path}`);\n console.log(\n \" Tip: commit this file to your repository so aliases are consistent across environments.\",\n );\n });\n\n alias\n .command(\"set\")\n .description(\"Create or update an alias\")\n .argument(\"<name>\", \"Alias name\")\n .argument(\"<modelId>\", \"Model ID\")\n .option(\"--provider <p>\", \"Provider routing\", \"openrouter\")\n .option(\"--description <d>\", \"Human-readable note\")\n .option(\"--tag <t>\", \"Tag (repeatable)\", (v: string, prev: string[]) => [...prev, v], [] as string[])\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(\n (\n name: string,\n modelId: string,\n opts: { provider: string; description?: string; tag: string[]; path?: string },\n ) => {\n const reg = registry(opts.path);\n if (!reg.exists()) reg.init();\n reg.set(name, {\n modelId,\n provider: opts.provider,\n description: opts.description,\n tags: opts.tag.length ? opts.tag : undefined,\n });\n console.log(`✔ alias \"${name}\" → ${modelId} (via ${opts.provider})`);\n console.log(` Updated ${reg.path}`);\n },\n );\n\n alias\n .command(\"get\")\n .description(\"Show one alias (with catalog resolution when available)\")\n .argument(\"<name>\", \"Alias name\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (name: string, opts: { path?: string }) => {\n const ref = await resolver(opts.path).getModel(name);\n console.log(`Alias: ${ref.alias}`);\n console.log(`Model ID: ${ref.modelId}`);\n console.log(`Provider: ${ref.provider}`);\n if (ref.modelRecord) {\n console.log(`Name: ${ref.name}`);\n console.log(`Context: ${ref.modelRecord.contextLength.toLocaleString()} tokens`);\n console.log(`Status: ${ref.modelRecord.status} ✔`);\n } else {\n console.log(`Catalog: ✘ not found in ai-models catalog (local/custom model)`);\n }\n if (ref.entry.description) console.log(`Description: ${ref.entry.description}`);\n if (ref.entry.tags?.length) console.log(`Tags: ${ref.entry.tags.join(\", \")}`);\n });\n\n alias\n .command(\"list\")\n .description(\"List all aliases\")\n .option(\"--tag <t>\", \"Filter by tag\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--check\", \"Validate each alias against the catalog\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (opts: { tag?: string; json?: boolean; check?: boolean; path?: string }) => {\n const reg = registry(opts.path);\n const rows = reg.list(opts.tag ? { tag: opts.tag } : undefined);\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n if (opts.check) {\n const report = await resolver(opts.path).validate();\n console.log(\"NAME\".padEnd(14), \"MODEL ID\".padEnd(32), \"STATUS\");\n console.log(\"─\".repeat(60));\n for (const e of report.entries) {\n const status =\n e.status === \"ok\" ? \"✔ resolved\" : e.status === \"unknown\" ? \"✘ not in catalog\" : \"✗ broken\";\n console.log(e.name.padEnd(14), e.modelId.padEnd(32), status);\n }\n return;\n }\n\n console.log(\"NAME\".padEnd(14), \"MODEL ID\".padEnd(32), \"PROVIDER\".padEnd(12), \"DESCRIPTION\");\n console.log(\"─\".repeat(90));\n for (const row of rows) {\n console.log(\n row.name.padEnd(14),\n row.modelId.padEnd(32),\n row.provider.padEnd(12),\n (row.description ?? \"\").slice(0, 40),\n );\n }\n });\n\n alias\n .command(\"remove\")\n .description(\"Remove an alias\")\n .argument(\"<name>\", \"Alias name\")\n .option(\"--yes\", \"Skip confirmation\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action((name: string, opts: { yes?: boolean; path?: string }) => {\n if (!opts.yes) {\n console.log(`Remove alias \"${name}\"? Use --yes to confirm.`);\n process.exit(1);\n }\n const removed = registry(opts.path).remove(name);\n if (removed) console.log(`✔ Removed alias \"${name}\"`);\n else {\n console.error(`Alias not found: ${name}`);\n process.exit(1);\n }\n });\n\n alias\n .command(\"rename\")\n .description(\"Rename an alias\")\n .argument(\"<from>\", \"Current name\")\n .argument(\"<to>\", \"New name\")\n .option(\"--force\", \"Overwrite destination if it exists\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action((from: string, to: string, opts: { force?: boolean; path?: string }) => {\n registry(opts.path).rename(from, to, { force: opts.force });\n console.log(`✔ Renamed \"${from}\" → \"${to}\"`);\n });\n\n alias\n .command(\"check\")\n .description(\"Validate all aliases against the catalog (CI-friendly)\")\n .option(\"--path <path>\", \"Custom aliases path\")\n .action(async (opts: { path?: string }) => {\n const report = await resolver(opts.path).validate();\n console.log(`Checking ${report.total} aliases against ai-models catalog…\\n`);\n\n for (const e of report.entries) {\n const icon = e.status === \"ok\" ? \"✔\" : e.status === \"unknown\" ? \"⚠\" : \"✗\";\n const extra = e.resolvedName ? ` (${e.resolvedName})` : e.issue ? ` (${e.issue})` : \"\";\n console.log(` ${icon} ${e.name.padEnd(12)} → ${e.modelId.padEnd(28)}${extra}`);\n }\n\n console.log(\n `\\n${report.total} total · ${report.ok} ok · ${report.unknown} unknown · ${report.broken} broken`,\n );\n\n if (report.broken > 0) process.exit(1);\n });\n}\n","export function emitJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function emitHuman(lines: string[]): void {\n for (const line of lines) {\n console.log(line);\n }\n}\n","import type { Command } from \"commander\";\nimport { refreshAiModelsCatalog, verifyAiModelsCatalog } from \"../../catalog/index.js\";\nimport { emitHuman, emitJson } from \"../report.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program.command(\"catalog\").description(\"Model catalog load and health commands\");\n\n catalog\n .command(\"refresh\")\n .description(\"Fetch catalogs from open-assets.x12i.com and warm the cache\")\n .option(\"--bundled-only\", \"Use bundled src/data catalogs only (no HTTP)\")\n .option(\"--json\", \"Machine-readable JSON on stdout\")\n .action(async (opts: { bundledOnly?: boolean; json?: boolean }) => {\n const result = await refreshAiModelsCatalog({ bundledOnly: opts.bundledOnly });\n if (opts.json) {\n emitJson(result);\n } else {\n emitHuman([\n \"✔ Catalog refresh complete\",\n ` Direct: ${result.directCount} (${result.directSource})`,\n ` OpenRouter: ${result.openRouterCount} (${result.openRouterSource})`,\n ]);\n }\n });\n\n catalog\n .command(\"verify\")\n .description(\"Validate direct + OpenRouter catalogs load successfully\")\n .option(\"--bundled-only\", \"Use bundled src/data catalogs only (no HTTP)\")\n .option(\"--json\", \"Machine-readable JSON on stdout\")\n .action(async (opts: { bundledOnly?: boolean; json?: boolean }) => {\n const report = await verifyAiModelsCatalog({ bundledOnly: opts.bundledOnly });\n\n if (opts.json) {\n emitJson(report);\n } else {\n emitHuman([\n report.ok ? \"✔ Catalog verification passed\" : \"✗ Catalog verification FAILED\",\n ` Direct models: ${report.directCount} (${report.directSource})`,\n ` OpenRouter models: ${report.openRouterCount} (${report.openRouterSource})`,\n ` Direct URL: ${report.directUrl}`,\n ` OpenRouter URL: ${report.openRouterUrl}`,\n ]);\n }\n\n if (!report.ok) {\n process.exit(1);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { AliasRegistry } from \"../../aliases/AliasRegistry.js\";\nimport { CostCalculator } from \"../../cost/CostCalculator.js\";\nimport { AiModelsCatalogClient } from \"../../catalog/AiModelsCatalogClient.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction formatUsd(n: number): string {\n return `$${n.toFixed(6)}`;\n}\n\nexport function registerCostCommand(program: Command): void {\n program\n .command(\"cost\")\n .description(\"Estimate cost from catalog pricing\")\n .requiredOption(\"--model <id>\", \"Model ID or alias\")\n .requiredOption(\"--prompt-tokens <n>\", \"Prompt token count\", (v) => Number.parseInt(v, 10))\n .requiredOption(\n \"--completion-tokens <n>\",\n \"Completion token count\",\n (v) => Number.parseInt(v, 10),\n )\n .option(\"--cached-tokens <n>\", \"Cached token count\", (v) => Number.parseInt(v, 10))\n .option(\"--reasoning-tokens <n>\", \"Reasoning token count\", (v) => Number.parseInt(v, 10))\n .option(\"--provider <id>\", \"Provider for pricing selection\", \"openrouter\")\n .option(\"--json\", \"Output raw AiCostResult JSON\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n promptTokens: number;\n completionTokens: number;\n cachedTokens?: number;\n reasoningTokens?: number;\n provider: string;\n json?: boolean;\n bundledOnly?: boolean;\n }) => {\n const catalogClient = new AiModelsCatalogClient({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n bundledOnly: opts.bundledOnly,\n });\n\n const calculator = new CostCalculator(catalogClient, {\n aliasRegistry: new AliasRegistry(),\n });\n\n const result = await calculator.calculate({\n tokens: {\n prompt: opts.promptTokens,\n completion: opts.completionTokens,\n total: opts.promptTokens + opts.completionTokens,\n cached: opts.cachedTokens,\n reasoning: opts.reasoningTokens,\n },\n provider: opts.provider,\n modelUsed: opts.model,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const b = result.breakdown;\n console.log(`Model: ${result.resolvedModelId}`);\n if (result.usedModel && result.usedModel !== result.resolvedModelId) {\n console.log(`Used model: ${result.usedModel}`);\n }\n console.log(\n `Prompt: ${opts.promptTokens.toLocaleString()} tokens → ${formatUsd(b?.promptCostUsd ?? 0)}`,\n );\n console.log(\n `Completion: ${opts.completionTokens.toLocaleString()} tokens → ${formatUsd(b?.completionCostUsd ?? 0)}`,\n );\n console.log(\n `Request fee: → ${formatUsd(b?.requestFlatCostUsd ?? 0)}`,\n );\n console.log(\"─\".repeat(38));\n console.log(`Total: → ${formatUsd(result.cost)}`);\n console.log(\n `Via OpenRouter: ${result.routedViaOpenRouter ? \"yes\" : \"no\"}`,\n );\n });\n}\n","import type { Command } from \"commander\";\nimport { AiModelsService } from \"../../models/AiModelsService.js\";\nimport { resolveCatalogCacheTtlMs } from \"../../cache/modelCache.js\";\n\nfunction service(opts: { bundledOnly?: boolean }) {\n return new AiModelsService({\n cacheTtlMs: resolveCatalogCacheTtlMs(),\n bundledOnly: opts.bundledOnly,\n });\n}\n\nexport function registerModelsCommand(program: Command): void {\n const models = program.command(\"models\").description(\"Inspect model catalogs\");\n\n models\n .command(\"list\")\n .description(\"List models with optional filters\")\n .option(\"--provider <id>\", \"Filter by providerId (e.g. openai, anthropic)\")\n .option(\"--output-modality <m>\", \"Filter by output modality (text, image, audio, …)\")\n .option(\"--input-modality <m>\", \"Filter by input modality\")\n .option(\"--parameter <p>\", \"Filter by supported parameter (e.g. tools)\")\n .option(\"--tools\", \"Only models that support tools\")\n .option(\"--reasoning\", \"Only reasoning / thinking models\")\n .option(\"--search <q>\", \"Search name, id, description\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--limit <n>\", \"Max rows\", \"50\")\n .option(\"--offset <n>\", \"Skip rows\", \"0\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n provider?: string;\n outputModality?: string;\n inputModality?: string;\n parameter?: string;\n tools?: boolean;\n reasoning?: boolean;\n search?: string;\n json?: boolean;\n limit?: string;\n offset?: string;\n bundledOnly?: boolean;\n }) => {\n const { models: rows, total } = await service(opts).listModels({\n providerId: opts.provider,\n outputModality: opts.outputModality,\n inputModality: opts.inputModality,\n supportedParameter: opts.parameter,\n supportsTools: opts.tools ? true : undefined,\n supportsReasoning: opts.reasoning ? true : undefined,\n search: opts.search,\n limit: Number.parseInt(opts.limit ?? \"50\", 10),\n offset: Number.parseInt(opts.offset ?? \"0\", 10),\n });\n\n if (opts.json) {\n console.log(JSON.stringify({ total, models: rows }, null, 2));\n return;\n }\n\n console.log(\n \"MODEL ID\".padEnd(42),\n \"PROVIDER\".padEnd(14),\n \"OUTPUT\".padEnd(10),\n \"R\".padEnd(3),\n \"NAME\",\n );\n console.log(\"─\".repeat(104));\n for (const m of rows) {\n console.log(\n m.modelId.padEnd(42),\n m.providerId.padEnd(14),\n m.primaryOutputModality.padEnd(10),\n (m.supportsReasoning ? \"yes\" : \"no\").padEnd(3),\n m.name.slice(0, 40),\n );\n }\n console.log(`\\n${rows.length} shown · ${total} matching`);\n });\n\n models\n .command(\"get\")\n .description(\"Get full model record by ID or alias\")\n .argument(\"<modelId>\", \"Model ID or alias\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (modelId: string, opts: { bundledOnly?: boolean }) => {\n const model = await service(opts).getModelInfo(modelId);\n if (!model) {\n console.error(`Model not found: ${modelId}`);\n process.exit(1);\n }\n console.log(JSON.stringify(model, null, 2));\n });\n\n models\n .command(\"resolve\")\n .description(\"Resolve provider + model to canonical id\")\n .requiredOption(\"--model <m>\", \"Model string (required)\")\n .option(\"--provider <p>\", \"Provider hint (openrouter, openai, …)\")\n .option(\"--threshold <n>\", \"Confidence threshold 0–1\", \"0.6\")\n .option(\"--json\", \"Output raw ModelResolutionResult JSON\")\n .option(\"--verbose\", \"Show strategy trail\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n provider?: string;\n threshold?: string;\n json?: boolean;\n verbose?: boolean;\n bundledOnly?: boolean;\n }) => {\n const result = await service(opts).resolve(opts.model, opts.provider);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const providerLabel = opts.provider ?? \"unspecified\";\n console.log(`Input: provider=\"${providerLabel}\" model=\"${opts.model}\"`);\n\n if (opts.verbose && result.found) {\n console.log(`Normalised: model=\"${result.normalisedInput}\"`);\n console.log(\"\\nStrategy trail:\");\n for (const s of result.resolvedVia) {\n console.log(` • ${s}`);\n }\n console.log();\n }\n\n if (!result.found) {\n console.log(\"Result: NOT FOUND\");\n console.log(`Reason: ${result.reason}`);\n if (result.bestRejectedCandidate) {\n console.log(\n `Candidate: ${result.bestRejectedCandidate.modelId} (confidence ${result.bestRejectedCandidate.confidence.toFixed(2)})`,\n );\n }\n console.log('Tip: Run \"ai-tools catalog refresh\" or \"ai-tools alias set\".');\n process.exit(1);\n return;\n }\n\n console.log(`Resolved: ${result.modelId}`);\n console.log(`Name: ${result.record?.name ?? \"(no catalog record)\"}`);\n console.log(`Strategy: ${result.resolvedVia.join(\" → \")}`);\n console.log(`Confidence: ${result.confidence.toFixed(2)}`);\n console.log(`Via OR: ${result.routedViaOpenRouter ? \"yes\" : \"no\"}`);\n });\n\n models\n .command(\"count\")\n .description(\"Count models matching filters\")\n .option(\"--provider <id>\", \"Filter by providerId\")\n .option(\"--output-modality <m>\", \"Filter by output modality\")\n .option(\"--parameter <p>\", \"Filter by supported parameter\")\n .option(\"--tools\", \"Only models that support tools\")\n .option(\"--reasoning\", \"Only reasoning / thinking models\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n provider?: string;\n outputModality?: string;\n parameter?: string;\n tools?: boolean;\n reasoning?: boolean;\n bundledOnly?: boolean;\n }) => {\n const n = await service(opts).countModels({\n providerId: opts.provider,\n outputModality: opts.outputModality,\n supportedParameter: opts.parameter,\n supportsTools: opts.tools ? true : undefined,\n supportsReasoning: opts.reasoning ? true : undefined,\n });\n console.log(n);\n });\n}\n"],"mappings":"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","names":["program","program","program","program"]}
@@ -7,8 +7,9 @@
7
7
 
8
8
 
9
9
 
10
- var _chunkWOHMHXRZcjs = require('../chunk-WOHMHXRZ.cjs');
11
- require('../chunk-EDMCKHO6.cjs');
10
+ var _chunkDDRWORUUcjs = require('../chunk-DDRWORUU.cjs');
11
+ require('../chunk-WSUFQR3D.cjs');
12
+ require('../chunk-BCX5CLJJ.cjs');
12
13
  require('../chunk-PADNCGZB.cjs');
13
14
  require('../chunk-GS7T56RP.cjs');
14
15
 
@@ -19,5 +20,5 @@ require('../chunk-GS7T56RP.cjs');
19
20
 
20
21
 
21
22
 
22
- exports.CostCalculator = _chunkWOHMHXRZcjs.CostCalculator; exports.DEFAULT_OPENROUTER_MARKUP_RATE = _chunkWOHMHXRZcjs.DEFAULT_OPENROUTER_MARKUP_RATE; exports.MODEL_FIELD_PRIORITY = _chunkWOHMHXRZcjs.MODEL_FIELD_PRIORITY; exports.enrichCostResult = _chunkWOHMHXRZcjs.enrichCostResult; exports.extractUsageInput = _chunkWOHMHXRZcjs.extractUsageInput; exports.resolveUsageModel = _chunkWOHMHXRZcjs.resolveUsageModel; exports.toCostExtraction = _chunkWOHMHXRZcjs.toCostExtraction;
23
+ exports.CostCalculator = _chunkDDRWORUUcjs.CostCalculator; exports.DEFAULT_OPENROUTER_MARKUP_RATE = _chunkDDRWORUUcjs.DEFAULT_OPENROUTER_MARKUP_RATE; exports.MODEL_FIELD_PRIORITY = _chunkDDRWORUUcjs.MODEL_FIELD_PRIORITY; exports.enrichCostResult = _chunkDDRWORUUcjs.enrichCostResult; exports.extractUsageInput = _chunkDDRWORUUcjs.extractUsageInput; exports.resolveUsageModel = _chunkDDRWORUUcjs.resolveUsageModel; exports.toCostExtraction = _chunkDDRWORUUcjs.toCostExtraction;
23
24
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/cost/index.cjs"],"names":[],"mappings":"AAAA,0GAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,4dAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/cost/index.cjs"}
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/cost/index.cjs"],"names":[],"mappings":"AAAA,0GAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,4dAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/cost/index.cjs"}
@@ -1,7 +1,7 @@
1
- import { a as AiCostResult, d as AiUsageInput, A as AiCostExtraction, f as ExtractUsageInputResult } from '../resolveUsageModel-C_YmGR1M.cjs';
2
- export { b as AiCostWarning, c as AiCostWarningCode, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, F as FieldProvenance, M as MODEL_FIELD_PRIORITY, T as TokenExtractionProvenance, g as extractUsageInput, r as resolveUsageModel } from '../resolveUsageModel-C_YmGR1M.cjs';
3
- export { A as AiModelPricing, a as AiModelRecord } from '../types-BrzJWsTU.cjs';
4
- import '../AiModelsCatalogClient-B5FMI9gj.cjs';
1
+ import { a as AiCostResult, d as AiUsageInput, A as AiCostExtraction, f as ExtractUsageInputResult } from '../resolveUsageModel-xKZ2QpHy.cjs';
2
+ export { b as AiCostWarning, c as AiCostWarningCode, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, F as FieldProvenance, M as MODEL_FIELD_PRIORITY, T as TokenExtractionProvenance, g as extractUsageInput, r as resolveUsageModel } from '../resolveUsageModel-xKZ2QpHy.cjs';
3
+ export { A as AiModelPricing, a as AiModelRecord } from '../types-BZYGjN2O.cjs';
4
+ import '../AiModelsCatalogClient-DgBdVFk-.cjs';
5
5
 
6
6
  declare function toCostExtraction(provenance: ExtractUsageInputResult["provenance"]): AiCostExtraction;
7
7
  /** Attach usage, provider, and model fields callers expect on every cost response. */
@@ -1,7 +1,7 @@
1
- import { a as AiCostResult, d as AiUsageInput, A as AiCostExtraction, f as ExtractUsageInputResult } from '../resolveUsageModel-BFwf80Hz.js';
2
- export { b as AiCostWarning, c as AiCostWarningCode, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, F as FieldProvenance, M as MODEL_FIELD_PRIORITY, T as TokenExtractionProvenance, g as extractUsageInput, r as resolveUsageModel } from '../resolveUsageModel-BFwf80Hz.js';
3
- export { A as AiModelPricing, a as AiModelRecord } from '../types-BrzJWsTU.js';
4
- import '../AiModelsCatalogClient-CPPNI6Ry.js';
1
+ import { a as AiCostResult, d as AiUsageInput, A as AiCostExtraction, f as ExtractUsageInputResult } from '../resolveUsageModel-DrFuiuIW.js';
2
+ export { b as AiCostWarning, c as AiCostWarningCode, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, F as FieldProvenance, M as MODEL_FIELD_PRIORITY, T as TokenExtractionProvenance, g as extractUsageInput, r as resolveUsageModel } from '../resolveUsageModel-DrFuiuIW.js';
3
+ export { A as AiModelPricing, a as AiModelRecord } from '../types-BZYGjN2O.js';
4
+ import '../AiModelsCatalogClient-C9ZJHhv3.js';
5
5
 
6
6
  declare function toCostExtraction(provenance: ExtractUsageInputResult["provenance"]): AiCostExtraction;
7
7
  /** Attach usage, provider, and model fields callers expect on every cost response. */
@@ -7,8 +7,9 @@ import {
7
7
  extractUsageInput,
8
8
  resolveUsageModel,
9
9
  toCostExtraction
10
- } from "../chunk-CTM35DMA.js";
11
- import "../chunk-B3V2EHRY.js";
10
+ } from "../chunk-PN4FF6YF.js";
11
+ import "../chunk-HEB73GKJ.js";
12
+ import "../chunk-SLSKQRMI.js";
12
13
  import "../chunk-2PTCWPHV.js";
13
14
  export {
14
15
  CostCalculator,
package/dist/index.cjs CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkWOHMHXRZcjs = require('./chunk-WOHMHXRZ.cjs');
7
+ var _chunkDDRWORUUcjs = require('./chunk-DDRWORUU.cjs');
8
8
 
9
9
 
10
10
  var _chunk5HNFAYTOcjs = require('./chunk-5HNFAYTO.cjs');
@@ -13,7 +13,7 @@ var _chunk5HNFAYTOcjs = require('./chunk-5HNFAYTO.cjs');
13
13
 
14
14
 
15
15
 
16
- var _chunkPRCICORGcjs = require('./chunk-PRCICORG.cjs');
16
+ var _chunkX42KFOUOcjs = require('./chunk-X42KFOUO.cjs');
17
17
  require('./chunk-3E67S427.cjs');
18
18
 
19
19
 
@@ -25,14 +25,14 @@ require('./chunk-2PYACSZ5.cjs');
25
25
 
26
26
 
27
27
 
28
- var _chunkYQDSN6R6cjs = require('./chunk-YQDSN6R6.cjs');
28
+ var _chunk76FHWQH3cjs = require('./chunk-76FHWQH3.cjs');
29
29
 
30
30
 
31
- var _chunkXOKUDUUIcjs = require('./chunk-XOKUDUUI.cjs');
31
+ var _chunkTMA6QSNHcjs = require('./chunk-TMA6QSNH.cjs');
32
32
 
33
33
 
34
34
 
35
- var _chunkXAWBTX3Ncjs = require('./chunk-XAWBTX3N.cjs');
35
+ var _chunk75ZVXZAVcjs = require('./chunk-75ZVXZAV.cjs');
36
36
 
37
37
 
38
38
 
@@ -42,7 +42,8 @@ var _chunkXAWBTX3Ncjs = require('./chunk-XAWBTX3N.cjs');
42
42
 
43
43
 
44
44
 
45
- var _chunk5XAAMBDOcjs = require('./chunk-5XAAMBDO.cjs');
45
+ var _chunkHBNYVRLZcjs = require('./chunk-HBNYVRLZ.cjs');
46
+ require('./chunk-WSUFQR3D.cjs');
46
47
 
47
48
 
48
49
 
@@ -50,13 +51,14 @@ var _chunk5XAAMBDOcjs = require('./chunk-5XAAMBDO.cjs');
50
51
 
51
52
 
52
53
 
53
- var _chunkDXZOL3VNcjs = require('./chunk-DXZOL3VN.cjs');
54
+ var _chunkRSHI4OOYcjs = require('./chunk-RSHI4OOY.cjs');
54
55
 
55
56
 
56
57
 
57
58
 
58
59
 
59
- var _chunkEDMCKHO6cjs = require('./chunk-EDMCKHO6.cjs');
60
+
61
+ var _chunkBCX5CLJJcjs = require('./chunk-BCX5CLJJ.cjs');
60
62
 
61
63
 
62
64
 
@@ -133,5 +135,6 @@ require('./chunk-GS7T56RP.cjs');
133
135
 
134
136
 
135
137
 
136
- exports.AIToolbox = _chunk5HNFAYTOcjs.AIToolbox; exports.AiModelsCatalogClient = _chunk5XAAMBDOcjs.AiModelsCatalogClient; exports.AiModelsService = _chunkYQDSN6R6cjs.AiModelsService; exports.AiToolsError = _chunkPADNCGZBcjs.AiToolsError; exports.AliasConflictError = _chunkPADNCGZBcjs.AliasConflictError; exports.AliasFileParseError = _chunkPADNCGZBcjs.AliasFileParseError; exports.AliasFileWriteError = _chunkPADNCGZBcjs.AliasFileWriteError; exports.AliasInvalidNameError = _chunkPADNCGZBcjs.AliasInvalidNameError; exports.AliasNotFoundError = _chunkPADNCGZBcjs.AliasNotFoundError; exports.AliasRegistry = _chunkBAHBDADJcjs.AliasRegistry; exports.AliasResolver = _chunkBAHBDADJcjs.AliasResolver; exports.CostCalculationError = _chunkPADNCGZBcjs.CostCalculationError; exports.CostCalculator = _chunkWOHMHXRZcjs.CostCalculator; exports.DEFAULT_CATALOG_CACHE_TTL_MS = _chunk5XAAMBDOcjs.DEFAULT_CATALOG_CACHE_TTL_MS; exports.DEFAULT_DIRECT_CATALOG_URL = _chunk5XAAMBDOcjs.DEFAULT_DIRECT_CATALOG_URL; exports.DEFAULT_OPENROUTER_CATALOG_URL = _chunk5XAAMBDOcjs.DEFAULT_OPENROUTER_CATALOG_URL; exports.MODEL_FIELD_PRIORITY = _chunkWOHMHXRZcjs.MODEL_FIELD_PRIORITY; exports.ModelNameResolver = _chunkDXZOL3VNcjs.ModelNameResolver; exports.ModelNotFoundError = _chunkPADNCGZBcjs.ModelNotFoundError; exports.ModelResolutionError = _chunkPADNCGZBcjs.ModelResolutionError; exports.OpenRouterSyncProvider = _chunkPRCICORGcjs.OpenRouterSyncProvider; exports.REASONING_SUPPORTED_PARAMETERS = _chunkDXZOL3VNcjs.REASONING_SUPPORTED_PARAMETERS; exports.SyncError = _chunkPADNCGZBcjs.SyncError; exports.UnknownModelCostError = _chunkPADNCGZBcjs.UnknownModelCostError; exports.computeSupportsReasoning = _chunkDXZOL3VNcjs.computeSupportsReasoning; exports.countModels = _chunkYQDSN6R6cjs.countModels; exports.createModelNameResolver = _chunkPRCICORGcjs.createModelNameResolver; exports.extractUsageInput = _chunkWOHMHXRZcjs.extractUsageInput; exports.filterModels = _chunkYQDSN6R6cjs.filterModels; exports.getModelInfo = _chunkYQDSN6R6cjs.getModelInfo; exports.hasReasoningPricing = _chunkDXZOL3VNcjs.hasReasoningPricing; exports.invalidateCatalogLoadCache = _chunk5XAAMBDOcjs.invalidateCatalogLoadCache; exports.isKnownProfileOrShortcut = _chunk5IZ7PLY2cjs.isKnownProfileOrShortcut; exports.isReasoningModel = _chunkDXZOL3VNcjs.isReasoningModel; exports.isRoutedViaOpenRouter = _chunkPRCICORGcjs.isRoutedViaOpenRouter; exports.listAIProfiles = _chunk5IZ7PLY2cjs.listAIProfiles; exports.listAIShortcuts = _chunk5IZ7PLY2cjs.listAIShortcuts; exports.loadCatalogSources = _chunk5XAAMBDOcjs.loadCatalogSources; exports.loadCatalogSourcesCached = _chunk5XAAMBDOcjs.loadCatalogSourcesCached; exports.loadOpenRouterRoutingEnv = _chunkEDMCKHO6cjs.loadOpenRouterRoutingEnv; exports.normalizeOpenRouterModel = _chunkXOKUDUUIcjs.normalizeOpenRouterModel; exports.profileConfigFromResolved = _chunk5IZ7PLY2cjs.profileConfigFromResolved; exports.providerIdToEnvKeyPrefix = _chunkEDMCKHO6cjs.providerIdToEnvKeyPrefix; exports.refreshAiModelsCatalog = _chunkXAWBTX3Ncjs.refreshAiModelsCatalog; exports.resolveAIProfile = _chunk5IZ7PLY2cjs.resolveAIProfile; exports.resolveCatalogCacheTtlMs = _chunk5XAAMBDOcjs.resolveCatalogCacheTtlMs; exports.resolveModel = _chunkPRCICORGcjs.resolveModel; exports.resolveProfileForAsk = _chunk5IZ7PLY2cjs.resolveProfileForAsk; exports.resolveUsageModel = _chunkWOHMHXRZcjs.resolveUsageModel; exports.shouldDefaultRouteViaOpenRouter = _chunkEDMCKHO6cjs.shouldDefaultRouteViaOpenRouter; exports.supportsReasoningParameter = _chunkDXZOL3VNcjs.supportsReasoningParameter; exports.vendorApiKeyEnvName = _chunkEDMCKHO6cjs.vendorApiKeyEnvName; exports.verifyAiModelsCatalog = _chunkXAWBTX3Ncjs.verifyAiModelsCatalog;
138
+
139
+ exports.AIToolbox = _chunk5HNFAYTOcjs.AIToolbox; exports.AiModelsCatalogClient = _chunkHBNYVRLZcjs.AiModelsCatalogClient; exports.AiModelsService = _chunk76FHWQH3cjs.AiModelsService; exports.AiToolsError = _chunkPADNCGZBcjs.AiToolsError; exports.AliasConflictError = _chunkPADNCGZBcjs.AliasConflictError; exports.AliasFileParseError = _chunkPADNCGZBcjs.AliasFileParseError; exports.AliasFileWriteError = _chunkPADNCGZBcjs.AliasFileWriteError; exports.AliasInvalidNameError = _chunkPADNCGZBcjs.AliasInvalidNameError; exports.AliasNotFoundError = _chunkPADNCGZBcjs.AliasNotFoundError; exports.AliasRegistry = _chunkBAHBDADJcjs.AliasRegistry; exports.AliasResolver = _chunkBAHBDADJcjs.AliasResolver; exports.CostCalculationError = _chunkPADNCGZBcjs.CostCalculationError; exports.CostCalculator = _chunkDDRWORUUcjs.CostCalculator; exports.DEFAULT_CATALOG_CACHE_TTL_MS = _chunkHBNYVRLZcjs.DEFAULT_CATALOG_CACHE_TTL_MS; exports.DEFAULT_DIRECT_CATALOG_URL = _chunkHBNYVRLZcjs.DEFAULT_DIRECT_CATALOG_URL; exports.DEFAULT_OPENROUTER_CATALOG_URL = _chunkHBNYVRLZcjs.DEFAULT_OPENROUTER_CATALOG_URL; exports.MODEL_FIELD_PRIORITY = _chunkDDRWORUUcjs.MODEL_FIELD_PRIORITY; exports.ModelNameResolver = _chunkRSHI4OOYcjs.ModelNameResolver; exports.ModelNotFoundError = _chunkPADNCGZBcjs.ModelNotFoundError; exports.ModelResolutionError = _chunkPADNCGZBcjs.ModelResolutionError; exports.OpenRouterSyncProvider = _chunkX42KFOUOcjs.OpenRouterSyncProvider; exports.REASONING_SUPPORTED_PARAMETERS = _chunkRSHI4OOYcjs.REASONING_SUPPORTED_PARAMETERS; exports.SyncError = _chunkPADNCGZBcjs.SyncError; exports.UnknownModelCostError = _chunkPADNCGZBcjs.UnknownModelCostError; exports.computeSupportsReasoning = _chunkRSHI4OOYcjs.computeSupportsReasoning; exports.countModels = _chunk76FHWQH3cjs.countModels; exports.createModelNameResolver = _chunkX42KFOUOcjs.createModelNameResolver; exports.extractUsageInput = _chunkDDRWORUUcjs.extractUsageInput; exports.filterModels = _chunk76FHWQH3cjs.filterModels; exports.getModelInfo = _chunk76FHWQH3cjs.getModelInfo; exports.hasReasoningPricing = _chunkRSHI4OOYcjs.hasReasoningPricing; exports.invalidateCatalogLoadCache = _chunkHBNYVRLZcjs.invalidateCatalogLoadCache; exports.isEffectiveOpenRouterTransport = _chunkBCX5CLJJcjs.isEffectiveOpenRouterTransport; exports.isKnownProfileOrShortcut = _chunk5IZ7PLY2cjs.isKnownProfileOrShortcut; exports.isReasoningModel = _chunkRSHI4OOYcjs.isReasoningModel; exports.isRoutedViaOpenRouter = _chunkX42KFOUOcjs.isRoutedViaOpenRouter; exports.listAIProfiles = _chunk5IZ7PLY2cjs.listAIProfiles; exports.listAIShortcuts = _chunk5IZ7PLY2cjs.listAIShortcuts; exports.loadCatalogSources = _chunkHBNYVRLZcjs.loadCatalogSources; exports.loadCatalogSourcesCached = _chunkHBNYVRLZcjs.loadCatalogSourcesCached; exports.loadOpenRouterRoutingEnv = _chunkBCX5CLJJcjs.loadOpenRouterRoutingEnv; exports.normalizeOpenRouterModel = _chunkTMA6QSNHcjs.normalizeOpenRouterModel; exports.profileConfigFromResolved = _chunk5IZ7PLY2cjs.profileConfigFromResolved; exports.providerIdToEnvKeyPrefix = _chunkBCX5CLJJcjs.providerIdToEnvKeyPrefix; exports.refreshAiModelsCatalog = _chunk75ZVXZAVcjs.refreshAiModelsCatalog; exports.resolveAIProfile = _chunk5IZ7PLY2cjs.resolveAIProfile; exports.resolveCatalogCacheTtlMs = _chunkHBNYVRLZcjs.resolveCatalogCacheTtlMs; exports.resolveModel = _chunkX42KFOUOcjs.resolveModel; exports.resolveProfileForAsk = _chunk5IZ7PLY2cjs.resolveProfileForAsk; exports.resolveUsageModel = _chunkDDRWORUUcjs.resolveUsageModel; exports.shouldDefaultRouteViaOpenRouter = _chunkBCX5CLJJcjs.shouldDefaultRouteViaOpenRouter; exports.supportsReasoningParameter = _chunkRSHI4OOYcjs.supportsReasoningParameter; exports.vendorApiKeyEnvName = _chunkBCX5CLJJcjs.vendorApiKeyEnvName; exports.verifyAiModelsCatalog = _chunk75ZVXZAVcjs.verifyAiModelsCatalog;
137
140
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/index.cjs"],"names":[],"mappings":"AAAA,yGAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,8nHAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/index.cjs"}
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/index.cjs"],"names":[],"mappings":"AAAA,yGAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,ytHAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/index.cjs"}
package/dist/index.d.cts CHANGED
@@ -1,10 +1,10 @@
1
- export { A as AiCostExtraction, a as AiCostResult, b as AiCostWarning, d as AiUsageInput, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, f as ExtractUsageInputResult, M as MODEL_FIELD_PRIORITY, g as extractUsageInput, r as resolveUsageModel } from './resolveUsageModel-C_YmGR1M.cjs';
2
- export { A as AiModelsCatalogClient, a as AiModelsCatalogClientOptions, L as LoadCatalogOptions, b as LoadedCatalogs, l as loadCatalogSources } from './AiModelsCatalogClient-B5FMI9gj.cjs';
3
- import { h as ModelResolutionInput, i as ModelResolutionNotFound } from './types-BrzJWsTU.cjs';
4
- export { A as AiModelPricing, a as AiModelRecord, b as AliasEntry, c as AliasFileSchema, d as AliasRegistry, e as AliasRegistryOptions, f as AliasValidationReport, M as ModelListFilters, g as ModelListResult, j as ModelResolutionResult, k as ModelResolutionSuccess, l as ModelResolverOptions, m as OpenRouterModelApi, n as OpenRouterModelsQuery, r as OpenRouterRoutingConfig, R as ResolutionStrategy, t as ResolvedModel, u as ResolvedModelRef, v as loadOpenRouterRoutingEnv, w as providerIdToEnvKeyPrefix, x as shouldDefaultRouteViaOpenRouter, y as vendorApiKeyEnvName } from './types-BrzJWsTU.cjs';
5
- export { C as CatalogRefreshOptions, a as CatalogRefreshResult, c as CatalogVerifyOptions, d as CatalogVerifyReport, D as DEFAULT_CATALOG_CACHE_TTL_MS, e as DEFAULT_DIRECT_CATALOG_URL, f as DEFAULT_OPENROUTER_CATALOG_URL, i as invalidateCatalogLoadCache, l as loadCatalogSourcesCached, r as refreshAiModelsCatalog, h as resolveCatalogCacheTtlMs, v as verifyAiModelsCatalog } from './modelCache-CJftI-Ko.cjs';
1
+ export { A as AiCostExtraction, a as AiCostResult, b as AiCostWarning, d as AiUsageInput, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, f as ExtractUsageInputResult, M as MODEL_FIELD_PRIORITY, g as extractUsageInput, r as resolveUsageModel } from './resolveUsageModel-xKZ2QpHy.cjs';
2
+ export { A as AiModelsCatalogClient, a as AiModelsCatalogClientOptions, L as LoadCatalogOptions, b as LoadedCatalogs, l as loadCatalogSources } from './AiModelsCatalogClient-DgBdVFk-.cjs';
3
+ import { h as ModelResolutionInput, i as ModelResolutionNotFound } from './types-BZYGjN2O.cjs';
4
+ export { A as AiModelPricing, a as AiModelRecord, b as AliasEntry, c as AliasFileSchema, d as AliasRegistry, e as AliasRegistryOptions, f as AliasValidationReport, M as ModelListFilters, g as ModelListResult, j as ModelResolutionResult, k as ModelResolutionSuccess, l as ModelResolverOptions, m as OpenRouterModelApi, n as OpenRouterModelsQuery, r as OpenRouterRoutingConfig, R as ResolutionStrategy, t as ResolvedModel, u as ResolvedModelRef, v as isEffectiveOpenRouterTransport, w as loadOpenRouterRoutingEnv, x as providerIdToEnvKeyPrefix, y as shouldDefaultRouteViaOpenRouter, z as vendorApiKeyEnvName } from './types-BZYGjN2O.cjs';
5
+ export { C as CatalogRefreshOptions, a as CatalogRefreshResult, c as CatalogVerifyOptions, d as CatalogVerifyReport, D as DEFAULT_CATALOG_CACHE_TTL_MS, e as DEFAULT_DIRECT_CATALOG_URL, f as DEFAULT_OPENROUTER_CATALOG_URL, i as invalidateCatalogLoadCache, l as loadCatalogSourcesCached, r as refreshAiModelsCatalog, h as resolveCatalogCacheTtlMs, v as verifyAiModelsCatalog } from './modelCache-sL3dBfRM.cjs';
6
6
  export { AiModelsService, AiModelsServiceOptions, REASONING_SUPPORTED_PARAMETERS, ReasoningModelInput, computeSupportsReasoning, countModels, filterModels, getModelInfo, hasReasoningPricing, isReasoningModel, normalizeOpenRouterModel, supportsReasoningParameter } from './models/index.cjs';
7
- export { M as ModelNameResolver, O as OpenRouterSyncProvider, a as OpenRouterSyncProviderOptions, c as createModelNameResolver, i as isRoutedViaOpenRouter, r as resolveModel } from './modelNameResolver-C5CSTGFF.cjs';
7
+ export { M as ModelNameResolver, O as OpenRouterSyncProvider, a as OpenRouterSyncProviderOptions, c as createModelNameResolver, i as isRoutedViaOpenRouter, r as resolveModel } from './modelNameResolver-Bxlehrbp.cjs';
8
8
  export { AIToolbox, AiToolboxOptions, Fallback, FallbackChain, Guard, GuardConfig, RouteRule, Router, TrackResult, Tracker } from './toolbox/index.cjs';
9
9
  export { AskProfileModelConfig, ResolveProfileForAskInput, profileConfigFromResolved, resolveProfileForAsk } from './profiles/index.cjs';
10
10
  export { AIProfileBackend, InstructionTier, ResolvedAIProfile, isKnownProfileOrShortcut, listAIProfiles, listAIShortcuts, resolveAIProfile } from '@x12i/ai-profiles';
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- export { A as AiCostExtraction, a as AiCostResult, b as AiCostWarning, d as AiUsageInput, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, f as ExtractUsageInputResult, M as MODEL_FIELD_PRIORITY, g as extractUsageInput, r as resolveUsageModel } from './resolveUsageModel-BFwf80Hz.js';
2
- export { A as AiModelsCatalogClient, a as AiModelsCatalogClientOptions, L as LoadCatalogOptions, b as LoadedCatalogs, l as loadCatalogSources } from './AiModelsCatalogClient-CPPNI6Ry.js';
3
- import { h as ModelResolutionInput, i as ModelResolutionNotFound } from './types-BrzJWsTU.js';
4
- export { A as AiModelPricing, a as AiModelRecord, b as AliasEntry, c as AliasFileSchema, d as AliasRegistry, e as AliasRegistryOptions, f as AliasValidationReport, M as ModelListFilters, g as ModelListResult, j as ModelResolutionResult, k as ModelResolutionSuccess, l as ModelResolverOptions, m as OpenRouterModelApi, n as OpenRouterModelsQuery, r as OpenRouterRoutingConfig, R as ResolutionStrategy, t as ResolvedModel, u as ResolvedModelRef, v as loadOpenRouterRoutingEnv, w as providerIdToEnvKeyPrefix, x as shouldDefaultRouteViaOpenRouter, y as vendorApiKeyEnvName } from './types-BrzJWsTU.js';
5
- export { C as CatalogRefreshOptions, a as CatalogRefreshResult, c as CatalogVerifyOptions, d as CatalogVerifyReport, D as DEFAULT_CATALOG_CACHE_TTL_MS, e as DEFAULT_DIRECT_CATALOG_URL, f as DEFAULT_OPENROUTER_CATALOG_URL, i as invalidateCatalogLoadCache, l as loadCatalogSourcesCached, r as refreshAiModelsCatalog, h as resolveCatalogCacheTtlMs, v as verifyAiModelsCatalog } from './modelCache-BzRn6t_C.js';
1
+ export { A as AiCostExtraction, a as AiCostResult, b as AiCostWarning, d as AiUsageInput, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, f as ExtractUsageInputResult, M as MODEL_FIELD_PRIORITY, g as extractUsageInput, r as resolveUsageModel } from './resolveUsageModel-DrFuiuIW.js';
2
+ export { A as AiModelsCatalogClient, a as AiModelsCatalogClientOptions, L as LoadCatalogOptions, b as LoadedCatalogs, l as loadCatalogSources } from './AiModelsCatalogClient-C9ZJHhv3.js';
3
+ import { h as ModelResolutionInput, i as ModelResolutionNotFound } from './types-BZYGjN2O.js';
4
+ export { A as AiModelPricing, a as AiModelRecord, b as AliasEntry, c as AliasFileSchema, d as AliasRegistry, e as AliasRegistryOptions, f as AliasValidationReport, M as ModelListFilters, g as ModelListResult, j as ModelResolutionResult, k as ModelResolutionSuccess, l as ModelResolverOptions, m as OpenRouterModelApi, n as OpenRouterModelsQuery, r as OpenRouterRoutingConfig, R as ResolutionStrategy, t as ResolvedModel, u as ResolvedModelRef, v as isEffectiveOpenRouterTransport, w as loadOpenRouterRoutingEnv, x as providerIdToEnvKeyPrefix, y as shouldDefaultRouteViaOpenRouter, z as vendorApiKeyEnvName } from './types-BZYGjN2O.js';
5
+ export { C as CatalogRefreshOptions, a as CatalogRefreshResult, c as CatalogVerifyOptions, d as CatalogVerifyReport, D as DEFAULT_CATALOG_CACHE_TTL_MS, e as DEFAULT_DIRECT_CATALOG_URL, f as DEFAULT_OPENROUTER_CATALOG_URL, i as invalidateCatalogLoadCache, l as loadCatalogSourcesCached, r as refreshAiModelsCatalog, h as resolveCatalogCacheTtlMs, v as verifyAiModelsCatalog } from './modelCache-xzoTUue2.js';
6
6
  export { AiModelsService, AiModelsServiceOptions, REASONING_SUPPORTED_PARAMETERS, ReasoningModelInput, computeSupportsReasoning, countModels, filterModels, getModelInfo, hasReasoningPricing, isReasoningModel, normalizeOpenRouterModel, supportsReasoningParameter } from './models/index.js';
7
- export { M as ModelNameResolver, O as OpenRouterSyncProvider, a as OpenRouterSyncProviderOptions, c as createModelNameResolver, i as isRoutedViaOpenRouter, r as resolveModel } from './modelNameResolver-5XkBMctP.js';
7
+ export { M as ModelNameResolver, O as OpenRouterSyncProvider, a as OpenRouterSyncProviderOptions, c as createModelNameResolver, i as isRoutedViaOpenRouter, r as resolveModel } from './modelNameResolver-2WroQlqt.js';
8
8
  export { AIToolbox, AiToolboxOptions, Fallback, FallbackChain, Guard, GuardConfig, RouteRule, Router, TrackResult, Tracker } from './toolbox/index.js';
9
9
  export { AskProfileModelConfig, ResolveProfileForAskInput, profileConfigFromResolved, resolveProfileForAsk } from './profiles/index.js';
10
10
  export { AIProfileBackend, InstructionTier, ResolvedAIProfile, isKnownProfileOrShortcut, listAIProfiles, listAIShortcuts, resolveAIProfile } from '@x12i/ai-profiles';
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  MODEL_FIELD_PRIORITY,
5
5
  extractUsageInput,
6
6
  resolveUsageModel
7
- } from "./chunk-CTM35DMA.js";
7
+ } from "./chunk-PN4FF6YF.js";
8
8
  import {
9
9
  AIToolbox
10
10
  } from "./chunk-XRBZQQQU.js";
@@ -13,7 +13,7 @@ import {
13
13
  createModelNameResolver,
14
14
  isRoutedViaOpenRouter,
15
15
  resolveModel
16
- } from "./chunk-6BQBKROR.js";
16
+ } from "./chunk-VBROBIVI.js";
17
17
  import "./chunk-KHODXGPV.js";
18
18
  import {
19
19
  AliasRegistry,
@@ -25,14 +25,14 @@ import {
25
25
  countModels,
26
26
  filterModels,
27
27
  getModelInfo
28
- } from "./chunk-VJHLO2R3.js";
28
+ } from "./chunk-KSJSLKYI.js";
29
29
  import {
30
30
  normalizeOpenRouterModel
31
- } from "./chunk-SIH4GPV4.js";
31
+ } from "./chunk-MOLWV5LV.js";
32
32
  import {
33
33
  refreshAiModelsCatalog,
34
34
  verifyAiModelsCatalog
35
- } from "./chunk-AB5GNXJ4.js";
35
+ } from "./chunk-ZPUZ7DBO.js";
36
36
  import {
37
37
  AiModelsCatalogClient,
38
38
  DEFAULT_CATALOG_CACHE_TTL_MS,
@@ -42,7 +42,8 @@ import {
42
42
  loadCatalogSources,
43
43
  loadCatalogSourcesCached,
44
44
  resolveCatalogCacheTtlMs
45
- } from "./chunk-OPN6BGNH.js";
45
+ } from "./chunk-D6OIUYNC.js";
46
+ import "./chunk-HEB73GKJ.js";
46
47
  import {
47
48
  ModelNameResolver,
48
49
  REASONING_SUPPORTED_PARAMETERS,
@@ -50,13 +51,14 @@ import {
50
51
  hasReasoningPricing,
51
52
  isReasoningModel,
52
53
  supportsReasoningParameter
53
- } from "./chunk-EYHMQVAL.js";
54
+ } from "./chunk-54GKLIDW.js";
54
55
  import {
56
+ isEffectiveOpenRouterTransport,
55
57
  loadOpenRouterRoutingEnv,
56
58
  providerIdToEnvKeyPrefix,
57
59
  shouldDefaultRouteViaOpenRouter,
58
60
  vendorApiKeyEnvName
59
- } from "./chunk-B3V2EHRY.js";
61
+ } from "./chunk-SLSKQRMI.js";
60
62
  import {
61
63
  AiToolsError,
62
64
  AliasConflictError,
@@ -111,6 +113,7 @@ export {
111
113
  getModelInfo,
112
114
  hasReasoningPricing,
113
115
  invalidateCatalogLoadCache,
116
+ isEffectiveOpenRouterTransport,
114
117
  isKnownProfileOrShortcut,
115
118
  isReasoningModel,
116
119
  isRoutedViaOpenRouter,