tryaii-dre 0.2.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 (146) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +234 -0
  3. package/dist/banner.d.ts +24 -0
  4. package/dist/banner.d.ts.map +1 -0
  5. package/dist/banner.js +125 -0
  6. package/dist/banner.js.map +1 -0
  7. package/dist/benchmarks/index.d.ts +4 -0
  8. package/dist/benchmarks/index.d.ts.map +1 -0
  9. package/dist/benchmarks/index.js +3 -0
  10. package/dist/benchmarks/index.js.map +1 -0
  11. package/dist/benchmarks/registry.d.ts +69 -0
  12. package/dist/benchmarks/registry.d.ts.map +1 -0
  13. package/dist/benchmarks/registry.js +128 -0
  14. package/dist/benchmarks/registry.js.map +1 -0
  15. package/dist/benchmarks/standard.d.ts +6 -0
  16. package/dist/benchmarks/standard.d.ts.map +1 -0
  17. package/dist/benchmarks/standard.js +115 -0
  18. package/dist/benchmarks/standard.js.map +1 -0
  19. package/dist/budget.d.ts +65 -0
  20. package/dist/budget.d.ts.map +1 -0
  21. package/dist/budget.js +344 -0
  22. package/dist/budget.js.map +1 -0
  23. package/dist/cache/index.d.ts +27 -0
  24. package/dist/cache/index.d.ts.map +1 -0
  25. package/dist/cache/index.js +63 -0
  26. package/dist/cache/index.js.map +1 -0
  27. package/dist/centroids/data/centroids_all-MiniLM-L6-v2.json +1 -0
  28. package/dist/centroids/data/trainingQueries.json +246 -0
  29. package/dist/centroids/generator.d.ts +63 -0
  30. package/dist/centroids/generator.d.ts.map +1 -0
  31. package/dist/centroids/generator.js +120 -0
  32. package/dist/centroids/generator.js.map +1 -0
  33. package/dist/centroids/index.d.ts +3 -0
  34. package/dist/centroids/index.d.ts.map +1 -0
  35. package/dist/centroids/index.js +3 -0
  36. package/dist/centroids/index.js.map +1 -0
  37. package/dist/centroids/loader.d.ts +87 -0
  38. package/dist/centroids/loader.d.ts.map +1 -0
  39. package/dist/centroids/loader.js +236 -0
  40. package/dist/centroids/loader.js.map +1 -0
  41. package/dist/classifiers/base.d.ts +56 -0
  42. package/dist/classifiers/base.d.ts.map +1 -0
  43. package/dist/classifiers/base.js +42 -0
  44. package/dist/classifiers/base.js.map +1 -0
  45. package/dist/classifiers/embedding.d.ts +68 -0
  46. package/dist/classifiers/embedding.d.ts.map +1 -0
  47. package/dist/classifiers/embedding.js +0 -0
  48. package/dist/classifiers/embedding.js.map +1 -0
  49. package/dist/classifiers/hybrid.d.ts +31 -0
  50. package/dist/classifiers/hybrid.d.ts.map +1 -0
  51. package/dist/classifiers/hybrid.js +61 -0
  52. package/dist/classifiers/hybrid.js.map +1 -0
  53. package/dist/classifiers/index.d.ts +4 -0
  54. package/dist/classifiers/index.d.ts.map +1 -0
  55. package/dist/classifiers/index.js +3 -0
  56. package/dist/classifiers/index.js.map +1 -0
  57. package/dist/classifiers/keyword.d.ts +29 -0
  58. package/dist/classifiers/keyword.d.ts.map +1 -0
  59. package/dist/classifiers/keyword.js +264 -0
  60. package/dist/classifiers/keyword.js.map +1 -0
  61. package/dist/cli.d.ts +15 -0
  62. package/dist/cli.d.ts.map +1 -0
  63. package/dist/cli.js +597 -0
  64. package/dist/cli.js.map +1 -0
  65. package/dist/client-types.d.ts +101 -0
  66. package/dist/client-types.d.ts.map +1 -0
  67. package/dist/client-types.js +5 -0
  68. package/dist/client-types.js.map +1 -0
  69. package/dist/client.d.ts +50 -0
  70. package/dist/client.d.ts.map +1 -0
  71. package/dist/client.js +279 -0
  72. package/dist/client.js.map +1 -0
  73. package/dist/config.d.ts +45 -0
  74. package/dist/config.d.ts.map +1 -0
  75. package/dist/config.js +37 -0
  76. package/dist/config.js.map +1 -0
  77. package/dist/dashboard/index.d.ts +48 -0
  78. package/dist/dashboard/index.d.ts.map +1 -0
  79. package/dist/dashboard/index.js +166 -0
  80. package/dist/dashboard/index.js.map +1 -0
  81. package/dist/embeddings/base.d.ts +66 -0
  82. package/dist/embeddings/base.d.ts.map +1 -0
  83. package/dist/embeddings/base.js +77 -0
  84. package/dist/embeddings/base.js.map +1 -0
  85. package/dist/embeddings/index.d.ts +3 -0
  86. package/dist/embeddings/index.d.ts.map +1 -0
  87. package/dist/embeddings/index.js +3 -0
  88. package/dist/embeddings/index.js.map +1 -0
  89. package/dist/embeddings/local.d.ts +42 -0
  90. package/dist/embeddings/local.d.ts.map +1 -0
  91. package/dist/embeddings/local.js +89 -0
  92. package/dist/embeddings/local.js.map +1 -0
  93. package/dist/index.d.ts +44 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +45 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/integrations/index.d.ts +3 -0
  98. package/dist/integrations/index.d.ts.map +1 -0
  99. package/dist/integrations/index.js +2 -0
  100. package/dist/integrations/index.js.map +1 -0
  101. package/dist/integrations/openrouter.d.ts +84 -0
  102. package/dist/integrations/openrouter.d.ts.map +1 -0
  103. package/dist/integrations/openrouter.js +253 -0
  104. package/dist/integrations/openrouter.js.map +1 -0
  105. package/dist/registry/index.d.ts +2 -0
  106. package/dist/registry/index.d.ts.map +1 -0
  107. package/dist/registry/index.js +2 -0
  108. package/dist/registry/index.js.map +1 -0
  109. package/dist/registry/models.d.ts +76 -0
  110. package/dist/registry/models.d.ts.map +1 -0
  111. package/dist/registry/models.js +170 -0
  112. package/dist/registry/models.js.map +1 -0
  113. package/dist/registry/presets/defaultModels.json +435 -0
  114. package/dist/router.d.ts +178 -0
  115. package/dist/router.d.ts.map +1 -0
  116. package/dist/router.js +259 -0
  117. package/dist/router.js.map +1 -0
  118. package/dist/scoring/benchmarks.d.ts +35 -0
  119. package/dist/scoring/benchmarks.d.ts.map +1 -0
  120. package/dist/scoring/benchmarks.js +68 -0
  121. package/dist/scoring/benchmarks.js.map +1 -0
  122. package/dist/scoring/engine.d.ts +43 -0
  123. package/dist/scoring/engine.d.ts.map +1 -0
  124. package/dist/scoring/engine.js +267 -0
  125. package/dist/scoring/engine.js.map +1 -0
  126. package/dist/scoring/index.d.ts +6 -0
  127. package/dist/scoring/index.d.ts.map +1 -0
  128. package/dist/scoring/index.js +4 -0
  129. package/dist/scoring/index.js.map +1 -0
  130. package/dist/scoring/priorities.d.ts +41 -0
  131. package/dist/scoring/priorities.d.ts.map +1 -0
  132. package/dist/scoring/priorities.js +49 -0
  133. package/dist/scoring/priorities.js.map +1 -0
  134. package/dist/types.d.ts +47 -0
  135. package/dist/types.d.ts.map +1 -0
  136. package/dist/types.js +5 -0
  137. package/dist/types.js.map +1 -0
  138. package/dist/utils/cosine.d.ts +10 -0
  139. package/dist/utils/cosine.d.ts.map +1 -0
  140. package/dist/utils/cosine.js +18 -0
  141. package/dist/utils/cosine.js.map +1 -0
  142. package/dist/utils/math.d.ts +18 -0
  143. package/dist/utils/math.d.ts.map +1 -0
  144. package/dist/utils/math.js +54 -0
  145. package/dist/utils/math.js.map +1 -0
  146. package/package.json +65 -0
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Dynamic model scoring engine.
3
+ *
4
+ * Combines benchmark performance, cost, and speed into a single score
5
+ * weighted by user priorities. This is the heart of the routing logic.
6
+ */
7
+ import { BenchmarkNormalizer } from './benchmarks.js';
8
+ import { DEFAULT_PRIORITIES } from './priorities.js';
9
+ /** Speed tier -> numeric score. */
10
+ export const SPEED_SCORES = {
11
+ 'very fast': 1.0,
12
+ 'fast': 0.8,
13
+ 'medium': 0.6,
14
+ 'slow': 0.3,
15
+ 'very slow': 0.1,
16
+ };
17
+ /**
18
+ * How many of the prompt's most-relevant benchmarks contribute to model scoring.
19
+ *
20
+ * History: was 3. Bumped to 5 alongside the median-imputation change so a
21
+ * single very-similar benchmark can't dominate the decision -- giving the
22
+ * scorer a wider, more stable view of what the prompt looks like.
23
+ */
24
+ const TOP_BENCHMARKS_FOR_SCORING = 5;
25
+ /**
26
+ * Neutral quality used only as a last-resort fallback when a prompt matches no
27
+ * benchmark at all (every similarity clamps to 0), so it stays routable on
28
+ * cost/speed instead of being dropped. See scoreModels' neutralFallback retry.
29
+ */
30
+ const NEUTRAL_QUALITY_SCORE = 0.5;
31
+ /**
32
+ * Compute the median raw benchmark score across the registry, per benchmark.
33
+ *
34
+ * Used to impute missing data: if a model has no score on a benchmark that
35
+ * the prompt cares about, we fill in the registry-wide median rather than
36
+ * silently dropping the benchmark. Dropping was the source of a real routing
37
+ * bug (sparse-data models inflated their own averages by erasing weak
38
+ * benchmarks instead of being penalised by them); imputing keeps things
39
+ * neutral instead of harsh.
40
+ *
41
+ * Benchmarks no model in the registry has are *omitted* from the result --
42
+ * the caller treats that as "truly unknown, skip" (preserves the long-standing
43
+ * behaviour of dropping models that don't intersect any of the prompt's top
44
+ * benchmarks).
45
+ */
46
+ function computeBenchmarkMedians(models, benchmarkNames) {
47
+ const medians = {};
48
+ for (const name of benchmarkNames) {
49
+ const values = [];
50
+ for (const m of models) {
51
+ const v = m.benchmarkScores[name];
52
+ // Number.isFinite skips NaN/Infinity as well as undefined -- a NaN
53
+ // benchmark value must not poison the registry-wide median.
54
+ if (Number.isFinite(v))
55
+ values.push(v);
56
+ }
57
+ if (values.length === 0)
58
+ continue; // omit -> caller skips this benchmark for this model
59
+ values.sort((a, b) => a - b);
60
+ const mid = Math.floor(values.length / 2);
61
+ medians[name] = values.length % 2 === 1
62
+ ? values[mid]
63
+ : (values[mid - 1] + values[mid]) / 2;
64
+ }
65
+ return medians;
66
+ }
67
+ /**
68
+ * Scores models against a classified prompt.
69
+ *
70
+ * Takes benchmark similarity scores (from the classifier) and user priorities,
71
+ * then ranks all available models using a three-factor weighted algorithm:
72
+ *
73
+ * final = (quality * qW + cost * cW + speed * sW) / (qW + cW + sW)
74
+ *
75
+ * Where weights are derived from user priorities (1-5 scale).
76
+ */
77
+ export class ScoringEngine {
78
+ constructor(normalizer) {
79
+ this._normalizer = normalizer ?? new BenchmarkNormalizer();
80
+ }
81
+ /**
82
+ * Score and rank models based on benchmark similarities and priorities.
83
+ */
84
+ scoreModels(models, benchmarkSimilarities, priorities = DEFAULT_PRIORITIES, topK = 5) {
85
+ // Pick the prompt's most-relevant benchmarks. See TOP_BENCHMARKS_FOR_SCORING
86
+ // for why this is 5 -- short version: a wider view stops one near-perfect
87
+ // similarity from dominating the decision.
88
+ const sortedBenchmarks = Object.entries(benchmarkSimilarities)
89
+ .sort((a, b) => b[1] - a[1])
90
+ .slice(0, TOP_BENCHMARKS_FOR_SCORING);
91
+ const topBenchmarkDict = {};
92
+ for (const [name, score] of sortedBenchmarks) {
93
+ topBenchmarkDict[name] = score;
94
+ }
95
+ // Per-benchmark medians for the benchmarks we actually care about. Built
96
+ // once per call from the same `models` argument we're about to score
97
+ // against -- so adding/removing/filtering models flows through correctly
98
+ // without needing a separate "rebuild medians" step.
99
+ const benchmarkMedians = computeBenchmarkMedians(models, sortedBenchmarks.map(([name]) => name));
100
+ const scores = [];
101
+ for (const model of models) {
102
+ const score = this._scoreSingleModel(model, topBenchmarkDict, benchmarkMedians, priorities);
103
+ if (score !== null) {
104
+ scores.push(score);
105
+ }
106
+ }
107
+ // Fallback: if NO model scored, the prompt matched no benchmark at all (its
108
+ // embedding is orthogonal/negative to every centroid, so all similarities
109
+ // clamped to 0). Rather than return nothing -- which makes a single route()
110
+ // throw and a budget run report the whole dataset infeasible -- re-score
111
+ // every model on a neutral quality baseline so the prompt stays routable on
112
+ // cost/speed. The per-model skip above still applies when only *some* models
113
+ // lack signal.
114
+ if (scores.length === 0) {
115
+ for (const model of models) {
116
+ const score = this._scoreSingleModel(model, topBenchmarkDict, benchmarkMedians, priorities, true);
117
+ if (score !== null) {
118
+ scores.push(score);
119
+ }
120
+ }
121
+ }
122
+ // Sort by final score descending, with a deterministic secondary key so
123
+ // median-imputation ties favour real data and are reproducible:
124
+ // 1. higher finalScore
125
+ // 2. more real (non-imputed) benchmark coverage -- topBenchmarks only
126
+ // holds the model's own non-imputed benchmarks
127
+ // 3. ascending modelId by Unicode code point (NOT locale-aware)
128
+ scores.sort((a, b) => {
129
+ if (b.finalScore !== a.finalScore)
130
+ return b.finalScore - a.finalScore;
131
+ if (b.topBenchmarks.length !== a.topBenchmarks.length) {
132
+ return b.topBenchmarks.length - a.topBenchmarks.length;
133
+ }
134
+ return a.modelId < b.modelId ? -1 : a.modelId > b.modelId ? 1 : 0;
135
+ });
136
+ if (scores.length > 1) {
137
+ // Normalize to 0.1-0.95 range (best model ~ 0.95)
138
+ const maxRaw = scores[0].finalScore;
139
+ const minRaw = scores[scores.length - 1].finalScore;
140
+ for (const s of scores) {
141
+ if (maxRaw === minRaw) {
142
+ s.finalScore = 0.5;
143
+ }
144
+ else {
145
+ const normalized = (s.finalScore - minRaw) / (maxRaw - minRaw);
146
+ s.finalScore = Math.round((0.1 + 0.85 * normalized) * 10000) / 10000;
147
+ }
148
+ }
149
+ }
150
+ else if (scores.length === 1) {
151
+ // Single surviving model: don't rescale against a hardcoded 0 floor
152
+ // (that forced ~0.95 regardless of how good the model actually is).
153
+ // Surface its own unnormalized weighted score, clamped to [0,1].
154
+ const only = scores[0];
155
+ only.finalScore = Math.round(Math.max(0, Math.min(1, only.finalScore)) * 10000) / 10000;
156
+ }
157
+ return scores.slice(0, topK);
158
+ }
159
+ _scoreSingleModel(model, topBenchmarks, benchmarkMedians, priorities,
160
+ // When true, a model with no usable similarity signal is scored on a neutral
161
+ // quality baseline instead of being dropped -- used only for the
162
+ // all-models-signal-less case (see scoreModels).
163
+ neutralFallback = false) {
164
+ // --- Quality score ---
165
+ let weightedQualitySum = 0;
166
+ let totalSimilarityWeight = 0;
167
+ let imputedCount = 0;
168
+ // Only the model's *own* benchmark data goes in this list -- it powers
169
+ // the human-readable reasoning string, which should reflect real strengths,
170
+ // not registry-median guesses.
171
+ const modelTopBenchmarks = [];
172
+ for (const [benchmarkName, userSimilarity] of Object.entries(topBenchmarks)) {
173
+ let rawScore = model.benchmarkScores[benchmarkName];
174
+ let imputed = false;
175
+ // !Number.isFinite treats NaN/Infinity like a missing score so a junk
176
+ // value is imputed from the median rather than poisoning the result.
177
+ if (!Number.isFinite(rawScore)) {
178
+ const median = benchmarkMedians[benchmarkName];
179
+ // No model in the registry has data on this benchmark -> nothing to
180
+ // impute from. Falling through to `continue` here preserves the old
181
+ // "skip the model entirely if it intersects nothing" semantic, which
182
+ // is exactly what the test at line ~140 of engine.test.ts pins.
183
+ if (median == null)
184
+ continue;
185
+ rawScore = median;
186
+ imputed = true;
187
+ imputedCount += 1;
188
+ }
189
+ const normalized = this._normalizer.normalize(benchmarkName, rawScore);
190
+ weightedQualitySum += userSimilarity * normalized;
191
+ totalSimilarityWeight += userSimilarity;
192
+ if (!imputed)
193
+ modelTopBenchmarks.push([benchmarkName, normalized]);
194
+ }
195
+ // No usable similarity signal: normally drop the model so models with real
196
+ // signal win. But when EVERY model is signal-less, scoreModels retries with
197
+ // neutralFallback=true so the prompt stays routable on cost/speed -- flagged
198
+ // in the reasoning below so the "no signal" case is observable, not mistaken
199
+ // for a real quality judgement.
200
+ const noSignal = totalSimilarityWeight === 0;
201
+ if (noSignal && !neutralFallback)
202
+ return null;
203
+ const qualityScore = noSignal ? NEUTRAL_QUALITY_SCORE : weightedQualitySum / totalSimilarityWeight;
204
+ // --- Cost score ---
205
+ // Always compute when pricing data exists: gating on priority dropped the
206
+ // numerator while keeping the weight in totalWeight (denominator), which is
207
+ // mathematically inconsistent. The priority weight already scales the term.
208
+ let costScore = 0;
209
+ if (model.pricing) {
210
+ const avgCost = (model.pricing.inputPer1k + model.pricing.outputPer1k) / 2;
211
+ // Normalize against $0.10/1k tokens baseline
212
+ costScore = Math.max(0.0, 1.0 - avgCost / 0.1);
213
+ }
214
+ // --- Speed score ---
215
+ let speedScore = 0;
216
+ if (model.latency) {
217
+ speedScore = SPEED_SCORES[model.latency] ?? 0.3;
218
+ }
219
+ // --- Combine with priority weights ---
220
+ const qWeight = priorities.qualityWeight;
221
+ const cWeight = priorities.costWeight;
222
+ const sWeight = priorities.speedWeight;
223
+ const qContrib = qualityScore * qWeight;
224
+ const cContrib = costScore * cWeight;
225
+ const sContrib = speedScore * sWeight;
226
+ const totalWeight = qWeight + cWeight + sWeight;
227
+ let final = (qContrib + cContrib + sContrib) / totalWeight;
228
+ final = Math.max(0.0, Math.min(1.0, final));
229
+ // Generate reasoning
230
+ const topBenchStr = modelTopBenchmarks
231
+ .slice(0, 2)
232
+ .map(([b, s]) => `${b} (${Math.round(s * 100)}%)`)
233
+ .join(', ');
234
+ let reasoning;
235
+ if (noSignal) {
236
+ reasoning = 'No benchmark signal -- routed on cost/speed';
237
+ }
238
+ else {
239
+ reasoning = `Quality: ${qualityScore.toFixed(2)} on [${topBenchStr}]`;
240
+ if (imputedCount > 0) {
241
+ // Tell the reader the score is partly an estimate. Useful when reading
242
+ // eval output and wondering why a model with thin coverage ranked here.
243
+ const total = Object.keys(topBenchmarks).length;
244
+ reasoning += ` | imputed: ${imputedCount}/${total}`;
245
+ }
246
+ }
247
+ if (costScore > 0) {
248
+ reasoning += ` | Cost efficiency: ${costScore.toFixed(2)}`;
249
+ }
250
+ if (speedScore > 0) {
251
+ reasoning += ` | Speed: ${speedScore.toFixed(2)} (${model.latency})`;
252
+ }
253
+ return {
254
+ modelId: model.modelId,
255
+ finalScore: final,
256
+ qualityScore: Math.round(qualityScore * 10000) / 10000,
257
+ costScore: Math.round(costScore * 10000) / 10000,
258
+ speedScore: Math.round(speedScore * 10000) / 10000,
259
+ qualityContribution: Math.round(qContrib * 10000) / 10000,
260
+ costContribution: Math.round(cContrib * 10000) / 10000,
261
+ speedContribution: Math.round(sContrib * 10000) / 10000,
262
+ topBenchmarks: modelTopBenchmarks,
263
+ reasoning,
264
+ };
265
+ }
266
+ }
267
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/scoring/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { ScoringEngine, SPEED_SCORES } from './engine.js';
2
+ export type { ModelScore } from './engine.js';
3
+ export { Priorities, DEFAULT_PRIORITIES } from './priorities.js';
4
+ export type { PrioritiesData } from './priorities.js';
5
+ export { BenchmarkNormalizer, NormalizationRange, NORMALIZATION_RANGES } from './benchmarks.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ScoringEngine, SPEED_SCORES } from './engine.js';
2
+ export { Priorities, DEFAULT_PRIORITIES } from './priorities.js';
3
+ export { BenchmarkNormalizer, NormalizationRange, NORMALIZATION_RANGES } from './benchmarks.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * User priority system for model selection.
3
+ *
4
+ * Priorities let users express what matters to them (quality, cost, speed)
5
+ * on a 1-5 scale. These get transformed into weights that influence scoring.
6
+ */
7
+ export interface PrioritiesData {
8
+ quality: number;
9
+ cost: number;
10
+ speed: number;
11
+ }
12
+ export declare class Priorities {
13
+ /**
14
+ * Each value is on a 1-5 scale:
15
+ * 1 = don't care about this dimension
16
+ * 3 = balanced (default)
17
+ * 5 = this is critical
18
+ */
19
+ readonly quality: number;
20
+ readonly cost: number;
21
+ readonly speed: number;
22
+ constructor(quality?: number, cost?: number, speed?: number);
23
+ /** Quality weight: 0.3 to 1.2 (always has baseline influence). */
24
+ get qualityWeight(): number;
25
+ /** Cost weight: 0.1 to 1.0 (can be fully suppressed). */
26
+ get costWeight(): number;
27
+ /** Speed weight: 0.1 to 1.0 (can be fully suppressed). */
28
+ get speedWeight(): number;
29
+ toDict(): PrioritiesData;
30
+ static fromDict(d: Partial<PrioritiesData>): Priorities;
31
+ /** Preset: maximize quality, ignore cost and speed. */
32
+ static performance(): Priorities;
33
+ /** Preset: minimize cost, moderate quality. */
34
+ static budget(): Priorities;
35
+ /** Preset: fastest response, moderate quality. */
36
+ static fast(): Priorities;
37
+ /** Preset: balanced across all dimensions. */
38
+ static balanced(): Priorities;
39
+ }
40
+ export declare const DEFAULT_PRIORITIES: Priorities;
41
+ //# sourceMappingURL=priorities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorities.d.ts","sourceRoot":"","sources":["../../src/scoring/priorities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,UAAU;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,SAAI,EAAE,IAAI,SAAI,EAAE,KAAK,SAAI;IAM5C,kEAAkE;IAClE,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,yDAAyD;IACzD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,0DAA0D;IAC1D,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,MAAM,IAAI,cAAc;IAIxB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,UAAU;IAIvD,uDAAuD;IACvD,MAAM,CAAC,WAAW,IAAI,UAAU;IAIhC,+CAA+C;IAC/C,MAAM,CAAC,MAAM,IAAI,UAAU;IAI3B,kDAAkD;IAClD,MAAM,CAAC,IAAI,IAAI,UAAU;IAIzB,8CAA8C;IAC9C,MAAM,CAAC,QAAQ,IAAI,UAAU;CAG9B;AAED,eAAO,MAAM,kBAAkB,YAA0B,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * User priority system for model selection.
3
+ *
4
+ * Priorities let users express what matters to them (quality, cost, speed)
5
+ * on a 1-5 scale. These get transformed into weights that influence scoring.
6
+ */
7
+ export class Priorities {
8
+ constructor(quality = 3, cost = 3, speed = 3) {
9
+ this.quality = Math.max(1, Math.min(5, Math.round(quality)));
10
+ this.cost = Math.max(1, Math.min(5, Math.round(cost)));
11
+ this.speed = Math.max(1, Math.min(5, Math.round(speed)));
12
+ }
13
+ /** Quality weight: 0.3 to 1.2 (always has baseline influence). */
14
+ get qualityWeight() {
15
+ return 0.3 + (this.quality / 5) * 0.9;
16
+ }
17
+ /** Cost weight: 0.1 to 1.0 (can be fully suppressed). */
18
+ get costWeight() {
19
+ return 0.1 + (this.cost / 5) * 0.9;
20
+ }
21
+ /** Speed weight: 0.1 to 1.0 (can be fully suppressed). */
22
+ get speedWeight() {
23
+ return 0.1 + (this.speed / 5) * 0.9;
24
+ }
25
+ toDict() {
26
+ return { quality: this.quality, cost: this.cost, speed: this.speed };
27
+ }
28
+ static fromDict(d) {
29
+ return new Priorities(d.quality ?? 3, d.cost ?? 3, d.speed ?? 3);
30
+ }
31
+ /** Preset: maximize quality, ignore cost and speed. */
32
+ static performance() {
33
+ return new Priorities(5, 1, 1);
34
+ }
35
+ /** Preset: minimize cost, moderate quality. */
36
+ static budget() {
37
+ return new Priorities(2, 5, 3);
38
+ }
39
+ /** Preset: fastest response, moderate quality. */
40
+ static fast() {
41
+ return new Priorities(2, 3, 5);
42
+ }
43
+ /** Preset: balanced across all dimensions. */
44
+ static balanced() {
45
+ return new Priorities(3, 3, 3);
46
+ }
47
+ }
48
+ export const DEFAULT_PRIORITIES = new Priorities(3, 3, 3);
49
+ //# sourceMappingURL=priorities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorities.js","sourceRoot":"","sources":["../../src/scoring/priorities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,OAAO,UAAU;IAWrB,YAAY,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,kEAAkE;IAClE,IAAI,aAAa;QACf,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACxC,CAAC;IAED,yDAAyD;IACzD,IAAI,UAAU;QACZ,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACrC,CAAC;IAED,0DAA0D;IAC1D,IAAI,WAAW;QACb,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACtC,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,CAA0B;QACxC,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,uDAAuD;IACvD,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,+CAA+C;IAC/C,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,kDAAkD;IAClD,MAAM,CAAC,IAAI;QACT,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,8CAA8C;IAC9C,MAAM,CAAC,QAAQ;QACb,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Shared type definitions for TryAii-DRE.
3
+ */
4
+ /** Latency tier for a model. */
5
+ export type LatencyTier = 'very fast' | 'fast' | 'medium' | 'slow' | 'very slow';
6
+ /** Scoring strategy preset name. */
7
+ export type ScoringStrategy = 'balanced' | 'performance' | 'cost' | 'speed';
8
+ /** Pricing per 1k tokens in USD. */
9
+ export interface ModelPricingData {
10
+ input_per_1k: number;
11
+ output_per_1k: number;
12
+ }
13
+ /** Raw model data as stored in JSON. */
14
+ export interface ModelData {
15
+ model_id: string;
16
+ provider: string;
17
+ benchmark_scores?: Record<string, number | null>;
18
+ capabilities?: string[];
19
+ pricing?: ModelPricingData | null;
20
+ latency?: LatencyTier | null;
21
+ description?: string;
22
+ }
23
+ /** Models JSON file structure. */
24
+ export interface ModelsJson {
25
+ version?: string;
26
+ updated?: string;
27
+ models: ModelData[];
28
+ }
29
+ /** Training queries JSON file structure. */
30
+ export interface TrainingQueriesJson {
31
+ version?: string;
32
+ description?: string;
33
+ benchmarks: Record<string, {
34
+ description: string;
35
+ queries: string[];
36
+ }>;
37
+ }
38
+ /** Centroids JSON file structure. */
39
+ export interface CentroidsJson {
40
+ metadata: {
41
+ model: string;
42
+ dimension: number;
43
+ benchmark_count: number;
44
+ };
45
+ centroids: Record<string, number[]>;
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gCAAgC;AAChC,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAEjF,oCAAoC;AACpC,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5E,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wCAAwC;AACxC,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,kCAAkC;AAClC,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared type definitions for TryAii-DRE.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Cosine similarity between two vectors.
3
+ */
4
+ /**
5
+ * Compute cosine similarity between two vectors.
6
+ *
7
+ * @returns A value between -1 and 1 (1 = identical direction, 0 = orthogonal).
8
+ */
9
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
10
+ //# sourceMappingURL=cosine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cosine.d.ts","sourceRoot":"","sources":["../../src/utils/cosine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAMjE"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Cosine similarity between two vectors.
3
+ */
4
+ import { dotProduct, vectorNorm } from './math.js';
5
+ /**
6
+ * Compute cosine similarity between two vectors.
7
+ *
8
+ * @returns A value between -1 and 1 (1 = identical direction, 0 = orthogonal).
9
+ */
10
+ export function cosineSimilarity(a, b) {
11
+ const dot = dotProduct(a, b);
12
+ const normA = vectorNorm(a);
13
+ const normB = vectorNorm(b);
14
+ if (normA === 0 || normB === 0)
15
+ return 0.0;
16
+ return dot / (normA * normB);
17
+ }
18
+ //# sourceMappingURL=cosine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cosine.js","sourceRoot":"","sources":["../../src/utils/cosine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEnD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3C,OAAO,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Basic vector math utilities.
3
+ *
4
+ * Replaces numpy operations with plain TypeScript array math.
5
+ */
6
+ /** Compute the dot product of two vectors. */
7
+ export declare function dotProduct(a: number[], b: number[]): number;
8
+ /** Compute the L2 (Euclidean) norm of a vector. */
9
+ export declare function vectorNorm(v: number[]): number;
10
+ /** Compute the element-wise mean of a list of vectors. */
11
+ export declare function vectorMean(vectors: number[][]): number[];
12
+ /** Scale a vector by a scalar. */
13
+ export declare function vectorScale(v: number[], scalar: number): number[];
14
+ /** Add two vectors element-wise. */
15
+ export declare function vectorAdd(a: number[], b: number[]): number[];
16
+ /** Normalize a vector to unit length. Returns zero vector if norm is 0. */
17
+ export declare function vectorNormalize(v: number[]): number[];
18
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8CAA8C;AAC9C,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAM3D;AAED,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAM9C;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAcxD;AAED,kCAAkC;AAClC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED,oCAAoC;AACpC,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE5D;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAIrD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Basic vector math utilities.
3
+ *
4
+ * Replaces numpy operations with plain TypeScript array math.
5
+ */
6
+ /** Compute the dot product of two vectors. */
7
+ export function dotProduct(a, b) {
8
+ let sum = 0;
9
+ for (let i = 0; i < a.length; i++) {
10
+ sum += a[i] * b[i];
11
+ }
12
+ return sum;
13
+ }
14
+ /** Compute the L2 (Euclidean) norm of a vector. */
15
+ export function vectorNorm(v) {
16
+ let sum = 0;
17
+ for (let i = 0; i < v.length; i++) {
18
+ sum += v[i] * v[i];
19
+ }
20
+ return Math.sqrt(sum);
21
+ }
22
+ /** Compute the element-wise mean of a list of vectors. */
23
+ export function vectorMean(vectors) {
24
+ if (vectors.length === 0)
25
+ return [];
26
+ const dim = vectors[0].length;
27
+ const result = new Array(dim).fill(0);
28
+ for (const v of vectors) {
29
+ for (let i = 0; i < dim; i++) {
30
+ result[i] += v[i];
31
+ }
32
+ }
33
+ const n = vectors.length;
34
+ for (let i = 0; i < dim; i++) {
35
+ result[i] /= n;
36
+ }
37
+ return result;
38
+ }
39
+ /** Scale a vector by a scalar. */
40
+ export function vectorScale(v, scalar) {
41
+ return v.map((x) => x * scalar);
42
+ }
43
+ /** Add two vectors element-wise. */
44
+ export function vectorAdd(a, b) {
45
+ return a.map((x, i) => x + b[i]);
46
+ }
47
+ /** Normalize a vector to unit length. Returns zero vector if norm is 0. */
48
+ export function vectorNormalize(v) {
49
+ const norm = vectorNorm(v);
50
+ if (norm === 0)
51
+ return v.slice();
52
+ return v.map((x) => x / norm);
53
+ }
54
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8CAA8C;AAC9C,MAAM,UAAU,UAAU,CAAC,CAAW,EAAE,CAAW;IACjD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,UAAU,CAAC,CAAW;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,UAAU,CAAC,OAAmB;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,WAAW,CAAC,CAAW,EAAE,MAAc;IACrD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,SAAS,CAAC,CAAW,EAAE,CAAW;IAChD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,CAAW;IACzC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;IACjC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAChC,CAAC"}