@ruvector/ruvllm 4.0.1 → 4.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 (171) hide show
  1. package/README.md +446 -160
  2. package/bin/cli.js +1066 -0
  3. package/bin/gpu-delegate.js +67 -0
  4. package/bin/ruvllm-adapters.js +5 -0
  5. package/bin/ruvllm-gpu-loop.js +5 -0
  6. package/bin/serve.js +265 -0
  7. package/dist/cjs/benchmarks/embedding-benchmark.d.ts +102 -0
  8. package/dist/cjs/benchmarks/embedding-benchmark.d.ts.map +1 -0
  9. package/dist/cjs/benchmarks/embedding-benchmark.js +436 -0
  10. package/dist/cjs/benchmarks/index.d.ts +34 -0
  11. package/dist/cjs/benchmarks/index.d.ts.map +1 -0
  12. package/dist/cjs/benchmarks/index.js +132 -0
  13. package/dist/cjs/benchmarks/model-comparison.d.ts +71 -0
  14. package/dist/cjs/benchmarks/model-comparison.d.ts.map +1 -0
  15. package/dist/cjs/benchmarks/model-comparison.js +476 -0
  16. package/dist/cjs/benchmarks/routing-benchmark.d.ts +70 -0
  17. package/dist/cjs/benchmarks/routing-benchmark.d.ts.map +1 -0
  18. package/dist/cjs/benchmarks/routing-benchmark.js +289 -0
  19. package/dist/cjs/contrastive.d.ts +229 -0
  20. package/dist/cjs/contrastive.d.ts.map +1 -0
  21. package/dist/cjs/contrastive.js +589 -0
  22. package/dist/cjs/engine.d.ts +160 -0
  23. package/dist/cjs/engine.d.ts.map +1 -0
  24. package/dist/cjs/engine.js +552 -0
  25. package/dist/cjs/export.d.ts +182 -0
  26. package/dist/cjs/export.d.ts.map +1 -0
  27. package/dist/cjs/export.js +422 -0
  28. package/dist/cjs/federated.d.ts +233 -0
  29. package/dist/cjs/federated.d.ts.map +1 -0
  30. package/dist/cjs/federated.js +525 -0
  31. package/dist/cjs/index.d.ts +68 -0
  32. package/dist/cjs/index.d.ts.map +1 -0
  33. package/dist/cjs/index.js +104 -0
  34. package/dist/cjs/intelligence.d.ts +136 -0
  35. package/dist/cjs/intelligence.d.ts.map +1 -0
  36. package/dist/cjs/intelligence.js +226 -0
  37. package/dist/cjs/lora.d.ts +251 -0
  38. package/dist/cjs/lora.d.ts.map +1 -0
  39. package/dist/cjs/lora.js +509 -0
  40. package/dist/cjs/models.d.ts +129 -0
  41. package/dist/cjs/models.d.ts.map +1 -0
  42. package/dist/cjs/models.js +323 -0
  43. package/dist/cjs/native.d.ts +140 -0
  44. package/dist/cjs/native.d.ts.map +1 -0
  45. package/dist/cjs/native.js +98 -0
  46. package/dist/cjs/session.d.ts +80 -0
  47. package/dist/cjs/session.d.ts.map +1 -0
  48. package/dist/cjs/session.js +203 -0
  49. package/dist/cjs/simd.d.ts +90 -0
  50. package/dist/cjs/simd.d.ts.map +1 -0
  51. package/dist/cjs/simd.js +209 -0
  52. package/dist/cjs/sona.d.ts +223 -0
  53. package/dist/cjs/sona.d.ts.map +1 -0
  54. package/dist/cjs/sona.js +562 -0
  55. package/dist/cjs/streaming.d.ts +55 -0
  56. package/dist/cjs/streaming.d.ts.map +1 -0
  57. package/dist/cjs/streaming.js +131 -0
  58. package/dist/cjs/training.d.ts +312 -0
  59. package/dist/cjs/training.d.ts.map +1 -0
  60. package/dist/cjs/training.js +610 -0
  61. package/dist/cjs/types.d.ts +696 -0
  62. package/dist/cjs/types.d.ts.map +1 -0
  63. package/dist/cjs/types.js +6 -0
  64. package/dist/esm/benchmarks/embedding-benchmark.d.ts +102 -0
  65. package/dist/esm/benchmarks/embedding-benchmark.d.ts.map +1 -0
  66. package/dist/esm/benchmarks/embedding-benchmark.js +427 -0
  67. package/dist/esm/benchmarks/index.d.ts +34 -0
  68. package/dist/esm/benchmarks/index.d.ts.map +1 -0
  69. package/dist/esm/benchmarks/index.js +110 -0
  70. package/dist/esm/benchmarks/model-comparison.d.ts +71 -0
  71. package/dist/esm/benchmarks/model-comparison.d.ts.map +1 -0
  72. package/dist/esm/benchmarks/model-comparison.js +434 -0
  73. package/dist/esm/benchmarks/routing-benchmark.d.ts +70 -0
  74. package/dist/esm/benchmarks/routing-benchmark.d.ts.map +1 -0
  75. package/dist/esm/benchmarks/routing-benchmark.js +283 -0
  76. package/dist/esm/contrastive.d.ts +229 -0
  77. package/dist/esm/contrastive.d.ts.map +1 -0
  78. package/dist/esm/contrastive.js +578 -0
  79. package/dist/esm/engine.d.ts +160 -0
  80. package/dist/esm/engine.d.ts.map +1 -0
  81. package/dist/esm/engine.js +548 -0
  82. package/dist/esm/export.d.ts +182 -0
  83. package/dist/esm/export.d.ts.map +1 -0
  84. package/dist/esm/export.js +414 -0
  85. package/dist/esm/federated.d.ts +233 -0
  86. package/dist/esm/federated.d.ts.map +1 -0
  87. package/dist/esm/federated.js +520 -0
  88. package/dist/esm/index.d.ts +68 -0
  89. package/dist/esm/index.d.ts.map +1 -0
  90. package/dist/esm/index.js +84 -0
  91. package/dist/esm/intelligence.d.ts +136 -0
  92. package/dist/esm/intelligence.d.ts.map +1 -0
  93. package/dist/esm/intelligence.js +188 -0
  94. package/dist/esm/lora.d.ts +251 -0
  95. package/dist/esm/lora.d.ts.map +1 -0
  96. package/dist/esm/lora.js +504 -0
  97. package/dist/esm/models.d.ts +129 -0
  98. package/dist/esm/models.d.ts.map +1 -0
  99. package/dist/esm/models.js +282 -0
  100. package/dist/esm/native.d.ts +140 -0
  101. package/dist/esm/native.d.ts.map +1 -0
  102. package/dist/esm/native.js +100 -0
  103. package/dist/esm/session.d.ts +80 -0
  104. package/dist/esm/session.d.ts.map +1 -0
  105. package/dist/esm/session.js +199 -0
  106. package/dist/esm/simd.d.ts +90 -0
  107. package/dist/esm/simd.d.ts.map +1 -0
  108. package/dist/esm/simd.js +205 -0
  109. package/dist/esm/sona.d.ts +223 -0
  110. package/dist/esm/sona.d.ts.map +1 -0
  111. package/dist/esm/sona.js +556 -0
  112. package/dist/esm/streaming.d.ts +55 -0
  113. package/dist/esm/streaming.d.ts.map +1 -0
  114. package/dist/esm/streaming.js +126 -0
  115. package/dist/esm/training.d.ts +312 -0
  116. package/dist/esm/training.d.ts.map +1 -0
  117. package/dist/esm/training.js +603 -0
  118. package/dist/esm/types.d.ts +696 -0
  119. package/dist/esm/types.d.ts.map +1 -0
  120. package/dist/esm/types.js +5 -0
  121. package/gpu/_load.cjs +38 -0
  122. package/gpu/_load.mjs +33 -0
  123. package/gpu/adapters.cjs +3 -0
  124. package/gpu/adapters.mjs +5 -0
  125. package/gpu/engine.cjs +3 -0
  126. package/gpu/engine.mjs +5 -0
  127. package/gpu/fixture.cjs +3 -0
  128. package/gpu/fixture.mjs +5 -0
  129. package/gpu/gpu-host.cjs +3 -0
  130. package/gpu/gpu-host.mjs +5 -0
  131. package/gpu/gpu-loop.cjs +3 -0
  132. package/gpu/gpu-loop.mjs +5 -0
  133. package/gpu/gpu-spool-adapter.cjs +3 -0
  134. package/gpu/gpu-spool-adapter.mjs +5 -0
  135. package/gpu/vast-host-adapter.cjs +3 -0
  136. package/gpu/vast-host-adapter.mjs +5 -0
  137. package/package.json +159 -49
  138. package/scripts/ensemble-model-compare.js +287 -0
  139. package/scripts/fix-esm-extensions.mjs +220 -0
  140. package/scripts/huggingface/README.md +537 -0
  141. package/scripts/huggingface/publish.sh +112 -0
  142. package/scripts/hybrid-model-compare.js +373 -0
  143. package/scripts/improved-model-compare.js +288 -0
  144. package/scripts/optimized-model-compare.js +364 -0
  145. package/scripts/real-model-compare.js +280 -0
  146. package/scripts/smoke-esm.mjs +82 -0
  147. package/scripts/training/agentic-flow-capabilities.json +329 -0
  148. package/scripts/training/claude-code-synth.js +505 -0
  149. package/scripts/training/claude-flow-capabilities.json +1322 -0
  150. package/scripts/training/claude-hard-negatives.js +222 -0
  151. package/scripts/training/contrastive-finetune.js +517 -0
  152. package/scripts/training/ecosystem-triplets.jsonl +1467 -0
  153. package/scripts/training/generate-ecosystem-triplets.js +1324 -0
  154. package/scripts/training/routing-dataset.js +634 -0
  155. package/scripts/training/ruvector-capabilities.json +798 -0
  156. package/scripts/training/validate-ecosystem.js +381 -0
  157. package/scripts/training/validation-results.json +23 -0
  158. package/GPU-LOOP.md +0 -229
  159. package/LICENSE +0 -201
  160. package/NOTICE +0 -9
  161. package/examples/gpu-loop.example.json +0 -26
  162. package/src/adapters-cli.mjs +0 -23
  163. package/src/adapters.mjs +0 -91
  164. package/src/cli.mjs +0 -30
  165. package/src/engine.mjs +0 -238
  166. package/src/fixture.mjs +0 -38
  167. package/src/gpu-host.mjs +0 -47
  168. package/src/gpu-loop-cli.mjs +0 -67
  169. package/src/gpu-loop.mjs +0 -184
  170. package/src/gpu-spool-adapter.mjs +0 -80
  171. package/src/vast-host-adapter.mjs +0 -274
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /**
3
+ * RuvLTRA Benchmark Suite
4
+ *
5
+ * Comprehensive benchmarks for evaluating RuvLTRA models
6
+ * on Claude Code-specific use cases.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.CLUSTER_TEST_CASES = exports.SEARCH_TEST_CASES = exports.SIMILARITY_TEST_PAIRS = exports.ROUTING_TEST_CASES = void 0;
24
+ exports.runFullBenchmark = runFullBenchmark;
25
+ exports.formatFullResults = formatFullResults;
26
+ exports.compareModels = compareModels;
27
+ __exportStar(require("./routing-benchmark"), exports);
28
+ __exportStar(require("./embedding-benchmark"), exports);
29
+ __exportStar(require("./model-comparison"), exports);
30
+ const routing_benchmark_1 = require("./routing-benchmark");
31
+ Object.defineProperty(exports, "ROUTING_TEST_CASES", { enumerable: true, get: function () { return routing_benchmark_1.ROUTING_TEST_CASES; } });
32
+ const embedding_benchmark_1 = require("./embedding-benchmark");
33
+ Object.defineProperty(exports, "SIMILARITY_TEST_PAIRS", { enumerable: true, get: function () { return embedding_benchmark_1.SIMILARITY_TEST_PAIRS; } });
34
+ Object.defineProperty(exports, "SEARCH_TEST_CASES", { enumerable: true, get: function () { return embedding_benchmark_1.SEARCH_TEST_CASES; } });
35
+ Object.defineProperty(exports, "CLUSTER_TEST_CASES", { enumerable: true, get: function () { return embedding_benchmark_1.CLUSTER_TEST_CASES; } });
36
+ /**
37
+ * Run all benchmarks with a given model
38
+ */
39
+ function runFullBenchmark(router, embedder, similarityFn, modelName = 'unknown') {
40
+ const routing = (0, routing_benchmark_1.runRoutingBenchmark)(router);
41
+ const embedding = (0, embedding_benchmark_1.runEmbeddingBenchmark)(embedder, similarityFn);
42
+ return {
43
+ routing,
44
+ embedding,
45
+ timestamp: new Date().toISOString(),
46
+ model: modelName,
47
+ };
48
+ }
49
+ /**
50
+ * Format full benchmark results
51
+ */
52
+ function formatFullResults(results) {
53
+ const lines = [];
54
+ lines.push('');
55
+ lines.push('╔═══════════════════════════════════════════════════════════════════════════╗');
56
+ lines.push('║ RUVLTRA BENCHMARK SUITE ║');
57
+ lines.push('║ Claude Code Use Case Evaluation ║');
58
+ lines.push('╠═══════════════════════════════════════════════════════════════════════════╣');
59
+ lines.push(`║ Model: ${results.model.padEnd(64)}║`);
60
+ lines.push(`║ Date: ${results.timestamp.padEnd(64)}║`);
61
+ lines.push('╚═══════════════════════════════════════════════════════════════════════════╝');
62
+ lines.push((0, routing_benchmark_1.formatRoutingResults)(results.routing));
63
+ lines.push((0, embedding_benchmark_1.formatEmbeddingResults)(results.embedding));
64
+ // Overall assessment
65
+ lines.push('');
66
+ lines.push('═══════════════════════════════════════════════════════════════');
67
+ lines.push(' OVERALL ASSESSMENT');
68
+ lines.push('═══════════════════════════════════════════════════════════════');
69
+ const routingScore = results.routing.accuracy;
70
+ const embeddingScore = (results.embedding.similarityAccuracy +
71
+ results.embedding.searchMRR +
72
+ results.embedding.clusterPurity) / 3;
73
+ const overallScore = (routingScore + embeddingScore) / 2;
74
+ lines.push('');
75
+ lines.push(` Routing Score: ${(routingScore * 100).toFixed(1)}%`);
76
+ lines.push(` Embedding Score: ${(embeddingScore * 100).toFixed(1)}%`);
77
+ lines.push(` ─────────────────────────`);
78
+ lines.push(` Overall Score: ${(overallScore * 100).toFixed(1)}%`);
79
+ lines.push('');
80
+ if (overallScore >= 0.8) {
81
+ lines.push(' ✓ EXCELLENT - Highly suitable for Claude Code workflows');
82
+ }
83
+ else if (overallScore >= 0.6) {
84
+ lines.push(' ~ GOOD - Suitable for most Claude Code use cases');
85
+ }
86
+ else if (overallScore >= 0.4) {
87
+ lines.push(' ~ ACCEPTABLE - May work but consider alternatives');
88
+ }
89
+ else {
90
+ lines.push(' ✗ NEEDS IMPROVEMENT - Consider different model or fine-tuning');
91
+ }
92
+ lines.push('');
93
+ lines.push('═══════════════════════════════════════════════════════════════');
94
+ return lines.join('\n');
95
+ }
96
+ /**
97
+ * Compare two models
98
+ */
99
+ function compareModels(results1, results2) {
100
+ const lines = [];
101
+ lines.push('');
102
+ lines.push('╔═══════════════════════════════════════════════════════════════════════════╗');
103
+ lines.push('║ MODEL COMPARISON ║');
104
+ lines.push('╚═══════════════════════════════════════════════════════════════════════════╝');
105
+ lines.push('');
106
+ const metrics = [
107
+ { name: 'Routing Accuracy', v1: results1.routing.accuracy, v2: results2.routing.accuracy },
108
+ { name: 'Similarity Detection', v1: results1.embedding.similarityAccuracy, v2: results2.embedding.similarityAccuracy },
109
+ { name: 'Search MRR', v1: results1.embedding.searchMRR, v2: results2.embedding.searchMRR },
110
+ { name: 'Search NDCG', v1: results1.embedding.searchNDCG, v2: results2.embedding.searchNDCG },
111
+ { name: 'Cluster Purity', v1: results1.embedding.clusterPurity, v2: results2.embedding.clusterPurity },
112
+ { name: 'Routing Latency (ms)', v1: results1.routing.avgLatencyMs, v2: results2.routing.avgLatencyMs, lowerBetter: true },
113
+ ];
114
+ lines.push(`${'Metric'.padEnd(25)} ${results1.model.padEnd(15)} ${results2.model.padEnd(15)} Winner`);
115
+ lines.push('─'.repeat(70));
116
+ for (const m of metrics) {
117
+ const val1 = m.lowerBetter ? m.v1 : m.v1;
118
+ const val2 = m.lowerBetter ? m.v2 : m.v2;
119
+ let winner;
120
+ if (m.lowerBetter) {
121
+ winner = val1 < val2 ? results1.model : val2 < val1 ? results2.model : 'tie';
122
+ }
123
+ else {
124
+ winner = val1 > val2 ? results1.model : val2 > val1 ? results2.model : 'tie';
125
+ }
126
+ const v1Str = m.lowerBetter ? val1.toFixed(2) : (val1 * 100).toFixed(1) + '%';
127
+ const v2Str = m.lowerBetter ? val2.toFixed(2) : (val2 * 100).toFixed(1) + '%';
128
+ lines.push(`${m.name.padEnd(25)} ${v1Str.padEnd(15)} ${v2Str.padEnd(15)} ${winner}`);
129
+ }
130
+ return lines.join('\n');
131
+ }
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmVuY2htYXJrcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNILDRDQWVDO0FBS0QsOENBbURDO0FBS0Qsc0NBMENDO0FBckpELHNEQUFvQztBQUNwQyx3REFBc0M7QUFDdEMscURBQW1DO0FBRW5DLDJEQU02QjtBQStJM0IsbUdBakpBLHNDQUFrQixPQWlKQTtBQTdJcEIsK0RBTytCO0FBdUk3QixzR0EzSUEsMkNBQXFCLE9BMklBO0FBQ3JCLGtHQTNJQSx1Q0FBaUIsT0EySUE7QUFDakIsbUdBM0lBLHdDQUFrQixPQTJJQTtBQWhJcEI7O0dBRUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FDOUIsTUFBK0QsRUFDL0QsUUFBb0MsRUFDcEMsWUFBa0QsRUFDbEQsWUFBb0IsU0FBUztJQUU3QixNQUFNLE9BQU8sR0FBRyxJQUFBLHVDQUFtQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUEsMkNBQXFCLEVBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRWhFLE9BQU87UUFDTCxPQUFPO1FBQ1AsU0FBUztRQUNULFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtRQUNuQyxLQUFLLEVBQUUsU0FBUztLQUNqQixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsT0FBNkI7SUFDN0QsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBRTNCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZixLQUFLLENBQUMsSUFBSSxDQUFDLCtFQUErRSxDQUFDLENBQUM7SUFDNUYsS0FBSyxDQUFDLElBQUksQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQzVGLEtBQUssQ0FBQyxJQUFJLENBQUMsK0VB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Qy9FLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzlFLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFOUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUnV2TFRSQSBCZW5jaG1hcmsgU3VpdGVcbiAqXG4gKiBDb21wcmVoZW5zaXZlIGJlbmNobWFya3MgZm9yIGV2YWx1YXRpbmcgUnV2TFRSQSBtb2RlbHNcbiAqIG9uIENsYXVkZSBDb2RlLXNwZWNpZmljIHVzZSBjYXNlcy5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3JvdXRpbmctYmVuY2htYXJrJztcbmV4cG9ydCAqIGZyb20gJy4vZW1iZWRkaW5nLWJlbmNobWFyayc7XG5leHBvcnQgKiBmcm9tICcuL21vZGVsLWNvbXBhcmlzb24nO1xuXG5pbXBvcnQge1xuICBydW5Sb3V0aW5nQmVuY2htYXJrLFxuICBmb3JtYXRSb3V0aW5nUmVzdWx0cyxcbiAgYmFzZWxpbmVLZXl3b3JkUm91dGVyLFxuICBST1VUSU5HX1RFU1RfQ0FTRVMsXG4gIHR5cGUgUm91dGluZ0JlbmNobWFya1Jlc3VsdHMsXG59IGZyb20gJy4vcm91dGluZy1iZW5jaG1hcmsnO1xuXG5pbXBvcnQge1xuICBydW5FbWJlZGRpbmdCZW5jaG1hcmssXG4gIGZvcm1hdEVtYmVkZGluZ1Jlc3VsdHMsXG4gIFNJTUlMQVJJVFlfVEVTVF9QQUlSUyxcbiAgU0VBUkNIX1RFU1RfQ0FTRVMsXG4gIENMVVNURVJfVEVTVF9DQVNFUyxcbiAgdHlwZSBFbWJlZGRpbmdCZW5jaG1hcmtSZXN1bHRzLFxufSBmcm9tICcuL2VtYmVkZGluZy1iZW5jaG1hcmsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bGxCZW5jaG1hcmtSZXN1bHRzIHtcbiAgcm91dGluZzogUm91dGluZ0JlbmNobWFya1Jlc3VsdHM7XG4gIGVtYmVkZGluZzogRW1iZWRkaW5nQmVuY2htYXJrUmVzdWx0cztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIG1vZGVsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUnVuIGFsbCBiZW5jaG1hcmtzIHdpdGggYSBnaXZlbiBtb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuRnVsbEJlbmNobWFyayhcbiAgcm91dGVyOiAodGFzazogc3RyaW5nKSA9PiB7IGFnZW50OiBzdHJpbmc7IGNvbmZpZGVuY2U6IG51bWJlciB9LFxuICBlbWJlZGRlcjogKHRleHQ6IHN0cmluZykgPT4gbnVtYmVyW10sXG4gIHNpbWlsYXJpdHlGbjogKGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSkgPT4gbnVtYmVyLFxuICBtb2RlbE5hbWU6IHN0cmluZyA9ICd1bmtub3duJ1xuKTogRnVsbEJlbmNobWFya1Jlc3VsdHMge1xuICBjb25zdCByb3V0aW5nID0gcnVuUm91dGluZ0JlbmNobWFyayhyb3V0ZXIpO1xuICBjb25zdCBlbWJlZGRpbmcgPSBydW5FbWJlZGRpbmdCZW5jaG1hcmsoZW1iZWRkZXIsIHNpbWlsYXJpdHlGbik7XG5cbiAgcmV0dXJuIHtcbiAgICByb3V0aW5nLFxuICAgIGVtYmVkZGluZyxcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBtb2RlbDogbW9kZWxOYW1lLFxuICB9O1xufVxuXG4vKipcbiAqIEZvcm1hdCBmdWxsIGJlbmNobWFyayByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGdWxsUmVzdWx0cyhyZXN1bHRzOiBGdWxsQmVuY2htYXJrUmVzdWx0cyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGxpbmVzLnB1c2goJycpO1xuICBsaW5lcy5wdXNoKCfilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZcnKTtcbiAgbGluZXMucHVzaCgn4pWRICAgICAgICAgICAgICAgICAgICBSVVZMVFJBIEJFTkNITUFSSyBTVUlURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pWRJyk7XG4gIGxpbmVzLnB1c2goJ+KVkSAgICAgICAgICAgIENsYXVkZSBDb2RlIFVzZSBDYXNlIEV2YWx1YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKVkScpO1xuICBsaW5lcy5wdXNoKCfilaDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilaMnKTtcbiAgbGluZXMucHVzaChg4pWRICBNb2RlbDogJHtyZXN1bHRzLm1vZGVsLnBhZEVuZCg2NCl94pWRYCk7XG4gIGxpbmVzLnB1c2goYOKVkSAgRGF0ZTogICR7cmVzdWx0cy50aW1lc3RhbXAucGFkRW5kKDY0KX3ilZFgKTtcbiAgbGluZXMucHVzaCgn4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdJyk7XG5cbiAgbGluZXMucHVzaChmb3JtYXRSb3V0aW5nUmVzdWx0cyhyZXN1bHRzLnJvdXRpbmcpKTtcbiAgbGluZXMucHVzaChmb3JtYXRFbWJlZGRpbmdSZXN1bHRzKHJlc3VsdHMuZW1iZWRkaW5nKSk7XG5cbiAgLy8gT3ZlcmFsbCBhc3Nlc3NtZW50XG4gIGxpbmVzLnB1c2goJycpO1xuICBsaW5lcy5wdXNoKCfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnKTtcbiAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAgICAgICAgIE9WRVJBTEwgQVNTRVNTTUVOVCcpO1xuICBsaW5lcy5wdXNoKCfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnKTtcblxuICBjb25zdCByb3V0aW5nU2NvcmUgPSByZXN1bHRzLnJvdXRpbmcuYWNjdXJhY3k7XG4gIGNvbnN0IGVtYmVkZGluZ1Njb3JlID0gKFxuICAgIHJlc3VsdHMuZW1iZWRkaW5nLnNpbWlsYXJpdHlBY2N1cmFjeSArXG4gICAgcmVzdWx0cy5lbWJlZGRpbmcuc2VhcmNoTVJSICtcbiAgICByZXN1bHRzLmVtYmVkZGluZy5jbHVzdGVyUHVyaXR5XG4gICkgLyAzO1xuXG4gIGNvbnN0IG92ZXJhbGxTY29yZSA9IChyb3V0aW5nU2NvcmUgKyBlbWJlZGRpbmdTY29yZSkgLyAyO1xuXG4gIGxpbmVzLnB1c2goJycpO1xuICBsaW5lcy5wdXNoKGAgIFJvdXRpbmcgU2NvcmU6ICAgJHsocm91dGluZ1Njb3JlICogMTAwKS50b0ZpeGVkKDEpfSVgKTtcbiAgbGluZXMucHVzaChgICBFbWJlZGRpbmcgU2NvcmU6ICR7KGVtYmVkZGluZ1Njb3JlICogMTAwKS50b0ZpeGVkKDEpfSVgKTtcbiAgbGluZXMucHVzaChgICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBgKTtcbiAgbGluZXMucHVzaChgICBPdmVyYWxsIFNjb3JlOiAgICR7KG92ZXJhbGxTY29yZSAqIDEwMCkudG9GaXhlZCgxKX0lYCk7XG4gIGxpbmVzLnB1c2goJycpO1xuXG4gIGlmIChvdmVyYWxsU2NvcmUgPj0gMC44KSB7XG4gICAgbGluZXMucHVzaCgnICDinJMgRVhDRUxMRU5UIC0gSGlnaGx5IHN1aXRhYmxlIGZvciBDbGF1ZGUgQ29kZSB3b3JrZmxvd3MnKTtcbiAgfSBlbHNlIGlmIChvdmVyYWxsU2NvcmUgPj0gMC42KSB7XG4gICAgbGluZXMucHVzaCgnICB+IEdPT0QgLSBTdWl0YWJsZSBmb3IgbW9zdCBDbGF1ZGUgQ29kZSB1c2UgY2FzZXMnKTtcbiAgfSBlbHNlIGlmIChvdmVyYWxsU2NvcmUgPj0gMC40KSB7XG4gICAgbGluZXMucHVzaCgnICB+IEFDQ0VQVEFCTEUgLSBNYXkgd29yayBidXQgY29uc2lkZXIgYWx0ZXJuYXRpdmVzJyk7XG4gIH0gZWxzZSB7XG4gICAgbGluZXMucHVzaCgnICDinJcgTkVFRFMgSU1QUk9WRU1FTlQgLSBDb25zaWRlciBkaWZmZXJlbnQgbW9kZWwgb3IgZmluZS10dW5pbmcnKTtcbiAgfVxuXG4gIGxpbmVzLnB1c2goJycpO1xuICBsaW5lcy5wdXNoKCfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnKTtcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gbW9kZWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlTW9kZWxzKFxuICByZXN1bHRzMTogRnVsbEJlbmNobWFya1Jlc3VsdHMsXG4gIHJlc3VsdHMyOiBGdWxsQmVuY2htYXJrUmVzdWx0c1xuKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgbGluZXMucHVzaCgnJyk7XG4gIGxpbmVzLnB1c2goJ+KVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVlycpO1xuICBsaW5lcy5wdXNoKCfilZEgICAgICAgICAgICAgICAgICAgICAgIE1PREVMIENPTVBBUklTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilZEnKTtcbiAgbGluZXMucHVzaCgn4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdJyk7XG4gIGxpbmVzLnB1c2goJycpO1xuXG4gIGNvbnN0IG1ldHJpY3MgPSBbXG4gICAgeyBuYW1lOiAnUm91dGluZyBBY2N1cmFjeScsIHYxOiByZXN1bHRzMS5yb3V0aW5nLmFjY3VyYWN5LCB2MjogcmVzdWx0czIucm91dGluZy5hY2N1cmFjeSB9LFxuICAgIHsgbmFtZTogJ1NpbWlsYXJpdHkgRGV0ZWN0aW9uJywgdjE6IHJlc3VsdHMxLmVtYmVkZGluZy5zaW1pbGFyaXR5QWNjdXJhY3ksIHYyOiByZXN1bHRzMi5lbWJlZGRpbmcuc2ltaWxhcml0eUFjY3VyYWN5IH0sXG4gICAgeyBuYW1lOiAnU2VhcmNoIE1SUicsIHYxOiByZXN1bHRzMS5lbWJlZGRpbmcuc2VhcmNoTVJSLCB2MjogcmVzdWx0czIuZW1iZWRkaW5nLnNlYXJjaE1SUiB9LFxuICAgIHsgbmFtZTogJ1NlYXJjaCBORENHJywgdjE6IHJlc3VsdHMxLmVtYmVkZGluZy5zZWFyY2hORENHLCB2MjogcmVzdWx0czIuZW1iZWRkaW5nLnNlYXJjaE5EQ0cgfSxcbiAgICB7IG5hbWU6ICdDbHVzdGVyIFB1cml0eScsIHYxOiByZXN1bHRzMS5lbWJlZGRpbmcuY2x1c3RlclB1cml0eSwgdjI6IHJlc3VsdHMyLmVtYmVkZGluZy5jbHVzdGVyUHVyaXR5IH0sXG4gICAgeyBuYW1lOiAnUm91dGluZyBMYXRlbmN5IChtcyknLCB2MTogcmVzdWx0czEucm91dGluZy5hdmdMYXRlbmN5TXMsIHYyOiByZXN1bHRzMi5yb3V0aW5nLmF2Z0xhdGVuY3lNcywgbG93ZXJCZXR0ZXI6IHRydWUgfSxcbiAgXTtcblxuICBsaW5lcy5wdXNoKGAkeydNZXRyaWMnLnBhZEVuZCgyNSl9ICR7cmVzdWx0czEubW9kZWwucGFkRW5kKDE1KX0gJHtyZXN1bHRzMi5tb2RlbC5wYWRFbmQoMTUpfSBXaW5uZXJgKTtcbiAgbGluZXMucHVzaCgn4pSAJy5yZXBlYXQoNzApKTtcblxuICBmb3IgKGNvbnN0IG0gb2YgbWV0cmljcykge1xuICAgIGNvbnN0IHZhbDEgPSBtLmxvd2VyQmV0dGVyID8gbS52MSA6IG0udjE7XG4gICAgY29uc3QgdmFsMiA9IG0ubG93ZXJCZXR0ZXIgPyBtLnYyIDogbS52MjtcblxuICAgIGxldCB3aW5uZXI6IHN0cmluZztcbiAgICBpZiAobS5sb3dlckJldHRlcikge1xuICAgICAgd2lubmVyID0gdmFsMSA8IHZhbDIgPyByZXN1bHRzMS5tb2RlbCA6IHZhbDIgPCB2YWwxID8gcmVzdWx0czIubW9kZWwgOiAndGllJztcbiAgICB9IGVsc2Uge1xuICAgICAgd2lubmVyID0gdmFsMSA+IHZhbDIgPyByZXN1bHRzMS5tb2RlbCA6IHZhbDIgPiB2YWwxID8gcmVzdWx0czIubW9kZWwgOiAndGllJztcbiAgICB9XG5cbiAgICBjb25zdCB2MVN0ciA9IG0ubG93ZXJCZXR0ZXIgPyB2YWwxLnRvRml4ZWQoMikgOiAodmFsMSAqIDEwMCkudG9GaXhlZCgxKSArICclJztcbiAgICBjb25zdCB2MlN0ciA9IG0ubG93ZXJCZXR0ZXIgPyB2YWwyLnRvRml4ZWQoMikgOiAodmFsMiAqIDEwMCkudG9GaXhlZCgxKSArICclJztcblxuICAgIGxpbmVzLnB1c2goYCR7bS5uYW1lLnBhZEVuZCgyNSl9ICR7djFTdHIucGFkRW5kKDE1KX0gJHt2MlN0ci5wYWRFbmQoMTUpfSAke3dpbm5lcn1gKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLy8gRXhwb3J0IGNvbnN0YW50cyBmb3IgZXh0ZXJuYWwgdXNlXG5leHBvcnQge1xuICBST1VUSU5HX1RFU1RfQ0FTRVMsXG4gIFNJTUlMQVJJVFlfVEVTVF9QQUlSUyxcbiAgU0VBUkNIX1RFU1RfQ0FTRVMsXG4gIENMVVNURVJfVEVTVF9DQVNFUyxcbn07XG4iXX0=
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Model Comparison Benchmark
3
+ *
4
+ * Head-to-head comparison between:
5
+ * - Qwen2.5-0.5B-Instruct (base model)
6
+ * - RuvLTRA Claude Code 0.5B (fine-tuned for Claude Code)
7
+ *
8
+ * Tests routing accuracy and embedding quality for Claude Code use cases.
9
+ */
10
+ import { type RoutingBenchmarkResults } from './routing-benchmark';
11
+ import { type EmbeddingBenchmarkResults } from './embedding-benchmark';
12
+ /** Model configuration */
13
+ export interface ModelConfig {
14
+ id: string;
15
+ name: string;
16
+ url: string;
17
+ filename: string;
18
+ sizeBytes: number;
19
+ description: string;
20
+ }
21
+ /** Comparison models */
22
+ export declare const COMPARISON_MODELS: Record<string, ModelConfig>;
23
+ /** Comparison result */
24
+ export interface ComparisonResult {
25
+ modelId: string;
26
+ modelName: string;
27
+ routing: RoutingBenchmarkResults;
28
+ embedding: EmbeddingBenchmarkResults;
29
+ overallScore: number;
30
+ }
31
+ /** Full comparison results */
32
+ export interface FullComparisonResults {
33
+ timestamp: string;
34
+ baseline: ComparisonResult;
35
+ models: ComparisonResult[];
36
+ winner: string;
37
+ summary: string;
38
+ }
39
+ /**
40
+ * Get models directory
41
+ */
42
+ export declare function getModelsDir(): string;
43
+ /**
44
+ * Check if model is downloaded
45
+ */
46
+ export declare function isModelDownloaded(modelId: string): boolean;
47
+ /**
48
+ * Download a model with progress
49
+ */
50
+ export declare function downloadModel(modelId: string, onProgress?: (percent: number, speed: number) => void): Promise<string>;
51
+ /**
52
+ * Run comparison for a single model
53
+ */
54
+ export declare function runModelComparison(modelId: string, modelName: string, embedder: (text: string) => number[]): ComparisonResult;
55
+ /**
56
+ * Format comparison results
57
+ */
58
+ export declare function formatComparisonResults(results: FullComparisonResults): string;
59
+ /**
60
+ * Run full comparison
61
+ */
62
+ export declare function runFullComparison(): Promise<FullComparisonResults>;
63
+ declare const _default: {
64
+ COMPARISON_MODELS: Record<string, ModelConfig>;
65
+ runFullComparison: typeof runFullComparison;
66
+ formatComparisonResults: typeof formatComparisonResults;
67
+ downloadModel: typeof downloadModel;
68
+ isModelDownloaded: typeof isModelDownloaded;
69
+ };
70
+ export default _default;
71
+ //# sourceMappingURL=model-comparison.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-comparison.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/model-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,EAML,KAAK,uBAAuB,EAC7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAE/B,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAwB;AACxB,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAiBzD,CAAC;AAEF,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,uBAAuB,CAAC;IACjC,SAAS,EAAE,yBAAyB,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,8BAA8B;AAC9B,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAS1D;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,MAAM,CAAC,CA2EjB;AAyJD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,GACnC,gBAAgB,CAyBlB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CA8E9E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAqGxE;;;;;;;;AAED,wBAME"}