@ruvector/ruvllm 0.2.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 +406 -0
- package/bin/cli.js +387 -0
- package/dist/cjs/engine.d.ts +90 -0
- package/dist/cjs/engine.d.ts.map +1 -0
- package/dist/cjs/engine.js +301 -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 +64 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +96 -0
- package/dist/cjs/lora.d.ts +240 -0
- package/dist/cjs/lora.d.ts.map +1 -0
- package/dist/cjs/lora.js +494 -0
- package/dist/cjs/native.d.ts +83 -0
- package/dist/cjs/native.d.ts.map +1 -0
- package/dist/cjs/native.js +70 -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 +187 -0
- package/dist/cjs/sona.d.ts.map +1 -0
- package/dist/cjs/sona.js +500 -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 +254 -0
- package/dist/cjs/training.d.ts.map +1 -0
- package/dist/cjs/training.js +480 -0
- package/dist/cjs/types.d.ts +599 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/esm/engine.d.ts +90 -0
- package/dist/esm/engine.d.ts.map +1 -0
- package/dist/esm/engine.js +297 -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 +64 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +76 -0
- package/dist/esm/lora.d.ts +240 -0
- package/dist/esm/lora.d.ts.map +1 -0
- package/dist/esm/lora.js +489 -0
- package/dist/esm/native.d.ts +83 -0
- package/dist/esm/native.d.ts.map +1 -0
- package/dist/esm/native.js +65 -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 +187 -0
- package/dist/esm/sona.d.ts.map +1 -0
- package/dist/esm/sona.js +494 -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 +254 -0
- package/dist/esm/training.d.ts.map +1 -0
- package/dist/esm/training.js +473 -0
- package/dist/esm/types.d.ts +599 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +5 -0
- package/package.json +121 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Native bindings loader for RuvLLM
|
|
4
|
+
*
|
|
5
|
+
* Automatically loads the correct native binary for the current platform.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.getNativeModule = getNativeModule;
|
|
9
|
+
exports.version = version;
|
|
10
|
+
exports.hasSimdSupport = hasSimdSupport;
|
|
11
|
+
const path_1 = require("path");
|
|
12
|
+
// Try to load the native module
|
|
13
|
+
let nativeModule = null;
|
|
14
|
+
// Platform-specific package names
|
|
15
|
+
const PLATFORM_PACKAGES = {
|
|
16
|
+
'darwin-x64': '@ruvector/ruvllm-darwin-x64',
|
|
17
|
+
'darwin-arm64': '@ruvector/ruvllm-darwin-arm64',
|
|
18
|
+
'linux-x64': '@ruvector/ruvllm-linux-x64-gnu',
|
|
19
|
+
'linux-arm64': '@ruvector/ruvllm-linux-arm64-gnu',
|
|
20
|
+
'win32-x64': '@ruvector/ruvllm-win32-x64-msvc',
|
|
21
|
+
};
|
|
22
|
+
function getPlatformKey() {
|
|
23
|
+
const platform = process.platform;
|
|
24
|
+
const arch = process.arch;
|
|
25
|
+
return `${platform}-${arch}`;
|
|
26
|
+
}
|
|
27
|
+
function loadNativeModule() {
|
|
28
|
+
if (nativeModule) {
|
|
29
|
+
return nativeModule;
|
|
30
|
+
}
|
|
31
|
+
const platformKey = getPlatformKey();
|
|
32
|
+
const packageName = PLATFORM_PACKAGES[platformKey];
|
|
33
|
+
if (!packageName) {
|
|
34
|
+
// Silently fail - JS fallback will be used
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
// Try loading from optional dependencies
|
|
38
|
+
const attempts = [
|
|
39
|
+
// Try the platform-specific package
|
|
40
|
+
() => require(packageName),
|
|
41
|
+
// Try loading from local .node file (CJS build)
|
|
42
|
+
() => require((0, path_1.join)(__dirname, '..', '..', 'ruvllm.node')),
|
|
43
|
+
// Try loading from local .node file (root)
|
|
44
|
+
() => require((0, path_1.join)(__dirname, '..', 'ruvllm.node')),
|
|
45
|
+
];
|
|
46
|
+
for (const attempt of attempts) {
|
|
47
|
+
try {
|
|
48
|
+
nativeModule = attempt();
|
|
49
|
+
return nativeModule;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Continue to next attempt
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Silently fall back to JS implementation
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
// Export functions to get native bindings
|
|
59
|
+
function getNativeModule() {
|
|
60
|
+
return loadNativeModule();
|
|
61
|
+
}
|
|
62
|
+
function version() {
|
|
63
|
+
const mod = loadNativeModule();
|
|
64
|
+
return mod?.version() ?? '0.1.0-js';
|
|
65
|
+
}
|
|
66
|
+
function hasSimdSupport() {
|
|
67
|
+
const mod = loadNativeModule();
|
|
68
|
+
return mod?.hasSimdSupport() ?? false;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7QUE2SUgsMENBRUM7QUFFRCwwQkFHQztBQUVELHdDQUdDO0FBdkpELCtCQUE0QjtBQUU1QixnQ0FBZ0M7QUFDaEMsSUFBSSxZQUFZLEdBQXdCLElBQUksQ0FBQztBQW9GN0Msa0NBQWtDO0FBQ2xDLE1BQU0saUJBQWlCLEdBQTJCO0lBQ2hELFlBQVksRUFBRSw2QkFBNkI7SUFDM0MsY0FBYyxFQUFFLCtCQUErQjtJQUMvQyxXQUFXLEVBQUUsZ0NBQWdDO0lBQzdDLGFBQWEsRUFBRSxrQ0FBa0M7SUFDakQsV0FBVyxFQUFFLGlDQUFpQztDQUMvQyxDQUFDO0FBRUYsU0FBUyxjQUFjO0lBQ3JCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMxQixPQUFPLEdBQUcsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLGdCQUFnQjtJQUN2QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsMkNBQTJDO1FBQzNDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxNQUFNLFFBQVEsR0FBRztRQUNmLG9DQUFvQztRQUNwQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzFCLGdEQUFnRDtRQUNoRCxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDekQsMkNBQTJDO1FBQzNDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0tBQ3BELENBQUM7SUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNILFlBQVksR0FBRyxPQUFPLEVBQWtCLENBQUM7WUFDekMsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDJCQUEyQjtRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCwwQ0FBMEM7QUFDMUMsU0FBZ0IsZUFBZTtJQUM3QixPQUFPLGdCQUFnQixFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQWdCLE9BQU87SUFDckIsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUMvQixPQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQWdCLGNBQWM7SUFDNUIsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUMvQixPQUFPLEdBQUcsRUFBRSxjQUFjLEVBQUUsSUFBSSxLQUFLLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmF0aXZlIGJpbmRpbmdzIGxvYWRlciBmb3IgUnV2TExNXG4gKlxuICogQXV0b21hdGljYWxseSBsb2FkcyB0aGUgY29ycmVjdCBuYXRpdmUgYmluYXJ5IGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqL1xuXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5cbi8vIFRyeSB0byBsb2FkIHRoZSBuYXRpdmUgbW9kdWxlXG5sZXQgbmF0aXZlTW9kdWxlOiBOYXRpdmVSdXZMTE0gfCBudWxsID0gbnVsbDtcblxuaW50ZXJmYWNlIE5hdGl2ZVJ1dkxMTSB7XG4gIFJ1dkxMTUVuZ2luZTogbmV3IChjb25maWc/OiBOYXRpdmVDb25maWcpID0+IE5hdGl2ZUVuZ2luZTtcbiAgU2ltZE9wZXJhdGlvbnM6IG5ldyAoKSA9PiBOYXRpdmVTaW1kT3BzO1xuICB2ZXJzaW9uOiAoKSA9PiBzdHJpbmc7XG4gIGhhc1NpbWRTdXBwb3J0OiAoKSA9PiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTmF0aXZlQ29uZmlnIHtcbiAgZW1iZWRkaW5nX2RpbT86IG51bWJlcjtcbiAgcm91dGVyX2hpZGRlbl9kaW0/OiBudW1iZXI7XG4gIGhuc3dfbT86IG51bWJlcjtcbiAgaG5zd19lZl9jb25zdHJ1Y3Rpb24/OiBudW1iZXI7XG4gIGhuc3dfZWZfc2VhcmNoPzogbnVtYmVyO1xuICBsZWFybmluZ19lbmFibGVkPzogYm9vbGVhbjtcbiAgcXVhbGl0eV90aHJlc2hvbGQ/OiBudW1iZXI7XG4gIGV3Y19sYW1iZGE/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVFbmdpbmUge1xuICBxdWVyeSh0ZXh0OiBzdHJpbmcsIGNvbmZpZz86IE5hdGl2ZUdlbkNvbmZpZyk6IE5hdGl2ZVF1ZXJ5UmVzcG9uc2U7XG4gIGdlbmVyYXRlKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBOYXRpdmVHZW5Db25maWcpOiBzdHJpbmc7XG4gIHJvdXRlKHRleHQ6IHN0cmluZyk6IE5hdGl2ZVJvdXRpbmdEZWNpc2lvbjtcbiAgc2VhcmNoTWVtb3J5KHRleHQ6IHN0cmluZywgaz86IG51bWJlcik6IE5hdGl2ZU1lbW9yeVJlc3VsdFtdO1xuICBhZGRNZW1vcnkoY29udGVudDogc3RyaW5nLCBtZXRhZGF0YT86IHN0cmluZyk6IG51bWJlcjtcbiAgZmVlZGJhY2socmVxdWVzdElkOiBzdHJpbmcsIHJhdGluZzogbnVtYmVyLCBjb3JyZWN0aW9uPzogc3RyaW5nKTogYm9vbGVhbjtcbiAgc3RhdHMoKTogTmF0aXZlU3RhdHM7XG4gIGZvcmNlTGVhcm4oKTogc3RyaW5nO1xuICBlbWJlZCh0ZXh0OiBzdHJpbmcpOiBudW1iZXJbXTtcbiAgc2ltaWxhcml0eSh0ZXh0MTogc3RyaW5nLCB0ZXh0Mjogc3RyaW5nKTogbnVtYmVyO1xuICBoYXNTaW1kKCk6IGJvb2xlYW47XG4gIHNpbWRDYXBhYmlsaXRpZXMoKTogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBOYXRpdmVHZW5Db25maWcge1xuICBtYXhfdG9rZW5zPzogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbiAgdG9wX3A/OiBudW1iZXI7XG4gIHRvcF9rPzogbnVtYmVyO1xuICByZXBldGl0aW9uX3BlbmFsdHk/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVRdWVyeVJlc3BvbnNlIHtcbiAgdGV4dDogc3RyaW5nO1xuICBjb25maWRlbmNlOiBudW1iZXI7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGNvbnRleHRfc2l6ZTogbnVtYmVyO1xuICBsYXRlbmN5X21zOiBudW1iZXI7XG4gIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZVJvdXRpbmdEZWNpc2lvbiB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGNvbnRleHRfc2l6ZTogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZTogbnVtYmVyO1xuICB0b3BfcDogbnVtYmVyO1xuICBjb25maWRlbmNlOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVNZW1vcnlSZXN1bHQge1xuICBpZDogbnVtYmVyO1xuICBzY29yZTogbnVtYmVyO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIG1ldGFkYXRhOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBOYXRpdmVTdGF0cyB7XG4gIHRvdGFsX3F1ZXJpZXM6IG51bWJlcjtcbiAgbWVtb3J5X25vZGVzOiBudW1iZXI7XG4gIHBhdHRlcm5zX2xlYXJuZWQ6IG51bWJlcjtcbiAgYXZnX2xhdGVuY3lfbXM6IG51bWJlcjtcbiAgY2FjaGVfaGl0X3JhdGU6IG51bWJlcjtcbiAgcm91dGVyX2FjY3VyYWN5OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVTaW1kT3BzIHtcbiAgZG90UHJvZHVjdChhOiBudW1iZXJbXSwgYjogbnVtYmVyW10pOiBudW1iZXI7XG4gIGNvc2luZVNpbWlsYXJpdHkoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogbnVtYmVyO1xuICBsMkRpc3RhbmNlKGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSk6IG51bWJlcjtcbiAgbWF0dmVjKG1hdHJpeDogbnVtYmVyW11bXSwgdmVjdG9yOiBudW1iZXJbXSk6IG51bWJlcltdO1xuICBzb2Z0bWF4KGlucHV0OiBudW1iZXJbXSk6IG51bWJlcltdO1xufVxuXG4vLyBQbGF0Zm9ybS1zcGVjaWZpYyBwYWNrYWdlIG5hbWVzXG5jb25zdCBQTEFURk9STV9QQUNLQUdFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2Rhcndpbi14NjQnOiAnQHJ1dmVjdG9yL3J1dmxsbS1kYXJ3aW4teDY0JyxcbiAgJ2Rhcndpbi1hcm02NCc6ICdAcnV2ZWN0b3IvcnV2bGxtLWRhcndpbi1hcm02NCcsXG4gICdsaW51eC14NjQnOiAnQHJ1dmVjdG9yL3J1dmxsbS1saW51eC14NjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0JzogJ0BydXZlY3Rvci9ydXZsbG0tbGludXgtYXJtNjQtZ251JyxcbiAgJ3dpbjMyLXg2NCc6ICdAcnV2ZWN0b3IvcnV2bGxtLXdpbjMyLXg2NC1tc3ZjJyxcbn07XG5cbmZ1bmN0aW9uIGdldFBsYXRmb3JtS2V5KCk6IHN0cmluZyB7XG4gIGNvbnN0IHBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybTtcbiAgY29uc3QgYXJjaCA9IHByb2Nlc3MuYXJjaDtcbiAgcmV0dXJuIGAke3BsYXRmb3JtfS0ke2FyY2h9YDtcbn1cblxuZnVuY3Rpb24gbG9hZE5hdGl2ZU1vZHVsZSgpOiBOYXRpdmVSdXZMTE0gfCBudWxsIHtcbiAgaWYgKG5hdGl2ZU1vZHVsZSkge1xuICAgIHJldHVybiBuYXRpdmVNb2R1bGU7XG4gIH1cblxuICBjb25zdCBwbGF0Zm9ybUtleSA9IGdldFBsYXRmb3JtS2V5KCk7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gUExBVEZPUk1fUEFDS0FHRVNbcGxhdGZvcm1LZXldO1xuXG4gIGlmICghcGFja2FnZU5hbWUpIHtcbiAgICAvLyBTaWxlbnRseSBmYWlsIC0gSlMgZmFsbGJhY2sgd2lsbCBiZSB1c2VkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBUcnkgbG9hZGluZyBmcm9tIG9wdGlvbmFsIGRlcGVuZGVuY2llc1xuICBjb25zdCBhdHRlbXB0cyA9IFtcbiAgICAvLyBUcnkgdGhlIHBsYXRmb3JtLXNwZWNpZmljIHBhY2thZ2VcbiAgICAoKSA9PiByZXF1aXJlKHBhY2thZ2VOYW1lKSxcbiAgICAvLyBUcnkgbG9hZGluZyBmcm9tIGxvY2FsIC5ub2RlIGZpbGUgKENKUyBidWlsZClcbiAgICAoKSA9PiByZXF1aXJlKGpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAncnV2bGxtLm5vZGUnKSksXG4gICAgLy8gVHJ5IGxvYWRpbmcgZnJvbSBsb2NhbCAubm9kZSBmaWxlIChyb290KVxuICAgICgpID0+IHJlcXVpcmUoam9pbihfX2Rpcm5hbWUsICcuLicsICdydXZsbG0ubm9kZScpKSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IGF0dGVtcHQgb2YgYXR0ZW1wdHMpIHtcbiAgICB0cnkge1xuICAgICAgbmF0aXZlTW9kdWxlID0gYXR0ZW1wdCgpIGFzIE5hdGl2ZVJ1dkxMTTtcbiAgICAgIHJldHVybiBuYXRpdmVNb2R1bGU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDb250aW51ZSB0byBuZXh0IGF0dGVtcHRcbiAgICB9XG4gIH1cblxuICAvLyBTaWxlbnRseSBmYWxsIGJhY2sgdG8gSlMgaW1wbGVtZW50YXRpb25cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIEV4cG9ydCBmdW5jdGlvbnMgdG8gZ2V0IG5hdGl2ZSBiaW5kaW5nc1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hdGl2ZU1vZHVsZSgpOiBOYXRpdmVSdXZMTE0gfCBudWxsIHtcbiAgcmV0dXJuIGxvYWROYXRpdmVNb2R1bGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb24oKTogc3RyaW5nIHtcbiAgY29uc3QgbW9kID0gbG9hZE5hdGl2ZU1vZHVsZSgpO1xuICByZXR1cm4gbW9kPy52ZXJzaW9uKCkgPz8gJzAuMS4wLWpzJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1NpbWRTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICBjb25zdCBtb2QgPSBsb2FkTmF0aXZlTW9kdWxlKCk7XG4gIHJldHVybiBtb2Q/Lmhhc1NpbWRTdXBwb3J0KCkgPz8gZmFsc2U7XG59XG5cbi8vIEV4cG9ydCB0eXBlcyBmb3IgaW50ZXJuYWwgdXNlXG5leHBvcnQgdHlwZSB7XG4gIE5hdGl2ZVJ1dkxMTSxcbiAgTmF0aXZlQ29uZmlnLFxuICBOYXRpdmVFbmdpbmUsXG4gIE5hdGl2ZUdlbkNvbmZpZyxcbiAgTmF0aXZlUXVlcnlSZXNwb25zZSxcbiAgTmF0aXZlUm91dGluZ0RlY2lzaW9uLFxuICBOYXRpdmVNZW1vcnlSZXN1bHQsXG4gIE5hdGl2ZVN0YXRzLFxuICBOYXRpdmVTaW1kT3BzLFxufTtcbiJdfQ==
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Management for multi-turn conversations
|
|
3
|
+
*/
|
|
4
|
+
import { ConversationSession, ConversationMessage, QueryResponse, GenerationConfig } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Session Manager for multi-turn conversations
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { RuvLLM, SessionManager } from '@ruvector/ruvllm';
|
|
11
|
+
*
|
|
12
|
+
* const llm = new RuvLLM();
|
|
13
|
+
* const sessions = new SessionManager(llm);
|
|
14
|
+
*
|
|
15
|
+
* // Create a new session
|
|
16
|
+
* const session = sessions.create();
|
|
17
|
+
*
|
|
18
|
+
* // Chat with context
|
|
19
|
+
* const response1 = sessions.chat(session.id, 'What is Python?');
|
|
20
|
+
* const response2 = sessions.chat(session.id, 'How do I install it?');
|
|
21
|
+
* // Second query automatically has context from first
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class SessionManager {
|
|
25
|
+
private sessions;
|
|
26
|
+
private llm;
|
|
27
|
+
constructor(llm: {
|
|
28
|
+
query: (text: string, config?: GenerationConfig) => QueryResponse;
|
|
29
|
+
addMemory: (content: string, metadata?: Record<string, unknown>) => number;
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Create a new conversation session
|
|
33
|
+
*/
|
|
34
|
+
create(metadata?: Record<string, unknown>): ConversationSession;
|
|
35
|
+
/**
|
|
36
|
+
* Get session by ID
|
|
37
|
+
*/
|
|
38
|
+
get(sessionId: string): ConversationSession | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Chat within a session (maintains context)
|
|
41
|
+
*/
|
|
42
|
+
chat(sessionId: string, message: string, config?: GenerationConfig): QueryResponse;
|
|
43
|
+
/**
|
|
44
|
+
* Add system message to session
|
|
45
|
+
*/
|
|
46
|
+
addSystemMessage(sessionId: string, content: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Add context to session (persisted to memory)
|
|
49
|
+
*/
|
|
50
|
+
addContext(sessionId: string, context: string): number;
|
|
51
|
+
/**
|
|
52
|
+
* Get conversation history
|
|
53
|
+
*/
|
|
54
|
+
getHistory(sessionId: string, limit?: number): ConversationMessage[];
|
|
55
|
+
/**
|
|
56
|
+
* Clear session history (keep session active)
|
|
57
|
+
*/
|
|
58
|
+
clearHistory(sessionId: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* End and delete session
|
|
61
|
+
*/
|
|
62
|
+
end(sessionId: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* List all active sessions
|
|
65
|
+
*/
|
|
66
|
+
list(): ConversationSession[];
|
|
67
|
+
/**
|
|
68
|
+
* Export session as JSON
|
|
69
|
+
*/
|
|
70
|
+
export(sessionId: string): string | null;
|
|
71
|
+
/**
|
|
72
|
+
* Import session from JSON
|
|
73
|
+
*/
|
|
74
|
+
import(json: string): ConversationSession;
|
|
75
|
+
/**
|
|
76
|
+
* Build context string from recent messages
|
|
77
|
+
*/
|
|
78
|
+
private buildContext;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,GAAG,CAAoJ;gBAEnJ,GAAG,EAAE;QAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,KAAK,aAAa,CAAC;QAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAA;KAAE;IAIlK;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB;IAe/D;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAIvD;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,aAAa;IAiClF;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAc1D;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAmBtD;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAUpE;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASrC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,IAAI,IAAI,mBAAmB,EAAE;IAI7B;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASxC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB;IAezC;;OAEG;IACH,OAAO,CAAC,YAAY;CA2BrB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session Management for multi-turn conversations
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SessionManager = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Session Manager for multi-turn conversations
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { RuvLLM, SessionManager } from '@ruvector/ruvllm';
|
|
13
|
+
*
|
|
14
|
+
* const llm = new RuvLLM();
|
|
15
|
+
* const sessions = new SessionManager(llm);
|
|
16
|
+
*
|
|
17
|
+
* // Create a new session
|
|
18
|
+
* const session = sessions.create();
|
|
19
|
+
*
|
|
20
|
+
* // Chat with context
|
|
21
|
+
* const response1 = sessions.chat(session.id, 'What is Python?');
|
|
22
|
+
* const response2 = sessions.chat(session.id, 'How do I install it?');
|
|
23
|
+
* // Second query automatically has context from first
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
class SessionManager {
|
|
27
|
+
constructor(llm) {
|
|
28
|
+
this.sessions = new Map();
|
|
29
|
+
this.llm = llm;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a new conversation session
|
|
33
|
+
*/
|
|
34
|
+
create(metadata) {
|
|
35
|
+
const id = `session-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
36
|
+
const session = {
|
|
37
|
+
id,
|
|
38
|
+
createdAt: new Date(),
|
|
39
|
+
messageCount: 0,
|
|
40
|
+
messages: [],
|
|
41
|
+
context: [],
|
|
42
|
+
activeMemoryIds: [],
|
|
43
|
+
metadata: metadata ?? {},
|
|
44
|
+
};
|
|
45
|
+
this.sessions.set(id, session);
|
|
46
|
+
return session;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get session by ID
|
|
50
|
+
*/
|
|
51
|
+
get(sessionId) {
|
|
52
|
+
return this.sessions.get(sessionId);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Chat within a session (maintains context)
|
|
56
|
+
*/
|
|
57
|
+
chat(sessionId, message, config) {
|
|
58
|
+
const session = this.sessions.get(sessionId);
|
|
59
|
+
if (!session) {
|
|
60
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
61
|
+
}
|
|
62
|
+
// Add user message
|
|
63
|
+
session.messages.push({
|
|
64
|
+
role: 'user',
|
|
65
|
+
content: message,
|
|
66
|
+
timestamp: new Date(),
|
|
67
|
+
});
|
|
68
|
+
// Build context from recent messages
|
|
69
|
+
const contextWindow = this.buildContext(session);
|
|
70
|
+
// Query with context
|
|
71
|
+
const prompt = contextWindow ? `${contextWindow}\n\nUser: ${message}` : message;
|
|
72
|
+
const response = this.llm.query(prompt, config);
|
|
73
|
+
// Add assistant response
|
|
74
|
+
session.messages.push({
|
|
75
|
+
role: 'assistant',
|
|
76
|
+
content: response.text,
|
|
77
|
+
timestamp: new Date(),
|
|
78
|
+
requestId: response.requestId,
|
|
79
|
+
});
|
|
80
|
+
session.messageCount = session.messages.length;
|
|
81
|
+
return response;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Add system message to session
|
|
85
|
+
*/
|
|
86
|
+
addSystemMessage(sessionId, content) {
|
|
87
|
+
const session = this.sessions.get(sessionId);
|
|
88
|
+
if (!session) {
|
|
89
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
90
|
+
}
|
|
91
|
+
session.messages.push({
|
|
92
|
+
role: 'system',
|
|
93
|
+
content,
|
|
94
|
+
timestamp: new Date(),
|
|
95
|
+
});
|
|
96
|
+
session.messageCount = session.messages.length;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Add context to session (persisted to memory)
|
|
100
|
+
*/
|
|
101
|
+
addContext(sessionId, context) {
|
|
102
|
+
const session = this.sessions.get(sessionId);
|
|
103
|
+
if (!session) {
|
|
104
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
105
|
+
}
|
|
106
|
+
session.context.push(context);
|
|
107
|
+
// Also store in memory for retrieval
|
|
108
|
+
const memoryId = this.llm.addMemory(context, {
|
|
109
|
+
sessionId,
|
|
110
|
+
type: 'context',
|
|
111
|
+
timestamp: new Date().toISOString(),
|
|
112
|
+
});
|
|
113
|
+
session.activeMemoryIds.push(memoryId);
|
|
114
|
+
return memoryId;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get conversation history
|
|
118
|
+
*/
|
|
119
|
+
getHistory(sessionId, limit) {
|
|
120
|
+
const session = this.sessions.get(sessionId);
|
|
121
|
+
if (!session) {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
const messages = session.messages;
|
|
125
|
+
return limit ? messages.slice(-limit) : messages;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Clear session history (keep session active)
|
|
129
|
+
*/
|
|
130
|
+
clearHistory(sessionId) {
|
|
131
|
+
const session = this.sessions.get(sessionId);
|
|
132
|
+
if (session) {
|
|
133
|
+
session.messages = [];
|
|
134
|
+
session.context = [];
|
|
135
|
+
session.messageCount = 0;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* End and delete session
|
|
140
|
+
*/
|
|
141
|
+
end(sessionId) {
|
|
142
|
+
return this.sessions.delete(sessionId);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* List all active sessions
|
|
146
|
+
*/
|
|
147
|
+
list() {
|
|
148
|
+
return Array.from(this.sessions.values());
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Export session as JSON
|
|
152
|
+
*/
|
|
153
|
+
export(sessionId) {
|
|
154
|
+
const session = this.sessions.get(sessionId);
|
|
155
|
+
if (!session) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
return JSON.stringify(session, null, 2);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Import session from JSON
|
|
162
|
+
*/
|
|
163
|
+
import(json) {
|
|
164
|
+
const data = JSON.parse(json);
|
|
165
|
+
const session = {
|
|
166
|
+
...data,
|
|
167
|
+
createdAt: new Date(data.createdAt),
|
|
168
|
+
messages: data.messages.map((m) => ({
|
|
169
|
+
...m,
|
|
170
|
+
timestamp: new Date(m.timestamp),
|
|
171
|
+
})),
|
|
172
|
+
};
|
|
173
|
+
this.sessions.set(session.id, session);
|
|
174
|
+
return session;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Build context string from recent messages
|
|
178
|
+
*/
|
|
179
|
+
buildContext(session, maxMessages = 10) {
|
|
180
|
+
const recent = session.messages.slice(-maxMessages);
|
|
181
|
+
if (recent.length === 0) {
|
|
182
|
+
return '';
|
|
183
|
+
}
|
|
184
|
+
const contextParts = [];
|
|
185
|
+
// Add persistent context
|
|
186
|
+
if (session.context.length > 0) {
|
|
187
|
+
contextParts.push('Context:\n' + session.context.join('\n'));
|
|
188
|
+
}
|
|
189
|
+
// Add conversation history
|
|
190
|
+
const history = recent
|
|
191
|
+
.map(m => {
|
|
192
|
+
const role = m.role === 'user' ? 'User' : m.role === 'assistant' ? 'Assistant' : 'System';
|
|
193
|
+
return `${role}: ${m.content}`;
|
|
194
|
+
})
|
|
195
|
+
.join('\n');
|
|
196
|
+
if (history) {
|
|
197
|
+
contextParts.push('Conversation:\n' + history);
|
|
198
|
+
}
|
|
199
|
+
return contextParts.join('\n\n');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
exports.SessionManager = SessionManager;
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7O0FBU0g7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQWEsY0FBYztJQUl6QixZQUFZLEdBQXNKO1FBSDFKLGFBQVEsR0FBcUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUk3RCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBa0M7UUFDdkMsTUFBTSxFQUFFLEdBQUcsV0FBVyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0UsTUFBTSxPQUFPLEdBQXdCO1lBQ25DLEVBQUU7WUFDRixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDckIsWUFBWSxFQUFFLENBQUM7WUFDZixRQUFRLEVBQUUsRUFBRTtZQUNaLE9BQU8sRUFBRSxFQUFFO1lBQ1gsZUFBZSxFQUFFLEVBQUU7WUFDbkIsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFO1NBQ3pCLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUFDLFNBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLFNBQWlCLEVBQUUsT0FBZSxFQUFFLE1BQXlCO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxR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QyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMxRixPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFZCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQS9NRCx3Q0ErTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlc3Npb24gTWFuYWdlbWVudCBmb3IgbXVsdGktdHVybiBjb252ZXJzYXRpb25zXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uU2Vzc2lvbixcbiAgQ29udmVyc2F0aW9uTWVzc2FnZSxcbiAgUXVlcnlSZXNwb25zZSxcbiAgR2VuZXJhdGlvbkNvbmZpZyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogU2Vzc2lvbiBNYW5hZ2VyIGZvciBtdWx0aS10dXJuIGNvbnZlcnNhdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgUnV2TExNLCBTZXNzaW9uTWFuYWdlciB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IGxsbSA9IG5ldyBSdXZMTE0oKTtcbiAqIGNvbnN0IHNlc3Npb25zID0gbmV3IFNlc3Npb25NYW5hZ2VyKGxsbSk7XG4gKlxuICogLy8gQ3JlYXRlIGEgbmV3IHNlc3Npb25cbiAqIGNvbnN0IHNlc3Npb24gPSBzZXNzaW9ucy5jcmVhdGUoKTtcbiAqXG4gKiAvLyBDaGF0IHdpdGggY29udGV4dFxuICogY29uc3QgcmVzcG9uc2UxID0gc2Vzc2lvbnMuY2hhdChzZXNzaW9uLmlkLCAnV2hhdCBpcyBQeXRob24/Jyk7XG4gKiBjb25zdCByZXNwb25zZTIgPSBzZXNzaW9ucy5jaGF0KHNlc3Npb24uaWQsICdIb3cgZG8gSSBpbnN0YWxsIGl0PycpO1xuICogLy8gU2Vjb25kIHF1ZXJ5IGF1dG9tYXRpY2FsbHkgaGFzIGNvbnRleHQgZnJvbSBmaXJzdFxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTWFuYWdlciB7XG4gIHByaXZhdGUgc2Vzc2lvbnM6IE1hcDxzdHJpbmcsIENvbnZlcnNhdGlvblNlc3Npb24+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGxsbTogeyBxdWVyeTogKHRleHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZykgPT4gUXVlcnlSZXNwb25zZTsgYWRkTWVtb3J5OiAoY29udGVudDogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBudW1iZXIgfTtcblxuICBjb25zdHJ1Y3RvcihsbG06IHsgcXVlcnk6ICh0ZXh0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpID0+IFF1ZXJ5UmVzcG9uc2U7IGFkZE1lbW9yeTogKGNvbnRlbnQ6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gbnVtYmVyIH0pIHtcbiAgICB0aGlzLmxsbSA9IGxsbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgY29udmVyc2F0aW9uIHNlc3Npb25cbiAgICovXG4gIGNyZWF0ZShtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogQ29udmVyc2F0aW9uU2Vzc2lvbiB7XG4gICAgY29uc3QgaWQgPSBgc2Vzc2lvbi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YDtcbiAgICBjb25zdCBzZXNzaW9uOiBDb252ZXJzYXRpb25TZXNzaW9uID0ge1xuICAgICAgaWQsXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBtZXNzYWdlQ291bnQ6IDAsXG4gICAgICBtZXNzYWdlczogW10sXG4gICAgICBjb250ZXh0OiBbXSxcbiAgICAgIGFjdGl2ZU1lbW9yeUlkczogW10sXG4gICAgICBtZXRhZGF0YTogbWV0YWRhdGEgPz8ge30sXG4gICAgfTtcbiAgICB0aGlzLnNlc3Npb25zLnNldChpZCwgc2Vzc2lvbik7XG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlc3Npb24gYnkgSURcbiAgICovXG4gIGdldChzZXNzaW9uSWQ6IHN0cmluZyk6IENvbnZlcnNhdGlvblNlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYXQgd2l0aGluIGEgc2Vzc2lvbiAobWFpbnRhaW5zIGNvbnRleHQpXG4gICAqL1xuICBjaGF0KHNlc3Npb25JZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBRdWVyeVJlc3BvbnNlIHtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2Vzc2lvbiBub3QgZm91bmQ6ICR7c2Vzc2lvbklkfWApO1xuICAgIH1cblxuICAgIC8vIEFkZCB1c2VyIG1lc3NhZ2VcbiAgICBzZXNzaW9uLm1lc3NhZ2VzLnB1c2goe1xuICAgICAgcm9sZTogJ3VzZXInLFxuICAgICAgY29udGVudDogbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICB9KTtcblxuICAgIC8vIEJ1aWxkIGNvbnRleHQgZnJvbSByZWNlbnQgbWVzc2FnZXNcbiAgICBjb25zdCBjb250ZXh0V2luZG93ID0gdGhpcy5idWlsZENvbnRleHQoc2Vzc2lvbik7XG5cbiAgICAvLyBRdWVyeSB3aXRoIGNvbnRleHRcbiAgICBjb25zdCBwcm9tcHQgPSBjb250ZXh0V2luZG93ID8gYCR7Y29udGV4dFdpbmRvd31cXG5cXG5Vc2VyOiAke21lc3NhZ2V9YCA6IG1lc3NhZ2U7XG4gICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmxsbS5xdWVyeShwcm9tcHQsIGNvbmZpZyk7XG5cbiAgICAvLyBBZGQgYXNzaXN0YW50IHJlc3BvbnNlXG4gICAgc2Vzc2lvbi5tZXNzYWdlcy5wdXNoKHtcbiAgICAgIHJvbGU6ICdhc3Npc3RhbnQnLFxuICAgICAgY29udGVudDogcmVzcG9uc2UudGV4dCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIHJlcXVlc3RJZDogcmVzcG9uc2UucmVxdWVzdElkLFxuICAgIH0pO1xuXG4gICAgc2Vzc2lvbi5tZXNzYWdlQ291bnQgPSBzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aDtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgc3lzdGVtIG1lc3NhZ2UgdG8gc2Vzc2lvblxuICAgKi9cbiAgYWRkU3lzdGVtTWVzc2FnZShzZXNzaW9uSWQ6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gbm90IGZvdW5kOiAke3Nlc3Npb25JZH1gKTtcbiAgICB9XG5cbiAgICBzZXNzaW9uLm1lc3NhZ2VzLnB1c2goe1xuICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICBjb250ZW50LFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgIH0pO1xuICAgIHNlc3Npb24ubWVzc2FnZUNvdW50ID0gc2Vzc2lvbi5tZXNzYWdlcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGNvbnRleHQgdG8gc2Vzc2lvbiAocGVyc2lzdGVkIHRvIG1lbW9yeSlcbiAgICovXG4gIGFkZENvbnRleHQoc2Vzc2lvbklkOiBzdHJpbmcsIGNvbnRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gbm90IGZvdW5kOiAke3Nlc3Npb25JZH1gKTtcbiAgICB9XG5cbiAgICBzZXNzaW9uLmNvbnRleHQucHVzaChjb250ZXh0KTtcblxuICAgIC8vIEFsc28gc3RvcmUgaW4gbWVtb3J5IGZvciByZXRyaWV2YWxcbiAgICBjb25zdCBtZW1vcnlJZCA9IHRoaXMubGxtLmFkZE1lbW9yeShjb250ZXh0LCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0eXBlOiAnY29udGV4dCcsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIHNlc3Npb24uYWN0aXZlTWVtb3J5SWRzLnB1c2gobWVtb3J5SWQpO1xuICAgIHJldHVybiBtZW1vcnlJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udmVyc2F0aW9uIGhpc3RvcnlcbiAgICovXG4gIGdldEhpc3Rvcnkoc2Vzc2lvbklkOiBzdHJpbmcsIGxpbWl0PzogbnVtYmVyKTogQ29udmVyc2F0aW9uTWVzc2FnZVtdIHtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlcyA9IHNlc3Npb24ubWVzc2FnZXM7XG4gICAgcmV0dXJuIGxpbWl0ID8gbWVzc2FnZXMuc2xpY2UoLWxpbWl0KSA6IG1lc3NhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHNlc3Npb24gaGlzdG9yeSAoa2VlcCBzZXNzaW9uIGFjdGl2ZSlcbiAgICovXG4gIGNsZWFySGlzdG9yeShzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICBzZXNzaW9uLm1lc3NhZ2VzID0gW107XG4gICAgICBzZXNzaW9uLmNvbnRleHQgPSBbXTtcbiAgICAgIHNlc3Npb24ubWVzc2FnZUNvdW50ID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5kIGFuZCBkZWxldGUgc2Vzc2lvblxuICAgKi9cbiAgZW5kKHNlc3Npb25JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZGVsZXRlKHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgYWN0aXZlIHNlc3Npb25zXG4gICAqL1xuICBsaXN0KCk6IENvbnZlcnNhdGlvblNlc3Npb25bXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5zZXNzaW9ucy52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHNlc3Npb24gYXMgSlNPTlxuICAgKi9cbiAgZXhwb3J0KHNlc3Npb25JZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbiwgbnVsbCwgMik7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IHNlc3Npb24gZnJvbSBKU09OXG4gICAqL1xuICBpbXBvcnQoanNvbjogc3RyaW5nKTogQ29udmVyc2F0aW9uU2Vzc2lvbiB7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoanNvbik7XG4gICAgY29uc3Qgc2Vzc2lvbjogQ29udmVyc2F0aW9uU2Vzc2lvbiA9IHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKGRhdGEuY3JlYXRlZEF0KSxcbiAgICAgIG1lc3NhZ2VzOiBkYXRhLm1lc3NhZ2VzLm1hcCgobTogQ29udmVyc2F0aW9uTWVzc2FnZSkgPT4gKHtcbiAgICAgICAgLi4ubSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZShtLnRpbWVzdGFtcCksXG4gICAgICB9KSksXG4gICAgfTtcblxuICAgIHRoaXMuc2Vzc2lvbnMuc2V0KHNlc3Npb24uaWQsIHNlc3Npb24pO1xuICAgIHJldHVybiBzZXNzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGNvbnRleHQgc3RyaW5nIGZyb20gcmVjZW50IG1lc3NhZ2VzXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQ29udGV4dChzZXNzaW9uOiBDb252ZXJzYXRpb25TZXNzaW9uLCBtYXhNZXNzYWdlcyA9IDEwKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWNlbnQgPSBzZXNzaW9uLm1lc3NhZ2VzLnNsaWNlKC1tYXhNZXNzYWdlcyk7XG4gICAgaWYgKHJlY2VudC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0UGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBBZGQgcGVyc2lzdGVudCBjb250ZXh0XG4gICAgaWYgKHNlc3Npb24uY29udGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZXh0UGFydHMucHVzaCgnQ29udGV4dDpcXG4nICsgc2Vzc2lvbi5jb250ZXh0LmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY29udmVyc2F0aW9uIGhpc3RvcnlcbiAgICBjb25zdCBoaXN0b3J5ID0gcmVjZW50XG4gICAgICAubWFwKG0gPT4ge1xuICAgICAgICBjb25zdCByb2xlID0gbS5yb2xlID09PSAndXNlcicgPyAnVXNlcicgOiBtLnJvbGUgPT09ICdhc3Npc3RhbnQnID8gJ0Fzc2lzdGFudCcgOiAnU3lzdGVtJztcbiAgICAgICAgcmV0dXJuIGAke3JvbGV9OiAke20uY29udGVudH1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIGlmIChoaXN0b3J5KSB7XG4gICAgICBjb250ZXh0UGFydHMucHVzaCgnQ29udmVyc2F0aW9uOlxcbicgKyBoaXN0b3J5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFBhcnRzLmpvaW4oJ1xcblxcbicpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SIMD Operations for vector computations
|
|
3
|
+
*
|
|
4
|
+
* Uses native SIMD instructions (AVX2/AVX512/SSE4.1/NEON) when available,
|
|
5
|
+
* falls back to JavaScript implementations otherwise.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* SIMD Operations class
|
|
9
|
+
*
|
|
10
|
+
* Provides hardware-accelerated vector operations when native module is available.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { SimdOps } from '@ruvector/ruvllm';
|
|
15
|
+
*
|
|
16
|
+
* const simd = new SimdOps();
|
|
17
|
+
*
|
|
18
|
+
* // Compute dot product
|
|
19
|
+
* const result = simd.dotProduct([1, 2, 3], [4, 5, 6]);
|
|
20
|
+
* console.log(result); // 32
|
|
21
|
+
*
|
|
22
|
+
* // Check capabilities
|
|
23
|
+
* console.log(simd.capabilities()); // ['AVX2', 'FMA']
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class SimdOps {
|
|
27
|
+
private native;
|
|
28
|
+
constructor();
|
|
29
|
+
/**
|
|
30
|
+
* Compute dot product of two vectors
|
|
31
|
+
*/
|
|
32
|
+
dotProduct(a: number[], b: number[]): number;
|
|
33
|
+
/**
|
|
34
|
+
* Compute cosine similarity between two vectors
|
|
35
|
+
*/
|
|
36
|
+
cosineSimilarity(a: number[], b: number[]): number;
|
|
37
|
+
/**
|
|
38
|
+
* Compute L2 (Euclidean) distance between two vectors
|
|
39
|
+
*/
|
|
40
|
+
l2Distance(a: number[], b: number[]): number;
|
|
41
|
+
/**
|
|
42
|
+
* Matrix-vector multiplication
|
|
43
|
+
*/
|
|
44
|
+
matvec(matrix: number[][], vector: number[]): number[];
|
|
45
|
+
/**
|
|
46
|
+
* Softmax activation function
|
|
47
|
+
*/
|
|
48
|
+
softmax(input: number[]): number[];
|
|
49
|
+
/**
|
|
50
|
+
* Element-wise addition
|
|
51
|
+
*/
|
|
52
|
+
add(a: number[], b: number[]): number[];
|
|
53
|
+
/**
|
|
54
|
+
* Element-wise multiplication
|
|
55
|
+
*/
|
|
56
|
+
mul(a: number[], b: number[]): number[];
|
|
57
|
+
/**
|
|
58
|
+
* Scale vector by scalar
|
|
59
|
+
*/
|
|
60
|
+
scale(a: number[], scalar: number): number[];
|
|
61
|
+
/**
|
|
62
|
+
* Normalize vector to unit length
|
|
63
|
+
*/
|
|
64
|
+
normalize(a: number[]): number[];
|
|
65
|
+
/**
|
|
66
|
+
* ReLU activation
|
|
67
|
+
*/
|
|
68
|
+
relu(input: number[]): number[];
|
|
69
|
+
/**
|
|
70
|
+
* GELU activation (approximate)
|
|
71
|
+
*/
|
|
72
|
+
gelu(input: number[]): number[];
|
|
73
|
+
/**
|
|
74
|
+
* Sigmoid activation
|
|
75
|
+
*/
|
|
76
|
+
sigmoid(input: number[]): number[];
|
|
77
|
+
/**
|
|
78
|
+
* Layer normalization
|
|
79
|
+
*/
|
|
80
|
+
layerNorm(input: number[], eps?: number): number[];
|
|
81
|
+
/**
|
|
82
|
+
* Check if native SIMD is available
|
|
83
|
+
*/
|
|
84
|
+
isNative(): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Get available SIMD capabilities
|
|
87
|
+
*/
|
|
88
|
+
capabilities(): string[];
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=simd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simd.d.ts","sourceRoot":"","sources":["../../src/simd.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAA8B;;IAa5C;;OAEG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAc5C;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAqBlD;;OAEG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAe5C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAStD;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAYlC;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IASvC;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IASvC;;OAEG;IACH,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAI5C;;OAEG;IACH,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAKhC;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAI/B;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAM/B;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAIlC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,SAAO,GAAG,MAAM,EAAE;IAOhD;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;CAkBzB"}
|