@x12i/ai-tools 1.0.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +146 -204
  3. package/dist/AiModelsCatalogClient-B5FMI9gj.d.cts +58 -0
  4. package/dist/AiModelsCatalogClient-CPPNI6Ry.d.ts +58 -0
  5. package/dist/aliases/index.cjs +4 -3
  6. package/dist/aliases/index.cjs.map +1 -1
  7. package/dist/aliases/index.d.cts +3 -5
  8. package/dist/aliases/index.d.ts +3 -5
  9. package/dist/aliases/index.js +2 -2
  10. package/dist/catalog/index.cjs +18 -9
  11. package/dist/catalog/index.cjs.map +1 -1
  12. package/dist/catalog/index.d.cts +13 -100
  13. package/dist/catalog/index.d.ts +13 -100
  14. package/dist/catalog/index.js +31 -23
  15. package/dist/{chunk-AJEKEWWB.js → chunk-2PTCWPHV.js} +17 -3
  16. package/dist/chunk-2PTCWPHV.js.map +1 -0
  17. package/dist/chunk-56R4XA2S.js +1 -0
  18. package/dist/chunk-5GUKLOEK.cjs +1 -0
  19. package/dist/chunk-5GUKLOEK.cjs.map +1 -0
  20. package/dist/chunk-5XAAMBDO.cjs +1988 -0
  21. package/dist/chunk-5XAAMBDO.cjs.map +1 -0
  22. package/dist/chunk-6BQBKROR.js +95 -0
  23. package/dist/chunk-6BQBKROR.js.map +1 -0
  24. package/dist/chunk-AB5GNXJ4.js +46 -0
  25. package/dist/chunk-AB5GNXJ4.js.map +1 -0
  26. package/dist/{chunk-O2A6OVEH.js → chunk-ANVONYJF.js} +2 -2
  27. package/dist/{chunk-O2A6OVEH.js.map → chunk-ANVONYJF.js.map} +1 -1
  28. package/dist/chunk-B3V2EHRY.js +225 -0
  29. package/dist/chunk-B3V2EHRY.js.map +1 -0
  30. package/dist/{chunk-QWAX7VQO.cjs → chunk-BAHBDADJ.cjs} +11 -11
  31. package/dist/{chunk-QWAX7VQO.cjs.map → chunk-BAHBDADJ.cjs.map} +1 -1
  32. package/dist/{chunk-TF4L2NEC.cjs → chunk-DXZOL3VN.cjs} +62 -313
  33. package/dist/chunk-DXZOL3VN.cjs.map +1 -0
  34. package/dist/chunk-EDMCKHO6.cjs +225 -0
  35. package/dist/chunk-EDMCKHO6.cjs.map +1 -0
  36. package/dist/{chunk-DJ5SWJDY.js → chunk-EYHMQVAL.js} +48 -299
  37. package/dist/chunk-EYHMQVAL.js.map +1 -0
  38. package/dist/chunk-GS7T56RP.cjs +8 -0
  39. package/dist/chunk-GS7T56RP.cjs.map +1 -0
  40. package/dist/chunk-NF2SKQR7.cjs +973 -0
  41. package/dist/chunk-NF2SKQR7.cjs.map +1 -0
  42. package/dist/chunk-OPN6BGNH.js +1985 -0
  43. package/dist/chunk-OPN6BGNH.js.map +1 -0
  44. package/dist/{chunk-7Q742NI3.cjs → chunk-PADNCGZB.cjs} +17 -3
  45. package/dist/chunk-PADNCGZB.cjs.map +1 -0
  46. package/dist/chunk-PRCICORG.cjs +95 -0
  47. package/dist/chunk-PRCICORG.cjs.map +1 -0
  48. package/dist/{chunk-6QGDZTGH.js → chunk-SIH4GPV4.js} +4 -29
  49. package/dist/chunk-SIH4GPV4.js.map +1 -0
  50. package/dist/chunk-U2YDDUVP.js +970 -0
  51. package/dist/chunk-U2YDDUVP.js.map +1 -0
  52. package/dist/{chunk-4NAY6HRP.js → chunk-VJHLO2R3.js} +7 -58
  53. package/dist/chunk-VJHLO2R3.js.map +1 -0
  54. package/dist/chunk-XAWBTX3N.cjs +46 -0
  55. package/dist/chunk-XAWBTX3N.cjs.map +1 -0
  56. package/dist/{chunk-AV6OE2YQ.cjs → chunk-XOKUDUUI.cjs} +14 -39
  57. package/dist/chunk-XOKUDUUI.cjs.map +1 -0
  58. package/dist/chunk-YQDSN6R6.cjs +86 -0
  59. package/dist/chunk-YQDSN6R6.cjs.map +1 -0
  60. package/dist/cli/index.cjs +59 -201
  61. package/dist/cli/index.cjs.map +1 -1
  62. package/dist/cli/index.js +53 -198
  63. package/dist/cli/index.js.map +1 -1
  64. package/dist/cost/index.cjs +19 -3
  65. package/dist/cost/index.cjs.map +1 -1
  66. package/dist/cost/index.d.cts +10 -50
  67. package/dist/cost/index.d.ts +10 -50
  68. package/dist/cost/index.js +18 -3
  69. package/dist/index.cjs +24 -16
  70. package/dist/index.cjs.map +1 -1
  71. package/dist/index.d.cts +13 -13
  72. package/dist/index.d.ts +13 -13
  73. package/dist/index.js +44 -37
  74. package/dist/modelCache-BzRn6t_C.d.ts +113 -0
  75. package/dist/modelCache-CJftI-Ko.d.cts +113 -0
  76. package/dist/{modelNameResolver-DqFt7g6W.d.ts → modelNameResolver-5XkBMctP.d.ts} +2 -6
  77. package/dist/{modelNameResolver-D9V_GfUK.d.cts → modelNameResolver-C5CSTGFF.d.cts} +2 -6
  78. package/dist/models/index.cjs +9 -6
  79. package/dist/models/index.cjs.map +1 -1
  80. package/dist/models/index.d.cts +9 -31
  81. package/dist/models/index.d.ts +9 -31
  82. package/dist/models/index.js +9 -7
  83. package/dist/resolveUsageModel-BFwf80Hz.d.ts +140 -0
  84. package/dist/resolveUsageModel-C_YmGR1M.d.cts +140 -0
  85. package/dist/sync/index.cjs +7 -9
  86. package/dist/sync/index.cjs.map +1 -1
  87. package/dist/sync/index.d.cts +3 -8
  88. package/dist/sync/index.d.ts +3 -8
  89. package/dist/sync/index.js +8 -11
  90. package/dist/toolbox/index.cjs +1 -0
  91. package/dist/toolbox/index.cjs.map +1 -1
  92. package/dist/types-BrzJWsTU.d.cts +277 -0
  93. package/dist/types-BrzJWsTU.d.ts +277 -0
  94. package/package.json +9 -20
  95. package/src/data/models-catalog.json +670 -0
  96. package/src/data/openrouter-models-catalog.json +857 -0
  97. package/dist/AiModelsCatalogClient-4RF5BCDL.cjs +0 -9
  98. package/dist/AiModelsCatalogClient-4RF5BCDL.cjs.map +0 -1
  99. package/dist/AiModelsCatalogClient-CNeqFiFs.d.cts +0 -30
  100. package/dist/AiModelsCatalogClient-NUF3CBLW.js +0 -9
  101. package/dist/AiModelsCatalogClient-nwFoEaqL.d.ts +0 -30
  102. package/dist/catalox/index.cjs +0 -21
  103. package/dist/catalox/index.cjs.map +0 -1
  104. package/dist/catalox/index.d.cts +0 -11
  105. package/dist/catalox/index.d.ts +0 -11
  106. package/dist/catalox/index.js +0 -21
  107. package/dist/catalox/index.js.map +0 -1
  108. package/dist/chunk-4NAY6HRP.js.map +0 -1
  109. package/dist/chunk-6QGDZTGH.js.map +0 -1
  110. package/dist/chunk-7Q742NI3.cjs.map +0 -1
  111. package/dist/chunk-AJEKEWWB.js.map +0 -1
  112. package/dist/chunk-AV6OE2YQ.cjs.map +0 -1
  113. package/dist/chunk-C3H7RTFR.cjs +0 -1
  114. package/dist/chunk-C3H7RTFR.cjs.map +0 -1
  115. package/dist/chunk-DJ5SWJDY.js.map +0 -1
  116. package/dist/chunk-DKHGWHXP.cjs +0 -169
  117. package/dist/chunk-DKHGWHXP.cjs.map +0 -1
  118. package/dist/chunk-F2F4UEFD.cjs +0 -75
  119. package/dist/chunk-F2F4UEFD.cjs.map +0 -1
  120. package/dist/chunk-FGP3QXWL.cjs +0 -163
  121. package/dist/chunk-FGP3QXWL.cjs.map +0 -1
  122. package/dist/chunk-G2G4KSC5.js +0 -30
  123. package/dist/chunk-G2G4KSC5.js.map +0 -1
  124. package/dist/chunk-HN6UAQAE.cjs +0 -83
  125. package/dist/chunk-HN6UAQAE.cjs.map +0 -1
  126. package/dist/chunk-HS74X2OJ.cjs +0 -172
  127. package/dist/chunk-HS74X2OJ.cjs.map +0 -1
  128. package/dist/chunk-HYGXZY25.js +0 -163
  129. package/dist/chunk-HYGXZY25.js.map +0 -1
  130. package/dist/chunk-KQOALKKX.js +0 -75
  131. package/dist/chunk-KQOALKKX.js.map +0 -1
  132. package/dist/chunk-LYOU7CA2.cjs +0 -30
  133. package/dist/chunk-LYOU7CA2.cjs.map +0 -1
  134. package/dist/chunk-M5TMA73F.js +0 -1
  135. package/dist/chunk-M5TMA73F.js.map +0 -1
  136. package/dist/chunk-MX3AMQFC.js +0 -172
  137. package/dist/chunk-MX3AMQFC.js.map +0 -1
  138. package/dist/chunk-QCRLKVB3.cjs +0 -137
  139. package/dist/chunk-QCRLKVB3.cjs.map +0 -1
  140. package/dist/chunk-TF4L2NEC.cjs.map +0 -1
  141. package/dist/chunk-VRFVF5RH.js +0 -169
  142. package/dist/chunk-VRFVF5RH.js.map +0 -1
  143. package/dist/chunk-YHO57D2V.js +0 -83
  144. package/dist/chunk-YHO57D2V.js.map +0 -1
  145. package/dist/syncAiModelsCatalog-CnXRLm2c.d.cts +0 -32
  146. package/dist/syncAiModelsCatalog-DpkN_w7S.d.ts +0 -32
  147. package/dist/types-BYXnCvKx.d.cts +0 -137
  148. package/dist/types-BYXnCvKx.d.ts +0 -137
  149. package/dist/types-CX6QFNNy.d.cts +0 -144
  150. package/dist/types-CuiPDcVs.d.ts +0 -144
  151. package/dist/upsertAiModelRecord-C831wOIF.d.ts +0 -35
  152. package/dist/upsertAiModelRecord-CjY-sny0.d.cts +0 -35
  153. /package/dist/{AiModelsCatalogClient-NUF3CBLW.js.map → chunk-56R4XA2S.js.map} +0 -0
@@ -2,8 +2,8 @@ import "../chunk-KHODXGPV.js";
2
2
  import {
3
3
  AliasRegistry,
4
4
  AliasResolver
5
- } from "../chunk-O2A6OVEH.js";
6
- import "../chunk-AJEKEWWB.js";
5
+ } from "../chunk-ANVONYJF.js";
6
+ import "../chunk-2PTCWPHV.js";
7
7
  export {
8
8
  AliasRegistry,
9
9
  AliasResolver
@@ -1,30 +1,39 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-C3H7RTFR.cjs');
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
+ var _chunkXAWBTX3Ncjs = require('../chunk-XAWBTX3N.cjs');
4
5
 
5
6
 
6
7
 
7
- var _chunkHS74X2OJcjs = require('../chunk-HS74X2OJ.cjs');
8
8
 
9
9
 
10
- var _chunkDKHGWHXPcjs = require('../chunk-DKHGWHXP.cjs');
11
- require('../chunk-FGP3QXWL.cjs');
12
- require('../chunk-AV6OE2YQ.cjs');
13
- require('../chunk-F2F4UEFD.cjs');
14
10
 
15
11
 
16
12
 
17
13
 
18
- var _chunkTF4L2NECcjs = require('../chunk-TF4L2NEC.cjs');
19
- require('../chunk-7Q742NI3.cjs');
20
14
 
21
15
 
22
16
 
23
17
 
18
+ var _chunk5XAAMBDOcjs = require('../chunk-5XAAMBDO.cjs');
19
+ require('../chunk-DXZOL3VN.cjs');
20
+ require('../chunk-EDMCKHO6.cjs');
21
+ require('../chunk-PADNCGZB.cjs');
22
+ require('../chunk-GS7T56RP.cjs');
24
23
 
25
24
 
26
25
 
27
26
 
28
27
 
29
- exports.AI_MODELS_CATALOG_ID = _chunkTF4L2NECcjs.AI_MODELS_CATALOG_ID; exports.AI_MODELS_DESCRIPTOR = _chunkTF4L2NECcjs.AI_MODELS_DESCRIPTOR; exports.AI_TOOLS_APP_ID = _chunkTF4L2NECcjs.AI_TOOLS_APP_ID; exports.CatalogSyncJobError = _chunkHS74X2OJcjs.CatalogSyncJobError; exports.ensureAiModelsCatalog = _chunkDKHGWHXPcjs.ensureAiModelsCatalog; exports.pruneStaleCatalogModels = _chunkHS74X2OJcjs.pruneStaleCatalogModels; exports.runAiModelsCatalogSync = _chunkHS74X2OJcjs.runAiModelsCatalogSync; exports.verifyAiModelsCatalog = _chunkHS74X2OJcjs.verifyAiModelsCatalog;
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+ exports.AiModelsCatalogClient = _chunk5XAAMBDOcjs.AiModelsCatalogClient; exports.DEFAULT_CATALOG_CACHE_TTL_MS = _chunk5XAAMBDOcjs.DEFAULT_CATALOG_CACHE_TTL_MS; exports.DEFAULT_DIRECT_CATALOG_URL = _chunk5XAAMBDOcjs.DEFAULT_DIRECT_CATALOG_URL; exports.DEFAULT_OPENROUTER_CATALOG_URL = _chunk5XAAMBDOcjs.DEFAULT_OPENROUTER_CATALOG_URL; exports.canonicalCatalogModelId = _chunk5XAAMBDOcjs.canonicalCatalogModelId; exports.invalidateCatalogLoadCache = _chunk5XAAMBDOcjs.invalidateCatalogLoadCache; exports.loadCatalogSources = _chunk5XAAMBDOcjs.loadCatalogSources; exports.loadCatalogSourcesCached = _chunk5XAAMBDOcjs.loadCatalogSourcesCached; exports.modelsFromX12iCatalogFile = _chunk5XAAMBDOcjs.modelsFromX12iCatalogFile; exports.normalizeX12iCatalogModel = _chunk5XAAMBDOcjs.normalizeX12iCatalogModel; exports.readBundledCatalogFiles = _chunk5XAAMBDOcjs.readBundledCatalogFiles; exports.refreshAiModelsCatalog = _chunkXAWBTX3Ncjs.refreshAiModelsCatalog; exports.resolveCatalogCacheTtlMs = _chunk5XAAMBDOcjs.resolveCatalogCacheTtlMs; exports.verifyAiModelsCatalog = _chunkXAWBTX3Ncjs.verifyAiModelsCatalog;
30
39
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/catalog/index.cjs"],"names":[],"mappings":"AAAA,0GAA8B;AAC9B;AACE;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yjBAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/catalog/index.cjs"}
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/catalog/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,ilCAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/catalog/index.cjs"}
@@ -1,100 +1,13 @@
1
- import { Catalox, CatalogDescriptor, CataloxContext } from '@x12i/catalox';
2
- import { a as AiModelRecord, d as OpenRouterModelsQuery } from '../types-BYXnCvKx.cjs';
3
- import { a as SyncResult, S as SyncOptions } from '../syncAiModelsCatalog-CnXRLm2c.cjs';
4
- import { Firestore } from 'firebase-admin/firestore';
5
- import '../upsertAiModelRecord-CjY-sny0.cjs';
6
-
7
- type EnsureAiModelsCatalogOptions = {
8
- appId?: string;
9
- catalogId?: string;
10
- };
11
- declare function ensureAiModelsCatalog(catalox: Catalox, options?: EnsureAiModelsCatalogOptions): Promise<void>;
12
-
13
- declare const AI_MODELS_CATALOG_ID = "ai-models";
14
- declare const AI_TOOLS_APP_ID = "ai-tools";
15
- declare const AI_MODELS_DESCRIPTOR: CatalogDescriptor;
16
-
17
- type CatalogVerifyOptions = {
18
- catalox: Catalox;
19
- appId?: string;
20
- catalogId?: string;
21
- /** When set, compare against this id set (e.g. from a sync that just ran). */
22
- expectedModelIds?: Set<string>;
23
- /** When set, compare against this list instead of fetching OpenRouter. */
24
- openRouterModels?: AiModelRecord[];
25
- openRouterApiKey?: string;
26
- openRouterQuery?: OpenRouterModelsQuery;
27
- /** Ensure descriptor is registered before reading (default true). */
28
- ensureDescriptor?: boolean;
29
- /** Max model ids to include in report samples (default 20). */
30
- sampleLimit?: number;
31
- };
32
- type CatalogVerifyReport = {
33
- ok: boolean;
34
- openRouterCount: number;
35
- cataloxCount: number;
36
- missingInCatalox: string[];
37
- extraInCatalox: string[];
38
- supportsReasoningMissing: number;
39
- openRouterMirrorMissing: number;
40
- descriptorKeysMatch: boolean;
41
- durationMs: number;
42
- };
43
- /**
44
- * Compare the live OpenRouter catalog with Catalox/Firestore ai-models items.
45
- * Use after sync in CI/cron, or standalone health checks.
46
- */
47
- declare function verifyAiModelsCatalog(options: CatalogVerifyOptions): Promise<CatalogVerifyReport>;
48
-
49
- type CatalogSyncJobOptions = SyncOptions & {
50
- /**
51
- * After upsert, compare Catalox to OpenRouter (default true).
52
- * Set false only when you will verify separately.
53
- */
54
- verifyAfter?: boolean;
55
- /** Fail the job when verification does not pass (default true). */
56
- failOnVerifyError?: boolean;
57
- /** Delete Firestore rows not present in the latest OpenRouter list (default false). */
58
- pruneStale?: boolean;
59
- };
60
- type CatalogSyncJobResult = {
61
- sync: SyncResult;
62
- verify?: CatalogVerifyReport;
63
- prune?: {
64
- scanned: number;
65
- pruned: number;
66
- prunedModelIds: string[];
67
- };
68
- ok: boolean;
69
- };
70
- declare class CatalogSyncJobError extends Error {
71
- readonly sync: SyncResult;
72
- readonly verify?: CatalogVerifyReport | undefined;
73
- constructor(message: string, sync: SyncResult, verify?: CatalogVerifyReport | undefined);
74
- }
75
- /**
76
- * Production entry point: sync OpenRouter → Catalox, optionally prune stale rows, then verify.
77
- * Suitable for cron, Cloud Run jobs, and `ai-tools sync`.
78
- */
79
- declare function runAiModelsCatalogSync(options: CatalogSyncJobOptions): Promise<CatalogSyncJobResult>;
80
-
81
- type PruneStaleCatalogModelsOptions = {
82
- firestore: Firestore;
83
- catalogId: string;
84
- context: CataloxContext;
85
- /** Canonical model ids from the latest OpenRouter fetch. */
86
- activeModelIds: Set<string>;
87
- dryRun?: boolean;
88
- };
89
- type PruneStaleCatalogModelsResult = {
90
- scanned: number;
91
- pruned: number;
92
- prunedModelIds: string[];
93
- };
94
- /**
95
- * Remove catalog documents that are no longer listed on OpenRouter.
96
- * Off by default — enable explicitly when running production sync jobs.
97
- */
98
- declare function pruneStaleCatalogModels(options: PruneStaleCatalogModelsOptions): Promise<PruneStaleCatalogModelsResult>;
99
-
100
- export { AI_MODELS_CATALOG_ID, AI_MODELS_DESCRIPTOR, AI_TOOLS_APP_ID, CatalogSyncJobError, type CatalogSyncJobOptions, type CatalogSyncJobResult, type CatalogVerifyOptions, type CatalogVerifyReport, type EnsureAiModelsCatalogOptions, type PruneStaleCatalogModelsOptions, type PruneStaleCatalogModelsResult, ensureAiModelsCatalog, pruneStaleCatalogModels, runAiModelsCatalogSync, verifyAiModelsCatalog };
1
+ export { A as AiModelsCatalogClient, a as AiModelsCatalogClientOptions, L as LoadCatalogOptions, b as LoadedCatalogs, l as loadCatalogSources, r as readBundledCatalogFiles } from '../AiModelsCatalogClient-B5FMI9gj.cjs';
2
+ import { a as AiModelRecord } from '../types-BrzJWsTU.cjs';
3
+ import { X as X12iCatalogModelEntry, b as CatalogSourceKind } from '../modelCache-CJftI-Ko.cjs';
4
+ export { C as CatalogRefreshOptions, a as CatalogRefreshResult, c as CatalogVerifyOptions, d as CatalogVerifyReport, D as DEFAULT_CATALOG_CACHE_TTL_MS, e as DEFAULT_DIRECT_CATALOG_URL, f as DEFAULT_OPENROUTER_CATALOG_URL, L as LoadCatalogCachedOptions, g as X12iModelsCatalogFile, i as invalidateCatalogLoadCache, l as loadCatalogSourcesCached, r as refreshAiModelsCatalog, h as resolveCatalogCacheTtlMs, v as verifyAiModelsCatalog } from '../modelCache-CJftI-Ko.cjs';
5
+
6
+ declare function canonicalCatalogModelId(provider: string, modelId: string): string;
7
+ declare function normalizeX12iCatalogModel(entry: X12iCatalogModelEntry, kind: CatalogSourceKind, verifiedAt: string): AiModelRecord | null;
8
+ declare function modelsFromX12iCatalogFile(file: {
9
+ models: X12iCatalogModelEntry[];
10
+ verifiedAt?: string;
11
+ }, kind: CatalogSourceKind): Map<string, AiModelRecord>;
12
+
13
+ export { CatalogSourceKind, X12iCatalogModelEntry, canonicalCatalogModelId, modelsFromX12iCatalogFile, normalizeX12iCatalogModel };
@@ -1,100 +1,13 @@
1
- import { Catalox, CatalogDescriptor, CataloxContext } from '@x12i/catalox';
2
- import { a as AiModelRecord, d as OpenRouterModelsQuery } from '../types-BYXnCvKx.js';
3
- import { a as SyncResult, S as SyncOptions } from '../syncAiModelsCatalog-DpkN_w7S.js';
4
- import { Firestore } from 'firebase-admin/firestore';
5
- import '../upsertAiModelRecord-C831wOIF.js';
6
-
7
- type EnsureAiModelsCatalogOptions = {
8
- appId?: string;
9
- catalogId?: string;
10
- };
11
- declare function ensureAiModelsCatalog(catalox: Catalox, options?: EnsureAiModelsCatalogOptions): Promise<void>;
12
-
13
- declare const AI_MODELS_CATALOG_ID = "ai-models";
14
- declare const AI_TOOLS_APP_ID = "ai-tools";
15
- declare const AI_MODELS_DESCRIPTOR: CatalogDescriptor;
16
-
17
- type CatalogVerifyOptions = {
18
- catalox: Catalox;
19
- appId?: string;
20
- catalogId?: string;
21
- /** When set, compare against this id set (e.g. from a sync that just ran). */
22
- expectedModelIds?: Set<string>;
23
- /** When set, compare against this list instead of fetching OpenRouter. */
24
- openRouterModels?: AiModelRecord[];
25
- openRouterApiKey?: string;
26
- openRouterQuery?: OpenRouterModelsQuery;
27
- /** Ensure descriptor is registered before reading (default true). */
28
- ensureDescriptor?: boolean;
29
- /** Max model ids to include in report samples (default 20). */
30
- sampleLimit?: number;
31
- };
32
- type CatalogVerifyReport = {
33
- ok: boolean;
34
- openRouterCount: number;
35
- cataloxCount: number;
36
- missingInCatalox: string[];
37
- extraInCatalox: string[];
38
- supportsReasoningMissing: number;
39
- openRouterMirrorMissing: number;
40
- descriptorKeysMatch: boolean;
41
- durationMs: number;
42
- };
43
- /**
44
- * Compare the live OpenRouter catalog with Catalox/Firestore ai-models items.
45
- * Use after sync in CI/cron, or standalone health checks.
46
- */
47
- declare function verifyAiModelsCatalog(options: CatalogVerifyOptions): Promise<CatalogVerifyReport>;
48
-
49
- type CatalogSyncJobOptions = SyncOptions & {
50
- /**
51
- * After upsert, compare Catalox to OpenRouter (default true).
52
- * Set false only when you will verify separately.
53
- */
54
- verifyAfter?: boolean;
55
- /** Fail the job when verification does not pass (default true). */
56
- failOnVerifyError?: boolean;
57
- /** Delete Firestore rows not present in the latest OpenRouter list (default false). */
58
- pruneStale?: boolean;
59
- };
60
- type CatalogSyncJobResult = {
61
- sync: SyncResult;
62
- verify?: CatalogVerifyReport;
63
- prune?: {
64
- scanned: number;
65
- pruned: number;
66
- prunedModelIds: string[];
67
- };
68
- ok: boolean;
69
- };
70
- declare class CatalogSyncJobError extends Error {
71
- readonly sync: SyncResult;
72
- readonly verify?: CatalogVerifyReport | undefined;
73
- constructor(message: string, sync: SyncResult, verify?: CatalogVerifyReport | undefined);
74
- }
75
- /**
76
- * Production entry point: sync OpenRouter → Catalox, optionally prune stale rows, then verify.
77
- * Suitable for cron, Cloud Run jobs, and `ai-tools sync`.
78
- */
79
- declare function runAiModelsCatalogSync(options: CatalogSyncJobOptions): Promise<CatalogSyncJobResult>;
80
-
81
- type PruneStaleCatalogModelsOptions = {
82
- firestore: Firestore;
83
- catalogId: string;
84
- context: CataloxContext;
85
- /** Canonical model ids from the latest OpenRouter fetch. */
86
- activeModelIds: Set<string>;
87
- dryRun?: boolean;
88
- };
89
- type PruneStaleCatalogModelsResult = {
90
- scanned: number;
91
- pruned: number;
92
- prunedModelIds: string[];
93
- };
94
- /**
95
- * Remove catalog documents that are no longer listed on OpenRouter.
96
- * Off by default — enable explicitly when running production sync jobs.
97
- */
98
- declare function pruneStaleCatalogModels(options: PruneStaleCatalogModelsOptions): Promise<PruneStaleCatalogModelsResult>;
99
-
100
- export { AI_MODELS_CATALOG_ID, AI_MODELS_DESCRIPTOR, AI_TOOLS_APP_ID, CatalogSyncJobError, type CatalogSyncJobOptions, type CatalogSyncJobResult, type CatalogVerifyOptions, type CatalogVerifyReport, type EnsureAiModelsCatalogOptions, type PruneStaleCatalogModelsOptions, type PruneStaleCatalogModelsResult, ensureAiModelsCatalog, pruneStaleCatalogModels, runAiModelsCatalogSync, verifyAiModelsCatalog };
1
+ export { A as AiModelsCatalogClient, a as AiModelsCatalogClientOptions, L as LoadCatalogOptions, b as LoadedCatalogs, l as loadCatalogSources, r as readBundledCatalogFiles } from '../AiModelsCatalogClient-CPPNI6Ry.js';
2
+ import { a as AiModelRecord } from '../types-BrzJWsTU.js';
3
+ import { X as X12iCatalogModelEntry, b as CatalogSourceKind } from '../modelCache-BzRn6t_C.js';
4
+ export { C as CatalogRefreshOptions, a as CatalogRefreshResult, c as CatalogVerifyOptions, d as CatalogVerifyReport, D as DEFAULT_CATALOG_CACHE_TTL_MS, e as DEFAULT_DIRECT_CATALOG_URL, f as DEFAULT_OPENROUTER_CATALOG_URL, L as LoadCatalogCachedOptions, g as X12iModelsCatalogFile, i as invalidateCatalogLoadCache, l as loadCatalogSourcesCached, r as refreshAiModelsCatalog, h as resolveCatalogCacheTtlMs, v as verifyAiModelsCatalog } from '../modelCache-BzRn6t_C.js';
5
+
6
+ declare function canonicalCatalogModelId(provider: string, modelId: string): string;
7
+ declare function normalizeX12iCatalogModel(entry: X12iCatalogModelEntry, kind: CatalogSourceKind, verifiedAt: string): AiModelRecord | null;
8
+ declare function modelsFromX12iCatalogFile(file: {
9
+ models: X12iCatalogModelEntry[];
10
+ verifiedAt?: string;
11
+ }, kind: CatalogSourceKind): Map<string, AiModelRecord>;
12
+
13
+ export { CatalogSourceKind, X12iCatalogModelEntry, canonicalCatalogModelId, modelsFromX12iCatalogFile, normalizeX12iCatalogModel };
@@ -1,30 +1,38 @@
1
- import "../chunk-M5TMA73F.js";
2
1
  import {
3
- CatalogSyncJobError,
4
- pruneStaleCatalogModels,
5
- runAiModelsCatalogSync,
2
+ refreshAiModelsCatalog,
6
3
  verifyAiModelsCatalog
7
- } from "../chunk-MX3AMQFC.js";
4
+ } from "../chunk-AB5GNXJ4.js";
8
5
  import {
9
- ensureAiModelsCatalog
10
- } from "../chunk-VRFVF5RH.js";
11
- import "../chunk-HYGXZY25.js";
12
- import "../chunk-6QGDZTGH.js";
13
- import "../chunk-KQOALKKX.js";
14
- import {
15
- AI_MODELS_CATALOG_ID,
16
- AI_MODELS_DESCRIPTOR,
17
- AI_TOOLS_APP_ID
18
- } from "../chunk-DJ5SWJDY.js";
19
- import "../chunk-AJEKEWWB.js";
6
+ AiModelsCatalogClient,
7
+ DEFAULT_CATALOG_CACHE_TTL_MS,
8
+ DEFAULT_DIRECT_CATALOG_URL,
9
+ DEFAULT_OPENROUTER_CATALOG_URL,
10
+ canonicalCatalogModelId,
11
+ invalidateCatalogLoadCache,
12
+ loadCatalogSources,
13
+ loadCatalogSourcesCached,
14
+ modelsFromX12iCatalogFile,
15
+ normalizeX12iCatalogModel,
16
+ readBundledCatalogFiles,
17
+ resolveCatalogCacheTtlMs
18
+ } from "../chunk-OPN6BGNH.js";
19
+ import "../chunk-EYHMQVAL.js";
20
+ import "../chunk-B3V2EHRY.js";
21
+ import "../chunk-2PTCWPHV.js";
20
22
  export {
21
- AI_MODELS_CATALOG_ID,
22
- AI_MODELS_DESCRIPTOR,
23
- AI_TOOLS_APP_ID,
24
- CatalogSyncJobError,
25
- ensureAiModelsCatalog,
26
- pruneStaleCatalogModels,
27
- runAiModelsCatalogSync,
23
+ AiModelsCatalogClient,
24
+ DEFAULT_CATALOG_CACHE_TTL_MS,
25
+ DEFAULT_DIRECT_CATALOG_URL,
26
+ DEFAULT_OPENROUTER_CATALOG_URL,
27
+ canonicalCatalogModelId,
28
+ invalidateCatalogLoadCache,
29
+ loadCatalogSources,
30
+ loadCatalogSourcesCached,
31
+ modelsFromX12iCatalogFile,
32
+ normalizeX12iCatalogModel,
33
+ readBundledCatalogFiles,
34
+ refreshAiModelsCatalog,
35
+ resolveCatalogCacheTtlMs,
28
36
  verifyAiModelsCatalog
29
37
  };
30
38
  //# sourceMappingURL=index.js.map
@@ -13,7 +13,7 @@ var ModelNotFoundError = class extends AiToolsError {
13
13
  constructor(modelId) {
14
14
  super(
15
15
  "MODEL_NOT_FOUND",
16
- `Model not found: "${modelId}". Run "ai-tools sync" to populate the catalog.`
16
+ `Model not found: "${modelId}". Run "npx ai-tools catalog refresh" or verify the model id against the catalog.`
17
17
  );
18
18
  this.name = "ModelNotFoundError";
19
19
  }
@@ -90,6 +90,19 @@ var CostCalculationError = class extends AiToolsError {
90
90
  this.name = "CostCalculationError";
91
91
  }
92
92
  };
93
+ var UnknownModelCostError = class extends AiToolsError {
94
+ constructor(model, provider) {
95
+ super(
96
+ "COST_UNKNOWN_MODEL",
97
+ `Cannot price unknown model "${model}" (provider: "${provider}"). Refresh catalogs with "npx ai-tools catalog refresh", use a known ai-profile name, or set throwOnUnknownModel: false.`
98
+ );
99
+ this.model = model;
100
+ this.provider = provider;
101
+ this.name = "UnknownModelCostError";
102
+ }
103
+ model;
104
+ provider;
105
+ };
93
106
 
94
107
  export {
95
108
  AiToolsError,
@@ -101,6 +114,7 @@ export {
101
114
  AliasFileParseError,
102
115
  AliasFileWriteError,
103
116
  SyncError,
104
- CostCalculationError
117
+ CostCalculationError,
118
+ UnknownModelCostError
105
119
  };
106
- //# sourceMappingURL=chunk-AJEKEWWB.js.map
120
+ //# sourceMappingURL=chunk-2PTCWPHV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts"],"sourcesContent":["import type {\n ModelResolutionInput,\n ModelResolutionNotFound,\n} from \"./sync/modelNameResolver/types.js\";\n\nexport type AiToolsErrorCode =\n | \"MODEL_NOT_FOUND\"\n | \"SYNC_FETCH_FAILED\"\n | \"SYNC_UPSERT_FAILED\"\n | \"COST_CALCULATION_FAILED\"\n | \"COST_UNKNOWN_MODEL\"\n | \"INVALID_USAGE_INPUT\"\n | \"OPENROUTER_AUTH_FAILED\"\n | \"OPENROUTER_MODELS_FETCH_FAILED\"\n | \"CACHE_READ_ERROR\"\n | \"ALIAS_NOT_FOUND\"\n | \"ALIAS_INVALID_NAME\"\n | \"ALIAS_CONFLICT\"\n | \"ALIAS_FILE_PARSE_ERROR\"\n | \"ALIAS_FILE_WRITE_ERROR\";\n\nexport class AiToolsError extends Error {\n constructor(\n public readonly code: AiToolsErrorCode,\n message: string,\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"AiToolsError\";\n }\n}\n\nexport class ModelNotFoundError extends AiToolsError {\n constructor(modelId: string) {\n super(\n \"MODEL_NOT_FOUND\",\n `Model not found: \"${modelId}\". Run \"npx ai-tools catalog refresh\" or verify the model id against the catalog.`,\n );\n this.name = \"ModelNotFoundError\";\n }\n}\n\nexport class ModelResolutionError extends AiToolsError {\n constructor(\n public readonly input: ModelResolutionInput,\n public readonly result: ModelResolutionNotFound,\n ) {\n super(\n \"MODEL_NOT_FOUND\",\n `Could not resolve model \"${input.model}\" (provider: \"${input.provider ?? \"unspecified\"}\"). ` +\n result.reason +\n (result.bestRejectedCandidate\n ? ` Best candidate was \"${result.bestRejectedCandidate.modelId}\" (confidence ${result.bestRejectedCandidate.confidence.toFixed(2)}).`\n : \"\"),\n );\n this.name = \"ModelResolutionError\";\n }\n}\n\nexport class AliasNotFoundError extends AiToolsError {\n constructor(aliasName: string) {\n super(\n \"ALIAS_NOT_FOUND\",\n `Alias not found: \"${aliasName}\". Run \"ai-tools alias list\" to see defined aliases.`,\n );\n this.name = \"AliasNotFoundError\";\n }\n}\n\nexport class AliasInvalidNameError extends AiToolsError {\n constructor(aliasName: string) {\n super(\n \"ALIAS_INVALID_NAME\",\n `Invalid alias name: \"${aliasName}\". Names must match /^[a-z0-9][a-z0-9-]*$/`,\n );\n this.name = \"AliasInvalidNameError\";\n }\n}\n\nexport class AliasConflictError extends AiToolsError {\n constructor(aliasName: string) {\n super(\n \"ALIAS_CONFLICT\",\n `Alias \"${aliasName}\" already exists. Use --force to overwrite.`,\n );\n this.name = \"AliasConflictError\";\n }\n}\n\nexport class AliasFileParseError extends AiToolsError {\n constructor(path: string, cause?: unknown) {\n super(\n \"ALIAS_FILE_PARSE_ERROR\",\n `Failed to parse aliases file at \"${path}\". Check JSON syntax.`,\n cause,\n );\n this.name = \"AliasFileParseError\";\n }\n}\n\nexport class AliasFileWriteError extends AiToolsError {\n constructor(path: string, cause?: unknown) {\n super(\n \"ALIAS_FILE_WRITE_ERROR\",\n `Failed to write aliases file at \"${path}\".`,\n cause,\n );\n this.name = \"AliasFileWriteError\";\n }\n}\n\nexport class SyncError extends AiToolsError {\n constructor(code: Extract<AiToolsErrorCode, \"SYNC_FETCH_FAILED\" | \"SYNC_UPSERT_FAILED\" | \"OPENROUTER_AUTH_FAILED\" | \"OPENROUTER_MODELS_FETCH_FAILED\">, message: string, cause?: unknown) {\n super(code, message, cause);\n this.name = \"SyncError\";\n }\n}\n\nexport class CostCalculationError extends AiToolsError {\n constructor(message: string, cause?: unknown) {\n super(\"COST_CALCULATION_FAILED\", message, cause);\n this.name = \"CostCalculationError\";\n }\n}\n\nexport class UnknownModelCostError extends AiToolsError {\n constructor(\n public readonly model: string,\n public readonly provider: string,\n ) {\n super(\n \"COST_UNKNOWN_MODEL\",\n `Cannot price unknown model \"${model}\" (provider: \"${provider}\"). ` +\n 'Refresh catalogs with \"npx ai-tools catalog refresh\", use a known ai-profile name, or set throwOnUnknownModel: false.',\n );\n this.name = \"UnknownModelCostError\";\n }\n}\n"],"mappings":";AAqBO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACkB,MAChB,SACgB,OAChB;AACA,UAAM,OAAO;AAJG;AAEA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EANkB;AAAA,EAEA;AAKpB;AAEO,IAAM,qBAAN,cAAiC,aAAa;AAAA,EACnD,YAAY,SAAiB;AAC3B;AAAA,MACE;AAAA,MACA,qBAAqB,OAAO;AAAA,IAC9B;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,uBAAN,cAAmC,aAAa;AAAA,EACrD,YACkB,OACA,QAChB;AACA;AAAA,MACE;AAAA,MACA,4BAA4B,MAAM,KAAK,iBAAiB,MAAM,YAAY,aAAa,SACrF,OAAO,UACN,OAAO,wBACJ,wBAAwB,OAAO,sBAAsB,OAAO,iBAAiB,OAAO,sBAAsB,WAAW,QAAQ,CAAC,CAAC,OAC/H;AAAA,IACR;AAVgB;AACA;AAUhB,SAAK,OAAO;AAAA,EACd;AAAA,EAZkB;AAAA,EACA;AAYpB;AAEO,IAAM,qBAAN,cAAiC,aAAa;AAAA,EACnD,YAAY,WAAmB;AAC7B;AAAA,MACE;AAAA,MACA,qBAAqB,SAAS;AAAA,IAChC;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,wBAAN,cAAoC,aAAa;AAAA,EACtD,YAAY,WAAmB;AAC7B;AAAA,MACE;AAAA,MACA,wBAAwB,SAAS;AAAA,IACnC;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,aAAa;AAAA,EACnD,YAAY,WAAmB;AAC7B;AAAA,MACE;AAAA,MACA,UAAU,SAAS;AAAA,IACrB;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,aAAa;AAAA,EACpD,YAAY,MAAc,OAAiB;AACzC;AAAA,MACE;AAAA,MACA,oCAAoC,IAAI;AAAA,MACxC;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,aAAa;AAAA,EACpD,YAAY,MAAc,OAAiB;AACzC;AAAA,MACE;AAAA,MACA,oCAAoC,IAAI;AAAA,MACxC;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,YAAN,cAAwB,aAAa;AAAA,EAC1C,YAAY,MAA2I,SAAiB,OAAiB;AACvL,UAAM,MAAM,SAAS,KAAK;AAC1B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,uBAAN,cAAmC,aAAa;AAAA,EACrD,YAAY,SAAiB,OAAiB;AAC5C,UAAM,2BAA2B,SAAS,KAAK;AAC/C,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,wBAAN,cAAoC,aAAa;AAAA,EACtD,YACkB,OACA,UAChB;AACA;AAAA,MACE;AAAA,MACA,+BAA+B,KAAK,iBAAiB,QAAQ;AAAA,IAE/D;AAPgB;AACA;AAOhB,SAAK,OAAO;AAAA,EACd;AAAA,EATkB;AAAA,EACA;AASpB;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-56R4XA2S.js.map
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-5GUKLOEK.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-5GUKLOEK.cjs"],"names":[],"mappings":"AAAA","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-5GUKLOEK.cjs"}