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.
Files changed (324) hide show
  1. package/README.md +102 -42
  2. package/dist/cli.mjs +8587 -0
  3. package/dist/cli.mjs.map +7 -0
  4. package/package.json +13 -5
  5. package/dist/cli.d.ts +0 -11
  6. package/dist/cli.d.ts.map +0 -1
  7. package/dist/cli.js +0 -134
  8. package/dist/cli.js.map +0 -1
  9. package/dist/commands/clash.d.ts +0 -20
  10. package/dist/commands/clash.d.ts.map +0 -1
  11. package/dist/commands/clash.js +0 -156
  12. package/dist/commands/clash.js.map +0 -1
  13. package/dist/commands/config.d.ts +0 -56
  14. package/dist/commands/config.d.ts.map +0 -1
  15. package/dist/commands/config.js +0 -461
  16. package/dist/commands/config.js.map +0 -1
  17. package/dist/commands/interactive.d.ts +0 -55
  18. package/dist/commands/interactive.d.ts.map +0 -1
  19. package/dist/commands/interactive.js +0 -418
  20. package/dist/commands/interactive.js.map +0 -1
  21. package/dist/commands/logs.d.ts +0 -62
  22. package/dist/commands/logs.d.ts.map +0 -1
  23. package/dist/commands/logs.js +0 -389
  24. package/dist/commands/logs.js.map +0 -1
  25. package/dist/commands/quota.d.ts +0 -54
  26. package/dist/commands/quota.d.ts.map +0 -1
  27. package/dist/commands/quota.js +0 -661
  28. package/dist/commands/quota.js.map +0 -1
  29. package/dist/commands/review.d.ts +0 -8
  30. package/dist/commands/review.d.ts.map +0 -1
  31. package/dist/commands/review.js +0 -79
  32. package/dist/commands/review.js.map +0 -1
  33. package/dist/commands/service.d.ts +0 -43
  34. package/dist/commands/service.d.ts.map +0 -1
  35. package/dist/commands/service.js +0 -202
  36. package/dist/commands/service.js.map +0 -1
  37. package/dist/commands/user.d.ts +0 -49
  38. package/dist/commands/user.d.ts.map +0 -1
  39. package/dist/commands/user.js +0 -371
  40. package/dist/commands/user.js.map +0 -1
  41. package/dist/components/dashboard-widget.d.ts +0 -21
  42. package/dist/components/dashboard-widget.d.ts.map +0 -1
  43. package/dist/components/dashboard-widget.js +0 -234
  44. package/dist/components/dashboard-widget.js.map +0 -1
  45. package/dist/components/progress-bar.d.ts +0 -67
  46. package/dist/components/progress-bar.d.ts.map +0 -1
  47. package/dist/components/progress-bar.js +0 -138
  48. package/dist/components/progress-bar.js.map +0 -1
  49. package/dist/components/user-table.d.ts +0 -8
  50. package/dist/components/user-table.d.ts.map +0 -1
  51. package/dist/components/user-table.js +0 -91
  52. package/dist/components/user-table.js.map +0 -1
  53. package/dist/config/i18n.d.ts +0 -136
  54. package/dist/config/i18n.d.ts.map +0 -1
  55. package/dist/config/i18n.js +0 -323
  56. package/dist/config/i18n.js.map +0 -1
  57. package/dist/constants/error-codes.d.ts +0 -344
  58. package/dist/constants/error-codes.d.ts.map +0 -1
  59. package/dist/constants/error-codes.js +0 -462
  60. package/dist/constants/error-codes.js.map +0 -1
  61. package/dist/constants/exit-codes.d.ts +0 -49
  62. package/dist/constants/exit-codes.d.ts.map +0 -1
  63. package/dist/constants/exit-codes.js +0 -100
  64. package/dist/constants/exit-codes.js.map +0 -1
  65. package/dist/constants/paths.d.ts +0 -63
  66. package/dist/constants/paths.d.ts.map +0 -1
  67. package/dist/constants/paths.js +0 -78
  68. package/dist/constants/paths.js.map +0 -1
  69. package/dist/constants/quota.d.ts +0 -126
  70. package/dist/constants/quota.d.ts.map +0 -1
  71. package/dist/constants/quota.js +0 -135
  72. package/dist/constants/quota.js.map +0 -1
  73. package/dist/constants/review.d.ts +0 -14
  74. package/dist/constants/review.d.ts.map +0 -1
  75. package/dist/constants/review.js +0 -33
  76. package/dist/constants/review.js.map +0 -1
  77. package/dist/constants/supported-distros.d.ts +0 -17
  78. package/dist/constants/supported-distros.d.ts.map +0 -1
  79. package/dist/constants/supported-distros.js +0 -68
  80. package/dist/constants/supported-distros.js.map +0 -1
  81. package/dist/constants/theme.d.ts +0 -34
  82. package/dist/constants/theme.d.ts.map +0 -1
  83. package/dist/constants/theme.js +0 -52
  84. package/dist/constants/theme.js.map +0 -1
  85. package/dist/constants/timeouts.d.ts +0 -84
  86. package/dist/constants/timeouts.d.ts.map +0 -1
  87. package/dist/constants/timeouts.js +0 -111
  88. package/dist/constants/timeouts.js.map +0 -1
  89. package/dist/constants/ui-symbols.d.ts +0 -47
  90. package/dist/constants/ui-symbols.d.ts.map +0 -1
  91. package/dist/constants/ui-symbols.js +0 -48
  92. package/dist/constants/ui-symbols.js.map +0 -1
  93. package/dist/services/clash-config.d.ts +0 -16
  94. package/dist/services/clash-config.d.ts.map +0 -1
  95. package/dist/services/clash-config.js +0 -107
  96. package/dist/services/clash-config.js.map +0 -1
  97. package/dist/services/config-manager.d.ts +0 -90
  98. package/dist/services/config-manager.d.ts.map +0 -1
  99. package/dist/services/config-manager.js +0 -307
  100. package/dist/services/config-manager.js.map +0 -1
  101. package/dist/services/layout-manager.d.ts +0 -94
  102. package/dist/services/layout-manager.d.ts.map +0 -1
  103. package/dist/services/layout-manager.js +0 -192
  104. package/dist/services/layout-manager.js.map +0 -1
  105. package/dist/services/log-manager.d.ts +0 -157
  106. package/dist/services/log-manager.d.ts.map +0 -1
  107. package/dist/services/log-manager.js +0 -397
  108. package/dist/services/log-manager.js.map +0 -1
  109. package/dist/services/navigation-manager.d.ts +0 -23
  110. package/dist/services/navigation-manager.d.ts.map +0 -1
  111. package/dist/services/navigation-manager.js +0 -39
  112. package/dist/services/navigation-manager.js.map +0 -1
  113. package/dist/services/platform-detector.d.ts +0 -10
  114. package/dist/services/platform-detector.d.ts.map +0 -1
  115. package/dist/services/platform-detector.js +0 -106
  116. package/dist/services/platform-detector.js.map +0 -1
  117. package/dist/services/public-ip-manager.d.ts +0 -78
  118. package/dist/services/public-ip-manager.d.ts.map +0 -1
  119. package/dist/services/public-ip-manager.js +0 -296
  120. package/dist/services/public-ip-manager.js.map +0 -1
  121. package/dist/services/quota-enforcer.d.ts +0 -86
  122. package/dist/services/quota-enforcer.d.ts.map +0 -1
  123. package/dist/services/quota-enforcer.js +0 -151
  124. package/dist/services/quota-enforcer.js.map +0 -1
  125. package/dist/services/quota-manager.d.ts +0 -101
  126. package/dist/services/quota-manager.d.ts.map +0 -1
  127. package/dist/services/quota-manager.js +0 -257
  128. package/dist/services/quota-manager.js.map +0 -1
  129. package/dist/services/review/areas/community.d.ts +0 -9
  130. package/dist/services/review/areas/community.d.ts.map +0 -1
  131. package/dist/services/review/areas/community.js +0 -59
  132. package/dist/services/review/areas/community.js.map +0 -1
  133. package/dist/services/review/areas/contribution.d.ts +0 -9
  134. package/dist/services/review/areas/contribution.d.ts.map +0 -1
  135. package/dist/services/review/areas/contribution.js +0 -107
  136. package/dist/services/review/areas/contribution.js.map +0 -1
  137. package/dist/services/review/areas/documentation.d.ts +0 -9
  138. package/dist/services/review/areas/documentation.d.ts.map +0 -1
  139. package/dist/services/review/areas/documentation.js +0 -110
  140. package/dist/services/review/areas/documentation.js.map +0 -1
  141. package/dist/services/review/areas/license.d.ts +0 -9
  142. package/dist/services/review/areas/license.d.ts.map +0 -1
  143. package/dist/services/review/areas/license.js +0 -86
  144. package/dist/services/review/areas/license.js.map +0 -1
  145. package/dist/services/review/areas/quality.d.ts +0 -9
  146. package/dist/services/review/areas/quality.d.ts.map +0 -1
  147. package/dist/services/review/areas/quality.js +0 -84
  148. package/dist/services/review/areas/quality.js.map +0 -1
  149. package/dist/services/review/areas/security.d.ts +0 -9
  150. package/dist/services/review/areas/security.d.ts.map +0 -1
  151. package/dist/services/review/areas/security.js +0 -64
  152. package/dist/services/review/areas/security.js.map +0 -1
  153. package/dist/services/review/evidence.d.ts +0 -10
  154. package/dist/services/review/evidence.d.ts.map +0 -1
  155. package/dist/services/review/evidence.js +0 -40
  156. package/dist/services/review/evidence.js.map +0 -1
  157. package/dist/services/review/recommendations-filter.d.ts +0 -12
  158. package/dist/services/review/recommendations-filter.d.ts.map +0 -1
  159. package/dist/services/review/recommendations-filter.js +0 -20
  160. package/dist/services/review/recommendations-filter.js.map +0 -1
  161. package/dist/services/review/repo-scanner.d.ts +0 -8
  162. package/dist/services/review/repo-scanner.d.ts.map +0 -1
  163. package/dist/services/review/repo-scanner.js +0 -15
  164. package/dist/services/review/repo-scanner.js.map +0 -1
  165. package/dist/services/review/report-renderer.d.ts +0 -15
  166. package/dist/services/review/report-renderer.d.ts.map +0 -1
  167. package/dist/services/review/report-renderer.js +0 -120
  168. package/dist/services/review/report-renderer.js.map +0 -1
  169. package/dist/services/review/review-engine.d.ts +0 -15
  170. package/dist/services/review/review-engine.d.ts.map +0 -1
  171. package/dist/services/review/review-engine.js +0 -61
  172. package/dist/services/review/review-engine.js.map +0 -1
  173. package/dist/services/review/summary-builder.d.ts +0 -8
  174. package/dist/services/review/summary-builder.d.ts.map +0 -1
  175. package/dist/services/review/summary-builder.js +0 -26
  176. package/dist/services/review/summary-builder.js.map +0 -1
  177. package/dist/services/screen-manager.d.ts +0 -13
  178. package/dist/services/screen-manager.d.ts.map +0 -1
  179. package/dist/services/screen-manager.js +0 -42
  180. package/dist/services/screen-manager.js.map +0 -1
  181. package/dist/services/stats-config-manager.d.ts +0 -110
  182. package/dist/services/stats-config-manager.d.ts.map +0 -1
  183. package/dist/services/stats-config-manager.js +0 -443
  184. package/dist/services/stats-config-manager.js.map +0 -1
  185. package/dist/services/systemd-manager.d.ts +0 -197
  186. package/dist/services/systemd-manager.d.ts.map +0 -1
  187. package/dist/services/systemd-manager.js +0 -458
  188. package/dist/services/systemd-manager.js.map +0 -1
  189. package/dist/services/traffic-manager.d.ts +0 -106
  190. package/dist/services/traffic-manager.d.ts.map +0 -1
  191. package/dist/services/traffic-manager.js +0 -368
  192. package/dist/services/traffic-manager.js.map +0 -1
  193. package/dist/services/user-manager.d.ts +0 -90
  194. package/dist/services/user-manager.d.ts.map +0 -1
  195. package/dist/services/user-manager.js +0 -347
  196. package/dist/services/user-manager.js.map +0 -1
  197. package/dist/services/user-metadata-manager.d.ts +0 -85
  198. package/dist/services/user-metadata-manager.d.ts.map +0 -1
  199. package/dist/services/user-metadata-manager.js +0 -181
  200. package/dist/services/user-metadata-manager.js.map +0 -1
  201. package/dist/types/config.d.ts +0 -340
  202. package/dist/types/config.d.ts.map +0 -1
  203. package/dist/types/config.js +0 -7
  204. package/dist/types/config.js.map +0 -1
  205. package/dist/types/layout.d.ts +0 -119
  206. package/dist/types/layout.d.ts.map +0 -1
  207. package/dist/types/layout.js +0 -142
  208. package/dist/types/layout.js.map +0 -1
  209. package/dist/types/platform.d.ts +0 -72
  210. package/dist/types/platform.d.ts.map +0 -1
  211. package/dist/types/platform.js +0 -38
  212. package/dist/types/platform.js.map +0 -1
  213. package/dist/types/quota.d.ts +0 -158
  214. package/dist/types/quota.d.ts.map +0 -1
  215. package/dist/types/quota.js +0 -26
  216. package/dist/types/quota.js.map +0 -1
  217. package/dist/types/review.d.ts +0 -62
  218. package/dist/types/review.d.ts.map +0 -1
  219. package/dist/types/review.js +0 -8
  220. package/dist/types/review.js.map +0 -1
  221. package/dist/types/server-config.d.ts +0 -53
  222. package/dist/types/server-config.d.ts.map +0 -1
  223. package/dist/types/server-config.js +0 -19
  224. package/dist/types/server-config.js.map +0 -1
  225. package/dist/types/service.d.ts +0 -96
  226. package/dist/types/service.d.ts.map +0 -1
  227. package/dist/types/service.js +0 -7
  228. package/dist/types/service.js.map +0 -1
  229. package/dist/types/terminal.d.ts +0 -35
  230. package/dist/types/terminal.d.ts.map +0 -1
  231. package/dist/types/terminal.js +0 -20
  232. package/dist/types/terminal.js.map +0 -1
  233. package/dist/types/ui-components.d.ts +0 -53
  234. package/dist/types/ui-components.d.ts.map +0 -1
  235. package/dist/types/ui-components.js +0 -3
  236. package/dist/types/ui-components.js.map +0 -1
  237. package/dist/types/user-metadata.d.ts +0 -43
  238. package/dist/types/user-metadata.d.ts.map +0 -1
  239. package/dist/types/user-metadata.js +0 -17
  240. package/dist/types/user-metadata.js.map +0 -1
  241. package/dist/types/user.d.ts +0 -134
  242. package/dist/types/user.d.ts.map +0 -1
  243. package/dist/types/user.js +0 -7
  244. package/dist/types/user.js.map +0 -1
  245. package/dist/utils/clipboard.d.ts +0 -21
  246. package/dist/utils/clipboard.d.ts.map +0 -1
  247. package/dist/utils/clipboard.js +0 -45
  248. package/dist/utils/clipboard.js.map +0 -1
  249. package/dist/utils/error-formatter.d.ts +0 -60
  250. package/dist/utils/error-formatter.d.ts.map +0 -1
  251. package/dist/utils/error-formatter.js +0 -244
  252. package/dist/utils/error-formatter.js.map +0 -1
  253. package/dist/utils/errors.d.ts +0 -92
  254. package/dist/utils/errors.d.ts.map +0 -1
  255. package/dist/utils/errors.js +0 -143
  256. package/dist/utils/errors.js.map +0 -1
  257. package/dist/utils/firewall.d.ts +0 -14
  258. package/dist/utils/firewall.d.ts.map +0 -1
  259. package/dist/utils/firewall.js +0 -78
  260. package/dist/utils/firewall.js.map +0 -1
  261. package/dist/utils/format.d.ts +0 -93
  262. package/dist/utils/format.d.ts.map +0 -1
  263. package/dist/utils/format.js +0 -240
  264. package/dist/utils/format.js.map +0 -1
  265. package/dist/utils/icons.d.ts +0 -53
  266. package/dist/utils/icons.d.ts.map +0 -1
  267. package/dist/utils/icons.js +0 -143
  268. package/dist/utils/icons.js.map +0 -1
  269. package/dist/utils/layout.d.ts +0 -142
  270. package/dist/utils/layout.d.ts.map +0 -1
  271. package/dist/utils/layout.js +0 -381
  272. package/dist/utils/layout.js.map +0 -1
  273. package/dist/utils/logger.d.ts +0 -160
  274. package/dist/utils/logger.d.ts.map +0 -1
  275. package/dist/utils/logger.js +0 -351
  276. package/dist/utils/logger.js.map +0 -1
  277. package/dist/utils/network.d.ts +0 -39
  278. package/dist/utils/network.d.ts.map +0 -1
  279. package/dist/utils/network.js +0 -227
  280. package/dist/utils/network.js.map +0 -1
  281. package/dist/utils/os-detection.d.ts +0 -10
  282. package/dist/utils/os-detection.d.ts.map +0 -1
  283. package/dist/utils/os-detection.js +0 -86
  284. package/dist/utils/os-detection.js.map +0 -1
  285. package/dist/utils/preflight.d.ts +0 -57
  286. package/dist/utils/preflight.d.ts.map +0 -1
  287. package/dist/utils/preflight.js +0 -215
  288. package/dist/utils/preflight.js.map +0 -1
  289. package/dist/utils/repo-scan.d.ts +0 -54
  290. package/dist/utils/repo-scan.d.ts.map +0 -1
  291. package/dist/utils/repo-scan.js +0 -165
  292. package/dist/utils/repo-scan.js.map +0 -1
  293. package/dist/utils/report-output.d.ts +0 -13
  294. package/dist/utils/report-output.d.ts.map +0 -1
  295. package/dist/utils/report-output.js +0 -33
  296. package/dist/utils/report-output.js.map +0 -1
  297. package/dist/utils/review-id.d.ts +0 -8
  298. package/dist/utils/review-id.d.ts.map +0 -1
  299. package/dist/utils/review-id.js +0 -17
  300. package/dist/utils/review-id.js.map +0 -1
  301. package/dist/utils/splash.d.ts +0 -21
  302. package/dist/utils/splash.d.ts.map +0 -1
  303. package/dist/utils/splash.js +0 -179
  304. package/dist/utils/splash.js.map +0 -1
  305. package/dist/utils/terminal.d.ts +0 -32
  306. package/dist/utils/terminal.d.ts.map +0 -1
  307. package/dist/utils/terminal.js +0 -93
  308. package/dist/utils/terminal.js.map +0 -1
  309. package/dist/utils/traffic-formatter.d.ts +0 -45
  310. package/dist/utils/traffic-formatter.d.ts.map +0 -1
  311. package/dist/utils/traffic-formatter.js +0 -131
  312. package/dist/utils/traffic-formatter.js.map +0 -1
  313. package/dist/utils/validator.d.ts +0 -102
  314. package/dist/utils/validator.d.ts.map +0 -1
  315. package/dist/utils/validator.js +0 -238
  316. package/dist/utils/validator.js.map +0 -1
  317. package/dist/utils/vless-link.d.ts +0 -27
  318. package/dist/utils/vless-link.d.ts.map +0 -1
  319. package/dist/utils/vless-link.js +0 -69
  320. package/dist/utils/vless-link.js.map +0 -1
  321. package/dist/utils/which.d.ts +0 -13
  322. package/dist/utils/which.d.ts.map +0 -1
  323. package/dist/utils/which.js +0 -28
  324. 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"}