@x12i/ai-tools 2.0.7 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/catalog/index.cjs +6 -6
- package/dist/catalog/index.js +5 -5
- package/dist/chunk-2KPWVOOT.cjs +32 -0
- package/dist/chunk-2KPWVOOT.cjs.map +1 -0
- package/dist/chunk-4ILJWO64.js +143 -0
- package/dist/chunk-4ILJWO64.js.map +1 -0
- package/dist/{chunk-KSJSLKYI.js → chunk-5RW5ARLO.js} +8 -2
- package/dist/chunk-5RW5ARLO.js.map +1 -0
- package/dist/{chunk-ZPUZ7DBO.js → chunk-7VGEQTJA.js} +2 -2
- package/dist/{chunk-PN4FF6YF.js → chunk-DSDN65JH.js} +3 -3
- package/dist/{chunk-WSUFQR3D.cjs → chunk-GNOZFRKR.cjs} +45 -44
- package/dist/chunk-GNOZFRKR.cjs.map +1 -0
- package/dist/{chunk-DDRWORUU.cjs → chunk-H6HDETJK.cjs} +19 -19
- package/dist/{chunk-DDRWORUU.cjs.map → chunk-H6HDETJK.cjs.map} +1 -1
- package/dist/{chunk-VBROBIVI.js → chunk-IA4HCHJV.js} +3 -3
- package/dist/{chunk-VBROBIVI.js.map → chunk-IA4HCHJV.js.map} +1 -1
- package/dist/{chunk-76FHWQH3.cjs → chunk-IJTDND4V.cjs} +9 -3
- package/dist/chunk-IJTDND4V.cjs.map +1 -0
- package/dist/{chunk-X42KFOUO.cjs → chunk-JDOFFZJA.cjs} +6 -6
- package/dist/{chunk-X42KFOUO.cjs.map → chunk-JDOFFZJA.cjs.map} +1 -1
- package/dist/chunk-LQLSD26Y.cjs +1 -0
- package/dist/chunk-LQLSD26Y.cjs.map +1 -0
- package/dist/{chunk-54GKLIDW.js → chunk-OB44D7RG.js} +232 -45
- package/dist/chunk-OB44D7RG.js.map +1 -0
- package/dist/{chunk-RSHI4OOY.cjs → chunk-OZE336BL.cjs} +251 -64
- package/dist/chunk-OZE336BL.cjs.map +1 -0
- package/dist/{chunk-HEB73GKJ.js → chunk-RNSXRGIA.js} +30 -26
- package/dist/chunk-RNSXRGIA.js.map +1 -0
- package/dist/{chunk-75ZVXZAV.cjs → chunk-RVQPQI63.cjs} +7 -7
- package/dist/{chunk-75ZVXZAV.cjs.map → chunk-RVQPQI63.cjs.map} +1 -1
- package/dist/chunk-SQ6NOF4Z.js +32 -0
- package/dist/chunk-SQ6NOF4Z.js.map +1 -0
- package/dist/chunk-SYDW33AL.cjs +143 -0
- package/dist/chunk-SYDW33AL.cjs.map +1 -0
- package/dist/{chunk-D6OIUYNC.js → chunk-TZHPZGDB.js} +5 -5
- package/dist/chunk-UQ4NSEXF.js +41 -0
- package/dist/chunk-UQ4NSEXF.js.map +1 -0
- package/dist/{chunk-HBNYVRLZ.cjs → chunk-UY2VLJN6.cjs} +16 -16
- package/dist/{chunk-HBNYVRLZ.cjs.map → chunk-UY2VLJN6.cjs.map} +1 -1
- package/dist/{chunk-MOLWV5LV.js → chunk-VDNKQRDG.js} +2 -2
- package/dist/chunk-XUUPJ7WO.js +1 -0
- package/dist/{chunk-TMA6QSNH.cjs → chunk-YO7AJ5Z3.cjs} +3 -3
- package/dist/{chunk-TMA6QSNH.cjs.map → chunk-YO7AJ5Z3.cjs.map} +1 -1
- package/dist/chunk-ZHRU337O.cjs +41 -0
- package/dist/chunk-ZHRU337O.cjs.map +1 -0
- package/dist/cli/index.cjs +36 -16
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +27 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cost/index.cjs +21 -5
- package/dist/cost/index.cjs.map +1 -1
- package/dist/cost/index.d.cts +3 -2
- package/dist/cost/index.d.ts +3 -2
- package/dist/cost/index.js +20 -4
- package/dist/index.cjs +27 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +27 -11
- package/dist/models/index.cjs +9 -7
- package/dist/models/index.cjs.map +1 -1
- package/dist/models/index.d.cts +2 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/models/index.js +8 -6
- package/dist/resolveModelVendor-B0t5nq-v.d.cts +22 -0
- package/dist/{resolveUsageModel-DrFuiuIW.d.ts → resolveModelVendor-DQpJpk0w.d.ts} +5 -1
- package/dist/{resolveUsageModel-xKZ2QpHy.d.cts → resolveModelVendor-XvmXsVzo.d.cts} +5 -1
- package/dist/resolveModelVendor-uphYBFMY.d.ts +22 -0
- package/dist/sync/index.cjs +16 -5
- package/dist/sync/index.cjs.map +1 -1
- package/dist/sync/index.d.cts +1 -0
- package/dist/sync/index.d.ts +1 -0
- package/dist/sync/index.js +17 -6
- package/package.json +2 -2
- package/dist/chunk-54GKLIDW.js.map +0 -1
- package/dist/chunk-56R4XA2S.js +0 -1
- package/dist/chunk-5GUKLOEK.cjs +0 -1
- package/dist/chunk-5GUKLOEK.cjs.map +0 -1
- package/dist/chunk-76FHWQH3.cjs.map +0 -1
- package/dist/chunk-BCX5CLJJ.cjs +0 -238
- package/dist/chunk-BCX5CLJJ.cjs.map +0 -1
- package/dist/chunk-HEB73GKJ.js.map +0 -1
- package/dist/chunk-KSJSLKYI.js.map +0 -1
- package/dist/chunk-RSHI4OOY.cjs.map +0 -1
- package/dist/chunk-SLSKQRMI.js +0 -238
- package/dist/chunk-SLSKQRMI.js.map +0 -1
- package/dist/chunk-WSUFQR3D.cjs.map +0 -1
- /package/dist/{chunk-ZPUZ7DBO.js.map → chunk-7VGEQTJA.js.map} +0 -0
- /package/dist/{chunk-PN4FF6YF.js.map → chunk-DSDN65JH.js.map} +0 -0
- /package/dist/{chunk-D6OIUYNC.js.map → chunk-TZHPZGDB.js.map} +0 -0
- /package/dist/{chunk-MOLWV5LV.js.map → chunk-VDNKQRDG.js.map} +0 -0
- /package/dist/{chunk-56R4XA2S.js.map → chunk-XUUPJ7WO.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunk2KPWVOOTcjs = require('./chunk-2KPWVOOT.cjs');
|
|
4
4
|
|
|
5
5
|
// src/models/normalizeOpenRouterModel.ts
|
|
6
6
|
function parsePrice(value) {
|
|
@@ -54,7 +54,7 @@ function normalizeOpenRouterModel(row, syncedAt) {
|
|
|
54
54
|
const supportedParameters = _nullishCoalesce(row.supported_parameters, () => ( []));
|
|
55
55
|
const pricing = normalizePricing(row.pricing);
|
|
56
56
|
const openRouterPricing = row.pricing;
|
|
57
|
-
const supportsReasoning =
|
|
57
|
+
const supportsReasoning = _chunk2KPWVOOTcjs.computeSupportsReasoning.call(void 0, {
|
|
58
58
|
supportedParameters,
|
|
59
59
|
pricing,
|
|
60
60
|
openRouterPricing
|
|
@@ -99,4 +99,4 @@ function normalizeOpenRouterModel(row, syncedAt) {
|
|
|
99
99
|
|
|
100
100
|
|
|
101
101
|
exports.extractProviderId = extractProviderId; exports.normalizeOpenRouterModel = normalizeOpenRouterModel;
|
|
102
|
-
//# sourceMappingURL=chunk-
|
|
102
|
+
//# sourceMappingURL=chunk-YO7AJ5Z3.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-YO7AJ5Z3.cjs","../src/models/normalizeOpenRouterModel.ts"],"names":[],"mappings":"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","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-YO7AJ5Z3.cjs","sourcesContent":[null,"import { computeSupportsReasoning } from \"./reasoningModel.js\";\nimport type { AiModelPricing, AiModelRecord } from \"./types.js\";\nimport type { OpenRouterModelApi } from \"./openrouter.types.js\";\n\nfunction parsePrice(value: string | number | undefined): number {\n if (value === undefined || value === null || value === \"\") return 0;\n const n = typeof value === \"number\" ? value : Number.parseFloat(String(value));\n return Number.isFinite(n) ? n : 0;\n}\n\nexport function extractProviderId(modelId: string): string {\n const slash = modelId.indexOf(\"/\");\n if (slash > 0) return modelId.slice(0, slash);\n return \"other\";\n}\n\nfunction buildAliases(modelId: string, name?: string): string[] {\n const aliases = new Set<string>();\n if (name) aliases.add(name);\n const slash = modelId.indexOf(\"/\");\n if (slash > 0) {\n const direct = modelId.slice(slash + 1);\n aliases.add(direct);\n const base = direct.replace(/-\\d{4}-\\d{2}-\\d{2}$/, \"\").replace(/-\\d{8}$/, \"\");\n if (base !== direct) aliases.add(base);\n }\n return [...aliases];\n}\n\nfunction normalizePricing(raw: OpenRouterModelApi[\"pricing\"]): AiModelPricing {\n return {\n promptUsdPerToken: parsePrice(raw.prompt),\n completionUsdPerToken: parsePrice(raw.completion),\n imageUsdPerUnit: parsePrice(raw.image),\n requestUsdPerRequest: parsePrice(raw.request),\n cacheReadUsdPerToken: raw.input_cache_read\n ? parsePrice(raw.input_cache_read)\n : undefined,\n cacheWriteUsdPerToken: raw.input_cache_write\n ? parsePrice(raw.input_cache_write)\n : undefined,\n reasoningUsdPerToken: raw.internal_reasoning\n ? parsePrice(raw.internal_reasoning)\n : undefined,\n webSearchUsdPerRequest: raw.web_search ? parsePrice(raw.web_search) : undefined,\n openRouterMarkupUsdPerInputToken: 0,\n openRouterMarkupUsdPerOutputToken: 0,\n pricedAt: new Date().toISOString(),\n source: \"openrouter\",\n };\n}\n\nfunction resolveStatus(row: OpenRouterModelApi): AiModelRecord[\"status\"] {\n if (row.expiration_date) {\n const exp = Date.parse(row.expiration_date);\n if (!Number.isNaN(exp) && exp < Date.now()) return \"deprecated\";\n }\n return \"active\";\n}\n\nexport function normalizeOpenRouterModel(row: OpenRouterModelApi, syncedAt: string): AiModelRecord {\n const outputModalities = row.architecture?.output_modalities ?? [\"text\"];\n const inputModalities = row.architecture?.input_modalities ?? [\"text\"];\n const supportedParameters = row.supported_parameters ?? [];\n const pricing = normalizePricing(row.pricing);\n const openRouterPricing = row.pricing;\n const supportsReasoning = computeSupportsReasoning({\n supportedParameters,\n pricing,\n openRouterPricing,\n });\n\n return {\n modelId: row.id,\n name: row.name ?? row.id,\n providerId: extractProviderId(row.id),\n canonicalSlug: row.canonical_slug ?? row.id,\n status: resolveStatus(row),\n description: row.description ?? \"\",\n created: row.created ?? 0,\n expirationDate: row.expiration_date ?? null,\n contextLength: row.context_length ?? row.top_provider?.context_length ?? 0,\n maxCompletionTokens: row.top_provider?.max_completion_tokens ?? null,\n isModerated: row.top_provider?.is_moderated ?? false,\n modality: row.architecture?.modality ?? \"\",\n inputModalities,\n outputModalities,\n tokenizer: row.architecture?.tokenizer ?? \"\",\n instructType: row.architecture?.instruct_type ?? null,\n supportedParameters,\n defaultParameters: row.default_parameters ?? null,\n perRequestLimits: row.per_request_limits ?? null,\n pricing,\n openRouterPricing,\n architecture: row.architecture,\n topProvider: row.top_provider,\n openRouter: row,\n aliases: buildAliases(row.id, row.name),\n availableOnOpenRouter: true,\n supportsStreaming: outputModalities.includes(\"text\"),\n supportsTools: supportedParameters.includes(\"tools\"),\n supportsReasoning,\n primaryOutputModality: outputModalities[0] ?? \"text\",\n syncedAt,\n syncSource: \"openrouter\",\n };\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkSYDW33ALcjs = require('./chunk-SYDW33AL.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var _chunkGNOZFRKRcjs = require('./chunk-GNOZFRKR.cjs');
|
|
12
|
+
|
|
13
|
+
// src/cost/resolveModelVendor.ts
|
|
14
|
+
async function resolveModelVendor(model, catalog, options) {
|
|
15
|
+
const exact = _chunkSYDW33ALcjs.modelVendorRefFromIdentity.call(void 0, model, options);
|
|
16
|
+
if (exact) return exact;
|
|
17
|
+
const attempts = _chunkGNOZFRKRcjs.buildCatalogResolveAttempts.call(void 0, model);
|
|
18
|
+
const result = await _chunkGNOZFRKRcjs.resolveFromCatalogAttempts.call(void 0, catalog, attempts, options);
|
|
19
|
+
if (_optionalChain([result, 'optionalAccess', _ => _.found])) {
|
|
20
|
+
const ref = _chunkSYDW33ALcjs.resolveModelVendorFromResolution.call(void 0, result, model, options);
|
|
21
|
+
if (ref) return ref;
|
|
22
|
+
}
|
|
23
|
+
const profileMatch = await _chunkGNOZFRKRcjs.matchModelInAiProfiles.call(void 0, model);
|
|
24
|
+
if (profileMatch) {
|
|
25
|
+
return _chunkSYDW33ALcjs.modelVendorRefFromVendorAndSlug.call(void 0,
|
|
26
|
+
profileMatch.provider,
|
|
27
|
+
profileMatch.modelId,
|
|
28
|
+
options
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
if (!_optionalChain([result, 'optionalAccess', _2 => _2.found]) && _optionalChain([result, 'optionalAccess', _3 => _3.bestRejectedCandidate])) {
|
|
32
|
+
const ref = _chunkSYDW33ALcjs.resolveModelVendorFromResolution.call(void 0, result, model, options);
|
|
33
|
+
if (ref) return ref;
|
|
34
|
+
}
|
|
35
|
+
return _chunkSYDW33ALcjs.resolveModelVendorLastResort.call(void 0, model, options);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
exports.resolveModelVendor = resolveModelVendor;
|
|
41
|
+
//# sourceMappingURL=chunk-ZHRU337O.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-ZHRU337O.cjs","../src/cost/resolveModelVendor.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACUA,MAAA,SAAsB,kBAAA,CACpB,KAAA,EACA,OAAA,EACA,OAAA,EACgC;AAChC,EAAA,MAAM,MAAA,EAAQ,0DAAA,KAA2B,EAAO,OAAO,CAAA;AACvD,EAAA,GAAA,CAAI,KAAA,EAAO,OAAO,KAAA;AAElB,EAAA,MAAM,SAAA,EAAW,2DAAA,KAAiC,CAAA;AAClD,EAAA,MAAM,OAAA,EAAS,MAAM,0DAAA,OAA2B,EAAS,QAAA,EAAU,OAAO,CAAA;AAE1E,EAAA,GAAA,iBAAI,MAAA,2BAAQ,OAAA,EAAO;AACjB,IAAA,MAAM,IAAA,EAAM,gEAAA,MAAiC,EAAQ,KAAA,EAAO,OAAO,CAAA;AACnE,IAAA,GAAA,CAAI,GAAA,EAAK,OAAO,GAAA;AAAA,EAClB;AAEA,EAAA,MAAM,aAAA,EAAe,MAAM,sDAAA,KAA4B,CAAA;AACvD,EAAA,GAAA,CAAI,YAAA,EAAc;AAChB,IAAA,OAAO,+DAAA;AAAA,MACL,YAAA,CAAa,QAAA;AAAA,MACb,YAAA,CAAa,OAAA;AAAA,MACb;AAAA,IACF,CAAA;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,iBAAC,MAAA,6BAAQ,QAAA,mBAAS,MAAA,6BAAQ,uBAAA,EAAuB;AACnD,IAAA,MAAM,IAAA,EAAM,gEAAA,MAAiC,EAAQ,KAAA,EAAO,OAAO,CAAA;AACnE,IAAA,GAAA,CAAI,GAAA,EAAK,OAAO,GAAA;AAAA,EAClB;AAEA,EAAA,OAAO,4DAAA,KAA6B,EAAO,OAAO,CAAA;AACpD;ADjBA;AACA;AACE;AACF,gDAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-ZHRU337O.cjs","sourcesContent":[null,"import type { AiModelsCatalogClient } from \"../catalog/AiModelsCatalogClient.js\";\nimport {\n modelVendorRefFromIdentity,\n modelVendorRefFromVendorAndSlug,\n resolveModelVendorFromResolution,\n resolveModelVendorLastResort,\n type ModelVendorRef,\n type ResolveModelVendorOptions,\n} from \"../sync/modelNameResolver/resolveModelVendor.js\";\nimport { matchModelInAiProfiles } from \"./aiProfilesMatch.js\";\nimport { buildCatalogResolveAttempts, resolveFromCatalogAttempts } from \"./costModelResolution.js\";\n\nexport type { ModelVendorRef, ResolveModelVendorOptions };\nexport {\n resolveModelVendorFromResolution,\n resolveModelVendorSync,\n resolveModelVendorLastResort,\n modelVendorRefFromIdentity,\n modelVendorRefFromVendorAndSlug,\n} from \"../sync/modelNameResolver/resolveModelVendor.js\";\n\n/** Best-effort vendor lookup from a model name alone (catalog + ai-profiles). */\nexport async function resolveModelVendor(\n model: string,\n catalog: AiModelsCatalogClient,\n options?: ResolveModelVendorOptions,\n): Promise<ModelVendorRef | null> {\n const exact = modelVendorRefFromIdentity(model, options);\n if (exact) return exact;\n\n const attempts = buildCatalogResolveAttempts(model);\n const result = await resolveFromCatalogAttempts(catalog, attempts, options);\n\n if (result?.found) {\n const ref = resolveModelVendorFromResolution(result, model, options);\n if (ref) return ref;\n }\n\n const profileMatch = await matchModelInAiProfiles(model);\n if (profileMatch) {\n return modelVendorRefFromVendorAndSlug(\n profileMatch.provider,\n profileMatch.modelId,\n options,\n );\n }\n\n if (!result?.found && result?.bestRejectedCandidate) {\n const ref = resolveModelVendorFromResolution(result, model, options);\n if (ref) return ref;\n }\n\n return resolveModelVendorLastResort(model, options);\n}\n"]}
|
package/dist/cli/index.cjs
CHANGED
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkH6HDETJKcjs = require('../chunk-H6HDETJK.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
var _chunkBAHBDADJcjs = require('../chunk-BAHBDADJ.cjs');
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _chunkIJTDND4Vcjs = require('../chunk-IJTDND4V.cjs');
|
|
12
|
+
require('../chunk-ZHRU337O.cjs');
|
|
13
|
+
require('../chunk-SYDW33AL.cjs');
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
|
|
15
|
-
var
|
|
17
|
+
var _chunkRVQPQI63cjs = require('../chunk-RVQPQI63.cjs');
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
var
|
|
20
|
-
require('../chunk-
|
|
21
|
-
require('../chunk-
|
|
22
|
-
require('../chunk-
|
|
21
|
+
var _chunkUY2VLJN6cjs = require('../chunk-UY2VLJN6.cjs');
|
|
22
|
+
require('../chunk-GNOZFRKR.cjs');
|
|
23
|
+
require('../chunk-2KPWVOOT.cjs');
|
|
24
|
+
require('../chunk-OZE336BL.cjs');
|
|
23
25
|
require('../chunk-PADNCGZB.cjs');
|
|
24
26
|
|
|
25
27
|
|
|
@@ -36,8 +38,8 @@ function registry(path) {
|
|
|
36
38
|
function resolver(path) {
|
|
37
39
|
return new (0, _chunkBAHBDADJcjs.AliasResolver)({
|
|
38
40
|
registry: registry(path),
|
|
39
|
-
catalogClient: new (0,
|
|
40
|
-
cacheTtlMs:
|
|
41
|
+
catalogClient: new (0, _chunkUY2VLJN6cjs.AiModelsCatalogClient)({
|
|
42
|
+
cacheTtlMs: _chunkUY2VLJN6cjs.resolveCatalogCacheTtlMs.call(void 0, )
|
|
41
43
|
})
|
|
42
44
|
});
|
|
43
45
|
}
|
|
@@ -162,7 +164,7 @@ function emitHuman(lines) {
|
|
|
162
164
|
function registerCatalogCommand(program2) {
|
|
163
165
|
const catalog = program2.command("catalog").description("Model catalog load and health commands");
|
|
164
166
|
catalog.command("refresh").description("Fetch catalogs from open-assets.x12i.com and warm the cache").option("--bundled-only", "Use bundled src/data catalogs only (no HTTP)").option("--json", "Machine-readable JSON on stdout").action(async (opts) => {
|
|
165
|
-
const result = await
|
|
167
|
+
const result = await _chunkRVQPQI63cjs.refreshAiModelsCatalog.call(void 0, { bundledOnly: opts.bundledOnly });
|
|
166
168
|
if (opts.json) {
|
|
167
169
|
emitJson(result);
|
|
168
170
|
} else {
|
|
@@ -174,7 +176,7 @@ function registerCatalogCommand(program2) {
|
|
|
174
176
|
}
|
|
175
177
|
});
|
|
176
178
|
catalog.command("verify").description("Validate direct + OpenRouter catalogs load successfully").option("--bundled-only", "Use bundled src/data catalogs only (no HTTP)").option("--json", "Machine-readable JSON on stdout").action(async (opts) => {
|
|
177
|
-
const report = await
|
|
179
|
+
const report = await _chunkRVQPQI63cjs.verifyAiModelsCatalog.call(void 0, { bundledOnly: opts.bundledOnly });
|
|
178
180
|
if (opts.json) {
|
|
179
181
|
emitJson(report);
|
|
180
182
|
} else {
|
|
@@ -202,11 +204,11 @@ function registerCostCommand(program2) {
|
|
|
202
204
|
"Completion token count",
|
|
203
205
|
(v) => Number.parseInt(v, 10)
|
|
204
206
|
).option("--cached-tokens <n>", "Cached token count", (v) => Number.parseInt(v, 10)).option("--reasoning-tokens <n>", "Reasoning token count", (v) => Number.parseInt(v, 10)).option("--provider <id>", "Provider for pricing selection", "openrouter").option("--json", "Output raw AiCostResult JSON").option("--bundled-only", "Use src/data catalogs only (no HTTP)").action(async (opts) => {
|
|
205
|
-
const catalogClient = new (0,
|
|
206
|
-
cacheTtlMs:
|
|
207
|
+
const catalogClient = new (0, _chunkUY2VLJN6cjs.AiModelsCatalogClient)({
|
|
208
|
+
cacheTtlMs: _chunkUY2VLJN6cjs.resolveCatalogCacheTtlMs.call(void 0, ),
|
|
207
209
|
bundledOnly: opts.bundledOnly
|
|
208
210
|
});
|
|
209
|
-
const calculator = new (0,
|
|
211
|
+
const calculator = new (0, _chunkH6HDETJKcjs.CostCalculator)(catalogClient, {
|
|
210
212
|
aliasRegistry: new (0, _chunkBAHBDADJcjs.AliasRegistry)()
|
|
211
213
|
});
|
|
212
214
|
const result = await calculator.calculate({
|
|
@@ -248,8 +250,8 @@ function registerCostCommand(program2) {
|
|
|
248
250
|
|
|
249
251
|
// src/cli/commands/models.ts
|
|
250
252
|
function service(opts) {
|
|
251
|
-
return new (0,
|
|
252
|
-
cacheTtlMs:
|
|
253
|
+
return new (0, _chunkIJTDND4Vcjs.AiModelsService)({
|
|
254
|
+
cacheTtlMs: _chunkUY2VLJN6cjs.resolveCatalogCacheTtlMs.call(void 0, ),
|
|
253
255
|
bundledOnly: opts.bundledOnly
|
|
254
256
|
});
|
|
255
257
|
}
|
|
@@ -333,6 +335,24 @@ ${rows.length} shown \xB7 ${total} matching`);
|
|
|
333
335
|
console.log(`Confidence: ${result.confidence.toFixed(2)}`);
|
|
334
336
|
console.log(`Via OR: ${result.routedViaOpenRouter ? "yes" : "no"}`);
|
|
335
337
|
});
|
|
338
|
+
models.command("vendor").description("Find model vendor from model name alone (best-effort)").requiredOption("--model <m>", "Model string (required)").option("--openrouter", "Return OpenRouter transport shape (provider openrouter, model vendor/slug)").option("--json", "Output raw JSON").option("--bundled-only", "Use src/data catalogs only (no HTTP)").action(async (opts) => {
|
|
339
|
+
const ref = await service(opts).resolveVendor(opts.model, {
|
|
340
|
+
asOpenRouter: opts.openrouter
|
|
341
|
+
});
|
|
342
|
+
if (opts.json) {
|
|
343
|
+
console.log(JSON.stringify(ref, null, 2));
|
|
344
|
+
if (!ref) process.exit(1);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
console.log(`Input: model="${opts.model}"`);
|
|
348
|
+
if (!ref) {
|
|
349
|
+
console.log("Result: NOT FOUND");
|
|
350
|
+
process.exit(1);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
console.log(`Vendor: ${ref.provider}`);
|
|
354
|
+
console.log(`Model: ${ref.model}`);
|
|
355
|
+
});
|
|
336
356
|
models.command("count").description("Count models matching filters").option("--provider <id>", "Filter by providerId").option("--output-modality <m>", "Filter by output modality").option("--parameter <p>", "Filter by supported parameter").option("--tools", "Only models that support tools").option("--reasoning", "Only reasoning / thinking models").option("--bundled-only", "Use src/data catalogs only (no HTTP)").action(async (opts) => {
|
|
337
357
|
const n = await service(opts).countModels({
|
|
338
358
|
providerId: opts.provider,
|
package/dist/cli/index.cjs.map
CHANGED
|
@@ -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(\"vendor\")\n .description(\"Find model vendor from model name alone (best-effort)\")\n .requiredOption(\"--model <m>\", \"Model string (required)\")\n .option(\"--openrouter\", \"Return OpenRouter transport shape (provider openrouter, model vendor/slug)\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n openrouter?: boolean;\n json?: boolean;\n bundledOnly?: boolean;\n }) => {\n const ref = await service(opts).resolveVendor(opts.model, {\n asOpenRouter: opts.openrouter,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(ref, null, 2));\n if (!ref) process.exit(1);\n return;\n }\n\n console.log(`Input: model=\"${opts.model}\"`);\n if (!ref) {\n console.log(\"Result: NOT FOUND\");\n process.exit(1);\n return;\n }\n\n console.log(`Vendor: ${ref.provider}`);\n console.log(`Model: ${ref.model}`);\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,25 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
CostCalculator
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-DSDN65JH.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-
|
|
11
|
+
} from "../chunk-5RW5ARLO.js";
|
|
12
|
+
import "../chunk-UQ4NSEXF.js";
|
|
13
|
+
import "../chunk-4ILJWO64.js";
|
|
12
14
|
import {
|
|
13
15
|
refreshAiModelsCatalog,
|
|
14
16
|
verifyAiModelsCatalog
|
|
15
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-7VGEQTJA.js";
|
|
16
18
|
import {
|
|
17
19
|
AiModelsCatalogClient,
|
|
18
20
|
resolveCatalogCacheTtlMs
|
|
19
|
-
} from "../chunk-
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
21
|
+
} from "../chunk-TZHPZGDB.js";
|
|
22
|
+
import "../chunk-RNSXRGIA.js";
|
|
23
|
+
import "../chunk-SQ6NOF4Z.js";
|
|
24
|
+
import "../chunk-OB44D7RG.js";
|
|
23
25
|
import "../chunk-2PTCWPHV.js";
|
|
24
26
|
|
|
25
27
|
// src/cli/index.ts
|
|
@@ -330,6 +332,24 @@ ${rows.length} shown \xB7 ${total} matching`);
|
|
|
330
332
|
console.log(`Confidence: ${result.confidence.toFixed(2)}`);
|
|
331
333
|
console.log(`Via OR: ${result.routedViaOpenRouter ? "yes" : "no"}`);
|
|
332
334
|
});
|
|
335
|
+
models.command("vendor").description("Find model vendor from model name alone (best-effort)").requiredOption("--model <m>", "Model string (required)").option("--openrouter", "Return OpenRouter transport shape (provider openrouter, model vendor/slug)").option("--json", "Output raw JSON").option("--bundled-only", "Use src/data catalogs only (no HTTP)").action(async (opts) => {
|
|
336
|
+
const ref = await service(opts).resolveVendor(opts.model, {
|
|
337
|
+
asOpenRouter: opts.openrouter
|
|
338
|
+
});
|
|
339
|
+
if (opts.json) {
|
|
340
|
+
console.log(JSON.stringify(ref, null, 2));
|
|
341
|
+
if (!ref) process.exit(1);
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
console.log(`Input: model="${opts.model}"`);
|
|
345
|
+
if (!ref) {
|
|
346
|
+
console.log("Result: NOT FOUND");
|
|
347
|
+
process.exit(1);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
console.log(`Vendor: ${ref.provider}`);
|
|
351
|
+
console.log(`Model: ${ref.model}`);
|
|
352
|
+
});
|
|
333
353
|
models.command("count").description("Count models matching filters").option("--provider <id>", "Filter by providerId").option("--output-modality <m>", "Filter by output modality").option("--parameter <p>", "Filter by supported parameter").option("--tools", "Only models that support tools").option("--reasoning", "Only reasoning / thinking models").option("--bundled-only", "Use src/data catalogs only (no HTTP)").action(async (opts) => {
|
|
334
354
|
const n = await service(opts).countModels({
|
|
335
355
|
providerId: opts.provider,
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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(\"vendor\")\n .description(\"Find model vendor from model name alone (best-effort)\")\n .requiredOption(\"--model <m>\", \"Model string (required)\")\n .option(\"--openrouter\", \"Return OpenRouter transport shape (provider openrouter, model vendor/slug)\")\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--bundled-only\", \"Use src/data catalogs only (no HTTP)\")\n .action(async (opts: {\n model: string;\n openrouter?: boolean;\n json?: boolean;\n bundledOnly?: boolean;\n }) => {\n const ref = await service(opts).resolveVendor(opts.model, {\n asOpenRouter: opts.openrouter,\n });\n\n if (opts.json) {\n console.log(JSON.stringify(ref, null, 2));\n if (!ref) process.exit(1);\n return;\n }\n\n console.log(`Input: model=\"${opts.model}\"`);\n if (!ref) {\n console.log(\"Result: NOT FOUND\");\n process.exit(1);\n return;\n }\n\n console.log(`Vendor: ${ref.provider}`);\n console.log(`Model: ${ref.model}`);\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,eAAe;;;ACDxB,OAAO,QAAQ;AAOf,SAAS,SAAS,MAAe;AAC/B,SAAO,IAAI,cAAc,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC,CAAC;AAC5D;AAEA,SAAS,SAAS,MAAe;AAC/B,SAAO,IAAI,cAAc;AAAA,IACvB,UAAU,SAAS,IAAI;AAAA,IACvB,eAAe,IAAI,sBAAsB;AAAA,MACvC,YAAY,yBAAyB;AAAA,IACvC,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,qBAAqBA,UAAwB;AAC3D,QAAM,QAAQA,SAAQ,QAAQ,OAAO,EAAE,YAAY,oCAAoC;AAEvF,QACG,QAAQ,MAAM,EACd,YAAY,uCAAuC,EACnD,OAAO,iBAAiB,aAAa,EACrC,OAAO,WAAW,6BAA6B,EAC/C,OAAO,CAAC,SAA6C;AACpD,UAAM,MAAM,SAAS,KAAK,IAAI;AAC9B,QAAI,IAAI,OAAO,KAAK,CAAC,KAAK,OAAO;AAC/B,cAAQ,IAAI,kCAAkC,IAAI,IAAI,EAAE;AACxD;AAAA,IACF;AACA,QAAI,KAAK,SAAS,IAAI,OAAO,GAAG;AAC9B,SAAG,WAAW,IAAI,IAAI;AAAA,IACxB;AACA,QAAI,KAAK;AACT,YAAQ,IAAI,mBAAc,IAAI,IAAI,EAAE;AACpC,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,SAAS,UAAU,YAAY,EAC/B,SAAS,aAAa,UAAU,EAChC,OAAO,kBAAkB,oBAAoB,YAAY,EACzD,OAAO,qBAAqB,qBAAqB,EACjD,OAAO,aAAa,oBAAoB,CAAC,GAAW,SAAmB,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAa,EACnG,OAAO,iBAAiB,qBAAqB,EAC7C;AAAA,IACC,CACE,MACA,SACA,SACG;AACH,YAAM,MAAM,SAAS,KAAK,IAAI;AAC9B,UAAI,CAAC,IAAI,OAAO,EAAG,KAAI,KAAK;AAC5B,UAAI,IAAI,MAAM;AAAA,QACZ;AAAA,QACA,UAAU,KAAK;AAAA,QACf,aAAa,KAAK;AAAA,QAClB,MAAM,KAAK,IAAI,SAAS,KAAK,MAAM;AAAA,MACrC,CAAC;AACD,cAAQ,IAAI,kBAAa,IAAI,YAAO,OAAO,UAAU,KAAK,QAAQ,GAAG;AACrE,cAAQ,IAAI,cAAc,IAAI,IAAI,EAAE;AAAA,IACtC;AAAA,EACF;AAEF,QACG,QAAQ,KAAK,EACb,YAAY,yDAAyD,EACrE,SAAS,UAAU,YAAY,EAC/B,OAAO,iBAAiB,qBAAqB,EAC7C,OAAO,OAAO,MAAc,SAA4B;AACvD,UAAM,MAAM,MAAM,SAAS,KAAK,IAAI,EAAE,SAAS,IAAI;AACnD,YAAQ,IAAI,iBAAiB,IAAI,KAAK,EAAE;AACxC,YAAQ,IAAI,iBAAiB,IAAI,OAAO,EAAE;AAC1C,YAAQ,IAAI,iBAAiB,IAAI,QAAQ,EAAE;AAC3C,QAAI,IAAI,aAAa;AACnB,cAAQ,IAAI,iBAAiB,IAAI,IAAI,EAAE;AACvC,cAAQ,IAAI,iBAAiB,IAAI,YAAY,cAAc,eAAe,CAAC,SAAS;AACpF,cAAQ,IAAI,iBAAiB,IAAI,YAAY,MAAM,SAAI;AAAA,IACzD,OAAO;AACL,cAAQ,IAAI,0EAAqE;AAAA,IACnF;AACA,QAAI,IAAI,MAAM,YAAa,SAAQ,IAAI,iBAAiB,IAAI,MAAM,WAAW,EAAE;AAC/E,QAAI,IAAI,MAAM,MAAM,OAAQ,SAAQ,IAAI,iBAAiB,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,EACtF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,kBAAkB,EAC9B,OAAO,aAAa,eAAe,EACnC,OAAO,UAAU,iBAAiB,EAClC,OAAO,WAAW,yCAAyC,EAC3D,OAAO,iBAAiB,qBAAqB,EAC7C,OAAO,OAAO,SAA2E;AACxF,UAAM,MAAM,SAAS,KAAK,IAAI;AAC9B,UAAM,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,KAAK,KAAK,IAAI,IAAI,MAAS;AAE9D,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,IACF;AAEA,QAAI,KAAK,OAAO;AACd,YAAM,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,SAAS;AAClD,cAAQ,IAAI,OAAO,OAAO,EAAE,GAAG,WAAW,OAAO,EAAE,GAAG,QAAQ;AAC9D,cAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,iBAAW,KAAK,OAAO,SAAS;AAC9B,cAAM,SACJ,EAAE,WAAW,OAAO,oBAAe,EAAE,WAAW,YAAY,0BAAqB;AACnF,gBAAQ,IAAI,EAAE,KAAK,OAAO,EAAE,GAAG,EAAE,QAAQ,OAAO,EAAE,GAAG,MAAM;AAAA,MAC7D;AACA;AAAA,IACF;AAEA,YAAQ,IAAI,OAAO,OAAO,EAAE,GAAG,WAAW,OAAO,EAAE,GAAG,WAAW,OAAO,EAAE,GAAG,aAAa;AAC1F,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,eAAW,OAAO,MAAM;AACtB,cAAQ;AAAA,QACN,IAAI,KAAK,OAAO,EAAE;AAAA,QAClB,IAAI,QAAQ,OAAO,EAAE;AAAA,QACrB,IAAI,SAAS,OAAO,EAAE;AAAA,SACrB,IAAI,eAAe,IAAI,MAAM,GAAG,EAAE;AAAA,MACrC;AAAA,IACF;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,iBAAiB,EAC7B,SAAS,UAAU,YAAY,EAC/B,OAAO,SAAS,mBAAmB,EACnC,OAAO,iBAAiB,qBAAqB,EAC7C,OAAO,CAAC,MAAc,SAA2C;AAChE,QAAI,CAAC,KAAK,KAAK;AACb,cAAQ,IAAI,iBAAiB,IAAI,0BAA0B;AAC3D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,UAAU,SAAS,KAAK,IAAI,EAAE,OAAO,IAAI;AAC/C,QAAI,QAAS,SAAQ,IAAI,0BAAqB,IAAI,GAAG;AAAA,SAChD;AACH,cAAQ,MAAM,oBAAoB,IAAI,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,iBAAiB,EAC7B,SAAS,UAAU,cAAc,EACjC,SAAS,QAAQ,UAAU,EAC3B,OAAO,WAAW,oCAAoC,EACtD,OAAO,iBAAiB,qBAAqB,EAC7C,OAAO,CAAC,MAAc,IAAY,SAA6C;AAC9E,aAAS,KAAK,IAAI,EAAE,OAAO,MAAM,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;AAC1D,YAAQ,IAAI,oBAAe,IAAI,aAAQ,EAAE,GAAG;AAAA,EAC9C,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,wDAAwD,EACpE,OAAO,iBAAiB,qBAAqB,EAC7C,OAAO,OAAO,SAA4B;AACzC,UAAM,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,SAAS;AAClD,YAAQ,IAAI,YAAY,OAAO,KAAK;AAAA,CAAuC;AAE3E,eAAW,KAAK,OAAO,SAAS;AAC9B,YAAM,OAAO,EAAE,WAAW,OAAO,WAAM,EAAE,WAAW,YAAY,WAAM;AACtE,YAAM,QAAQ,EAAE,eAAe,KAAK,EAAE,YAAY,MAAM,EAAE,QAAQ,KAAK,EAAE,KAAK,MAAM;AACpF,cAAQ,IAAI,KAAK,IAAI,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC,WAAM,EAAE,QAAQ,OAAO,EAAE,CAAC,GAAG,KAAK,EAAE;AAAA,IACjF;AAEA,YAAQ;AAAA,MACN;AAAA,EAAK,OAAO,KAAK,iBAAc,OAAO,EAAE,cAAW,OAAO,OAAO,mBAAgB,OAAO,MAAM;AAAA,IAChG;AAEA,QAAI,OAAO,SAAS,EAAG,SAAQ,KAAK,CAAC;AAAA,EACvC,CAAC;AACL;;;ACxLO,SAAS,SAAS,MAAqB;AAC5C,UAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;AAEO,SAAS,UAAU,OAAuB;AAC/C,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,IAAI;AAAA,EAClB;AACF;;;ACJO,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,UAAUA,SAAQ,QAAQ,SAAS,EAAE,YAAY,wCAAwC;AAE/F,UACG,QAAQ,SAAS,EACjB,YAAY,6DAA6D,EACzE,OAAO,kBAAkB,8CAA8C,EACvE,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,SAAoD;AACjE,UAAM,SAAS,MAAM,uBAAuB,EAAE,aAAa,KAAK,YAAY,CAAC;AAC7E,QAAI,KAAK,MAAM;AACb,eAAS,MAAM;AAAA,IACjB,OAAO;AACL,gBAAU;AAAA,QACR;AAAA,QACA,aAAa,OAAO,WAAW,KAAK,OAAO,YAAY;AAAA,QACvD,iBAAiB,OAAO,eAAe,KAAK,OAAO,gBAAgB;AAAA,MACrE,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,yDAAyD,EACrE,OAAO,kBAAkB,8CAA8C,EACvE,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,SAAoD;AACjE,UAAM,SAAS,MAAM,sBAAsB,EAAE,aAAa,KAAK,YAAY,CAAC;AAE5E,QAAI,KAAK,MAAM;AACb,eAAS,MAAM;AAAA,IACjB,OAAO;AACL,gBAAU;AAAA,QACR,OAAO,KAAK,wCAAmC;AAAA,QAC/C,wBAAwB,OAAO,WAAW,KAAK,OAAO,YAAY;AAAA,QAClE,wBAAwB,OAAO,eAAe,KAAK,OAAO,gBAAgB;AAAA,QAC1E,wBAAwB,OAAO,SAAS;AAAA,QACxC,wBAAwB,OAAO,aAAa;AAAA,MAC9C,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,OAAO,IAAI;AACd,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC3CA,SAAS,UAAU,GAAmB;AACpC,SAAO,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzB;AAEO,SAAS,oBAAoBC,UAAwB;AAC1D,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,eAAe,gBAAgB,mBAAmB,EAClD,eAAe,uBAAuB,sBAAsB,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC,EACzF;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE;AAAA,EAC9B,EACC,OAAO,uBAAuB,sBAAsB,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC,EACjF,OAAO,0BAA0B,yBAAyB,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC,EACvF,OAAO,mBAAmB,kCAAkC,YAAY,EACxE,OAAO,UAAU,8BAA8B,EAC/C,OAAO,kBAAkB,sCAAsC,EAC/D,OAAO,OAAO,SAST;AACJ,UAAM,gBAAgB,IAAI,sBAAsB;AAAA,MAC9C,YAAY,yBAAyB;AAAA,MACrC,aAAa,KAAK;AAAA,IACpB,CAAC;AAED,UAAM,aAAa,IAAI,eAAe,eAAe;AAAA,MACnD,eAAe,IAAI,cAAc;AAAA,IACnC,CAAC;AAED,UAAM,SAAS,MAAM,WAAW,UAAU;AAAA,MACxC,QAAQ;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB,OAAO,KAAK,eAAe,KAAK;AAAA,QAChC,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK;AAAA,MAClB;AAAA,MACA,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,IAClB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,IACF;AAEA,UAAM,IAAI,OAAO;AACjB,YAAQ,IAAI,iBAAiB,OAAO,eAAe,EAAE;AACrD,QAAI,OAAO,aAAa,OAAO,cAAc,OAAO,iBAAiB;AACnE,cAAQ,IAAI,iBAAiB,OAAO,SAAS,EAAE;AAAA,IACjD;AACA,YAAQ;AAAA,MACN,iBAAiB,KAAK,aAAa,eAAe,CAAC,oBAAe,UAAU,GAAG,iBAAiB,CAAC,CAAC;AAAA,IACpG;AACA,YAAQ;AAAA,MACN,iBAAiB,KAAK,iBAAiB,eAAe,CAAC,oBAAe,UAAU,GAAG,qBAAqB,CAAC,CAAC;AAAA,IAC5G;AACA,YAAQ;AAAA,MACN,qCAAgC,UAAU,GAAG,sBAAsB,CAAC,CAAC;AAAA,IACvE;AACA,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAC1B,YAAQ,IAAI,qCAAgC,UAAU,OAAO,IAAI,CAAC,EAAE;AACpE,YAAQ;AAAA,MACN,mBAAmB,OAAO,sBAAsB,QAAQ,IAAI;AAAA,IAC9D;AAAA,EACF,CAAC;AACL;;;AC9EA,SAAS,QAAQ,MAAiC;AAChD,SAAO,IAAI,gBAAgB;AAAA,IACzB,YAAY,yBAAyB;AAAA,IACrC,aAAa,KAAK;AAAA,EACpB,CAAC;AACH;AAEO,SAAS,sBAAsBC,UAAwB;AAC5D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,wBAAwB;AAE7E,SACG,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C,OAAO,mBAAmB,+CAA+C,EACzE,OAAO,yBAAyB,wDAAmD,EACnF,OAAO,wBAAwB,0BAA0B,EACzD,OAAO,mBAAmB,4CAA4C,EACtE,OAAO,WAAW,gCAAgC,EAClD,OAAO,eAAe,kCAAkC,EACxD,OAAO,gBAAgB,8BAA8B,EACrD,OAAO,UAAU,iBAAiB,EAClC,OAAO,eAAe,YAAY,IAAI,EACtC,OAAO,gBAAgB,aAAa,GAAG,EACvC,OAAO,kBAAkB,sCAAsC,EAC/D,OAAO,OAAO,SAYT;AACJ,UAAM,EAAE,QAAQ,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,EAAE,WAAW;AAAA,MAC7D,YAAY,KAAK;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,eAAe,KAAK;AAAA,MACpB,oBAAoB,KAAK;AAAA,MACzB,eAAe,KAAK,QAAQ,OAAO;AAAA,MACnC,mBAAmB,KAAK,YAAY,OAAO;AAAA,MAC3C,QAAQ,KAAK;AAAA,MACb,OAAO,OAAO,SAAS,KAAK,SAAS,MAAM,EAAE;AAAA,MAC7C,QAAQ,OAAO,SAAS,KAAK,UAAU,KAAK,EAAE;AAAA,IAChD,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,QAAQ,KAAK,GAAG,MAAM,CAAC,CAAC;AAC5D;AAAA,IACF;AAEA,YAAQ;AAAA,MACN,WAAW,OAAO,EAAE;AAAA,MACpB,WAAW,OAAO,EAAE;AAAA,MACpB,SAAS,OAAO,EAAE;AAAA,MAClB,IAAI,OAAO,CAAC;AAAA,MACZ;AAAA,IACF;AACA,YAAQ,IAAI,SAAI,OAAO,GAAG,CAAC;AAC3B,eAAW,KAAK,MAAM;AACpB,cAAQ;AAAA,QACN,EAAE,QAAQ,OAAO,EAAE;AAAA,QACnB,EAAE,WAAW,OAAO,EAAE;AAAA,QACtB,EAAE,sBAAsB,OAAO,EAAE;AAAA,SAChC,EAAE,oBAAoB,QAAQ,MAAM,OAAO,CAAC;AAAA,QAC7C,EAAE,KAAK,MAAM,GAAG,EAAE;AAAA,MACpB;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EAAK,KAAK,MAAM,eAAY,KAAK,WAAW;AAAA,EAC1D,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,sCAAsC,EAClD,SAAS,aAAa,mBAAmB,EACzC,OAAO,kBAAkB,sCAAsC,EAC/D,OAAO,OAAO,SAAiB,SAAoC;AAClE,UAAM,QAAQ,MAAM,QAAQ,IAAI,EAAE,aAAa,OAAO;AACtD,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,EAC5C,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,0CAA0C,EACtD,eAAe,eAAe,yBAAyB,EACvD,OAAO,kBAAkB,4CAAuC,EAChE,OAAO,mBAAmB,iCAA4B,KAAK,EAC3D,OAAO,UAAU,uCAAuC,EACxD,OAAO,aAAa,qBAAqB,EACzC,OAAO,kBAAkB,sCAAsC,EAC/D,OAAO,OAAO,SAOT;AACJ,UAAM,SAAS,MAAM,QAAQ,IAAI,EAAE,QAAQ,KAAK,OAAO,KAAK,QAAQ;AAEpE,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK,YAAY;AACvC,YAAQ,IAAI,wBAAwB,aAAa,aAAa,KAAK,KAAK,GAAG;AAE3E,QAAI,KAAK,WAAW,OAAO,OAAO;AAChC,cAAQ,IAAI,sBAAsB,OAAO,eAAe,GAAG;AAC3D,cAAQ,IAAI,mBAAmB;AAC/B,iBAAW,KAAK,OAAO,aAAa;AAClC,gBAAQ,IAAI,YAAO,CAAC,EAAE;AAAA,MACxB;AACA,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,CAAC,OAAO,OAAO;AACjB,cAAQ,IAAI,sBAAsB;AAClC,cAAQ,IAAI,cAAc,OAAO,MAAM,EAAE;AACzC,UAAI,OAAO,uBAAuB;AAChC,gBAAQ;AAAA,UACN,cAAc,OAAO,sBAAsB,OAAO,gBAAgB,OAAO,sBAAsB,WAAW,QAAQ,CAAC,CAAC;AAAA,QACtH;AAAA,MACF;AACA,cAAQ,IAAI,oEAAoE;AAChF,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AAEA,YAAQ,IAAI,cAAc,OAAO,OAAO,EAAE;AAC1C,YAAQ,IAAI,cAAc,OAAO,QAAQ,QAAQ,qBAAqB,EAAE;AACxE,YAAQ,IAAI,cAAc,OAAO,YAAY,KAAK,UAAK,CAAC,EAAE;AAC1D,YAAQ,IAAI,eAAe,OAAO,WAAW,QAAQ,CAAC,CAAC,EAAE;AACzD,YAAQ,IAAI,cAAc,OAAO,sBAAsB,QAAQ,IAAI,EAAE;AAAA,EACvE,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,uDAAuD,EACnE,eAAe,eAAe,yBAAyB,EACvD,OAAO,gBAAgB,4EAA4E,EACnG,OAAO,UAAU,iBAAiB,EAClC,OAAO,kBAAkB,sCAAsC,EAC/D,OAAO,OAAO,SAKT;AACJ,UAAM,MAAM,MAAM,QAAQ,IAAI,EAAE,cAAc,KAAK,OAAO;AAAA,MACxD,cAAc,KAAK;AAAA,IACrB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AACxC,UAAI,CAAC,IAAK,SAAQ,KAAK,CAAC;AACxB;AAAA,IACF;AAEA,YAAQ,IAAI,kBAAkB,KAAK,KAAK,GAAG;AAC3C,QAAI,CAAC,KAAK;AACR,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AAEA,YAAQ,IAAI,aAAa,IAAI,QAAQ,EAAE;AACvC,YAAQ,IAAI,aAAa,IAAI,KAAK,EAAE;AAAA,EACtC,CAAC;AAEH,SACG,QAAQ,OAAO,EACf,YAAY,+BAA+B,EAC3C,OAAO,mBAAmB,sBAAsB,EAChD,OAAO,yBAAyB,2BAA2B,EAC3D,OAAO,mBAAmB,+BAA+B,EACzD,OAAO,WAAW,gCAAgC,EAClD,OAAO,eAAe,kCAAkC,EACxD,OAAO,kBAAkB,sCAAsC,EAC/D,OAAO,OAAO,SAOT;AACJ,UAAM,IAAI,MAAM,QAAQ,IAAI,EAAE,YAAY;AAAA,MACxC,YAAY,KAAK;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,oBAAoB,KAAK;AAAA,MACzB,eAAe,KAAK,QAAQ,OAAO;AAAA,MACnC,mBAAmB,KAAK,YAAY,OAAO;AAAA,IAC7C,CAAC;AACD,YAAQ,IAAI,CAAC;AAAA,EACf,CAAC;AACL;;;AL1MA,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,SAAS,YAAY;AAE9B,IAAM,MAAM,KAAK;AAAA,EACf,aAAa,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,oBAAoB,GAAG,MAAM;AAC1F;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,yEAAoE,EAChF,QAAQ,IAAI,OAAO;AAEtB,uBAAuB,OAAO;AAC9B,sBAAsB,OAAO;AAC7B,oBAAoB,OAAO;AAC3B,qBAAqB,OAAO;AAE5B,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,UAAmB;AACzD,UAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAC5D,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["program","program","program","program"]}
|