@ruvector/ruvllm 3.0.0 → 4.0.1

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