@trazum/core 1.8.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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +163 -0
  3. package/dist/advisories.d.ts +23 -0
  4. package/dist/advisories.d.ts.map +1 -0
  5. package/dist/advisories.js +376 -0
  6. package/dist/advisories.js.map +1 -0
  7. package/dist/aws-sigv4.d.ts +88 -0
  8. package/dist/aws-sigv4.d.ts.map +1 -0
  9. package/dist/aws-sigv4.js +117 -0
  10. package/dist/aws-sigv4.js.map +1 -0
  11. package/dist/baseline.d.ts +171 -0
  12. package/dist/baseline.d.ts.map +1 -0
  13. package/dist/baseline.js +273 -0
  14. package/dist/baseline.js.map +1 -0
  15. package/dist/cache.d.ts +26 -0
  16. package/dist/cache.d.ts.map +1 -0
  17. package/dist/cache.js +28 -0
  18. package/dist/cache.js.map +1 -0
  19. package/dist/changes.d.ts +29 -0
  20. package/dist/changes.d.ts.map +1 -0
  21. package/dist/changes.js +142 -0
  22. package/dist/changes.js.map +1 -0
  23. package/dist/compare.d.ts +65 -0
  24. package/dist/compare.d.ts.map +1 -0
  25. package/dist/compare.js +58 -0
  26. package/dist/compare.js.map +1 -0
  27. package/dist/config-schema.d.ts +118 -0
  28. package/dist/config-schema.d.ts.map +1 -0
  29. package/dist/config-schema.js +315 -0
  30. package/dist/config-schema.js.map +1 -0
  31. package/dist/config.d.ts +47 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +112 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/detect.d.ts +70 -0
  36. package/dist/detect.d.ts.map +1 -0
  37. package/dist/detect.js +228 -0
  38. package/dist/detect.js.map +1 -0
  39. package/dist/evaluate.d.ts +98 -0
  40. package/dist/evaluate.d.ts.map +1 -0
  41. package/dist/evaluate.js +110 -0
  42. package/dist/evaluate.js.map +1 -0
  43. package/dist/extract.d.ts +81 -0
  44. package/dist/extract.d.ts.map +1 -0
  45. package/dist/extract.js +280 -0
  46. package/dist/extract.js.map +1 -0
  47. package/dist/gcp-auth.d.ts +58 -0
  48. package/dist/gcp-auth.d.ts.map +1 -0
  49. package/dist/gcp-auth.js +113 -0
  50. package/dist/gcp-auth.js.map +1 -0
  51. package/dist/glob.d.ts +49 -0
  52. package/dist/glob.d.ts.map +1 -0
  53. package/dist/glob.js +154 -0
  54. package/dist/glob.js.map +1 -0
  55. package/dist/host.d.ts +30 -0
  56. package/dist/host.d.ts.map +1 -0
  57. package/dist/host.js +69 -0
  58. package/dist/host.js.map +1 -0
  59. package/dist/i18n/en.d.ts +4 -0
  60. package/dist/i18n/en.d.ts.map +1 -0
  61. package/dist/i18n/en.js +168 -0
  62. package/dist/i18n/en.js.map +1 -0
  63. package/dist/i18n/es.d.ts +4 -0
  64. package/dist/i18n/es.d.ts.map +1 -0
  65. package/dist/i18n/es.js +168 -0
  66. package/dist/i18n/es.js.map +1 -0
  67. package/dist/i18n/index.d.ts +36 -0
  68. package/dist/i18n/index.d.ts.map +1 -0
  69. package/dist/i18n/index.js +50 -0
  70. package/dist/i18n/index.js.map +1 -0
  71. package/dist/i18n/types.d.ts +180 -0
  72. package/dist/i18n/types.d.ts.map +1 -0
  73. package/dist/i18n/types.js +11 -0
  74. package/dist/i18n/types.js.map +1 -0
  75. package/dist/index.d.ts +66 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +69 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/llm.d.ts +226 -0
  80. package/dist/llm.d.ts.map +1 -0
  81. package/dist/llm.js +485 -0
  82. package/dist/llm.js.map +1 -0
  83. package/dist/nearest.d.ts +20 -0
  84. package/dist/nearest.d.ts.map +1 -0
  85. package/dist/nearest.js +54 -0
  86. package/dist/nearest.js.map +1 -0
  87. package/dist/net.d.ts +90 -0
  88. package/dist/net.d.ts.map +1 -0
  89. package/dist/net.js +203 -0
  90. package/dist/net.js.map +1 -0
  91. package/dist/node.d.ts +32 -0
  92. package/dist/node.d.ts.map +1 -0
  93. package/dist/node.js +33 -0
  94. package/dist/node.js.map +1 -0
  95. package/dist/openrouter.d.ts +25 -0
  96. package/dist/openrouter.d.ts.map +1 -0
  97. package/dist/openrouter.js +72 -0
  98. package/dist/openrouter.js.map +1 -0
  99. package/dist/optimize.d.ts +38 -0
  100. package/dist/optimize.d.ts.map +1 -0
  101. package/dist/optimize.js +183 -0
  102. package/dist/optimize.js.map +1 -0
  103. package/dist/otlp.d.ts +91 -0
  104. package/dist/otlp.d.ts.map +1 -0
  105. package/dist/otlp.js +102 -0
  106. package/dist/otlp.js.map +1 -0
  107. package/dist/phrases.d.ts +169 -0
  108. package/dist/phrases.d.ts.map +1 -0
  109. package/dist/phrases.js +939 -0
  110. package/dist/phrases.js.map +1 -0
  111. package/dist/pricing-overlay.d.ts +55 -0
  112. package/dist/pricing-overlay.d.ts.map +1 -0
  113. package/dist/pricing-overlay.js +241 -0
  114. package/dist/pricing-overlay.js.map +1 -0
  115. package/dist/pricing.d.ts +115 -0
  116. package/dist/pricing.d.ts.map +1 -0
  117. package/dist/pricing.js +400 -0
  118. package/dist/pricing.js.map +1 -0
  119. package/dist/profile.d.ts +71 -0
  120. package/dist/profile.d.ts.map +1 -0
  121. package/dist/profile.js +55 -0
  122. package/dist/profile.js.map +1 -0
  123. package/dist/promptfoo.d.ts +58 -0
  124. package/dist/promptfoo.d.ts.map +1 -0
  125. package/dist/promptfoo.js +149 -0
  126. package/dist/promptfoo.js.map +1 -0
  127. package/dist/prune.d.ts +91 -0
  128. package/dist/prune.d.ts.map +1 -0
  129. package/dist/prune.js +110 -0
  130. package/dist/prune.js.map +1 -0
  131. package/dist/reorder.d.ts +82 -0
  132. package/dist/reorder.d.ts.map +1 -0
  133. package/dist/reorder.js +215 -0
  134. package/dist/reorder.js.map +1 -0
  135. package/dist/review.d.ts +54 -0
  136. package/dist/review.d.ts.map +1 -0
  137. package/dist/review.js +131 -0
  138. package/dist/review.js.map +1 -0
  139. package/dist/rules.d.ts +5 -0
  140. package/dist/rules.d.ts.map +1 -0
  141. package/dist/rules.js +279 -0
  142. package/dist/rules.js.map +1 -0
  143. package/dist/savings.d.ts +36 -0
  144. package/dist/savings.d.ts.map +1 -0
  145. package/dist/savings.js +83 -0
  146. package/dist/savings.js.map +1 -0
  147. package/dist/segment.d.ts +8 -0
  148. package/dist/segment.d.ts.map +1 -0
  149. package/dist/segment.js +74 -0
  150. package/dist/segment.js.map +1 -0
  151. package/dist/shared-prefix.d.ts +63 -0
  152. package/dist/shared-prefix.d.ts.map +1 -0
  153. package/dist/shared-prefix.js +151 -0
  154. package/dist/shared-prefix.js.map +1 -0
  155. package/dist/similarity.d.ts +13 -0
  156. package/dist/similarity.d.ts.map +1 -0
  157. package/dist/similarity.js +30 -0
  158. package/dist/similarity.js.map +1 -0
  159. package/dist/structure.d.ts +144 -0
  160. package/dist/structure.d.ts.map +1 -0
  161. package/dist/structure.js +455 -0
  162. package/dist/structure.js.map +1 -0
  163. package/dist/suggest.d.ts +100 -0
  164. package/dist/suggest.d.ts.map +1 -0
  165. package/dist/suggest.js +151 -0
  166. package/dist/suggest.js.map +1 -0
  167. package/dist/tokenizer.d.ts +57 -0
  168. package/dist/tokenizer.d.ts.map +1 -0
  169. package/dist/tokenizer.js +157 -0
  170. package/dist/tokenizer.js.map +1 -0
  171. package/dist/types.d.ts +296 -0
  172. package/dist/types.d.ts.map +1 -0
  173. package/dist/types.js +3 -0
  174. package/dist/types.js.map +1 -0
  175. package/dist/walk.d.ts +40 -0
  176. package/dist/walk.d.ts.map +1 -0
  177. package/dist/walk.js +95 -0
  178. package/dist/walk.js.map +1 -0
  179. package/package.json +56 -0
  180. package/src/advisories.ts +431 -0
  181. package/src/aws-sigv4.ts +174 -0
  182. package/src/baseline.ts +390 -0
  183. package/src/cache.ts +54 -0
  184. package/src/changes.ts +158 -0
  185. package/src/compare.ts +131 -0
  186. package/src/config-schema.ts +451 -0
  187. package/src/config.ts +161 -0
  188. package/src/detect.ts +312 -0
  189. package/src/evaluate.ts +188 -0
  190. package/src/extract.ts +336 -0
  191. package/src/gcp-auth.ts +166 -0
  192. package/src/glob.ts +160 -0
  193. package/src/host.ts +90 -0
  194. package/src/i18n/en.ts +236 -0
  195. package/src/i18n/es.ts +236 -0
  196. package/src/i18n/index.ts +68 -0
  197. package/src/i18n/types.ts +230 -0
  198. package/src/index.ts +228 -0
  199. package/src/llm.ts +708 -0
  200. package/src/nearest.ts +61 -0
  201. package/src/net.ts +233 -0
  202. package/src/node.ts +63 -0
  203. package/src/openrouter.ts +125 -0
  204. package/src/optimize.ts +228 -0
  205. package/src/otlp.ts +179 -0
  206. package/src/phrases.ts +1047 -0
  207. package/src/pricing-overlay.ts +319 -0
  208. package/src/pricing.ts +468 -0
  209. package/src/profile.ts +124 -0
  210. package/src/promptfoo.ts +213 -0
  211. package/src/prune.ts +211 -0
  212. package/src/reorder.ts +307 -0
  213. package/src/review.ts +180 -0
  214. package/src/rules.ts +324 -0
  215. package/src/savings.ts +121 -0
  216. package/src/segment.ts +106 -0
  217. package/src/shared-prefix.ts +198 -0
  218. package/src/similarity.ts +28 -0
  219. package/src/structure.ts +652 -0
  220. package/src/suggest.ts +254 -0
  221. package/src/tokenizer.ts +190 -0
  222. package/src/types.ts +323 -0
  223. package/src/walk.ts +117 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phrases.js","sourceRoot":"","sources":["../src/phrases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { PricingCatalogue } from './pricing.js';
2
+ import type { ModelPricing } from './types.js';
3
+ /**
4
+ * Local price corrections, so a price change does not require a library upgrade.
5
+ *
6
+ * This is the honest answer to "pricing data separated from the release cycle".
7
+ * A separate `@trazum/pricing` package would not have achieved it — you would
8
+ * still need to install something to get current numbers. A JSON file in your own
9
+ * repository does, and it keeps the two properties that matter: **the core still
10
+ * makes no network call**, and it still has no dependencies.
11
+ *
12
+ * The bundled catalogue remains the default, so Trazum is correct out of the box
13
+ * and an overlay is only needed once a published price moves.
14
+ *
15
+ * Validation is as strict as the config parser's, for the same reason: a typo'd
16
+ * model id in an overlay would silently price against the bundled number, and a
17
+ * budget decision made on a price nobody applied is the failure this whole file
18
+ * exists to prevent.
19
+ */
20
+ export declare const PRICING_OVERLAY_KEYS: readonly ['lastReviewed', 'models'];
21
+ export declare const PRICING_MODEL_KEYS: readonly ['displayName', 'inputPerMTok', 'outputPerMTok', 'contextWindow', 'cacheMinTokens', 'tier', 'capability', 'caching', 'notes', 'promo'];
22
+ /** Largest overlay this will read — a price list, not a dataset. */
23
+ export declare const MAX_PRICING_BYTES: number;
24
+ export interface PricingOverlay {
25
+ /**
26
+ * When these prices were checked, as `YYYY-MM-DD`. Required: an overlay whose
27
+ * age is unknown is worse than the bundled catalogue, whose age is printed on
28
+ * every report.
29
+ */
30
+ lastReviewed: string;
31
+ /** Per-model corrections, keyed by model id. */
32
+ models: Record<string, Partial<Omit<ModelPricing, 'id'>>>;
33
+ }
34
+ export declare class PricingOverlayError extends Error {
35
+ readonly source: string;
36
+ constructor(message: string, source: string);
37
+ }
38
+ /** Validates an overlay document. Every failure throws, with the source named. */
39
+ export declare function parsePricingOverlay(raw: string, source?: string): PricingOverlay;
40
+ /**
41
+ * A new catalogue with the overlay applied. Neither argument is modified.
42
+ *
43
+ * **A model the bundled catalogue does not have must be complete.** Overriding
44
+ * one field of a known model is the common case and needs no more than that
45
+ * field; inventing a model needs every field, because a half-defined model would
46
+ * price at zero somewhere and report a saving that does not exist.
47
+ *
48
+ * `lastReviewed` becomes the *overlay's* date, and the report shows it — a
49
+ * catalogue is only as current as its most recently touched half, and claiming
50
+ * the bundled date over corrected prices would be a lie about provenance.
51
+ */
52
+ export declare function applyPricingOverlay(base: PricingCatalogue, overlay: PricingOverlay, source?: string): PricingCatalogue;
53
+ /** Convenience: the bundled catalogue with an overlay document applied. */
54
+ export declare function catalogueFromOverlay(raw: string, source?: string): PricingCatalogue;
55
+ //# sourceMappingURL=pricing-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing-overlay.d.ts","sourceRoot":"","sources":["../src/pricing-overlay.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;AAExE;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,oBAAoB,YAAI,cAAc,EAAE,QAAQ,CAAU,CAAC;AAExE,eAAO,MAAM,kBAAkB,YAC7B,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,CACC,CAAC;AAQX,oEAAoE;AACpE,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CAC3D;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAG1C,QAAQ,CAAC,MAAM,EAAE,MAAM;IAFzB,YACE,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EAIxB;CACF;AAqJD,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAoB,GAAG,cAAc,CAkC3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,cAAc,EACvB,MAAM,SAAoB,GACzB,gBAAgB,CA6ClB;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAoB,GAAG,gBAAgB,CAE9F"}
@@ -0,0 +1,241 @@
1
+ import { BUNDLED_CATALOGUE } from './pricing.js';
2
+ import { nearestName } from './nearest.js';
3
+ /**
4
+ * Local price corrections, so a price change does not require a library upgrade.
5
+ *
6
+ * This is the honest answer to "pricing data separated from the release cycle".
7
+ * A separate `@trazum/pricing` package would not have achieved it — you would
8
+ * still need to install something to get current numbers. A JSON file in your own
9
+ * repository does, and it keeps the two properties that matter: **the core still
10
+ * makes no network call**, and it still has no dependencies.
11
+ *
12
+ * The bundled catalogue remains the default, so Trazum is correct out of the box
13
+ * and an overlay is only needed once a published price moves.
14
+ *
15
+ * Validation is as strict as the config parser's, for the same reason: a typo'd
16
+ * model id in an overlay would silently price against the bundled number, and a
17
+ * budget decision made on a price nobody applied is the failure this whole file
18
+ * exists to prevent.
19
+ */
20
+ export const PRICING_OVERLAY_KEYS = ['lastReviewed', 'models'];
21
+ export const PRICING_MODEL_KEYS = [
22
+ 'displayName',
23
+ 'inputPerMTok',
24
+ 'outputPerMTok',
25
+ 'contextWindow',
26
+ 'cacheMinTokens',
27
+ 'tier',
28
+ 'capability',
29
+ 'caching',
30
+ 'notes',
31
+ 'promo',
32
+ ];
33
+ const PROMO_KEYS = ['inputPerMTok', 'outputPerMTok', 'until'];
34
+ const TIERS = ['frontier', 'opus', 'sonnet', 'haiku', 'unknown'];
35
+ const CAPABILITIES = ['small', 'mid', 'large', 'frontier', 'unknown'];
36
+ const CACHING_MODES = ['explicit', 'automatic', 'none', 'unknown'];
37
+ /** Largest overlay this will read — a price list, not a dataset. */
38
+ export const MAX_PRICING_BYTES = 64 * 1024;
39
+ export class PricingOverlayError extends Error {
40
+ source;
41
+ constructor(message, source) {
42
+ super(`${source}: ${message}`);
43
+ this.source = source;
44
+ this.name = 'PricingOverlayError';
45
+ }
46
+ }
47
+ const isPlainObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
48
+ const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/;
49
+ function rejectUnknownKeys(object, allowed, source, path) {
50
+ for (const key of Object.keys(object)) {
51
+ if (allowed.includes(key))
52
+ continue;
53
+ const nearest = nearestName(key, allowed);
54
+ throw new PricingOverlayError(nearest
55
+ ? `unknown key "${path}${key}" — did you mean "${nearest}"?`
56
+ : `unknown key "${path}${key}". Known keys: ${allowed.join(', ')}`, source);
57
+ }
58
+ }
59
+ function positiveNumber(value, label, source) {
60
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
61
+ throw new PricingOverlayError(`"${label}" must be a number greater than 0`, source);
62
+ }
63
+ return value;
64
+ }
65
+ function integerAbove(value, label, source) {
66
+ const n = positiveNumber(value, label, source);
67
+ if (!Number.isInteger(n)) {
68
+ throw new PricingOverlayError(`"${label}" must be a whole number`, source);
69
+ }
70
+ return n;
71
+ }
72
+ function parsePromo(raw, label, source) {
73
+ if (!isPlainObject(raw)) {
74
+ throw new PricingOverlayError(`"${label}" must be an object`, source);
75
+ }
76
+ rejectUnknownKeys(raw, PROMO_KEYS, source, `${label}.`);
77
+ for (const key of PROMO_KEYS) {
78
+ if (raw[key] === undefined) {
79
+ throw new PricingOverlayError(`"${label}" needs all of ${PROMO_KEYS.join(', ')} — a partial promotion has no meaning`, source);
80
+ }
81
+ }
82
+ if (typeof raw.until !== 'string' || !ISO_DATE.test(raw.until)) {
83
+ throw new PricingOverlayError(`"${label}.until" must be a date like 2026-08-31`, source);
84
+ }
85
+ return {
86
+ inputPerMTok: positiveNumber(raw.inputPerMTok, `${label}.inputPerMTok`, source),
87
+ outputPerMTok: positiveNumber(raw.outputPerMTok, `${label}.outputPerMTok`, source),
88
+ until: raw.until,
89
+ };
90
+ }
91
+ function parseModel(raw, id, source) {
92
+ if (!isPlainObject(raw)) {
93
+ throw new PricingOverlayError(`"models.${id}" must be an object`, source);
94
+ }
95
+ rejectUnknownKeys(raw, PRICING_MODEL_KEYS, source, `models.${id}.`);
96
+ if (Object.keys(raw).length === 0) {
97
+ throw new PricingOverlayError(`"models.${id}" is empty — remove it, or say what it changes`, source);
98
+ }
99
+ const model = {};
100
+ if (raw.displayName !== undefined) {
101
+ if (typeof raw.displayName !== 'string' || raw.displayName.trim() === '') {
102
+ throw new PricingOverlayError(`"models.${id}.displayName" must be a non-empty string`, source);
103
+ }
104
+ model.displayName = raw.displayName;
105
+ }
106
+ if (raw.inputPerMTok !== undefined) {
107
+ model.inputPerMTok = positiveNumber(raw.inputPerMTok, `models.${id}.inputPerMTok`, source);
108
+ }
109
+ if (raw.outputPerMTok !== undefined) {
110
+ model.outputPerMTok = positiveNumber(raw.outputPerMTok, `models.${id}.outputPerMTok`, source);
111
+ }
112
+ if (raw.contextWindow !== undefined) {
113
+ model.contextWindow = integerAbove(raw.contextWindow, `models.${id}.contextWindow`, source);
114
+ }
115
+ if (raw.cacheMinTokens !== undefined) {
116
+ // `null` is "this catalogue does not know", which is a different statement
117
+ // from any number — including zero, which claims caching from the first
118
+ // token. A live price feed knows what a model costs and nothing about how
119
+ // it caches, so the distinction has to be expressible.
120
+ model.cacheMinTokens =
121
+ raw.cacheMinTokens === null
122
+ ? null
123
+ : integerAbove(raw.cacheMinTokens, `models.${id}.cacheMinTokens`, source);
124
+ }
125
+ if (raw.capability !== undefined) {
126
+ if (typeof raw.capability !== 'string' || !CAPABILITIES.includes(raw.capability)) {
127
+ throw new PricingOverlayError(`"models.${id}.capability" must be one of ${CAPABILITIES.join(', ')}`, source);
128
+ }
129
+ model.capability = raw.capability;
130
+ }
131
+ if (raw.caching !== undefined) {
132
+ if (typeof raw.caching !== 'string' || !CACHING_MODES.includes(raw.caching)) {
133
+ throw new PricingOverlayError(`"models.${id}.caching" must be one of ${CACHING_MODES.join(', ')}`, source);
134
+ }
135
+ model.caching = raw.caching;
136
+ }
137
+ if (raw.tier !== undefined) {
138
+ if (typeof raw.tier !== 'string' || !TIERS.includes(raw.tier)) {
139
+ throw new PricingOverlayError(`"models.${id}.tier" must be one of ${TIERS.join(', ')}`, source);
140
+ }
141
+ model.tier = raw.tier;
142
+ }
143
+ if (raw.notes !== undefined) {
144
+ if (typeof raw.notes !== 'string') {
145
+ throw new PricingOverlayError(`"models.${id}.notes" must be a string`, source);
146
+ }
147
+ model.notes = raw.notes;
148
+ }
149
+ if (raw.promo !== undefined) {
150
+ // `null` is how you cancel a bundled promotion that has been withdrawn.
151
+ model.promo = raw.promo === null ? undefined : parsePromo(raw.promo, `models.${id}.promo`, source);
152
+ }
153
+ return model;
154
+ }
155
+ /** Validates an overlay document. Every failure throws, with the source named. */
156
+ export function parsePricingOverlay(raw, source = 'pricing overlay') {
157
+ let document;
158
+ try {
159
+ document = JSON.parse(raw);
160
+ }
161
+ catch (error) {
162
+ const detail = error instanceof Error ? error.message : String(error);
163
+ throw new PricingOverlayError(`not valid JSON — ${detail}`, source);
164
+ }
165
+ if (!isPlainObject(document)) {
166
+ throw new PricingOverlayError('the top level must be an object', source);
167
+ }
168
+ rejectUnknownKeys(document, PRICING_OVERLAY_KEYS, source, '');
169
+ if (typeof document.lastReviewed !== 'string' || !ISO_DATE.test(document.lastReviewed)) {
170
+ throw new PricingOverlayError('"lastReviewed" is required and must be a date like 2026-06-24. ' +
171
+ 'An overlay of unknown age is worse than the bundled catalogue, whose age is printed.', source);
172
+ }
173
+ if (!isPlainObject(document.models) || Object.keys(document.models).length === 0) {
174
+ throw new PricingOverlayError('"models" must be a non-empty object keyed by model id', source);
175
+ }
176
+ const models = {};
177
+ for (const [id, value] of Object.entries(document.models)) {
178
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id)) {
179
+ throw new PricingOverlayError(`"${id}" is not a plausible model id`, source);
180
+ }
181
+ models[id] = parseModel(value, id, source);
182
+ }
183
+ return { lastReviewed: document.lastReviewed, models };
184
+ }
185
+ /**
186
+ * A new catalogue with the overlay applied. Neither argument is modified.
187
+ *
188
+ * **A model the bundled catalogue does not have must be complete.** Overriding
189
+ * one field of a known model is the common case and needs no more than that
190
+ * field; inventing a model needs every field, because a half-defined model would
191
+ * price at zero somewhere and report a saving that does not exist.
192
+ *
193
+ * `lastReviewed` becomes the *overlay's* date, and the report shows it — a
194
+ * catalogue is only as current as its most recently touched half, and claiming
195
+ * the bundled date over corrected prices would be a lie about provenance.
196
+ */
197
+ export function applyPricingOverlay(base, overlay, source = 'pricing overlay') {
198
+ const overridden = [];
199
+ const added = [];
200
+ const models = base.models.map((model) => {
201
+ const patch = overlay.models[model.id];
202
+ if (!patch)
203
+ return model;
204
+ overridden.push(model.id);
205
+ // `promo` is spread explicitly: a patch that sets it to undefined must remove
206
+ // a withdrawn promotion rather than be ignored as a missing key.
207
+ const merged = { ...model, ...patch };
208
+ if ('promo' in patch && patch.promo === undefined)
209
+ delete merged.promo;
210
+ return merged;
211
+ });
212
+ for (const [id, patch] of Object.entries(overlay.models)) {
213
+ if (base.byId.has(id))
214
+ continue;
215
+ // `capability` joins the list: it is a required field of `ModelPricing`, and
216
+ // an added model without one produced an object the type says cannot exist —
217
+ // the cast below was hiding it.
218
+ //
219
+ // `cacheMinTokens` is checked for `undefined` and not for falsiness, so an
220
+ // explicit `null` counts as supplied. That is the point of it: saying "not
221
+ // known" is an answer, leaving it out is not.
222
+ const missing = ['displayName', 'inputPerMTok', 'outputPerMTok', 'contextWindow', 'cacheMinTokens', 'tier', 'capability'].filter((key) => patch[key] === undefined);
223
+ if (missing.length > 0) {
224
+ throw new PricingOverlayError(`"models.${id}" is not in the bundled catalogue, so it has to be complete. Missing: ${missing.join(', ')}`, source);
225
+ }
226
+ models.push({ id, ...patch });
227
+ added.push(id);
228
+ }
229
+ return {
230
+ models,
231
+ byId: new Map(models.map((m) => [m.id, m])),
232
+ lastReviewed: overlay.lastReviewed,
233
+ overriddenModels: overridden.sort(),
234
+ addedModels: added.sort(),
235
+ };
236
+ }
237
+ /** Convenience: the bundled catalogue with an overlay document applied. */
238
+ export function catalogueFromOverlay(raw, source = 'pricing overlay') {
239
+ return applyPricingOverlay(BUNDLED_CATALOGUE, parsePricingOverlay(raw, source), source);
240
+ }
241
+ //# sourceMappingURL=pricing-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing-overlay.js","sourceRoot":"","sources":["../src/pricing-overlay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import type { ModelPricing } from './types.js';
2
+ /**
3
+ * Model and pricing catalogue (USD per million tokens).
4
+ *
5
+ * Source: official Claude API documentation. Prices change: check
6
+ * `PRICING_LAST_REVIEWED` and update this file before making budget decisions.
7
+ * Amazon Bedrock and Vertex AI pricing is set by each partner and is NOT the
8
+ * pricing in this table.
9
+ */
10
+ export declare const PRICING_LAST_REVIEWED = "2026-06-24";
11
+ /** Cost multipliers relative to the input price. */
12
+ /**
13
+ * The defaults, which are Anthropic's numbers.
14
+ *
15
+ * Still exported and still correct for every Anthropic model, but no longer the
16
+ * whole story: a model can override any of these through `multipliers`, and
17
+ * anything computing a cost should go through `multipliersFor` rather than
18
+ * reading these directly. A cache read is ~10% of input on Anthropic and ~50%
19
+ * on OpenAI, and using one number for both invents a saving.
20
+ */
21
+ export declare const COST_MULTIPLIERS: {
22
+ /** Cache write with a 5-minute TTL. */
23
+ readonly cacheWrite5m: 1.25;
24
+ /** Cache write with a 1-hour TTL. */
25
+ readonly cacheWrite1h: 2;
26
+ /** Cache read: ~10% of the input price. */
27
+ readonly cacheRead: 0.1;
28
+ /** Batch API: 50% discount on input and output. */
29
+ readonly batch: 0.5;
30
+ };
31
+ /**
32
+ * The multipliers that apply to one model, defaults filled in.
33
+ *
34
+ * `batch` stays `null` when the provider has no batch API, which is different
35
+ * from "unspecified": the first should stop the advisory firing, the second
36
+ * should fall back to the default.
37
+ */
38
+ export declare function multipliersFor(model: ModelPricing): {
39
+ cacheWrite5m: number;
40
+ cacheWrite1h: number;
41
+ cacheRead: number;
42
+ batch: number | null;
43
+ };
44
+ export declare const MODELS: ModelPricing[];
45
+ export declare const DEFAULT_MODEL = "claude-opus-5";
46
+ /**
47
+ * A set of prices to work from.
48
+ *
49
+ * Prices change on someone else's schedule, and until 1.0 correcting one meant
50
+ * upgrading the library — which is backwards: a stale price is a wrong number in
51
+ * a budget decision, and nobody should have to take a dependency bump to fix it.
52
+ *
53
+ * So the catalogue is a **value**, not module state. The bundled one below is the
54
+ * default, and `applyPricingOverlay` returns a *new* catalogue with local
55
+ * corrections layered on. Nothing mutates: a caller who overlays prices does not
56
+ * change what any other caller sees, and two catalogues can exist in one process
57
+ * — which is what makes it testable and what stops one consumer's local prices
58
+ * leaking into another's report.
59
+ */
60
+ export interface PricingCatalogue {
61
+ models: ModelPricing[];
62
+ byId: Map<string, ModelPricing>;
63
+ /** The date the prices in this catalogue were last checked. */
64
+ lastReviewed: string;
65
+ /** Ids whose bundled prices an overlay replaced. Empty for the bundled set. */
66
+ overriddenModels: string[];
67
+ /** Ids an overlay introduced that the bundled catalogue does not have. */
68
+ addedModels: string[];
69
+ }
70
+ /** The prices compiled into this release. */
71
+ export declare const BUNDLED_CATALOGUE: PricingCatalogue;
72
+ /** Looks a model up in a specific catalogue. */
73
+ export declare function modelFrom(catalogue: PricingCatalogue, id: string): ModelPricing;
74
+ /**
75
+ * Cheapest model of a tier within a catalogue.
76
+ *
77
+ * Compared on the **effective** price, so a model in a promotional window is
78
+ * ranked at what it actually costs today rather than at its list price.
79
+ */
80
+ export declare function cheapestOfTierIn(catalogue: PricingCatalogue, tier: ModelPricing['tier'], on?: Date,
81
+ /**
82
+ * Restrict to one provider. Omit to search the whole catalogue, which is what
83
+ * this did before other providers existed — kept as the default so the
84
+ * signature stays additive, though the advisory always passes one: switching
85
+ * vendor is a migration, not a cheaper model.
86
+ */
87
+ provider?: string): ModelPricing;
88
+ export declare function getModel(id: string): ModelPricing;
89
+ export declare function listModels(): ModelPricing[];
90
+ /** Effective price on a given date, applying any live promotion. */
91
+ export declare function effectivePricing(model: ModelPricing, on?: Date): {
92
+ inputPerMTok: number;
93
+ outputPerMTok: number;
94
+ promoApplied: boolean;
95
+ };
96
+ /** Cheapest model of each capability tier, for recommendations. */
97
+ export declare function cheapestOfTier(tier: ModelPricing['tier']): ModelPricing;
98
+ /**
99
+ * Whole days between a `YYYY-MM-DD` review date and now, or `null`.
100
+ *
101
+ * Every dollar figure Trazum prints descends from a price list, and the list
102
+ * carries the date it was checked. Printing only that date makes the reader do
103
+ * arithmetic against today to learn the one thing they wanted to know — whether
104
+ * to trust it — and a reader who is not already suspicious will not bother.
105
+ *
106
+ * `now` is a parameter for the reason `computeSavings` takes a `Date`: a function
107
+ * that reads the clock can only be asserted for shape.
108
+ *
109
+ * Compared at UTC midnight on both sides, so the answer does not change by one
110
+ * depending on what time of day the command runs. `null` for anything that is not
111
+ * a date — an overlay supplies this string, and a wrong one should read as
112
+ * unknown rather than as a confident number computed from `NaN`.
113
+ */
114
+ export declare function reviewAgeDays(lastReviewed: string, now: Date): number | null;
115
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,oDAAoD;AACpD;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB;IAC3B,uCAAuC;aACvC,YAAY,EAAE,IAAI;IAClB,qCAAqC;aACrC,YAAY,EAAE,CAAG;IACjB,2CAA2C;aAC3C,SAAS,EAAE,GAAG;IACd,mDAAmD;aACnD,KAAK,EAAE,GAAG;CACF,CAAC;AAEX;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAQA;AAED,eAAO,MAAM,MAAM,EAAE,YAAY,EAiQhC,CAAC;AAEF,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAChC,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,0EAA0E;IAC1E,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAiBD,6CAA6C;AAC7C,eAAO,MAAM,iBAAiB,EAAE,gBAA+D,CAAC;AAEhG,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAQ/E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,gBAAgB,EAC3B,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,EAC1B,EAAE,GAAE,IAAiB;AACrB;;;;;GAKG;AACH,QAAQ,CAAC,EAAE,MAAM,GAChB,YAAY,CAcd;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAEjD;AAED,wBAAgB,UAAU,IAAI,YAAY,EAAE,CAE3C;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,EAAE,GAAE,IAAiB,GACpB;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAgBxE;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,YAAY,CAKvE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAU5E"}