@ruvector/ruvllm 4.0.1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/README.md +447 -160
  2. package/bin/cli.js +1066 -0
  3. package/bin/gpu-delegate.js +67 -0
  4. package/bin/ruvllm-adapters.js +5 -0
  5. package/bin/ruvllm-gpu-loop.js +5 -0
  6. package/bin/serve.js +265 -0
  7. package/dist/cjs/benchmarks/embedding-benchmark.d.ts +102 -0
  8. package/dist/cjs/benchmarks/embedding-benchmark.d.ts.map +1 -0
  9. package/dist/cjs/benchmarks/embedding-benchmark.js +436 -0
  10. package/dist/cjs/benchmarks/index.d.ts +34 -0
  11. package/dist/cjs/benchmarks/index.d.ts.map +1 -0
  12. package/dist/cjs/benchmarks/index.js +132 -0
  13. package/dist/cjs/benchmarks/model-comparison.d.ts +71 -0
  14. package/dist/cjs/benchmarks/model-comparison.d.ts.map +1 -0
  15. package/dist/cjs/benchmarks/model-comparison.js +476 -0
  16. package/dist/cjs/benchmarks/routing-benchmark.d.ts +70 -0
  17. package/dist/cjs/benchmarks/routing-benchmark.d.ts.map +1 -0
  18. package/dist/cjs/benchmarks/routing-benchmark.js +289 -0
  19. package/dist/cjs/contrastive.d.ts +229 -0
  20. package/dist/cjs/contrastive.d.ts.map +1 -0
  21. package/dist/cjs/contrastive.js +589 -0
  22. package/dist/cjs/engine.d.ts +160 -0
  23. package/dist/cjs/engine.d.ts.map +1 -0
  24. package/dist/cjs/engine.js +552 -0
  25. package/dist/cjs/export.d.ts +182 -0
  26. package/dist/cjs/export.d.ts.map +1 -0
  27. package/dist/cjs/export.js +422 -0
  28. package/dist/cjs/federated.d.ts +233 -0
  29. package/dist/cjs/federated.d.ts.map +1 -0
  30. package/dist/cjs/federated.js +525 -0
  31. package/dist/cjs/index.d.ts +68 -0
  32. package/dist/cjs/index.d.ts.map +1 -0
  33. package/dist/cjs/index.js +104 -0
  34. package/dist/cjs/intelligence.d.ts +136 -0
  35. package/dist/cjs/intelligence.d.ts.map +1 -0
  36. package/dist/cjs/intelligence.js +226 -0
  37. package/dist/cjs/lora.d.ts +251 -0
  38. package/dist/cjs/lora.d.ts.map +1 -0
  39. package/dist/cjs/lora.js +509 -0
  40. package/dist/cjs/models.d.ts +129 -0
  41. package/dist/cjs/models.d.ts.map +1 -0
  42. package/dist/cjs/models.js +323 -0
  43. package/dist/cjs/native.d.ts +140 -0
  44. package/dist/cjs/native.d.ts.map +1 -0
  45. package/dist/cjs/native.js +98 -0
  46. package/dist/cjs/session.d.ts +80 -0
  47. package/dist/cjs/session.d.ts.map +1 -0
  48. package/dist/cjs/session.js +203 -0
  49. package/dist/cjs/simd.d.ts +90 -0
  50. package/dist/cjs/simd.d.ts.map +1 -0
  51. package/dist/cjs/simd.js +209 -0
  52. package/dist/cjs/sona.d.ts +223 -0
  53. package/dist/cjs/sona.d.ts.map +1 -0
  54. package/dist/cjs/sona.js +562 -0
  55. package/dist/cjs/streaming.d.ts +55 -0
  56. package/dist/cjs/streaming.d.ts.map +1 -0
  57. package/dist/cjs/streaming.js +131 -0
  58. package/dist/cjs/training.d.ts +312 -0
  59. package/dist/cjs/training.d.ts.map +1 -0
  60. package/dist/cjs/training.js +610 -0
  61. package/dist/cjs/types.d.ts +696 -0
  62. package/dist/cjs/types.d.ts.map +1 -0
  63. package/dist/cjs/types.js +6 -0
  64. package/dist/esm/benchmarks/embedding-benchmark.d.ts +102 -0
  65. package/dist/esm/benchmarks/embedding-benchmark.d.ts.map +1 -0
  66. package/dist/esm/benchmarks/embedding-benchmark.js +427 -0
  67. package/dist/esm/benchmarks/index.d.ts +34 -0
  68. package/dist/esm/benchmarks/index.d.ts.map +1 -0
  69. package/dist/esm/benchmarks/index.js +110 -0
  70. package/dist/esm/benchmarks/model-comparison.d.ts +71 -0
  71. package/dist/esm/benchmarks/model-comparison.d.ts.map +1 -0
  72. package/dist/esm/benchmarks/model-comparison.js +434 -0
  73. package/dist/esm/benchmarks/routing-benchmark.d.ts +70 -0
  74. package/dist/esm/benchmarks/routing-benchmark.d.ts.map +1 -0
  75. package/dist/esm/benchmarks/routing-benchmark.js +283 -0
  76. package/dist/esm/contrastive.d.ts +229 -0
  77. package/dist/esm/contrastive.d.ts.map +1 -0
  78. package/dist/esm/contrastive.js +578 -0
  79. package/dist/esm/engine.d.ts +160 -0
  80. package/dist/esm/engine.d.ts.map +1 -0
  81. package/dist/esm/engine.js +548 -0
  82. package/dist/esm/export.d.ts +182 -0
  83. package/dist/esm/export.d.ts.map +1 -0
  84. package/dist/esm/export.js +414 -0
  85. package/dist/esm/federated.d.ts +233 -0
  86. package/dist/esm/federated.d.ts.map +1 -0
  87. package/dist/esm/federated.js +520 -0
  88. package/dist/esm/index.d.ts +68 -0
  89. package/dist/esm/index.d.ts.map +1 -0
  90. package/dist/esm/index.js +84 -0
  91. package/dist/esm/intelligence.d.ts +136 -0
  92. package/dist/esm/intelligence.d.ts.map +1 -0
  93. package/dist/esm/intelligence.js +188 -0
  94. package/dist/esm/lora.d.ts +251 -0
  95. package/dist/esm/lora.d.ts.map +1 -0
  96. package/dist/esm/lora.js +504 -0
  97. package/dist/esm/models.d.ts +129 -0
  98. package/dist/esm/models.d.ts.map +1 -0
  99. package/dist/esm/models.js +282 -0
  100. package/dist/esm/native.d.ts +140 -0
  101. package/dist/esm/native.d.ts.map +1 -0
  102. package/dist/esm/native.js +100 -0
  103. package/dist/esm/session.d.ts +80 -0
  104. package/dist/esm/session.d.ts.map +1 -0
  105. package/dist/esm/session.js +199 -0
  106. package/dist/esm/simd.d.ts +90 -0
  107. package/dist/esm/simd.d.ts.map +1 -0
  108. package/dist/esm/simd.js +205 -0
  109. package/dist/esm/sona.d.ts +223 -0
  110. package/dist/esm/sona.d.ts.map +1 -0
  111. package/dist/esm/sona.js +556 -0
  112. package/dist/esm/streaming.d.ts +55 -0
  113. package/dist/esm/streaming.d.ts.map +1 -0
  114. package/dist/esm/streaming.js +126 -0
  115. package/dist/esm/training.d.ts +312 -0
  116. package/dist/esm/training.d.ts.map +1 -0
  117. package/dist/esm/training.js +603 -0
  118. package/dist/esm/types.d.ts +696 -0
  119. package/dist/esm/types.d.ts.map +1 -0
  120. package/dist/esm/types.js +5 -0
  121. package/gpu/_load.cjs +38 -0
  122. package/gpu/_load.mjs +33 -0
  123. package/gpu/adapters.cjs +3 -0
  124. package/gpu/adapters.mjs +5 -0
  125. package/gpu/engine.cjs +3 -0
  126. package/gpu/engine.mjs +5 -0
  127. package/gpu/fixture.cjs +3 -0
  128. package/gpu/fixture.mjs +5 -0
  129. package/gpu/gpu-host.cjs +3 -0
  130. package/gpu/gpu-host.mjs +5 -0
  131. package/gpu/gpu-loop.cjs +3 -0
  132. package/gpu/gpu-loop.mjs +5 -0
  133. package/gpu/gpu-spool-adapter.cjs +3 -0
  134. package/gpu/gpu-spool-adapter.mjs +5 -0
  135. package/gpu/vast-host-adapter.cjs +3 -0
  136. package/gpu/vast-host-adapter.mjs +5 -0
  137. package/package.json +159 -49
  138. package/scripts/ensemble-model-compare.js +287 -0
  139. package/scripts/fix-esm-extensions.mjs +220 -0
  140. package/scripts/huggingface/README.md +537 -0
  141. package/scripts/huggingface/publish.sh +112 -0
  142. package/scripts/hybrid-model-compare.js +373 -0
  143. package/scripts/improved-model-compare.js +288 -0
  144. package/scripts/optimized-model-compare.js +364 -0
  145. package/scripts/real-model-compare.js +280 -0
  146. package/scripts/smoke-esm.mjs +82 -0
  147. package/scripts/training/agentic-flow-capabilities.json +329 -0
  148. package/scripts/training/claude-code-synth.js +505 -0
  149. package/scripts/training/claude-flow-capabilities.json +1322 -0
  150. package/scripts/training/claude-hard-negatives.js +222 -0
  151. package/scripts/training/contrastive-finetune.js +517 -0
  152. package/scripts/training/ecosystem-triplets.jsonl +1467 -0
  153. package/scripts/training/generate-ecosystem-triplets.js +1324 -0
  154. package/scripts/training/routing-dataset.js +634 -0
  155. package/scripts/training/ruvector-capabilities.json +798 -0
  156. package/scripts/training/validate-ecosystem.js +381 -0
  157. package/scripts/training/validation-results.json +23 -0
  158. package/GPU-LOOP.md +0 -229
  159. package/LICENSE +0 -201
  160. package/NOTICE +0 -9
  161. package/examples/gpu-loop.example.json +0 -26
  162. package/src/adapters-cli.mjs +0 -23
  163. package/src/adapters.mjs +0 -91
  164. package/src/cli.mjs +0 -30
  165. package/src/engine.mjs +0 -238
  166. package/src/fixture.mjs +0 -38
  167. package/src/gpu-host.mjs +0 -47
  168. package/src/gpu-loop-cli.mjs +0 -67
  169. package/src/gpu-loop.mjs +0 -184
  170. package/src/gpu-spool-adapter.mjs +0 -80
  171. package/src/vast-host-adapter.mjs +0 -274
@@ -0,0 +1,525 @@
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=
@@ -0,0 +1,68 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAGH,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;AAGzB,cAAc,QAAQ,CAAC;AAGvB,cAAc,WAAW,CAAC;AAG1B,cAAc,aAAa,CAAC;AAG5B,cAAc,QAAQ,CAAC;AAGvB,cAAc,aAAa,CAAC;AAG5B,cAAc,QAAQ,CAAC;AAGvB,cAAc,UAAU,CAAC;AAGzB,cAAc,YAAY,CAAC;AAG3B,cAAc,eAAe,CAAC;AAG9B,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC;AAG7B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGnD,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,UAAU,CAAC"}