@appkit/llamacpp-cli 1.14.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/README.md +276 -280
  2. package/dist/cli.js +133 -23
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/admin/config.d.ts +1 -1
  5. package/dist/commands/admin/config.js +5 -5
  6. package/dist/commands/admin/config.js.map +1 -1
  7. package/dist/commands/admin/log-config.d.ts +11 -0
  8. package/dist/commands/admin/log-config.d.ts.map +1 -0
  9. package/dist/commands/admin/log-config.js +159 -0
  10. package/dist/commands/admin/log-config.js.map +1 -0
  11. package/dist/commands/admin/logs.d.ts +2 -3
  12. package/dist/commands/admin/logs.d.ts.map +1 -1
  13. package/dist/commands/admin/logs.js +6 -48
  14. package/dist/commands/admin/logs.js.map +1 -1
  15. package/dist/commands/admin/status.d.ts.map +1 -1
  16. package/dist/commands/admin/status.js +1 -0
  17. package/dist/commands/admin/status.js.map +1 -1
  18. package/dist/commands/config.d.ts +1 -0
  19. package/dist/commands/config.d.ts.map +1 -1
  20. package/dist/commands/config.js +63 -196
  21. package/dist/commands/config.js.map +1 -1
  22. package/dist/commands/create.d.ts +3 -2
  23. package/dist/commands/create.d.ts.map +1 -1
  24. package/dist/commands/create.js +24 -97
  25. package/dist/commands/create.js.map +1 -1
  26. package/dist/commands/delete.d.ts.map +1 -1
  27. package/dist/commands/delete.js +7 -24
  28. package/dist/commands/delete.js.map +1 -1
  29. package/dist/commands/internal/server-wrapper.d.ts +15 -0
  30. package/dist/commands/internal/server-wrapper.d.ts.map +1 -0
  31. package/dist/commands/internal/server-wrapper.js +126 -0
  32. package/dist/commands/internal/server-wrapper.js.map +1 -0
  33. package/dist/commands/logs-all.d.ts +0 -2
  34. package/dist/commands/logs-all.d.ts.map +1 -1
  35. package/dist/commands/logs-all.js +1 -61
  36. package/dist/commands/logs-all.js.map +1 -1
  37. package/dist/commands/logs.d.ts +2 -5
  38. package/dist/commands/logs.d.ts.map +1 -1
  39. package/dist/commands/logs.js +104 -120
  40. package/dist/commands/logs.js.map +1 -1
  41. package/dist/commands/migrate-labels.d.ts +12 -0
  42. package/dist/commands/migrate-labels.d.ts.map +1 -0
  43. package/dist/commands/migrate-labels.js +160 -0
  44. package/dist/commands/migrate-labels.js.map +1 -0
  45. package/dist/commands/ps.d.ts.map +1 -1
  46. package/dist/commands/ps.js +2 -1
  47. package/dist/commands/ps.js.map +1 -1
  48. package/dist/commands/rm.d.ts.map +1 -1
  49. package/dist/commands/rm.js +22 -48
  50. package/dist/commands/rm.js.map +1 -1
  51. package/dist/commands/router/config.d.ts +1 -1
  52. package/dist/commands/router/config.js +6 -6
  53. package/dist/commands/router/config.js.map +1 -1
  54. package/dist/commands/router/logs.d.ts +2 -4
  55. package/dist/commands/router/logs.d.ts.map +1 -1
  56. package/dist/commands/router/logs.js +34 -189
  57. package/dist/commands/router/logs.js.map +1 -1
  58. package/dist/commands/router/status.d.ts.map +1 -1
  59. package/dist/commands/router/status.js +1 -0
  60. package/dist/commands/router/status.js.map +1 -1
  61. package/dist/commands/server-show.d.ts.map +1 -1
  62. package/dist/commands/server-show.js +3 -0
  63. package/dist/commands/server-show.js.map +1 -1
  64. package/dist/commands/start.d.ts.map +1 -1
  65. package/dist/commands/start.js +21 -72
  66. package/dist/commands/start.js.map +1 -1
  67. package/dist/commands/stop.d.ts.map +1 -1
  68. package/dist/commands/stop.js +10 -26
  69. package/dist/commands/stop.js.map +1 -1
  70. package/dist/launchers/llamacpp-admin +8 -0
  71. package/dist/launchers/llamacpp-router +8 -0
  72. package/dist/launchers/llamacpp-server +8 -0
  73. package/dist/lib/admin-manager.d.ts +4 -0
  74. package/dist/lib/admin-manager.d.ts.map +1 -1
  75. package/dist/lib/admin-manager.js +42 -18
  76. package/dist/lib/admin-manager.js.map +1 -1
  77. package/dist/lib/admin-server.d.ts +48 -1
  78. package/dist/lib/admin-server.d.ts.map +1 -1
  79. package/dist/lib/admin-server.js +632 -238
  80. package/dist/lib/admin-server.js.map +1 -1
  81. package/dist/lib/config-generator.d.ts +1 -0
  82. package/dist/lib/config-generator.d.ts.map +1 -1
  83. package/dist/lib/config-generator.js +12 -5
  84. package/dist/lib/config-generator.js.map +1 -1
  85. package/dist/lib/keyboard-manager.d.ts +162 -0
  86. package/dist/lib/keyboard-manager.d.ts.map +1 -0
  87. package/dist/lib/keyboard-manager.js +247 -0
  88. package/dist/lib/keyboard-manager.js.map +1 -0
  89. package/dist/lib/label-migration.d.ts +65 -0
  90. package/dist/lib/label-migration.d.ts.map +1 -0
  91. package/dist/lib/label-migration.js +458 -0
  92. package/dist/lib/label-migration.js.map +1 -0
  93. package/dist/lib/launchctl-manager.d.ts +9 -0
  94. package/dist/lib/launchctl-manager.d.ts.map +1 -1
  95. package/dist/lib/launchctl-manager.js +65 -19
  96. package/dist/lib/launchctl-manager.js.map +1 -1
  97. package/dist/lib/log-management-service.d.ts +51 -0
  98. package/dist/lib/log-management-service.d.ts.map +1 -0
  99. package/dist/lib/log-management-service.js +124 -0
  100. package/dist/lib/log-management-service.js.map +1 -0
  101. package/dist/lib/log-workers.d.ts +70 -0
  102. package/dist/lib/log-workers.d.ts.map +1 -0
  103. package/dist/lib/log-workers.js +217 -0
  104. package/dist/lib/log-workers.js.map +1 -0
  105. package/dist/lib/model-downloader.d.ts +9 -1
  106. package/dist/lib/model-downloader.d.ts.map +1 -1
  107. package/dist/lib/model-downloader.js +98 -1
  108. package/dist/lib/model-downloader.js.map +1 -1
  109. package/dist/lib/model-management-service.d.ts +60 -0
  110. package/dist/lib/model-management-service.d.ts.map +1 -0
  111. package/dist/lib/model-management-service.js +246 -0
  112. package/dist/lib/model-management-service.js.map +1 -0
  113. package/dist/lib/model-management-service.test.d.ts +2 -0
  114. package/dist/lib/model-management-service.test.d.ts.map +1 -0
  115. package/dist/lib/model-management-service.test.js.map +1 -0
  116. package/dist/lib/model-scanner.d.ts +15 -3
  117. package/dist/lib/model-scanner.d.ts.map +1 -1
  118. package/dist/lib/model-scanner.js +174 -17
  119. package/dist/lib/model-scanner.js.map +1 -1
  120. package/dist/lib/openapi-spec.d.ts +1335 -0
  121. package/dist/lib/openapi-spec.d.ts.map +1 -0
  122. package/dist/lib/openapi-spec.js +1017 -0
  123. package/dist/lib/openapi-spec.js.map +1 -0
  124. package/dist/lib/router-logger.d.ts +1 -1
  125. package/dist/lib/router-logger.d.ts.map +1 -1
  126. package/dist/lib/router-logger.js +13 -11
  127. package/dist/lib/router-logger.js.map +1 -1
  128. package/dist/lib/router-manager.d.ts +4 -0
  129. package/dist/lib/router-manager.d.ts.map +1 -1
  130. package/dist/lib/router-manager.js +30 -18
  131. package/dist/lib/router-manager.js.map +1 -1
  132. package/dist/lib/router-server.d.ts +4 -7
  133. package/dist/lib/router-server.d.ts.map +1 -1
  134. package/dist/lib/router-server.js +71 -182
  135. package/dist/lib/router-server.js.map +1 -1
  136. package/dist/lib/server-config-service.d.ts +51 -0
  137. package/dist/lib/server-config-service.d.ts.map +1 -0
  138. package/dist/lib/server-config-service.js +310 -0
  139. package/dist/lib/server-config-service.js.map +1 -0
  140. package/dist/lib/server-config-service.test.d.ts +2 -0
  141. package/dist/lib/server-config-service.test.d.ts.map +1 -0
  142. package/dist/lib/server-config-service.test.js.map +1 -0
  143. package/dist/lib/server-lifecycle-service.d.ts +172 -0
  144. package/dist/lib/server-lifecycle-service.d.ts.map +1 -0
  145. package/dist/lib/server-lifecycle-service.js +619 -0
  146. package/dist/lib/server-lifecycle-service.js.map +1 -0
  147. package/dist/lib/state-manager.d.ts +18 -1
  148. package/dist/lib/state-manager.d.ts.map +1 -1
  149. package/dist/lib/state-manager.js +51 -2
  150. package/dist/lib/state-manager.js.map +1 -1
  151. package/dist/lib/status-checker.d.ts +11 -4
  152. package/dist/lib/status-checker.d.ts.map +1 -1
  153. package/dist/lib/status-checker.js +34 -1
  154. package/dist/lib/status-checker.js.map +1 -1
  155. package/dist/lib/validation-service.d.ts +43 -0
  156. package/dist/lib/validation-service.d.ts.map +1 -0
  157. package/dist/lib/validation-service.js +112 -0
  158. package/dist/lib/validation-service.js.map +1 -0
  159. package/dist/lib/validation-service.test.d.ts +2 -0
  160. package/dist/lib/validation-service.test.d.ts.map +1 -0
  161. package/dist/lib/validation-service.test.js.map +1 -0
  162. package/dist/scripts/http-log-filter.sh +8 -0
  163. package/dist/tui/ConfigApp.d.ts.map +1 -1
  164. package/dist/tui/ConfigApp.js +222 -184
  165. package/dist/tui/ConfigApp.js.map +1 -1
  166. package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -1
  167. package/dist/tui/HistoricalMonitorApp.js +12 -0
  168. package/dist/tui/HistoricalMonitorApp.js.map +1 -1
  169. package/dist/tui/ModelsApp.d.ts.map +1 -1
  170. package/dist/tui/ModelsApp.js +93 -17
  171. package/dist/tui/ModelsApp.js.map +1 -1
  172. package/dist/tui/MonitorApp.d.ts.map +1 -1
  173. package/dist/tui/MonitorApp.js +1 -3
  174. package/dist/tui/MonitorApp.js.map +1 -1
  175. package/dist/tui/MultiServerMonitorApp.d.ts +3 -3
  176. package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
  177. package/dist/tui/MultiServerMonitorApp.js +724 -508
  178. package/dist/tui/MultiServerMonitorApp.js.map +1 -1
  179. package/dist/tui/RootNavigator.d.ts.map +1 -1
  180. package/dist/tui/RootNavigator.js +17 -1
  181. package/dist/tui/RootNavigator.js.map +1 -1
  182. package/dist/tui/RouterApp.d.ts +6 -0
  183. package/dist/tui/RouterApp.d.ts.map +1 -0
  184. package/dist/tui/RouterApp.js +928 -0
  185. package/dist/tui/RouterApp.js.map +1 -0
  186. package/dist/tui/SearchApp.d.ts.map +1 -1
  187. package/dist/tui/SearchApp.js +27 -6
  188. package/dist/tui/SearchApp.js.map +1 -1
  189. package/dist/tui/shared/modal-controller.d.ts +65 -0
  190. package/dist/tui/shared/modal-controller.d.ts.map +1 -0
  191. package/dist/tui/shared/modal-controller.js +625 -0
  192. package/dist/tui/shared/modal-controller.js.map +1 -0
  193. package/dist/tui/shared/overlay-utils.d.ts +7 -0
  194. package/dist/tui/shared/overlay-utils.d.ts.map +1 -0
  195. package/dist/tui/shared/overlay-utils.js +54 -0
  196. package/dist/tui/shared/overlay-utils.js.map +1 -0
  197. package/dist/types/admin-config.d.ts +15 -2
  198. package/dist/types/admin-config.d.ts.map +1 -1
  199. package/dist/types/model-info.d.ts +5 -0
  200. package/dist/types/model-info.d.ts.map +1 -1
  201. package/dist/types/router-config.d.ts +2 -2
  202. package/dist/types/router-config.d.ts.map +1 -1
  203. package/dist/types/server-config.d.ts +8 -0
  204. package/dist/types/server-config.d.ts.map +1 -1
  205. package/dist/types/server-config.js +25 -0
  206. package/dist/types/server-config.js.map +1 -1
  207. package/dist/utils/http-log-filter.d.ts +10 -0
  208. package/dist/utils/http-log-filter.d.ts.map +1 -0
  209. package/dist/utils/http-log-filter.js +84 -0
  210. package/dist/utils/http-log-filter.js.map +1 -0
  211. package/dist/utils/log-parser.d.ts.map +1 -1
  212. package/dist/utils/log-parser.js +7 -4
  213. package/dist/utils/log-parser.js.map +1 -1
  214. package/dist/utils/log-utils.d.ts +59 -4
  215. package/dist/utils/log-utils.d.ts.map +1 -1
  216. package/dist/utils/log-utils.js +150 -11
  217. package/dist/utils/log-utils.js.map +1 -1
  218. package/dist/utils/shard-utils.d.ts +72 -0
  219. package/dist/utils/shard-utils.d.ts.map +1 -0
  220. package/dist/utils/shard-utils.js +168 -0
  221. package/dist/utils/shard-utils.js.map +1 -0
  222. package/package.json +18 -4
  223. package/src/launchers/llamacpp-admin +8 -0
  224. package/src/launchers/llamacpp-router +8 -0
  225. package/src/launchers/llamacpp-server +8 -0
  226. package/web/dist/assets/index-Byhoy86V.css +1 -0
  227. package/web/dist/assets/index-HSrgvray.js +50 -0
  228. package/web/dist/index.html +2 -2
  229. package/web/dist/assets/index-Bin89Lwr.css +0 -1
  230. package/web/dist/assets/index-CVmonw3T.js +0 -17
@@ -0,0 +1,619 @@
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.serverLifecycleService = exports.ServerLifecycleService = void 0;
37
+ const path = __importStar(require("path"));
38
+ const server_config_1 = require("../types/server-config");
39
+ const launchctl_manager_1 = require("./launchctl-manager");
40
+ const status_checker_1 = require("./status-checker");
41
+ const state_manager_1 = require("./state-manager");
42
+ const model_scanner_1 = require("./model-scanner");
43
+ const config_generator_1 = require("./config-generator");
44
+ const port_manager_1 = require("./port-manager");
45
+ const file_utils_1 = require("../utils/file-utils");
46
+ const log_utils_1 = require("../utils/log-utils");
47
+ const process_utils_1 = require("../utils/process-utils");
48
+ /**
49
+ * Centralized service lifecycle management
50
+ *
51
+ * Handles all server create/start/stop operations with:
52
+ * - Concurrency protection (prevents simultaneous operations on same server)
53
+ * - Consistent behavior across CLI, TUI, and Admin API
54
+ * - Progress callbacks for UI feedback
55
+ * - Automatic plist regeneration
56
+ * - Log rotation
57
+ * - Metal memory detection
58
+ * - Unique ID generation for duplicate models
59
+ */
60
+ class ServerLifecycleService {
61
+ constructor() {
62
+ // Concurrency protection: tracks in-progress operations
63
+ this.operationsInProgress = new Map();
64
+ }
65
+ /**
66
+ * Create and start a new server with full lifecycle management
67
+ *
68
+ * Steps:
69
+ * 1. Resolve model path and get model info
70
+ * 2. Validate alias if provided
71
+ * 3. Determine port (auto-assign or validate provided port)
72
+ * 4. Generate unique server ID and configuration
73
+ * 5. Create plist file
74
+ * 6. Load and start service
75
+ * 7. Wait for startup
76
+ * 8. Detect Metal memory
77
+ * 9. Save configuration
78
+ */
79
+ async createServer(model, options = {}) {
80
+ const { onProgress = () => { }, startupTimeoutMs = 5000, metalDetectionDelayMs = 8000, alias, ...serverOptions } = options;
81
+ const totalSteps = 9;
82
+ let currentStep = 0;
83
+ try {
84
+ // Step 1: Resolve model path and get model info
85
+ onProgress('Resolving model path...', ++currentStep, totalSteps);
86
+ const modelPath = await model_scanner_1.modelScanner.resolveModelPath(model);
87
+ if (!modelPath) {
88
+ return {
89
+ success: false,
90
+ server: {},
91
+ error: `Model not found: ${model}`
92
+ };
93
+ }
94
+ const modelInfo = await model_scanner_1.modelScanner.getModelInfo(model);
95
+ if (!modelInfo || !modelInfo.size) {
96
+ return {
97
+ success: false,
98
+ server: {},
99
+ error: 'Failed to read model file'
100
+ };
101
+ }
102
+ // For sharded models, use base model name; otherwise use filename
103
+ let modelName = path.basename(modelPath);
104
+ if (modelInfo.isSharded && modelInfo.baseModelName) {
105
+ modelName = modelInfo.baseModelName;
106
+ }
107
+ const modelSize = modelInfo.size;
108
+ // Step 2: Validate alias if provided
109
+ if (alias) {
110
+ onProgress('Validating alias...', ++currentStep, totalSteps);
111
+ const validationError = (0, server_config_1.validateAlias)(alias);
112
+ if (validationError) {
113
+ return {
114
+ success: false,
115
+ server: {},
116
+ error: `Invalid alias: ${validationError}`
117
+ };
118
+ }
119
+ const conflictingServerId = await state_manager_1.stateManager.isAliasAvailable(alias);
120
+ if (conflictingServerId) {
121
+ return {
122
+ success: false,
123
+ server: {},
124
+ error: `Alias "${alias}" is already used by server: ${conflictingServerId}`
125
+ };
126
+ }
127
+ }
128
+ else {
129
+ currentStep++;
130
+ }
131
+ // Step 3: Determine port
132
+ onProgress('Determining port...', ++currentStep, totalSteps);
133
+ let port;
134
+ if (serverOptions.port) {
135
+ port_manager_1.portManager.validatePort(serverOptions.port);
136
+ const available = await port_manager_1.portManager.isPortAvailable(serverOptions.port);
137
+ if (!available) {
138
+ return {
139
+ success: false,
140
+ server: {},
141
+ error: `Port ${serverOptions.port} is already in use`
142
+ };
143
+ }
144
+ port = serverOptions.port;
145
+ }
146
+ else {
147
+ port = await port_manager_1.portManager.findAvailablePort();
148
+ }
149
+ // Step 4: Generate configuration (with unique ID)
150
+ onProgress('Generating configuration...', ++currentStep, totalSteps);
151
+ const config = await config_generator_1.configGenerator.generateConfig(modelPath, modelName, modelSize, port, { ...serverOptions, alias });
152
+ // Ensure log directory exists
153
+ await (0, file_utils_1.ensureDir)(path.dirname(config.stdoutPath));
154
+ // Step 5: Create plist file
155
+ onProgress('Creating launchctl service...', ++currentStep, totalSteps);
156
+ await launchctl_manager_1.launchctlManager.createPlist(config);
157
+ // Step 6: Load and start service
158
+ try {
159
+ onProgress('Loading service...', ++currentStep, totalSteps);
160
+ await launchctl_manager_1.launchctlManager.loadService(config.plistPath);
161
+ }
162
+ catch (error) {
163
+ // Clean up plist if load fails
164
+ await launchctl_manager_1.launchctlManager.deletePlist(config.plistPath);
165
+ return {
166
+ success: false,
167
+ server: config,
168
+ error: `Failed to load service: ${error.message}`
169
+ };
170
+ }
171
+ try {
172
+ onProgress('Starting service...', ++currentStep, totalSteps);
173
+ await launchctl_manager_1.launchctlManager.startService(config.label);
174
+ }
175
+ catch (error) {
176
+ // Clean up if start fails
177
+ await launchctl_manager_1.launchctlManager.unloadService(config.plistPath);
178
+ await launchctl_manager_1.launchctlManager.deletePlist(config.plistPath);
179
+ return {
180
+ success: false,
181
+ server: config,
182
+ error: `Failed to start service: ${error.message}`
183
+ };
184
+ }
185
+ // Step 7: Wait for startup
186
+ onProgress('Waiting for server to start...', ++currentStep, totalSteps);
187
+ const started = await launchctl_manager_1.launchctlManager.waitForServiceStart(config.label, startupTimeoutMs);
188
+ if (!started) {
189
+ // Clean up if startup fails
190
+ await launchctl_manager_1.launchctlManager.unloadService(config.plistPath);
191
+ await launchctl_manager_1.launchctlManager.deletePlist(config.plistPath);
192
+ return {
193
+ success: false,
194
+ server: config,
195
+ error: 'Server failed to start'
196
+ };
197
+ }
198
+ // Update config with running status
199
+ let updatedConfig = await status_checker_1.statusChecker.updateServerStatus(config);
200
+ // Step 8: Detect Metal memory (optional)
201
+ onProgress('Detecting Metal (GPU) memory...', ++currentStep, totalSteps);
202
+ const metalMemoryMB = await this.detectMetalMemory(updatedConfig, metalDetectionDelayMs);
203
+ if (metalMemoryMB) {
204
+ updatedConfig = { ...updatedConfig, metalMemoryMB };
205
+ }
206
+ // Step 9: Save configuration
207
+ onProgress('Saving configuration...', ++currentStep, totalSteps);
208
+ await state_manager_1.stateManager.saveServerConfig(updatedConfig);
209
+ return {
210
+ success: true,
211
+ server: updatedConfig,
212
+ metalMemoryMB
213
+ };
214
+ }
215
+ catch (error) {
216
+ return {
217
+ success: false,
218
+ server: {},
219
+ error: error.message
220
+ };
221
+ }
222
+ }
223
+ /**
224
+ * Start a server with full lifecycle management
225
+ *
226
+ * Steps:
227
+ * 1. Find server and check status
228
+ * 2. Auto-rotate large logs
229
+ * 3. Regenerate plist (ensures latest config/wrapper)
230
+ * 4. Load and start service
231
+ * 5. Wait for startup (process started)
232
+ * 6. Wait for port to be ready
233
+ * 7. Detect Metal memory (if needed)
234
+ * 8. Update status
235
+ */
236
+ async startServer(identifier, options = {}) {
237
+ const { onProgress = () => { }, maxLogSizeMB = 100, startupTimeoutMs = 5000, portReadyTimeoutMs = 10000, metalDetectionDelayMs = 8000, } = options;
238
+ const TOTAL_STEPS = 8;
239
+ let currentStep = 0;
240
+ const progress = (msg) => onProgress(msg, ++currentStep, TOTAL_STEPS);
241
+ try {
242
+ // Check concurrency
243
+ if (this.operationsInProgress.has(identifier)) {
244
+ const op = this.operationsInProgress.get(identifier);
245
+ throw new Error(`Server is already ${op} - please wait for operation to complete`);
246
+ }
247
+ // Lock this server
248
+ this.operationsInProgress.set(identifier, 'starting');
249
+ try {
250
+ // 1. Find server
251
+ progress('Finding server...');
252
+ const server = await state_manager_1.stateManager.findServer(identifier);
253
+ if (!server) {
254
+ throw new Error(`Server not found: ${identifier}`);
255
+ }
256
+ // 2. Check actual runtime status (not config file status)
257
+ const status = await status_checker_1.statusChecker.checkServer(server);
258
+ const actualStatus = status_checker_1.statusChecker.determineStatus(status, status.portListening);
259
+ if (actualStatus === 'running') {
260
+ // Update config with actual status
261
+ server.status = actualStatus;
262
+ server.pid = status.pid || undefined;
263
+ await state_manager_1.stateManager.updateServerConfig(server.id, {
264
+ status: server.status,
265
+ pid: server.pid,
266
+ });
267
+ return {
268
+ success: false,
269
+ server,
270
+ error: 'Server is already running',
271
+ };
272
+ }
273
+ // Update server with actual status
274
+ server.status = actualStatus;
275
+ server.pid = status.pid || undefined;
276
+ // 3. Auto-rotate logs
277
+ progress('Checking logs...');
278
+ const rotateResult = await this.autoRotateLogs(server, maxLogSizeMB);
279
+ // 4. Prepare service (regenerate plist, unload, load)
280
+ progress('Preparing service...');
281
+ await this.prepareService(server);
282
+ // 5. Start service
283
+ progress('Starting server...');
284
+ await launchctl_manager_1.launchctlManager.startService(server.label);
285
+ // 6. Wait for startup (process started)
286
+ progress('Waiting for startup...');
287
+ const started = await launchctl_manager_1.launchctlManager.waitForServiceStart(server.label, startupTimeoutMs);
288
+ if (!started) {
289
+ throw new Error('Server failed to start within timeout');
290
+ }
291
+ // 7. Wait for port to be ready (server actually responding)
292
+ if (portReadyTimeoutMs > 0) {
293
+ progress('Waiting for port to be ready...');
294
+ const portReady = await this.waitForPort(server.port, portReadyTimeoutMs);
295
+ if (!portReady) {
296
+ throw new Error('Server started but port not responding. Check logs for errors.');
297
+ }
298
+ }
299
+ // 8. Update status and detect Metal memory
300
+ progress('Verifying status...');
301
+ let updatedServer = await status_checker_1.statusChecker.updateServerStatus(server);
302
+ // Detect Metal memory if not already captured
303
+ const metalMemoryMB = await this.detectMetalMemory(updatedServer, metalDetectionDelayMs);
304
+ if (metalMemoryMB) {
305
+ updatedServer = { ...updatedServer, metalMemoryMB };
306
+ await state_manager_1.stateManager.saveServerConfig(updatedServer);
307
+ }
308
+ return {
309
+ success: true,
310
+ server: updatedServer,
311
+ metalMemoryMB,
312
+ rotatedLogs: rotateResult.rotated ? rotateResult.files : undefined,
313
+ };
314
+ }
315
+ finally {
316
+ // Always unlock, even if error
317
+ this.operationsInProgress.delete(identifier);
318
+ }
319
+ }
320
+ catch (error) {
321
+ // Try to get current server state for error result
322
+ let server = null;
323
+ try {
324
+ server = await state_manager_1.stateManager.findServer(identifier);
325
+ }
326
+ catch {
327
+ // Ignore - will be null
328
+ }
329
+ return {
330
+ success: false,
331
+ server: server,
332
+ error: error.message,
333
+ };
334
+ }
335
+ }
336
+ /**
337
+ * Stop a server with full lifecycle management
338
+ *
339
+ * Steps:
340
+ * 1. Find server and check status
341
+ * 2. Stop service
342
+ * 3. Unload service
343
+ * 4. Wait for shutdown
344
+ * 5. Update status
345
+ */
346
+ async stopServer(identifier, options = {}) {
347
+ const { onProgress = () => { }, shutdownTimeoutMs = 5000, } = options;
348
+ const TOTAL_STEPS = 5;
349
+ let currentStep = 0;
350
+ const progress = (msg) => onProgress(msg, ++currentStep, TOTAL_STEPS);
351
+ try {
352
+ // Check concurrency
353
+ if (this.operationsInProgress.has(identifier)) {
354
+ const op = this.operationsInProgress.get(identifier);
355
+ throw new Error(`Server is already ${op} - please wait for operation to complete`);
356
+ }
357
+ // Lock this server
358
+ this.operationsInProgress.set(identifier, 'stopping');
359
+ try {
360
+ // 1. Find server
361
+ progress('Finding server...');
362
+ const server = await state_manager_1.stateManager.findServer(identifier);
363
+ if (!server) {
364
+ throw new Error(`Server not found: ${identifier}`);
365
+ }
366
+ // 2. Check actual runtime status (not config file status)
367
+ const status = await status_checker_1.statusChecker.checkServer(server);
368
+ const actualStatus = status_checker_1.statusChecker.determineStatus(status, status.portListening);
369
+ if (actualStatus === 'stopped') {
370
+ // Update config with actual status
371
+ server.status = actualStatus;
372
+ server.pid = undefined;
373
+ await state_manager_1.stateManager.updateServerConfig(server.id, {
374
+ status: server.status,
375
+ pid: undefined,
376
+ lastStopped: new Date().toISOString(),
377
+ });
378
+ return {
379
+ success: false,
380
+ server,
381
+ error: 'Server is already stopped',
382
+ };
383
+ }
384
+ // Update server with actual status
385
+ server.status = actualStatus;
386
+ server.pid = status.pid || undefined;
387
+ // 3. Stop service
388
+ progress('Stopping server...');
389
+ try {
390
+ await launchctl_manager_1.launchctlManager.stopService(server.label);
391
+ }
392
+ catch (error) {
393
+ // May already be stopped - not fatal
394
+ console.error(`Warning: stop service failed (may already be stopped): ${error.message}`);
395
+ }
396
+ // 4. Unload service
397
+ progress('Unloading service...');
398
+ try {
399
+ await launchctl_manager_1.launchctlManager.unloadService(server.plistPath);
400
+ }
401
+ catch (error) {
402
+ // May already be unloaded - not fatal
403
+ console.error(`Warning: unload service failed (may already be unloaded): ${error.message}`);
404
+ }
405
+ // 5. Wait for shutdown
406
+ progress('Waiting for shutdown...');
407
+ await launchctl_manager_1.launchctlManager.waitForServiceStop(server.label, shutdownTimeoutMs);
408
+ // 6. Update status
409
+ progress('Verifying status...');
410
+ const updatedServer = await status_checker_1.statusChecker.updateServerStatus(server);
411
+ return {
412
+ success: true,
413
+ server: updatedServer,
414
+ };
415
+ }
416
+ finally {
417
+ // Always unlock
418
+ this.operationsInProgress.delete(identifier);
419
+ }
420
+ }
421
+ catch (error) {
422
+ // Try to get current server state
423
+ let server = null;
424
+ try {
425
+ server = await state_manager_1.stateManager.findServer(identifier);
426
+ }
427
+ catch {
428
+ // Ignore
429
+ }
430
+ return {
431
+ success: false,
432
+ server: server,
433
+ error: error.message,
434
+ };
435
+ }
436
+ }
437
+ /**
438
+ * Delete a server with full lifecycle management
439
+ *
440
+ * Steps:
441
+ * 1. Find server
442
+ * 2. Check status
443
+ * 3. Unload service (auto-stops if running)
444
+ * 4. Delete plist file
445
+ * 5. Delete server config
446
+ */
447
+ async deleteServer(identifier, options = {}) {
448
+ const { onProgress = () => { }, shutdownTimeoutMs = 5000, } = options;
449
+ const TOTAL_STEPS = 5;
450
+ let currentStep = 0;
451
+ const progress = (msg) => onProgress(msg, ++currentStep, TOTAL_STEPS);
452
+ let resolvedId = identifier;
453
+ try {
454
+ // Check concurrency
455
+ if (this.operationsInProgress.has(identifier)) {
456
+ const op = this.operationsInProgress.get(identifier);
457
+ return {
458
+ success: false,
459
+ serverId: identifier,
460
+ error: `Server is already ${op} - please wait for operation to complete`,
461
+ };
462
+ }
463
+ // Lock this server
464
+ this.operationsInProgress.set(identifier, 'deleting');
465
+ try {
466
+ // 1. Find server
467
+ progress('Finding server...');
468
+ const server = await state_manager_1.stateManager.findServer(identifier);
469
+ if (!server) {
470
+ return {
471
+ success: false,
472
+ serverId: identifier,
473
+ error: `Server not found: ${identifier}`,
474
+ };
475
+ }
476
+ resolvedId = server.id;
477
+ // 2. Check actual runtime status
478
+ progress('Checking status...');
479
+ const status = await status_checker_1.statusChecker.checkServer(server);
480
+ const actualStatus = status_checker_1.statusChecker.determineStatus(status, status.portListening);
481
+ // 3. Unload service (stops if running, no-op if already unloaded)
482
+ progress('Stopping service...');
483
+ if (actualStatus === 'running') {
484
+ try {
485
+ await launchctl_manager_1.launchctlManager.unloadService(server.plistPath);
486
+ await launchctl_manager_1.launchctlManager.waitForServiceStop(server.label, shutdownTimeoutMs);
487
+ }
488
+ catch (error) {
489
+ // Non-fatal - continue with deletion
490
+ console.error(`Warning: unload failed (continuing): ${error.message}`);
491
+ }
492
+ }
493
+ else {
494
+ // Try to unload in case service is registered but not running
495
+ try {
496
+ await launchctl_manager_1.launchctlManager.unloadService(server.plistPath);
497
+ }
498
+ catch {
499
+ // Expected if already unloaded
500
+ }
501
+ }
502
+ // 4. Delete plist
503
+ progress('Removing configuration...');
504
+ await launchctl_manager_1.launchctlManager.deletePlist(server.plistPath);
505
+ // 5. Delete server config
506
+ progress('Deleting server record...');
507
+ await state_manager_1.stateManager.deleteServerConfig(server.id);
508
+ return {
509
+ success: true,
510
+ serverId: server.id,
511
+ modelPath: server.modelPath,
512
+ };
513
+ }
514
+ finally {
515
+ // Always unlock
516
+ this.operationsInProgress.delete(identifier);
517
+ }
518
+ }
519
+ catch (error) {
520
+ return {
521
+ success: false,
522
+ serverId: resolvedId,
523
+ error: error.message,
524
+ };
525
+ }
526
+ }
527
+ /**
528
+ * Restart a server (stop then start)
529
+ */
530
+ async restartServer(identifier, options = {}) {
531
+ // Stop first
532
+ const stopResult = await this.stopServer(identifier, options);
533
+ if (!stopResult.success && stopResult.error !== 'Server is already stopped') {
534
+ return {
535
+ success: false,
536
+ server: stopResult.server,
537
+ error: `Failed to stop: ${stopResult.error}`,
538
+ };
539
+ }
540
+ // Then start
541
+ return this.startServer(identifier, options);
542
+ }
543
+ /**
544
+ * Helper: Auto-rotate logs if they exceed size limit
545
+ */
546
+ async autoRotateLogs(server, maxLogSizeMB) {
547
+ try {
548
+ return await (0, log_utils_1.autoRotateIfNeeded)(server.stdoutPath, server.stderrPath, maxLogSizeMB);
549
+ }
550
+ catch (error) {
551
+ // Non-fatal - just log and continue
552
+ console.error(`Warning: log rotation failed: ${error.message}`);
553
+ return { rotated: false, files: [] };
554
+ }
555
+ }
556
+ /**
557
+ * Helper: Prepare service (regenerate plist, unload old, load new)
558
+ */
559
+ async prepareService(server) {
560
+ // Check if plist needs updating
561
+ const needsUpdate = await launchctl_manager_1.launchctlManager.needsPlistUpdate(server.plistPath);
562
+ if (needsUpdate) {
563
+ // Regenerate plist with latest config
564
+ await launchctl_manager_1.launchctlManager.createPlist(server);
565
+ // Unload old service to pick up new plist
566
+ try {
567
+ await launchctl_manager_1.launchctlManager.unloadService(server.plistPath);
568
+ }
569
+ catch (error) {
570
+ // Expected if not loaded - not an error
571
+ }
572
+ }
573
+ // Load service (idempotent - safe to call even if already loaded)
574
+ try {
575
+ await launchctl_manager_1.launchctlManager.loadService(server.plistPath);
576
+ }
577
+ catch (error) {
578
+ // Expected if already loaded - not an error
579
+ }
580
+ }
581
+ /**
582
+ * Helper: Wait for port to be ready (server actually listening)
583
+ */
584
+ async waitForPort(port, timeoutMs) {
585
+ const startTime = Date.now();
586
+ const pollInterval = 500; // Check every 500ms
587
+ while (Date.now() - startTime < timeoutMs) {
588
+ if (await (0, process_utils_1.isPortInUse)(port)) {
589
+ return true;
590
+ }
591
+ await new Promise(resolve => setTimeout(resolve, pollInterval));
592
+ }
593
+ return false; // Timeout - port never became ready
594
+ }
595
+ /**
596
+ * Helper: Detect Metal (GPU) memory allocation from logs
597
+ */
598
+ async detectMetalMemory(server, delayMs) {
599
+ // Skip if already captured
600
+ if (server.metalMemoryMB) {
601
+ return undefined;
602
+ }
603
+ // Wait for Metal initialization
604
+ await new Promise(resolve => setTimeout(resolve, delayMs));
605
+ try {
606
+ const result = await (0, file_utils_1.parseMetalMemoryFromLog)(server.stderrPath);
607
+ return result ?? undefined;
608
+ }
609
+ catch (error) {
610
+ // Non-fatal - Metal detection is optional
611
+ console.error(`Warning: Metal memory detection failed: ${error.message}`);
612
+ return undefined;
613
+ }
614
+ }
615
+ }
616
+ exports.ServerLifecycleService = ServerLifecycleService;
617
+ // Export singleton
618
+ exports.serverLifecycleService = new ServerLifecycleService();
619
+ //# sourceMappingURL=server-lifecycle-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-lifecycle-service.js","sourceRoot":"","sources":["../../src/lib/server-lifecycle-service.ts"],"names":[],"mappings":"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"}