@appkit/llamacpp-cli 1.0.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/.versionrc.json +16 -0
- package/CHANGELOG.md +10 -0
- package/README.md +474 -0
- package/bin/llamacpp +26 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +196 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +104 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +37 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +57 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/ps.d.ts +2 -0
- package/dist/commands/ps.d.ts.map +1 -0
- package/dist/commands/ps.js +72 -0
- package/dist/commands/ps.js.map +1 -0
- package/dist/commands/pull.d.ts +6 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +36 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/rm.d.ts +2 -0
- package/dist/commands/rm.d.ts.map +1 -0
- package/dist/commands/rm.js +134 -0
- package/dist/commands/rm.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +198 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/search.d.ts +7 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +93 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/show.d.ts +6 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +196 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/start.d.ts +9 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +150 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +39 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/lib/config-generator.d.ts +30 -0
- package/dist/lib/config-generator.d.ts.map +1 -0
- package/dist/lib/config-generator.js +125 -0
- package/dist/lib/config-generator.js.map +1 -0
- package/dist/lib/launchctl-manager.d.ts +55 -0
- package/dist/lib/launchctl-manager.d.ts.map +1 -0
- package/dist/lib/launchctl-manager.js +227 -0
- package/dist/lib/launchctl-manager.js.map +1 -0
- package/dist/lib/model-downloader.d.ts +44 -0
- package/dist/lib/model-downloader.d.ts.map +1 -0
- package/dist/lib/model-downloader.js +248 -0
- package/dist/lib/model-downloader.js.map +1 -0
- package/dist/lib/model-scanner.d.ts +31 -0
- package/dist/lib/model-scanner.d.ts.map +1 -0
- package/dist/lib/model-scanner.js +145 -0
- package/dist/lib/model-scanner.js.map +1 -0
- package/dist/lib/model-search.d.ts +29 -0
- package/dist/lib/model-search.d.ts.map +1 -0
- package/dist/lib/model-search.js +131 -0
- package/dist/lib/model-search.js.map +1 -0
- package/dist/lib/port-manager.d.ts +26 -0
- package/dist/lib/port-manager.d.ts.map +1 -0
- package/dist/lib/port-manager.js +75 -0
- package/dist/lib/port-manager.js.map +1 -0
- package/dist/lib/state-manager.d.ts +59 -0
- package/dist/lib/state-manager.d.ts.map +1 -0
- package/dist/lib/state-manager.js +178 -0
- package/dist/lib/state-manager.js.map +1 -0
- package/dist/lib/status-checker.d.ts +28 -0
- package/dist/lib/status-checker.d.ts.map +1 -0
- package/dist/lib/status-checker.js +99 -0
- package/dist/lib/status-checker.js.map +1 -0
- package/dist/types/global-config.d.ts +16 -0
- package/dist/types/global-config.d.ts.map +1 -0
- package/dist/types/global-config.js +18 -0
- package/dist/types/global-config.js.map +1 -0
- package/dist/types/model-info.d.ts +9 -0
- package/dist/types/model-info.d.ts.map +1 -0
- package/dist/types/model-info.js +3 -0
- package/dist/types/model-info.js.map +1 -0
- package/dist/types/server-config.d.ts +27 -0
- package/dist/types/server-config.d.ts.map +1 -0
- package/dist/types/server-config.js +15 -0
- package/dist/types/server-config.js.map +1 -0
- package/dist/utils/file-utils.d.ts +49 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +144 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/format-utils.d.ts +29 -0
- package/dist/utils/format-utils.d.ts.map +1 -0
- package/dist/utils/format-utils.js +82 -0
- package/dist/utils/format-utils.js.map +1 -0
- package/dist/utils/process-utils.d.ts +27 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +66 -0
- package/dist/utils/process-utils.js.map +1 -0
- package/package.json +56 -0
- package/src/cli.ts +195 -0
- package/src/commands/delete.ts +74 -0
- package/src/commands/list.ts +37 -0
- package/src/commands/logs.ts +61 -0
- package/src/commands/ps.ts +79 -0
- package/src/commands/pull.ts +40 -0
- package/src/commands/rm.ts +114 -0
- package/src/commands/run.ts +209 -0
- package/src/commands/search.ts +107 -0
- package/src/commands/show.ts +207 -0
- package/src/commands/start.ts +140 -0
- package/src/commands/stop.ts +39 -0
- package/src/lib/config-generator.ts +119 -0
- package/src/lib/launchctl-manager.ts +209 -0
- package/src/lib/model-downloader.ts +259 -0
- package/src/lib/model-scanner.ts +125 -0
- package/src/lib/model-search.ts +114 -0
- package/src/lib/port-manager.ts +80 -0
- package/src/lib/state-manager.ts +177 -0
- package/src/lib/status-checker.ts +113 -0
- package/src/types/global-config.ts +26 -0
- package/src/types/model-info.ts +8 -0
- package/src/types/server-config.ts +42 -0
- package/src/utils/file-utils.ts +106 -0
- package/src/utils/format-utils.ts +80 -0
- package/src/utils/process-utils.ts +60 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.modelScanner = exports.ModelScanner = void 0;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
40
|
+
const format_utils_1 = require("../utils/format-utils");
|
|
41
|
+
class ModelScanner {
|
|
42
|
+
constructor(modelsDir) {
|
|
43
|
+
this.modelsDir = modelsDir || (0, file_utils_1.getModelsDir)();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Scan models directory for GGUF files
|
|
47
|
+
*/
|
|
48
|
+
async scanModels() {
|
|
49
|
+
try {
|
|
50
|
+
const files = await fs.readdir(this.modelsDir);
|
|
51
|
+
const ggufFiles = files.filter((f) => f.toLowerCase().endsWith('.gguf'));
|
|
52
|
+
const models = [];
|
|
53
|
+
for (const file of ggufFiles) {
|
|
54
|
+
const modelInfo = await this.getModelInfo(file);
|
|
55
|
+
if (modelInfo) {
|
|
56
|
+
models.push(modelInfo);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Sort by modified date (newest first)
|
|
60
|
+
models.sort((a, b) => b.modified.getTime() - a.modified.getTime());
|
|
61
|
+
return models;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
// Models directory doesn't exist or is not accessible
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get information about a specific model file
|
|
70
|
+
*/
|
|
71
|
+
async getModelInfo(filename) {
|
|
72
|
+
const modelPath = path.join(this.modelsDir, filename);
|
|
73
|
+
try {
|
|
74
|
+
const stats = await fs.stat(modelPath);
|
|
75
|
+
return {
|
|
76
|
+
filename,
|
|
77
|
+
path: modelPath,
|
|
78
|
+
size: stats.size,
|
|
79
|
+
sizeFormatted: (0, format_utils_1.formatBytes)(stats.size),
|
|
80
|
+
modified: stats.mtime,
|
|
81
|
+
exists: true,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
// File doesn't exist or is not accessible
|
|
86
|
+
return {
|
|
87
|
+
filename,
|
|
88
|
+
path: modelPath,
|
|
89
|
+
size: 0,
|
|
90
|
+
sizeFormatted: '0 B',
|
|
91
|
+
modified: new Date(),
|
|
92
|
+
exists: false,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Validate that a model file exists and is readable
|
|
98
|
+
*/
|
|
99
|
+
async validateModel(filename) {
|
|
100
|
+
const modelInfo = await this.getModelInfo(filename);
|
|
101
|
+
return modelInfo !== null && modelInfo.exists && modelInfo.size > 0;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Resolve a model filename to full path
|
|
105
|
+
*/
|
|
106
|
+
async resolveModelPath(filename) {
|
|
107
|
+
// If already absolute path, return it
|
|
108
|
+
if (path.isAbsolute(filename)) {
|
|
109
|
+
return filename;
|
|
110
|
+
}
|
|
111
|
+
// Try in models directory
|
|
112
|
+
const modelPath = path.join(this.modelsDir, filename);
|
|
113
|
+
const modelInfo = await this.getModelInfo(filename);
|
|
114
|
+
if (modelInfo && modelInfo.exists) {
|
|
115
|
+
return modelPath;
|
|
116
|
+
}
|
|
117
|
+
// Try adding .gguf extension
|
|
118
|
+
if (!filename.toLowerCase().endsWith('.gguf')) {
|
|
119
|
+
const withExtension = `${filename}.gguf`;
|
|
120
|
+
const modelInfoWithExt = await this.getModelInfo(withExtension);
|
|
121
|
+
if (modelInfoWithExt && modelInfoWithExt.exists) {
|
|
122
|
+
return path.join(this.modelsDir, withExtension);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the size of a model file
|
|
129
|
+
*/
|
|
130
|
+
async getModelSize(filename) {
|
|
131
|
+
const modelInfo = await this.getModelInfo(filename);
|
|
132
|
+
return modelInfo?.size || null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get total size of all models
|
|
136
|
+
*/
|
|
137
|
+
async getTotalSize() {
|
|
138
|
+
const models = await this.scanModels();
|
|
139
|
+
return models.reduce((total, model) => total + model.size, 0);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.ModelScanner = ModelScanner;
|
|
143
|
+
// Export singleton instance
|
|
144
|
+
exports.modelScanner = new ModelScanner();
|
|
145
|
+
//# sourceMappingURL=model-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-scanner.js","sourceRoot":"","sources":["../../src/lib/model-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface HFModelResult {
|
|
2
|
+
modelId: string;
|
|
3
|
+
author: string;
|
|
4
|
+
modelName: string;
|
|
5
|
+
downloads: number;
|
|
6
|
+
likes: number;
|
|
7
|
+
tags: string[];
|
|
8
|
+
lastModified: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ModelSearch {
|
|
11
|
+
/**
|
|
12
|
+
* Search Hugging Face for GGUF models
|
|
13
|
+
*/
|
|
14
|
+
searchModels(query: string, limit?: number): Promise<HFModelResult[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Build Hugging Face search URL
|
|
17
|
+
*/
|
|
18
|
+
private buildSearchUrl;
|
|
19
|
+
/**
|
|
20
|
+
* Parse API results into our model format
|
|
21
|
+
*/
|
|
22
|
+
private parseResults;
|
|
23
|
+
/**
|
|
24
|
+
* Get GGUF files for a specific model
|
|
25
|
+
*/
|
|
26
|
+
getModelFiles(modelId: string): Promise<string[]>;
|
|
27
|
+
}
|
|
28
|
+
export declare const modelSearch: ModelSearch;
|
|
29
|
+
//# sourceMappingURL=model-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-search.d.ts","sourceRoot":"","sources":["../../src/lib/model-search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,WAAW;IACtB;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA0BvE;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CA4BxD;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.modelSearch = exports.ModelSearch = void 0;
|
|
37
|
+
const https = __importStar(require("https"));
|
|
38
|
+
class ModelSearch {
|
|
39
|
+
/**
|
|
40
|
+
* Search Hugging Face for GGUF models
|
|
41
|
+
*/
|
|
42
|
+
async searchModels(query, limit = 20) {
|
|
43
|
+
const searchUrl = this.buildSearchUrl(query, limit);
|
|
44
|
+
return new Promise((resolve, reject) => {
|
|
45
|
+
https.get(searchUrl, (response) => {
|
|
46
|
+
let data = '';
|
|
47
|
+
response.on('data', (chunk) => {
|
|
48
|
+
data += chunk;
|
|
49
|
+
});
|
|
50
|
+
response.on('end', () => {
|
|
51
|
+
try {
|
|
52
|
+
const results = JSON.parse(data);
|
|
53
|
+
const models = this.parseResults(results);
|
|
54
|
+
resolve(models);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
reject(new Error(`Failed to parse search results: ${error.message}`));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}).on('error', (error) => {
|
|
61
|
+
reject(new Error(`Search request failed: ${error.message}`));
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build Hugging Face search URL
|
|
67
|
+
*/
|
|
68
|
+
buildSearchUrl(query, limit) {
|
|
69
|
+
const params = new URLSearchParams({
|
|
70
|
+
search: query,
|
|
71
|
+
filter: 'gguf',
|
|
72
|
+
sort: 'downloads',
|
|
73
|
+
direction: '-1',
|
|
74
|
+
limit: limit.toString(),
|
|
75
|
+
});
|
|
76
|
+
return `https://huggingface.co/api/models?${params.toString()}`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse API results into our model format
|
|
80
|
+
*/
|
|
81
|
+
parseResults(results) {
|
|
82
|
+
return results.map((result) => {
|
|
83
|
+
const modelId = result.id || result.modelId || '';
|
|
84
|
+
const parts = modelId.split('/');
|
|
85
|
+
const author = parts[0] || '';
|
|
86
|
+
const modelName = parts.slice(1).join('/') || '';
|
|
87
|
+
return {
|
|
88
|
+
modelId,
|
|
89
|
+
author,
|
|
90
|
+
modelName,
|
|
91
|
+
downloads: result.downloads || 0,
|
|
92
|
+
likes: result.likes || 0,
|
|
93
|
+
tags: result.tags || [],
|
|
94
|
+
lastModified: result.lastModified || '',
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get GGUF files for a specific model
|
|
100
|
+
*/
|
|
101
|
+
async getModelFiles(modelId) {
|
|
102
|
+
const apiUrl = `https://huggingface.co/api/models/${modelId}`;
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
https.get(apiUrl, (response) => {
|
|
105
|
+
let data = '';
|
|
106
|
+
response.on('data', (chunk) => {
|
|
107
|
+
data += chunk;
|
|
108
|
+
});
|
|
109
|
+
response.on('end', () => {
|
|
110
|
+
try {
|
|
111
|
+
const modelInfo = JSON.parse(data);
|
|
112
|
+
const files = modelInfo.siblings || [];
|
|
113
|
+
const ggufFiles = files
|
|
114
|
+
.filter((file) => file.rfilename?.toLowerCase().endsWith('.gguf'))
|
|
115
|
+
.map((file) => file.rfilename);
|
|
116
|
+
resolve(ggufFiles);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
reject(new Error(`Failed to fetch model files: ${error.message}`));
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}).on('error', (error) => {
|
|
123
|
+
reject(new Error(`API request failed: ${error.message}`));
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.ModelSearch = ModelSearch;
|
|
129
|
+
// Export singleton instance
|
|
130
|
+
exports.modelSearch = new ModelSearch();
|
|
131
|
+
//# sourceMappingURL=model-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-search.js","sourceRoot":"","sources":["../../src/lib/model-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare class PortManager {
|
|
2
|
+
private readonly portRangeStart;
|
|
3
|
+
private readonly portRangeEnd;
|
|
4
|
+
/**
|
|
5
|
+
* Find an available port in the range
|
|
6
|
+
*/
|
|
7
|
+
findAvailablePort(startPort?: number): Promise<number>;
|
|
8
|
+
/**
|
|
9
|
+
* Check if a port is available
|
|
10
|
+
*/
|
|
11
|
+
isPortAvailable(port: number): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Validate a port number
|
|
14
|
+
*/
|
|
15
|
+
validatePort(port: number): void;
|
|
16
|
+
/**
|
|
17
|
+
* Find a server using a given port
|
|
18
|
+
*/
|
|
19
|
+
findServerByPort(port: number): Promise<import("../types/server-config").ServerConfig | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Check for port conflicts
|
|
22
|
+
*/
|
|
23
|
+
checkPortConflict(port: number, exceptId?: string): Promise<boolean>;
|
|
24
|
+
}
|
|
25
|
+
export declare const portManager: PortManager;
|
|
26
|
+
//# sourceMappingURL=port-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-manager.d.ts","sourceRoot":"","sources":["../../src/lib/port-manager.ts"],"names":[],"mappings":"AAGA,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAErC;;OAEG;IACG,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB5D;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBrD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAShC;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM;IAInC;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAK3E;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.portManager = exports.PortManager = void 0;
|
|
4
|
+
const process_utils_1 = require("../utils/process-utils");
|
|
5
|
+
const state_manager_1 = require("./state-manager");
|
|
6
|
+
class PortManager {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.portRangeStart = 9000;
|
|
9
|
+
this.portRangeEnd = 9999;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Find an available port in the range
|
|
13
|
+
*/
|
|
14
|
+
async findAvailablePort(startPort) {
|
|
15
|
+
const start = startPort || this.portRangeStart;
|
|
16
|
+
// Get ports used by existing servers
|
|
17
|
+
const usedPorts = await state_manager_1.stateManager.getUsedPorts();
|
|
18
|
+
// Find first available port
|
|
19
|
+
for (let port = start; port <= this.portRangeEnd; port++) {
|
|
20
|
+
if (!usedPorts.has(port)) {
|
|
21
|
+
// Check if port is actually available (not used by other processes)
|
|
22
|
+
const inUse = await (0, process_utils_1.isPortInUse)(port);
|
|
23
|
+
if (!inUse) {
|
|
24
|
+
return port;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
throw new Error(`No available ports in range ${start}-${this.portRangeEnd}`);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a port is available
|
|
32
|
+
*/
|
|
33
|
+
async isPortAvailable(port) {
|
|
34
|
+
// Check if port is in valid range
|
|
35
|
+
if (port < 1024 || port > 65535) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
// Check if port is used by any server
|
|
39
|
+
const usedPorts = await state_manager_1.stateManager.getUsedPorts();
|
|
40
|
+
if (usedPorts.has(port)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
// Check if port is actually in use
|
|
44
|
+
return !(await (0, process_utils_1.isPortInUse)(port));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Validate a port number
|
|
48
|
+
*/
|
|
49
|
+
validatePort(port) {
|
|
50
|
+
if (port < 1024) {
|
|
51
|
+
throw new Error('Port must be >= 1024 (ports below 1024 require root)');
|
|
52
|
+
}
|
|
53
|
+
if (port > 65535) {
|
|
54
|
+
throw new Error('Port must be <= 65535');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Find a server using a given port
|
|
59
|
+
*/
|
|
60
|
+
async findServerByPort(port) {
|
|
61
|
+
return await state_manager_1.stateManager.findServerByPort(port);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check for port conflicts
|
|
65
|
+
*/
|
|
66
|
+
async checkPortConflict(port, exceptId) {
|
|
67
|
+
const servers = await state_manager_1.stateManager.getAllServers();
|
|
68
|
+
const conflict = servers.find((s) => s.port === port && s.id !== exceptId);
|
|
69
|
+
return conflict !== undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.PortManager = PortManager;
|
|
73
|
+
// Export singleton instance
|
|
74
|
+
exports.portManager = new PortManager();
|
|
75
|
+
//# sourceMappingURL=port-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-manager.js","sourceRoot":"","sources":["../../src/lib/port-manager.ts"],"names":[],"mappings":";;;AAAA,0DAAqD;AACrD,mDAA+C;AAE/C,MAAa,WAAW;IAAxB;QACmB,mBAAc,GAAG,IAAI,CAAC;QACtB,iBAAY,GAAG,IAAI,CAAC;IAuEvC,CAAC;IArEC;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAkB;QACxC,MAAM,KAAK,GAAG,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC;QAE/C,qCAAqC;QACrC,MAAM,SAAS,GAAG,MAAM,4BAAY,CAAC,YAAY,EAAE,CAAC;QAEpD,4BAA4B;QAC5B,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;YACzD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,oEAAoE;gBACpE,MAAM,KAAK,GAAG,MAAM,IAAA,2BAAW,EAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,kCAAkC;QAClC,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,sCAAsC;QACtC,MAAM,SAAS,GAAG,MAAM,4BAAY,CAAC,YAAY,EAAE,CAAC;QACpD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mCAAmC;QACnC,OAAO,CAAC,CAAC,MAAM,IAAA,2BAAW,EAAC,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAY;QACvB,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,OAAO,MAAM,4BAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,IAAY,EAAE,QAAiB;QACrD,MAAM,OAAO,GAAG,MAAM,4BAAY,CAAC,aAAa,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC3E,OAAO,QAAQ,KAAK,SAAS,CAAC;IAChC,CAAC;CACF;AAzED,kCAyEC;AAED,4BAA4B;AACf,QAAA,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { ServerConfig } from '../types/server-config';
|
|
2
|
+
import { GlobalConfig } from '../types/global-config';
|
|
3
|
+
export declare class StateManager {
|
|
4
|
+
private configDir;
|
|
5
|
+
private serversDir;
|
|
6
|
+
private logsDir;
|
|
7
|
+
private globalConfigPath;
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Initialize config directories
|
|
11
|
+
*/
|
|
12
|
+
initialize(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Load global configuration
|
|
15
|
+
*/
|
|
16
|
+
loadGlobalConfig(): Promise<GlobalConfig>;
|
|
17
|
+
/**
|
|
18
|
+
* Save global configuration
|
|
19
|
+
*/
|
|
20
|
+
saveGlobalConfig(config: GlobalConfig): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Load a server configuration by ID
|
|
23
|
+
*/
|
|
24
|
+
loadServerConfig(id: string): Promise<ServerConfig | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Save a server configuration
|
|
27
|
+
*/
|
|
28
|
+
saveServerConfig(config: ServerConfig): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Delete a server configuration
|
|
31
|
+
*/
|
|
32
|
+
deleteServerConfig(id: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Get all server configurations
|
|
35
|
+
*/
|
|
36
|
+
getAllServers(): Promise<ServerConfig[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Find a server by port
|
|
39
|
+
*/
|
|
40
|
+
findServerByPort(port: number): Promise<ServerConfig | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Find a server by model name (fuzzy match)
|
|
43
|
+
*/
|
|
44
|
+
findServerByModelName(name: string): Promise<ServerConfig | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Find a server by identifier (ID, model name, or port)
|
|
47
|
+
*/
|
|
48
|
+
findServer(identifier: string): Promise<ServerConfig | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if a server exists for a given model
|
|
51
|
+
*/
|
|
52
|
+
serverExistsForModel(modelPath: string): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* Get all used ports
|
|
55
|
+
*/
|
|
56
|
+
getUsedPorts(): Promise<Set<number>>;
|
|
57
|
+
}
|
|
58
|
+
export declare const stateManager: StateManager;
|
|
59
|
+
//# sourceMappingURL=state-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/lib/state-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAyB,MAAM,wBAAwB,CAAC;AAc7E,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAS;;IASjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC;IAK/C;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;OAEG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQhE;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D;;OAEG;IACG,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmB9C;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKlE;;OAEG;IACG,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiBvE;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAYlE;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;CAI3C;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.stateManager = exports.StateManager = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs/promises"));
|
|
39
|
+
const global_config_1 = require("../types/global-config");
|
|
40
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
41
|
+
class StateManager {
|
|
42
|
+
constructor() {
|
|
43
|
+
this.configDir = (0, file_utils_1.getConfigDir)();
|
|
44
|
+
this.serversDir = (0, file_utils_1.getServersDir)();
|
|
45
|
+
this.logsDir = (0, file_utils_1.getLogsDir)();
|
|
46
|
+
this.globalConfigPath = (0, file_utils_1.getGlobalConfigPath)();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Initialize config directories
|
|
50
|
+
*/
|
|
51
|
+
async initialize() {
|
|
52
|
+
await (0, file_utils_1.ensureDir)(this.configDir);
|
|
53
|
+
await (0, file_utils_1.ensureDir)(this.serversDir);
|
|
54
|
+
await (0, file_utils_1.ensureDir)(this.logsDir);
|
|
55
|
+
await (0, file_utils_1.ensureDir)((0, file_utils_1.getLaunchAgentsDir)());
|
|
56
|
+
// Create default global config if it doesn't exist
|
|
57
|
+
if (!(await (0, file_utils_1.fileExists)(this.globalConfigPath))) {
|
|
58
|
+
const defaultConfig = {
|
|
59
|
+
...global_config_1.DEFAULT_GLOBAL_CONFIG,
|
|
60
|
+
modelsDirectory: (0, file_utils_1.getModelsDir)(),
|
|
61
|
+
};
|
|
62
|
+
await this.saveGlobalConfig(defaultConfig);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Load global configuration
|
|
67
|
+
*/
|
|
68
|
+
async loadGlobalConfig() {
|
|
69
|
+
await this.initialize();
|
|
70
|
+
return await (0, file_utils_1.readJson)(this.globalConfigPath);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Save global configuration
|
|
74
|
+
*/
|
|
75
|
+
async saveGlobalConfig(config) {
|
|
76
|
+
await (0, file_utils_1.writeJsonAtomic)(this.globalConfigPath, config);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Load a server configuration by ID
|
|
80
|
+
*/
|
|
81
|
+
async loadServerConfig(id) {
|
|
82
|
+
const configPath = path.join(this.serversDir, `${id}.json`);
|
|
83
|
+
if (!(await (0, file_utils_1.fileExists)(configPath))) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return await (0, file_utils_1.readJson)(configPath);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Save a server configuration
|
|
90
|
+
*/
|
|
91
|
+
async saveServerConfig(config) {
|
|
92
|
+
const configPath = path.join(this.serversDir, `${config.id}.json`);
|
|
93
|
+
await (0, file_utils_1.writeJsonAtomic)(configPath, config);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Delete a server configuration
|
|
97
|
+
*/
|
|
98
|
+
async deleteServerConfig(id) {
|
|
99
|
+
const configPath = path.join(this.serversDir, `${id}.json`);
|
|
100
|
+
if (await (0, file_utils_1.fileExists)(configPath)) {
|
|
101
|
+
await fs.unlink(configPath);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get all server configurations
|
|
106
|
+
*/
|
|
107
|
+
async getAllServers() {
|
|
108
|
+
await (0, file_utils_1.ensureDir)(this.serversDir);
|
|
109
|
+
const files = await fs.readdir(this.serversDir);
|
|
110
|
+
const configFiles = files.filter((f) => f.endsWith('.json'));
|
|
111
|
+
const servers = [];
|
|
112
|
+
for (const file of configFiles) {
|
|
113
|
+
const filePath = path.join(this.serversDir, file);
|
|
114
|
+
try {
|
|
115
|
+
const config = await (0, file_utils_1.readJson)(filePath);
|
|
116
|
+
servers.push(config);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error(`Failed to load server config ${file}:`, error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return servers;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Find a server by port
|
|
126
|
+
*/
|
|
127
|
+
async findServerByPort(port) {
|
|
128
|
+
const servers = await this.getAllServers();
|
|
129
|
+
return servers.find((s) => s.port === port) || null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Find a server by model name (fuzzy match)
|
|
133
|
+
*/
|
|
134
|
+
async findServerByModelName(name) {
|
|
135
|
+
const servers = await this.getAllServers();
|
|
136
|
+
const nameLower = name.toLowerCase();
|
|
137
|
+
// Try exact ID match first
|
|
138
|
+
const exactMatch = servers.find((s) => s.id === nameLower);
|
|
139
|
+
if (exactMatch)
|
|
140
|
+
return exactMatch;
|
|
141
|
+
// Try partial match on model name or ID
|
|
142
|
+
const partialMatch = servers.find((s) => s.modelName.toLowerCase().includes(nameLower) ||
|
|
143
|
+
s.id.toLowerCase().includes(nameLower));
|
|
144
|
+
return partialMatch || null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Find a server by identifier (ID, model name, or port)
|
|
148
|
+
*/
|
|
149
|
+
async findServer(identifier) {
|
|
150
|
+
// Try as port number
|
|
151
|
+
const port = parseInt(identifier, 10);
|
|
152
|
+
if (!isNaN(port)) {
|
|
153
|
+
const server = await this.findServerByPort(port);
|
|
154
|
+
if (server)
|
|
155
|
+
return server;
|
|
156
|
+
}
|
|
157
|
+
// Try as ID or model name
|
|
158
|
+
return await this.findServerByModelName(identifier);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if a server exists for a given model
|
|
162
|
+
*/
|
|
163
|
+
async serverExistsForModel(modelPath) {
|
|
164
|
+
const servers = await this.getAllServers();
|
|
165
|
+
return servers.some((s) => s.modelPath === modelPath);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get all used ports
|
|
169
|
+
*/
|
|
170
|
+
async getUsedPorts() {
|
|
171
|
+
const servers = await this.getAllServers();
|
|
172
|
+
return new Set(servers.map((s) => s.port));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.StateManager = StateManager;
|
|
176
|
+
// Export singleton instance
|
|
177
|
+
exports.stateManager = new StateManager();
|
|
178
|
+
//# sourceMappingURL=state-manager.js.map
|