aiservermanager 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -0
- package/backend/dist/di/container.js +80 -0
- package/backend/dist/di/container.js.map +1 -0
- package/backend/dist/di/types.js +18 -0
- package/backend/dist/di/types.js.map +1 -0
- package/backend/dist/files/validatePassword.ps1 +10 -0
- package/backend/dist/files/wmiGpuQuery.ps1 +15 -0
- package/backend/dist/helpers/ExecTools.js +101 -0
- package/backend/dist/helpers/ExecTools.js.map +1 -0
- package/backend/dist/index.js +51 -0
- package/backend/dist/index.js.map +1 -0
- package/backend/dist/middleware/authMiddleware.js +32 -0
- package/backend/dist/middleware/authMiddleware.js.map +1 -0
- package/backend/dist/models/GpuInfo.js +3 -0
- package/backend/dist/models/GpuInfo.js.map +1 -0
- package/backend/dist/models/ServiceConfig.js +46 -0
- package/backend/dist/models/ServiceConfig.js.map +1 -0
- package/backend/dist/models/ServiceStatus.js +3 -0
- package/backend/dist/models/ServiceStatus.js.map +1 -0
- package/backend/dist/routes/authRoutes.js +46 -0
- package/backend/dist/routes/authRoutes.js.map +1 -0
- package/backend/dist/routes/gpuRoutes.js +35 -0
- package/backend/dist/routes/gpuRoutes.js.map +1 -0
- package/backend/dist/routes/serviceRoutes.js +206 -0
- package/backend/dist/routes/serviceRoutes.js.map +1 -0
- package/backend/dist/routes/systemRoutes.js +64 -0
- package/backend/dist/routes/systemRoutes.js.map +1 -0
- package/backend/dist/services/auth/linuxPasswordVerifier.js +74 -0
- package/backend/dist/services/auth/linuxPasswordVerifier.js.map +1 -0
- package/backend/dist/services/auth/passwordVerifier.js +3 -0
- package/backend/dist/services/auth/passwordVerifier.js.map +1 -0
- package/backend/dist/services/auth/windowsPasswordVerifier.js +73 -0
- package/backend/dist/services/auth/windowsPasswordVerifier.js.map +1 -0
- package/backend/dist/services/authService.js +240 -0
- package/backend/dist/services/authService.js.map +1 -0
- package/backend/dist/services/configManager.js +96 -0
- package/backend/dist/services/configManager.js.map +1 -0
- package/backend/dist/services/controllers/systemctlController.js +287 -0
- package/backend/dist/services/controllers/systemctlController.js.map +1 -0
- package/backend/dist/services/controllers/windowsServiceController.js +201 -0
- package/backend/dist/services/controllers/windowsServiceController.js.map +1 -0
- package/backend/dist/services/detectors/amdLinuxDetector.js +127 -0
- package/backend/dist/services/detectors/amdLinuxDetector.js.map +1 -0
- package/backend/dist/services/detectors/gpuDetector.js +3 -0
- package/backend/dist/services/detectors/gpuDetector.js.map +1 -0
- package/backend/dist/services/detectors/nvidiaSmiDetector.js +67 -0
- package/backend/dist/services/detectors/nvidiaSmiDetector.js.map +1 -0
- package/backend/dist/services/detectors/wmiDetector.js +125 -0
- package/backend/dist/services/detectors/wmiDetector.js.map +1 -0
- package/backend/dist/services/enrichers/gpuEnricher.js +3 -0
- package/backend/dist/services/enrichers/gpuEnricher.js.map +1 -0
- package/backend/dist/services/enrichers/lspciEnricher.js +92 -0
- package/backend/dist/services/enrichers/lspciEnricher.js.map +1 -0
- package/backend/dist/services/enrichers/vulkanEnricher.js +57 -0
- package/backend/dist/services/enrichers/vulkanEnricher.js.map +1 -0
- package/backend/dist/services/gpuService.js +108 -0
- package/backend/dist/services/gpuService.js.map +1 -0
- package/backend/dist/services/helpers/gpuDedup.js +46 -0
- package/backend/dist/services/helpers/gpuDedup.js.map +1 -0
- package/backend/dist/services/helpers/gpuEngineNames.js +22 -0
- package/backend/dist/services/helpers/gpuEngineNames.js.map +1 -0
- package/backend/dist/services/llamaAutocompleteService.js +277 -0
- package/backend/dist/services/llamaAutocompleteService.js.map +1 -0
- package/backend/dist/services/managedServicesController.js +72 -0
- package/backend/dist/services/managedServicesController.js.map +1 -0
- package/backend/dist/services/managedServicesManager.js +91 -0
- package/backend/dist/services/managedServicesManager.js.map +1 -0
- package/backend/dist/services/probes/amdLinuxUsageProbe.js +109 -0
- package/backend/dist/services/probes/amdLinuxUsageProbe.js.map +1 -0
- package/backend/dist/services/probes/gpuUsageProbe.js +3 -0
- package/backend/dist/services/probes/gpuUsageProbe.js.map +1 -0
- package/backend/dist/services/probes/nvidiaSmiUsageProbe.js +67 -0
- package/backend/dist/services/probes/nvidiaSmiUsageProbe.js.map +1 -0
- package/backend/dist/services/providers/systemInfoLinuxProvider.js +188 -0
- package/backend/dist/services/providers/systemInfoLinuxProvider.js.map +1 -0
- package/backend/dist/services/providers/systemInfoWindowsProvider.js +101 -0
- package/backend/dist/services/providers/systemInfoWindowsProvider.js.map +1 -0
- package/backend/dist/services/serviceConfigController.js +116 -0
- package/backend/dist/services/serviceConfigController.js.map +1 -0
- package/backend/dist/services/serviceController.js +3 -0
- package/backend/dist/services/serviceController.js.map +1 -0
- package/backend/dist/services/serviceManager.js +157 -0
- package/backend/dist/services/serviceManager.js.map +1 -0
- package/backend/dist/services/systemInfoProvider.js +3 -0
- package/backend/dist/services/systemInfoProvider.js.map +1 -0
- package/backend/dist/services/systemService.js +42 -0
- package/backend/dist/services/systemService.js.map +1 -0
- package/backend/public/browser/chunk-34LU6STA.js +1 -0
- package/backend/public/browser/chunk-JGNPKRLU.js +4 -0
- package/backend/public/browser/favicon.svg +11 -0
- package/backend/public/browser/index.html +15 -0
- package/backend/public/browser/main-MUMQYBNS.js +5579 -0
- package/backend/public/browser/polyfills-5CFQRCPP.js +2 -0
- package/backend/public/browser/styles-QBUDNRKH.css +1 -0
- package/bin/aiservermanager.js +2 -0
- package/package.json +45 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.LspciEnricher = void 0;
|
|
13
|
+
const inversify_1 = require("inversify");
|
|
14
|
+
const ExecTools_1 = require("../../helpers/ExecTools");
|
|
15
|
+
/**
|
|
16
|
+
* Enrich GPU entries with PCI brand (ASRock, MSI, Gigabyte, etc.) using `lspci -vnn`.
|
|
17
|
+
* Linux only.
|
|
18
|
+
*/
|
|
19
|
+
let LspciEnricher = class LspciEnricher {
|
|
20
|
+
availableCache = null;
|
|
21
|
+
constructor() {
|
|
22
|
+
if (process.platform !== "linux") {
|
|
23
|
+
this.availableCache = false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async isAvailable() {
|
|
27
|
+
if (this.availableCache !== null)
|
|
28
|
+
return this.availableCache;
|
|
29
|
+
const result = await ExecTools_1.ExecTools.safeExec("lspci -vnn 2>/dev/null", { timeout: 5000 });
|
|
30
|
+
const available = result.stdout.includes("VGA") || result.stdout.includes("3D");
|
|
31
|
+
if (available) {
|
|
32
|
+
this.availableCache = true;
|
|
33
|
+
}
|
|
34
|
+
return available;
|
|
35
|
+
}
|
|
36
|
+
async enrich(gpus) {
|
|
37
|
+
if (gpus.length === 0)
|
|
38
|
+
return;
|
|
39
|
+
const result = await ExecTools_1.ExecTools.safeExec("lspci -vnn | grep -A 3 -E 'VGA|3D|Display'", {
|
|
40
|
+
timeout: 10000,
|
|
41
|
+
});
|
|
42
|
+
if (!result.stdout.trim())
|
|
43
|
+
return;
|
|
44
|
+
const brandMap = this.parseBlocks(result.stdout);
|
|
45
|
+
for (const gpu of gpus) {
|
|
46
|
+
const key = gpu.pciBusId.toUpperCase();
|
|
47
|
+
if (brandMap[key]) {
|
|
48
|
+
gpu.brand = brandMap[key];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
parseBlocks(raw) {
|
|
53
|
+
const map = {};
|
|
54
|
+
const blocks = raw.split(/\n--\n|\n--$/m);
|
|
55
|
+
for (const block of blocks) {
|
|
56
|
+
const pciMatch = block.match(/^([0-9a-fA-F]+):([0-9a-fA-F]+)\.([0-9])/);
|
|
57
|
+
if (!pciMatch)
|
|
58
|
+
continue;
|
|
59
|
+
const busId = `${pciMatch[1]}:${pciMatch[2]}.${pciMatch[3]}`.toUpperCase();
|
|
60
|
+
const brand = detectBrand(block);
|
|
61
|
+
if (brand)
|
|
62
|
+
map[busId] = brand;
|
|
63
|
+
}
|
|
64
|
+
return map;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
exports.LspciEnricher = LspciEnricher;
|
|
68
|
+
exports.LspciEnricher = LspciEnricher = __decorate([
|
|
69
|
+
(0, inversify_1.injectable)(),
|
|
70
|
+
__metadata("design:paramtypes", [])
|
|
71
|
+
], LspciEnricher);
|
|
72
|
+
function detectBrand(block) {
|
|
73
|
+
const upper = block.toUpperCase();
|
|
74
|
+
if (upper.includes("ASROK") || upper.includes("ASROCK"))
|
|
75
|
+
return "ASROCK";
|
|
76
|
+
if (upper.includes("MICRO-STAR") || upper.includes("[MSI]"))
|
|
77
|
+
return "MSI";
|
|
78
|
+
if (upper.includes("GIGABYTE"))
|
|
79
|
+
return "GIGABYTE";
|
|
80
|
+
if (upper.includes("EVGA"))
|
|
81
|
+
return "EVGA";
|
|
82
|
+
if (upper.includes("ZOTAC"))
|
|
83
|
+
return "ZOTAC";
|
|
84
|
+
if (upper.includes("SAPPHIRE"))
|
|
85
|
+
return "SAPPHIRE";
|
|
86
|
+
if (upper.includes("POWERCOLOR"))
|
|
87
|
+
return "POWERCOLOR";
|
|
88
|
+
if (upper.includes("XFX"))
|
|
89
|
+
return "XFX";
|
|
90
|
+
return "";
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=lspciEnricher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lspciEnricher.js","sourceRoot":"","sources":["../../../src/services/enrichers/lspciEnricher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.VulkanEnricher = void 0;
|
|
13
|
+
const inversify_1 = require("inversify");
|
|
14
|
+
const ExecTools_1 = require("../../helpers/ExecTools");
|
|
15
|
+
/**
|
|
16
|
+
* Enrich GPU entries with llama.cpp Vulkan device names (vulkan0, vulkan1, ...).
|
|
17
|
+
* Uses `vulkaninfo --summary` to detect Vulkan-capable GPUs.
|
|
18
|
+
* Linux only.
|
|
19
|
+
*/
|
|
20
|
+
let VulkanEnricher = class VulkanEnricher {
|
|
21
|
+
availableCache = null;
|
|
22
|
+
constructor() {
|
|
23
|
+
if (process.platform !== "linux") {
|
|
24
|
+
this.availableCache = false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async isAvailable() {
|
|
28
|
+
if (this.availableCache !== null)
|
|
29
|
+
return this.availableCache;
|
|
30
|
+
const result = await ExecTools_1.ExecTools.safeExec("vulkaninfo --summary 2>/dev/null", { timeout: 5000 });
|
|
31
|
+
const available = result.stdout.includes("deviceName");
|
|
32
|
+
if (available) {
|
|
33
|
+
this.availableCache = true;
|
|
34
|
+
}
|
|
35
|
+
return available;
|
|
36
|
+
}
|
|
37
|
+
async enrich(gpus) {
|
|
38
|
+
if (gpus.length === 0)
|
|
39
|
+
return;
|
|
40
|
+
const result = await ExecTools_1.ExecTools.safeExec("vulkaninfo --summary 2>/dev/null | grep 'deviceName' | sed 's/.*deviceName = //'", {
|
|
41
|
+
timeout: 10000,
|
|
42
|
+
});
|
|
43
|
+
if (!result.stdout.trim())
|
|
44
|
+
return;
|
|
45
|
+
// Assign llama.cpp Vulkan device names: vulkan0, vulkan1, ...
|
|
46
|
+
const vulkanDevices = result.stdout.trim().split("\n").length;
|
|
47
|
+
for (let i = 0; i < gpus.length && i < vulkanDevices; i++) {
|
|
48
|
+
gpus[i].engineVulkanName = `vulkan${i}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.VulkanEnricher = VulkanEnricher;
|
|
53
|
+
exports.VulkanEnricher = VulkanEnricher = __decorate([
|
|
54
|
+
(0, inversify_1.injectable)(),
|
|
55
|
+
__metadata("design:paramtypes", [])
|
|
56
|
+
], VulkanEnricher);
|
|
57
|
+
//# sourceMappingURL=vulkanEnricher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vulkanEnricher.js","sourceRoot":"","sources":["../../../src/services/enrichers/vulkanEnricher.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAuC;AAEvC,uDAAoD;AAGpD;;;;GAIG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAc;IACjB,cAAc,GAAmB,IAAI,CAAC;IAE9C;QACE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,cAAyB,CAAC;QAExE,MAAM,MAAM,GAAG,MAAM,qBAAS,CAAC,QAAQ,CAAC,kCAAkC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/F,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAe;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9B,MAAM,MAAM,GAAG,MAAM,qBAAS,CAAC,QAAQ,CACrC,kFAAkF,EAClF;YACE,OAAO,EAAE,KAAK;SACf,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO;QAElC,8DAA8D;QAC9D,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1D,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,SAAS,CAAC,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;CACF,CAAA;AAtCY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,sBAAU,GAAE;;GACA,cAAc,CAsC1B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.GpuService = void 0;
|
|
16
|
+
const inversify_1 = require("inversify");
|
|
17
|
+
const types_1 = require("../di/types");
|
|
18
|
+
const gpuDedup_1 = require("./helpers/gpuDedup");
|
|
19
|
+
const gpuEngineNames_1 = require("./helpers/gpuEngineNames");
|
|
20
|
+
/**
|
|
21
|
+
* Orchestrates GPU detection and usage polling.
|
|
22
|
+
*
|
|
23
|
+
* Bootstrap (runs once): detectors → dedup → enrichers → engine names.
|
|
24
|
+
* Usage polling (every request): probes → GpuUsage[].
|
|
25
|
+
*
|
|
26
|
+
* Two access patterns:
|
|
27
|
+
* - getStaticGpus() → GpuInfo[] (cached)
|
|
28
|
+
* - getUsage() → GpuUsage[] (fresh each call)
|
|
29
|
+
*/
|
|
30
|
+
let GpuService = class GpuService {
|
|
31
|
+
detectors;
|
|
32
|
+
enrichers;
|
|
33
|
+
probes;
|
|
34
|
+
cachedGpus = null;
|
|
35
|
+
constructor(detectors, enrichers, probes) {
|
|
36
|
+
this.detectors = detectors;
|
|
37
|
+
this.enrichers = enrichers;
|
|
38
|
+
this.probes = probes;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Return static GPU info (bootstraps on first call, then caches).
|
|
42
|
+
*/
|
|
43
|
+
async getStaticGpus() {
|
|
44
|
+
if (!this.cachedGpus) {
|
|
45
|
+
const gpus = await this.bootstrap();
|
|
46
|
+
if (gpus.length > 0) {
|
|
47
|
+
this.cachedGpus = gpus;
|
|
48
|
+
}
|
|
49
|
+
return gpus;
|
|
50
|
+
}
|
|
51
|
+
return this.cachedGpus;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Return only dynamic usage metrics.
|
|
55
|
+
*/
|
|
56
|
+
async getUsage() {
|
|
57
|
+
const staticGpus = await this.getStaticGpus();
|
|
58
|
+
return this.runProbes(staticGpus);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Full pipeline: detectors → dedup → enrichers → engine names.
|
|
62
|
+
*/
|
|
63
|
+
async bootstrap() {
|
|
64
|
+
const gpus = await this.runDetectors();
|
|
65
|
+
const deduped = (0, gpuDedup_1.deduplicateGpus)(gpus);
|
|
66
|
+
await this.runEnrichers(deduped);
|
|
67
|
+
(0, gpuEngineNames_1.assignEngineNames)(deduped);
|
|
68
|
+
return deduped;
|
|
69
|
+
}
|
|
70
|
+
async runDetectors() {
|
|
71
|
+
const all = [];
|
|
72
|
+
for (const detector of this.detectors) {
|
|
73
|
+
if (!(await detector.isAvailable()))
|
|
74
|
+
continue;
|
|
75
|
+
const detected = await detector.detect();
|
|
76
|
+
all.push(...detected);
|
|
77
|
+
}
|
|
78
|
+
return all;
|
|
79
|
+
}
|
|
80
|
+
async runEnrichers(gpus) {
|
|
81
|
+
const tasks = [];
|
|
82
|
+
for (const enricher of this.enrichers) {
|
|
83
|
+
if (await enricher.isAvailable()) {
|
|
84
|
+
tasks.push(enricher.enrich(gpus));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
await Promise.all(tasks);
|
|
88
|
+
}
|
|
89
|
+
async runProbes(gpus) {
|
|
90
|
+
const all = [];
|
|
91
|
+
for (const probe of this.probes) {
|
|
92
|
+
if (!(await probe.isAvailable()))
|
|
93
|
+
continue;
|
|
94
|
+
const result = await probe.probe(gpus);
|
|
95
|
+
all.push(...result);
|
|
96
|
+
}
|
|
97
|
+
return all;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
exports.GpuService = GpuService;
|
|
101
|
+
exports.GpuService = GpuService = __decorate([
|
|
102
|
+
(0, inversify_1.injectable)(),
|
|
103
|
+
__param(0, (0, inversify_1.multiInject)(types_1.GPU_DETECTOR)),
|
|
104
|
+
__param(1, (0, inversify_1.multiInject)(types_1.GPU_ENRICHER)),
|
|
105
|
+
__param(2, (0, inversify_1.multiInject)(types_1.GPU_USAGE_PROBE)),
|
|
106
|
+
__metadata("design:paramtypes", [Array, Array, Array])
|
|
107
|
+
], GpuService);
|
|
108
|
+
//# sourceMappingURL=gpuService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpuService.js","sourceRoot":"","sources":["../../src/services/gpuService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deduplicateGpus = deduplicateGpus;
|
|
4
|
+
exports.staticScore = staticScore;
|
|
5
|
+
/**
|
|
6
|
+
* Remove duplicate GPUs that share the same identity.
|
|
7
|
+
* When multiple detectors report the same card (e.g. nvidia-smi + WMI),
|
|
8
|
+
* prefer the entry with more populated static fields.
|
|
9
|
+
*
|
|
10
|
+
* Identity key: vendor + pciBusId (if available), otherwise vendor + name.
|
|
11
|
+
* This prevents deduplication of multiple identical GPUs (e.g. 4x RX 7900 XTX).
|
|
12
|
+
*/
|
|
13
|
+
function deduplicateGpus(gpus) {
|
|
14
|
+
const seen = new Map();
|
|
15
|
+
for (const gpu of gpus) {
|
|
16
|
+
const key = gpu.pciBusId ? `${gpu.vendor}:${gpu.pciBusId}` : `${gpu.vendor}:${gpu.name}`;
|
|
17
|
+
const existing = seen.get(key);
|
|
18
|
+
if (!existing) {
|
|
19
|
+
seen.set(key, gpu);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const existingScore = staticScore(existing);
|
|
23
|
+
const newScore = staticScore(gpu);
|
|
24
|
+
if (newScore > existingScore) {
|
|
25
|
+
seen.set(key, gpu);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return [...seen.values()];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Score a static GpuInfo record — higher = more populated.
|
|
32
|
+
* Used during deduplication to decide which entry to keep.
|
|
33
|
+
*/
|
|
34
|
+
function staticScore(gpu) {
|
|
35
|
+
let s = 0;
|
|
36
|
+
if (gpu.pciBusId)
|
|
37
|
+
s += 2;
|
|
38
|
+
if (gpu.vramTotal > 0)
|
|
39
|
+
s += 1;
|
|
40
|
+
if (gpu.engineVulkanName)
|
|
41
|
+
s += 1;
|
|
42
|
+
if (gpu.brand && gpu.brand !== gpu.vendor)
|
|
43
|
+
s += 1; // enricher filled a real brand
|
|
44
|
+
return s;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=gpuDedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpuDedup.js","sourceRoot":"","sources":["../../../src/services/helpers/gpuDedup.ts"],"names":[],"mappings":";;AAUA,0CAoBC;AAMD,kCAOC;AAzCD;;;;;;;GAOG;AACH,SAAgB,eAAe,CAAC,IAAe;IAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IAExC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAEzF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,GAAG,aAAa,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,SAAgB,WAAW,CAAC,GAAY;IACtC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,GAAG,CAAC,QAAQ;QAAE,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC;QAAE,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,CAAC,gBAAgB;QAAE,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,MAAM;QAAE,CAAC,IAAI,CAAC,CAAC,CAAC,+BAA+B;IAClF,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assignEngineNames = assignEngineNames;
|
|
4
|
+
/**
|
|
5
|
+
* Assign llama.cpp engine device names based on vendor.
|
|
6
|
+
* NVIDIA GPUs get cuda0, cuda1, ...
|
|
7
|
+
* AMD GPUs get rocm0, rocm1, ...
|
|
8
|
+
* Vulkan names are assigned by the VulkanEnricher.
|
|
9
|
+
*/
|
|
10
|
+
function assignEngineNames(gpus) {
|
|
11
|
+
let cudaIndex = 0;
|
|
12
|
+
let rocmIndex = 0;
|
|
13
|
+
for (const gpu of gpus) {
|
|
14
|
+
if (gpu.vendor === "NVIDIA" && !gpu.engineCudaName) {
|
|
15
|
+
gpu.engineCudaName = `cuda${cudaIndex++}`;
|
|
16
|
+
}
|
|
17
|
+
if (gpu.vendor === "AMD" && !gpu.engineRocmName) {
|
|
18
|
+
gpu.engineRocmName = `rocm${rocmIndex++}`;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=gpuEngineNames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpuEngineNames.js","sourceRoot":"","sources":["../../../src/services/helpers/gpuEngineNames.ts"],"names":[],"mappings":";;AAQA,8CAYC;AAlBD;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,IAAe;IAC/C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YACnD,GAAG,CAAC,cAAc,GAAG,OAAO,SAAS,EAAE,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YAChD,GAAG,CAAC,cAAc,GAAG,OAAO,SAAS,EAAE,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LlamaAutocompleteService = void 0;
|
|
4
|
+
const promises_1 = require("fs/promises");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const ExecTools_1 = require("../helpers/ExecTools");
|
|
7
|
+
const WIN_HOME = process.env.USERPROFILE ?? "";
|
|
8
|
+
const LINUX_HOME = process.env.HOME ?? "";
|
|
9
|
+
/**
|
|
10
|
+
* Real filesystem path completion — shell-style.
|
|
11
|
+
* 1) If query itself is an existing directory → list its contents.
|
|
12
|
+
* 2) Split into parent dir + prefix → list matching entries in parent.
|
|
13
|
+
* 3) No separator → search known root directories.
|
|
14
|
+
*/
|
|
15
|
+
async function searchPaths(query) {
|
|
16
|
+
const trimmed = query.trim();
|
|
17
|
+
if (!trimmed)
|
|
18
|
+
return [];
|
|
19
|
+
const normalized = trimmed.replace(/\//g, path_1.sep);
|
|
20
|
+
// 1) If the query itself is an existing directory → list contents
|
|
21
|
+
try {
|
|
22
|
+
const s = await (0, promises_1.stat)(normalized);
|
|
23
|
+
if (s.isDirectory()) {
|
|
24
|
+
return listDirMatches(normalized + path_1.sep, "");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// not a directory, continue
|
|
29
|
+
}
|
|
30
|
+
// 2) Split into parent dir + prefix
|
|
31
|
+
const lastSepIdx = normalized.lastIndexOf(path_1.sep);
|
|
32
|
+
if (lastSepIdx >= 0) {
|
|
33
|
+
const parentDir = normalized.slice(0, lastSepIdx + 1);
|
|
34
|
+
const prefix = normalized.slice(lastSepIdx + 1);
|
|
35
|
+
// If prefix is non-empty and query-as-dir doesn't exist (checked above),
|
|
36
|
+
// also try treating the query as a directory name in the parent
|
|
37
|
+
const results = await listDirMatches(parentDir, prefix);
|
|
38
|
+
// If no matches and prefix is non-empty, try listing the parent and showing dirs matching prefix
|
|
39
|
+
if (results.length === 0 && prefix) {
|
|
40
|
+
// parent might not exist or be unreadable — try one level up
|
|
41
|
+
const grandParentSepIdx = parentDir.lastIndexOf(path_1.sep);
|
|
42
|
+
if (grandParentSepIdx >= 0) {
|
|
43
|
+
const grandParentDir = parentDir.slice(0, grandParentSepIdx + 1);
|
|
44
|
+
const parentPrefix = parentDir.slice(grandParentSepIdx + 1);
|
|
45
|
+
return listDirMatches(grandParentDir, parentPrefix);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return results;
|
|
49
|
+
}
|
|
50
|
+
if (process.platform === "win32" && normalized.match(/^[A-Za-z]:/)) {
|
|
51
|
+
// "C:foo" → parent "C:\", prefix "foo"
|
|
52
|
+
return listDirMatches(normalized[0] + ":" + path_1.sep, normalized.slice(2));
|
|
53
|
+
}
|
|
54
|
+
// 3) No separator — search known root directories
|
|
55
|
+
const roots = getSearchRoots();
|
|
56
|
+
const results = [];
|
|
57
|
+
for (const root of roots) {
|
|
58
|
+
results.push(...(await listDirMatches(root, normalized)));
|
|
59
|
+
}
|
|
60
|
+
return results.slice(0, 50);
|
|
61
|
+
}
|
|
62
|
+
async function listDirMatches(parentDir, prefix) {
|
|
63
|
+
try {
|
|
64
|
+
const entries = await (0, promises_1.readdir)(parentDir);
|
|
65
|
+
const results = [];
|
|
66
|
+
for (const entry of entries) {
|
|
67
|
+
if (entry.toLowerCase().startsWith(prefix.toLowerCase())) {
|
|
68
|
+
const fullPath = (0, path_1.join)(parentDir, entry);
|
|
69
|
+
try {
|
|
70
|
+
const s = await (0, promises_1.stat)(fullPath);
|
|
71
|
+
results.push({ path: fullPath, source: parentDir, isDir: s.isDirectory() });
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
results.push({ path: fullPath, source: parentDir });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function getSearchRoots() {
|
|
85
|
+
if (process.platform === "win32") {
|
|
86
|
+
return [WIN_HOME, "C:\\", "D:\\", (0, path_1.join)("C:", "Program Files"), (0, path_1.join)("C:", "Program Files (x86)")].filter(Boolean);
|
|
87
|
+
}
|
|
88
|
+
return ["/", LINUX_HOME, "/opt", "/usr", "/home"];
|
|
89
|
+
}
|
|
90
|
+
/** Extract unique directories from existing config paths (used to seed root dirs). */
|
|
91
|
+
function extractDirsFromConfigs(configs) {
|
|
92
|
+
const dirs = new Set();
|
|
93
|
+
for (const cfg of configs) {
|
|
94
|
+
if (cfg.command) {
|
|
95
|
+
const cmdDir = (0, path_1.dirname)(cfg.command);
|
|
96
|
+
if (cmdDir)
|
|
97
|
+
dirs.add(cmdDir);
|
|
98
|
+
}
|
|
99
|
+
if (cfg.flags) {
|
|
100
|
+
for (let i = 0; i < cfg.flags.length; i++) {
|
|
101
|
+
if (["--model", "--mmproj", "--api-key-file", "--model-draft"].includes(cfg.flags[i]) &&
|
|
102
|
+
i + 1 < cfg.flags.length) {
|
|
103
|
+
const flagDir = (0, path_1.dirname)(cfg.flags[i + 1]);
|
|
104
|
+
if (flagDir)
|
|
105
|
+
dirs.add(flagDir);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return [...dirs];
|
|
111
|
+
}
|
|
112
|
+
/** Get list of network interface IPs. */
|
|
113
|
+
function getNetworkHosts() {
|
|
114
|
+
const os = require("os");
|
|
115
|
+
const ips = new Set();
|
|
116
|
+
const ifaces = os.networkInterfaces();
|
|
117
|
+
for (const _addrs of Object.values(ifaces)) {
|
|
118
|
+
if (!_addrs)
|
|
119
|
+
continue;
|
|
120
|
+
for (const addr of _addrs) {
|
|
121
|
+
if (addr.family === "IPv4" && !addr.internal)
|
|
122
|
+
ips.add(addr.address);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return [...new Set([...ips, "0.0.0.0", "127.0.0.1"])];
|
|
126
|
+
}
|
|
127
|
+
/** Resolve device names from GPU static info. */
|
|
128
|
+
function getDeviceNamesFromGpu(gpuService) {
|
|
129
|
+
if (!gpuService)
|
|
130
|
+
return [];
|
|
131
|
+
const cachedGpus = gpuService.cachedGpus;
|
|
132
|
+
if (!cachedGpus)
|
|
133
|
+
return [];
|
|
134
|
+
const devices = [];
|
|
135
|
+
for (const gpu of cachedGpus) {
|
|
136
|
+
if (gpu.engineCudaName)
|
|
137
|
+
devices.push(gpu.engineCudaName);
|
|
138
|
+
if (gpu.engineRocmName)
|
|
139
|
+
devices.push(gpu.engineRocmName);
|
|
140
|
+
if (gpu.engineVulkanName)
|
|
141
|
+
devices.push(gpu.engineVulkanName);
|
|
142
|
+
}
|
|
143
|
+
return devices;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Run `<binary> --list-devices` and parse device names from output.
|
|
147
|
+
* Format: " Vulkan0: AMD Radeon RX 7900 XTX (24560 MiB, ...)"
|
|
148
|
+
*/
|
|
149
|
+
async function listDevicesFromBinary(binary) {
|
|
150
|
+
if (!binary)
|
|
151
|
+
return [];
|
|
152
|
+
const result = await ExecTools_1.ExecTools.safeExec(`"${binary}" --list-devices 2>&1`, { timeout: 5000 });
|
|
153
|
+
if (result.stderr && !result.stdout)
|
|
154
|
+
return [];
|
|
155
|
+
const devices = [];
|
|
156
|
+
const lines = result.stdout.split("\n");
|
|
157
|
+
for (const line of lines) {
|
|
158
|
+
const match = line.match(/^\s+(\w+):/);
|
|
159
|
+
if (match) {
|
|
160
|
+
devices.push(match[1]);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return devices;
|
|
164
|
+
}
|
|
165
|
+
class LlamaAutocompleteService {
|
|
166
|
+
gpuService = null;
|
|
167
|
+
setGpuService(gpuService) {
|
|
168
|
+
this.gpuService = gpuService;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get autocomplete suggestions for a given type and query.
|
|
172
|
+
*/
|
|
173
|
+
async getSuggestions(type, query, allConfigs, binary) {
|
|
174
|
+
const trimmed = query.trim();
|
|
175
|
+
const lowerQuery = trimmed.toLowerCase();
|
|
176
|
+
switch (type) {
|
|
177
|
+
case "path":
|
|
178
|
+
return searchPaths(query);
|
|
179
|
+
case "binary":
|
|
180
|
+
case "model":
|
|
181
|
+
case "mmproj":
|
|
182
|
+
case "apikey":
|
|
183
|
+
// All file-path fields use shell-style completion.
|
|
184
|
+
// Also append config-based suggestions when the query is short (no path separator yet).
|
|
185
|
+
const pathResults = await searchPaths(query);
|
|
186
|
+
// When the user hasn't typed a path yet, also show values from existing configs
|
|
187
|
+
if (!trimmed.includes(path_1.sep) && !trimmed.includes("/")) {
|
|
188
|
+
const configPaths = this.extractConfigPaths(allConfigs, type);
|
|
189
|
+
const seen = new Set(pathResults.map((r) => r.path));
|
|
190
|
+
for (const cp of configPaths) {
|
|
191
|
+
if (!seen.has(cp) && (!trimmed || cp.toLowerCase().includes(lowerQuery))) {
|
|
192
|
+
pathResults.push({ path: cp, source: "existing config" });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return pathResults.slice(0, 50);
|
|
197
|
+
case "host":
|
|
198
|
+
return getNetworkHosts()
|
|
199
|
+
.filter((h) => !trimmed || h.includes(lowerQuery))
|
|
200
|
+
.map((ip) => ({
|
|
201
|
+
path: ip,
|
|
202
|
+
source: ip === "0.0.0.0" ? "all interfaces" : ip === "127.0.0.1" ? "localhost" : "network interface",
|
|
203
|
+
}));
|
|
204
|
+
case "device": {
|
|
205
|
+
let devices = [];
|
|
206
|
+
let source = "GPU device";
|
|
207
|
+
if (binary) {
|
|
208
|
+
source = "llama-server";
|
|
209
|
+
devices = await listDevicesFromBinary(binary);
|
|
210
|
+
}
|
|
211
|
+
// Fallback: если list-devices пустой (некоторые сборки не возвращают AMD) — берём из GpuService
|
|
212
|
+
if (devices.length === 0) {
|
|
213
|
+
const gpuDevices = getDeviceNamesFromGpu(this.gpuService).filter((x) => x.toLowerCase().startsWith("rocm"));
|
|
214
|
+
if (gpuDevices.length > 0) {
|
|
215
|
+
devices = gpuDevices;
|
|
216
|
+
source = "GPU device";
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return devices
|
|
220
|
+
.filter((d) => !trimmed || d.toLowerCase().includes(lowerQuery))
|
|
221
|
+
.map((d) => ({ path: d, source }));
|
|
222
|
+
}
|
|
223
|
+
default:
|
|
224
|
+
return [];
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** Extract existing paths from configs for a given field type. */
|
|
228
|
+
extractConfigPaths(configs, type) {
|
|
229
|
+
const paths = new Set();
|
|
230
|
+
for (const cfg of configs) {
|
|
231
|
+
switch (type) {
|
|
232
|
+
case "binary":
|
|
233
|
+
if (cfg.command)
|
|
234
|
+
paths.add(cfg.command);
|
|
235
|
+
break;
|
|
236
|
+
case "model":
|
|
237
|
+
if (cfg.flags) {
|
|
238
|
+
const val = findFlag(cfg.flags, "--model");
|
|
239
|
+
if (val)
|
|
240
|
+
paths.add(val);
|
|
241
|
+
const draft = findFlag(cfg.flags, "--model-draft");
|
|
242
|
+
if (draft)
|
|
243
|
+
paths.add(draft);
|
|
244
|
+
}
|
|
245
|
+
break;
|
|
246
|
+
case "mmproj":
|
|
247
|
+
if (cfg.flags) {
|
|
248
|
+
const val = findFlag(cfg.flags, "--mmproj");
|
|
249
|
+
if (val)
|
|
250
|
+
paths.add(val);
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
case "apikey":
|
|
254
|
+
if (cfg.flags) {
|
|
255
|
+
const val = findFlag(cfg.flags, "--api-key-file");
|
|
256
|
+
if (val)
|
|
257
|
+
paths.add(val);
|
|
258
|
+
}
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return [...paths];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
exports.LlamaAutocompleteService = LlamaAutocompleteService;
|
|
266
|
+
/** Extract value for a flag from the flags array. Handles "--flag value" and "--flag=value". */
|
|
267
|
+
function findFlag(flags, name) {
|
|
268
|
+
for (let i = 0; i < flags.length; i++) {
|
|
269
|
+
if (flags[i] === name && i + 1 < flags.length)
|
|
270
|
+
return flags[i + 1];
|
|
271
|
+
const eqIdx = flags[i].indexOf("=");
|
|
272
|
+
if (eqIdx > 0 && flags[i].slice(0, eqIdx) === name)
|
|
273
|
+
return flags[i].slice(eqIdx + 1);
|
|
274
|
+
}
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=llamaAutocompleteService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llamaAutocompleteService.js","sourceRoot":"","sources":["../../src/services/llamaAutocompleteService.ts"],"names":[],"mappings":"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"}
|