@ruvector/ruvllm 2.4.0 → 2.5.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 (40) hide show
  1. package/README.md +26 -302
  2. package/dist/cjs/index.d.ts +1 -1
  3. package/dist/cjs/index.d.ts.map +1 -1
  4. package/dist/cjs/index.js +3 -3
  5. package/dist/cjs/intelligence.d.ts +136 -0
  6. package/dist/cjs/intelligence.d.ts.map +1 -0
  7. package/dist/cjs/intelligence.js +162 -0
  8. package/dist/esm/index.d.ts +1 -1
  9. package/dist/esm/index.d.ts.map +1 -1
  10. package/dist/esm/index.js +3 -3
  11. package/dist/esm/intelligence.d.ts +136 -0
  12. package/dist/esm/intelligence.d.ts.map +1 -0
  13. package/dist/esm/intelligence.js +157 -0
  14. package/package.json +3 -7
  15. package/scripts/training/validation-results.json +1 -1
  16. package/dist/cjs/rlm/controller.d.ts +0 -245
  17. package/dist/cjs/rlm/controller.d.ts.map +0 -1
  18. package/dist/cjs/rlm/controller.js +0 -554
  19. package/dist/cjs/rlm/index.d.ts +0 -62
  20. package/dist/cjs/rlm/index.d.ts.map +0 -1
  21. package/dist/cjs/rlm/index.js +0 -97
  22. package/dist/cjs/rlm/training.d.ts +0 -333
  23. package/dist/cjs/rlm/training.d.ts.map +0 -1
  24. package/dist/cjs/rlm/training.js +0 -680
  25. package/dist/cjs/rlm/types.d.ts +0 -189
  26. package/dist/cjs/rlm/types.d.ts.map +0 -1
  27. package/dist/cjs/rlm/types.js +0 -10
  28. package/dist/esm/rlm/controller.d.ts +0 -245
  29. package/dist/esm/rlm/controller.d.ts.map +0 -1
  30. package/dist/esm/rlm/controller.js +0 -550
  31. package/dist/esm/rlm/index.d.ts +0 -62
  32. package/dist/esm/rlm/index.d.ts.map +0 -1
  33. package/dist/esm/rlm/index.js +0 -71
  34. package/dist/esm/rlm/training.d.ts +0 -333
  35. package/dist/esm/rlm/training.d.ts.map +0 -1
  36. package/dist/esm/rlm/training.js +0 -672
  37. package/dist/esm/rlm/types.d.ts +0 -189
  38. package/dist/esm/rlm/types.d.ts.map +0 -1
  39. package/dist/esm/rlm/types.js +0 -9
  40. package/scripts/training/rlm-dataset.js +0 -671
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # @ruvector/ruvllm v2.4
1
+ # @ruvector/ruvllm v2.3
2
2
 
3
- Self-learning LLM orchestration with SONA adaptive learning, HNSW memory, RLM recursive retrieval, and SIMD inference for Node.js.
3
+ Self-learning LLM orchestration with SONA adaptive learning, HNSW memory, and SIMD inference for Node.js.
4
4
 
5
5
  ## Installation
6
6
 
@@ -34,178 +34,18 @@ for await (const token of llm.stream('Write a haiku about Rust')) {
34
34
  }
35
35
  ```
36
36
 
37
- ## What's New in v2.4
37
+ ## What's New in v2.3
38
38
 
39
39
  | Feature | Description |
40
40
  |---------|-------------|
41
- | **RLM (Recursive Language Model)** | Query decomposition with recursive retrieval and synthesis |
42
- | **100% Routing Accuracy** | Hybrid keyword-first strategy achieves 100% on Claude Code tasks |
43
- | **145 Tests Passing** | Comprehensive test coverage across all modules |
44
- | **Contrastive Fine-tuning** | LoRA-based training with 793 contrastive pairs |
45
- | **Training Scripts** | Generate routing datasets and fine-tune models |
46
- | **HuggingFace Models** | Pre-trained RuvLTRA models available |
47
-
48
- ## RLM (Recursive Language Model)
49
-
50
- RLM provides recursive retrieval-augmented generation that breaks down complex queries into sub-queries and synthesizes answers from retrieved context.
51
-
52
- ### Basic Usage
53
-
54
- ```typescript
55
- import { RlmController } from '@ruvector/ruvllm';
56
-
57
- const rlm = new RlmController({
58
- maxDepth: 5,
59
- retrievalTopK: 10,
60
- enableCache: true,
61
- });
62
-
63
- // Add knowledge to memory
64
- await rlm.addMemory('TypeScript adds static typing to JavaScript.');
65
- await rlm.addMemory('React is a library for building user interfaces.');
66
-
67
- // Query with recursive retrieval
68
- const answer = await rlm.query('What are causes and solutions for type errors in React?');
69
- console.log(answer.text);
70
- console.log('Sources:', answer.sources);
71
- console.log('Quality Score:', answer.qualityScore);
72
- console.log('Confidence:', answer.confidence);
73
- ```
74
-
75
- ### Streaming
76
-
77
- ```typescript
78
- import { RlmController } from '@ruvector/ruvllm';
79
-
80
- const rlm = new RlmController();
81
-
82
- for await (const event of rlm.queryStream('Explain machine learning')) {
83
- if (event.type === 'token') {
84
- process.stdout.write(event.text);
85
- } else {
86
- console.log('\n\nQuality:', event.answer.qualityScore);
87
- }
88
- }
89
- ```
90
-
91
- ### With Reflection
92
-
93
- ```typescript
94
- import { RlmController } from '@ruvector/ruvllm';
95
-
96
- const rlm = new RlmController({
97
- enableReflection: true,
98
- maxReflectionIterations: 2,
99
- minQualityScore: 0.8,
100
- });
101
-
102
- // Answers will be iteratively refined until quality >= 0.8
103
- const answer = await rlm.query('Complex multi-part technical question...');
104
- ```
105
-
106
- ### RLM Configuration
107
-
108
- ```typescript
109
- interface RlmConfig {
110
- maxDepth?: number; // Max recursion depth (default: 3)
111
- maxSubQueries?: number; // Max sub-queries per level (default: 5)
112
- tokenBudget?: number; // Token budget (default: 4096)
113
- enableCache?: boolean; // Enable caching (default: true)
114
- cacheTtl?: number; // Cache TTL in ms (default: 300000)
115
- retrievalTopK?: number; // Memory spans to retrieve (default: 10)
116
- minQualityScore?: number; // Min quality threshold (default: 0.7)
117
- enableReflection?: boolean; // Enable self-reflection (default: false)
118
- maxReflectionIterations?: number; // Max reflection loops (default: 2)
119
- }
120
- ```
121
-
122
- ## Exports
123
-
124
- ```typescript
125
- import {
126
- // Core
127
- RuvLLM,
128
- RuvLLMConfig,
129
-
130
- // RLM - Recursive Language Model
131
- RlmController,
132
- RlmConfig,
133
- RlmAnswer,
134
- MemorySpan,
135
- StreamToken,
136
-
137
- // RLM Training
138
- RlmTrainer,
139
- RlmTrainingConfig,
140
- RlmTrainingExample,
141
- createRlmTrainer,
142
- DEFAULT_RLM_CONFIG,
143
- FAST_RLM_CONFIG,
144
- THOROUGH_RLM_CONFIG,
145
- ROUTING_FOCUSED_CONFIG,
146
-
147
- // SONA Learning
148
- SonaCoordinator,
149
- TrajectoryBuilder,
150
-
151
- // Federated Learning
152
- EphemeralAgent,
153
- FederatedCoordinator,
154
-
155
- // LoRA Adapters
156
- LoraAdapter,
157
- LoraManager,
158
-
159
- // Sessions
160
- SessionManager,
161
-
162
- // Contrastive Training
163
- ContrastiveTrainer,
164
-
165
- // Benchmarks
166
- ModelComparisonBenchmark,
167
- RoutingBenchmark,
168
- EmbeddingBenchmark,
169
- } from '@ruvector/ruvllm';
170
- ```
171
-
172
- ## Performance
173
-
174
- ### Test Results
175
-
176
- ```
177
- 145 tests passing
178
- - RLM Controller: 24 tests
179
- - Routing Accuracy: 18 tests
180
- - Contrastive Training: 15 tests
181
- - SIMD Operations: 22 tests
182
- - SONA Learning: 19 tests
183
- - Memory/HNSW: 21 tests
184
- - Benchmarks: 26 tests
185
- ```
186
-
187
- ### Routing Accuracy (Claude Code Tasks)
188
-
189
- | Strategy | RuvLTRA | Qwen Base |
190
- |----------|---------|-----------|
191
- | Embedding Only | 45% | 40% |
192
- | Keyword-First (Hybrid) | **100%** | 95% |
193
-
194
- ### Inference Performance (M4 Pro)
195
-
196
- | Operation | Performance |
197
- |-----------|-------------|
198
- | Inference | 88-135 tok/s |
199
- | Flash Attention | 320us (seq=2048) |
200
- | HNSW Search | 17-62us |
201
- | SONA Adapt | <1ms |
202
- | RLM Query | 50-200ms |
203
-
204
- ### SIMD Optimizations
205
-
206
- - AVX2/AVX-512 on x86_64
207
- - NEON on ARM64
208
- - 4-8x speedup on vector operations
41
+ | **RuvLTRA Models** | Purpose-built 0.5B & 3B models for Claude Flow |
42
+ | **Task-Specific LoRA** | 5 pre-trained adapters (coder, researcher, security, architect, reviewer) |
43
+ | **HuggingFace Hub** | Download/upload models directly |
44
+ | **Adapter Merging** | TIES, DARE, SLERP strategies |
45
+ | **HNSW Routing** | 150x faster semantic matching |
46
+ | **Evaluation Harness** | SWE-Bench testing with 5 ablation modes |
47
+ | **Auto-Dimension** | HNSW auto-detects model embedding size |
48
+ | **mistral-rs Backend** | Production serving with PagedAttention, X-LoRA, ISQ (5-10x concurrent users) |
209
49
 
210
50
  ## CLI Usage
211
51
 
@@ -226,101 +66,6 @@ ruvllm bench ./models/model.gguf
226
66
  ruvllm eval --model ./models/model.gguf --subset lite --max-tasks 50
227
67
  ```
228
68
 
229
- ## Training
230
-
231
- ### Routing Dataset Generation
232
-
233
- Generate training data for agent routing:
234
-
235
- ```bash
236
- # Generate routing dataset
237
- node scripts/training/routing-dataset.js
238
-
239
- # Output: 381 examples, 793 contrastive pairs
240
- ```
241
-
242
- ### Contrastive Fine-tuning
243
-
244
- Fine-tune models with LoRA adapters:
245
-
246
- ```typescript
247
- import { ContrastiveTrainer, ContrastivePair } from '@ruvector/ruvllm';
248
-
249
- const trainer = new ContrastiveTrainer({
250
- modelPath: './models/base.gguf',
251
- loraRank: 8,
252
- loraAlpha: 16,
253
- learningRate: 1e-4,
254
- });
255
-
256
- // Training pairs from routing dataset
257
- const pairs: ContrastivePair[] = [
258
- {
259
- anchor: 'Fix the authentication bug in login.ts',
260
- positive: 'coder',
261
- negative: 'researcher',
262
- },
263
- // ... more pairs
264
- ];
265
-
266
- await trainer.train(pairs, { epochs: 10, batchSize: 32 });
267
- await trainer.save('./adapters/routing-lora');
268
- ```
269
-
270
- ### Training Scripts
271
-
272
- Located in `scripts/training/`:
273
-
274
- | Script | Description |
275
- |--------|-------------|
276
- | `routing-dataset.js` | Generate 381 routing examples |
277
- | `claude-code-synth.js` | Synthetic data generation |
278
- | `contrastive-finetune.js` | LoRA fine-tuning pipeline |
279
-
280
- ## Model Links
281
-
282
- ### HuggingFace Repository
283
-
284
- **URL**: [https://huggingface.co/ruv/ruvltra](https://huggingface.co/ruv/ruvltra)
285
-
286
- ### Available Models
287
-
288
- | Model | File | Size | Purpose |
289
- |-------|------|------|---------|
290
- | RuvLTRA Claude Code 0.5B | `ruvltra-claude-code-0.5b-q4_k_m.gguf` | ~400MB | Agent routing (100% with hybrid) |
291
- | RuvLTRA Small 0.5B | `ruvltra-0.5b-q4_k_m.gguf` | ~400MB | General embeddings |
292
- | RuvLTRA Medium 3B | `ruvltra-3b-q4_k_m.gguf` | ~2GB | Full LLM inference |
293
-
294
- ### Download Models
295
-
296
- ```bash
297
- # Using CLI
298
- ruvllm download ruv/ruvltra
299
-
300
- # Using HuggingFace CLI
301
- huggingface-cli download ruv/ruvltra ruvltra-claude-code-0.5b-q4_k_m.gguf
302
-
303
- # Programmatic download
304
- import { downloadModel } from '@ruvector/ruvllm';
305
- await downloadModel('ruv/ruvltra', { quantization: 'q4_k_m' });
306
- ```
307
-
308
- ### Environment Variables
309
-
310
- ```bash
311
- # HuggingFace authentication (any of these)
312
- HF_TOKEN=hf_xxx
313
- HUGGING_FACE_HUB_TOKEN=hf_xxx
314
- HUGGINGFACE_API_KEY=hf_xxx
315
- ```
316
-
317
- ### Local Model Storage
318
-
319
- ```bash
320
- ~/.ruvllm/models/ # Downloaded GGUF models
321
- ~/.ruvllm/training/ # Training data and configs
322
- ```
323
-
324
69
  ## API Reference
325
70
 
326
71
  ### RuvLLM Class
@@ -338,10 +83,6 @@ class RuvLLM {
338
83
  // Load a model
339
84
  loadModel(path: string): Promise<void>;
340
85
 
341
- // Memory operations
342
- addMemory(text: string, metadata?: Record<string, unknown>): number;
343
- searchMemory(query: string, topK?: number): MemoryResult[];
344
-
345
86
  // Get SONA learning stats
346
87
  sonaStats(): SonaStats | null;
347
88
 
@@ -350,32 +91,6 @@ class RuvLLM {
350
91
  }
351
92
  ```
352
93
 
353
- ### RlmController Class
354
-
355
- ```typescript
356
- class RlmController {
357
- constructor(config?: RlmConfig, engine?: RuvLLM);
358
-
359
- // Query with recursive retrieval
360
- query(input: string): Promise<RlmAnswer>;
361
-
362
- // Stream query
363
- queryStream(input: string): AsyncGenerator<StreamToken>;
364
-
365
- // Memory management
366
- addMemory(text: string, metadata?: Record<string, unknown>): Promise<string>;
367
- searchMemory(query: string, topK?: number): Promise<MemorySpan[]>;
368
-
369
- // Cache management
370
- clearCache(): void;
371
- getCacheStats(): { size: number; entries: number };
372
-
373
- // Configuration
374
- updateConfig(config: Partial<RlmConfig>): void;
375
- getConfig(): Required<RlmConfig>;
376
- }
377
- ```
378
-
379
94
  ### Configuration
380
95
 
381
96
  ```typescript
@@ -422,6 +137,16 @@ const attended = simd.flashAttention(query, key, value, scale);
422
137
  simd.rmsNorm(hidden, weights, epsilon);
423
138
  ```
424
139
 
140
+ ## Performance (M4 Pro)
141
+
142
+ | Operation | Performance |
143
+ |-----------|-------------|
144
+ | Inference | 88-135 tok/s |
145
+ | Flash Attention | 320µs (seq=2048) |
146
+ | HNSW Search | 17-62µs |
147
+ | SONA Adapt | <1ms |
148
+ | Evaluation | 5 ablation modes |
149
+
425
150
  ## Evaluation Harness
426
151
 
427
152
  Run model evaluations with SWE-Bench integration:
@@ -502,11 +227,11 @@ const response = await llm.query('Write production code');
502
227
 
503
228
  | Platform | Architecture | Status |
504
229
  |----------|--------------|--------|
505
- | macOS | arm64 (M1-M4) | Full support |
506
- | macOS | x64 | Supported |
507
- | Linux | x64 | Supported |
508
- | Linux | arm64 | Supported |
509
- | Windows | x64 | Supported |
230
+ | macOS | arm64 (M1-M4) | ✅ Full support |
231
+ | macOS | x64 | ✅ Supported |
232
+ | Linux | x64 | ✅ Supported |
233
+ | Linux | arm64 | ✅ Supported |
234
+ | Windows | x64 | ✅ Supported |
510
235
 
511
236
  ## Related Packages
512
237
 
@@ -517,7 +242,6 @@ const response = await llm.query('Write production code');
517
242
  ## Links
518
243
 
519
244
  - [GitHub Repository](https://github.com/ruvnet/ruvector)
520
- - [HuggingFace Models](https://huggingface.co/ruv/ruvltra)
521
245
  - [API Documentation](https://docs.rs/ruvllm)
522
246
  - [Crate (Rust)](https://crates.io/crates/ruvllm)
523
247
 
@@ -62,7 +62,7 @@ export * from './training';
62
62
  export * from './contrastive';
63
63
  export * from './models';
64
64
  export * from './benchmarks';
65
- export * from './rlm';
65
+ export * from './intelligence';
66
66
  export { version, hasSimdSupport } from './native';
67
67
  export { RuvLLM as default } from './engine';
68
68
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAGH,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;AAGzB,cAAc,QAAQ,CAAC;AAGvB,cAAc,WAAW,CAAC;AAG1B,cAAc,aAAa,CAAC;AAG5B,cAAc,QAAQ,CAAC;AAGvB,cAAc,aAAa,CAAC;AAG5B,cAAc,QAAQ,CAAC;AAGvB,cAAc,UAAU,CAAC;AAGzB,cAAc,YAAY,CAAC;AAG3B,cAAc,eAAe,CAAC;AAG9B,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC;AAG7B,cAAc,OAAO,CAAC;AAGtB,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGnD,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAGH,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;AAGzB,cAAc,QAAQ,CAAC;AAGvB,cAAc,WAAW,CAAC;AAG1B,cAAc,aAAa,CAAC;AAG5B,cAAc,QAAQ,CAAC;AAGvB,cAAc,aAAa,CAAC;AAG5B,cAAc,QAAQ,CAAC;AAGvB,cAAc,UAAU,CAAC;AAGzB,cAAc,YAAY,CAAC;AAG3B,cAAc,eAAe,CAAC;AAG9B,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC;AAG7B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGnD,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,UAAU,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -92,8 +92,8 @@ __exportStar(require("./contrastive"), exports);
92
92
  __exportStar(require("./models"), exports);
93
93
  // Benchmarks for Claude Code use cases
94
94
  __exportStar(require("./benchmarks"), exports);
95
- // RLM - Retrieval Language Model
96
- __exportStar(require("./rlm"), exports);
95
+ // External Intelligence Providers (ADR-043)
96
+ __exportStar(require("./intelligence"), exports);
97
97
  // Native bindings utilities
98
98
  var native_1 = require("./native");
99
99
  Object.defineProperty(exports, "version", { enumerable: true, get: function () { return native_1.version; } });
@@ -101,4 +101,4 @@ Object.defineProperty(exports, "hasSimdSupport", { enumerable: true, get: functi
101
101
  // Default export
102
102
  var engine_1 = require("./engine");
103
103
  Object.defineProperty(exports, "default", { enumerable: true, get: function () { return engine_1.RuvLLM; } });
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxhQUFhO0FBQ2IsMENBQXdCO0FBRXhCLGNBQWM7QUFDZCwyQ0FBeUI7QUFFekIsa0JBQWtCO0FBQ2xCLHlDQUF1QjtBQUV2QixxQkFBcUI7QUFDckIsNENBQTBCO0FBRTFCLG9CQUFvQjtBQUNwQiw4Q0FBNEI7QUFFNUIsdUJBQXVCO0FBQ3ZCLHlDQUF1QjtBQUV2QixxQkFBcUI7QUFDckIsOENBQTRCO0FBRTVCLGdCQUFnQjtBQUNoQix5Q0FBdUI7QUFFdkIsdUJBQXVCO0FBQ3ZCLDJDQUF5QjtBQUV6QixvQkFBb0I7QUFDcEIsNkNBQTJCO0FBRTNCLDBCQUEwQjtBQUMxQixnREFBOEI7QUFFOUIsZ0NBQWdDO0FBQ2hDLDJDQUF5QjtBQUV6Qix1Q0FBdUM7QUFDdkMsK0NBQTZCO0FBRTdCLGlDQUFpQztBQUNqQyx3Q0FBc0I7QUFFdEIsNEJBQTRCO0FBQzVCLG1DQUFtRDtBQUExQyxpR0FBQSxPQUFPLE9BQUE7QUFBRSx3R0FBQSxjQUFjLE9BQUE7QUFFaEMsaUJBQWlCO0FBQ2pCLG1DQUE2QztBQUFwQyxpR0FBQSxNQUFNLE9BQVciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBydXZlY3Rvci9ydXZsbG0gLSBTZWxmLWxlYXJuaW5nIExMTSBvcmNoZXN0cmF0aW9uXG4gKlxuICogUnV2TExNIGNvbWJpbmVzIFNPTkEgYWRhcHRpdmUgbGVhcm5pbmcgd2l0aCBITlNXIG1lbW9yeSxcbiAqIEZhc3RHUk5OIHJvdXRpbmcsIGFuZCBTSU1ELW9wdGltaXplZCBpbmZlcmVuY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFJ1dkxMTSwgU2Vzc2lvbk1hbmFnZXIsIFNvbmFDb29yZGluYXRvciB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IGxsbSA9IG5ldyBSdXZMTE0oeyBsZWFybmluZ0VuYWJsZWQ6IHRydWUgfSk7XG4gKiBjb25zdCBzZXNzaW9ucyA9IG5ldyBTZXNzaW9uTWFuYWdlcihsbG0pO1xuICogY29uc3Qgc29uYSA9IG5ldyBTb25hQ29vcmRpbmF0b3IoKTtcbiAqXG4gKiAvLyBRdWVyeSB3aXRoIHNlc3Npb24gY29udGV4dFxuICogY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25zLmNyZWF0ZSgpO1xuICogY29uc3QgcmVzcG9uc2UgPSBzZXNzaW9ucy5jaGF0KHNlc3Npb24uaWQsICdXaGF0IGlzIEFJPycpO1xuICpcbiAqIC8vIFRyYWNrIGxlYXJuaW5nIHRyYWplY3RvcnlcbiAqIGNvbnN0IHRyYWplY3RvcnkgPSBuZXcgVHJhamVjdG9yeUJ1aWxkZXIoKVxuICogICAuc3RhcnRTdGVwKCdxdWVyeScsICdXaGF0IGlzIEFJPycpXG4gKiAgIC5lbmRTdGVwKHJlc3BvbnNlLnRleHQsIHJlc3BvbnNlLmNvbmZpZGVuY2UpXG4gKiAgIC5jb21wbGV0ZSgnc3VjY2VzcycpO1xuICpcbiAqIHNvbmEucmVjb3JkVHJhamVjdG9yeSh0cmFqZWN0b3J5KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEZlZGVyYXRlZCBMZWFybmluZ1xuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRXBoZW1lcmFsQWdlbnQsIEZlZGVyYXRlZENvb3JkaW5hdG9yIH0gZnJvbSAnQHJ1dmVjdG9yL3J1dmxsbSc7XG4gKlxuICogLy8gQ2VudHJhbCBjb29yZGluYXRvclxuICogY29uc3QgY29vcmRpbmF0b3IgPSBuZXcgRmVkZXJhdGVkQ29vcmRpbmF0b3IoJ2Nvb3JkLTEnKTtcbiAqXG4gKiAvLyBFcGhlbWVyYWwgYWdlbnRzIHByb2Nlc3MgdGFza3MgYW5kIGV4cG9ydFxuICogY29uc3QgYWdlbnQgPSBuZXcgRXBoZW1lcmFsQWdlbnQoJ2FnZW50LTEnKTtcbiAqIGFnZW50LnByb2Nlc3NUYXNrKGVtYmVkZGluZywgMC45KTtcbiAqIGNvbnN0IGV4cG9ydERhdGEgPSBhZ2VudC5leHBvcnRTdGF0ZSgpO1xuICpcbiAqIC8vIEFnZ3JlZ2F0ZSBsZWFybmluZ1xuICogY29vcmRpbmF0b3IuYWdncmVnYXRlKGV4cG9ydERhdGEpO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgTG9SQSBBZGFwdGVyc1xuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgTG9yYUFkYXB0ZXIsIExvcmFNYW5hZ2VyIH0gZnJvbSAnQHJ1dmVjdG9yL3J1dmxsbSc7XG4gKlxuICogY29uc3QgYWRhcHRlciA9IG5ldyBMb3JhQWRhcHRlcih7IHJhbms6IDgsIGFscGhhOiAxNiB9KTtcbiAqIGNvbnN0IG91dHB1dCA9IGFkYXB0ZXIuZm9yd2FyZChpbnB1dCk7XG4gKiBgYGBcbiAqL1xuXG4vLyBDb3JlIHR5cGVzXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcblxuLy8gTWFpbiBlbmdpbmVcbmV4cG9ydCAqIGZyb20gJy4vZW5naW5lJztcblxuLy8gU0lNRCBvcGVyYXRpb25zXG5leHBvcnQgKiBmcm9tICcuL3NpbWQnO1xuXG4vLyBTZXNzaW9uIG1hbmFnZW1lbnRcbmV4cG9ydCAqIGZyb20gJy4vc2Vzc2lvbic7XG5cbi8vIFN0cmVhbWluZyBzdXBwb3J0XG5leHBvcnQgKiBmcm9tICcuL3N0cmVhbWluZyc7XG5cbi8vIFNPTkEgbGVhcm5pbmcgc3lzdGVtXG5leHBvcnQgKiBmcm9tICcuL3NvbmEnO1xuXG4vLyBGZWRlcmF0ZWQgbGVhcm5pbmdcbmV4cG9ydCAqIGZyb20gJy4vZmVkZXJhdGVkJztcblxuLy8gTG9SQSBhZGFwdGVyc1xuZXhwb3J0ICogZnJvbSAnLi9sb3JhJztcblxuLy8gRXhwb3J0L3NlcmlhbGl6YXRpb25cbmV4cG9ydCAqIGZyb20gJy4vZXhwb3J0JztcblxuLy8gVHJhaW5pbmcgcGlwZWxpbmVcbmV4cG9ydCAqIGZyb20gJy4vdHJhaW5pbmcnO1xuXG4vLyBDb250cmFzdGl2ZSBmaW5lLXR1bmluZ1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFzdGl2ZSc7XG5cbi8vIE1vZGVsIGRvd25sb2FkZXIgYW5kIHJlZ2lzdHJ5XG5leHBvcnQgKiBmcm9tICcuL21vZGVscyc7XG5cbi8vIEJlbmNobWFya3MgZm9yIENsYXVkZSBDb2RlIHVzZSBjYXNlc1xuZXhwb3J0ICogZnJvbSAnLi9iZW5jaG1hcmtzJztcblxuLy8gUkxNIC0gUmV0cmlldmFsIExhbmd1YWdlIE1vZGVsXG5leHBvcnQgKiBmcm9tICcuL3JsbSc7XG5cbi8vIE5hdGl2ZSBiaW5kaW5ncyB1dGlsaXRpZXNcbmV4cG9ydCB7IHZlcnNpb24sIGhhc1NpbWRTdXBwb3J0IH0gZnJvbSAnLi9uYXRpdmUnO1xuXG4vLyBEZWZhdWx0IGV4cG9ydFxuZXhwb3J0IHsgUnV2TExNIGFzIGRlZmF1bHQgfSBmcm9tICcuL2VuZ2luZSc7XG4iXX0=
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxhQUFhO0FBQ2IsMENBQXdCO0FBRXhCLGNBQWM7QUFDZCwyQ0FBeUI7QUFFekIsa0JBQWtCO0FBQ2xCLHlDQUF1QjtBQUV2QixxQkFBcUI7QUFDckIsNENBQTBCO0FBRTFCLG9CQUFvQjtBQUNwQiw4Q0FBNEI7QUFFNUIsdUJBQXVCO0FBQ3ZCLHlDQUF1QjtBQUV2QixxQkFBcUI7QUFDckIsOENBQTRCO0FBRTVCLGdCQUFnQjtBQUNoQix5Q0FBdUI7QUFFdkIsdUJBQXVCO0FBQ3ZCLDJDQUF5QjtBQUV6QixvQkFBb0I7QUFDcEIsNkNBQTJCO0FBRTNCLDBCQUEwQjtBQUMxQixnREFBOEI7QUFFOUIsZ0NBQWdDO0FBQ2hDLDJDQUF5QjtBQUV6Qix1Q0FBdUM7QUFDdkMsK0NBQTZCO0FBRTdCLDRDQUE0QztBQUM1QyxpREFBK0I7QUFFL0IsNEJBQTRCO0FBQzVCLG1DQUFtRDtBQUExQyxpR0FBQSxPQUFPLE9BQUE7QUFBRSx3R0FBQSxjQUFjLE9BQUE7QUFFaEMsaUJBQWlCO0FBQ2pCLG1DQUE2QztBQUFwQyxpR0FBQSxNQUFNLE9BQVciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBydXZlY3Rvci9ydXZsbG0gLSBTZWxmLWxlYXJuaW5nIExMTSBvcmNoZXN0cmF0aW9uXG4gKlxuICogUnV2TExNIGNvbWJpbmVzIFNPTkEgYWRhcHRpdmUgbGVhcm5pbmcgd2l0aCBITlNXIG1lbW9yeSxcbiAqIEZhc3RHUk5OIHJvdXRpbmcsIGFuZCBTSU1ELW9wdGltaXplZCBpbmZlcmVuY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFJ1dkxMTSwgU2Vzc2lvbk1hbmFnZXIsIFNvbmFDb29yZGluYXRvciB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IGxsbSA9IG5ldyBSdXZMTE0oeyBsZWFybmluZ0VuYWJsZWQ6IHRydWUgfSk7XG4gKiBjb25zdCBzZXNzaW9ucyA9IG5ldyBTZXNzaW9uTWFuYWdlcihsbG0pO1xuICogY29uc3Qgc29uYSA9IG5ldyBTb25hQ29vcmRpbmF0b3IoKTtcbiAqXG4gKiAvLyBRdWVyeSB3aXRoIHNlc3Npb24gY29udGV4dFxuICogY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25zLmNyZWF0ZSgpO1xuICogY29uc3QgcmVzcG9uc2UgPSBzZXNzaW9ucy5jaGF0KHNlc3Npb24uaWQsICdXaGF0IGlzIEFJPycpO1xuICpcbiAqIC8vIFRyYWNrIGxlYXJuaW5nIHRyYWplY3RvcnlcbiAqIGNvbnN0IHRyYWplY3RvcnkgPSBuZXcgVHJhamVjdG9yeUJ1aWxkZXIoKVxuICogICAuc3RhcnRTdGVwKCdxdWVyeScsICdXaGF0IGlzIEFJPycpXG4gKiAgIC5lbmRTdGVwKHJlc3BvbnNlLnRleHQsIHJlc3BvbnNlLmNvbmZpZGVuY2UpXG4gKiAgIC5jb21wbGV0ZSgnc3VjY2VzcycpO1xuICpcbiAqIHNvbmEucmVjb3JkVHJhamVjdG9yeSh0cmFqZWN0b3J5KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEZlZGVyYXRlZCBMZWFybmluZ1xuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRXBoZW1lcmFsQWdlbnQsIEZlZGVyYXRlZENvb3JkaW5hdG9yIH0gZnJvbSAnQHJ1dmVjdG9yL3J1dmxsbSc7XG4gKlxuICogLy8gQ2VudHJhbCBjb29yZGluYXRvclxuICogY29uc3QgY29vcmRpbmF0b3IgPSBuZXcgRmVkZXJhdGVkQ29vcmRpbmF0b3IoJ2Nvb3JkLTEnKTtcbiAqXG4gKiAvLyBFcGhlbWVyYWwgYWdlbnRzIHByb2Nlc3MgdGFza3MgYW5kIGV4cG9ydFxuICogY29uc3QgYWdlbnQgPSBuZXcgRXBoZW1lcmFsQWdlbnQoJ2FnZW50LTEnKTtcbiAqIGFnZW50LnByb2Nlc3NUYXNrKGVtYmVkZGluZywgMC45KTtcbiAqIGNvbnN0IGV4cG9ydERhdGEgPSBhZ2VudC5leHBvcnRTdGF0ZSgpO1xuICpcbiAqIC8vIEFnZ3JlZ2F0ZSBsZWFybmluZ1xuICogY29vcmRpbmF0b3IuYWdncmVnYXRlKGV4cG9ydERhdGEpO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgTG9SQSBBZGFwdGVyc1xuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgTG9yYUFkYXB0ZXIsIExvcmFNYW5hZ2VyIH0gZnJvbSAnQHJ1dmVjdG9yL3J1dmxsbSc7XG4gKlxuICogY29uc3QgYWRhcHRlciA9IG5ldyBMb3JhQWRhcHRlcih7IHJhbms6IDgsIGFscGhhOiAxNiB9KTtcbiAqIGNvbnN0IG91dHB1dCA9IGFkYXB0ZXIuZm9yd2FyZChpbnB1dCk7XG4gKiBgYGBcbiAqL1xuXG4vLyBDb3JlIHR5cGVzXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcblxuLy8gTWFpbiBlbmdpbmVcbmV4cG9ydCAqIGZyb20gJy4vZW5naW5lJztcblxuLy8gU0lNRCBvcGVyYXRpb25zXG5leHBvcnQgKiBmcm9tICcuL3NpbWQnO1xuXG4vLyBTZXNzaW9uIG1hbmFnZW1lbnRcbmV4cG9ydCAqIGZyb20gJy4vc2Vzc2lvbic7XG5cbi8vIFN0cmVhbWluZyBzdXBwb3J0XG5leHBvcnQgKiBmcm9tICcuL3N0cmVhbWluZyc7XG5cbi8vIFNPTkEgbGVhcm5pbmcgc3lzdGVtXG5leHBvcnQgKiBmcm9tICcuL3NvbmEnO1xuXG4vLyBGZWRlcmF0ZWQgbGVhcm5pbmdcbmV4cG9ydCAqIGZyb20gJy4vZmVkZXJhdGVkJztcblxuLy8gTG9SQSBhZGFwdGVyc1xuZXhwb3J0ICogZnJvbSAnLi9sb3JhJztcblxuLy8gRXhwb3J0L3NlcmlhbGl6YXRpb25cbmV4cG9ydCAqIGZyb20gJy4vZXhwb3J0JztcblxuLy8gVHJhaW5pbmcgcGlwZWxpbmVcbmV4cG9ydCAqIGZyb20gJy4vdHJhaW5pbmcnO1xuXG4vLyBDb250cmFzdGl2ZSBmaW5lLXR1bmluZ1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFzdGl2ZSc7XG5cbi8vIE1vZGVsIGRvd25sb2FkZXIgYW5kIHJlZ2lzdHJ5XG5leHBvcnQgKiBmcm9tICcuL21vZGVscyc7XG5cbi8vIEJlbmNobWFya3MgZm9yIENsYXVkZSBDb2RlIHVzZSBjYXNlc1xuZXhwb3J0ICogZnJvbSAnLi9iZW5jaG1hcmtzJztcblxuLy8gRXh0ZXJuYWwgSW50ZWxsaWdlbmNlIFByb3ZpZGVycyAoQURSLTA0MylcbmV4cG9ydCAqIGZyb20gJy4vaW50ZWxsaWdlbmNlJztcblxuLy8gTmF0aXZlIGJpbmRpbmdzIHV0aWxpdGllc1xuZXhwb3J0IHsgdmVyc2lvbiwgaGFzU2ltZFN1cHBvcnQgfSBmcm9tICcuL25hdGl2ZSc7XG5cbi8vIERlZmF1bHQgZXhwb3J0XG5leHBvcnQgeyBSdXZMTE0gYXMgZGVmYXVsdCB9IGZyb20gJy4vZW5naW5lJztcbiJdfQ==
@@ -0,0 +1,136 @@
1
+ /**
2
+ * External Intelligence Providers for SONA Learning (ADR-043)
3
+ *
4
+ * TypeScript bindings for the IntelligenceProvider trait, enabling
5
+ * external systems to feed quality signals into RuvLLM's learning loops.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { IntelligenceLoader, FileSignalProvider, QualitySignal } from '@ruvector/ruvllm';
10
+ *
11
+ * const loader = new IntelligenceLoader();
12
+ * loader.registerProvider(new FileSignalProvider('./signals.json'));
13
+ *
14
+ * const { signals, errors } = loader.loadAllSignals();
15
+ * console.log(`Loaded ${signals.length} signals`);
16
+ * ```
17
+ */
18
+ /**
19
+ * A quality signal from an external system.
20
+ *
21
+ * Represents one completed task with quality assessment data
22
+ * that can feed into SONA trajectories, the embedding classifier,
23
+ * and model router calibration.
24
+ */
25
+ export interface QualitySignal {
26
+ /** Unique identifier for this signal */
27
+ id: string;
28
+ /** Human-readable task description (used for embedding generation) */
29
+ taskDescription: string;
30
+ /** Execution outcome */
31
+ outcome: 'success' | 'partial_success' | 'failure';
32
+ /** Composite quality score (0.0 - 1.0) */
33
+ qualityScore: number;
34
+ /** Optional human verdict */
35
+ humanVerdict?: 'approved' | 'rejected';
36
+ /** Optional structured quality factors for detailed analysis */
37
+ qualityFactors?: QualityFactors;
38
+ /** ISO 8601 timestamp of task completion */
39
+ completedAt: string;
40
+ }
41
+ /**
42
+ * Granular quality factor breakdown.
43
+ *
44
+ * Not all providers will have all factors. Undefined fields mean
45
+ * "not assessed" (distinct from 0.0, which means "assessed as zero").
46
+ */
47
+ export interface QualityFactors {
48
+ acceptanceCriteriaMet?: number;
49
+ testsPassing?: number;
50
+ noRegressions?: number;
51
+ lintClean?: number;
52
+ typeCheckClean?: number;
53
+ followsPatterns?: number;
54
+ contextRelevance?: number;
55
+ reasoningCoherence?: number;
56
+ executionEfficiency?: number;
57
+ }
58
+ /**
59
+ * Quality weight overrides from a provider.
60
+ *
61
+ * Weights should sum to approximately 1.0.
62
+ */
63
+ export interface ProviderQualityWeights {
64
+ taskCompletion: number;
65
+ codeQuality: number;
66
+ process: number;
67
+ }
68
+ /**
69
+ * Error from a single provider during batch loading.
70
+ */
71
+ export interface ProviderError {
72
+ providerName: string;
73
+ message: string;
74
+ }
75
+ /**
76
+ * Result from a single provider during grouped loading.
77
+ */
78
+ export interface ProviderResult {
79
+ providerName: string;
80
+ signals: QualitySignal[];
81
+ weights?: ProviderQualityWeights;
82
+ }
83
+ /**
84
+ * Interface for external systems that supply quality signals to RuvLLM.
85
+ *
86
+ * Implement this interface and register with IntelligenceLoader.
87
+ */
88
+ export interface IntelligenceProvider {
89
+ /** Human-readable name for this provider */
90
+ name(): string;
91
+ /** Load quality signals from this provider's data source */
92
+ loadSignals(): QualitySignal[];
93
+ /** Optional quality weight overrides */
94
+ qualityWeights?(): ProviderQualityWeights | undefined;
95
+ }
96
+ /**
97
+ * Built-in file-based intelligence provider.
98
+ *
99
+ * Reads quality signals from a JSON file. This is the default provider
100
+ * for non-Rust integrations that write signal files.
101
+ */
102
+ export declare class FileSignalProvider implements IntelligenceProvider {
103
+ private readonly filePath;
104
+ constructor(filePath: string);
105
+ name(): string;
106
+ loadSignals(): QualitySignal[];
107
+ qualityWeights(): ProviderQualityWeights | undefined;
108
+ }
109
+ /**
110
+ * Aggregates quality signals from multiple registered providers.
111
+ *
112
+ * If no providers are registered, loadAllSignals returns empty arrays
113
+ * with zero overhead.
114
+ */
115
+ export declare class IntelligenceLoader {
116
+ private providers;
117
+ /** Register an external intelligence provider */
118
+ registerProvider(provider: IntelligenceProvider): void;
119
+ /** Returns the number of registered providers */
120
+ get providerCount(): number;
121
+ /** Returns the names of all registered providers */
122
+ get providerNames(): string[];
123
+ /**
124
+ * Load signals from all registered providers.
125
+ *
126
+ * Non-fatal: if a provider fails, its error is captured but
127
+ * other providers continue loading.
128
+ */
129
+ loadAllSignals(): {
130
+ signals: QualitySignal[];
131
+ errors: ProviderError[];
132
+ };
133
+ /** Load signals grouped by provider with weight overrides */
134
+ loadGrouped(): ProviderResult[];
135
+ }
136
+ //# sourceMappingURL=intelligence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../src/intelligence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACnD,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,gEAAgE;IAChE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,IAAI,IAAI,MAAM,CAAC;IACf,4DAA4D;IAC5D,WAAW,IAAI,aAAa,EAAE,CAAC;IAC/B,wCAAwC;IACxC,cAAc,CAAC,IAAI,sBAAsB,GAAG,SAAS,CAAC;CACvD;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,EAAE,MAAM;IAI5B,IAAI,IAAI,MAAM;IAId,WAAW,IAAI,aAAa,EAAE;IA8B9B,cAAc,IAAI,sBAAsB,GAAG,SAAS;CAiBrD;AAgBD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAA8B;IAE/C,iDAAiD;IACjD,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAItD,iDAAiD;IACjD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,oDAAoD;IACpD,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED;;;;;OAKG;IACH,cAAc,IAAI;QAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAAC,MAAM,EAAE,aAAa,EAAE,CAAA;KAAE;IAmBvE,6DAA6D;IAC7D,WAAW,IAAI,cAAc,EAAE;CAehC"}