@ruvector/ruvllm 4.0.0 → 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.
- package/README.md +449 -158
- package/bin/cli.js +1066 -0
- package/bin/gpu-delegate.js +67 -0
- package/bin/ruvllm-adapters.js +5 -0
- package/bin/ruvllm-gpu-loop.js +5 -0
- package/bin/serve.js +265 -0
- package/dist/cjs/benchmarks/embedding-benchmark.d.ts +102 -0
- package/dist/cjs/benchmarks/embedding-benchmark.d.ts.map +1 -0
- package/dist/cjs/benchmarks/embedding-benchmark.js +436 -0
- package/dist/cjs/benchmarks/index.d.ts +34 -0
- package/dist/cjs/benchmarks/index.d.ts.map +1 -0
- package/dist/cjs/benchmarks/index.js +132 -0
- package/dist/cjs/benchmarks/model-comparison.d.ts +71 -0
- package/dist/cjs/benchmarks/model-comparison.d.ts.map +1 -0
- package/dist/cjs/benchmarks/model-comparison.js +476 -0
- package/dist/cjs/benchmarks/routing-benchmark.d.ts +70 -0
- package/dist/cjs/benchmarks/routing-benchmark.d.ts.map +1 -0
- package/dist/cjs/benchmarks/routing-benchmark.js +289 -0
- package/dist/cjs/contrastive.d.ts +229 -0
- package/dist/cjs/contrastive.d.ts.map +1 -0
- package/dist/cjs/contrastive.js +589 -0
- package/dist/cjs/engine.d.ts +160 -0
- package/dist/cjs/engine.d.ts.map +1 -0
- package/dist/cjs/engine.js +552 -0
- package/dist/cjs/export.d.ts +182 -0
- package/dist/cjs/export.d.ts.map +1 -0
- package/dist/cjs/export.js +422 -0
- package/dist/cjs/federated.d.ts +233 -0
- package/dist/cjs/federated.d.ts.map +1 -0
- package/dist/cjs/federated.js +525 -0
- package/dist/cjs/index.d.ts +68 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +104 -0
- package/dist/cjs/intelligence.d.ts +136 -0
- package/dist/cjs/intelligence.d.ts.map +1 -0
- package/dist/cjs/intelligence.js +226 -0
- package/dist/cjs/lora.d.ts +251 -0
- package/dist/cjs/lora.d.ts.map +1 -0
- package/dist/cjs/lora.js +509 -0
- package/dist/cjs/models.d.ts +129 -0
- package/dist/cjs/models.d.ts.map +1 -0
- package/dist/cjs/models.js +323 -0
- package/dist/cjs/native.d.ts +140 -0
- package/dist/cjs/native.d.ts.map +1 -0
- package/dist/cjs/native.js +98 -0
- package/dist/cjs/session.d.ts +80 -0
- package/dist/cjs/session.d.ts.map +1 -0
- package/dist/cjs/session.js +203 -0
- package/dist/cjs/simd.d.ts +90 -0
- package/dist/cjs/simd.d.ts.map +1 -0
- package/dist/cjs/simd.js +209 -0
- package/dist/cjs/sona.d.ts +223 -0
- package/dist/cjs/sona.d.ts.map +1 -0
- package/dist/cjs/sona.js +562 -0
- package/dist/cjs/streaming.d.ts +55 -0
- package/dist/cjs/streaming.d.ts.map +1 -0
- package/dist/cjs/streaming.js +131 -0
- package/dist/cjs/training.d.ts +312 -0
- package/dist/cjs/training.d.ts.map +1 -0
- package/dist/cjs/training.js +610 -0
- package/dist/cjs/types.d.ts +696 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/esm/benchmarks/embedding-benchmark.d.ts +102 -0
- package/dist/esm/benchmarks/embedding-benchmark.d.ts.map +1 -0
- package/dist/esm/benchmarks/embedding-benchmark.js +427 -0
- package/dist/esm/benchmarks/index.d.ts +34 -0
- package/dist/esm/benchmarks/index.d.ts.map +1 -0
- package/dist/esm/benchmarks/index.js +110 -0
- package/dist/esm/benchmarks/model-comparison.d.ts +71 -0
- package/dist/esm/benchmarks/model-comparison.d.ts.map +1 -0
- package/dist/esm/benchmarks/model-comparison.js +434 -0
- package/dist/esm/benchmarks/routing-benchmark.d.ts +70 -0
- package/dist/esm/benchmarks/routing-benchmark.d.ts.map +1 -0
- package/dist/esm/benchmarks/routing-benchmark.js +283 -0
- package/dist/esm/contrastive.d.ts +229 -0
- package/dist/esm/contrastive.d.ts.map +1 -0
- package/dist/esm/contrastive.js +578 -0
- package/dist/esm/engine.d.ts +160 -0
- package/dist/esm/engine.d.ts.map +1 -0
- package/dist/esm/engine.js +548 -0
- package/dist/esm/export.d.ts +182 -0
- package/dist/esm/export.d.ts.map +1 -0
- package/dist/esm/export.js +414 -0
- package/dist/esm/federated.d.ts +233 -0
- package/dist/esm/federated.d.ts.map +1 -0
- package/dist/esm/federated.js +520 -0
- package/dist/esm/index.d.ts +68 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +84 -0
- package/dist/esm/intelligence.d.ts +136 -0
- package/dist/esm/intelligence.d.ts.map +1 -0
- package/dist/esm/intelligence.js +188 -0
- package/dist/esm/lora.d.ts +251 -0
- package/dist/esm/lora.d.ts.map +1 -0
- package/dist/esm/lora.js +504 -0
- package/dist/esm/models.d.ts +129 -0
- package/dist/esm/models.d.ts.map +1 -0
- package/dist/esm/models.js +282 -0
- package/dist/esm/native.d.ts +140 -0
- package/dist/esm/native.d.ts.map +1 -0
- package/dist/esm/native.js +100 -0
- package/dist/esm/session.d.ts +80 -0
- package/dist/esm/session.d.ts.map +1 -0
- package/dist/esm/session.js +199 -0
- package/dist/esm/simd.d.ts +90 -0
- package/dist/esm/simd.d.ts.map +1 -0
- package/dist/esm/simd.js +205 -0
- package/dist/esm/sona.d.ts +223 -0
- package/dist/esm/sona.d.ts.map +1 -0
- package/dist/esm/sona.js +556 -0
- package/dist/esm/streaming.d.ts +55 -0
- package/dist/esm/streaming.d.ts.map +1 -0
- package/dist/esm/streaming.js +126 -0
- package/dist/esm/training.d.ts +312 -0
- package/dist/esm/training.d.ts.map +1 -0
- package/dist/esm/training.js +603 -0
- package/dist/esm/types.d.ts +696 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +5 -0
- package/gpu/_load.cjs +38 -0
- package/gpu/_load.mjs +33 -0
- package/gpu/adapters.cjs +3 -0
- package/gpu/adapters.mjs +5 -0
- package/gpu/engine.cjs +3 -0
- package/gpu/engine.mjs +5 -0
- package/gpu/fixture.cjs +3 -0
- package/gpu/fixture.mjs +5 -0
- package/gpu/gpu-host.cjs +3 -0
- package/gpu/gpu-host.mjs +5 -0
- package/gpu/gpu-loop.cjs +3 -0
- package/gpu/gpu-loop.mjs +5 -0
- package/gpu/gpu-spool-adapter.cjs +3 -0
- package/gpu/gpu-spool-adapter.mjs +5 -0
- package/gpu/vast-host-adapter.cjs +3 -0
- package/gpu/vast-host-adapter.mjs +5 -0
- package/package.json +159 -49
- package/scripts/ensemble-model-compare.js +287 -0
- package/scripts/fix-esm-extensions.mjs +220 -0
- package/scripts/huggingface/README.md +537 -0
- package/scripts/huggingface/publish.sh +112 -0
- package/scripts/hybrid-model-compare.js +373 -0
- package/scripts/improved-model-compare.js +288 -0
- package/scripts/optimized-model-compare.js +364 -0
- package/scripts/real-model-compare.js +280 -0
- package/scripts/smoke-esm.mjs +82 -0
- package/scripts/training/agentic-flow-capabilities.json +329 -0
- package/scripts/training/claude-code-synth.js +505 -0
- package/scripts/training/claude-flow-capabilities.json +1322 -0
- package/scripts/training/claude-hard-negatives.js +222 -0
- package/scripts/training/contrastive-finetune.js +517 -0
- package/scripts/training/ecosystem-triplets.jsonl +1467 -0
- package/scripts/training/generate-ecosystem-triplets.js +1324 -0
- package/scripts/training/routing-dataset.js +634 -0
- package/scripts/training/ruvector-capabilities.json +798 -0
- package/scripts/training/validate-ecosystem.js +381 -0
- package/scripts/training/validation-results.json +23 -0
- package/GPU-LOOP.md +0 -229
- package/LICENSE +0 -201
- package/NOTICE +0 -9
- package/examples/gpu-loop.example.json +0 -26
- package/src/adapters-cli.mjs +0 -23
- package/src/adapters.mjs +0 -91
- package/src/cli.mjs +0 -30
- package/src/engine.mjs +0 -238
- package/src/fixture.mjs +0 -38
- package/src/gpu-host.mjs +0 -47
- package/src/gpu-loop-cli.mjs +0 -67
- package/src/gpu-loop.mjs +0 -184
- package/src/gpu-spool-adapter.mjs +0 -80
- package/src/vast-host-adapter.mjs +0 -274
|
@@ -0,0 +1,129 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RuvLTRA Model Registry and Downloader
|
|
4
|
+
*
|
|
5
|
+
* Automatically downloads GGUF models from HuggingFace Hub.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { ModelDownloader, RUVLTRA_MODELS } from '@ruvector/ruvllm';
|
|
10
|
+
*
|
|
11
|
+
* // Download the Claude Code optimized model
|
|
12
|
+
* const downloader = new ModelDownloader();
|
|
13
|
+
* const modelPath = await downloader.download('claude-code');
|
|
14
|
+
*
|
|
15
|
+
* // Or download all models
|
|
16
|
+
* await downloader.downloadAll();
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(o, k2, desc);
|
|
26
|
+
}) : (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
o[k2] = m[k];
|
|
29
|
+
}));
|
|
30
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
+
var ownKeys = function(o) {
|
|
37
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
+
var ar = [];
|
|
39
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
+
return ar;
|
|
41
|
+
};
|
|
42
|
+
return ownKeys(o);
|
|
43
|
+
};
|
|
44
|
+
return function (mod) {
|
|
45
|
+
if (mod && mod.__esModule) return mod;
|
|
46
|
+
var result = {};
|
|
47
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
+
__setModuleDefault(result, mod);
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.ModelDownloader = exports.MODEL_ALIASES = exports.RUVLTRA_MODELS = void 0;
|
|
54
|
+
exports.getDefaultModelsDir = getDefaultModelsDir;
|
|
55
|
+
exports.resolveModelId = resolveModelId;
|
|
56
|
+
exports.getModelInfo = getModelInfo;
|
|
57
|
+
exports.listModels = listModels;
|
|
58
|
+
const fs_1 = require("fs");
|
|
59
|
+
const path_1 = require("path");
|
|
60
|
+
const os_1 = require("os");
|
|
61
|
+
/** HuggingFace repository */
|
|
62
|
+
const HF_REPO = 'ruv/ruvltra';
|
|
63
|
+
const HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`;
|
|
64
|
+
/** Available RuvLTRA models */
|
|
65
|
+
exports.RUVLTRA_MODELS = {
|
|
66
|
+
'claude-code': {
|
|
67
|
+
id: 'claude-code',
|
|
68
|
+
name: 'RuvLTRA Claude Code',
|
|
69
|
+
filename: 'ruvltra-claude-code-0.5b-q4_k_m.gguf',
|
|
70
|
+
sizeBytes: 398000000,
|
|
71
|
+
size: '398 MB',
|
|
72
|
+
parameters: '0.5B',
|
|
73
|
+
useCase: 'Claude Code workflows, agentic coding',
|
|
74
|
+
quantization: 'Q4_K_M',
|
|
75
|
+
contextLength: 4096,
|
|
76
|
+
url: `${HF_BASE_URL}/ruvltra-claude-code-0.5b-q4_k_m.gguf`,
|
|
77
|
+
},
|
|
78
|
+
'small': {
|
|
79
|
+
id: 'small',
|
|
80
|
+
name: 'RuvLTRA Small',
|
|
81
|
+
filename: 'ruvltra-small-0.5b-q4_k_m.gguf',
|
|
82
|
+
sizeBytes: 398000000,
|
|
83
|
+
size: '398 MB',
|
|
84
|
+
parameters: '0.5B',
|
|
85
|
+
useCase: 'Edge devices, IoT, resource-constrained environments',
|
|
86
|
+
quantization: 'Q4_K_M',
|
|
87
|
+
contextLength: 4096,
|
|
88
|
+
url: `${HF_BASE_URL}/ruvltra-small-0.5b-q4_k_m.gguf`,
|
|
89
|
+
},
|
|
90
|
+
'medium': {
|
|
91
|
+
id: 'medium',
|
|
92
|
+
name: 'RuvLTRA Medium',
|
|
93
|
+
filename: 'ruvltra-medium-1.1b-q4_k_m.gguf',
|
|
94
|
+
sizeBytes: 669000000,
|
|
95
|
+
size: '669 MB',
|
|
96
|
+
parameters: '1.1B',
|
|
97
|
+
useCase: 'General purpose, balanced performance',
|
|
98
|
+
quantization: 'Q4_K_M',
|
|
99
|
+
contextLength: 8192,
|
|
100
|
+
url: `${HF_BASE_URL}/ruvltra-medium-1.1b-q4_k_m.gguf`,
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
/** Model aliases for convenience */
|
|
104
|
+
exports.MODEL_ALIASES = {
|
|
105
|
+
'cc': 'claude-code',
|
|
106
|
+
'claudecode': 'claude-code',
|
|
107
|
+
'claude': 'claude-code',
|
|
108
|
+
's': 'small',
|
|
109
|
+
'sm': 'small',
|
|
110
|
+
'm': 'medium',
|
|
111
|
+
'med': 'medium',
|
|
112
|
+
'default': 'claude-code',
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Get the default models directory
|
|
116
|
+
*/
|
|
117
|
+
function getDefaultModelsDir() {
|
|
118
|
+
return (0, path_1.join)((0, os_1.homedir)(), '.ruvllm', 'models');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resolve model ID from alias or direct ID
|
|
122
|
+
*/
|
|
123
|
+
function resolveModelId(modelIdOrAlias) {
|
|
124
|
+
const normalized = modelIdOrAlias.toLowerCase().trim();
|
|
125
|
+
// Direct match
|
|
126
|
+
if (exports.RUVLTRA_MODELS[normalized]) {
|
|
127
|
+
return normalized;
|
|
128
|
+
}
|
|
129
|
+
// Alias match
|
|
130
|
+
if (exports.MODEL_ALIASES[normalized]) {
|
|
131
|
+
return exports.MODEL_ALIASES[normalized];
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get model info by ID or alias
|
|
137
|
+
*/
|
|
138
|
+
function getModelInfo(modelIdOrAlias) {
|
|
139
|
+
const id = resolveModelId(modelIdOrAlias);
|
|
140
|
+
return id ? exports.RUVLTRA_MODELS[id] : null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* List all available models
|
|
144
|
+
*/
|
|
145
|
+
function listModels() {
|
|
146
|
+
return Object.values(exports.RUVLTRA_MODELS);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Model downloader for RuvLTRA GGUF models
|
|
150
|
+
*/
|
|
151
|
+
class ModelDownloader {
|
|
152
|
+
constructor(modelsDir) {
|
|
153
|
+
this.modelsDir = modelsDir || getDefaultModelsDir();
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get the path where a model would be saved
|
|
157
|
+
*/
|
|
158
|
+
getModelPath(modelIdOrAlias) {
|
|
159
|
+
const model = getModelInfo(modelIdOrAlias);
|
|
160
|
+
if (!model)
|
|
161
|
+
return null;
|
|
162
|
+
return (0, path_1.join)(this.modelsDir, model.filename);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Check if a model is already downloaded
|
|
166
|
+
*/
|
|
167
|
+
isDownloaded(modelIdOrAlias) {
|
|
168
|
+
const path = this.getModelPath(modelIdOrAlias);
|
|
169
|
+
if (!path)
|
|
170
|
+
return false;
|
|
171
|
+
if (!(0, fs_1.existsSync)(path))
|
|
172
|
+
return false;
|
|
173
|
+
// Verify size matches expected
|
|
174
|
+
const model = getModelInfo(modelIdOrAlias);
|
|
175
|
+
if (!model)
|
|
176
|
+
return false;
|
|
177
|
+
const stats = (0, fs_1.statSync)(path);
|
|
178
|
+
// Allow 5% variance for size check
|
|
179
|
+
const minSize = model.sizeBytes * 0.95;
|
|
180
|
+
return stats.size >= minSize;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get download status for all models
|
|
184
|
+
*/
|
|
185
|
+
getStatus() {
|
|
186
|
+
return listModels().map(model => ({
|
|
187
|
+
model,
|
|
188
|
+
downloaded: this.isDownloaded(model.id),
|
|
189
|
+
path: this.getModelPath(model.id),
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Download a model from HuggingFace
|
|
194
|
+
*/
|
|
195
|
+
async download(modelIdOrAlias, options = {}) {
|
|
196
|
+
const model = getModelInfo(modelIdOrAlias);
|
|
197
|
+
if (!model) {
|
|
198
|
+
const available = listModels().map(m => m.id).join(', ');
|
|
199
|
+
throw new Error(`Unknown model: ${modelIdOrAlias}. Available models: ${available}`);
|
|
200
|
+
}
|
|
201
|
+
const destDir = options.modelsDir || this.modelsDir;
|
|
202
|
+
const destPath = (0, path_1.join)(destDir, model.filename);
|
|
203
|
+
// Check if already downloaded
|
|
204
|
+
if (!options.force && this.isDownloaded(model.id)) {
|
|
205
|
+
return destPath;
|
|
206
|
+
}
|
|
207
|
+
// Ensure directory exists
|
|
208
|
+
if (!(0, fs_1.existsSync)(destDir)) {
|
|
209
|
+
(0, fs_1.mkdirSync)(destDir, { recursive: true });
|
|
210
|
+
}
|
|
211
|
+
// Download with progress tracking
|
|
212
|
+
const tempPath = `${destPath}.tmp`;
|
|
213
|
+
let startTime = Date.now();
|
|
214
|
+
let lastProgressTime = startTime;
|
|
215
|
+
let lastDownloaded = 0;
|
|
216
|
+
try {
|
|
217
|
+
// Use dynamic import for node-fetch if native fetch not available
|
|
218
|
+
const fetchFn = globalThis.fetch || (await Promise.resolve().then(() => __importStar(require('node:https')))).default;
|
|
219
|
+
const response = await fetch(model.url, {
|
|
220
|
+
headers: {
|
|
221
|
+
'User-Agent': 'RuvLLM/2.3.0',
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
if (!response.ok) {
|
|
225
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
226
|
+
}
|
|
227
|
+
const contentLength = parseInt(response.headers.get('content-length') || String(model.sizeBytes));
|
|
228
|
+
// Create write stream
|
|
229
|
+
const fileStream = (0, fs_1.createWriteStream)(tempPath);
|
|
230
|
+
let downloaded = 0;
|
|
231
|
+
// Stream with progress
|
|
232
|
+
const reader = response.body?.getReader();
|
|
233
|
+
if (!reader) {
|
|
234
|
+
throw new Error('Response body is not readable');
|
|
235
|
+
}
|
|
236
|
+
while (true) {
|
|
237
|
+
const { done, value } = await reader.read();
|
|
238
|
+
if (done)
|
|
239
|
+
break;
|
|
240
|
+
downloaded += value.length;
|
|
241
|
+
fileStream.write(value);
|
|
242
|
+
// Report progress
|
|
243
|
+
if (options.onProgress) {
|
|
244
|
+
const now = Date.now();
|
|
245
|
+
const elapsed = (now - lastProgressTime) / 1000;
|
|
246
|
+
const bytesThisInterval = downloaded - lastDownloaded;
|
|
247
|
+
const speedBps = elapsed > 0 ? bytesThisInterval / elapsed : 0;
|
|
248
|
+
const remaining = contentLength - downloaded;
|
|
249
|
+
const etaSeconds = speedBps > 0 ? remaining / speedBps : 0;
|
|
250
|
+
options.onProgress({
|
|
251
|
+
modelId: model.id,
|
|
252
|
+
downloaded,
|
|
253
|
+
total: contentLength,
|
|
254
|
+
percent: Math.round((downloaded / contentLength) * 100),
|
|
255
|
+
speedBps,
|
|
256
|
+
etaSeconds,
|
|
257
|
+
});
|
|
258
|
+
lastProgressTime = now;
|
|
259
|
+
lastDownloaded = downloaded;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
fileStream.end();
|
|
263
|
+
// Wait for file to be fully written
|
|
264
|
+
await new Promise((resolve, reject) => {
|
|
265
|
+
fileStream.on('finish', resolve);
|
|
266
|
+
fileStream.on('error', reject);
|
|
267
|
+
});
|
|
268
|
+
// Move temp file to final destination
|
|
269
|
+
if ((0, fs_1.existsSync)(destPath)) {
|
|
270
|
+
(0, fs_1.unlinkSync)(destPath);
|
|
271
|
+
}
|
|
272
|
+
(0, fs_1.renameSync)(tempPath, destPath);
|
|
273
|
+
return destPath;
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
// Clean up temp file on error
|
|
277
|
+
if ((0, fs_1.existsSync)(tempPath)) {
|
|
278
|
+
try {
|
|
279
|
+
(0, fs_1.unlinkSync)(tempPath);
|
|
280
|
+
}
|
|
281
|
+
catch { }
|
|
282
|
+
}
|
|
283
|
+
throw error;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Download all available models
|
|
288
|
+
*/
|
|
289
|
+
async downloadAll(options = {}) {
|
|
290
|
+
const paths = [];
|
|
291
|
+
for (const model of listModels()) {
|
|
292
|
+
const path = await this.download(model.id, options);
|
|
293
|
+
paths.push(path);
|
|
294
|
+
}
|
|
295
|
+
return paths;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Delete a downloaded model
|
|
299
|
+
*/
|
|
300
|
+
delete(modelIdOrAlias) {
|
|
301
|
+
const path = this.getModelPath(modelIdOrAlias);
|
|
302
|
+
if (!path || !(0, fs_1.existsSync)(path)) {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
(0, fs_1.unlinkSync)(path);
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Delete all downloaded models
|
|
310
|
+
*/
|
|
311
|
+
deleteAll() {
|
|
312
|
+
let count = 0;
|
|
313
|
+
for (const model of listModels()) {
|
|
314
|
+
if (this.delete(model.id)) {
|
|
315
|
+
count++;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return count;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
exports.ModelDownloader = ModelDownloader;
|
|
322
|
+
exports.default = ModelDownloader;
|
|
323
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBISCxrREFFQztBQUtELHdDQWNDO0FBS0Qsb0NBR0M7QUFLRCxnQ0FFQztBQTVKRCwyQkFBZ0c7QUFDaEcsK0JBQXFDO0FBQ3JDLDJCQUE2QjtBQTJEN0IsNkJBQTZCO0FBQzdCLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQztBQUM5QixNQUFNLFdBQVcsR0FBRywwQkFBMEIsT0FBTyxlQUFlLENBQUM7QUFFckUsK0JBQStCO0FBQ2xCLFFBQUEsY0FBYyxHQUE4QjtJQUN2RCxhQUFhLEVBQUU7UUFDYixFQUFFLEVBQUUsYUFBYTtRQUNqQixJQUFJLEVBQUUscUJBQXFCO1FBQzNCLFFBQVEsRUFBRSxzQ0FBc0M7UUFDaEQsU0FBUyxFQUFFLFNBQVc7UUFDdEIsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUUsTUFBTTtRQUNsQixPQUFPLEVBQUUsdUNBQXVDO1FBQ2hELFlBQVksRUFBRSxRQUFRO1FBQ3RCLGFBQWEsRUFBRSxJQUFJO1FBQ25CLEdBQUcsRUFBRSxHQUFHLFdBQVcsdUNBQXVDO0tBQzNEO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsRUFBRSxFQUFFLE9BQU87UUFDWCxJQUFJLEVBQUUsZUFBZTtRQUNyQixRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLFNBQVMsRUFBRSxTQUFXO1FBQ3RCLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFLE1BQU07UUFDbEIsT0FBTyxFQUFFLHNEQUFzRDtRQUMvRCxZQUFZLEVBQUUsUUFBUTtRQUN0QixhQUFhLEVBQUUsSUFBSTtRQUNuQixHQUFHLEVBQUUsR0FBRyxXQUFXLGlDQUFpQztLQUNyRDtJQUNELFFBQVEsRUFBRTtRQUNSLEVBQUUsRUFBRSxRQUFR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RSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGNBQXNCO1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUEsZUFBVSxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBQSxlQUFVLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsS0FBSyxFQUFFLENBQUM7WUFDVixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBdE1ELDBDQXNNQztBQUVELGtCQUFlLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUnV2TFRSQSBNb2RlbCBSZWdpc3RyeSBhbmQgRG93bmxvYWRlclxuICpcbiAqIEF1dG9tYXRpY2FsbHkgZG93bmxvYWRzIEdHVUYgbW9kZWxzIGZyb20gSHVnZ2luZ0ZhY2UgSHViLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBNb2RlbERvd25sb2FkZXIsIFJVVkxUUkFfTU9ERUxTIH0gZnJvbSAnQHJ1dmVjdG9yL3J1dmxsbSc7XG4gKlxuICogLy8gRG93bmxvYWQgdGhlIENsYXVkZSBDb2RlIG9wdGltaXplZCBtb2RlbFxuICogY29uc3QgZG93bmxvYWRlciA9IG5ldyBNb2RlbERvd25sb2FkZXIoKTtcbiAqIGNvbnN0IG1vZGVsUGF0aCA9IGF3YWl0IGRvd25sb2FkZXIuZG93bmxvYWQoJ2NsYXVkZS1jb2RlJyk7XG4gKlxuICogLy8gT3IgZG93bmxvYWQgYWxsIG1vZGVsc1xuICogYXdhaXQgZG93bmxvYWRlci5kb3dubG9hZEFsbCgpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlV3JpdGVTdHJlYW0sIGV4aXN0c1N5bmMsIG1rZGlyU3luYywgc3RhdFN5bmMsIHVubGlua1N5bmMsIHJlbmFtZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgcGlwZWxpbmUgfSBmcm9tICdzdHJlYW0vcHJvbWlzZXMnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5cbi8qKiBNb2RlbCBpbmZvcm1hdGlvbiBmcm9tIEh1Z2dpbmdGYWNlICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsSW5mbyB7XG4gIC8qKiBNb2RlbCBpZGVudGlmaWVyICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogTW9kZWwgZmlsZW5hbWUgb24gSHVnZ2luZ0ZhY2UgKi9cbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgLyoqIE1vZGVsIHNpemUgaW4gYnl0ZXMgKi9cbiAgc2l6ZUJ5dGVzOiBudW1iZXI7XG4gIC8qKiBNb2RlbCBzaXplIChodW1hbiByZWFkYWJsZSkgKi9cbiAgc2l6ZTogc3RyaW5nO1xuICAvKiogUGFyYW1ldGVyIGNvdW50ICovXG4gIHBhcmFtZXRlcnM6IHN0cmluZztcbiAgLyoqIFVzZSBjYXNlIGRlc2NyaXB0aW9uICovXG4gIHVzZUNhc2U6IHN0cmluZztcbiAgLyoqIFF1YW50aXphdGlvbiB0eXBlICovXG4gIHF1YW50aXphdGlvbjogc3RyaW5nO1xuICAvKiogQ29udGV4dCB3aW5kb3cgc2l6ZSAqL1xuICBjb250ZXh0TGVuZ3RoOiBudW1iZXI7XG4gIC8qKiBIdWdnaW5nRmFjZSBkb3dubG9hZCBVUkwgKi9cbiAgdXJsOiBzdHJpbmc7XG59XG5cbi8qKiBEb3dubG9hZCBwcm9ncmVzcyBjYWxsYmFjayAqL1xuZXhwb3J0IHR5cGUgUHJvZ3Jlc3NDYWxsYmFjayA9IChwcm9ncmVzczogRG93bmxvYWRQcm9ncmVzcykgPT4gdm9pZDtcblxuLyoqIERvd25sb2FkIHByb2dyZXNzIGluZm9ybWF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIERvd25sb2FkUHJvZ3Jlc3Mge1xuICAvKiogTW9kZWwgYmVpbmcgZG93bmxvYWRlZCAqL1xuICBtb2RlbElkOiBzdHJpbmc7XG4gIC8qKiBCeXRlcyBkb3dubG9hZGVkIHNvIGZhciAqL1xuICBkb3dubG9hZGVkOiBudW1iZXI7XG4gIC8qKiBUb3RhbCBieXRlcyB0byBkb3dubG9hZCAqL1xuICB0b3RhbDogbnVtYmVyO1xuICAvKiogRG93bmxvYWQgcGVyY2VudGFnZSAoMC0xMDApICovXG4gIHBlcmNlbnQ6IG51bWJlcjtcbiAgLyoqIERvd25sb2FkIHNwZWVkIGluIGJ5dGVzIHBlciBzZWNvbmQgKi9cbiAgc3BlZWRCcHM6IG51bWJlcjtcbiAgLyoqIEVzdGltYXRlZCB0aW1lIHJlbWFpbmluZyBpbiBzZWNvbmRzICovXG4gIGV0YVNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqIERvd25sb2FkIG9wdGlvbnMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG93bmxvYWRPcHRpb25zIHtcbiAgLyoqIERpcmVjdG9yeSB0byBzYXZlIG1vZGVscyAoZGVmYXVsdDogfi8ucnV2bGxtL21vZGVscykgKi9cbiAgbW9kZWxzRGlyPzogc3RyaW5nO1xuICAvKiogRm9yY2UgcmUtZG93bmxvYWQgZXZlbiBpZiBmaWxlIGV4aXN0cyAqL1xuICBmb3JjZT86IGJvb2xlYW47XG4gIC8qKiBQcm9ncmVzcyBjYWxsYmFjayAqL1xuICBvblByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgLyoqIFZlcmlmeSBmaWxlIGludGVncml0eSBhZnRlciBkb3dubG9hZCAqL1xuICB2ZXJpZnk/OiBib29sZWFuO1xufVxuXG4vKiogSHVnZ2luZ0ZhY2UgcmVwb3NpdG9yeSAqL1xuY29uc3QgSEZfUkVQTyA9ICdydXYvcnV2bHRyYSc7XG5jb25zdCBIRl9CQVNFX1VSTCA9IGBodHRwczovL2h1Z2dpbmdmYWNlLmNvLyR7SEZfUkVQT30vcmVzb2x2ZS9tYWluYDtcblxuLyoqIEF2YWlsYWJsZSBSdXZMVFJBIG1vZGVscyAqL1xuZXhwb3J0IGNvbnN0IFJVVkxUUkFfTU9ERUxTOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbEluZm8+ID0ge1xuICAnY2xhdWRlLWNvZGUnOiB7XG4gICAgaWQ6ICdjbGF1ZGUtY29kZScsXG4gICAgbmFtZTogJ1J1dkxUUkEgQ2xhdWRlIENvZGUnLFxuICAgIGZpbGVuYW1lOiAncnV2bHRyYS1jbGF1ZGUtY29kZS0wLjViLXE0X2tfbS5nZ3VmJyxcbiAgICBzaXplQnl0ZXM6IDM5OF8wMDBfMDAwLFxuICAgIHNpemU6ICczOTggTUInLFxuICAgIHBhcmFtZXRlcnM6ICcwLjVCJyxcbiAgICB1c2VDYXNlOiAnQ2xhdWRlIENvZGUgd29ya2Zsb3dzLCBhZ2VudGljIGNvZGluZycsXG4gICAgcXVhbnRpemF0aW9uOiAnUTRfS19NJyxcbiAgICBjb250ZXh0TGVuZ3RoOiA0MDk2LFxuICAgIHVybDogYCR7SEZfQkFTRV9VUkx9L3J1dmx0cmEtY2xhdWRlLWNvZGUtMC41Yi1xNF9rX20uZ2d1ZmAsXG4gIH0sXG4gICdzbWFsbCc6IHtcbiAgICBpZDogJ3NtYWxsJyxcbiAgICBuYW1lOiAnUnV2TFRSQSBTbWFsbCcsXG4gICAgZmlsZW5hbWU6ICdydXZsdHJhLXNtYWxsLTAuNWItcTRfa19tLmdndWYnLFxuICAgIHNpemVCeXRlczogMzk4XzAwMF8wMDAsXG4gICAgc2l6ZTogJzM5OCBNQicsXG4gICAgcGFyYW1ldGVyczogJzAuNUInLFxuICAgIHVzZUNhc2U6ICdFZGdlIGRldmljZXMsIElvVCwgcmVzb3VyY2UtY29uc3RyYWluZWQgZW52aXJvbm1lbnRzJyxcbiAgICBxdWFudGl6YXRpb246ICdRNF9LX00nLFxuICAgIGNvbnRleHRMZW5ndGg6IDQwOTYsXG4gICAgdXJsOiBgJHtIRl9CQVNFX1VSTH0vcnV2bHRyYS1zbWFsbC0wLjViLXE0X2tfbS5nZ3VmYCxcbiAgfSxcbiAgJ21lZGl1bSc6IHtcbiAgICBpZDogJ21lZGl1bScsXG4gICAgbmFtZTogJ1J1dkxUUkEgTWVkaXVtJyxcbiAgICBmaWxlbmFtZTogJ3J1dmx0cmEtbWVkaXVtLTEuMWItcTRfa19tLmdndWYnLFxuICAgIHNpemVCeXRlczogNjY5XzAwMF8wMDAsXG4gICAgc2l6ZTogJzY2OSBNQicsXG4gICAgcGFyYW1ldGVyczogJzEuMUInLFxuICAgIHVzZUNhc2U6ICdHZW5lcmFsIHB1cnBvc2UsIGJhbGFuY2VkIHBlcmZvcm1hbmNlJyxcbiAgICBxdWFudGl6YXRpb246ICdRNF9LX00nLFxuICAgIGNvbnRleHRMZW5ndGg6IDgxOTIsXG4gICAgdXJsOiBgJHtIRl9CQVNFX1VSTH0vcnV2bHRyYS1tZWRpdW0tMS4xYi1xNF9rX20uZ2d1ZmAsXG4gIH0sXG59O1xuXG4vKiogTW9kZWwgYWxpYXNlcyBmb3IgY29udmVuaWVuY2UgKi9cbmV4cG9ydCBjb25zdCBNT0RFTF9BTElBU0VTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnY2MnOiAnY2xhdWRlLWNvZGUnLFxuICAnY2xhdWRlY29kZSc6ICdjbGF1ZGUtY29kZScsXG4gICdjbGF1ZGUnOiAnY2xhdWRlLWNvZGUnLFxuICAncyc6ICdzbWFsbCcsXG4gICdzbSc6ICdzbWFsbCcsXG4gICdtJzogJ21lZGl1bScsXG4gICdtZWQnOiAnbWVkaXVtJyxcbiAgJ2RlZmF1bHQnOiAnY2xhdWRlLWNvZGUnLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgbW9kZWxzIGRpcmVjdG9yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdE1vZGVsc0RpcigpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihob21lZGlyKCksICcucnV2bGxtJywgJ21vZGVscycpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgbW9kZWwgSUQgZnJvbSBhbGlhcyBvciBkaXJlY3QgSURcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbElkKG1vZGVsSWRPckFsaWFzOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG1vZGVsSWRPckFsaWFzLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gIC8vIERpcmVjdCBtYXRjaFxuICBpZiAoUlVWTFRSQV9NT0RFTFNbbm9ybWFsaXplZF0pIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8vIEFsaWFzIG1hdGNoXG4gIGlmIChNT0RFTF9BTElBU0VTW25vcm1hbGl6ZWRdKSB7XG4gICAgcmV0dXJuIE1PREVMX0FMSUFTRVNbbm9ybWFsaXplZF07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBHZXQgbW9kZWwgaW5mbyBieSBJRCBvciBhbGlhc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxJbmZvKG1vZGVsSWRPckFsaWFzOiBzdHJpbmcpOiBNb2RlbEluZm8gfCBudWxsIHtcbiAgY29uc3QgaWQgPSByZXNvbHZlTW9kZWxJZChtb2RlbElkT3JBbGlhcyk7XG4gIHJldHVybiBpZCA/IFJVVkxUUkFfTU9ERUxTW2lkXSA6IG51bGw7XG59XG5cbi8qKlxuICogTGlzdCBhbGwgYXZhaWxhYmxlIG1vZGVsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVscygpOiBNb2RlbEluZm9bXSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKFJVVkxUUkFfTU9ERUxTKTtcbn1cblxuLyoqXG4gKiBNb2RlbCBkb3dubG9hZGVyIGZvciBSdXZMVFJBIEdHVUYgbW9kZWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbERvd25sb2FkZXIge1xuICBwcml2YXRlIG1vZGVsc0Rpcjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG1vZGVsc0Rpcj86IHN0cmluZykge1xuICAgIHRoaXMubW9kZWxzRGlyID0gbW9kZWxzRGlyIHx8IGdldERlZmF1bHRNb2RlbHNEaXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBhdGggd2hlcmUgYSBtb2RlbCB3b3VsZCBiZSBzYXZlZFxuICAgKi9cbiAgZ2V0TW9kZWxQYXRoKG1vZGVsSWRPckFsaWFzOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBtb2RlbCA9IGdldE1vZGVsSW5mbyhtb2RlbElkT3JBbGlhcyk7XG4gICAgaWYgKCFtb2RlbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGpvaW4odGhpcy5tb2RlbHNEaXIsIG1vZGVsLmZpbGVuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1vZGVsIGlzIGFscmVhZHkgZG93bmxvYWRlZFxuICAgKi9cbiAgaXNEb3dubG9hZGVkKG1vZGVsSWRPckFsaWFzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXRNb2RlbFBhdGgobW9kZWxJZE9yQWxpYXMpO1xuICAgIGlmICghcGF0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBWZXJpZnkgc2l6ZSBtYXRjaGVzIGV4cGVjdGVkXG4gICAgY29uc3QgbW9kZWwgPSBnZXRNb2RlbEluZm8obW9kZWxJZE9yQWxpYXMpO1xuICAgIGlmICghbW9kZWwpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHN0YXRzID0gc3RhdFN5bmMocGF0aCk7XG4gICAgLy8gQWxsb3cgNSUgdmFyaWFuY2UgZm9yIHNpemUgY2hlY2tcbiAgICBjb25zdCBtaW5TaXplID0gbW9kZWwuc2l6ZUJ5dGVzICogMC45NTtcbiAgICByZXR1cm4gc3RhdHMuc2l6ZSA+PSBtaW5TaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkb3dubG9hZCBzdGF0dXMgZm9yIGFsbCBtb2RlbHNcbiAgICovXG4gIGdldFN0YXR1cygpOiB7IG1vZGVsOiBNb2RlbEluZm87IGRvd25sb2FkZWQ6IGJvb2xlYW47IHBhdGg6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiBsaXN0TW9kZWxzKCkubWFwKG1vZGVsID0+ICh7XG4gICAgICBtb2RlbCxcbiAgICAgIGRvd25sb2FkZWQ6IHRoaXMuaXNEb3dubG9hZGVkKG1vZGVsLmlkKSxcbiAgICAgIHBhdGg6IHRoaXMuZ2V0TW9kZWxQYXRoKG1vZGVsLmlkKSEsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGEgbW9kZWwgZnJvbSBIdWdnaW5nRmFjZVxuICAgKi9cbiAgYXN5bmMgZG93bmxvYWQoXG4gICAgbW9kZWxJZE9yQWxpYXM6IHN0cmluZyxcbiAgICBvcHRpb25zOiBEb3dubG9hZE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG1vZGVsID0gZ2V0TW9kZWxJbmZvKG1vZGVsSWRPckFsaWFzKTtcbiAgICBpZiAoIW1vZGVsKSB7XG4gICAgICBjb25zdCBhdmFpbGFibGUgPSBsaXN0TW9kZWxzKCkubWFwKG0gPT4gbS5pZCkuam9pbignLCAnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gbW9kZWw6ICR7bW9kZWxJZE9yQWxpYXN9LiBBdmFpbGFibGUgbW9kZWxzOiAke2F2YWlsYWJsZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc3REaXIgPSBvcHRpb25zLm1vZGVsc0RpciB8fCB0aGlzLm1vZGVsc0RpcjtcbiAgICBjb25zdCBkZXN0UGF0aCA9IGpvaW4oZGVzdERpciwgbW9kZWwuZmlsZW5hbWUpO1xuXG4gICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBkb3dubG9hZGVkXG4gICAgaWYgKCFvcHRpb25zLmZvcmNlICYmIHRoaXMuaXNEb3dubG9hZGVkKG1vZGVsLmlkKSkge1xuICAgICAgcmV0dXJuIGRlc3RQYXRoO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKGRlc3REaXIpKSB7XG4gICAgICBta2RpclN5bmMoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gRG93bmxvYWQgd2l0aCBwcm9ncmVzcyB0cmFja2luZ1xuICAgIGNvbnN0IHRlbXBQYXRoID0gYCR7ZGVzdFBhdGh9LnRtcGA7XG4gICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGxhc3RQcm9ncmVzc1RpbWUgPSBzdGFydFRpbWU7XG4gICAgbGV0IGxhc3REb3dubG9hZGVkID0gMDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgZHluYW1pYyBpbXBvcnQgZm9yIG5vZGUtZmV0Y2ggaWYgbmF0aXZlIGZldGNoIG5vdCBhdmFpbGFibGVcbiAgICAgIGNvbnN0IGZldGNoRm4gPSBnbG9iYWxUaGlzLmZldGNoIHx8IChhd2FpdCBpbXBvcnQoJ25vZGU6aHR0cHMnKSkuZGVmYXVsdDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChtb2RlbC51cmwsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdVc2VyLUFnZW50JzogJ1J1dkxMTS8yLjMuMCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBwYXJzZUludChcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykgfHwgU3RyaW5nKG1vZGVsLnNpemVCeXRlcylcbiAgICAgICk7XG5cbiAgICAgIC8vIENyZWF0ZSB3cml0ZSBzdHJlYW1cbiAgICAgIGNvbnN0IGZpbGVTdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbSh0ZW1wUGF0aCk7XG4gICAgICBsZXQgZG93bmxvYWRlZCA9IDA7XG5cbiAgICAgIC8vIFN0cmVhbSB3aXRoIHByb2dyZXNzXG4gICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5Py5nZXRSZWFkZXIoKTtcbiAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgYm9keSBpcyBub3QgcmVhZGFibGUnKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuXG4gICAgICAgIGRvd25sb2FkZWQgKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICBmaWxlU3RyZWFtLndyaXRlKHZhbHVlKTtcblxuICAgICAgICAvLyBSZXBvcnQgcHJvZ3Jlc3NcbiAgICAgICAgaWYgKG9wdGlvbnMub25Qcm9ncmVzcykge1xuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgZWxhcHNlZCA9IChub3cgLSBsYXN0UHJvZ3Jlc3NUaW1lKSAvIDEwMDA7XG4gICAgICAgICAgY29uc3QgYnl0ZXNUaGlzSW50ZXJ2YWwgPSBkb3dubG9hZGVkIC0gbGFzdERvd25sb2FkZWQ7XG4gICAgICAgICAgY29uc3Qgc3BlZWRCcHMgPSBlbGFwc2VkID4gMCA/IGJ5dGVzVGhpc0ludGVydmFsIC8gZWxhcHNlZCA6IDA7XG4gICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gY29udGVudExlbmd0aCAtIGRvd25sb2FkZWQ7XG4gICAgICAgICAgY29uc3QgZXRhU2Vjb25kcyA9IHNwZWVkQnBzID4gMCA/IHJlbWFpbmluZyAvIHNwZWVkQnBzIDogMDtcblxuICAgICAgICAgIG9wdGlvbnMub25Qcm9ncmVzcyh7XG4gICAgICAgICAgICBtb2RlbElkOiBtb2RlbC5pZCxcbiAgICAgICAgICAgIGRvd25sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIHBlcmNlbnQ6IE1hdGgucm91bmQoKGRvd25sb2FkZWQgLyBjb250ZW50TGVuZ3RoKSAqIDEwMCksXG4gICAgICAgICAgICBzcGVlZEJwcyxcbiAgICAgICAgICAgIGV0YVNlY29uZHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsYXN0UHJvZ3Jlc3NUaW1lID0gbm93O1xuICAgICAgICAgIGxhc3REb3dubG9hZGVkID0gZG93bmxvYWRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWxlU3RyZWFtLmVuZCgpO1xuXG4gICAgICAvLyBXYWl0IGZvciBmaWxlIHRvIGJlIGZ1bGx5IHdyaXR0ZW5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZmlsZVN0cmVhbS5vbignZmluaXNoJywgcmVzb2x2ZSk7XG4gICAgICAgIGZpbGVTdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBNb3ZlIHRlbXAgZmlsZSB0byBmaW5hbCBkZXN0aW5hdGlvblxuICAgICAgaWYgKGV4aXN0c1N5bmMoZGVzdFBhdGgpKSB7XG4gICAgICAgIHVubGlua1N5bmMoZGVzdFBhdGgpO1xuICAgICAgfVxuICAgICAgcmVuYW1lU3luYyh0ZW1wUGF0aCwgZGVzdFBhdGgpO1xuXG4gICAgICByZXR1cm4gZGVzdFBhdGg7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIENsZWFuIHVwIHRlbXAgZmlsZSBvbiBlcnJvclxuICAgICAgaWYgKGV4aXN0c1N5bmModGVtcFBhdGgpKSB7XG4gICAgICAgIHRyeSB7IHVubGlua1N5bmModGVtcFBhdGgpOyB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWQgYWxsIGF2YWlsYWJsZSBtb2RlbHNcbiAgICovXG4gIGFzeW5jIGRvd25sb2FkQWxsKG9wdGlvbnM6IERvd25sb2FkT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbW9kZWwgb2YgbGlzdE1vZGVscygpKSB7XG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgdGhpcy5kb3dubG9hZChtb2RlbC5pZCwgb3B0aW9ucyk7XG4gICAgICBwYXRocy5wdXNoKHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgZG93bmxvYWRlZCBtb2RlbFxuICAgKi9cbiAgZGVsZXRlKG1vZGVsSWRPckFsaWFzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXRNb2RlbFBhdGgobW9kZWxJZE9yQWxpYXMpO1xuICAgIGlmICghcGF0aCB8fCAhZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB1bmxpbmtTeW5jKHBhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbGwgZG93bmxvYWRlZCBtb2RlbHNcbiAgICovXG4gIGRlbGV0ZUFsbCgpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiBsaXN0TW9kZWxzKCkpIHtcbiAgICAgIGlmICh0aGlzLmRlbGV0ZShtb2RlbC5pZCkpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1vZGVsRG93bmxvYWRlcjtcbiJdfQ==
|
|
@@ -0,0 +1,140 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/native.ts"],"names":[],"mappings":"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"}
|