@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,129 +0,0 @@
1
- /**
2
- * RuvLTRA Model Registry and Downloader
3
- *
4
- * Automatically downloads GGUF models from HuggingFace Hub.
5
- *
6
- * @example
7
- * ```typescript
8
- * import { ModelDownloader, RUVLTRA_MODELS } from '@ruvector/ruvllm';
9
- *
10
- * // Download the Claude Code optimized model
11
- * const downloader = new ModelDownloader();
12
- * const modelPath = await downloader.download('claude-code');
13
- *
14
- * // Or download all models
15
- * await downloader.downloadAll();
16
- * ```
17
- */
18
- /** Model information from HuggingFace */
19
- export interface ModelInfo {
20
- /** Model identifier */
21
- id: string;
22
- /** Display name */
23
- name: string;
24
- /** Model filename on HuggingFace */
25
- filename: string;
26
- /** Model size in bytes */
27
- sizeBytes: number;
28
- /** Model size (human readable) */
29
- size: string;
30
- /** Parameter count */
31
- parameters: string;
32
- /** Use case description */
33
- useCase: string;
34
- /** Quantization type */
35
- quantization: string;
36
- /** Context window size */
37
- contextLength: number;
38
- /** HuggingFace download URL */
39
- url: string;
40
- }
41
- /** Download progress callback */
42
- export type ProgressCallback = (progress: DownloadProgress) => void;
43
- /** Download progress information */
44
- export interface DownloadProgress {
45
- /** Model being downloaded */
46
- modelId: string;
47
- /** Bytes downloaded so far */
48
- downloaded: number;
49
- /** Total bytes to download */
50
- total: number;
51
- /** Download percentage (0-100) */
52
- percent: number;
53
- /** Download speed in bytes per second */
54
- speedBps: number;
55
- /** Estimated time remaining in seconds */
56
- etaSeconds: number;
57
- }
58
- /** Download options */
59
- export interface DownloadOptions {
60
- /** Directory to save models (default: ~/.ruvllm/models) */
61
- modelsDir?: string;
62
- /** Force re-download even if file exists */
63
- force?: boolean;
64
- /** Progress callback */
65
- onProgress?: ProgressCallback;
66
- /** Verify file integrity after download */
67
- verify?: boolean;
68
- }
69
- /** Available RuvLTRA models */
70
- export declare const RUVLTRA_MODELS: Record<string, ModelInfo>;
71
- /** Model aliases for convenience */
72
- export declare const MODEL_ALIASES: Record<string, string>;
73
- /**
74
- * Get the default models directory
75
- */
76
- export declare function getDefaultModelsDir(): string;
77
- /**
78
- * Resolve model ID from alias or direct ID
79
- */
80
- export declare function resolveModelId(modelIdOrAlias: string): string | null;
81
- /**
82
- * Get model info by ID or alias
83
- */
84
- export declare function getModelInfo(modelIdOrAlias: string): ModelInfo | null;
85
- /**
86
- * List all available models
87
- */
88
- export declare function listModels(): ModelInfo[];
89
- /**
90
- * Model downloader for RuvLTRA GGUF models
91
- */
92
- export declare class ModelDownloader {
93
- private modelsDir;
94
- constructor(modelsDir?: string);
95
- /**
96
- * Get the path where a model would be saved
97
- */
98
- getModelPath(modelIdOrAlias: string): string | null;
99
- /**
100
- * Check if a model is already downloaded
101
- */
102
- isDownloaded(modelIdOrAlias: string): boolean;
103
- /**
104
- * Get download status for all models
105
- */
106
- getStatus(): {
107
- model: ModelInfo;
108
- downloaded: boolean;
109
- path: string;
110
- }[];
111
- /**
112
- * Download a model from HuggingFace
113
- */
114
- download(modelIdOrAlias: string, options?: DownloadOptions): Promise<string>;
115
- /**
116
- * Download all available models
117
- */
118
- downloadAll(options?: DownloadOptions): Promise<string[]>;
119
- /**
120
- * Delete a downloaded model
121
- */
122
- delete(modelIdOrAlias: string): boolean;
123
- /**
124
- * Delete all downloaded models
125
- */
126
- deleteAll(): number;
127
- }
128
- export default ModelDownloader;
129
- //# sourceMappingURL=models.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,iCAAiC;AACjC,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEpE,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,uBAAuB;AACvB,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wBAAwB;IACxB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,2CAA2C;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAMD,+BAA+B;AAC/B,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAqCpD,CAAC;AAEF,oCAAoC;AACpC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAShD,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGrE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,EAAE,CAExC;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,CAAC,EAAE,MAAM;IAI9B;;OAEG;IACH,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMnD;;OAEG;IACH,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAgB7C;;OAEG;IACH,SAAS,IAAI;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;IAQtE;;OAEG;IACG,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;IA8GlB;;OAEG;IACG,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASnE;;OAEG;IACH,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IASvC;;OAEG;IACH,SAAS,IAAI,MAAM;CASpB;AAED,eAAe,eAAe,CAAC"}
@@ -1,282 +0,0 @@
1
- /**
2
- * RuvLTRA Model Registry and Downloader
3
- *
4
- * Automatically downloads GGUF models from HuggingFace Hub.
5
- *
6
- * @example
7
- * ```typescript
8
- * import { ModelDownloader, RUVLTRA_MODELS } from '@ruvector/ruvllm';
9
- *
10
- * // Download the Claude Code optimized model
11
- * const downloader = new ModelDownloader();
12
- * const modelPath = await downloader.download('claude-code');
13
- *
14
- * // Or download all models
15
- * await downloader.downloadAll();
16
- * ```
17
- */
18
- import { createWriteStream, existsSync, mkdirSync, statSync, unlinkSync, renameSync } from 'fs';
19
- import { join } from 'path';
20
- import { homedir } from 'os';
21
- /** HuggingFace repository */
22
- const HF_REPO = 'ruv/ruvltra';
23
- const HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`;
24
- /** Available RuvLTRA models */
25
- export const RUVLTRA_MODELS = {
26
- 'claude-code': {
27
- id: 'claude-code',
28
- name: 'RuvLTRA Claude Code',
29
- filename: 'ruvltra-claude-code-0.5b-q4_k_m.gguf',
30
- sizeBytes: 398000000,
31
- size: '398 MB',
32
- parameters: '0.5B',
33
- useCase: 'Claude Code workflows, agentic coding',
34
- quantization: 'Q4_K_M',
35
- contextLength: 4096,
36
- url: `${HF_BASE_URL}/ruvltra-claude-code-0.5b-q4_k_m.gguf`,
37
- },
38
- 'small': {
39
- id: 'small',
40
- name: 'RuvLTRA Small',
41
- filename: 'ruvltra-small-0.5b-q4_k_m.gguf',
42
- sizeBytes: 398000000,
43
- size: '398 MB',
44
- parameters: '0.5B',
45
- useCase: 'Edge devices, IoT, resource-constrained environments',
46
- quantization: 'Q4_K_M',
47
- contextLength: 4096,
48
- url: `${HF_BASE_URL}/ruvltra-small-0.5b-q4_k_m.gguf`,
49
- },
50
- 'medium': {
51
- id: 'medium',
52
- name: 'RuvLTRA Medium',
53
- filename: 'ruvltra-medium-1.1b-q4_k_m.gguf',
54
- sizeBytes: 669000000,
55
- size: '669 MB',
56
- parameters: '1.1B',
57
- useCase: 'General purpose, balanced performance',
58
- quantization: 'Q4_K_M',
59
- contextLength: 8192,
60
- url: `${HF_BASE_URL}/ruvltra-medium-1.1b-q4_k_m.gguf`,
61
- },
62
- };
63
- /** Model aliases for convenience */
64
- export const MODEL_ALIASES = {
65
- 'cc': 'claude-code',
66
- 'claudecode': 'claude-code',
67
- 'claude': 'claude-code',
68
- 's': 'small',
69
- 'sm': 'small',
70
- 'm': 'medium',
71
- 'med': 'medium',
72
- 'default': 'claude-code',
73
- };
74
- /**
75
- * Get the default models directory
76
- */
77
- export function getDefaultModelsDir() {
78
- return join(homedir(), '.ruvllm', 'models');
79
- }
80
- /**
81
- * Resolve model ID from alias or direct ID
82
- */
83
- export function resolveModelId(modelIdOrAlias) {
84
- const normalized = modelIdOrAlias.toLowerCase().trim();
85
- // Direct match
86
- if (RUVLTRA_MODELS[normalized]) {
87
- return normalized;
88
- }
89
- // Alias match
90
- if (MODEL_ALIASES[normalized]) {
91
- return MODEL_ALIASES[normalized];
92
- }
93
- return null;
94
- }
95
- /**
96
- * Get model info by ID or alias
97
- */
98
- export function getModelInfo(modelIdOrAlias) {
99
- const id = resolveModelId(modelIdOrAlias);
100
- return id ? RUVLTRA_MODELS[id] : null;
101
- }
102
- /**
103
- * List all available models
104
- */
105
- export function listModels() {
106
- return Object.values(RUVLTRA_MODELS);
107
- }
108
- /**
109
- * Model downloader for RuvLTRA GGUF models
110
- */
111
- export class ModelDownloader {
112
- constructor(modelsDir) {
113
- this.modelsDir = modelsDir || getDefaultModelsDir();
114
- }
115
- /**
116
- * Get the path where a model would be saved
117
- */
118
- getModelPath(modelIdOrAlias) {
119
- const model = getModelInfo(modelIdOrAlias);
120
- if (!model)
121
- return null;
122
- return join(this.modelsDir, model.filename);
123
- }
124
- /**
125
- * Check if a model is already downloaded
126
- */
127
- isDownloaded(modelIdOrAlias) {
128
- const path = this.getModelPath(modelIdOrAlias);
129
- if (!path)
130
- return false;
131
- if (!existsSync(path))
132
- return false;
133
- // Verify size matches expected
134
- const model = getModelInfo(modelIdOrAlias);
135
- if (!model)
136
- return false;
137
- const stats = statSync(path);
138
- // Allow 5% variance for size check
139
- const minSize = model.sizeBytes * 0.95;
140
- return stats.size >= minSize;
141
- }
142
- /**
143
- * Get download status for all models
144
- */
145
- getStatus() {
146
- return listModels().map(model => ({
147
- model,
148
- downloaded: this.isDownloaded(model.id),
149
- path: this.getModelPath(model.id),
150
- }));
151
- }
152
- /**
153
- * Download a model from HuggingFace
154
- */
155
- async download(modelIdOrAlias, options = {}) {
156
- const model = getModelInfo(modelIdOrAlias);
157
- if (!model) {
158
- const available = listModels().map(m => m.id).join(', ');
159
- throw new Error(`Unknown model: ${modelIdOrAlias}. Available models: ${available}`);
160
- }
161
- const destDir = options.modelsDir || this.modelsDir;
162
- const destPath = join(destDir, model.filename);
163
- // Check if already downloaded
164
- if (!options.force && this.isDownloaded(model.id)) {
165
- return destPath;
166
- }
167
- // Ensure directory exists
168
- if (!existsSync(destDir)) {
169
- mkdirSync(destDir, { recursive: true });
170
- }
171
- // Download with progress tracking
172
- const tempPath = `${destPath}.tmp`;
173
- let startTime = Date.now();
174
- let lastProgressTime = startTime;
175
- let lastDownloaded = 0;
176
- try {
177
- // Use dynamic import for node-fetch if native fetch not available
178
- const fetchFn = globalThis.fetch || (await import('node:https')).default;
179
- const response = await fetch(model.url, {
180
- headers: {
181
- 'User-Agent': 'RuvLLM/2.3.0',
182
- },
183
- });
184
- if (!response.ok) {
185
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
186
- }
187
- const contentLength = parseInt(response.headers.get('content-length') || String(model.sizeBytes));
188
- // Create write stream
189
- const fileStream = createWriteStream(tempPath);
190
- let downloaded = 0;
191
- // Stream with progress
192
- const reader = response.body?.getReader();
193
- if (!reader) {
194
- throw new Error('Response body is not readable');
195
- }
196
- while (true) {
197
- const { done, value } = await reader.read();
198
- if (done)
199
- break;
200
- downloaded += value.length;
201
- fileStream.write(value);
202
- // Report progress
203
- if (options.onProgress) {
204
- const now = Date.now();
205
- const elapsed = (now - lastProgressTime) / 1000;
206
- const bytesThisInterval = downloaded - lastDownloaded;
207
- const speedBps = elapsed > 0 ? bytesThisInterval / elapsed : 0;
208
- const remaining = contentLength - downloaded;
209
- const etaSeconds = speedBps > 0 ? remaining / speedBps : 0;
210
- options.onProgress({
211
- modelId: model.id,
212
- downloaded,
213
- total: contentLength,
214
- percent: Math.round((downloaded / contentLength) * 100),
215
- speedBps,
216
- etaSeconds,
217
- });
218
- lastProgressTime = now;
219
- lastDownloaded = downloaded;
220
- }
221
- }
222
- fileStream.end();
223
- // Wait for file to be fully written
224
- await new Promise((resolve, reject) => {
225
- fileStream.on('finish', resolve);
226
- fileStream.on('error', reject);
227
- });
228
- // Move temp file to final destination
229
- if (existsSync(destPath)) {
230
- unlinkSync(destPath);
231
- }
232
- renameSync(tempPath, destPath);
233
- return destPath;
234
- }
235
- catch (error) {
236
- // Clean up temp file on error
237
- if (existsSync(tempPath)) {
238
- try {
239
- unlinkSync(tempPath);
240
- }
241
- catch { }
242
- }
243
- throw error;
244
- }
245
- }
246
- /**
247
- * Download all available models
248
- */
249
- async downloadAll(options = {}) {
250
- const paths = [];
251
- for (const model of listModels()) {
252
- const path = await this.download(model.id, options);
253
- paths.push(path);
254
- }
255
- return paths;
256
- }
257
- /**
258
- * Delete a downloaded model
259
- */
260
- delete(modelIdOrAlias) {
261
- const path = this.getModelPath(modelIdOrAlias);
262
- if (!path || !existsSync(path)) {
263
- return false;
264
- }
265
- unlinkSync(path);
266
- return true;
267
- }
268
- /**
269
- * Delete all downloaded models
270
- */
271
- deleteAll() {
272
- let count = 0;
273
- for (const model of listModels()) {
274
- if (this.delete(model.id)) {
275
- count++;
276
- }
277
- }
278
- return count;
279
- }
280
- }
281
- export default ModelDownloader;
282
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxJQUFJLEVBQVcsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQTJEN0IsNkJBQTZCO0FBQzdCLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQztBQUM5QixNQUFNLFdBQVcsR0FBRywwQkFBMEIsT0FBTyxlQUFlLENBQUM7QUFFckUsK0JBQStCO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBOEI7SUFDdkQsYUFBYSxFQUFFO1FBQ2IsRUFBRSxFQUFFLGFBQWE7UUFDakIsSUFBSSxFQUFFLHFCQUFxQjtRQUMzQixRQUFRLEVBQUUsc0NBQXNDO1FBQ2hELFNBQVMsRUFBRSxTQUFXO1FBQ3RCLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFLE1BQU07UUFDbEIsT0FBTyxFQUFFLHVDQUF1QztRQUNoRCxZQUFZLEVBQUUsUUFBUTtRQUN0QixhQUFhLEVBQUUsSUFBSTtRQUNuQixHQUFHLEVBQUUsR0FBRyxXQUFXLHVDQUF1QztLQUMzRDtJQUNELE9BQU8sRUFBRTtRQUNQLEVBQUUsRUFBRSxPQUFPO1FBQ1gsSUFBSSxFQUFFLGVBQWU7UUFDckIsUUFBUSxFQUFFLGdDQUFnQztRQUMxQyxTQUFTLEVBQUUsU0FBVztRQUN0QixJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLE9BQU8sRUFBRSxzREFBc0Q7UUFDL0QsWUFBWSxFQUFFLFFBQVE7UUFDdEIsYUFBYSxFQUFFLElBQUk7UUFDbkIsR0FBRyxFQUFFLEdBQUcsV0FBVyxpQ0FBaUM7S0FDckQ7SUFDRCxRQUFRLEVBQUU7UUFDUixFQUFFLEVBQUUsUUFBUTtRQUNaLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsUUFBUSxFQUFFLGlDQUFpQztRQUMzQyxTQUFTLEVBQUUsU0FBVztRQUN0QixJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLE9BQU8sRUFBRSx1Q0FBdUM7UUFDaEQsWUFBWSxFQUFFLFFBQVE7UUFDdEIsYUFBYSxFQUFFLElBQUk7UUFDbkIsR0FBRyxFQUFFLEdBQUcsV0FBVyxrQ0FBa0M7S0FDdEQ7Q0FDRixDQUFDO0FBRUYsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBMkI7SUFDbkQsSUFBSSxFQUFFLGFBQWE7SUFDbkIsWUFBWSxFQUFFLGFBQWE7SUFDM0IsUUFBUSxFQUFFLGFBQWE7SUFDdkIsR0FBRyxFQUFFLE9BQU87SUFDWixJQUFJLEVBQUUsT0FBTztJQUNiLEdBQUcsRUFBRSxRQUFRO0lBQ2IsS0FBSyxFQUFFLFFBQVE7SUFDZixTQUFTLEVBQUUsYUFBYTtDQUN6QixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLGNBQXNCO0lBQ25ELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUV2RCxlQUFlO0lBQ2YsSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsY0FBYztJQUNkLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxjQUFzQjtJQUNqRCxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3hDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUFZLFNBQWtCO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLG1CQUFtQixFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLGNBQXNCO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxjQUFzQjtRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVwQywrQkFBK0I7UUFDL0IsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFekIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLG1DQUFtQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN2QyxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxPQUFPLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsS0FBSztZQUNMLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBRTtTQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQ1osY0FBc0IsRUFDdEIsVUFBMkIsRUFBRTtRQUU3QixNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTSxTQUFTLEdBQUcsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RCxNQUFNLElBQUksS0FBSyxDQUNiLGtCQUFrQixjQUFjLHVCQUF1QixTQUFTLEVBQUUsQ0FDbkUsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFL0MsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDekIsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxRQUFRLE1BQU0sQ0FBQztRQUNuQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQztZQUNILGtFQUFrRTtZQUNsRSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFFekUsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDdEMsT0FBTyxFQUFFO29CQUNQLFlBQVksRUFBRSxjQUFjO2lCQUM3QjthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFFRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQzVCLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FDbEUsQ0FBQztZQUVGLHNCQUFzQjtZQUN0QixNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFFbkIsdUJBQXVCO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBRUQsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDWixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM1QyxJQUFJLElBQUk7b0JBQUUsTUFBTTtnQkFFaEIsVUFBVSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzNCLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXhCLGtCQUFrQjtnQkFDbEIsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQ2hELE1BQU0saUJBQWlCLEdBQUcsVUFBVSxHQUFHLGNBQWMsQ0FBQztvQkFDdEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9ELE1BQU0sU0FBUyxHQUFHLGFBQWEsR0FBRyxVQUFVLENBQUM7b0JBQzdDLE1BQU0sVUFBVSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFM0QsT0FBTyxDQUFDLFVBQVUsQ0FBQzt3QkFDakIsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUNqQixVQUFVO3dCQUNWLEtBQUssRUFBRSxhQUFhO3dCQUNwQixPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsR0FBRyxHQUFHLENBQUM7d0JBQ3ZELFFBQVE7d0JBQ1IsVUFBVTtxQkFDWCxDQUFDLENBQUM7b0JBRUgsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO29CQUN2QixjQUFjLEdBQUcsVUFBVSxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQztZQUVELFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUVqQixvQ0FBb0M7WUFDcEMsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDMUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pDLFVBQVUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1lBRUgsc0NBQXNDO1lBQ3RDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBQ0QsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUUvQixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDhCQUE4QjtZQUM5QixJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUM7b0JBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUEyQixFQUFFO1FBQzdDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDcEQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBc0I7UUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNQLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLEtBQUssTUFBTSxLQUFLLElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxDQUFDO1lBQ1YsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRjtBQUVELGVBQWUsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSdXZMVFJBIE1vZGVsIFJlZ2lzdHJ5IGFuZCBEb3dubG9hZGVyXG4gKlxuICogQXV0b21hdGljYWxseSBkb3dubG9hZHMgR0dVRiBtb2RlbHMgZnJvbSBIdWdnaW5nRmFjZSBIdWIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IE1vZGVsRG93bmxvYWRlciwgUlVWTFRSQV9NT0RFTFMgfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcbiAqXG4gKiAvLyBEb3dubG9hZCB0aGUgQ2xhdWRlIENvZGUgb3B0aW1pemVkIG1vZGVsXG4gKiBjb25zdCBkb3dubG9hZGVyID0gbmV3IE1vZGVsRG93bmxvYWRlcigpO1xuICogY29uc3QgbW9kZWxQYXRoID0gYXdhaXQgZG93bmxvYWRlci5kb3dubG9hZCgnY2xhdWRlLWNvZGUnKTtcbiAqXG4gKiAvLyBPciBkb3dubG9hZCBhbGwgbW9kZWxzXG4gKiBhd2FpdCBkb3dubG9hZGVyLmRvd25sb2FkQWxsKCk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVXcml0ZVN0cmVhbSwgZXhpc3RzU3luYywgbWtkaXJTeW5jLCBzdGF0U3luYywgdW5saW5rU3luYywgcmVuYW1lU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJ3N0cmVhbS9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcblxuLyoqIE1vZGVsIGluZm9ybWF0aW9uIGZyb20gSHVnZ2luZ0ZhY2UgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxJbmZvIHtcbiAgLyoqIE1vZGVsIGlkZW50aWZpZXIgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIERpc3BsYXkgbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBNb2RlbCBmaWxlbmFtZSBvbiBIdWdnaW5nRmFjZSAqL1xuICBmaWxlbmFtZTogc3RyaW5nO1xuICAvKiogTW9kZWwgc2l6ZSBpbiBieXRlcyAqL1xuICBzaXplQnl0ZXM6IG51bWJlcjtcbiAgLyoqIE1vZGVsIHNpemUgKGh1bWFuIHJlYWRhYmxlKSAqL1xuICBzaXplOiBzdHJpbmc7XG4gIC8qKiBQYXJhbWV0ZXIgY291bnQgKi9cbiAgcGFyYW1ldGVyczogc3RyaW5nO1xuICAvKiogVXNlIGNhc2UgZGVzY3JpcHRpb24gKi9cbiAgdXNlQ2FzZTogc3RyaW5nO1xuICAvKiogUXVhbnRpemF0aW9uIHR5cGUgKi9cbiAgcXVhbnRpemF0aW9uOiBzdHJpbmc7XG4gIC8qKiBDb250ZXh0IHdpbmRvdyBzaXplICovXG4gIGNvbnRleHRMZW5ndGg6IG51bWJlcjtcbiAgLyoqIEh1Z2dpbmdGYWNlIGRvd25sb2FkIFVSTCAqL1xuICB1cmw6IHN0cmluZztcbn1cblxuLyoqIERvd25sb2FkIHByb2dyZXNzIGNhbGxiYWNrICovXG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKHByb2dyZXNzOiBEb3dubG9hZFByb2dyZXNzKSA9PiB2b2lkO1xuXG4vKiogRG93bmxvYWQgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG93bmxvYWRQcm9ncmVzcyB7XG4gIC8qKiBNb2RlbCBiZWluZyBkb3dubG9hZGVkICovXG4gIG1vZGVsSWQ6IHN0cmluZztcbiAgLyoqIEJ5dGVzIGRvd25sb2FkZWQgc28gZmFyICovXG4gIGRvd25sb2FkZWQ6IG51bWJlcjtcbiAgLyoqIFRvdGFsIGJ5dGVzIHRvIGRvd25sb2FkICovXG4gIHRvdGFsOiBudW1iZXI7XG4gIC8qKiBEb3dubG9hZCBwZXJjZW50YWdlICgwLTEwMCkgKi9cbiAgcGVyY2VudDogbnVtYmVyO1xuICAvKiogRG93bmxvYWQgc3BlZWQgaW4gYnl0ZXMgcGVyIHNlY29uZCAqL1xuICBzcGVlZEJwczogbnVtYmVyO1xuICAvKiogRXN0aW1hdGVkIHRpbWUgcmVtYWluaW5nIGluIHNlY29uZHMgKi9cbiAgZXRhU2Vjb25kczogbnVtYmVyO1xufVxuXG4vKiogRG93bmxvYWQgb3B0aW9ucyAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3dubG9hZE9wdGlvbnMge1xuICAvKiogRGlyZWN0b3J5IHRvIHNhdmUgbW9kZWxzIChkZWZhdWx0OiB+Ly5ydXZsbG0vbW9kZWxzKSAqL1xuICBtb2RlbHNEaXI/OiBzdHJpbmc7XG4gIC8qKiBGb3JjZSByZS1kb3dubG9hZCBldmVuIGlmIGZpbGUgZXhpc3RzICovXG4gIGZvcmNlPzogYm9vbGVhbjtcbiAgLyoqIFByb2dyZXNzIGNhbGxiYWNrICovXG4gIG9uUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAvKiogVmVyaWZ5IGZpbGUgaW50ZWdyaXR5IGFmdGVyIGRvd25sb2FkICovXG4gIHZlcmlmeT86IGJvb2xlYW47XG59XG5cbi8qKiBIdWdnaW5nRmFjZSByZXBvc2l0b3J5ICovXG5jb25zdCBIRl9SRVBPID0gJ3J1di9ydXZsdHJhJztcbmNvbnN0IEhGX0JBU0VfVVJMID0gYGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vJHtIRl9SRVBPfS9yZXNvbHZlL21haW5gO1xuXG4vKiogQXZhaWxhYmxlIFJ1dkxUUkEgbW9kZWxzICovXG5leHBvcnQgY29uc3QgUlVWTFRSQV9NT0RFTFM6IFJlY29yZDxzdHJpbmcsIE1vZGVsSW5mbz4gPSB7XG4gICdjbGF1ZGUtY29kZSc6IHtcbiAgICBpZDogJ2NsYXVkZS1jb2RlJyxcbiAgICBuYW1lOiAnUnV2TFRSQSBDbGF1ZGUgQ29kZScsXG4gICAgZmlsZW5hbWU6ICdydXZsdHJhLWNsYXVkZS1jb2RlLTAuNWItcTRfa19tLmdndWYnLFxuICAgIHNpemVCeXRlczogMzk4XzAwMF8wMDAsXG4gICAgc2l6ZTogJzM5OCBNQicsXG4gICAgcGFyYW1ldGVyczogJzAuNUInLFxuICAgIHVzZUNhc2U6ICdDbGF1ZGUgQ29kZSB3b3JrZmxvd3MsIGFnZW50aWMgY29kaW5nJyxcbiAgICBxdWFudGl6YXRpb246ICdRNF9LX00nLFxuICAgIGNvbnRleHRMZW5ndGg6IDQwOTYsXG4gICAgdXJsOiBgJHtIRl9CQVNFX1VSTH0vcnV2bHRyYS1jbGF1ZGUtY29kZS0wLjViLXE0X2tfbS5nZ3VmYCxcbiAgfSxcbiAgJ3NtYWxsJzoge1xuICAgIGlkOiAnc21hbGwnLFxuICAgIG5hbWU6ICdSdXZMVFJBIFNtYWxsJyxcbiAgICBmaWxlbmFtZTogJ3J1dmx0cmEtc21hbGwtMC41Yi1xNF9rX20uZ2d1ZicsXG4gICAgc2l6ZUJ5dGVzOiAzOThfMDAwXzAwMCxcbiAgICBzaXplOiAnMzk4IE1CJyxcbiAgICBwYXJhbWV0ZXJzOiAnMC41QicsXG4gICAgdXNlQ2FzZTogJ0VkZ2UgZGV2aWNlcywgSW9ULCByZXNvdXJjZS1jb25zdHJhaW5lZCBlbnZpcm9ubWVudHMnLFxuICAgIHF1YW50aXphdGlvbjogJ1E0X0tfTScsXG4gICAgY29udGV4dExlbmd0aDogNDA5NixcbiAgICB1cmw6IGAke0hGX0JBU0VfVVJMfS9ydXZsdHJhLXNtYWxsLTAuNWItcTRfa19tLmdndWZgLFxuICB9LFxuICAnbWVkaXVtJzoge1xuICAgIGlkOiAnbWVkaXVtJyxcbiAgICBuYW1lOiAnUnV2TFRSQSBNZWRpdW0nLFxuICAgIGZpbGVuYW1lOiAncnV2bHRyYS1tZWRpdW0tMS4xYi1xNF9rX20uZ2d1ZicsXG4gICAgc2l6ZUJ5dGVzOiA2NjlfMDAwXzAwMCxcbiAgICBzaXplOiAnNjY5IE1CJyxcbiAgICBwYXJhbWV0ZXJzOiAnMS4xQicsXG4gICAgdXNlQ2FzZTogJ0dlbmVyYWwgcHVycG9zZSwgYmFsYW5jZWQgcGVyZm9ybWFuY2UnLFxuICAgIHF1YW50aXphdGlvbjogJ1E0X0tfTScsXG4gICAgY29udGV4dExlbmd0aDogODE5MixcbiAgICB1cmw6IGAke0hGX0JBU0VfVVJMfS9ydXZsdHJhLW1lZGl1bS0xLjFiLXE0X2tfbS5nZ3VmYCxcbiAgfSxcbn07XG5cbi8qKiBNb2RlbCBhbGlhc2VzIGZvciBjb252ZW5pZW5jZSAqL1xuZXhwb3J0IGNvbnN0IE1PREVMX0FMSUFTRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdjYyc6ICdjbGF1ZGUtY29kZScsXG4gICdjbGF1ZGVjb2RlJzogJ2NsYXVkZS1jb2RlJyxcbiAgJ2NsYXVkZSc6ICdjbGF1ZGUtY29kZScsXG4gICdzJzogJ3NtYWxsJyxcbiAgJ3NtJzogJ3NtYWxsJyxcbiAgJ20nOiAnbWVkaXVtJyxcbiAgJ21lZCc6ICdtZWRpdW0nLFxuICAnZGVmYXVsdCc6ICdjbGF1ZGUtY29kZScsXG59O1xuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCBtb2RlbHMgZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0TW9kZWxzRGlyKCk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKGhvbWVkaXIoKSwgJy5ydXZsbG0nLCAnbW9kZWxzJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBtb2RlbCBJRCBmcm9tIGFsaWFzIG9yIGRpcmVjdCBJRFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1vZGVsSWQobW9kZWxJZE9yQWxpYXM6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBub3JtYWxpemVkID0gbW9kZWxJZE9yQWxpYXMudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgLy8gRGlyZWN0IG1hdGNoXG4gIGlmIChSVVZMVFJBX01PREVMU1tub3JtYWxpemVkXSkge1xuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgLy8gQWxpYXMgbWF0Y2hcbiAgaWYgKE1PREVMX0FMSUFTRVNbbm9ybWFsaXplZF0pIHtcbiAgICByZXR1cm4gTU9ERUxfQUxJQVNFU1tub3JtYWxpemVkXTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEdldCBtb2RlbCBpbmZvIGJ5IElEIG9yIGFsaWFzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEluZm8obW9kZWxJZE9yQWxpYXM6IHN0cmluZyk6IE1vZGVsSW5mbyB8IG51bGwge1xuICBjb25zdCBpZCA9IHJlc29sdmVNb2RlbElkKG1vZGVsSWRPckFsaWFzKTtcbiAgcmV0dXJuIGlkID8gUlVWTFRSQV9NT0RFTFNbaWRdIDogbnVsbDtcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBhdmFpbGFibGUgbW9kZWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzKCk6IE1vZGVsSW5mb1tdIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUlVWTFRSQV9NT0RFTFMpO1xufVxuXG4vKipcbiAqIE1vZGVsIGRvd25sb2FkZXIgZm9yIFJ1dkxUUkEgR0dVRiBtb2RlbHNcbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsRG93bmxvYWRlciB7XG4gIHByaXZhdGUgbW9kZWxzRGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobW9kZWxzRGlyPzogc3RyaW5nKSB7XG4gICAgdGhpcy5tb2RlbHNEaXIgPSBtb2RlbHNEaXIgfHwgZ2V0RGVmYXVsdE1vZGVsc0RpcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGF0aCB3aGVyZSBhIG1vZGVsIHdvdWxkIGJlIHNhdmVkXG4gICAqL1xuICBnZXRNb2RlbFBhdGgobW9kZWxJZE9yQWxpYXM6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IG1vZGVsID0gZ2V0TW9kZWxJbmZvKG1vZGVsSWRPckFsaWFzKTtcbiAgICBpZiAoIW1vZGVsKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gam9pbih0aGlzLm1vZGVsc0RpciwgbW9kZWwuZmlsZW5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbW9kZWwgaXMgYWxyZWFkeSBkb3dubG9hZGVkXG4gICAqL1xuICBpc0Rvd25sb2FkZWQobW9kZWxJZE9yQWxpYXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldE1vZGVsUGF0aChtb2RlbElkT3JBbGlhcyk7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIWV4aXN0c1N5bmMocGF0aCkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFZlcmlmeSBzaXplIG1hdGNoZXMgZXhwZWN0ZWRcbiAgICBjb25zdCBtb2RlbCA9IGdldE1vZGVsSW5mbyhtb2RlbElkT3JBbGlhcyk7XG4gICAgaWYgKCFtb2RlbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgc3RhdHMgPSBzdGF0U3luYyhwYXRoKTtcbiAgICAvLyBBbGxvdyA1JSB2YXJpYW5jZSBmb3Igc2l6ZSBjaGVja1xuICAgIGNvbnN0IG1pblNpemUgPSBtb2RlbC5zaXplQnl0ZXMgKiAwLjk1O1xuICAgIHJldHVybiBzdGF0cy5zaXplID49IG1pblNpemU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRvd25sb2FkIHN0YXR1cyBmb3IgYWxsIG1vZGVsc1xuICAgKi9cbiAgZ2V0U3RhdHVzKCk6IHsgbW9kZWw6IE1vZGVsSW5mbzsgZG93bmxvYWRlZDogYm9vbGVhbjsgcGF0aDogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIGxpc3RNb2RlbHMoKS5tYXAobW9kZWwgPT4gKHtcbiAgICAgIG1vZGVsLFxuICAgICAgZG93bmxvYWRlZDogdGhpcy5pc0Rvd25sb2FkZWQobW9kZWwuaWQpLFxuICAgICAgcGF0aDogdGhpcy5nZXRNb2RlbFBhdGgobW9kZWwuaWQpISxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWQgYSBtb2RlbCBmcm9tIEh1Z2dpbmdGYWNlXG4gICAqL1xuICBhc3luYyBkb3dubG9hZChcbiAgICBtb2RlbElkT3JBbGlhczogc3RyaW5nLFxuICAgIG9wdGlvbnM6IERvd25sb2FkT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbW9kZWwgPSBnZXRNb2RlbEluZm8obW9kZWxJZE9yQWxpYXMpO1xuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IGxpc3RNb2RlbHMoKS5tYXAobSA9PiBtLmlkKS5qb2luKCcsICcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5rbm93biBtb2RlbDogJHttb2RlbElkT3JBbGlhc30uIEF2YWlsYWJsZSBtb2RlbHM6ICR7YXZhaWxhYmxlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzdERpciA9IG9wdGlvbnMubW9kZWxzRGlyIHx8IHRoaXMubW9kZWxzRGlyO1xuICAgIGNvbnN0IGRlc3RQYXRoID0gam9pbihkZXN0RGlyLCBtb2RlbC5maWxlbmFtZSk7XG5cbiAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGRvd25sb2FkZWRcbiAgICBpZiAoIW9wdGlvbnMuZm9yY2UgJiYgdGhpcy5pc0Rvd25sb2FkZWQobW9kZWwuaWQpKSB7XG4gICAgICByZXR1cm4gZGVzdFBhdGg7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGVzdERpcikpIHtcbiAgICAgIG1rZGlyU3luYyhkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBEb3dubG9hZCB3aXRoIHByb2dyZXNzIHRyYWNraW5nXG4gICAgY29uc3QgdGVtcFBhdGggPSBgJHtkZXN0UGF0aH0udG1wYDtcbiAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgbGFzdFByb2dyZXNzVGltZSA9IHN0YXJ0VGltZTtcbiAgICBsZXQgbGFzdERvd25sb2FkZWQgPSAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBkeW5hbWljIGltcG9ydCBmb3Igbm9kZS1mZXRjaCBpZiBuYXRpdmUgZmV0Y2ggbm90IGF2YWlsYWJsZVxuICAgICAgY29uc3QgZmV0Y2hGbiA9IGdsb2JhbFRoaXMuZmV0Y2ggfHwgKGF3YWl0IGltcG9ydCgnbm9kZTpodHRwcycpKS5kZWZhdWx0O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKG1vZGVsLnVybCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiAnUnV2TExNLzIuMy4wJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IHBhcnNlSW50KFxuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSB8fCBTdHJpbmcobW9kZWwuc2l6ZUJ5dGVzKVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIHdyaXRlIHN0cmVhbVxuICAgICAgY29uc3QgZmlsZVN0cmVhbSA9IGNyZWF0ZVdyaXRlU3RyZWFtKHRlbXBQYXRoKTtcbiAgICAgIGxldCBkb3dubG9hZGVkID0gMDtcblxuICAgICAgLy8gU3RyZWFtIHdpdGggcHJvZ3Jlc3NcbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpO1xuICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSBib2R5IGlzIG5vdCByZWFkYWJsZScpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG5cbiAgICAgICAgZG93bmxvYWRlZCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIGZpbGVTdHJlYW0ud3JpdGUodmFsdWUpO1xuXG4gICAgICAgIC8vIFJlcG9ydCBwcm9ncmVzc1xuICAgICAgICBpZiAob3B0aW9ucy5vblByb2dyZXNzKSB7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBlbGFwc2VkID0gKG5vdyAtIGxhc3RQcm9ncmVzc1RpbWUpIC8gMTAwMDtcbiAgICAgICAgICBjb25zdCBieXRlc1RoaXNJbnRlcnZhbCA9IGRvd25sb2FkZWQgLSBsYXN0RG93bmxvYWRlZDtcbiAgICAgICAgICBjb25zdCBzcGVlZEJwcyA9IGVsYXBzZWQgPiAwID8gYnl0ZXNUaGlzSW50ZXJ2YWwgLyBlbGFwc2VkIDogMDtcbiAgICAgICAgICBjb25zdCByZW1haW5pbmcgPSBjb250ZW50TGVuZ3RoIC0gZG93bmxvYWRlZDtcbiAgICAgICAgICBjb25zdCBldGFTZWNvbmRzID0gc3BlZWRCcHMgPiAwID8gcmVtYWluaW5nIC8gc3BlZWRCcHMgOiAwO1xuXG4gICAgICAgICAgb3B0aW9ucy5vblByb2dyZXNzKHtcbiAgICAgICAgICAgIG1vZGVsSWQ6IG1vZGVsLmlkLFxuICAgICAgICAgICAgZG93bmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgcGVyY2VudDogTWF0aC5yb3VuZCgoZG93bmxvYWRlZCAvIGNvbnRlbnRMZW5ndGgpICogMTAwKSxcbiAgICAgICAgICAgIHNwZWVkQnBzLFxuICAgICAgICAgICAgZXRhU2Vjb25kcyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGxhc3RQcm9ncmVzc1RpbWUgPSBub3c7XG4gICAgICAgICAgbGFzdERvd25sb2FkZWQgPSBkb3dubG9hZGVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZpbGVTdHJlYW0uZW5kKCk7XG5cbiAgICAgIC8vIFdhaXQgZm9yIGZpbGUgdG8gYmUgZnVsbHkgd3JpdHRlblxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBmaWxlU3RyZWFtLm9uKCdmaW5pc2gnLCByZXNvbHZlKTtcbiAgICAgICAgZmlsZVN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIE1vdmUgdGVtcCBmaWxlIHRvIGZpbmFsIGRlc3RpbmF0aW9uXG4gICAgICBpZiAoZXhpc3RzU3luYyhkZXN0UGF0aCkpIHtcbiAgICAgICAgdW5saW5rU3luYyhkZXN0UGF0aCk7XG4gICAgICB9XG4gICAgICByZW5hbWVTeW5jKHRlbXBQYXRoLCBkZXN0UGF0aCk7XG5cbiAgICAgIHJldHVybiBkZXN0UGF0aDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ2xlYW4gdXAgdGVtcCBmaWxlIG9uIGVycm9yXG4gICAgICBpZiAoZXhpc3RzU3luYyh0ZW1wUGF0aCkpIHtcbiAgICAgICAgdHJ5IHsgdW5saW5rU3luYyh0ZW1wUGF0aCk7IH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCBhbGwgYXZhaWxhYmxlIG1vZGVsc1xuICAgKi9cbiAgYXN5bmMgZG93bmxvYWRBbGwob3B0aW9uczogRG93bmxvYWRPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiBsaXN0TW9kZWxzKCkpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCB0aGlzLmRvd25sb2FkKG1vZGVsLmlkLCBvcHRpb25zKTtcbiAgICAgIHBhdGhzLnB1c2gocGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBkb3dubG9hZGVkIG1vZGVsXG4gICAqL1xuICBkZWxldGUobW9kZWxJZE9yQWxpYXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldE1vZGVsUGF0aChtb2RlbElkT3JBbGlhcyk7XG4gICAgaWYgKCFwYXRoIHx8ICFleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHVubGlua1N5bmMocGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFsbCBkb3dubG9hZGVkIG1vZGVsc1xuICAgKi9cbiAgZGVsZXRlQWxsKCk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIGxpc3RNb2RlbHMoKSkge1xuICAgICAgaWYgKHRoaXMuZGVsZXRlKG1vZGVsLmlkKSkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTW9kZWxEb3dubG9hZGVyO1xuIl19
@@ -1,140 +0,0 @@
1
- /**
2
- * Native bindings loader for RuvLLM
3
- *
4
- * Automatically loads the correct native binary for the current platform.
5
- */
6
- interface NativeRuvLLM {
7
- RuvLLMEngine: new (config?: NativeConfig) => NativeEngine;
8
- SimdOperations: new () => NativeSimdOps;
9
- version: () => string;
10
- hasSimdSupport: () => boolean;
11
- }
12
- interface NativeConfig {
13
- embedding_dim?: number;
14
- router_hidden_dim?: number;
15
- hnsw_m?: number;
16
- hnsw_ef_construction?: number;
17
- hnsw_ef_search?: number;
18
- learning_enabled?: boolean;
19
- quality_threshold?: number;
20
- ewc_lambda?: number;
21
- }
22
- interface NativeEngine {
23
- query(text: string, config?: NativeGenConfig): NativeQueryResponse;
24
- /**
25
- * Builds with `loadModel` return a generation result and throw while no
26
- * model is loaded; older builds (the 2.0.x platform packages) return a
27
- * string that is not model output, so the wrapper never calls them.
28
- */
29
- generate(prompt: string, config?: NativeGenConfig): NativeGenerationResult | string;
30
- /**
31
- * Present on builds since model loading was added. Those built without the
32
- * `candle` feature throw `RUVLLM_NO_INFERENCE_BACKEND`; see
33
- * `supportsModelLoading`.
34
- */
35
- loadModel?(path: string, options?: NativeLoadModelOptions): NativeModelInfo;
36
- /** Whether the binary was built with the `candle` feature (absent on older builds). */
37
- supportsModelLoading?(): boolean;
38
- unloadModel?(): void;
39
- isModelLoaded?(): boolean;
40
- modelInfo?(): NativeModelInfo | null;
41
- chat?(messages: NativeChatMessage[], config?: NativeGenConfig): NativeGenerationResult;
42
- route(text: string): NativeRoutingDecision;
43
- searchMemory(text: string, k?: number): NativeMemoryResult[];
44
- /** Current native builds return a UUID string; older ones returned a number. */
45
- addMemory(content: string, metadata?: string): string | number;
46
- feedback(requestId: string, rating: number, correction?: string): boolean;
47
- stats(): NativeStats;
48
- forceLearn(): string;
49
- embed(text: string): number[];
50
- similarity(text1: string, text2: string): number;
51
- hasSimd(): boolean;
52
- simdCapabilities(): string[];
53
- }
54
- interface NativeGenConfig {
55
- maxTokens?: number;
56
- temperature?: number;
57
- topP?: number;
58
- topK?: number;
59
- repetitionPenalty?: number;
60
- stopSequences?: string[];
61
- seed?: number;
62
- }
63
- interface NativeLoadModelOptions {
64
- maxContext?: number;
65
- }
66
- interface NativeChatMessage {
67
- role: string;
68
- content: string;
69
- }
70
- interface NativeGenerationResult {
71
- text: string;
72
- promptTokens: number;
73
- completionTokens: number;
74
- finishReason: string;
75
- }
76
- interface NativeModelInfo {
77
- name: string;
78
- architecture: string;
79
- numParameters: number;
80
- vocabSize: number;
81
- hiddenSize: number;
82
- numLayers: number;
83
- maxContextLength: number;
84
- quantization?: string | null;
85
- memoryUsageBytes: number;
86
- chatTemplate?: string | null;
87
- }
88
- interface NativeQueryResponse {
89
- text: string;
90
- confidence: number;
91
- model: string;
92
- contextSize: number;
93
- latencyMs: number;
94
- requestId: string;
95
- /** Builds with `loadModel` also report token usage. */
96
- promptTokens?: number;
97
- completionTokens?: number;
98
- finishReason?: string;
99
- context_size?: number;
100
- latency_ms?: number;
101
- request_id?: string;
102
- }
103
- interface NativeRoutingDecision {
104
- model: string;
105
- contextSize: number;
106
- temperature: number;
107
- top_p?: number;
108
- topP: number;
109
- confidence: number;
110
- context_size?: number;
111
- }
112
- interface NativeMemoryResult {
113
- id: string | number;
114
- /** Distance (smaller is closer) as reported by the current native build. */
115
- distance?: number;
116
- /** Similarity, emitted by older native builds. */
117
- score?: number;
118
- content: string;
119
- metadata: string;
120
- }
121
- interface NativeStats {
122
- total_queries: number;
123
- memory_nodes: number;
124
- patterns_learned: number;
125
- avg_latency_ms: number;
126
- cache_hit_rate: number;
127
- router_accuracy: number;
128
- }
129
- interface NativeSimdOps {
130
- dotProduct(a: number[], b: number[]): number;
131
- cosineSimilarity(a: number[], b: number[]): number;
132
- l2Distance(a: number[], b: number[]): number;
133
- matvec(matrix: number[][], vector: number[]): number[];
134
- softmax(input: number[]): number[];
135
- }
136
- export declare function getNativeModule(): NativeRuvLLM | null;
137
- export declare function version(): string;
138
- export declare function hasSimdSupport(): boolean;
139
- export type { NativeRuvLLM, NativeConfig, NativeEngine, NativeGenConfig, NativeLoadModelOptions, NativeChatMessage, NativeGenerationResult, NativeModelInfo, NativeQueryResponse, NativeRoutingDecision, NativeMemoryResult, NativeStats, NativeSimdOps, };
140
- //# sourceMappingURL=native.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/native.ts"],"names":[],"mappings":"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"}