@masuidrive/procman 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/dist/src/cli/commands/clear-log.d.ts +10 -0
  4. package/dist/src/cli/commands/clear-log.d.ts.map +1 -0
  5. package/dist/src/cli/commands/clear-log.js +77 -0
  6. package/dist/src/cli/commands/clear-log.js.map +1 -0
  7. package/dist/src/cli/commands/exit.d.ts +10 -0
  8. package/dist/src/cli/commands/exit.d.ts.map +1 -0
  9. package/dist/src/cli/commands/exit.js +65 -0
  10. package/dist/src/cli/commands/exit.js.map +1 -0
  11. package/dist/src/cli/commands/help.d.ts +10 -0
  12. package/dist/src/cli/commands/help.d.ts.map +1 -0
  13. package/dist/src/cli/commands/help.js +340 -0
  14. package/dist/src/cli/commands/help.js.map +1 -0
  15. package/dist/src/cli/commands/list.d.ts +11 -0
  16. package/dist/src/cli/commands/list.d.ts.map +1 -0
  17. package/dist/src/cli/commands/list.js +130 -0
  18. package/dist/src/cli/commands/list.js.map +1 -0
  19. package/dist/src/cli/commands/load.d.ts +11 -0
  20. package/dist/src/cli/commands/load.d.ts.map +1 -0
  21. package/dist/src/cli/commands/load.js +250 -0
  22. package/dist/src/cli/commands/load.js.map +1 -0
  23. package/dist/src/cli/commands/log.d.ts +18 -0
  24. package/dist/src/cli/commands/log.d.ts.map +1 -0
  25. package/dist/src/cli/commands/log.js +282 -0
  26. package/dist/src/cli/commands/log.js.map +1 -0
  27. package/dist/src/cli/commands/restart.d.ts +11 -0
  28. package/dist/src/cli/commands/restart.d.ts.map +1 -0
  29. package/dist/src/cli/commands/restart.js +99 -0
  30. package/dist/src/cli/commands/restart.js.map +1 -0
  31. package/dist/src/cli/commands/start.d.ts +11 -0
  32. package/dist/src/cli/commands/start.d.ts.map +1 -0
  33. package/dist/src/cli/commands/start.js +105 -0
  34. package/dist/src/cli/commands/start.js.map +1 -0
  35. package/dist/src/cli/commands/stop.d.ts +12 -0
  36. package/dist/src/cli/commands/stop.d.ts.map +1 -0
  37. package/dist/src/cli/commands/stop.js +105 -0
  38. package/dist/src/cli/commands/stop.js.map +1 -0
  39. package/dist/src/cli/index.d.ts +3 -0
  40. package/dist/src/cli/index.d.ts.map +1 -0
  41. package/dist/src/cli/index.js +28 -0
  42. package/dist/src/cli/index.js.map +1 -0
  43. package/dist/src/cli/parser.d.ts +14 -0
  44. package/dist/src/cli/parser.d.ts.map +1 -0
  45. package/dist/src/cli/parser.js +131 -0
  46. package/dist/src/cli/parser.js.map +1 -0
  47. package/dist/src/cli/signal-handler.d.ts +51 -0
  48. package/dist/src/cli/signal-handler.d.ts.map +1 -0
  49. package/dist/src/cli/signal-handler.js +129 -0
  50. package/dist/src/cli/signal-handler.js.map +1 -0
  51. package/dist/src/cli/utils/error-handler.d.ts +39 -0
  52. package/dist/src/cli/utils/error-handler.d.ts.map +1 -0
  53. package/dist/src/cli/utils/error-handler.js +200 -0
  54. package/dist/src/cli/utils/error-handler.js.map +1 -0
  55. package/dist/src/cli/utils/error-utils.d.ts +16 -0
  56. package/dist/src/cli/utils/error-utils.d.ts.map +1 -0
  57. package/dist/src/cli/utils/error-utils.js +48 -0
  58. package/dist/src/cli/utils/error-utils.js.map +1 -0
  59. package/dist/src/cli/utils/ipc-client.d.ts +80 -0
  60. package/dist/src/cli/utils/ipc-client.d.ts.map +1 -0
  61. package/dist/src/cli/utils/ipc-client.js +275 -0
  62. package/dist/src/cli/utils/ipc-client.js.map +1 -0
  63. package/dist/src/config/config-loader.d.ts +74 -0
  64. package/dist/src/config/config-loader.d.ts.map +1 -0
  65. package/dist/src/config/config-loader.js +229 -0
  66. package/dist/src/config/config-loader.js.map +1 -0
  67. package/dist/src/config/config-normalizer.d.ts +135 -0
  68. package/dist/src/config/config-normalizer.d.ts.map +1 -0
  69. package/dist/src/config/config-normalizer.js +309 -0
  70. package/dist/src/config/config-normalizer.js.map +1 -0
  71. package/dist/src/config/config-reporter.d.ts +183 -0
  72. package/dist/src/config/config-reporter.d.ts.map +1 -0
  73. package/dist/src/config/config-reporter.js +311 -0
  74. package/dist/src/config/config-reporter.js.map +1 -0
  75. package/dist/src/config/config-validator.d.ts +163 -0
  76. package/dist/src/config/config-validator.d.ts.map +1 -0
  77. package/dist/src/config/config-validator.js +489 -0
  78. package/dist/src/config/config-validator.js.map +1 -0
  79. package/dist/src/config/config-watcher.d.ts +161 -0
  80. package/dist/src/config/config-watcher.d.ts.map +1 -0
  81. package/dist/src/config/config-watcher.js +245 -0
  82. package/dist/src/config/config-watcher.js.map +1 -0
  83. package/dist/src/config/index.d.ts +36 -0
  84. package/dist/src/config/index.d.ts.map +1 -0
  85. package/dist/src/config/index.js +41 -0
  86. package/dist/src/config/index.js.map +1 -0
  87. package/dist/src/config/secure-config-loader.d.ts +77 -0
  88. package/dist/src/config/secure-config-loader.d.ts.map +1 -0
  89. package/dist/src/config/secure-config-loader.js +326 -0
  90. package/dist/src/config/secure-config-loader.js.map +1 -0
  91. package/dist/src/daemon/base-socket-connection.d.ts +66 -0
  92. package/dist/src/daemon/base-socket-connection.d.ts.map +1 -0
  93. package/dist/src/daemon/base-socket-connection.js +192 -0
  94. package/dist/src/daemon/base-socket-connection.js.map +1 -0
  95. package/dist/src/daemon/component-manager.d.ts +180 -0
  96. package/dist/src/daemon/component-manager.d.ts.map +1 -0
  97. package/dist/src/daemon/component-manager.js +794 -0
  98. package/dist/src/daemon/component-manager.js.map +1 -0
  99. package/dist/src/daemon/crash-recovery.d.ts +71 -0
  100. package/dist/src/daemon/crash-recovery.d.ts.map +1 -0
  101. package/dist/src/daemon/crash-recovery.js +282 -0
  102. package/dist/src/daemon/crash-recovery.js.map +1 -0
  103. package/dist/src/daemon/daemon-main.d.ts +18 -0
  104. package/dist/src/daemon/daemon-main.d.ts.map +1 -0
  105. package/dist/src/daemon/daemon-main.js +160 -0
  106. package/dist/src/daemon/daemon-main.js.map +1 -0
  107. package/dist/src/daemon/daemon-state-manager.d.ts +111 -0
  108. package/dist/src/daemon/daemon-state-manager.d.ts.map +1 -0
  109. package/dist/src/daemon/daemon-state-manager.js +194 -0
  110. package/dist/src/daemon/daemon-state-manager.js.map +1 -0
  111. package/dist/src/daemon/data-directory.d.ts +51 -0
  112. package/dist/src/daemon/data-directory.d.ts.map +1 -0
  113. package/dist/src/daemon/data-directory.js +136 -0
  114. package/dist/src/daemon/data-directory.js.map +1 -0
  115. package/dist/src/daemon/index.d.ts +20 -0
  116. package/dist/src/daemon/index.d.ts.map +1 -0
  117. package/dist/src/daemon/index.js +24 -0
  118. package/dist/src/daemon/index.js.map +1 -0
  119. package/dist/src/daemon/ipc-client-base.d.ts +153 -0
  120. package/dist/src/daemon/ipc-client-base.d.ts.map +1 -0
  121. package/dist/src/daemon/ipc-client-base.js +476 -0
  122. package/dist/src/daemon/ipc-client-base.js.map +1 -0
  123. package/dist/src/daemon/ipc-command-handler.d.ts +107 -0
  124. package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -0
  125. package/dist/src/daemon/ipc-command-handler.js +483 -0
  126. package/dist/src/daemon/ipc-command-handler.js.map +1 -0
  127. package/dist/src/daemon/ipc-factory.d.ts +92 -0
  128. package/dist/src/daemon/ipc-factory.d.ts.map +1 -0
  129. package/dist/src/daemon/ipc-factory.js +210 -0
  130. package/dist/src/daemon/ipc-factory.js.map +1 -0
  131. package/dist/src/daemon/ipc-server-base.d.ts +158 -0
  132. package/dist/src/daemon/ipc-server-base.d.ts.map +1 -0
  133. package/dist/src/daemon/ipc-server-base.js +491 -0
  134. package/dist/src/daemon/ipc-server-base.js.map +1 -0
  135. package/dist/src/daemon/message-protocol.d.ts +132 -0
  136. package/dist/src/daemon/message-protocol.d.ts.map +1 -0
  137. package/dist/src/daemon/message-protocol.js +252 -0
  138. package/dist/src/daemon/message-protocol.js.map +1 -0
  139. package/dist/src/daemon/named-pipe-client.d.ts +61 -0
  140. package/dist/src/daemon/named-pipe-client.d.ts.map +1 -0
  141. package/dist/src/daemon/named-pipe-client.js +221 -0
  142. package/dist/src/daemon/named-pipe-client.js.map +1 -0
  143. package/dist/src/daemon/named-pipe-server.d.ts +40 -0
  144. package/dist/src/daemon/named-pipe-server.d.ts.map +1 -0
  145. package/dist/src/daemon/named-pipe-server.js +102 -0
  146. package/dist/src/daemon/named-pipe-server.js.map +1 -0
  147. package/dist/src/daemon/orphan-detector.d.ts +66 -0
  148. package/dist/src/daemon/orphan-detector.d.ts.map +1 -0
  149. package/dist/src/daemon/orphan-detector.js +208 -0
  150. package/dist/src/daemon/orphan-detector.js.map +1 -0
  151. package/dist/src/daemon/pid-manager.d.ts +49 -0
  152. package/dist/src/daemon/pid-manager.d.ts.map +1 -0
  153. package/dist/src/daemon/pid-manager.js +110 -0
  154. package/dist/src/daemon/pid-manager.js.map +1 -0
  155. package/dist/src/daemon/procman-daemon.d.ts +188 -0
  156. package/dist/src/daemon/procman-daemon.d.ts.map +1 -0
  157. package/dist/src/daemon/procman-daemon.js +802 -0
  158. package/dist/src/daemon/procman-daemon.js.map +1 -0
  159. package/dist/src/daemon/reconnection-system.d.ts +113 -0
  160. package/dist/src/daemon/reconnection-system.d.ts.map +1 -0
  161. package/dist/src/daemon/reconnection-system.js +223 -0
  162. package/dist/src/daemon/reconnection-system.js.map +1 -0
  163. package/dist/src/daemon/resource-manager.d.ts +204 -0
  164. package/dist/src/daemon/resource-manager.d.ts.map +1 -0
  165. package/dist/src/daemon/resource-manager.js +423 -0
  166. package/dist/src/daemon/resource-manager.js.map +1 -0
  167. package/dist/src/daemon/signal-handler.d.ts +58 -0
  168. package/dist/src/daemon/signal-handler.d.ts.map +1 -0
  169. package/dist/src/daemon/signal-handler.js +142 -0
  170. package/dist/src/daemon/signal-handler.js.map +1 -0
  171. package/dist/src/daemon/simple-resource-manager.d.ts +95 -0
  172. package/dist/src/daemon/simple-resource-manager.d.ts.map +1 -0
  173. package/dist/src/daemon/simple-resource-manager.js +180 -0
  174. package/dist/src/daemon/simple-resource-manager.js.map +1 -0
  175. package/dist/src/daemon/unix-socket-client.d.ts +69 -0
  176. package/dist/src/daemon/unix-socket-client.d.ts.map +1 -0
  177. package/dist/src/daemon/unix-socket-client.js +313 -0
  178. package/dist/src/daemon/unix-socket-client.js.map +1 -0
  179. package/dist/src/daemon/unix-socket-server.d.ts +61 -0
  180. package/dist/src/daemon/unix-socket-server.d.ts.map +1 -0
  181. package/dist/src/daemon/unix-socket-server.js +262 -0
  182. package/dist/src/daemon/unix-socket-server.js.map +1 -0
  183. package/dist/src/daemon/zombie-reaper.d.ts +83 -0
  184. package/dist/src/daemon/zombie-reaper.d.ts.map +1 -0
  185. package/dist/src/daemon/zombie-reaper.js +278 -0
  186. package/dist/src/daemon/zombie-reaper.js.map +1 -0
  187. package/dist/src/process-manager/index.d.ts +13 -0
  188. package/dist/src/process-manager/index.d.ts.map +1 -0
  189. package/dist/src/process-manager/index.js +11 -0
  190. package/dist/src/process-manager/index.js.map +1 -0
  191. package/dist/src/process-manager/interfaces/index.d.ts +31 -0
  192. package/dist/src/process-manager/interfaces/index.d.ts.map +1 -0
  193. package/dist/src/process-manager/interfaces/index.js +14 -0
  194. package/dist/src/process-manager/interfaces/index.js.map +1 -0
  195. package/dist/src/process-manager/interfaces/process-group.d.ts +200 -0
  196. package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -0
  197. package/dist/src/process-manager/interfaces/process-group.js +10 -0
  198. package/dist/src/process-manager/interfaces/process-group.js.map +1 -0
  199. package/dist/src/process-manager/interfaces/process-lifecycle.d.ts +97 -0
  200. package/dist/src/process-manager/interfaces/process-lifecycle.d.ts.map +1 -0
  201. package/dist/src/process-manager/interfaces/process-lifecycle.js +10 -0
  202. package/dist/src/process-manager/interfaces/process-lifecycle.js.map +1 -0
  203. package/dist/src/process-manager/interfaces/process-monitor.d.ts +118 -0
  204. package/dist/src/process-manager/interfaces/process-monitor.d.ts.map +1 -0
  205. package/dist/src/process-manager/interfaces/process-monitor.js +10 -0
  206. package/dist/src/process-manager/interfaces/process-monitor.js.map +1 -0
  207. package/dist/src/process-manager/interfaces/process-persistence.d.ts +125 -0
  208. package/dist/src/process-manager/interfaces/process-persistence.d.ts.map +1 -0
  209. package/dist/src/process-manager/interfaces/process-persistence.js +10 -0
  210. package/dist/src/process-manager/interfaces/process-persistence.js.map +1 -0
  211. package/dist/src/process-manager/managed-process-info.d.ts +307 -0
  212. package/dist/src/process-manager/managed-process-info.d.ts.map +1 -0
  213. package/dist/src/process-manager/managed-process-info.js +650 -0
  214. package/dist/src/process-manager/managed-process-info.js.map +1 -0
  215. package/dist/src/process-manager/process-group-manager.d.ts +103 -0
  216. package/dist/src/process-manager/process-group-manager.d.ts.map +1 -0
  217. package/dist/src/process-manager/process-group-manager.js +400 -0
  218. package/dist/src/process-manager/process-group-manager.js.map +1 -0
  219. package/dist/src/process-manager/process-lifecycle-manager.d.ts +68 -0
  220. package/dist/src/process-manager/process-lifecycle-manager.d.ts.map +1 -0
  221. package/dist/src/process-manager/process-lifecycle-manager.js +372 -0
  222. package/dist/src/process-manager/process-lifecycle-manager.js.map +1 -0
  223. package/dist/src/process-manager/process-manager.d.ts +296 -0
  224. package/dist/src/process-manager/process-manager.d.ts.map +1 -0
  225. package/dist/src/process-manager/process-manager.js +659 -0
  226. package/dist/src/process-manager/process-manager.js.map +1 -0
  227. package/dist/src/process-manager/process-monitor.d.ts +95 -0
  228. package/dist/src/process-manager/process-monitor.d.ts.map +1 -0
  229. package/dist/src/process-manager/process-monitor.js +357 -0
  230. package/dist/src/process-manager/process-monitor.js.map +1 -0
  231. package/dist/src/process-manager/process-persistence.d.ts +68 -0
  232. package/dist/src/process-manager/process-persistence.d.ts.map +1 -0
  233. package/dist/src/process-manager/process-persistence.js +364 -0
  234. package/dist/src/process-manager/process-persistence.js.map +1 -0
  235. package/dist/src/process-manager/utils/mutex.d.ts +82 -0
  236. package/dist/src/process-manager/utils/mutex.d.ts.map +1 -0
  237. package/dist/src/process-manager/utils/mutex.js +172 -0
  238. package/dist/src/process-manager/utils/mutex.js.map +1 -0
  239. package/dist/src/services/index.d.ts +8 -0
  240. package/dist/src/services/index.d.ts.map +1 -0
  241. package/dist/src/services/index.js +8 -0
  242. package/dist/src/services/index.js.map +1 -0
  243. package/dist/src/services/log-manager-config.d.ts +65 -0
  244. package/dist/src/services/log-manager-config.d.ts.map +1 -0
  245. package/dist/src/services/log-manager-config.js +145 -0
  246. package/dist/src/services/log-manager-config.js.map +1 -0
  247. package/dist/src/services/log-manager-factory.d.ts +134 -0
  248. package/dist/src/services/log-manager-factory.d.ts.map +1 -0
  249. package/dist/src/services/log-manager-factory.js +203 -0
  250. package/dist/src/services/log-manager-factory.js.map +1 -0
  251. package/dist/src/services/log-manager.d.ts +170 -0
  252. package/dist/src/services/log-manager.d.ts.map +1 -0
  253. package/dist/src/services/log-manager.js +1199 -0
  254. package/dist/src/services/log-manager.js.map +1 -0
  255. package/dist/src/services/log-path-validator.d.ts +121 -0
  256. package/dist/src/services/log-path-validator.d.ts.map +1 -0
  257. package/dist/src/services/log-path-validator.js +302 -0
  258. package/dist/src/services/log-path-validator.js.map +1 -0
  259. package/dist/src/services/process-log-integration.d.ts +62 -0
  260. package/dist/src/services/process-log-integration.d.ts.map +1 -0
  261. package/dist/src/services/process-log-integration.js +157 -0
  262. package/dist/src/services/process-log-integration.js.map +1 -0
  263. package/dist/src/shared/config.d.ts +67 -0
  264. package/dist/src/shared/config.d.ts.map +1 -0
  265. package/dist/src/shared/config.js +92 -0
  266. package/dist/src/shared/config.js.map +1 -0
  267. package/dist/src/shared/constants-streaming.d.ts +39 -0
  268. package/dist/src/shared/constants-streaming.d.ts.map +1 -0
  269. package/dist/src/shared/constants-streaming.js +39 -0
  270. package/dist/src/shared/constants-streaming.js.map +1 -0
  271. package/dist/src/shared/constants.d.ts +60 -0
  272. package/dist/src/shared/constants.d.ts.map +1 -0
  273. package/dist/src/shared/constants.js +71 -0
  274. package/dist/src/shared/constants.js.map +1 -0
  275. package/dist/src/shared/errors.d.ts +70 -0
  276. package/dist/src/shared/errors.d.ts.map +1 -0
  277. package/dist/src/shared/errors.js +101 -0
  278. package/dist/src/shared/errors.js.map +1 -0
  279. package/dist/src/shared/index.d.ts +14 -0
  280. package/dist/src/shared/index.d.ts.map +1 -0
  281. package/dist/src/shared/index.js +22 -0
  282. package/dist/src/shared/index.js.map +1 -0
  283. package/dist/src/shared/ipc.d.ts +402 -0
  284. package/dist/src/shared/ipc.d.ts.map +1 -0
  285. package/dist/src/shared/ipc.js +85 -0
  286. package/dist/src/shared/ipc.js.map +1 -0
  287. package/dist/src/shared/logger.d.ts +38 -0
  288. package/dist/src/shared/logger.d.ts.map +1 -0
  289. package/dist/src/shared/logger.js +139 -0
  290. package/dist/src/shared/logger.js.map +1 -0
  291. package/dist/src/shared/logs.d.ts +53 -0
  292. package/dist/src/shared/logs.d.ts.map +1 -0
  293. package/dist/src/shared/logs.js +26 -0
  294. package/dist/src/shared/logs.js.map +1 -0
  295. package/dist/src/shared/process.d.ts +102 -0
  296. package/dist/src/shared/process.d.ts.map +1 -0
  297. package/dist/src/shared/process.js +55 -0
  298. package/dist/src/shared/process.js.map +1 -0
  299. package/dist/src/shared/types.d.ts +15 -0
  300. package/dist/src/shared/types.d.ts.map +1 -0
  301. package/dist/src/shared/types.js +8 -0
  302. package/dist/src/shared/types.js.map +1 -0
  303. package/dist/src/types/index.d.ts +19 -0
  304. package/dist/src/types/index.d.ts.map +1 -0
  305. package/dist/src/types/index.js +5 -0
  306. package/dist/src/types/index.js.map +1 -0
  307. package/dist/src/utils/event-cleanup.d.ts +30 -0
  308. package/dist/src/utils/event-cleanup.d.ts.map +1 -0
  309. package/dist/src/utils/event-cleanup.js +32 -0
  310. package/dist/src/utils/event-cleanup.js.map +1 -0
  311. package/dist/src/utils/memory/memory-monitor.d.ts +126 -0
  312. package/dist/src/utils/memory/memory-monitor.d.ts.map +1 -0
  313. package/dist/src/utils/memory/memory-monitor.js +246 -0
  314. package/dist/src/utils/memory/memory-monitor.js.map +1 -0
  315. package/package.json +74 -0
@@ -0,0 +1,275 @@
1
+ /**
2
+ * IPC Client Utility for CLI Commands
3
+ *
4
+ * Provides a unified interface for CLI commands to communicate with the daemon
5
+ * through IPC (Inter-Process Communication).
6
+ */
7
+ import { IPCFactory } from '../../daemon/ipc-factory.js';
8
+ import { ERROR_MESSAGES, ProcmanError, } from '../../shared/errors.js';
9
+ import chalk from 'chalk';
10
+ import { displayDebugInfo, isVerboseMode } from './error-handler.js';
11
+ /**
12
+ * CLI IPC Client
13
+ * Manages IPC connection and communication with the daemon
14
+ */
15
+ export class CLIIPCClient {
16
+ client = null;
17
+ isConnected = false;
18
+ /**
19
+ * Connect to the daemon
20
+ * @param timeout Connection timeout in milliseconds (default: 5000)
21
+ */
22
+ async connect(timeout = 5000) {
23
+ const connectStartTime = Date.now();
24
+ const socketPath = IPCFactory.getDefaultIPCPath();
25
+ console.error('[DEBUG-IPC-CLIENT] Starting IPC connection...');
26
+ console.error('[DEBUG-IPC-CLIENT] Connection parameters:', JSON.stringify({
27
+ socketPath,
28
+ timeout,
29
+ processId: process.pid,
30
+ timestamp: new Date().toISOString(),
31
+ currentWorkingDirectory: process.cwd(),
32
+ environmentVariables: {
33
+ HOME: process.env.HOME,
34
+ PROCMAN_SOCKET_PATH: process.env.PROCMAN_SOCKET_PATH,
35
+ USER: process.env.USER,
36
+ },
37
+ }, null, 2));
38
+ try {
39
+ console.error('[DEBUG-IPC-CLIENT] Creating IPC client using factory...');
40
+ // Create IPC client using factory
41
+ this.client = IPCFactory.createClient({
42
+ path: socketPath,
43
+ timeout,
44
+ requestTimeout: timeout,
45
+ reconnect: false, // CLI commands should not auto-reconnect
46
+ });
47
+ console.error('[DEBUG-IPC-CLIENT] IPC client created successfully');
48
+ if (isVerboseMode()) {
49
+ displayDebugInfo('IPC Connection Attempt', {
50
+ path: socketPath,
51
+ timeout,
52
+ });
53
+ }
54
+ console.error('[DEBUG-IPC-CLIENT] Attempting to connect to daemon...');
55
+ // Connect to daemon
56
+ await this.client.connect();
57
+ this.isConnected = true;
58
+ const connectionDuration = Date.now() - connectStartTime;
59
+ console.error('[DEBUG-IPC-CLIENT] ✓ Connection established successfully');
60
+ console.error('[DEBUG-IPC-CLIENT] Connection stats:', JSON.stringify({
61
+ durationMs: connectionDuration,
62
+ isConnected: this.isConnected,
63
+ clientType: this.client?.constructor?.name,
64
+ }, null, 2));
65
+ }
66
+ catch (error) {
67
+ const connectionDuration = Date.now() - connectStartTime;
68
+ console.error('[DEBUG-IPC-CLIENT] ❌ Connection failed');
69
+ console.error('[DEBUG-IPC-CLIENT] Connection failure stats:', JSON.stringify({
70
+ durationMs: connectionDuration,
71
+ socketPath,
72
+ timeout,
73
+ errorMessage: error instanceof Error ? error.message : String(error),
74
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
+ errorCode: error?.code,
76
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
+ errno: error?.errno,
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ syscall: error?.syscall,
80
+ }, null, 2));
81
+ this.handleConnectionError(error);
82
+ }
83
+ }
84
+ /**
85
+ * Send a command to the daemon and wait for response
86
+ * @param command The command type to send
87
+ * @param payload The command payload
88
+ * @returns The response from the daemon
89
+ */
90
+ async sendCommand(command, payload) {
91
+ if (!this.client || !this.isConnected) {
92
+ throw new ProcmanError({
93
+ code: 'DAEMON_NOT_RUNNING',
94
+ message: ERROR_MESSAGES.DAEMON_NOT_RUNNING,
95
+ });
96
+ }
97
+ try {
98
+ // Send command message
99
+ const response = await this.client.sendCommand(command,
100
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
+ payload || {}, 5000);
102
+ if (!response.success && response.error) {
103
+ // Handle error response
104
+ this.handleErrorResponse(response.error);
105
+ }
106
+ return response;
107
+ }
108
+ catch (error) {
109
+ this.handleCommandError(error);
110
+ throw error; // Re-throw after handling
111
+ }
112
+ }
113
+ /**
114
+ * Disconnect from the daemon
115
+ */
116
+ async disconnect() {
117
+ if (this.client && this.isConnected) {
118
+ try {
119
+ await this.client.disconnect();
120
+ }
121
+ catch (error) {
122
+ // Ignore disconnect errors
123
+ console.error(chalk.yellow('Warning: Error during disconnect:'), error);
124
+ }
125
+ finally {
126
+ this.isConnected = false;
127
+ this.client = null;
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * Check if client is connected
133
+ */
134
+ isClientConnected() {
135
+ return this.isConnected;
136
+ }
137
+ /**
138
+ * Get the underlying IPC client for event handling
139
+ * Used for streaming operations that need direct event access
140
+ */
141
+ getInternalClient() {
142
+ return this.client;
143
+ }
144
+ /**
145
+ * Handle connection errors
146
+ */
147
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
148
+ handleConnectionError(error) {
149
+ if (isVerboseMode()) {
150
+ displayDebugInfo('IPC Connection Error', error);
151
+ }
152
+ if (error?.code === 'ECONNREFUSED') {
153
+ throw new ProcmanError({
154
+ code: 'DAEMON_NOT_RUNNING',
155
+ message: 'Cannot connect to daemon. Is it running?',
156
+ });
157
+ }
158
+ else if (error?.code === 'EACCES' || error?.code === 'EPERM') {
159
+ throw new ProcmanError({
160
+ code: 'PERMISSION_DENIED',
161
+ message: 'Permission denied to connect to daemon socket',
162
+ });
163
+ }
164
+ else if (error?.message?.includes('timeout')) {
165
+ throw new ProcmanError({
166
+ code: 'IPC_TIMEOUT',
167
+ message: 'Connection to daemon timed out',
168
+ });
169
+ }
170
+ else {
171
+ throw new ProcmanError({
172
+ code: 'DAEMON_CONNECTION_FAILED',
173
+ message: error?.message || 'Failed to connect to daemon',
174
+ });
175
+ }
176
+ }
177
+ /**
178
+ * Handle command execution errors
179
+ */
180
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
181
+ handleCommandError(error) {
182
+ if (error instanceof ProcmanError) {
183
+ console.error(chalk.red('Error:'), error.message);
184
+ }
185
+ else if (error?.code === 'ETIMEDOUT') {
186
+ console.error(chalk.red('Error:'), 'Request timed out');
187
+ }
188
+ else {
189
+ console.error(chalk.red('Error:'), 'Command execution failed:', error?.message || error);
190
+ }
191
+ }
192
+ /**
193
+ * Handle error response from daemon
194
+ */
195
+ handleErrorResponse(error) {
196
+ const errorCode = error.code || 'COMMAND_EXECUTION_ERROR';
197
+ const errorMessage = ERROR_MESSAGES[errorCode] || error.message;
198
+ console.error(chalk.red('Error:'), errorMessage);
199
+ throw new ProcmanError({
200
+ code: errorCode,
201
+ message: errorMessage,
202
+ });
203
+ }
204
+ }
205
+ /**
206
+ * Create a new CLI IPC client instance
207
+ */
208
+ export function createCLIClient() {
209
+ return new CLIIPCClient();
210
+ }
211
+ /**
212
+ * Execute a command with automatic connection management
213
+ * @param command The command type
214
+ * @param payload The command payload
215
+ * @param options Execution options
216
+ */
217
+ export async function executeCommand(command, payload, options) {
218
+ const client = createCLIClient();
219
+ try {
220
+ await client.connect(options?.timeout);
221
+ const response = await client.sendCommand(command, payload);
222
+ return response;
223
+ }
224
+ catch (error) {
225
+ // Transform IPC connection errors into the expected format for CLI command handlers
226
+ if (error instanceof Error) {
227
+ // Check for various connection failure patterns
228
+ if (error.message.includes('Socket file does not exist') ||
229
+ error.message.includes('Failed to expand socket path') ||
230
+ error.message.includes('ENOENT') ||
231
+ error.message.includes('ECONNREFUSED') ||
232
+ error.message.includes('Cannot connect to daemon') ||
233
+ error.message.includes('DAEMON_NOT_RUNNING') ||
234
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
235
+ error?.code === 'ENOENT' ||
236
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
237
+ error?.code === 'ECONNREFUSED') {
238
+ // Throw a standardized daemon connection error that command handlers expect
239
+ const connectionError = new Error('Cannot connect to daemon');
240
+ connectionError.message = 'Cannot connect to daemon';
241
+ throw connectionError;
242
+ }
243
+ }
244
+ // Re-throw other errors as-is
245
+ throw error;
246
+ }
247
+ finally {
248
+ await client.disconnect();
249
+ }
250
+ }
251
+ /**
252
+ * Parse namespace:target format
253
+ * @param target Target string (e.g., "app:worker")
254
+ * @returns Parsed namespace and name
255
+ */
256
+ export function parseTarget(target) {
257
+ const parts = target.split(':');
258
+ if (parts.length === 2) {
259
+ return { namespace: parts[0], name: parts[1] };
260
+ }
261
+ return { name: target };
262
+ }
263
+ /**
264
+ * Format process info for display
265
+ */
266
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
267
+ export function formatProcessInfo(info) {
268
+ const status = info.status === 'running'
269
+ ? chalk.green(info.status)
270
+ : info.status === 'stopped'
271
+ ? chalk.red(info.status)
272
+ : chalk.yellow(info.status);
273
+ return `${chalk.bold(info.name)} (${status})`;
274
+ }
275
+ //# sourceMappingURL=ipc-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-client.js","sourceRoot":"","sources":["../../../../src/cli/utils/ipc-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * ConfigLoader - Configuration management orchestrator
3
+ *
4
+ * Delegates specialized tasks to focused classes while providing
5
+ * a unified interface for configuration loading and validation.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { ProcmanConfig } from '../shared/config.js';
9
+ import { ConfigValidator } from './config-validator.js';
10
+ import { NormalizedConfig } from './config-normalizer.js';
11
+ import { ValidationReport } from './config-reporter.js';
12
+ export interface LoadedConfig {
13
+ config: ProcmanConfig;
14
+ filePath: string;
15
+ loadTime: number;
16
+ }
17
+ export interface ConfigLoaderOptions {
18
+ maxFileSize?: number;
19
+ enableCache?: boolean;
20
+ enableReporting?: boolean;
21
+ moduleLoader?: (path: string) => unknown;
22
+ }
23
+ export type { ValidationSeverity, ValidationIssue, } from './config-validator.js';
24
+ export type { ValidationReport } from './config-reporter.js';
25
+ export type { NormalizedConfig } from './config-normalizer.js';
26
+ export interface ConfigLoaderEvents {
27
+ configChanged: (filePath: string) => void;
28
+ }
29
+ export declare class ConfigLoader extends EventEmitter {
30
+ private loadedConfigs;
31
+ private options;
32
+ private moduleLoader;
33
+ protected validator: ConfigValidator;
34
+ private normalizer;
35
+ private watcher;
36
+ private reporter;
37
+ /**
38
+ * Dynamic require replacement for ES modules
39
+ */
40
+ private dynamicRequire;
41
+ constructor(options?: ConfigLoaderOptions);
42
+ load(filePath: string): Promise<ProcmanConfig>;
43
+ loadWithReport(filePath: string): Promise<ValidationReport>;
44
+ getLastReport(): ValidationReport | null;
45
+ loadAndNormalize(filePath: string): Promise<NormalizedConfig>;
46
+ normalizeConfig(config: ProcmanConfig, originalPath: string): NormalizedConfig;
47
+ saveNormalizedConfig(config: NormalizedConfig, outputPath: string): Promise<void>;
48
+ compareConfigs(config1: ProcmanConfig, config2: ProcmanConfig): Array<{
49
+ type: 'added' | 'removed' | 'modified';
50
+ path: string;
51
+ oldValue?: unknown;
52
+ newValue?: unknown;
53
+ }>;
54
+ reload(filePath: string): Promise<ProcmanConfig>;
55
+ clearCache(): void;
56
+ getCached(filePath: string): LoadedConfig | undefined;
57
+ private validateFilePath;
58
+ createBackup(filePath: string): Promise<string>;
59
+ hasConfigChanged(filePath: string): Promise<boolean>;
60
+ watchConfig(filePath: string, callback: (event: 'change' | 'rename', filename?: string) => void): {
61
+ dispose: () => void;
62
+ };
63
+ stopWatching(filePath: string): void;
64
+ stopAllWatching(): void;
65
+ dispose(): void;
66
+ getResourceUsage(): {
67
+ watchedFiles: number;
68
+ cachedConfigs: number;
69
+ validationIssues: number;
70
+ memoryUsage: number;
71
+ };
72
+ }
73
+ export declare function createConfigLoader(options?: ConfigLoaderOptions): ConfigLoader;
74
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/config/config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * ConfigLoader - Configuration management orchestrator
3
+ *
4
+ * Delegates specialized tasks to focused classes while providing
5
+ * a unified interface for configuration loading and validation.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { EventEmitter } from 'events';
10
+ import { createRequire } from 'module';
11
+ import { ProcmanError, createError } from '../shared/errors.js';
12
+ import { ConfigValidator } from './config-validator.js';
13
+ import { ConfigNormalizer } from './config-normalizer.js';
14
+ import { ConfigWatcher } from './config-watcher.js';
15
+ import { ConfigReporter } from './config-reporter.js';
16
+ export class ConfigLoader extends EventEmitter {
17
+ loadedConfigs = new Map();
18
+ options;
19
+ moduleLoader;
20
+ validator;
21
+ normalizer;
22
+ watcher;
23
+ reporter;
24
+ /**
25
+ * Dynamic require replacement for ES modules
26
+ */
27
+ dynamicRequire(modulePath) {
28
+ const require = createRequire(import.meta.url);
29
+ return require(modulePath);
30
+ }
31
+ constructor(options = {}) {
32
+ super();
33
+ this.options = {
34
+ maxFileSize: options.maxFileSize ?? 10 * 1024 * 1024,
35
+ enableCache: options.enableCache ?? true,
36
+ enableReporting: options.enableReporting ?? false,
37
+ moduleLoader: options.moduleLoader ?? this.dynamicRequire.bind(this),
38
+ };
39
+ this.moduleLoader = this.options.moduleLoader;
40
+ const cwd = process.cwd();
41
+ this.validator = new ConfigValidator({
42
+ projectRoot: cwd,
43
+ collectIssues: this.options.enableReporting,
44
+ });
45
+ this.normalizer = new ConfigNormalizer({
46
+ baseDirectory: cwd,
47
+ expandEnvironmentVariables: true,
48
+ });
49
+ this.watcher = new ConfigWatcher({ interval: 1000, persistent: true });
50
+ this.reporter = new ConfigReporter({
51
+ includeSuggestions: true,
52
+ maxIssues: 100,
53
+ });
54
+ this.watcher.on('configChanged', (filePath) => this.emit('configChanged', filePath));
55
+ }
56
+ async load(filePath) {
57
+ const absolutePath = await this.validateFilePath(filePath);
58
+ if (this.options.enableCache && this.loadedConfigs.has(absolutePath)) {
59
+ return this.loadedConfigs.get(absolutePath).config;
60
+ }
61
+ try {
62
+ // Clear module cache for ES modules
63
+ const require = createRequire(import.meta.url);
64
+ if (require.cache[absolutePath])
65
+ delete require.cache[absolutePath];
66
+ const config = this.moduleLoader(absolutePath);
67
+ this.validator.validateConfig(config);
68
+ if (this.options.enableCache) {
69
+ this.loadedConfigs.set(absolutePath, {
70
+ config,
71
+ filePath: absolutePath,
72
+ loadTime: Date.now(),
73
+ });
74
+ }
75
+ return config;
76
+ }
77
+ catch (error) {
78
+ if (error instanceof ProcmanError)
79
+ throw error;
80
+ const isError = error instanceof Error;
81
+ if (isError && 'code' in error && error.code === 'MODULE_NOT_FOUND') {
82
+ throw createError('CONFIG_FILE_NOT_FOUND', {
83
+ message: `Configuration file not found: ${absolutePath}`,
84
+ details: { filePath: absolutePath },
85
+ });
86
+ }
87
+ if (isError &&
88
+ (error instanceof SyntaxError || error instanceof ReferenceError)) {
89
+ throw createError('CONFIG_PARSE_ERROR', {
90
+ message: `Failed to parse configuration file: ${error.message}`,
91
+ cause: error,
92
+ details: { filePath: absolutePath },
93
+ });
94
+ }
95
+ throw createError('CONFIG_PARSE_ERROR', {
96
+ message: `Failed to load configuration: ${isError ? error.message : String(error)}`,
97
+ cause: isError ? error : undefined,
98
+ details: { filePath: absolutePath },
99
+ });
100
+ }
101
+ }
102
+ async loadWithReport(filePath) {
103
+ return this.reporter.generateReportFromValidation(filePath, () => this.load(filePath));
104
+ }
105
+ getLastReport() {
106
+ return this.reporter.getLastReport();
107
+ }
108
+ async loadAndNormalize(filePath) {
109
+ const config = await this.load(filePath);
110
+ return this.normalizer.normalizeConfig(config, filePath);
111
+ }
112
+ normalizeConfig(config, originalPath) {
113
+ return this.normalizer.normalizeConfig(config, originalPath);
114
+ }
115
+ async saveNormalizedConfig(config, outputPath) {
116
+ return this.normalizer.saveNormalizedConfig(config, outputPath);
117
+ }
118
+ compareConfigs(config1, config2) {
119
+ return this.normalizer.compareConfigs(config1, config2);
120
+ }
121
+ async reload(filePath) {
122
+ this.loadedConfigs.delete(path.resolve(filePath));
123
+ return this.load(filePath);
124
+ }
125
+ clearCache() {
126
+ this.loadedConfigs.clear();
127
+ }
128
+ getCached(filePath) {
129
+ return this.loadedConfigs.get(path.resolve(filePath));
130
+ }
131
+ async validateFilePath(filePath) {
132
+ // t_wada boundary principle: validate inputs at boundaries
133
+ if (filePath == null) {
134
+ throw createError('CONFIG_VALIDATION_ERROR', {
135
+ message: 'Configuration file path cannot be null or undefined',
136
+ details: { filePath: filePath },
137
+ });
138
+ }
139
+ if (typeof filePath !== 'string') {
140
+ throw createError('CONFIG_VALIDATION_ERROR', {
141
+ message: 'Configuration file path must be a string',
142
+ details: { filePath: filePath },
143
+ });
144
+ }
145
+ if (filePath.trim() === '') {
146
+ throw createError('CONFIG_VALIDATION_ERROR', {
147
+ message: 'Configuration file path cannot be empty',
148
+ details: { filePath: filePath },
149
+ });
150
+ }
151
+ const absolutePath = path.resolve(filePath);
152
+ const ext = path.extname(absolutePath);
153
+ if (ext !== '.js' && ext !== '.cjs') {
154
+ throw createError('CONFIG_VALIDATION_ERROR', {
155
+ message: 'Configuration file must have .js or .cjs extension',
156
+ details: { filePath: absolutePath },
157
+ });
158
+ }
159
+ try {
160
+ await fs.promises.access(absolutePath, fs.constants.F_OK);
161
+ }
162
+ catch {
163
+ throw createError('CONFIG_FILE_NOT_FOUND', {
164
+ message: `Configuration file not found: ${absolutePath}`,
165
+ details: { filePath: absolutePath },
166
+ });
167
+ }
168
+ try {
169
+ await fs.promises.access(absolutePath, fs.constants.R_OK);
170
+ }
171
+ catch (error) {
172
+ throw createError('PERMISSION_DENIED', {
173
+ message: `Cannot read configuration file: ${absolutePath}`,
174
+ cause: error instanceof Error ? error : undefined,
175
+ details: { filePath: absolutePath },
176
+ });
177
+ }
178
+ const stats = await fs.promises.stat(absolutePath);
179
+ if (stats.size > this.options.maxFileSize) {
180
+ throw createError('CONFIG_VALIDATION_ERROR', {
181
+ message: `Configuration file too large: ${stats.size} bytes (max: ${this.options.maxFileSize})`,
182
+ details: {
183
+ filePath: absolutePath,
184
+ fileSize: stats.size,
185
+ maxSize: this.options.maxFileSize,
186
+ },
187
+ });
188
+ }
189
+ return absolutePath;
190
+ }
191
+ async createBackup(filePath) {
192
+ return this.watcher.createBackup(filePath);
193
+ }
194
+ async hasConfigChanged(filePath) {
195
+ const absolutePath = path.resolve(filePath);
196
+ const cached = this.loadedConfigs.get(absolutePath);
197
+ if (!cached)
198
+ return true;
199
+ return this.watcher.hasConfigChanged(absolutePath, cached.loadTime);
200
+ }
201
+ watchConfig(filePath, callback) {
202
+ return this.watcher.watchConfig(filePath, callback);
203
+ }
204
+ stopWatching(filePath) {
205
+ this.watcher.stopWatching(filePath);
206
+ }
207
+ stopAllWatching() {
208
+ this.watcher.stopAllWatching();
209
+ }
210
+ dispose() {
211
+ this.stopAllWatching();
212
+ this.loadedConfigs.clear();
213
+ this.removeAllListeners();
214
+ }
215
+ getResourceUsage() {
216
+ return {
217
+ watchedFiles: this.watcher.getWatchedFiles().length,
218
+ cachedConfigs: this.loadedConfigs.size,
219
+ validationIssues: this.reporter.getValidationIssues().length,
220
+ memoryUsage: JSON.stringify({
221
+ loadedConfigs: Array.from(this.loadedConfigs.values()),
222
+ }).length,
223
+ };
224
+ }
225
+ }
226
+ export function createConfigLoader(options) {
227
+ return new ConfigLoader(options);
228
+ }
229
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/config/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAoB,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAoB,MAAM,sBAAsB,CAAC;AAyBxE,MAAM,OAAO,YAAa,SAAQ,YAAY;IACpC,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IAChD,OAAO,CAAgC;IACvC,YAAY,CAA4B;IACtC,SAAS,CAAkB;IAC7B,UAAU,CAAmB;IAC7B,OAAO,CAAgB;IACvB,QAAQ,CAAiB;IAEjC;;OAEG;IACK,cAAc,CAAC,UAAkB;QACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAED,YAAY,UAA+B,EAAE;QAC3C,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,OAAO,GAAG;YACb,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI;YACpD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;YACxC,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,KAAK;YACjD,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;SACrE,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QAE9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC;YACnC,WAAW,EAAE,GAAG;YAChB,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe;SAC5C,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAC;YACrC,aAAa,EAAE,GAAG;YAClB,0BAA0B,EAAE,IAAI;SACjC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC;YACjC,kBAAkB,EAAE,IAAI;YACxB,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CACrC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,MAAM,CAAC;QACtD,CAAC;QACD,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;gBAAE,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE;oBACnC,MAAM;oBACN,QAAQ,EAAE,YAAY;oBACtB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;iBACrB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY;gBAAE,MAAM,KAAK,CAAC;YAC/C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC;YACvC,IAAI,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACpE,MAAM,WAAW,CAAC,uBAAuB,EAAE;oBACzC,OAAO,EAAE,iCAAiC,YAAY,EAAE;oBACxD,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;YACD,IACE,OAAO;gBACP,CAAC,KAAK,YAAY,WAAW,IAAI,KAAK,YAAY,cAAc,CAAC,EACjE,CAAC;gBACD,MAAM,WAAW,CAAC,oBAAoB,EAAE;oBACtC,OAAO,EAAE,uCAAuC,KAAK,CAAC,OAAO,EAAE;oBAC/D,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,WAAW,CAAC,oBAAoB,EAAE;gBACtC,OAAO,EAAE,iCAAiC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACnF,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBAClC,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,QAAQ,EAAE,GAAG,EAAE,CAC/D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CACpB,CAAC;IACJ,CAAC;IACD,aAAa;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC;IACD,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IACD,eAAe,CACb,MAAqB,EACrB,YAAoB;QAEpB,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,CAAC,oBAAoB,CACxB,MAAwB,EACxB,UAAkB;QAElB,OAAO,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClE,CAAC;IACD,cAAc,CACZ,OAAsB,EACtB,OAAsB;QAOtB,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,UAAU;QACR,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QAC7C,2DAA2D;QAC3D,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,WAAW,CAAC,yBAAyB,EAAE;gBAC3C,OAAO,EAAE,qDAAqD;gBAC9D,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;aAChC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,WAAW,CAAC,yBAAyB,EAAE;gBAC3C,OAAO,EAAE,0CAA0C;gBACnD,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;aAChC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3B,MAAM,WAAW,CAAC,yBAAyB,EAAE;gBAC3C,OAAO,EAAE,yCAAyC;gBAClD,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;aAChC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,WAAW,CAAC,yBAAyB,EAAE;gBAC3C,OAAO,EAAE,oDAAoD;gBAC7D,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,WAAW,CAAC,uBAAuB,EAAE;gBACzC,OAAO,EAAE,iCAAiC,YAAY,EAAE;gBACxD,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,mBAAmB,EAAE;gBACrC,OAAO,EAAE,mCAAmC,YAAY,EAAE;gBAC1D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBACjD,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,WAAW,CAAC,yBAAyB,EAAE;gBAC3C,OAAO,EAAE,iCAAiC,KAAK,CAAC,IAAI,gBAAgB,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG;gBAC/F,OAAO,EAAE;oBACP,QAAQ,EAAE,YAAY;oBACtB,QAAQ,EAAE,KAAK,CAAC,IAAI;oBACpB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;iBAClC;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtE,CAAC;IACD,WAAW,CACT,QAAgB,EAChB,QAAiE;QAEjE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IACD,YAAY,CAAC,QAAgB;QAC3B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,eAAe;QACb,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;IACjC,CAAC;IACD,OAAO;QACL,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,gBAAgB;QAMd,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,MAAM;YACnD,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI;YACtC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC,MAAM;YAC5D,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;gBAC1B,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;aACvD,CAAC,CAAC,MAAM;SACV,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAChC,OAA6B;IAE7B,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}