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.
Files changed (96) hide show
  1. package/README.md +31 -0
  2. package/backend/dist/di/container.js +80 -0
  3. package/backend/dist/di/container.js.map +1 -0
  4. package/backend/dist/di/types.js +18 -0
  5. package/backend/dist/di/types.js.map +1 -0
  6. package/backend/dist/files/validatePassword.ps1 +10 -0
  7. package/backend/dist/files/wmiGpuQuery.ps1 +15 -0
  8. package/backend/dist/helpers/ExecTools.js +101 -0
  9. package/backend/dist/helpers/ExecTools.js.map +1 -0
  10. package/backend/dist/index.js +51 -0
  11. package/backend/dist/index.js.map +1 -0
  12. package/backend/dist/middleware/authMiddleware.js +32 -0
  13. package/backend/dist/middleware/authMiddleware.js.map +1 -0
  14. package/backend/dist/models/GpuInfo.js +3 -0
  15. package/backend/dist/models/GpuInfo.js.map +1 -0
  16. package/backend/dist/models/ServiceConfig.js +46 -0
  17. package/backend/dist/models/ServiceConfig.js.map +1 -0
  18. package/backend/dist/models/ServiceStatus.js +3 -0
  19. package/backend/dist/models/ServiceStatus.js.map +1 -0
  20. package/backend/dist/routes/authRoutes.js +46 -0
  21. package/backend/dist/routes/authRoutes.js.map +1 -0
  22. package/backend/dist/routes/gpuRoutes.js +35 -0
  23. package/backend/dist/routes/gpuRoutes.js.map +1 -0
  24. package/backend/dist/routes/serviceRoutes.js +206 -0
  25. package/backend/dist/routes/serviceRoutes.js.map +1 -0
  26. package/backend/dist/routes/systemRoutes.js +64 -0
  27. package/backend/dist/routes/systemRoutes.js.map +1 -0
  28. package/backend/dist/services/auth/linuxPasswordVerifier.js +74 -0
  29. package/backend/dist/services/auth/linuxPasswordVerifier.js.map +1 -0
  30. package/backend/dist/services/auth/passwordVerifier.js +3 -0
  31. package/backend/dist/services/auth/passwordVerifier.js.map +1 -0
  32. package/backend/dist/services/auth/windowsPasswordVerifier.js +73 -0
  33. package/backend/dist/services/auth/windowsPasswordVerifier.js.map +1 -0
  34. package/backend/dist/services/authService.js +240 -0
  35. package/backend/dist/services/authService.js.map +1 -0
  36. package/backend/dist/services/configManager.js +96 -0
  37. package/backend/dist/services/configManager.js.map +1 -0
  38. package/backend/dist/services/controllers/systemctlController.js +287 -0
  39. package/backend/dist/services/controllers/systemctlController.js.map +1 -0
  40. package/backend/dist/services/controllers/windowsServiceController.js +201 -0
  41. package/backend/dist/services/controllers/windowsServiceController.js.map +1 -0
  42. package/backend/dist/services/detectors/amdLinuxDetector.js +127 -0
  43. package/backend/dist/services/detectors/amdLinuxDetector.js.map +1 -0
  44. package/backend/dist/services/detectors/gpuDetector.js +3 -0
  45. package/backend/dist/services/detectors/gpuDetector.js.map +1 -0
  46. package/backend/dist/services/detectors/nvidiaSmiDetector.js +67 -0
  47. package/backend/dist/services/detectors/nvidiaSmiDetector.js.map +1 -0
  48. package/backend/dist/services/detectors/wmiDetector.js +125 -0
  49. package/backend/dist/services/detectors/wmiDetector.js.map +1 -0
  50. package/backend/dist/services/enrichers/gpuEnricher.js +3 -0
  51. package/backend/dist/services/enrichers/gpuEnricher.js.map +1 -0
  52. package/backend/dist/services/enrichers/lspciEnricher.js +92 -0
  53. package/backend/dist/services/enrichers/lspciEnricher.js.map +1 -0
  54. package/backend/dist/services/enrichers/vulkanEnricher.js +57 -0
  55. package/backend/dist/services/enrichers/vulkanEnricher.js.map +1 -0
  56. package/backend/dist/services/gpuService.js +108 -0
  57. package/backend/dist/services/gpuService.js.map +1 -0
  58. package/backend/dist/services/helpers/gpuDedup.js +46 -0
  59. package/backend/dist/services/helpers/gpuDedup.js.map +1 -0
  60. package/backend/dist/services/helpers/gpuEngineNames.js +22 -0
  61. package/backend/dist/services/helpers/gpuEngineNames.js.map +1 -0
  62. package/backend/dist/services/llamaAutocompleteService.js +277 -0
  63. package/backend/dist/services/llamaAutocompleteService.js.map +1 -0
  64. package/backend/dist/services/managedServicesController.js +72 -0
  65. package/backend/dist/services/managedServicesController.js.map +1 -0
  66. package/backend/dist/services/managedServicesManager.js +91 -0
  67. package/backend/dist/services/managedServicesManager.js.map +1 -0
  68. package/backend/dist/services/probes/amdLinuxUsageProbe.js +109 -0
  69. package/backend/dist/services/probes/amdLinuxUsageProbe.js.map +1 -0
  70. package/backend/dist/services/probes/gpuUsageProbe.js +3 -0
  71. package/backend/dist/services/probes/gpuUsageProbe.js.map +1 -0
  72. package/backend/dist/services/probes/nvidiaSmiUsageProbe.js +67 -0
  73. package/backend/dist/services/probes/nvidiaSmiUsageProbe.js.map +1 -0
  74. package/backend/dist/services/providers/systemInfoLinuxProvider.js +188 -0
  75. package/backend/dist/services/providers/systemInfoLinuxProvider.js.map +1 -0
  76. package/backend/dist/services/providers/systemInfoWindowsProvider.js +101 -0
  77. package/backend/dist/services/providers/systemInfoWindowsProvider.js.map +1 -0
  78. package/backend/dist/services/serviceConfigController.js +116 -0
  79. package/backend/dist/services/serviceConfigController.js.map +1 -0
  80. package/backend/dist/services/serviceController.js +3 -0
  81. package/backend/dist/services/serviceController.js.map +1 -0
  82. package/backend/dist/services/serviceManager.js +157 -0
  83. package/backend/dist/services/serviceManager.js.map +1 -0
  84. package/backend/dist/services/systemInfoProvider.js +3 -0
  85. package/backend/dist/services/systemInfoProvider.js.map +1 -0
  86. package/backend/dist/services/systemService.js +42 -0
  87. package/backend/dist/services/systemService.js.map +1 -0
  88. package/backend/public/browser/chunk-34LU6STA.js +1 -0
  89. package/backend/public/browser/chunk-JGNPKRLU.js +4 -0
  90. package/backend/public/browser/favicon.svg +11 -0
  91. package/backend/public/browser/index.html +15 -0
  92. package/backend/public/browser/main-MUMQYBNS.js +5579 -0
  93. package/backend/public/browser/polyfills-5CFQRCPP.js +2 -0
  94. package/backend/public/browser/styles-QBUDNRKH.css +1 -0
  95. package/bin/aiservermanager.js +2 -0
  96. package/package.json +45 -0
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SystemInfoWindowsProvider = void 0;
4
+ const ExecTools_1 = require("../../helpers/ExecTools");
5
+ /** Gather system info on Windows via PowerShell (CIM). */
6
+ class SystemInfoWindowsProvider {
7
+ async isAvailable() {
8
+ return process.platform === "win32";
9
+ }
10
+ async getSystemInfo() {
11
+ const [osWithBoot, hostname] = await Promise.all([this.getCimOsInfo(), execStr("hostname")]);
12
+ const uptime = this.formatUptime(osWithBoot.bootTicks);
13
+ return {
14
+ os: osWithBoot.os,
15
+ hostname,
16
+ kernel: osWithBoot.os.version, // reuse version field for build number
17
+ uptime,
18
+ disks: await this.getDiskInfo(),
19
+ logs: await this.getLogSizes(),
20
+ };
21
+ }
22
+ /** Single CIM call → OS fields + LastBootUpTime epoch for uptime. */
23
+ async getCimOsInfo() {
24
+ const { stdout } = await ExecTools_1.ExecTools.safeExec("$os = Get-CimInstance Win32_OperatingSystem; [PSCustomObject]@{ Caption=$os.Caption; Version=$os.Version; BuildNumber=$os.BuildNumber; BootTicks=[long](Get-Date).Subtract($os.LastBootUpTime).TotalSeconds } | ConvertTo-Json");
25
+ try {
26
+ const parsed = JSON.parse(stdout);
27
+ return {
28
+ os: {
29
+ name: parsed.Caption ?? "Windows",
30
+ version: parsed.Version ?? "",
31
+ id: parsed.BuildNumber ?? "unknown",
32
+ },
33
+ bootTicks: typeof parsed.BootTicks === "number" ? parsed.BootTicks : 0,
34
+ };
35
+ }
36
+ catch {
37
+ return { os: { name: "Windows", version: "", id: "unknown" }, bootTicks: 0 };
38
+ }
39
+ }
40
+ formatUptime(totalSeconds) {
41
+ if (totalSeconds <= 0)
42
+ return "unknown";
43
+ const days = Math.floor(totalSeconds / 86400);
44
+ const hours = Math.floor((totalSeconds % 86400) / 3600);
45
+ const mins = Math.floor((totalSeconds % 3600) / 60);
46
+ const secs = Math.floor(totalSeconds % 60);
47
+ const time = `${String(hours).padStart(2, "0")}:${String(mins).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
48
+ return days > 0 ? `${days} days, ${time}` : time;
49
+ }
50
+ async getDiskInfo() {
51
+ const { stdout } = await ExecTools_1.ExecTools.safeExec("Get-CimInstance Win32_LogicalDisk -Filter 'DriveType=3' | Select-Object DeviceID, VolumeName, Size, FreeSpace | ConvertTo-Json");
52
+ const disks = [];
53
+ try {
54
+ const parsed = JSON.parse(stdout);
55
+ // Single disk → object, not array; normalize
56
+ const entries = Array.isArray(parsed) ? parsed : [parsed];
57
+ for (const d of entries) {
58
+ const total = parseFloat(d.Size) || 0;
59
+ const free = parseFloat(d.FreeSpace) || 0;
60
+ const used = total - free;
61
+ disks.push({
62
+ device: d.DeviceID ?? "",
63
+ mountPoint: d.DeviceID ?? "",
64
+ total,
65
+ used,
66
+ available: free,
67
+ usePercent: total > 0 ? Math.round((used / total) * 100) : 0,
68
+ });
69
+ }
70
+ }
71
+ catch {
72
+ // fallback: empty
73
+ }
74
+ return disks;
75
+ }
76
+ async getLogSizes() {
77
+ // Windows event log equivalent: check sizes of common log locations
78
+ const paths = [
79
+ "C:\\Windows\\System32\\winevt\\Logs\\System.evtx",
80
+ "C:\\Windows\\System32\\winevt\\Logs\\Application.evtx",
81
+ ];
82
+ const results = [];
83
+ for (const p of paths) {
84
+ try {
85
+ const { stdout } = await ExecTools_1.ExecTools.safeExec(`powershell -Command "(Get-Item '${p.replace(/\\/g, "\\")}' -ErrorAction SilentlyContinue).Length"`);
86
+ const size = parseInt(stdout.trim(), 10);
87
+ results.push({ path: p, size: isNaN(size) ? 0 : size, exists: true });
88
+ }
89
+ catch {
90
+ results.push({ path: p, size: 0, exists: false });
91
+ }
92
+ }
93
+ return results;
94
+ }
95
+ }
96
+ exports.SystemInfoWindowsProvider = SystemInfoWindowsProvider;
97
+ async function execStr(cmd) {
98
+ const { stdout } = await ExecTools_1.ExecTools.safeExec(cmd);
99
+ return stdout.trim();
100
+ }
101
+ //# sourceMappingURL=systemInfoWindowsProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemInfoWindowsProvider.js","sourceRoot":"","sources":["../../../src/services/providers/systemInfoWindowsProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
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.ServiceConfigController = void 0;
16
+ const inversify_1 = require("inversify");
17
+ const ServiceConfig_1 = require("../models/ServiceConfig");
18
+ const configManager_1 = require("./configManager");
19
+ const NAME_REGEX = /^[a-zA-Z][a-zA-Z0-9_-]{0,127}$/;
20
+ /**
21
+ * Orchestrates config CRUD + OS service installation via platform-aware ServiceController.
22
+ * Singleton — shares one ConfigManager and injects ServiceControllers.
23
+ */
24
+ let ServiceConfigController = class ServiceConfigController {
25
+ controllers;
26
+ configManager = new configManager_1.ConfigManager();
27
+ constructor(controllers) {
28
+ this.controllers = controllers;
29
+ }
30
+ /** List all saved service configs. */
31
+ listConfigs() {
32
+ return this.configManager.list();
33
+ }
34
+ /** Get a single config by name. */
35
+ getConfig(name) {
36
+ return this.configManager.get(name);
37
+ }
38
+ async getActiveController() {
39
+ for (const c of this.controllers) {
40
+ if (await c.isAvailable())
41
+ return c;
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Create or update a service config and its OS service.
47
+ * No name change — that logic lives on the frontend (delete → create).
48
+ * Preserves the enabled state when updating an existing service.
49
+ * @returns { ok, config?, error? }
50
+ */
51
+ async createOrUpdate(cfg) {
52
+ // Validate name
53
+ if (!NAME_REGEX.test(cfg.name)) {
54
+ return {
55
+ ok: false,
56
+ error: "Name must start with a letter and contain only letters, digits, hyphens, underscores (max 128 chars)",
57
+ };
58
+ }
59
+ // Validate command
60
+ if (!cfg.command.trim()) {
61
+ return { ok: false, error: "Command path is required" };
62
+ }
63
+ // Save config file
64
+ this.configManager.save(cfg);
65
+ // Install/update OS service (without changing enabled state)
66
+ const controller = await this.getActiveController();
67
+ if (controller) {
68
+ const execStart = (0, ServiceConfig_1.buildExecStart)(cfg);
69
+ // Check if service was already installed — preserve its enabled state
70
+ const priorStatus = await controller.getStatus(cfg.name);
71
+ const wasInstalled = priorStatus.installed;
72
+ const wasEnabled = wasInstalled && priorStatus.enabled;
73
+ const result = await controller.install(cfg.name, execStart);
74
+ if (result.error) {
75
+ // Config was saved but service install failed — keep config for retry
76
+ return { ok: false, error: result.error };
77
+ }
78
+ // Re-enable only if the service was already installed and enabled
79
+ if (wasInstalled && wasEnabled) {
80
+ const enableResult = await controller.perform(cfg.name, "enable");
81
+ if (enableResult.error) {
82
+ return { ok: false, error: enableResult.error };
83
+ }
84
+ }
85
+ }
86
+ return { ok: true, config: cfg };
87
+ }
88
+ /**
89
+ * Delete a service: stop if running → uninstall OS service → remove config.
90
+ * @returns { ok, error? }
91
+ */
92
+ async deleteService(name) {
93
+ const cfg = this.configManager.get(name);
94
+ if (!cfg) {
95
+ return { ok: false, error: `Config "${name}" not found` };
96
+ }
97
+ const controller = await this.getActiveController();
98
+ // Uninstall OS service (best-effort)
99
+ if (controller) {
100
+ const uninstallResult = await controller.uninstall(name);
101
+ if (!uninstallResult.ok) {
102
+ // Non-fatal: continue to config deletion
103
+ console.warn(`[ServiceConfigController] uninstall warning for "${name}":`, uninstallResult.error);
104
+ }
105
+ }
106
+ // Remove config file
107
+ this.configManager.delete(name);
108
+ return { ok: true };
109
+ }
110
+ };
111
+ exports.ServiceConfigController = ServiceConfigController;
112
+ exports.ServiceConfigController = ServiceConfigController = __decorate([
113
+ __param(0, (0, inversify_1.multiInject)("SERVICE_CONTROLLER")),
114
+ __metadata("design:paramtypes", [Array])
115
+ ], ServiceConfigController);
116
+ //# sourceMappingURL=serviceConfigController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceConfigController.js","sourceRoot":"","sources":["../../src/services/serviceConfigController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=serviceController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceController.js","sourceRoot":"","sources":["../../src/services/serviceController.ts"],"names":[],"mappings":""}
@@ -0,0 +1,157 @@
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.ServiceManager = void 0;
16
+ const inversify_1 = require("inversify");
17
+ const configManager_1 = require("./configManager");
18
+ const managedServicesManager_1 = require("./managedServicesManager");
19
+ const ServiceConfig_1 = require("../models/ServiceConfig");
20
+ /** Resolve all service names: managed + custom configs. */
21
+ function resolveServiceDefs(configManager, managedServices) {
22
+ const seen = new Set();
23
+ const defs = [];
24
+ // User-managed services from persistent selection
25
+ for (const name of managedServices.list()) {
26
+ if (!seen.has(name)) {
27
+ seen.add(name);
28
+ defs.push({ name });
29
+ }
30
+ }
31
+ // Custom services from configs
32
+ for (const cfg of configManager.list()) {
33
+ if (!seen.has(cfg.name)) {
34
+ seen.add(cfg.name);
35
+ defs.push({ name: cfg.name });
36
+ }
37
+ }
38
+ return defs;
39
+ }
40
+ let ServiceManager = class ServiceManager {
41
+ controllers;
42
+ configManager = new configManager_1.ConfigManager();
43
+ managedServices = new managedServicesManager_1.ManagedServicesManager();
44
+ /** Errors from initial custom install attempts — served on every getStatusList without re-checking. */
45
+ installErrors = new Map();
46
+ constructor(controllers) {
47
+ this.controllers = controllers;
48
+ }
49
+ async getActiveController() {
50
+ for (const c of this.controllers) {
51
+ if (await c.isAvailable())
52
+ return c;
53
+ }
54
+ return null;
55
+ }
56
+ getServiceDefs() {
57
+ return resolveServiceDefs(this.configManager, this.managedServices);
58
+ }
59
+ /**
60
+ * Called once at server startup. Attempts to install every custom service
61
+ * that has a config but is not yet registered in the OS. Installation errors
62
+ * are cached so that getStatusList can return them without re-checking.
63
+ */
64
+ async bootstrap() {
65
+ const controller = await this.getActiveController();
66
+ if (!controller)
67
+ return;
68
+ // Check which custom services are not installed yet
69
+ const customNames = this.configManager.list().map((c) => c.name);
70
+ const statuses = await Promise.all(customNames.map((name) => controller.getStatus(name)));
71
+ // Attempt install in parallel for all missing ones
72
+ await Promise.all(statuses.map(async (status) => {
73
+ if (status.installed)
74
+ return;
75
+ const cfg = this.configManager.get(status.name);
76
+ if (!cfg)
77
+ return;
78
+ const execStart = (0, ServiceConfig_1.buildExecStart)(cfg);
79
+ const result = await controller.install(status.name, execStart);
80
+ // If install failed, cache the error
81
+ if (result.error) {
82
+ this.installErrors.set(status.name, result.error);
83
+ }
84
+ }));
85
+ }
86
+ async getStatusList() {
87
+ const controller = await this.getActiveController();
88
+ const defs = this.getServiceDefs();
89
+ if (!controller) {
90
+ return defs.map((def) => ({
91
+ ...def,
92
+ running: false,
93
+ enabled: false,
94
+ installed: false,
95
+ error: "No service controller available on this platform",
96
+ }));
97
+ }
98
+ const results = await Promise.all(defs.map(async (def) => {
99
+ // Skip getStatus if we already know install failed — return cached error directly
100
+ const cached = this.installErrors.get(def.name);
101
+ if (cached) {
102
+ return {
103
+ ...def,
104
+ running: false,
105
+ enabled: false,
106
+ installed: false,
107
+ error: cached,
108
+ };
109
+ }
110
+ try {
111
+ const status = await controller.getStatus(def.name);
112
+ return { ...def, ...status };
113
+ }
114
+ catch {
115
+ return {
116
+ ...def,
117
+ running: false,
118
+ enabled: false,
119
+ installed: false,
120
+ error: `Failed to query service "${def.name}"`,
121
+ };
122
+ }
123
+ }));
124
+ return results;
125
+ }
126
+ async performAction(name, action) {
127
+ const defs = this.getServiceDefs();
128
+ const def = defs.find((s) => s.name === name);
129
+ if (!def) {
130
+ throw new Error(`Unknown service: ${name}`);
131
+ }
132
+ const controller = await this.getActiveController();
133
+ if (!controller) {
134
+ throw new Error("No service controller available on this platform");
135
+ }
136
+ const status = await controller.perform(name, action);
137
+ return { ...def, ...status };
138
+ }
139
+ async getJournal(name, count = 100) {
140
+ const defs = this.getServiceDefs();
141
+ const def = defs.find((s) => s.name === name);
142
+ if (!def) {
143
+ return { error: `Unknown service: ${name}` };
144
+ }
145
+ const controller = await this.getActiveController();
146
+ if (!controller) {
147
+ return { error: "No service controller available on this platform" };
148
+ }
149
+ return controller.getJournal(name, count);
150
+ }
151
+ };
152
+ exports.ServiceManager = ServiceManager;
153
+ exports.ServiceManager = ServiceManager = __decorate([
154
+ __param(0, (0, inversify_1.multiInject)("SERVICE_CONTROLLER")),
155
+ __metadata("design:paramtypes", [Array])
156
+ ], ServiceManager);
157
+ //# sourceMappingURL=serviceManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceManager.js","sourceRoot":"","sources":["../../src/services/serviceManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=systemInfoProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemInfoProvider.js","sourceRoot":"","sources":["../../src/services/systemInfoProvider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SystemService = void 0;
7
+ const os_1 = __importDefault(require("os"));
8
+ class SystemService {
9
+ snapshot = null;
10
+ readCpuTimes() {
11
+ let idle = 0;
12
+ let total = 0;
13
+ for (const cpu of os_1.default.cpus()) {
14
+ for (const _key in cpu.times) {
15
+ const val = cpu.times[_key];
16
+ total += val;
17
+ }
18
+ idle += cpu.times.idle;
19
+ }
20
+ return { idle, total };
21
+ }
22
+ async getSystemInfo() {
23
+ const now = this.readCpuTimes();
24
+ let cpuUsage = 0;
25
+ if (this.snapshot) {
26
+ const idleDelta = now.idle - this.snapshot.idle;
27
+ const totalDelta = now.total - this.snapshot.total;
28
+ cpuUsage = totalDelta > 0 ? ((1 - idleDelta / totalDelta) * 100) : 0;
29
+ }
30
+ this.snapshot = now;
31
+ const memoryTotal = os_1.default.totalmem();
32
+ const memoryUsed = memoryTotal - os_1.default.freemem();
33
+ return {
34
+ cpuUsage: Math.round(cpuUsage * 10) / 10,
35
+ memoryTotal,
36
+ memoryUsed,
37
+ memoryPercent: Math.round((memoryUsed / memoryTotal) * 1000) / 10,
38
+ };
39
+ }
40
+ }
41
+ exports.SystemService = SystemService;
42
+ //# sourceMappingURL=systemService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemService.js","sourceRoot":"","sources":["../../src/services/systemService.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AAepB,MAAa,aAAa;IAChB,QAAQ,GAAuB,IAAI,CAAC;IAEpC,YAAY;QAClB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,YAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAA8B,CAAC,CAAC;gBACtD,KAAK,IAAI,GAAG,CAAC;YACf,CAAC;YACD,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QACzB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEhC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACnD,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QAEpB,MAAM,WAAW,GAAG,YAAE,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,WAAW,GAAG,YAAE,CAAC,OAAO,EAAE,CAAC;QAE9C,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,EAAE;YACxC,WAAW;YACX,UAAU;YACV,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;SAClE,CAAC;IACJ,CAAC;CACF;AAtCD,sCAsCC"}
@@ -0,0 +1 @@
1
+ import{Ac as k,Bc as l,Cc as m,Dc as n,Ec as o,Fc as p,Gc as q,Hc as r,Ic as s,Jc as t,Kc as u,Lc as v,Mc as w,Nc as x,qc as a,rc as b,sc as c,tc as d,uc as e,vc as f,wc as g,xc as h,yc as i,zc as j}from"./chunk-JGNPKRLU.js";export{l as AnimationDriver,k as NoopAnimationDriver,u as \u0275Animation,q as \u0275AnimationEngine,w as \u0275AnimationRenderer,x as \u0275AnimationRendererFactory,m as \u0275AnimationStyleNormalizer,v as \u0275BaseAnimationRenderer,f as \u0275ENTER_CLASSNAME,g as \u0275LEAVE_CLASSNAME,n as \u0275NoopAnimationStyleNormalizer,p as \u0275TransitionAnimationPlayer,s as \u0275WebAnimationsDriver,r as \u0275WebAnimationsPlayer,o as \u0275WebAnimationsStyleNormalizer,j as \u0275allowPreviousPlayerStylesMerge,i as \u0275camelCaseToDashCase,d as \u0275containsElement,t as \u0275createEngine,a as \u0275getParentElement,e as \u0275invokeQuery,h as \u0275normalizeKeyframes,b as \u0275validateStyleProperty,c as \u0275validateWebAnimatableStyleProperty};