@ruvector/ruvllm 2.7.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/GPU-LOOP.md +229 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +9 -0
  4. package/README.md +157 -263
  5. package/examples/gpu-loop.example.json +26 -0
  6. package/package.json +50 -120
  7. package/src/adapters-cli.mjs +23 -0
  8. package/src/adapters.mjs +91 -0
  9. package/src/cli.mjs +30 -0
  10. package/src/engine.mjs +238 -0
  11. package/src/fixture.mjs +38 -0
  12. package/src/gpu-host.mjs +47 -0
  13. package/src/gpu-loop-cli.mjs +67 -0
  14. package/src/gpu-loop.mjs +184 -0
  15. package/src/gpu-spool-adapter.mjs +80 -0
  16. package/src/vast-host-adapter.mjs +274 -0
  17. package/bin/cli.js +0 -1020
  18. package/dist/cjs/benchmarks/embedding-benchmark.d.ts +0 -102
  19. package/dist/cjs/benchmarks/embedding-benchmark.d.ts.map +0 -1
  20. package/dist/cjs/benchmarks/embedding-benchmark.js +0 -436
  21. package/dist/cjs/benchmarks/index.d.ts +0 -34
  22. package/dist/cjs/benchmarks/index.d.ts.map +0 -1
  23. package/dist/cjs/benchmarks/index.js +0 -132
  24. package/dist/cjs/benchmarks/model-comparison.d.ts +0 -71
  25. package/dist/cjs/benchmarks/model-comparison.d.ts.map +0 -1
  26. package/dist/cjs/benchmarks/model-comparison.js +0 -476
  27. package/dist/cjs/benchmarks/routing-benchmark.d.ts +0 -70
  28. package/dist/cjs/benchmarks/routing-benchmark.d.ts.map +0 -1
  29. package/dist/cjs/benchmarks/routing-benchmark.js +0 -289
  30. package/dist/cjs/contrastive.d.ts +0 -229
  31. package/dist/cjs/contrastive.d.ts.map +0 -1
  32. package/dist/cjs/contrastive.js +0 -589
  33. package/dist/cjs/engine.d.ts +0 -95
  34. package/dist/cjs/engine.d.ts.map +0 -1
  35. package/dist/cjs/engine.js +0 -372
  36. package/dist/cjs/export.d.ts +0 -182
  37. package/dist/cjs/export.d.ts.map +0 -1
  38. package/dist/cjs/export.js +0 -422
  39. package/dist/cjs/federated.d.ts +0 -233
  40. package/dist/cjs/federated.d.ts.map +0 -1
  41. package/dist/cjs/federated.js +0 -525
  42. package/dist/cjs/index.d.ts +0 -68
  43. package/dist/cjs/index.d.ts.map +0 -1
  44. package/dist/cjs/index.js +0 -104
  45. package/dist/cjs/intelligence.d.ts +0 -136
  46. package/dist/cjs/intelligence.d.ts.map +0 -1
  47. package/dist/cjs/intelligence.js +0 -226
  48. package/dist/cjs/lora.d.ts +0 -251
  49. package/dist/cjs/lora.d.ts.map +0 -1
  50. package/dist/cjs/lora.js +0 -509
  51. package/dist/cjs/models.d.ts +0 -129
  52. package/dist/cjs/models.d.ts.map +0 -1
  53. package/dist/cjs/models.js +0 -323
  54. package/dist/cjs/native.d.ts +0 -92
  55. package/dist/cjs/native.d.ts.map +0 -1
  56. package/dist/cjs/native.js +0 -77
  57. package/dist/cjs/session.d.ts +0 -80
  58. package/dist/cjs/session.d.ts.map +0 -1
  59. package/dist/cjs/session.js +0 -203
  60. package/dist/cjs/simd.d.ts +0 -90
  61. package/dist/cjs/simd.d.ts.map +0 -1
  62. package/dist/cjs/simd.js +0 -209
  63. package/dist/cjs/sona.d.ts +0 -223
  64. package/dist/cjs/sona.d.ts.map +0 -1
  65. package/dist/cjs/sona.js +0 -562
  66. package/dist/cjs/streaming.d.ts +0 -55
  67. package/dist/cjs/streaming.d.ts.map +0 -1
  68. package/dist/cjs/streaming.js +0 -131
  69. package/dist/cjs/training.d.ts +0 -312
  70. package/dist/cjs/training.d.ts.map +0 -1
  71. package/dist/cjs/training.js +0 -610
  72. package/dist/cjs/types.d.ts +0 -615
  73. package/dist/cjs/types.d.ts.map +0 -1
  74. package/dist/cjs/types.js +0 -6
  75. package/dist/esm/benchmarks/embedding-benchmark.d.ts +0 -102
  76. package/dist/esm/benchmarks/embedding-benchmark.d.ts.map +0 -1
  77. package/dist/esm/benchmarks/embedding-benchmark.js +0 -427
  78. package/dist/esm/benchmarks/index.d.ts +0 -34
  79. package/dist/esm/benchmarks/index.d.ts.map +0 -1
  80. package/dist/esm/benchmarks/index.js +0 -110
  81. package/dist/esm/benchmarks/model-comparison.d.ts +0 -71
  82. package/dist/esm/benchmarks/model-comparison.d.ts.map +0 -1
  83. package/dist/esm/benchmarks/model-comparison.js +0 -434
  84. package/dist/esm/benchmarks/routing-benchmark.d.ts +0 -70
  85. package/dist/esm/benchmarks/routing-benchmark.d.ts.map +0 -1
  86. package/dist/esm/benchmarks/routing-benchmark.js +0 -283
  87. package/dist/esm/contrastive.d.ts +0 -229
  88. package/dist/esm/contrastive.d.ts.map +0 -1
  89. package/dist/esm/contrastive.js +0 -578
  90. package/dist/esm/engine.d.ts +0 -95
  91. package/dist/esm/engine.d.ts.map +0 -1
  92. package/dist/esm/engine.js +0 -368
  93. package/dist/esm/export.d.ts +0 -182
  94. package/dist/esm/export.d.ts.map +0 -1
  95. package/dist/esm/export.js +0 -414
  96. package/dist/esm/federated.d.ts +0 -233
  97. package/dist/esm/federated.d.ts.map +0 -1
  98. package/dist/esm/federated.js +0 -520
  99. package/dist/esm/index.d.ts +0 -68
  100. package/dist/esm/index.d.ts.map +0 -1
  101. package/dist/esm/index.js +0 -84
  102. package/dist/esm/intelligence.d.ts +0 -136
  103. package/dist/esm/intelligence.d.ts.map +0 -1
  104. package/dist/esm/intelligence.js +0 -188
  105. package/dist/esm/lora.d.ts +0 -251
  106. package/dist/esm/lora.d.ts.map +0 -1
  107. package/dist/esm/lora.js +0 -504
  108. package/dist/esm/models.d.ts +0 -129
  109. package/dist/esm/models.d.ts.map +0 -1
  110. package/dist/esm/models.js +0 -282
  111. package/dist/esm/native.d.ts +0 -92
  112. package/dist/esm/native.d.ts.map +0 -1
  113. package/dist/esm/native.js +0 -72
  114. package/dist/esm/session.d.ts +0 -80
  115. package/dist/esm/session.d.ts.map +0 -1
  116. package/dist/esm/session.js +0 -199
  117. package/dist/esm/simd.d.ts +0 -90
  118. package/dist/esm/simd.d.ts.map +0 -1
  119. package/dist/esm/simd.js +0 -205
  120. package/dist/esm/sona.d.ts +0 -223
  121. package/dist/esm/sona.d.ts.map +0 -1
  122. package/dist/esm/sona.js +0 -556
  123. package/dist/esm/streaming.d.ts +0 -55
  124. package/dist/esm/streaming.d.ts.map +0 -1
  125. package/dist/esm/streaming.js +0 -126
  126. package/dist/esm/training.d.ts +0 -312
  127. package/dist/esm/training.d.ts.map +0 -1
  128. package/dist/esm/training.js +0 -603
  129. package/dist/esm/types.d.ts +0 -615
  130. package/dist/esm/types.d.ts.map +0 -1
  131. package/dist/esm/types.js +0 -5
  132. package/scripts/ensemble-model-compare.js +0 -287
  133. package/scripts/fix-esm-extensions.mjs +0 -181
  134. package/scripts/huggingface/README.md +0 -537
  135. package/scripts/huggingface/publish.sh +0 -112
  136. package/scripts/hybrid-model-compare.js +0 -373
  137. package/scripts/improved-model-compare.js +0 -288
  138. package/scripts/optimized-model-compare.js +0 -364
  139. package/scripts/real-model-compare.js +0 -280
  140. package/scripts/smoke-esm.mjs +0 -82
  141. package/scripts/training/agentic-flow-capabilities.json +0 -329
  142. package/scripts/training/claude-code-synth.js +0 -505
  143. package/scripts/training/claude-flow-capabilities.json +0 -1322
  144. package/scripts/training/claude-hard-negatives.js +0 -222
  145. package/scripts/training/contrastive-finetune.js +0 -517
  146. package/scripts/training/ecosystem-triplets.jsonl +0 -1467
  147. package/scripts/training/generate-ecosystem-triplets.js +0 -1324
  148. package/scripts/training/routing-dataset.js +0 -634
  149. package/scripts/training/ruvector-capabilities.json +0 -798
  150. package/scripts/training/validate-ecosystem.js +0 -381
  151. package/scripts/training/validation-results.json +0 -23
@@ -1,520 +0,0 @@
1
- /**
2
- * Federated Learning for SONA
3
- *
4
- * Enable distributed learning across ephemeral agents that share
5
- * trajectories with a central coordinator.
6
- *
7
- * Architecture:
8
- * ```
9
- * ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
10
- * │ Agent A │ │ Agent B │ │ Agent C │
11
- * │ (ephemeral) │ │ (ephemeral) │ │ (ephemeral) │
12
- * └──────┬──────┘ └──────┬──────┘ └──────┬──────┘
13
- * │ │ │
14
- * │ export() │ export() │ export()
15
- * ▼ ▼ ▼
16
- * ┌────────────────────────────────────────────────┐
17
- * │ Federated Coordinator │
18
- * │ (persistent, large capacity) │
19
- * └────────────────────────────────────────────────┘
20
- * ```
21
- *
22
- * @example
23
- * ```typescript
24
- * import { EphemeralAgent, FederatedCoordinator } from '@ruvector/ruvllm';
25
- *
26
- * // Create coordinator (persistent)
27
- * const coordinator = new FederatedCoordinator('coord-1', { hiddenDim: 256 });
28
- *
29
- * // Create ephemeral agent
30
- * const agent = new EphemeralAgent('agent-1', { hiddenDim: 256 });
31
- *
32
- * // Agent processes tasks
33
- * agent.processTask([0.1, 0.2, ...], 0.85);
34
- * agent.processTask([0.3, 0.4, ...], 0.92);
35
- *
36
- * // Export and aggregate before agent terminates
37
- * const exportData = agent.exportState();
38
- * const result = coordinator.aggregate(exportData);
39
- *
40
- * console.log(`Accepted: ${result.trajectoriesAccepted}`);
41
- * ```
42
- */
43
- import { ReasoningBank } from './sona.js';
44
- /**
45
- * Default federated config
46
- */
47
- const DEFAULT_FEDERATED_CONFIG = {
48
- hiddenDim: 256,
49
- embeddingDim: 256,
50
- microLoraRank: 2,
51
- baseLoraRank: 8,
52
- trajectoryCapacity: 500,
53
- patternClusters: 25,
54
- ewcLambda: 2000,
55
- qualityThreshold: 0.4,
56
- };
57
- /**
58
- * Ephemeral Agent for federated learning
59
- *
60
- * Collects trajectories during its session and exports state before termination.
61
- *
62
- * @example
63
- * ```typescript
64
- * const agent = new EphemeralAgent('agent-1', { hiddenDim: 256 });
65
- *
66
- * // Process tasks during session
67
- * agent.processTask(embedding1, 0.85);
68
- * agent.processTaskWithRoute(embedding2, 0.92, 'code-model');
69
- *
70
- * // Export before termination
71
- * const exportData = agent.exportState();
72
- * ```
73
- */
74
- export class EphemeralAgent {
75
- constructor(agentId, config) {
76
- this.trajectories = [];
77
- this.qualitySamples = [];
78
- this.loraWeights = [];
79
- this.agentId = agentId;
80
- this.config = { ...DEFAULT_FEDERATED_CONFIG, ...config };
81
- this.startTime = Date.now();
82
- this.reasoningBank = new ReasoningBank(0.7);
83
- // Initialize micro-LoRA weights
84
- this.loraWeights = new Array(this.config.hiddenDim * this.config.microLoraRank)
85
- .fill(0)
86
- .map(() => (Math.random() - 0.5) * 0.01);
87
- }
88
- /**
89
- * Get agent ID
90
- */
91
- getAgentId() {
92
- return this.agentId;
93
- }
94
- /**
95
- * Process a task and record trajectory
96
- */
97
- processTrajectory(embedding, activations, quality, route, context = []) {
98
- const now = Date.now();
99
- // Store trajectory for export
100
- this.trajectories.push({
101
- embedding: [...embedding],
102
- quality,
103
- route,
104
- context: [...context],
105
- timestamp: now,
106
- });
107
- this.qualitySamples.push(quality);
108
- // Store in local reasoning bank if high quality
109
- if (quality >= 0.7) {
110
- this.reasoningBank.store('query_response', embedding);
111
- }
112
- // Update local LoRA weights based on quality
113
- this.updateLoraWeights(embedding, quality);
114
- }
115
- /**
116
- * Simple process task method
117
- */
118
- processTask(embedding, quality) {
119
- this.processTrajectory(embedding, embedding, quality);
120
- }
121
- /**
122
- * Process task with route information
123
- */
124
- processTaskWithRoute(embedding, quality, route) {
125
- this.processTrajectory(embedding, embedding, quality, route);
126
- }
127
- /**
128
- * Apply micro-LoRA to hidden states
129
- */
130
- applyMicroLora(input, output) {
131
- const rank = this.config.microLoraRank;
132
- const dim = Math.min(input.length, this.config.hiddenDim);
133
- // Simple low-rank decomposition: output = input + A @ B @ input
134
- // A is (dim x rank), B is (rank x dim)
135
- for (let i = 0; i < dim; i++) {
136
- let delta = 0;
137
- for (let r = 0; r < rank; r++) {
138
- let bSum = 0;
139
- for (let j = 0; j < dim; j++) {
140
- const bIdx = r * dim + j;
141
- if (bIdx < this.loraWeights.length) {
142
- bSum += this.loraWeights[bIdx] * (input[j] || 0);
143
- }
144
- }
145
- const aIdx = i * rank + r;
146
- if (aIdx < this.loraWeights.length) {
147
- delta += this.loraWeights[aIdx] * bSum;
148
- }
149
- }
150
- output[i] = (input[i] || 0) + delta * 0.1; // Scale factor
151
- }
152
- }
153
- /**
154
- * Get number of collected trajectories
155
- */
156
- trajectoryCount() {
157
- return this.trajectories.length;
158
- }
159
- /**
160
- * Get average quality
161
- */
162
- avgQuality() {
163
- if (this.qualitySamples.length === 0)
164
- return 0;
165
- return this.qualitySamples.reduce((a, b) => a + b, 0) / this.qualitySamples.length;
166
- }
167
- /**
168
- * Get uptime in seconds
169
- */
170
- uptimeSeconds() {
171
- return Math.floor((Date.now() - this.startTime) / 1000);
172
- }
173
- /**
174
- * Get agent stats
175
- */
176
- stats() {
177
- return {
178
- totalTrajectories: this.trajectories.length,
179
- avgQuality: this.avgQuality(),
180
- patternsLearned: this.reasoningBank.stats().totalPatterns,
181
- };
182
- }
183
- /**
184
- * Force local learning
185
- */
186
- forceLearn() {
187
- // Prune low-performing patterns
188
- const pruned = this.reasoningBank.prune(0.3, 3);
189
- return `Pruned ${pruned} patterns, ${this.reasoningBank.stats().totalPatterns} remaining`;
190
- }
191
- /**
192
- * Get learned patterns
193
- */
194
- getPatterns() {
195
- return this.reasoningBank.getByType('query_response');
196
- }
197
- /**
198
- * Clear trajectories (after export)
199
- */
200
- clear() {
201
- this.trajectories = [];
202
- this.qualitySamples = [];
203
- }
204
- /**
205
- * Export agent state for federation
206
- *
207
- * Call this before terminating the agent.
208
- */
209
- exportState() {
210
- // Force learning before export
211
- this.forceLearn();
212
- return {
213
- agentId: this.agentId,
214
- trajectories: [...this.trajectories],
215
- stats: this.stats(),
216
- sessionDurationMs: Date.now() - this.startTime,
217
- timestamp: Date.now(),
218
- };
219
- }
220
- /**
221
- * Serialize to JSON
222
- */
223
- toJSON() {
224
- return JSON.stringify(this.exportState());
225
- }
226
- updateLoraWeights(embedding, quality) {
227
- // Simple gradient update based on quality
228
- const lr = 0.001 * quality;
229
- const dim = Math.min(embedding.length, this.config.hiddenDim);
230
- for (let i = 0; i < Math.min(dim, this.loraWeights.length); i++) {
231
- const grad = embedding[i % embedding.length] * (quality - 0.5);
232
- this.loraWeights[i] += lr * grad;
233
- }
234
- }
235
- }
236
- /**
237
- * Federated Learning Coordinator
238
- *
239
- * Aggregates learning from multiple ephemeral agents.
240
- *
241
- * @example
242
- * ```typescript
243
- * const coordinator = new FederatedCoordinator('coord-1', { hiddenDim: 256 });
244
- *
245
- * // Aggregate exports from multiple agents
246
- * for (const agentExport of agentExports) {
247
- * const result = coordinator.aggregate(agentExport);
248
- * console.log(`Agent ${result.agentId}: ${result.trajectoriesAccepted} accepted`);
249
- * }
250
- *
251
- * // Get coordinator statistics
252
- * const stats = coordinator.stats();
253
- * console.log(`Total patterns: ${stats.patternsLearned}`);
254
- * ```
255
- */
256
- export class FederatedCoordinator {
257
- constructor(coordinatorId, config) {
258
- this.contributions = new Map();
259
- this.totalTrajectories = 0;
260
- this.consolidationInterval = 50;
261
- this.qualitySamples = [];
262
- this.masterLoraWeights = [];
263
- this.coordinatorId = coordinatorId;
264
- this.config = {
265
- ...DEFAULT_FEDERATED_CONFIG,
266
- trajectoryCapacity: 50000, // Large capacity for coordinator
267
- patternClusters: 200,
268
- baseLoraRank: 16, // Deeper for aggregation
269
- ...config,
270
- };
271
- this.reasoningBank = new ReasoningBank(this.config.qualityThreshold);
272
- // Initialize master LoRA weights
273
- this.masterLoraWeights = new Array(this.config.hiddenDim * this.config.baseLoraRank)
274
- .fill(0)
275
- .map(() => (Math.random() - 0.5) * 0.01);
276
- }
277
- /**
278
- * Get coordinator ID
279
- */
280
- getCoordinatorId() {
281
- return this.coordinatorId;
282
- }
283
- /**
284
- * Set quality threshold for accepting trajectories
285
- */
286
- setQualityThreshold(threshold) {
287
- this.config.qualityThreshold = threshold;
288
- }
289
- /**
290
- * Set consolidation interval
291
- */
292
- setConsolidationInterval(interval) {
293
- this.consolidationInterval = interval;
294
- }
295
- /**
296
- * Aggregate agent export into coordinator
297
- */
298
- aggregate(exportData) {
299
- let accepted = 0;
300
- let rejected = 0;
301
- // Replay trajectories into master
302
- for (const traj of exportData.trajectories) {
303
- if (traj.quality >= this.config.qualityThreshold) {
304
- // Store pattern
305
- const patternType = this.routeToPatternType(traj.route);
306
- this.reasoningBank.store(patternType, traj.embedding);
307
- this.qualitySamples.push(traj.quality);
308
- // Update master LoRA weights
309
- this.updateMasterLora(traj.embedding, traj.quality);
310
- accepted++;
311
- }
312
- else {
313
- rejected++;
314
- }
315
- }
316
- this.totalTrajectories += accepted;
317
- // Record contribution
318
- this.contributions.set(exportData.agentId, {
319
- trajectoryCount: exportData.trajectories.length,
320
- avgQuality: exportData.stats.avgQuality,
321
- timestamp: Date.now(),
322
- sessionDurationMs: exportData.sessionDurationMs,
323
- });
324
- // Auto-consolidate if needed
325
- const consolidated = this.shouldConsolidate();
326
- if (consolidated) {
327
- this.forceConsolidate();
328
- }
329
- return {
330
- agentId: exportData.agentId,
331
- trajectoriesAccepted: accepted,
332
- trajectoriesRejected: rejected,
333
- consolidated,
334
- totalAgents: this.contributions.size,
335
- totalTrajectories: this.totalTrajectories,
336
- };
337
- }
338
- /**
339
- * Force consolidation (learning)
340
- */
341
- forceConsolidate() {
342
- const pruned = this.reasoningBank.prune(0.3, 5);
343
- return `Consolidated: pruned ${pruned} patterns, ${this.reasoningBank.stats().totalPatterns} remaining`;
344
- }
345
- /**
346
- * Consolidate learning (alias)
347
- */
348
- consolidate() {
349
- return this.forceConsolidate();
350
- }
351
- /**
352
- * Get initial patterns for new agents (warm start)
353
- */
354
- getInitialPatterns(k = 10) {
355
- const allPatterns = [
356
- ...this.reasoningBank.getByType('query_response'),
357
- ...this.reasoningBank.getByType('routing'),
358
- ];
359
- // Sort by success rate and return top k
360
- return allPatterns
361
- .sort((a, b) => b.successRate - a.successRate)
362
- .slice(0, k);
363
- }
364
- /**
365
- * Get all learned patterns
366
- */
367
- getAllPatterns() {
368
- return [
369
- ...this.reasoningBank.getByType('query_response'),
370
- ...this.reasoningBank.getByType('routing'),
371
- ...this.reasoningBank.getByType('context_retrieval'),
372
- ...this.reasoningBank.getByType('correction'),
373
- ];
374
- }
375
- /**
376
- * Find similar patterns
377
- */
378
- findPatterns(query, k) {
379
- return this.reasoningBank.findSimilar(query, k);
380
- }
381
- /**
382
- * Apply coordinator's LoRA to input
383
- * OPTIMIZED: Pre-compute hidden layer once, reuse typed arrays
384
- */
385
- applyLora(input) {
386
- const rank = this.config.baseLoraRank;
387
- const dim = Math.min(input.length, this.config.hiddenDim);
388
- const weightsLen = this.masterLoraWeights.length;
389
- // Pre-compute hidden layer (input @ B)
390
- const hidden = new Float64Array(rank);
391
- for (let r = 0; r < rank; r++) {
392
- let sum = 0;
393
- const baseIdx = r * dim;
394
- // Unroll the inner loop
395
- let j = 0;
396
- for (; j + 3 < dim && baseIdx + j + 3 < weightsLen; j += 4) {
397
- sum += this.masterLoraWeights[baseIdx + j] * (input[j] || 0) +
398
- this.masterLoraWeights[baseIdx + j + 1] * (input[j + 1] || 0) +
399
- this.masterLoraWeights[baseIdx + j + 2] * (input[j + 2] || 0) +
400
- this.masterLoraWeights[baseIdx + j + 3] * (input[j + 3] || 0);
401
- }
402
- for (; j < dim && baseIdx + j < weightsLen; j++) {
403
- sum += this.masterLoraWeights[baseIdx + j] * (input[j] || 0);
404
- }
405
- hidden[r] = sum;
406
- }
407
- // Compute output (hidden @ A + input)
408
- const output = new Array(input.length);
409
- for (let i = 0; i < input.length; i++) {
410
- if (i < dim) {
411
- let delta = 0;
412
- const baseIdx = i * rank;
413
- for (let r = 0; r < rank && baseIdx + r < weightsLen; r++) {
414
- delta += this.masterLoraWeights[baseIdx + r] * hidden[r];
415
- }
416
- output[i] = (input[i] || 0) + delta * 0.1;
417
- }
418
- else {
419
- output[i] = input[i] || 0;
420
- }
421
- }
422
- return output;
423
- }
424
- /**
425
- * Get coordinator statistics
426
- */
427
- stats() {
428
- const avgQuality = this.qualitySamples.length > 0
429
- ? this.qualitySamples.reduce((a, b) => a + b, 0) / this.qualitySamples.length
430
- : 0;
431
- return {
432
- coordinatorId: this.coordinatorId,
433
- totalAgents: this.contributions.size,
434
- totalTrajectories: this.totalTrajectories,
435
- patternsLearned: this.reasoningBank.stats().totalPatterns,
436
- avgQuality,
437
- qualityThreshold: this.config.qualityThreshold,
438
- };
439
- }
440
- /**
441
- * Get contribution history
442
- */
443
- getContributions() {
444
- return new Map(this.contributions);
445
- }
446
- /**
447
- * Get total agent count
448
- */
449
- agentCount() {
450
- return this.contributions.size;
451
- }
452
- /**
453
- * Get total trajectory count
454
- */
455
- getTotalTrajectories() {
456
- return this.totalTrajectories;
457
- }
458
- /**
459
- * Clear all contributions
460
- */
461
- clear() {
462
- this.contributions.clear();
463
- this.totalTrajectories = 0;
464
- this.qualitySamples = [];
465
- }
466
- /**
467
- * Export coordinator state
468
- */
469
- toJSON() {
470
- return JSON.stringify({
471
- coordinatorId: this.coordinatorId,
472
- stats: this.stats(),
473
- contributions: Object.fromEntries(this.contributions),
474
- patterns: this.getAllPatterns(),
475
- });
476
- }
477
- /**
478
- * Create agent with coordinator's learned patterns
479
- */
480
- createAgent(agentId) {
481
- const agent = new EphemeralAgent(agentId, {
482
- hiddenDim: this.config.hiddenDim,
483
- embeddingDim: this.config.embeddingDim,
484
- microLoraRank: this.config.microLoraRank,
485
- });
486
- // Warm start: process initial patterns as positive examples
487
- const initialPatterns = this.getInitialPatterns(5);
488
- for (const pattern of initialPatterns) {
489
- agent.processTask(pattern.embedding, pattern.successRate);
490
- }
491
- return agent;
492
- }
493
- shouldConsolidate() {
494
- return this.contributions.size % this.consolidationInterval === 0 &&
495
- this.contributions.size > 0;
496
- }
497
- routeToPatternType(route) {
498
- if (!route)
499
- return 'query_response';
500
- if (route.includes('code'))
501
- return 'query_response';
502
- if (route.includes('route'))
503
- return 'routing';
504
- if (route.includes('memory'))
505
- return 'context_retrieval';
506
- return 'query_response';
507
- }
508
- updateMasterLora(embedding, quality) {
509
- const lr = 0.0005 * quality; // Slower learning for coordinator
510
- const dim = Math.min(embedding.length, this.config.hiddenDim);
511
- for (let i = 0; i < Math.min(dim, this.masterLoraWeights.length); i++) {
512
- const grad = embedding[i % embedding.length] * (quality - 0.5);
513
- this.masterLoraWeights[i] += lr * grad;
514
- // EWC regularization - prevent large weight changes
515
- const penalty = this.config.ewcLambda * this.masterLoraWeights[i] * 0.0001;
516
- this.masterLoraWeights[i] -= penalty;
517
- }
518
- }
519
- }
520
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVkZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZlZGVyYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Q0c7QUFjSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXZDOztHQUVHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBOEI7SUFDMUQsU0FBUyxFQUFFLEdBQUc7SUFDZCxZQUFZLEVBQUUsR0FBRztJQUNqQixhQUFhLEVBQUUsQ0FBQztJQUNoQixZQUFZLEVBQUUsQ0FBQztJQUNmLGtCQUFrQixFQUFFLEdBQUc7SUFDdkIsZUFBZSxFQUFFLEVBQUU7SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixnQkFBZ0IsRUFBRSxHQUFHO0NBQ3RCLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBU3pCLFlBQVksT0FBZSxFQUFFLE1BQXdCO1FBTjdDLGlCQUFZLEdBQXVCLEVBQUUsQ0FBQztRQUV0QyxtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUU5QixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUdqQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyx3QkFBd0IsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFNUMsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7YUFD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QUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGZWRlcmF0ZWQgTGVhcm5pbmcgZm9yIFNPTkFcbiAqXG4gKiBFbmFibGUgZGlzdHJpYnV0ZWQgbGVhcm5pbmcgYWNyb3NzIGVwaGVtZXJhbCBhZ2VudHMgdGhhdCBzaGFyZVxuICogdHJhamVjdG9yaWVzIHdpdGggYSBjZW50cmFsIGNvb3JkaW5hdG9yLlxuICpcbiAqIEFyY2hpdGVjdHVyZTpcbiAqIGBgYFxuICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICog4pSCICBBZ2VudCBBICAgIOKUgiAgICAg4pSCICBBZ2VudCBCICAgIOKUgiAgICAg4pSCICBBZ2VudCBDICAgIOKUglxuICog4pSCIChlcGhlbWVyYWwpIOKUgiAgICAg4pSCIChlcGhlbWVyYWwpIOKUgiAgICAg4pSCIChlcGhlbWVyYWwpIOKUglxuICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgICDilJTilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilJggICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICogICAgICAgIOKUgiAgICAgICAgICAgICAgICAgICDilIIgICAgICAgICAgICAgICAgICAg4pSCXG4gKiAgICAgICAg4pSCICAgIGV4cG9ydCgpICAgICAgIOKUgiAgICBleHBvcnQoKSAgICAgICDilIIgICAgZXhwb3J0KClcbiAqICAgICAgICDilrwgICAgICAgICAgICAgICAgICAg4pa8ICAgICAgICAgICAgICAgICAgIOKWvFxuICogICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAqICAg4pSCICAgICAgICAgICAgRmVkZXJhdGVkIENvb3JkaW5hdG9yICAgICAgICAgICAgICAg4pSCXG4gKiAgIOKUgiAgICAgICAgIChwZXJzaXN0ZW50LCBsYXJnZSBjYXBhY2l0eSkgICAgICAgICAgIOKUglxuICogICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFcGhlbWVyYWxBZ2VudCwgRmVkZXJhdGVkQ29vcmRpbmF0b3IgfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcbiAqXG4gKiAvLyBDcmVhdGUgY29vcmRpbmF0b3IgKHBlcnNpc3RlbnQpXG4gKiBjb25zdCBjb29yZGluYXRvciA9IG5ldyBGZWRlcmF0ZWRDb29yZGluYXRvcignY29vcmQtMScsIHsgaGlkZGVuRGltOiAyNTYgfSk7XG4gKlxuICogLy8gQ3JlYXRlIGVwaGVtZXJhbCBhZ2VudFxuICogY29uc3QgYWdlbnQgPSBuZXcgRXBoZW1lcmFsQWdlbnQoJ2FnZW50LTEnLCB7IGhpZGRlbkRpbTogMjU2IH0pO1xuICpcbiAqIC8vIEFnZW50IHByb2Nlc3NlcyB0YXNrc1xuICogYWdlbnQucHJvY2Vzc1Rhc2soWzAuMSwgMC4yLCAuLi5dLCAwLjg1KTtcbiAqIGFnZW50LnByb2Nlc3NUYXNrKFswLjMsIDAuNCwgLi4uXSwgMC45Mik7XG4gKlxuICogLy8gRXhwb3J0IGFuZCBhZ2dyZWdhdGUgYmVmb3JlIGFnZW50IHRlcm1pbmF0ZXNcbiAqIGNvbnN0IGV4cG9ydERhdGEgPSBhZ2VudC5leHBvcnRTdGF0ZSgpO1xuICogY29uc3QgcmVzdWx0ID0gY29vcmRpbmF0b3IuYWdncmVnYXRlKGV4cG9ydERhdGEpO1xuICpcbiAqIGNvbnNvbGUubG9nKGBBY2NlcHRlZDogJHtyZXN1bHQudHJhamVjdG9yaWVzQWNjZXB0ZWR9YCk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQge1xuICBFbWJlZGRpbmcsXG4gIExlYXJuZWRQYXR0ZXJuLFxuICBQYXR0ZXJuVHlwZSxcbiAgRmVkZXJhdGVkQ29uZmlnLFxuICBUcmFqZWN0b3J5RXhwb3J0LFxuICBBZ2VudEV4cG9ydFN0YXRzLFxuICBBZ2VudEV4cG9ydCxcbiAgQWdlbnRDb250cmlidXRpb24sXG4gIEFnZ3JlZ2F0aW9uUmVzdWx0LFxuICBDb29yZGluYXRvclN0YXRzLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFJlYXNvbmluZ0JhbmsgfSBmcm9tICcuL3NvbmEnO1xuXG4vKipcbiAqIERlZmF1bHQgZmVkZXJhdGVkIGNvbmZpZ1xuICovXG5jb25zdCBERUZBVUxUX0ZFREVSQVRFRF9DT05GSUc6IFJlcXVpcmVkPEZlZGVyYXRlZENvbmZpZz4gPSB7XG4gIGhpZGRlbkRpbTogMjU2LFxuICBlbWJlZGRpbmdEaW06IDI1NixcbiAgbWljcm9Mb3JhUmFuazogMixcbiAgYmFzZUxvcmFSYW5rOiA4LFxuICB0cmFqZWN0b3J5Q2FwYWNpdHk6IDUwMCxcbiAgcGF0dGVybkNsdXN0ZXJzOiAyNSxcbiAgZXdjTGFtYmRhOiAyMDAwLFxuICBxdWFsaXR5VGhyZXNob2xkOiAwLjQsXG59O1xuXG4vKipcbiAqIEVwaGVtZXJhbCBBZ2VudCBmb3IgZmVkZXJhdGVkIGxlYXJuaW5nXG4gKlxuICogQ29sbGVjdHMgdHJhamVjdG9yaWVzIGR1cmluZyBpdHMgc2Vzc2lvbiBhbmQgZXhwb3J0cyBzdGF0ZSBiZWZvcmUgdGVybWluYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEVwaGVtZXJhbEFnZW50KCdhZ2VudC0xJywgeyBoaWRkZW5EaW06IDI1NiB9KTtcbiAqXG4gKiAvLyBQcm9jZXNzIHRhc2tzIGR1cmluZyBzZXNzaW9uXG4gKiBhZ2VudC5wcm9jZXNzVGFzayhlbWJlZGRpbmcxLCAwLjg1KTtcbiAqIGFnZW50LnByb2Nlc3NUYXNrV2l0aFJvdXRlKGVtYmVkZGluZzIsIDAuOTIsICdjb2RlLW1vZGVsJyk7XG4gKlxuICogLy8gRXhwb3J0IGJlZm9yZSB0ZXJtaW5hdGlvblxuICogY29uc3QgZXhwb3J0RGF0YSA9IGFnZW50LmV4cG9ydFN0YXRlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVwaGVtZXJhbEFnZW50IHtcbiAgcHJpdmF0ZSBhZ2VudElkOiBzdHJpbmc7XG4gIHByaXZhdGUgY29uZmlnOiBSZXF1aXJlZDxGZWRlcmF0ZWRDb25maWc+O1xuICBwcml2YXRlIHRyYWplY3RvcmllczogVHJhamVjdG9yeUV4cG9ydFtdID0gW107XG4gIHByaXZhdGUgc3RhcnRUaW1lOiBudW1iZXI7XG4gIHByaXZhdGUgcXVhbGl0eVNhbXBsZXM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgcmVhc29uaW5nQmFuazogUmVhc29uaW5nQmFuaztcbiAgcHJpdmF0ZSBsb3JhV2VpZ2h0czogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihhZ2VudElkOiBzdHJpbmcsIGNvbmZpZz86IEZlZGVyYXRlZENvbmZpZykge1xuICAgIHRoaXMuYWdlbnRJZCA9IGFnZW50SWQ7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfRkVERVJBVEVEX0NPTkZJRywgLi4uY29uZmlnIH07XG4gICAgdGhpcy5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMucmVhc29uaW5nQmFuayA9IG5ldyBSZWFzb25pbmdCYW5rKDAuNyk7XG5cbiAgICAvLyBJbml0aWFsaXplIG1pY3JvLUxvUkEgd2VpZ2h0c1xuICAgIHRoaXMubG9yYVdlaWdodHMgPSBuZXcgQXJyYXkodGhpcy5jb25maWcuaGlkZGVuRGltICogdGhpcy5jb25maWcubWljcm9Mb3JhUmFuaylcbiAgICAgIC5maWxsKDApXG4gICAgICAubWFwKCgpID0+IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDAuMDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2VudCBJRFxuICAgKi9cbiAgZ2V0QWdlbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFnZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhIHRhc2sgYW5kIHJlY29yZCB0cmFqZWN0b3J5XG4gICAqL1xuICBwcm9jZXNzVHJhamVjdG9yeShcbiAgICBlbWJlZGRpbmc6IEVtYmVkZGluZyxcbiAgICBhY3RpdmF0aW9uczogRW1iZWRkaW5nLFxuICAgIHF1YWxpdHk6IG51bWJlcixcbiAgICByb3V0ZT86IHN0cmluZyxcbiAgICBjb250ZXh0OiBzdHJpbmdbXSA9IFtdXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAvLyBTdG9yZSB0cmFqZWN0b3J5IGZvciBleHBvcnRcbiAgICB0aGlzLnRyYWplY3Rvcmllcy5wdXNoKHtcbiAgICAgIGVtYmVkZGluZzogWy4uLmVtYmVkZGluZ10sXG4gICAgICBxdWFsaXR5LFxuICAgICAgcm91dGUsXG4gICAgICBjb250ZXh0OiBbLi4uY29udGV4dF0sXG4gICAgICB0aW1lc3RhbXA6IG5vdyxcbiAgICB9KTtcblxuICAgIHRoaXMucXVhbGl0eVNhbXBsZXMucHVzaChxdWFsaXR5KTtcblxuICAgIC8vIFN0b3JlIGluIGxvY2FsIHJlYXNvbmluZyBiYW5rIGlmIGhpZ2ggcXVhbGl0eVxuICAgIGlmIChxdWFsaXR5ID49IDAuNykge1xuICAgICAgdGhpcy5yZWFzb25pbmdCYW5rLnN0b3JlKCdxdWVyeV9yZXNwb25zZScsIGVtYmVkZGluZyk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxvY2FsIExvUkEgd2VpZ2h0cyBiYXNlZCBvbiBxdWFsaXR5XG4gICAgdGhpcy51cGRhdGVMb3JhV2VpZ2h0cyhlbWJlZGRpbmcsIHF1YWxpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXBsZSBwcm9jZXNzIHRhc2sgbWV0aG9kXG4gICAqL1xuICBwcm9jZXNzVGFzayhlbWJlZGRpbmc6IEVtYmVkZGluZywgcXVhbGl0eTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzVHJhamVjdG9yeShlbWJlZGRpbmcsIGVtYmVkZGluZywgcXVhbGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0YXNrIHdpdGggcm91dGUgaW5mb3JtYXRpb25cbiAgICovXG4gIHByb2Nlc3NUYXNrV2l0aFJvdXRlKGVtYmVkZGluZzogRW1iZWRkaW5nLCBxdWFsaXR5OiBudW1iZXIsIHJvdXRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnByb2Nlc3NUcmFqZWN0b3J5KGVtYmVkZGluZywgZW1iZWRkaW5nLCBxdWFsaXR5LCByb3V0ZSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgbWljcm8tTG9SQSB0byBoaWRkZW4gc3RhdGVzXG4gICAqL1xuICBhcHBseU1pY3JvTG9yYShpbnB1dDogbnVtYmVyW10sIG91dHB1dDogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCByYW5rID0gdGhpcy5jb25maWcubWljcm9Mb3JhUmFuaztcbiAgICBjb25zdCBkaW0gPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIHRoaXMuY29uZmlnLmhpZGRlbkRpbSk7XG5cbiAgICAvLyBTaW1wbGUgbG93LXJhbmsgZGVjb21wb3NpdGlvbjogb3V0cHV0ID0gaW5wdXQgKyBBIEAgQiBAIGlucHV0XG4gICAgLy8gQSBpcyAoZGltIHggcmFuayksIEIgaXMgKHJhbmsgeCBkaW0pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW07IGkrKykge1xuICAgICAgbGV0IGRlbHRhID0gMDtcbiAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgcmFuazsgcisrKSB7XG4gICAgICAgIGxldCBiU3VtID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaW07IGorKykge1xuICAgICAgICAgIGNvbnN0IGJJZHggPSByICogZGltICsgajtcbiAgICAgICAgICBpZiAoYklkeCA8IHRoaXMubG9yYVdlaWdodHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBiU3VtICs9IHRoaXMubG9yYVdlaWdodHNbYklkeF0gKiAoaW5wdXRbal0gfHwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFJZHggPSBpICogcmFuayArIHI7XG4gICAgICAgIGlmIChhSWR4IDwgdGhpcy5sb3JhV2VpZ2h0cy5sZW5ndGgpIHtcbiAgICAgICAgICBkZWx0YSArPSB0aGlzLmxvcmFXZWlnaHRzW2FJZHhdICogYlN1bTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0cHV0W2ldID0gKGlucHV0W2ldIHx8IDApICsgZGVsdGEgKiAwLjE7IC8vIFNjYWxlIGZhY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbnVtYmVyIG9mIGNvbGxlY3RlZCB0cmFqZWN0b3JpZXNcbiAgICovXG4gIHRyYWplY3RvcnlDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRyYWplY3Rvcmllcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF2ZXJhZ2UgcXVhbGl0eVxuICAgKi9cbiAgYXZnUXVhbGl0eSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnF1YWxpdHlTYW1wbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMucXVhbGl0eVNhbXBsZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyB0aGlzLnF1YWxpdHlTYW1wbGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXB0aW1lIGluIHNlY29uZHNcbiAgICovXG4gIHVwdGltZVNlY29uZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lKSAvIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2VudCBzdGF0c1xuICAgKi9cbiAgc3RhdHMoKTogQWdlbnRFeHBvcnRTdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsVHJhamVjdG9yaWVzOiB0aGlzLnRyYWplY3Rvcmllcy5sZW5ndGgsXG4gICAgICBhdmdRdWFsaXR5OiB0aGlzLmF2Z1F1YWxpdHkoKSxcbiAgICAgIHBhdHRlcm5zTGVhcm5lZDogdGhpcy5yZWFzb25pbmdCYW5rLnN0YXRzKCkudG90YWxQYXR0ZXJucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIGxvY2FsIGxlYXJuaW5nXG4gICAqL1xuICBmb3JjZUxlYXJuKCk6IHN0cmluZyB7XG4gICAgLy8gUHJ1bmUgbG93LXBlcmZvcm1pbmcgcGF0dGVybnNcbiAgICBjb25zdCBwcnVuZWQgPSB0aGlzLnJlYXNvbmluZ0JhbmsucHJ1bmUoMC4zLCAzKTtcbiAgICByZXR1cm4gYFBydW5lZCAke3BydW5lZH0gcGF0dGVybnMsICR7dGhpcy5yZWFzb25pbmdCYW5rLnN0YXRzKCkudG90YWxQYXR0ZXJuc30gcmVtYWluaW5nYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGVhcm5lZCBwYXR0ZXJuc1xuICAgKi9cbiAgZ2V0UGF0dGVybnMoKTogTGVhcm5lZFBhdHRlcm5bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVhc29uaW5nQmFuay5nZXRCeVR5cGUoJ3F1ZXJ5X3Jlc3BvbnNlJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdHJhamVjdG9yaWVzIChhZnRlciBleHBvcnQpXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWplY3RvcmllcyA9IFtdO1xuICAgIHRoaXMucXVhbGl0eVNhbXBsZXMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYWdlbnQgc3RhdGUgZm9yIGZlZGVyYXRpb25cbiAgICpcbiAgICogQ2FsbCB0aGlzIGJlZm9yZSB0ZXJtaW5hdGluZyB0aGUgYWdlbnQuXG4gICAqL1xuICBleHBvcnRTdGF0ZSgpOiBBZ2VudEV4cG9ydCB7XG4gICAgLy8gRm9yY2UgbGVhcm5pbmcgYmVmb3JlIGV4cG9ydFxuICAgIHRoaXMuZm9yY2VMZWFybigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFnZW50SWQ6IHRoaXMuYWdlbnRJZCxcbiAgICAgIHRyYWplY3RvcmllczogWy4uLnRoaXMudHJhamVjdG9yaWVzXSxcbiAgICAgIHN0YXRzOiB0aGlzLnN0YXRzKCksXG4gICAgICBzZXNzaW9uRHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRvIEpTT05cbiAgICovXG4gIHRvSlNPTigpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmV4cG9ydFN0YXRlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMb3JhV2VpZ2h0cyhlbWJlZGRpbmc6IEVtYmVkZGluZywgcXVhbGl0eTogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gU2ltcGxlIGdyYWRpZW50IHVwZGF0ZSBiYXNlZCBvbiBxdWFsaXR5XG4gICAgY29uc3QgbHIgPSAwLjAwMSAqIHF1YWxpdHk7XG4gICAgY29uc3QgZGltID0gTWF0aC5taW4oZW1iZWRkaW5nLmxlbmd0aCwgdGhpcy5jb25maWcuaGlkZGVuRGltKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oZGltLCB0aGlzLmxvcmFXZWlnaHRzLmxlbmd0aCk7IGkrKykge1xuICAgICAgY29uc3QgZ3JhZCA9IGVtYmVkZGluZ1tpICUgZW1iZWRkaW5nLmxlbmd0aF0gKiAocXVhbGl0eSAtIDAuNSk7XG4gICAgICB0aGlzLmxvcmFXZWlnaHRzW2ldICs9IGxyICogZ3JhZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGZWRlcmF0ZWQgTGVhcm5pbmcgQ29vcmRpbmF0b3JcbiAqXG4gKiBBZ2dyZWdhdGVzIGxlYXJuaW5nIGZyb20gbXVsdGlwbGUgZXBoZW1lcmFsIGFnZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29vcmRpbmF0b3IgPSBuZXcgRmVkZXJhdGVkQ29vcmRpbmF0b3IoJ2Nvb3JkLTEnLCB7IGhpZGRlbkRpbTogMjU2IH0pO1xuICpcbiAqIC8vIEFnZ3JlZ2F0ZSBleHBvcnRzIGZyb20gbXVsdGlwbGUgYWdlbnRzXG4gKiBmb3IgKGNvbnN0IGFnZW50RXhwb3J0IG9mIGFnZW50RXhwb3J0cykge1xuICogICBjb25zdCByZXN1bHQgPSBjb29yZGluYXRvci5hZ2dyZWdhdGUoYWdlbnRFeHBvcnQpO1xuICogICBjb25zb2xlLmxvZyhgQWdlbnQgJHtyZXN1bHQuYWdlbnRJZH06ICR7cmVzdWx0LnRyYWplY3Rvcmllc0FjY2VwdGVkfSBhY2NlcHRlZGApO1xuICogfVxuICpcbiAqIC8vIEdldCBjb29yZGluYXRvciBzdGF0aXN0aWNzXG4gKiBjb25zdCBzdGF0cyA9IGNvb3JkaW5hdG9yLnN0YXRzKCk7XG4gKiBjb25zb2xlLmxvZyhgVG90YWwgcGF0dGVybnM6ICR7c3RhdHMucGF0dGVybnNMZWFybmVkfWApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRDb29yZGluYXRvciB7XG4gIHByaXZhdGUgY29vcmRpbmF0b3JJZDogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpZzogUmVxdWlyZWQ8RmVkZXJhdGVkQ29uZmlnPjtcbiAgcHJpdmF0ZSBjb250cmlidXRpb25zOiBNYXA8c3RyaW5nLCBBZ2VudENvbnRyaWJ1dGlvbj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdG90YWxUcmFqZWN0b3JpZXM6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgY29uc29saWRhdGlvbkludGVydmFsOiBudW1iZXIgPSA1MDtcbiAgcHJpdmF0ZSByZWFzb25pbmdCYW5rOiBSZWFzb25pbmdCYW5rO1xuICBwcml2YXRlIHF1YWxpdHlTYW1wbGVzOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIG1hc3RlckxvcmFXZWlnaHRzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvb3JkaW5hdG9ySWQ6IHN0cmluZywgY29uZmlnPzogRmVkZXJhdGVkQ29uZmlnKSB7XG4gICAgdGhpcy5jb29yZGluYXRvcklkID0gY29vcmRpbmF0b3JJZDtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfRkVERVJBVEVEX0NPTkZJRyxcbiAgICAgIHRyYWplY3RvcnlDYXBhY2l0eTogNTAwMDAsIC8vIExhcmdlIGNhcGFjaXR5IGZvciBjb29yZGluYXRvclxuICAgICAgcGF0dGVybkNsdXN0ZXJzOiAyMDAsXG4gICAgICBiYXNlTG9yYVJhbms6IDE2LCAvLyBEZWVwZXIgZm9yIGFnZ3JlZ2F0aW9uXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcbiAgICB0aGlzLnJlYXNvbmluZ0JhbmsgPSBuZXcgUmVhc29uaW5nQmFuayh0aGlzLmNvbmZpZy5xdWFsaXR5VGhyZXNob2xkKTtcblxuICAgIC8vIEluaXRpYWxpemUgbWFzdGVyIExvUkEgd2VpZ2h0c1xuICAgIHRoaXMubWFzdGVyTG9yYVdlaWdodHMgPSBuZXcgQXJyYXkodGhpcy5jb25maWcuaGlkZGVuRGltICogdGhpcy5jb25maWcuYmFzZUxvcmFSYW5rKVxuICAgICAgLmZpbGwoMClcbiAgICAgIC5tYXAoKCkgPT4gKE1hdGgucmFuZG9tKCkgLSAwLjUpICogMC4wMSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvb3JkaW5hdG9yIElEXG4gICAqL1xuICBnZXRDb29yZGluYXRvcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0b3JJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcXVhbGl0eSB0aHJlc2hvbGQgZm9yIGFjY2VwdGluZyB0cmFqZWN0b3JpZXNcbiAgICovXG4gIHNldFF1YWxpdHlUaHJlc2hvbGQodGhyZXNob2xkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5xdWFsaXR5VGhyZXNob2xkID0gdGhyZXNob2xkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjb25zb2xpZGF0aW9uIGludGVydmFsXG4gICAqL1xuICBzZXRDb25zb2xpZGF0aW9uSW50ZXJ2YWwoaW50ZXJ2YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29uc29saWRhdGlvbkludGVydmFsID0gaW50ZXJ2YWw7XG4gIH1cblxuICAvKipcbiAgICogQWdncmVnYXRlIGFnZW50IGV4cG9ydCBpbnRvIGNvb3JkaW5hdG9yXG4gICAqL1xuICBhZ2dyZWdhdGUoZXhwb3J0RGF0YTogQWdlbnRFeHBvcnQpOiBBZ2dyZWdhdGlvblJlc3VsdCB7XG4gICAgbGV0IGFjY2VwdGVkID0gMDtcbiAgICBsZXQgcmVqZWN0ZWQgPSAwO1xuXG4gICAgLy8gUmVwbGF5IHRyYWplY3RvcmllcyBpbnRvIG1hc3RlclxuICAgIGZvciAoY29uc3QgdHJhaiBvZiBleHBvcnREYXRhLnRyYWplY3Rvcmllcykge1xuICAgICAgaWYgKHRyYWoucXVhbGl0eSA+PSB0aGlzLmNvbmZpZy5xdWFsaXR5VGhyZXNob2xkKSB7XG4gICAgICAgIC8vIFN0b3JlIHBhdHRlcm5cbiAgICAgICAgY29uc3QgcGF0dGVyblR5cGUgPSB0aGlzLnJvdXRlVG9QYXR0ZXJuVHlwZSh0cmFqLnJvdXRlKTtcbiAgICAgICAgdGhpcy5yZWFzb25pbmdCYW5rLnN0b3JlKHBhdHRlcm5UeXBlLCB0cmFqLmVtYmVkZGluZyk7XG4gICAgICAgIHRoaXMucXVhbGl0eVNhbXBsZXMucHVzaCh0cmFqLnF1YWxpdHkpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBtYXN0ZXIgTG9SQSB3ZWlnaHRzXG4gICAgICAgIHRoaXMudXBkYXRlTWFzdGVyTG9yYSh0cmFqLmVtYmVkZGluZywgdHJhai5xdWFsaXR5KTtcblxuICAgICAgICBhY2NlcHRlZCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0ZWQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRvdGFsVHJhamVjdG9yaWVzICs9IGFjY2VwdGVkO1xuXG4gICAgLy8gUmVjb3JkIGNvbnRyaWJ1dGlvblxuICAgIHRoaXMuY29udHJpYnV0aW9ucy5zZXQoZXhwb3J0RGF0YS5hZ2VudElkLCB7XG4gICAgICB0cmFqZWN0b3J5Q291bnQ6IGV4cG9ydERhdGEudHJhamVjdG9yaWVzLmxlbmd0aCxcbiAgICAgIGF2Z1F1YWxpdHk6IGV4cG9ydERhdGEuc3RhdHMuYXZnUXVhbGl0eSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHNlc3Npb25EdXJhdGlvbk1zOiBleHBvcnREYXRhLnNlc3Npb25EdXJhdGlvbk1zLFxuICAgIH0pO1xuXG4gICAgLy8gQXV0by1jb25zb2xpZGF0ZSBpZiBuZWVkZWRcbiAgICBjb25zdCBjb25zb2xpZGF0ZWQgPSB0aGlzLnNob3VsZENvbnNvbGlkYXRlKCk7XG4gICAgaWYgKGNvbnNvbGlkYXRlZCkge1xuICAgICAgdGhpcy5mb3JjZUNvbnNvbGlkYXRlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFnZW50SWQ6IGV4cG9ydERhdGEuYWdlbnRJZCxcbiAgICAgIHRyYWplY3Rvcmllc0FjY2VwdGVkOiBhY2NlcHRlZCxcbiAgICAgIHRyYWplY3Rvcmllc1JlamVjdGVkOiByZWplY3RlZCxcbiAgICAgIGNvbnNvbGlkYXRlZCxcbiAgICAgIHRvdGFsQWdlbnRzOiB0aGlzLmNvbnRyaWJ1dGlvbnMuc2l6ZSxcbiAgICAgIHRvdGFsVHJhamVjdG9yaWVzOiB0aGlzLnRvdGFsVHJhamVjdG9yaWVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgY29uc29saWRhdGlvbiAobGVhcm5pbmcpXG4gICAqL1xuICBmb3JjZUNvbnNvbGlkYXRlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJ1bmVkID0gdGhpcy5yZWFzb25pbmdCYW5rLnBydW5lKDAuMywgNSk7XG4gICAgcmV0dXJuIGBDb25zb2xpZGF0ZWQ6IHBydW5lZCAke3BydW5lZH0gcGF0dGVybnMsICR7dGhpcy5yZWFzb25pbmdCYW5rLnN0YXRzKCkudG90YWxQYXR0ZXJuc30gcmVtYWluaW5nYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSBsZWFybmluZyAoYWxpYXMpXG4gICAqL1xuICBjb25zb2xpZGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcmNlQ29uc29saWRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW5pdGlhbCBwYXR0ZXJucyBmb3IgbmV3IGFnZW50cyAod2FybSBzdGFydClcbiAgICovXG4gIGdldEluaXRpYWxQYXR0ZXJucyhrOiBudW1iZXIgPSAxMCk6IExlYXJuZWRQYXR0ZXJuW10ge1xuICAgIGNvbnN0IGFsbFBhdHRlcm5zID0gW1xuICAgICAgLi4udGhpcy5yZWFzb25pbmdCYW5rLmdldEJ5VHlwZSgncXVlcnlfcmVzcG9uc2UnKSxcbiAgICAgIC4uLnRoaXMucmVhc29uaW5nQmFuay5nZXRCeVR5cGUoJ3JvdXRpbmcnKSxcbiAgICBdO1xuXG4gICAgLy8gU29ydCBieSBzdWNjZXNzIHJhdGUgYW5kIHJldHVybiB0b3Aga1xuICAgIHJldHVybiBhbGxQYXR0ZXJuc1xuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc3VjY2Vzc1JhdGUgLSBhLnN1Y2Nlc3NSYXRlKVxuICAgICAgLnNsaWNlKDAsIGspO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgbGVhcm5lZCBwYXR0ZXJuc1xuICAgKi9cbiAgZ2V0QWxsUGF0dGVybnMoKTogTGVhcm5lZFBhdHRlcm5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnRoaXMucmVhc29uaW5nQmFuay5nZXRCeVR5cGUoJ3F1ZXJ5X3Jlc3BvbnNlJyksXG4gICAgICAuLi50aGlzLnJlYXNvbmluZ0JhbmsuZ2V0QnlUeXBlKCdyb3V0aW5nJyksXG4gICAgICAuLi50aGlzLnJlYXNvbmluZ0JhbmsuZ2V0QnlUeXBlKCdjb250ZXh0X3JldHJpZXZhbCcpLFxuICAgICAgLi4udGhpcy5yZWFzb25pbmdCYW5rLmdldEJ5VHlwZSgnY29ycmVjdGlvbicpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogRmluZCBzaW1pbGFyIHBhdHRlcm5zXG4gICAqL1xuICBmaW5kUGF0dGVybnMocXVlcnk6IEVtYmVkZGluZywgazogbnVtYmVyKTogTGVhcm5lZFBhdHRlcm5bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVhc29uaW5nQmFuay5maW5kU2ltaWxhcihxdWVyeSwgayk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgY29vcmRpbmF0b3IncyBMb1JBIHRvIGlucHV0XG4gICAqIE9QVElNSVpFRDogUHJlLWNvbXB1dGUgaGlkZGVuIGxheWVyIG9uY2UsIHJldXNlIHR5cGVkIGFycmF5c1xuICAgKi9cbiAgYXBwbHlMb3JhKGlucHV0OiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgICBjb25zdCByYW5rID0gdGhpcy5jb25maWcuYmFzZUxvcmFSYW5rO1xuICAgIGNvbnN0IGRpbSA9IE1hdGgubWluKGlucHV0Lmxlbmd0aCwgdGhpcy5jb25maWcuaGlkZGVuRGltKTtcbiAgICBjb25zdCB3ZWlnaHRzTGVuID0gdGhpcy5tYXN0ZXJMb3JhV2VpZ2h0cy5sZW5ndGg7XG5cbiAgICAvLyBQcmUtY29tcHV0ZSBoaWRkZW4gbGF5ZXIgKGlucHV0IEAgQilcbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgRmxvYXQ2NEFycmF5KHJhbmspO1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcmFuazsgcisrKSB7XG4gICAgICBsZXQgc3VtID0gMDtcbiAgICAgIGNvbnN0IGJhc2VJZHggPSByICogZGltO1xuICAgICAgLy8gVW5yb2xsIHRoZSBpbm5lciBsb29wXG4gICAgICBsZXQgaiA9IDA7XG4gICAgICBmb3IgKDsgaiArIDMgPCBkaW0gJiYgYmFzZUlkeCArIGogKyAzIDwgd2VpZ2h0c0xlbjsgaiArPSA0KSB7XG4gICAgICAgIHN1bSArPSB0aGlzLm1hc3RlckxvcmFXZWlnaHRzW2Jhc2VJZHggKyBqXSAqIChpbnB1dFtqXSB8fCAwKSArXG4gICAgICAgICAgICAgICB0aGlzLm1hc3RlckxvcmFXZWlnaHRzW2Jhc2VJZHggKyBqICsgMV0gKiAoaW5wdXRbaiArIDFdIHx8IDApICtcbiAgICAgICAgICAgICAgIHRoaXMubWFzdGVyTG9yYVdlaWdodHNbYmFzZUlkeCArIGogKyAyXSAqIChpbnB1dFtqICsgMl0gfHwgMCkgK1xuICAgICAgICAgICAgICAgdGhpcy5tYXN0ZXJMb3JhV2VpZ2h0c1tiYXNlSWR4ICsgaiArIDNdICogKGlucHV0W2ogKyAzXSB8fCAwKTtcbiAgICAgIH1cbiAgICAgIGZvciAoOyBqIDwgZGltICYmIGJhc2VJZHggKyBqIDwgd2VpZ2h0c0xlbjsgaisrKSB7XG4gICAgICAgIHN1bSArPSB0aGlzLm1hc3RlckxvcmFXZWlnaHRzW2Jhc2VJZHggKyBqXSAqIChpbnB1dFtqXSB8fCAwKTtcbiAgICAgIH1cbiAgICAgIGhpZGRlbltyXSA9IHN1bTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIG91dHB1dCAoaGlkZGVuIEAgQSArIGlucHV0KVxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBBcnJheShpbnB1dC5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpIDwgZGltKSB7XG4gICAgICAgIGxldCBkZWx0YSA9IDA7XG4gICAgICAgIGNvbnN0IGJhc2VJZHggPSBpICogcmFuaztcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCByYW5rICYmIGJhc2VJZHggKyByIDwgd2VpZ2h0c0xlbjsgcisrKSB7XG4gICAgICAgICAgZGVsdGEgKz0gdGhpcy5tYXN0ZXJMb3JhV2VpZ2h0c1tiYXNlSWR4ICsgcl0gKiBoaWRkZW5bcl07XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0W2ldID0gKGlucHV0W2ldIHx8IDApICsgZGVsdGEgKiAwLjE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXRbaV0gPSBpbnB1dFtpXSB8fCAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvb3JkaW5hdG9yIHN0YXRpc3RpY3NcbiAgICovXG4gIHN0YXRzKCk6IENvb3JkaW5hdG9yU3RhdHMge1xuICAgIGNvbnN0IGF2Z1F1YWxpdHkgPSB0aGlzLnF1YWxpdHlTYW1wbGVzLmxlbmd0aCA+IDBcbiAgICAgID8gdGhpcy5xdWFsaXR5U2FtcGxlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHRoaXMucXVhbGl0eVNhbXBsZXMubGVuZ3RoXG4gICAgICA6IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29vcmRpbmF0b3JJZDogdGhpcy5jb29yZGluYXRvcklkLFxuICAgICAgdG90YWxBZ2VudHM6IHRoaXMuY29udHJpYnV0aW9ucy5zaXplLFxuICAgICAgdG90YWxUcmFqZWN0b3JpZXM6IHRoaXMudG90YWxUcmFqZWN0b3JpZXMsXG4gICAgICBwYXR0ZXJuc0xlYXJuZWQ6IHRoaXMucmVhc29uaW5nQmFuay5zdGF0cygpLnRvdGFsUGF0dGVybnMsXG4gICAgICBhdmdRdWFsaXR5LFxuICAgICAgcXVhbGl0eVRocmVzaG9sZDogdGhpcy5jb25maWcucXVhbGl0eVRocmVzaG9sZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb250cmlidXRpb24gaGlzdG9yeVxuICAgKi9cbiAgZ2V0Q29udHJpYnV0aW9ucygpOiBNYXA8c3RyaW5nLCBBZ2VudENvbnRyaWJ1dGlvbj4ge1xuICAgIHJldHVybiBuZXcgTWFwKHRoaXMuY29udHJpYnV0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRvdGFsIGFnZW50IGNvdW50XG4gICAqL1xuICBhZ2VudENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJpYnV0aW9ucy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0b3RhbCB0cmFqZWN0b3J5IGNvdW50XG4gICAqL1xuICBnZXRUb3RhbFRyYWplY3RvcmllcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRvdGFsVHJhamVjdG9yaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjb250cmlidXRpb25zXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyaWJ1dGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnRvdGFsVHJhamVjdG9yaWVzID0gMDtcbiAgICB0aGlzLnF1YWxpdHlTYW1wbGVzID0gW107XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGNvb3JkaW5hdG9yIHN0YXRlXG4gICAqL1xuICB0b0pTT04oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY29vcmRpbmF0b3JJZDogdGhpcy5jb29yZGluYXRvcklkLFxuICAgICAgc3RhdHM6IHRoaXMuc3RhdHMoKSxcbiAgICAgIGNvbnRyaWJ1dGlvbnM6IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmNvbnRyaWJ1dGlvbnMpLFxuICAgICAgcGF0dGVybnM6IHRoaXMuZ2V0QWxsUGF0dGVybnMoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYWdlbnQgd2l0aCBjb29yZGluYXRvcidzIGxlYXJuZWQgcGF0dGVybnNcbiAgICovXG4gIGNyZWF0ZUFnZW50KGFnZW50SWQ6IHN0cmluZyk6IEVwaGVtZXJhbEFnZW50IHtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBFcGhlbWVyYWxBZ2VudChhZ2VudElkLCB7XG4gICAgICBoaWRkZW5EaW06IHRoaXMuY29uZmlnLmhpZGRlbkRpbSxcbiAgICAgIGVtYmVkZGluZ0RpbTogdGhpcy5jb25maWcuZW1iZWRkaW5nRGltLFxuICAgICAgbWljcm9Mb3JhUmFuazogdGhpcy5jb25maWcubWljcm9Mb3JhUmFuayxcbiAgICB9KTtcblxuICAgIC8vIFdhcm0gc3RhcnQ6IHByb2Nlc3MgaW5pdGlhbCBwYXR0ZXJucyBhcyBwb3NpdGl2ZSBleGFtcGxlc1xuICAgIGNvbnN0IGluaXRpYWxQYXR0ZXJucyA9IHRoaXMuZ2V0SW5pdGlhbFBhdHRlcm5zKDUpO1xuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBpbml0aWFsUGF0dGVybnMpIHtcbiAgICAgIGFnZW50LnByb2Nlc3NUYXNrKHBhdHRlcm4uZW1iZWRkaW5nLCBwYXR0ZXJuLnN1Y2Nlc3NSYXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWdlbnQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZENvbnNvbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyaWJ1dGlvbnMuc2l6ZSAlIHRoaXMuY29uc29saWRhdGlvbkludGVydmFsID09PSAwICYmXG4gICAgICAgICAgIHRoaXMuY29udHJpYnV0aW9ucy5zaXplID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgcm91dGVUb1BhdHRlcm5UeXBlKHJvdXRlPzogc3RyaW5nKTogUGF0dGVyblR5cGUge1xuICAgIGlmICghcm91dGUpIHJldHVybiAncXVlcnlfcmVzcG9uc2UnO1xuICAgIGlmIChyb3V0ZS5pbmNsdWRlcygnY29kZScpKSByZXR1cm4gJ3F1ZXJ5X3Jlc3BvbnNlJztcbiAgICBpZiAocm91dGUuaW5jbHVkZXMoJ3JvdXRlJykpIHJldHVybiAncm91dGluZyc7XG4gICAgaWYgKHJvdXRlLmluY2x1ZGVzKCdtZW1vcnknKSkgcmV0dXJuICdjb250ZXh0X3JldHJpZXZhbCc7XG4gICAgcmV0dXJuICdxdWVyeV9yZXNwb25zZSc7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1hc3RlckxvcmEoZW1iZWRkaW5nOiBFbWJlZGRpbmcsIHF1YWxpdHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGxyID0gMC4wMDA1ICogcXVhbGl0eTsgLy8gU2xvd2VyIGxlYXJuaW5nIGZvciBjb29yZGluYXRvclxuICAgIGNvbnN0IGRpbSA9IE1hdGgubWluKGVtYmVkZGluZy5sZW5ndGgsIHRoaXMuY29uZmlnLmhpZGRlbkRpbSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKGRpbSwgdGhpcy5tYXN0ZXJMb3JhV2VpZ2h0cy5sZW5ndGgpOyBpKyspIHtcbiAgICAgIGNvbnN0IGdyYWQgPSBlbWJlZGRpbmdbaSAlIGVtYmVkZGluZy5sZW5ndGhdICogKHF1YWxpdHkgLSAwLjUpO1xuICAgICAgdGhpcy5tYXN0ZXJMb3JhV2VpZ2h0c1tpXSArPSBsciAqIGdyYWQ7XG5cbiAgICAgIC8vIEVXQyByZWd1bGFyaXphdGlvbiAtIHByZXZlbnQgbGFyZ2Ugd2VpZ2h0IGNoYW5nZXNcbiAgICAgIGNvbnN0IHBlbmFsdHkgPSB0aGlzLmNvbmZpZy5ld2NMYW1iZGEgKiB0aGlzLm1hc3RlckxvcmFXZWlnaHRzW2ldICogMC4wMDAxO1xuICAgICAgdGhpcy5tYXN0ZXJMb3JhV2VpZ2h0c1tpXSAtPSBwZW5hbHR5O1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,68 +0,0 @@
1
- /**
2
- * @ruvector/ruvllm - Self-learning LLM orchestration
3
- *
4
- * RuvLLM combines SONA adaptive learning with HNSW memory,
5
- * FastGRNN routing, and SIMD-optimized inference.
6
- *
7
- * @example
8
- * ```typescript
9
- * import { RuvLLM, SessionManager, SonaCoordinator } from '@ruvector/ruvllm';
10
- *
11
- * const llm = new RuvLLM({ learningEnabled: true });
12
- * const sessions = new SessionManager(llm);
13
- * const sona = new SonaCoordinator();
14
- *
15
- * // Query with session context
16
- * const session = sessions.create();
17
- * const response = sessions.chat(session.id, 'What is AI?');
18
- *
19
- * // Track learning trajectory
20
- * const trajectory = new TrajectoryBuilder()
21
- * .startStep('query', 'What is AI?')
22
- * .endStep(response.text, response.confidence)
23
- * .complete('success');
24
- *
25
- * sona.recordTrajectory(trajectory);
26
- * ```
27
- *
28
- * @example Federated Learning
29
- * ```typescript
30
- * import { EphemeralAgent, FederatedCoordinator } from '@ruvector/ruvllm';
31
- *
32
- * // Central coordinator
33
- * const coordinator = new FederatedCoordinator('coord-1');
34
- *
35
- * // Ephemeral agents process tasks and export
36
- * const agent = new EphemeralAgent('agent-1');
37
- * agent.processTask(embedding, 0.9);
38
- * const exportData = agent.exportState();
39
- *
40
- * // Aggregate learning
41
- * coordinator.aggregate(exportData);
42
- * ```
43
- *
44
- * @example LoRA Adapters
45
- * ```typescript
46
- * import { LoraAdapter, LoraManager } from '@ruvector/ruvllm';
47
- *
48
- * const adapter = new LoraAdapter({ rank: 8, alpha: 16 });
49
- * const output = adapter.forward(input);
50
- * ```
51
- */
52
- export * from './types.js';
53
- export * from './engine.js';
54
- export * from './simd.js';
55
- export * from './session.js';
56
- export * from './streaming.js';
57
- export * from './sona.js';
58
- export * from './federated.js';
59
- export * from './lora.js';
60
- export * from './export.js';
61
- export * from './training.js';
62
- export * from './contrastive.js';
63
- export * from './models.js';
64
- export * from './benchmarks/index.js';
65
- export * from './intelligence.js';
66
- export { version, hasSimdSupport } from './native.js';
67
- export { RuvLLM as default } from './engine.js';
68
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
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"}