xray-manager 1.8.4 → 2.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/README.md +102 -42
- package/dist/cli.mjs +8587 -0
- package/dist/cli.mjs.map +7 -0
- package/package.json +13 -5
- package/dist/cli.d.ts +0 -11
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -134
- package/dist/cli.js.map +0 -1
- package/dist/commands/clash.d.ts +0 -20
- package/dist/commands/clash.d.ts.map +0 -1
- package/dist/commands/clash.js +0 -156
- package/dist/commands/clash.js.map +0 -1
- package/dist/commands/config.d.ts +0 -56
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -461
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/interactive.d.ts +0 -55
- package/dist/commands/interactive.d.ts.map +0 -1
- package/dist/commands/interactive.js +0 -418
- package/dist/commands/interactive.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -62
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -389
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/quota.d.ts +0 -54
- package/dist/commands/quota.d.ts.map +0 -1
- package/dist/commands/quota.js +0 -661
- package/dist/commands/quota.js.map +0 -1
- package/dist/commands/review.d.ts +0 -8
- package/dist/commands/review.d.ts.map +0 -1
- package/dist/commands/review.js +0 -79
- package/dist/commands/review.js.map +0 -1
- package/dist/commands/service.d.ts +0 -43
- package/dist/commands/service.d.ts.map +0 -1
- package/dist/commands/service.js +0 -202
- package/dist/commands/service.js.map +0 -1
- package/dist/commands/user.d.ts +0 -49
- package/dist/commands/user.d.ts.map +0 -1
- package/dist/commands/user.js +0 -371
- package/dist/commands/user.js.map +0 -1
- package/dist/components/dashboard-widget.d.ts +0 -21
- package/dist/components/dashboard-widget.d.ts.map +0 -1
- package/dist/components/dashboard-widget.js +0 -234
- package/dist/components/dashboard-widget.js.map +0 -1
- package/dist/components/progress-bar.d.ts +0 -67
- package/dist/components/progress-bar.d.ts.map +0 -1
- package/dist/components/progress-bar.js +0 -138
- package/dist/components/progress-bar.js.map +0 -1
- package/dist/components/user-table.d.ts +0 -8
- package/dist/components/user-table.d.ts.map +0 -1
- package/dist/components/user-table.js +0 -91
- package/dist/components/user-table.js.map +0 -1
- package/dist/config/i18n.d.ts +0 -136
- package/dist/config/i18n.d.ts.map +0 -1
- package/dist/config/i18n.js +0 -323
- package/dist/config/i18n.js.map +0 -1
- package/dist/constants/error-codes.d.ts +0 -344
- package/dist/constants/error-codes.d.ts.map +0 -1
- package/dist/constants/error-codes.js +0 -462
- package/dist/constants/error-codes.js.map +0 -1
- package/dist/constants/exit-codes.d.ts +0 -49
- package/dist/constants/exit-codes.d.ts.map +0 -1
- package/dist/constants/exit-codes.js +0 -100
- package/dist/constants/exit-codes.js.map +0 -1
- package/dist/constants/paths.d.ts +0 -63
- package/dist/constants/paths.d.ts.map +0 -1
- package/dist/constants/paths.js +0 -78
- package/dist/constants/paths.js.map +0 -1
- package/dist/constants/quota.d.ts +0 -126
- package/dist/constants/quota.d.ts.map +0 -1
- package/dist/constants/quota.js +0 -135
- package/dist/constants/quota.js.map +0 -1
- package/dist/constants/review.d.ts +0 -14
- package/dist/constants/review.d.ts.map +0 -1
- package/dist/constants/review.js +0 -33
- package/dist/constants/review.js.map +0 -1
- package/dist/constants/supported-distros.d.ts +0 -17
- package/dist/constants/supported-distros.d.ts.map +0 -1
- package/dist/constants/supported-distros.js +0 -68
- package/dist/constants/supported-distros.js.map +0 -1
- package/dist/constants/theme.d.ts +0 -34
- package/dist/constants/theme.d.ts.map +0 -1
- package/dist/constants/theme.js +0 -52
- package/dist/constants/theme.js.map +0 -1
- package/dist/constants/timeouts.d.ts +0 -84
- package/dist/constants/timeouts.d.ts.map +0 -1
- package/dist/constants/timeouts.js +0 -111
- package/dist/constants/timeouts.js.map +0 -1
- package/dist/constants/ui-symbols.d.ts +0 -47
- package/dist/constants/ui-symbols.d.ts.map +0 -1
- package/dist/constants/ui-symbols.js +0 -48
- package/dist/constants/ui-symbols.js.map +0 -1
- package/dist/services/clash-config.d.ts +0 -16
- package/dist/services/clash-config.d.ts.map +0 -1
- package/dist/services/clash-config.js +0 -107
- package/dist/services/clash-config.js.map +0 -1
- package/dist/services/config-manager.d.ts +0 -90
- package/dist/services/config-manager.d.ts.map +0 -1
- package/dist/services/config-manager.js +0 -307
- package/dist/services/config-manager.js.map +0 -1
- package/dist/services/layout-manager.d.ts +0 -94
- package/dist/services/layout-manager.d.ts.map +0 -1
- package/dist/services/layout-manager.js +0 -192
- package/dist/services/layout-manager.js.map +0 -1
- package/dist/services/log-manager.d.ts +0 -157
- package/dist/services/log-manager.d.ts.map +0 -1
- package/dist/services/log-manager.js +0 -397
- package/dist/services/log-manager.js.map +0 -1
- package/dist/services/navigation-manager.d.ts +0 -23
- package/dist/services/navigation-manager.d.ts.map +0 -1
- package/dist/services/navigation-manager.js +0 -39
- package/dist/services/navigation-manager.js.map +0 -1
- package/dist/services/platform-detector.d.ts +0 -10
- package/dist/services/platform-detector.d.ts.map +0 -1
- package/dist/services/platform-detector.js +0 -106
- package/dist/services/platform-detector.js.map +0 -1
- package/dist/services/public-ip-manager.d.ts +0 -78
- package/dist/services/public-ip-manager.d.ts.map +0 -1
- package/dist/services/public-ip-manager.js +0 -296
- package/dist/services/public-ip-manager.js.map +0 -1
- package/dist/services/quota-enforcer.d.ts +0 -86
- package/dist/services/quota-enforcer.d.ts.map +0 -1
- package/dist/services/quota-enforcer.js +0 -151
- package/dist/services/quota-enforcer.js.map +0 -1
- package/dist/services/quota-manager.d.ts +0 -101
- package/dist/services/quota-manager.d.ts.map +0 -1
- package/dist/services/quota-manager.js +0 -257
- package/dist/services/quota-manager.js.map +0 -1
- package/dist/services/review/areas/community.d.ts +0 -9
- package/dist/services/review/areas/community.d.ts.map +0 -1
- package/dist/services/review/areas/community.js +0 -59
- package/dist/services/review/areas/community.js.map +0 -1
- package/dist/services/review/areas/contribution.d.ts +0 -9
- package/dist/services/review/areas/contribution.d.ts.map +0 -1
- package/dist/services/review/areas/contribution.js +0 -107
- package/dist/services/review/areas/contribution.js.map +0 -1
- package/dist/services/review/areas/documentation.d.ts +0 -9
- package/dist/services/review/areas/documentation.d.ts.map +0 -1
- package/dist/services/review/areas/documentation.js +0 -110
- package/dist/services/review/areas/documentation.js.map +0 -1
- package/dist/services/review/areas/license.d.ts +0 -9
- package/dist/services/review/areas/license.d.ts.map +0 -1
- package/dist/services/review/areas/license.js +0 -86
- package/dist/services/review/areas/license.js.map +0 -1
- package/dist/services/review/areas/quality.d.ts +0 -9
- package/dist/services/review/areas/quality.d.ts.map +0 -1
- package/dist/services/review/areas/quality.js +0 -84
- package/dist/services/review/areas/quality.js.map +0 -1
- package/dist/services/review/areas/security.d.ts +0 -9
- package/dist/services/review/areas/security.d.ts.map +0 -1
- package/dist/services/review/areas/security.js +0 -64
- package/dist/services/review/areas/security.js.map +0 -1
- package/dist/services/review/evidence.d.ts +0 -10
- package/dist/services/review/evidence.d.ts.map +0 -1
- package/dist/services/review/evidence.js +0 -40
- package/dist/services/review/evidence.js.map +0 -1
- package/dist/services/review/recommendations-filter.d.ts +0 -12
- package/dist/services/review/recommendations-filter.d.ts.map +0 -1
- package/dist/services/review/recommendations-filter.js +0 -20
- package/dist/services/review/recommendations-filter.js.map +0 -1
- package/dist/services/review/repo-scanner.d.ts +0 -8
- package/dist/services/review/repo-scanner.d.ts.map +0 -1
- package/dist/services/review/repo-scanner.js +0 -15
- package/dist/services/review/repo-scanner.js.map +0 -1
- package/dist/services/review/report-renderer.d.ts +0 -15
- package/dist/services/review/report-renderer.d.ts.map +0 -1
- package/dist/services/review/report-renderer.js +0 -120
- package/dist/services/review/report-renderer.js.map +0 -1
- package/dist/services/review/review-engine.d.ts +0 -15
- package/dist/services/review/review-engine.d.ts.map +0 -1
- package/dist/services/review/review-engine.js +0 -61
- package/dist/services/review/review-engine.js.map +0 -1
- package/dist/services/review/summary-builder.d.ts +0 -8
- package/dist/services/review/summary-builder.d.ts.map +0 -1
- package/dist/services/review/summary-builder.js +0 -26
- package/dist/services/review/summary-builder.js.map +0 -1
- package/dist/services/screen-manager.d.ts +0 -13
- package/dist/services/screen-manager.d.ts.map +0 -1
- package/dist/services/screen-manager.js +0 -42
- package/dist/services/screen-manager.js.map +0 -1
- package/dist/services/stats-config-manager.d.ts +0 -110
- package/dist/services/stats-config-manager.d.ts.map +0 -1
- package/dist/services/stats-config-manager.js +0 -443
- package/dist/services/stats-config-manager.js.map +0 -1
- package/dist/services/systemd-manager.d.ts +0 -197
- package/dist/services/systemd-manager.d.ts.map +0 -1
- package/dist/services/systemd-manager.js +0 -458
- package/dist/services/systemd-manager.js.map +0 -1
- package/dist/services/traffic-manager.d.ts +0 -106
- package/dist/services/traffic-manager.d.ts.map +0 -1
- package/dist/services/traffic-manager.js +0 -368
- package/dist/services/traffic-manager.js.map +0 -1
- package/dist/services/user-manager.d.ts +0 -90
- package/dist/services/user-manager.d.ts.map +0 -1
- package/dist/services/user-manager.js +0 -347
- package/dist/services/user-manager.js.map +0 -1
- package/dist/services/user-metadata-manager.d.ts +0 -85
- package/dist/services/user-metadata-manager.d.ts.map +0 -1
- package/dist/services/user-metadata-manager.js +0 -181
- package/dist/services/user-metadata-manager.js.map +0 -1
- package/dist/types/config.d.ts +0 -340
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -7
- package/dist/types/config.js.map +0 -1
- package/dist/types/layout.d.ts +0 -119
- package/dist/types/layout.d.ts.map +0 -1
- package/dist/types/layout.js +0 -142
- package/dist/types/layout.js.map +0 -1
- package/dist/types/platform.d.ts +0 -72
- package/dist/types/platform.d.ts.map +0 -1
- package/dist/types/platform.js +0 -38
- package/dist/types/platform.js.map +0 -1
- package/dist/types/quota.d.ts +0 -158
- package/dist/types/quota.d.ts.map +0 -1
- package/dist/types/quota.js +0 -26
- package/dist/types/quota.js.map +0 -1
- package/dist/types/review.d.ts +0 -62
- package/dist/types/review.d.ts.map +0 -1
- package/dist/types/review.js +0 -8
- package/dist/types/review.js.map +0 -1
- package/dist/types/server-config.d.ts +0 -53
- package/dist/types/server-config.d.ts.map +0 -1
- package/dist/types/server-config.js +0 -19
- package/dist/types/server-config.js.map +0 -1
- package/dist/types/service.d.ts +0 -96
- package/dist/types/service.d.ts.map +0 -1
- package/dist/types/service.js +0 -7
- package/dist/types/service.js.map +0 -1
- package/dist/types/terminal.d.ts +0 -35
- package/dist/types/terminal.d.ts.map +0 -1
- package/dist/types/terminal.js +0 -20
- package/dist/types/terminal.js.map +0 -1
- package/dist/types/ui-components.d.ts +0 -53
- package/dist/types/ui-components.d.ts.map +0 -1
- package/dist/types/ui-components.js +0 -3
- package/dist/types/ui-components.js.map +0 -1
- package/dist/types/user-metadata.d.ts +0 -43
- package/dist/types/user-metadata.d.ts.map +0 -1
- package/dist/types/user-metadata.js +0 -17
- package/dist/types/user-metadata.js.map +0 -1
- package/dist/types/user.d.ts +0 -134
- package/dist/types/user.d.ts.map +0 -1
- package/dist/types/user.js +0 -7
- package/dist/types/user.js.map +0 -1
- package/dist/utils/clipboard.d.ts +0 -21
- package/dist/utils/clipboard.d.ts.map +0 -1
- package/dist/utils/clipboard.js +0 -45
- package/dist/utils/clipboard.js.map +0 -1
- package/dist/utils/error-formatter.d.ts +0 -60
- package/dist/utils/error-formatter.d.ts.map +0 -1
- package/dist/utils/error-formatter.js +0 -244
- package/dist/utils/error-formatter.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -92
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -143
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/firewall.d.ts +0 -14
- package/dist/utils/firewall.d.ts.map +0 -1
- package/dist/utils/firewall.js +0 -78
- package/dist/utils/firewall.js.map +0 -1
- package/dist/utils/format.d.ts +0 -93
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js +0 -240
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/icons.d.ts +0 -53
- package/dist/utils/icons.d.ts.map +0 -1
- package/dist/utils/icons.js +0 -143
- package/dist/utils/icons.js.map +0 -1
- package/dist/utils/layout.d.ts +0 -142
- package/dist/utils/layout.d.ts.map +0 -1
- package/dist/utils/layout.js +0 -381
- package/dist/utils/layout.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -160
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -351
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/network.d.ts +0 -39
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js +0 -227
- package/dist/utils/network.js.map +0 -1
- package/dist/utils/os-detection.d.ts +0 -10
- package/dist/utils/os-detection.d.ts.map +0 -1
- package/dist/utils/os-detection.js +0 -86
- package/dist/utils/os-detection.js.map +0 -1
- package/dist/utils/preflight.d.ts +0 -57
- package/dist/utils/preflight.d.ts.map +0 -1
- package/dist/utils/preflight.js +0 -215
- package/dist/utils/preflight.js.map +0 -1
- package/dist/utils/repo-scan.d.ts +0 -54
- package/dist/utils/repo-scan.d.ts.map +0 -1
- package/dist/utils/repo-scan.js +0 -165
- package/dist/utils/repo-scan.js.map +0 -1
- package/dist/utils/report-output.d.ts +0 -13
- package/dist/utils/report-output.d.ts.map +0 -1
- package/dist/utils/report-output.js +0 -33
- package/dist/utils/report-output.js.map +0 -1
- package/dist/utils/review-id.d.ts +0 -8
- package/dist/utils/review-id.d.ts.map +0 -1
- package/dist/utils/review-id.js +0 -17
- package/dist/utils/review-id.js.map +0 -1
- package/dist/utils/splash.d.ts +0 -21
- package/dist/utils/splash.d.ts.map +0 -1
- package/dist/utils/splash.js +0 -179
- package/dist/utils/splash.js.map +0 -1
- package/dist/utils/terminal.d.ts +0 -32
- package/dist/utils/terminal.d.ts.map +0 -1
- package/dist/utils/terminal.js +0 -93
- package/dist/utils/terminal.js.map +0 -1
- package/dist/utils/traffic-formatter.d.ts +0 -45
- package/dist/utils/traffic-formatter.d.ts.map +0 -1
- package/dist/utils/traffic-formatter.js +0 -131
- package/dist/utils/traffic-formatter.js.map +0 -1
- package/dist/utils/validator.d.ts +0 -102
- package/dist/utils/validator.d.ts.map +0 -1
- package/dist/utils/validator.js +0 -238
- package/dist/utils/validator.js.map +0 -1
- package/dist/utils/vless-link.d.ts +0 -27
- package/dist/utils/vless-link.d.ts.map +0 -1
- package/dist/utils/vless-link.js +0 -69
- package/dist/utils/vless-link.js.map +0 -1
- package/dist/utils/which.d.ts +0 -13
- package/dist/utils/which.d.ts.map +0 -1
- package/dist/utils/which.js +0 -28
- package/dist/utils/which.js.map +0 -1
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* ConfigManager - Xray Configuration File Management
|
|
4
|
-
*
|
|
5
|
-
* Provides safe interface to read, write, validate, and backup Xray config
|
|
6
|
-
*
|
|
7
|
-
* @module services/config-manager
|
|
8
|
-
*/
|
|
9
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
-
}
|
|
15
|
-
Object.defineProperty(o, k2, desc);
|
|
16
|
-
}) : (function(o, m, k, k2) {
|
|
17
|
-
if (k2 === undefined) k2 = k;
|
|
18
|
-
o[k2] = m[k];
|
|
19
|
-
}));
|
|
20
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
-
}) : function(o, v) {
|
|
23
|
-
o["default"] = v;
|
|
24
|
-
});
|
|
25
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
-
var ownKeys = function(o) {
|
|
27
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
-
var ar = [];
|
|
29
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
-
return ar;
|
|
31
|
-
};
|
|
32
|
-
return ownKeys(o);
|
|
33
|
-
};
|
|
34
|
-
return function (mod) {
|
|
35
|
-
if (mod && mod.__esModule) return mod;
|
|
36
|
-
var result = {};
|
|
37
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
-
__setModuleDefault(result, mod);
|
|
39
|
-
return result;
|
|
40
|
-
};
|
|
41
|
-
})();
|
|
42
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
exports.ConfigManager = void 0;
|
|
44
|
-
const promises_1 = require("fs/promises");
|
|
45
|
-
const fs_1 = require("fs");
|
|
46
|
-
const path_1 = require("path");
|
|
47
|
-
const paths_1 = require("../constants/paths");
|
|
48
|
-
const errors_1 = require("../utils/errors");
|
|
49
|
-
const error_codes_1 = require("../constants/error-codes");
|
|
50
|
-
/**
|
|
51
|
-
* ConfigManager - Safe configuration file operations
|
|
52
|
-
*/
|
|
53
|
-
class ConfigManager {
|
|
54
|
-
/**
|
|
55
|
-
* Create a new ConfigManager
|
|
56
|
-
*
|
|
57
|
-
* @param configPath - Path to config file (default: /usr/local/etc/xray/config.json)
|
|
58
|
-
*/
|
|
59
|
-
constructor(configPath) {
|
|
60
|
-
this.configPath = configPath || paths_1.DEFAULT_PATHS.CONFIG_FILE;
|
|
61
|
-
this.backupDir = paths_1.DEFAULT_PATHS.BACKUP_DIR || '/var/backups/xray';
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Read and parse config file
|
|
65
|
-
*
|
|
66
|
-
* @returns Parsed configuration object
|
|
67
|
-
*/
|
|
68
|
-
async readConfig() {
|
|
69
|
-
try {
|
|
70
|
-
const content = await (0, promises_1.readFile)(this.configPath, 'utf-8');
|
|
71
|
-
const config = JSON.parse(content);
|
|
72
|
-
return config;
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
if (error.code === 'ENOENT') {
|
|
76
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_NOT_FOUND, this.configPath);
|
|
77
|
-
}
|
|
78
|
-
else if (error.code === 'EACCES') {
|
|
79
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_NO_READ_PERMISSION, this.configPath);
|
|
80
|
-
}
|
|
81
|
-
else if (error instanceof SyntaxError) {
|
|
82
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_INVALID_JSON, error.message);
|
|
83
|
-
}
|
|
84
|
-
throw error;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Write config to file with secure permissions
|
|
89
|
-
*
|
|
90
|
-
* @param config - Configuration object to write
|
|
91
|
-
*/
|
|
92
|
-
async writeConfig(config) {
|
|
93
|
-
try {
|
|
94
|
-
// Validate config before writing
|
|
95
|
-
this.validateConfig(config);
|
|
96
|
-
// Ensure directory exists
|
|
97
|
-
const dir = (0, path_1.dirname)(this.configPath);
|
|
98
|
-
if (!(0, fs_1.existsSync)(dir)) {
|
|
99
|
-
await (0, promises_1.mkdir)(dir, { recursive: true });
|
|
100
|
-
}
|
|
101
|
-
// Write with pretty formatting
|
|
102
|
-
const content = JSON.stringify(config, null, 2);
|
|
103
|
-
await (0, promises_1.writeFile)(this.configPath, content, 'utf-8');
|
|
104
|
-
// Set secure permissions (600 = rw-------)
|
|
105
|
-
await (0, promises_1.chmod)(this.configPath, 0o600);
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
if (error.code === 'EACCES') {
|
|
109
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_NO_WRITE_PERMISSION, this.configPath);
|
|
110
|
-
}
|
|
111
|
-
throw error;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Validate configuration structure
|
|
116
|
-
*
|
|
117
|
-
* @param config - Configuration to validate
|
|
118
|
-
* @throws Error if validation fails
|
|
119
|
-
*/
|
|
120
|
-
validateConfig(config) {
|
|
121
|
-
if (!config || typeof config !== 'object') {
|
|
122
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_INVALID_STRUCTURE, '配置必须是一个对象');
|
|
123
|
-
}
|
|
124
|
-
// Check for required top-level fields
|
|
125
|
-
if (!config.inbounds || !Array.isArray(config.inbounds)) {
|
|
126
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_INVALID_STRUCTURE, '缺少 inbounds 数组');
|
|
127
|
-
}
|
|
128
|
-
if (!config.outbounds || !Array.isArray(config.outbounds)) {
|
|
129
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_INVALID_STRUCTURE, '缺少 outbounds 数组');
|
|
130
|
-
}
|
|
131
|
-
// Validate inbounds
|
|
132
|
-
for (const inbound of config.inbounds) {
|
|
133
|
-
if (!inbound.protocol) {
|
|
134
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_INVALID_STRUCTURE, 'inbound 缺少 protocol');
|
|
135
|
-
}
|
|
136
|
-
if (typeof inbound.port !== 'number') {
|
|
137
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_INVALID_STRUCTURE, 'inbound 缺少有效 port');
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
// Validate outbounds
|
|
141
|
-
for (const outbound of config.outbounds) {
|
|
142
|
-
if (!outbound.protocol) {
|
|
143
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_INVALID_STRUCTURE, 'outbound 缺少 protocol');
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Backup configuration file
|
|
149
|
-
*
|
|
150
|
-
* @returns Path to backup file
|
|
151
|
-
*/
|
|
152
|
-
async backupConfig() {
|
|
153
|
-
try {
|
|
154
|
-
// Ensure backup directory exists
|
|
155
|
-
if (!(0, fs_1.existsSync)(this.backupDir)) {
|
|
156
|
-
await (0, promises_1.mkdir)(this.backupDir, { recursive: true, mode: 0o700 });
|
|
157
|
-
}
|
|
158
|
-
// Generate timestamp-based backup filename
|
|
159
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
160
|
-
const backupPath = (0, path_1.join)(this.backupDir, `config.${timestamp}.json`);
|
|
161
|
-
// Read current config
|
|
162
|
-
const config = await this.readConfig();
|
|
163
|
-
// Write backup
|
|
164
|
-
const content = JSON.stringify(config, null, 2);
|
|
165
|
-
await (0, promises_1.writeFile)(backupPath, content, 'utf-8');
|
|
166
|
-
await (0, promises_1.chmod)(backupPath, 0o600);
|
|
167
|
-
return backupPath;
|
|
168
|
-
}
|
|
169
|
-
catch (error) {
|
|
170
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_BACKUP_FAILED, error.message);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* List available backups
|
|
175
|
-
*
|
|
176
|
-
* @returns Array of backup file paths
|
|
177
|
-
*/
|
|
178
|
-
async listBackups() {
|
|
179
|
-
try {
|
|
180
|
-
if (!(0, fs_1.existsSync)(this.backupDir)) {
|
|
181
|
-
return [];
|
|
182
|
-
}
|
|
183
|
-
const files = await (0, promises_1.readdir)(this.backupDir);
|
|
184
|
-
const backups = files
|
|
185
|
-
.filter((file) => file.startsWith('config.') && file.endsWith('.json'))
|
|
186
|
-
.map((file) => (0, path_1.join)(this.backupDir, file))
|
|
187
|
-
.sort()
|
|
188
|
-
.reverse(); // Most recent first
|
|
189
|
-
return backups;
|
|
190
|
-
}
|
|
191
|
-
catch (error) {
|
|
192
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_BACKUP_FAILED, error.message);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Restore configuration from backup
|
|
197
|
-
*
|
|
198
|
-
* @param backupPath - Path to backup file
|
|
199
|
-
*/
|
|
200
|
-
async restoreConfig(backupPath) {
|
|
201
|
-
try {
|
|
202
|
-
// Verify backup file exists
|
|
203
|
-
await (0, promises_1.access)(backupPath);
|
|
204
|
-
// Backup current config first (pre-restore backup)
|
|
205
|
-
await this.backupConfig();
|
|
206
|
-
// Read backup content
|
|
207
|
-
const content = await (0, promises_1.readFile)(backupPath, 'utf-8');
|
|
208
|
-
const config = JSON.parse(content);
|
|
209
|
-
// Validate and write
|
|
210
|
-
await this.writeConfig(config);
|
|
211
|
-
}
|
|
212
|
-
catch (error) {
|
|
213
|
-
throw new errors_1.ConfigError(error_codes_1.ConfigErrors.CONFIG_RESTORE_FAILED, error.message);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Modify a configuration item
|
|
218
|
-
*
|
|
219
|
-
* @param path - Dot-separated path to config item (e.g., "log.loglevel")
|
|
220
|
-
* @param value - New value
|
|
221
|
-
*/
|
|
222
|
-
async modifyConfigItem(path, value) {
|
|
223
|
-
const config = await this.readConfig();
|
|
224
|
-
// Split path and navigate to parent object
|
|
225
|
-
const parts = path.split('.');
|
|
226
|
-
let current = config;
|
|
227
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
228
|
-
if (!current[parts[i]]) {
|
|
229
|
-
current[parts[i]] = {};
|
|
230
|
-
}
|
|
231
|
-
current = current[parts[i]];
|
|
232
|
-
}
|
|
233
|
-
// Set value
|
|
234
|
-
const lastPart = parts[parts.length - 1];
|
|
235
|
-
current[lastPart] = value;
|
|
236
|
-
// Validate and write
|
|
237
|
-
await this.writeConfig(config);
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Get formatted configuration for display
|
|
241
|
-
*
|
|
242
|
-
* @returns Pretty-printed JSON string
|
|
243
|
-
*/
|
|
244
|
-
async getFormattedConfig() {
|
|
245
|
-
const config = await this.readConfig();
|
|
246
|
-
return JSON.stringify(config, null, 2);
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* List available backups with metadata
|
|
250
|
-
*
|
|
251
|
-
* @returns Array of backup info objects
|
|
252
|
-
*/
|
|
253
|
-
async listBackupsWithInfo() {
|
|
254
|
-
const backupPaths = await this.listBackups();
|
|
255
|
-
const backupsWithInfo = [];
|
|
256
|
-
for (const backupPath of backupPaths) {
|
|
257
|
-
try {
|
|
258
|
-
const stats = await Promise.resolve().then(() => __importStar(require('fs/promises'))).then((fs) => fs.stat(backupPath));
|
|
259
|
-
const filename = backupPath.split('/').pop() || '';
|
|
260
|
-
// Extract timestamp from filename: config.2024-01-15T10-30-00-000Z.json
|
|
261
|
-
let createdAt = stats.mtime;
|
|
262
|
-
const timestampMatch = filename.match(/config\.(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2})/);
|
|
263
|
-
if (timestampMatch) {
|
|
264
|
-
const isoString = timestampMatch[1].replace(/-/g, (match, offset) => {
|
|
265
|
-
// Replace dashes in time portion with colons
|
|
266
|
-
return offset > 10 ? ':' : '-';
|
|
267
|
-
});
|
|
268
|
-
try {
|
|
269
|
-
createdAt = new Date(isoString);
|
|
270
|
-
}
|
|
271
|
-
catch {
|
|
272
|
-
// Use file mtime as fallback
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
backupsWithInfo.push({
|
|
276
|
-
path: backupPath,
|
|
277
|
-
filename,
|
|
278
|
-
createdAt,
|
|
279
|
-
size: stats.size,
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
catch {
|
|
283
|
-
// Skip files we can't stat
|
|
284
|
-
continue;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
return backupsWithInfo;
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Restore configuration from backup with optional service restart
|
|
291
|
-
*
|
|
292
|
-
* @param backupPath - Path to backup file
|
|
293
|
-
* @param restartService - Whether to restart service after restore (default: true)
|
|
294
|
-
*/
|
|
295
|
-
async restoreFromBackup(backupPath, restartService = true) {
|
|
296
|
-
// First restore the config
|
|
297
|
-
await this.restoreConfig(backupPath);
|
|
298
|
-
// Optionally restart service
|
|
299
|
-
if (restartService) {
|
|
300
|
-
const { SystemdManager } = await Promise.resolve().then(() => __importStar(require('./systemd-manager')));
|
|
301
|
-
const systemd = new SystemdManager(paths_1.DEFAULT_PATHS.SERVICE_NAME);
|
|
302
|
-
await systemd.restart();
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
exports.ConfigManager = ConfigManager;
|
|
307
|
-
//# sourceMappingURL=config-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/services/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Layout Manager Service
|
|
3
|
-
*
|
|
4
|
-
* Manages terminal layout detection, caching, and resize events
|
|
5
|
-
* Feature: 005-ui-layout-expansion
|
|
6
|
-
*/
|
|
7
|
-
import type { TerminalLayout, ContentRegion } from '../types/layout';
|
|
8
|
-
import { LayoutMode } from '../types/layout';
|
|
9
|
-
/**
|
|
10
|
-
* Terminal size information
|
|
11
|
-
*/
|
|
12
|
-
export interface TerminalSize {
|
|
13
|
-
width: number;
|
|
14
|
-
height: number;
|
|
15
|
-
isTTY: boolean;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Layout options configuration
|
|
19
|
-
*/
|
|
20
|
-
export interface LayoutOptions {
|
|
21
|
-
forceMode?: LayoutMode;
|
|
22
|
-
columnGap?: number;
|
|
23
|
-
enableCache?: boolean;
|
|
24
|
-
cacheTTL?: number;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Resize callback function type
|
|
28
|
-
*/
|
|
29
|
-
export type ResizeCallback = (layout: TerminalLayout) => void;
|
|
30
|
-
/**
|
|
31
|
-
* Layout Manager class
|
|
32
|
-
*
|
|
33
|
-
* Singleton service for managing terminal layouts
|
|
34
|
-
*/
|
|
35
|
-
export declare class LayoutManager {
|
|
36
|
-
private currentLayout;
|
|
37
|
-
private layoutCache;
|
|
38
|
-
private resizeCallbacks;
|
|
39
|
-
private resizeTimer;
|
|
40
|
-
/**
|
|
41
|
-
* Detect current terminal size
|
|
42
|
-
*/
|
|
43
|
-
detectTerminalSize(): TerminalSize;
|
|
44
|
-
/**
|
|
45
|
-
* Calculate layout mode based on terminal width
|
|
46
|
-
*/
|
|
47
|
-
calculateLayoutMode(width: number): LayoutMode;
|
|
48
|
-
/**
|
|
49
|
-
* Create a new layout configuration
|
|
50
|
-
*/
|
|
51
|
-
createLayout(mode: LayoutMode, regions: ContentRegion[], options?: LayoutOptions): TerminalLayout;
|
|
52
|
-
/**
|
|
53
|
-
* Get current cached layout
|
|
54
|
-
*/
|
|
55
|
-
getCurrentLayout(): TerminalLayout | null;
|
|
56
|
-
/**
|
|
57
|
-
* Clear layout cache
|
|
58
|
-
*/
|
|
59
|
-
clearCache(): void;
|
|
60
|
-
/**
|
|
61
|
-
* Refresh layout (re-detect and re-create)
|
|
62
|
-
*/
|
|
63
|
-
refreshLayout(regions?: ContentRegion[], options?: LayoutOptions): TerminalLayout;
|
|
64
|
-
/**
|
|
65
|
-
* Register resize event listener with debounce
|
|
66
|
-
*/
|
|
67
|
-
onResize(callback: ResizeCallback): () => void;
|
|
68
|
-
/**
|
|
69
|
-
* Handle resize event with debounce
|
|
70
|
-
*/
|
|
71
|
-
private handleResize;
|
|
72
|
-
/**
|
|
73
|
-
* Calculate usable content size excluding reserved header space
|
|
74
|
-
* @param reservedRows - Number of rows reserved for header/dashboard
|
|
75
|
-
*/
|
|
76
|
-
getContentSize(reservedRows?: number): {
|
|
77
|
-
width: number;
|
|
78
|
-
height: number;
|
|
79
|
-
};
|
|
80
|
-
/**
|
|
81
|
-
* Validate terminal size meets minimum requirements
|
|
82
|
-
*/
|
|
83
|
-
validateTerminalSize(size: TerminalSize): {
|
|
84
|
-
isValid: boolean;
|
|
85
|
-
message?: string;
|
|
86
|
-
suggestion?: string;
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Singleton instance
|
|
91
|
-
*/
|
|
92
|
-
declare const _default: LayoutManager;
|
|
93
|
-
export default _default;
|
|
94
|
-
//# sourceMappingURL=layout-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layout-manager.d.ts","sourceRoot":"","sources":["../../src/services/layout-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,UAAU,EAKX,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;AAO9D;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,WAAW,CAAyE;IAC5F,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,WAAW,CAA+B;IAElD;;OAEG;IACI,kBAAkB,IAAI,YAAY;IAmBzC;;OAEG;IACI,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAUrD;;OAEG;IACI,YAAY,CACjB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,aAAa,EAAE,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc;IAqCjB;;OAEG;IACI,gBAAgB,IAAI,cAAc,GAAG,IAAI;IAIhD;;OAEG;IACI,UAAU,IAAI,IAAI;IAIzB;;OAEG;IACI,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,cAAc;IAQxF;;OAEG;IACI,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAsBrD;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;;OAGG;IACI,cAAc,CAAC,YAAY,GAAE,MAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAQlF;;OAEG;IACI,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG;QAC/C,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;CAqBF;AAED;;GAEG;;AACH,wBAAmC"}
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Layout Manager Service
|
|
4
|
-
*
|
|
5
|
-
* Manages terminal layout detection, caching, and resize events
|
|
6
|
-
* Feature: 005-ui-layout-expansion
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.LayoutManager = void 0;
|
|
10
|
-
const layout_1 = require("../types/layout");
|
|
11
|
-
/**
|
|
12
|
-
* Resize debounce delay (300ms as per research.md)
|
|
13
|
-
*/
|
|
14
|
-
const RESIZE_DEBOUNCE_MS = 300;
|
|
15
|
-
/**
|
|
16
|
-
* Layout Manager class
|
|
17
|
-
*
|
|
18
|
-
* Singleton service for managing terminal layouts
|
|
19
|
-
*/
|
|
20
|
-
class LayoutManager {
|
|
21
|
-
constructor() {
|
|
22
|
-
this.currentLayout = null;
|
|
23
|
-
this.layoutCache = new Map();
|
|
24
|
-
this.resizeCallbacks = [];
|
|
25
|
-
this.resizeTimer = null;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Detect current terminal size
|
|
29
|
-
*/
|
|
30
|
-
detectTerminalSize() {
|
|
31
|
-
const isTTY = process.stdout.isTTY ?? false;
|
|
32
|
-
if (isTTY && process.stdout.columns && process.stdout.rows) {
|
|
33
|
-
return {
|
|
34
|
-
width: process.stdout.columns,
|
|
35
|
-
height: process.stdout.rows,
|
|
36
|
-
isTTY: true,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
// Fallback to default size
|
|
40
|
-
return {
|
|
41
|
-
width: layout_1.DEFAULT_LAYOUT.width,
|
|
42
|
-
height: layout_1.DEFAULT_LAYOUT.height,
|
|
43
|
-
isTTY,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Calculate layout mode based on terminal width
|
|
48
|
-
*/
|
|
49
|
-
calculateLayoutMode(width) {
|
|
50
|
-
if (width < layout_1.LAYOUT_MODE_THRESHOLDS.STANDARD_MIN) {
|
|
51
|
-
return layout_1.LayoutMode.COMPACT;
|
|
52
|
-
}
|
|
53
|
-
else if (width > layout_1.LAYOUT_MODE_THRESHOLDS.STANDARD_MAX) {
|
|
54
|
-
return layout_1.LayoutMode.WIDE;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return layout_1.LayoutMode.STANDARD;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Create a new layout configuration
|
|
62
|
-
*/
|
|
63
|
-
createLayout(mode, regions, options) {
|
|
64
|
-
const size = this.detectTerminalSize();
|
|
65
|
-
// Determine columns based on mode
|
|
66
|
-
let columns = 1;
|
|
67
|
-
if (mode === layout_1.LayoutMode.WIDE) {
|
|
68
|
-
columns = 2; // Default to 2 columns for WIDE mode
|
|
69
|
-
}
|
|
70
|
-
// Allow force mode override
|
|
71
|
-
const actualMode = options?.forceMode ?? mode;
|
|
72
|
-
const layout = {
|
|
73
|
-
width: size.width,
|
|
74
|
-
height: size.height,
|
|
75
|
-
mode: actualMode,
|
|
76
|
-
columns,
|
|
77
|
-
regions,
|
|
78
|
-
timestamp: Date.now(),
|
|
79
|
-
};
|
|
80
|
-
// Validate before returning
|
|
81
|
-
(0, layout_1.validateLayout)(layout);
|
|
82
|
-
// Cache if enabled
|
|
83
|
-
if (options?.enableCache !== false) {
|
|
84
|
-
const cacheKey = `${actualMode}-${regions.length}`;
|
|
85
|
-
this.layoutCache.set(cacheKey, {
|
|
86
|
-
layout,
|
|
87
|
-
timestamp: Date.now(),
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
this.currentLayout = layout;
|
|
91
|
-
return layout;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Get current cached layout
|
|
95
|
-
*/
|
|
96
|
-
getCurrentLayout() {
|
|
97
|
-
return this.currentLayout;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Clear layout cache
|
|
101
|
-
*/
|
|
102
|
-
clearCache() {
|
|
103
|
-
this.layoutCache.clear();
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Refresh layout (re-detect and re-create)
|
|
107
|
-
*/
|
|
108
|
-
refreshLayout(regions, options) {
|
|
109
|
-
const size = this.detectTerminalSize();
|
|
110
|
-
const mode = this.calculateLayoutMode(size.width);
|
|
111
|
-
const regionsToUse = regions ?? this.currentLayout?.regions ?? [];
|
|
112
|
-
return this.createLayout(mode, regionsToUse, options);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Register resize event listener with debounce
|
|
116
|
-
*/
|
|
117
|
-
onResize(callback) {
|
|
118
|
-
this.resizeCallbacks.push(callback);
|
|
119
|
-
// Set up resize listener if this is the first callback
|
|
120
|
-
if (this.resizeCallbacks.length === 1) {
|
|
121
|
-
process.stdout.on('resize', this.handleResize.bind(this));
|
|
122
|
-
}
|
|
123
|
-
// Return unsubscribe function
|
|
124
|
-
return () => {
|
|
125
|
-
const index = this.resizeCallbacks.indexOf(callback);
|
|
126
|
-
if (index > -1) {
|
|
127
|
-
this.resizeCallbacks.splice(index, 1);
|
|
128
|
-
}
|
|
129
|
-
// Remove listener if no more callbacks
|
|
130
|
-
if (this.resizeCallbacks.length === 0) {
|
|
131
|
-
process.stdout.off('resize', this.handleResize.bind(this));
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Handle resize event with debounce
|
|
137
|
-
*/
|
|
138
|
-
handleResize() {
|
|
139
|
-
// Clear existing timer
|
|
140
|
-
if (this.resizeTimer) {
|
|
141
|
-
clearTimeout(this.resizeTimer);
|
|
142
|
-
}
|
|
143
|
-
// Set new timer
|
|
144
|
-
this.resizeTimer = setTimeout(() => {
|
|
145
|
-
const newLayout = this.refreshLayout();
|
|
146
|
-
// Notify all callbacks
|
|
147
|
-
for (const callback of this.resizeCallbacks) {
|
|
148
|
-
callback(newLayout);
|
|
149
|
-
}
|
|
150
|
-
this.resizeTimer = null;
|
|
151
|
-
}, RESIZE_DEBOUNCE_MS);
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Calculate usable content size excluding reserved header space
|
|
155
|
-
* @param reservedRows - Number of rows reserved for header/dashboard
|
|
156
|
-
*/
|
|
157
|
-
getContentSize(reservedRows = 0) {
|
|
158
|
-
const size = this.detectTerminalSize();
|
|
159
|
-
return {
|
|
160
|
-
width: size.width,
|
|
161
|
-
height: Math.max(0, size.height - reservedRows),
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Validate terminal size meets minimum requirements
|
|
166
|
-
*/
|
|
167
|
-
validateTerminalSize(size) {
|
|
168
|
-
if (size.width < layout_1.MIN_TERMINAL_SIZE.width) {
|
|
169
|
-
return {
|
|
170
|
-
isValid: false,
|
|
171
|
-
message: `Terminal too narrow (${size.width} cols). Minimum: ${layout_1.MIN_TERMINAL_SIZE.width} cols.`,
|
|
172
|
-
suggestion: `Please resize your terminal to at least ${layout_1.MIN_TERMINAL_SIZE.width}x${layout_1.MIN_TERMINAL_SIZE.height} for optimal display.`,
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
if (size.height < layout_1.MIN_TERMINAL_SIZE.height) {
|
|
176
|
-
return {
|
|
177
|
-
isValid: false,
|
|
178
|
-
message: `Terminal too short (${size.height} rows). Minimum: ${layout_1.MIN_TERMINAL_SIZE.height} rows.`,
|
|
179
|
-
suggestion: `Please resize your terminal to at least ${layout_1.MIN_TERMINAL_SIZE.width}x${layout_1.MIN_TERMINAL_SIZE.height} for optimal display.`,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
return {
|
|
183
|
-
isValid: true,
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
exports.LayoutManager = LayoutManager;
|
|
188
|
-
/**
|
|
189
|
-
* Singleton instance
|
|
190
|
-
*/
|
|
191
|
-
exports.default = new LayoutManager();
|
|
192
|
-
//# sourceMappingURL=layout-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layout-manager.js","sourceRoot":"","sources":["../../src/services/layout-manager.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,4CAMyB;AA2BzB;;GAEG;AACH,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;GAIG;AACH,MAAa,aAAa;IAA1B;QACU,kBAAa,GAA0B,IAAI,CAAC;QAC5C,gBAAW,GAA+D,IAAI,GAAG,EAAE,CAAC;QACpF,oBAAe,GAAqB,EAAE,CAAC;QACvC,gBAAW,GAA0B,IAAI,CAAC;IAiMpD,CAAC;IA/LC;;OAEG;IACI,kBAAkB;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;QAE5C,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3D,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;gBAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;gBAC3B,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,OAAO;YACL,KAAK,EAAE,uBAAc,CAAC,KAAK;YAC3B,MAAM,EAAE,uBAAc,CAAC,MAAM;YAC7B,KAAK;SACN,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,KAAa;QACtC,IAAI,KAAK,GAAG,+BAAsB,CAAC,YAAY,EAAE,CAAC;YAChD,OAAO,mBAAU,CAAC,OAAO,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,GAAG,+BAAsB,CAAC,YAAY,EAAE,CAAC;YACvD,OAAO,mBAAU,CAAC,IAAI,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,mBAAU,CAAC,QAAQ,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACI,YAAY,CACjB,IAAgB,EAChB,OAAwB,EACxB,OAAuB;QAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAEvC,kCAAkC;QAClC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,KAAK,mBAAU,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,CAAC,CAAC,qCAAqC;QACpD,CAAC;QAED,4BAA4B;QAC5B,MAAM,UAAU,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;QAE9C,MAAM,MAAM,GAAmB;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,UAAU;YAChB,OAAO;YACP,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,4BAA4B;QAC5B,IAAA,uBAAc,EAAC,MAAM,CAAC,CAAC;QAEvB,mBAAmB;QACnB,IAAI,OAAO,EAAE,WAAW,KAAK,KAAK,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAC7B,MAAM;gBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,gBAAgB;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,UAAU;QACf,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,OAAyB,EAAE,OAAuB;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,OAAO,IAAI,EAAE,CAAC;QAElE,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACI,QAAQ,CAAC,QAAwB;QACtC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,uDAAuD;QACvD,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC;YAED,uCAAuC;YACvC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,uBAAuB;QACvB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAEvC,uBAAuB;YACvB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC5C,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,cAAc,CAAC,eAAuB,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACvC,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;SAChD,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,oBAAoB,CAAC,IAAkB;QAK5C,IAAI,IAAI,CAAC,KAAK,GAAG,0BAAiB,CAAC,KAAK,EAAE,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wBAAwB,IAAI,CAAC,KAAK,oBAAoB,0BAAiB,CAAC,KAAK,QAAQ;gBAC9F,UAAU,EAAE,2CAA2C,0BAAiB,CAAC,KAAK,IAAI,0BAAiB,CAAC,MAAM,uBAAuB;aAClI,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,0BAAiB,CAAC,MAAM,EAAE,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,uBAAuB,IAAI,CAAC,MAAM,oBAAoB,0BAAiB,CAAC,MAAM,QAAQ;gBAC/F,UAAU,EAAE,2CAA2C,0BAAiB,CAAC,KAAK,IAAI,0BAAiB,CAAC,MAAM,uBAAuB;aAClI,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;CACF;AArMD,sCAqMC;AAED;;GAEG;AACH,kBAAe,IAAI,aAAa,EAAE,CAAC"}
|