@ruvector/ruvllm 4.0.1 → 4.1.0

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