@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,102 @@
1
+ /**
2
+ * Named Pipe Server Implementation
3
+ *
4
+ * Concrete implementation of IPC server using Named Pipes.
5
+ * Supports Windows systems.
6
+ */
7
+ import * as net from 'net';
8
+ import { setTimeout, clearTimeout } from 'timers';
9
+ import { IPCServerBase } from './ipc-server-base.js';
10
+ import { BaseSocketConnection } from './base-socket-connection.js';
11
+ /**
12
+ * Named Pipe connection implementation
13
+ */
14
+ class NamedPipeConnection extends BaseSocketConnection {
15
+ constructor(socket) {
16
+ super(socket);
17
+ }
18
+ }
19
+ /**
20
+ * Named Pipe Server
21
+ */
22
+ export class NamedPipeServer extends IPCServerBase {
23
+ server = null;
24
+ pipePath;
25
+ constructor(config = { path: '' }) {
26
+ super(config);
27
+ // Determine pipe path
28
+ this.pipePath =
29
+ config.namedPipePath || config.path || '\\\\.\\pipe\\masuidrive-procman';
30
+ }
31
+ /**
32
+ * Start the Named Pipe server
33
+ */
34
+ async startServer() {
35
+ // Create server
36
+ this.server = net.createServer();
37
+ // Set up server event handlers
38
+ this.setupServerHandlers();
39
+ // Start listening on named pipe
40
+ return new Promise((resolve, reject) => {
41
+ this.server.listen(this.pipePath, () => {
42
+ resolve();
43
+ });
44
+ this.server.on('error', reject);
45
+ });
46
+ }
47
+ /**
48
+ * Stop the Named Pipe server
49
+ */
50
+ async stopServer() {
51
+ if (!this.server) {
52
+ return;
53
+ }
54
+ return new Promise((resolve, reject) => {
55
+ // Set timeout to prevent hanging
56
+ const timeout = setTimeout(() => {
57
+ this.server = null;
58
+ resolve();
59
+ }, 5000);
60
+ this.server.close((error) => {
61
+ clearTimeout(timeout);
62
+ if (error) {
63
+ reject(error);
64
+ }
65
+ else {
66
+ this.server = null;
67
+ resolve();
68
+ }
69
+ });
70
+ });
71
+ }
72
+ /**
73
+ * Get the pipe path
74
+ */
75
+ getPipePath() {
76
+ return this.pipePath;
77
+ }
78
+ /**
79
+ * Set up server event handlers
80
+ */
81
+ setupServerHandlers() {
82
+ if (!this.server) {
83
+ return;
84
+ }
85
+ this.server.on('connection', (socket) => {
86
+ const connection = new NamedPipeConnection(socket);
87
+ this.setupConnectionEvents(connection);
88
+ });
89
+ this.setupCommonServerEvents(this.server);
90
+ }
91
+ /**
92
+ * Get server-specific resource stats
93
+ */
94
+ getServerStats() {
95
+ return {
96
+ ...this.getResourceStats(),
97
+ pipePath: this.pipePath,
98
+ serverListening: !!this.server?.listening,
99
+ };
100
+ }
101
+ }
102
+ //# sourceMappingURL=named-pipe-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"named-pipe-server.js","sourceRoot":"","sources":["../../../src/daemon/named-pipe-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * OrphanProcessDetector - Detects and manages orphaned processes
3
+ *
4
+ * This class is responsible for:
5
+ * - Scanning system processes to find orphaned procman-managed processes
6
+ * - Identifying processes that were managed by a crashed daemon
7
+ * - Providing a list of recoverable processes
8
+ *
9
+ * Following SOLID principles:
10
+ * - Single Responsibility: Only detects orphaned processes
11
+ * - Dependency Inversion: Depends on interfaces, not concrete implementations
12
+ */
13
+ export interface ProcessInfo {
14
+ pid: number;
15
+ ppid: number;
16
+ command: string;
17
+ cwd: string;
18
+ name: string;
19
+ namespace?: string;
20
+ }
21
+ export interface IOrphanDetector {
22
+ detectOrphanedProcesses(): Promise<ProcessInfo[]>;
23
+ isProcessOrphaned(pid: number): Promise<boolean>;
24
+ isProcmanManagedProcess(processInfo: ProcessInfo): boolean;
25
+ }
26
+ export declare class OrphanProcessDetector implements IOrphanDetector {
27
+ private readonly dataDir;
28
+ private readonly processIdentifiers;
29
+ constructor(dataDir?: string);
30
+ /**
31
+ * Detect all orphaned processes that were managed by procman
32
+ */
33
+ detectOrphanedProcesses(): Promise<ProcessInfo[]>;
34
+ /**
35
+ * Check if a specific process is orphaned
36
+ */
37
+ isProcessOrphaned(pid: number): Promise<boolean>;
38
+ /**
39
+ * Determine if a process was managed by procman
40
+ */
41
+ isProcmanManagedProcess(processInfo: ProcessInfo): boolean;
42
+ /**
43
+ * Get information about all running processes
44
+ */
45
+ private getAllProcesses;
46
+ /**
47
+ * Get detailed information about a specific process
48
+ */
49
+ private getProcessInfo;
50
+ /**
51
+ * Get the current working directory of a process
52
+ */
53
+ private getProcessCwd;
54
+ /**
55
+ * Extract a meaningful name from the command string
56
+ */
57
+ private extractProcessName;
58
+ /**
59
+ * Try to recover process metadata from saved state
60
+ */
61
+ recoverProcessMetadata(pid: number): Promise<{
62
+ name?: string;
63
+ namespace?: string;
64
+ } | null>;
65
+ }
66
+ //# sourceMappingURL=orphan-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-detector.d.ts","sourceRoot":"","sources":["../../../src/daemon/orphan-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,uBAAuB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC;CAC5D;AAED,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAIjC;gBAGA,OAAO,GAAE,MAAiE;IAK5E;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAgBvD;;OAEG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BtD;;OAEG;IACH,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IA0B1D;;OAEG;YACW,eAAe;IAqC7B;;OAEG;YACW,cAAc;IAyB5B;;OAEG;YACW,aAAa;IAsB3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACG,sBAAsB,CAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAUzD"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * OrphanProcessDetector - Detects and manages orphaned processes
3
+ *
4
+ * This class is responsible for:
5
+ * - Scanning system processes to find orphaned procman-managed processes
6
+ * - Identifying processes that were managed by a crashed daemon
7
+ * - Providing a list of recoverable processes
8
+ *
9
+ * Following SOLID principles:
10
+ * - Single Responsibility: Only detects orphaned processes
11
+ * - Dependency Inversion: Depends on interfaces, not concrete implementations
12
+ */
13
+ import * as fs from 'fs/promises';
14
+ import * as path from 'path';
15
+ import { exec } from 'child_process';
16
+ import { promisify } from 'util';
17
+ const execAsync = promisify(exec);
18
+ export class OrphanProcessDetector {
19
+ dataDir;
20
+ processIdentifiers = [
21
+ 'node', // Node.js processes
22
+ 'test-process.js', // Our test processes
23
+ '/workspaces/procman', // Processes in our project directory
24
+ ];
25
+ constructor(dataDir = path.join(process.env.HOME || '', '.masuidrive-procman')) {
26
+ this.dataDir = dataDir;
27
+ }
28
+ /**
29
+ * Detect all orphaned processes that were managed by procman
30
+ */
31
+ async detectOrphanedProcesses() {
32
+ const allProcesses = await this.getAllProcesses();
33
+ const orphanedProcesses = [];
34
+ for (const proc of allProcesses) {
35
+ if ((await this.isProcessOrphaned(proc.pid)) &&
36
+ this.isProcmanManagedProcess(proc)) {
37
+ orphanedProcesses.push(proc);
38
+ }
39
+ }
40
+ return orphanedProcesses;
41
+ }
42
+ /**
43
+ * Check if a specific process is orphaned
44
+ */
45
+ async isProcessOrphaned(pid) {
46
+ try {
47
+ // Check if process exists
48
+ process.kill(pid, 0);
49
+ // Get process info
50
+ const proc = await this.getProcessInfo(pid);
51
+ if (!proc)
52
+ return false;
53
+ // A process is orphaned if:
54
+ // 1. Its parent is init (ppid = 1)
55
+ // 2. Or its parent doesn't exist
56
+ if (proc.ppid === 1) {
57
+ return true;
58
+ }
59
+ // Check if parent process exists
60
+ try {
61
+ process.kill(proc.ppid, 0);
62
+ return false; // Parent exists, not orphaned
63
+ }
64
+ catch {
65
+ return true; // Parent doesn't exist, process is orphaned
66
+ }
67
+ }
68
+ catch {
69
+ return false; // Process doesn't exist
70
+ }
71
+ }
72
+ /**
73
+ * Determine if a process was managed by procman
74
+ */
75
+ isProcmanManagedProcess(processInfo) {
76
+ // Check if command contains our identifiers
77
+ for (const identifier of this.processIdentifiers) {
78
+ if (processInfo.command.includes(identifier)) {
79
+ return true;
80
+ }
81
+ }
82
+ // Check if process was started from our working directory
83
+ if (processInfo.cwd && processInfo.cwd.includes('/workspaces/procman')) {
84
+ return true;
85
+ }
86
+ // Check for specific test process patterns
87
+ if (processInfo.command.includes('test-process') ||
88
+ processInfo.command.includes('crash-after') ||
89
+ processInfo.command.includes('zombie-creator') ||
90
+ processInfo.command.includes('memory-leaker')) {
91
+ return true;
92
+ }
93
+ return false;
94
+ }
95
+ /**
96
+ * Get information about all running processes
97
+ */
98
+ async getAllProcesses() {
99
+ try {
100
+ // Use ps command to get process information
101
+ // Format: PID PPID COMMAND
102
+ const { stdout } = await execAsync('ps axo pid,ppid,command');
103
+ const lines = stdout.trim().split('\n').slice(1); // Skip header
104
+ const processes = [];
105
+ for (const line of lines) {
106
+ const match = line.match(/^\s*(\d+)\s+(\d+)\s+(.+)$/);
107
+ if (match) {
108
+ const pid = parseInt(match[1], 10);
109
+ const ppid = parseInt(match[2], 10);
110
+ const command = match[3];
111
+ // Try to get additional info
112
+ const cwd = await this.getProcessCwd(pid);
113
+ const name = this.extractProcessName(command);
114
+ processes.push({
115
+ pid,
116
+ ppid,
117
+ command,
118
+ cwd,
119
+ name,
120
+ });
121
+ }
122
+ }
123
+ return processes;
124
+ }
125
+ catch (error) {
126
+ console.error('Failed to get process list:', error);
127
+ return [];
128
+ }
129
+ }
130
+ /**
131
+ * Get detailed information about a specific process
132
+ */
133
+ async getProcessInfo(pid) {
134
+ try {
135
+ const { stdout } = await execAsync(`ps -p ${pid} -o pid,ppid,command`);
136
+ const lines = stdout.trim().split('\n');
137
+ if (lines.length < 2)
138
+ return null;
139
+ const match = lines[1].match(/^\s*(\d+)\s+(\d+)\s+(.+)$/);
140
+ if (!match)
141
+ return null;
142
+ const cwd = await this.getProcessCwd(pid);
143
+ const command = match[3];
144
+ return {
145
+ pid: parseInt(match[1], 10),
146
+ ppid: parseInt(match[2], 10),
147
+ command,
148
+ cwd,
149
+ name: this.extractProcessName(command),
150
+ };
151
+ }
152
+ catch {
153
+ return null;
154
+ }
155
+ }
156
+ /**
157
+ * Get the current working directory of a process
158
+ */
159
+ async getProcessCwd(pid) {
160
+ try {
161
+ // On Linux, we can read the cwd from /proc
162
+ if (process.platform === 'linux') {
163
+ const cwdLink = `/proc/${pid}/cwd`;
164
+ return await fs.readlink(cwdLink);
165
+ }
166
+ // On macOS, use lsof
167
+ if (process.platform === 'darwin') {
168
+ const { stdout } = await execAsync(`lsof -p ${pid} | grep cwd | awk '{print $NF}'`);
169
+ return stdout.trim();
170
+ }
171
+ return '';
172
+ }
173
+ catch {
174
+ return '';
175
+ }
176
+ }
177
+ /**
178
+ * Extract a meaningful name from the command string
179
+ */
180
+ extractProcessName(command) {
181
+ // Extract the main executable or script name
182
+ const parts = command.split(/\s+/);
183
+ if (parts.length === 0)
184
+ return 'unknown';
185
+ // Find the main script or executable
186
+ for (const part of parts) {
187
+ if (part.endsWith('.js') || part.endsWith('.ts')) {
188
+ return path.basename(part);
189
+ }
190
+ }
191
+ return path.basename(parts[0]);
192
+ }
193
+ /**
194
+ * Try to recover process metadata from saved state
195
+ */
196
+ async recoverProcessMetadata(pid) {
197
+ try {
198
+ // Look for saved process state in data directory
199
+ const stateFile = path.join(this.dataDir, 'processes', `${pid}.json`);
200
+ const data = await fs.readFile(stateFile, 'utf-8');
201
+ return JSON.parse(data);
202
+ }
203
+ catch {
204
+ return null;
205
+ }
206
+ }
207
+ }
208
+ //# sourceMappingURL=orphan-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-detector.js","sourceRoot":"","sources":["../../../src/daemon/orphan-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAiBlC,MAAM,OAAO,qBAAqB;IACf,OAAO,CAAS;IAChB,kBAAkB,GAAG;QACpC,MAAM,EAAE,oBAAoB;QAC5B,iBAAiB,EAAE,qBAAqB;QACxC,qBAAqB,EAAE,qCAAqC;KAC7D,CAAC;IAEF,YACE,UAAkB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,qBAAqB,CAAC;QAE1E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB;QAC3B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAClD,MAAM,iBAAiB,GAAkB,EAAE,CAAC;QAE5C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IACE,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAClC,CAAC;gBACD,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,GAAW;QACjC,IAAI,CAAC;YACH,0BAA0B;YAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAErB,mBAAmB;YACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAExB,4BAA4B;YAC5B,mCAAmC;YACnC,iCAAiC;YACjC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,iCAAiC;YACjC,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC3B,OAAO,KAAK,CAAC,CAAC,8BAA8B;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC,CAAC,4CAA4C;YAC3D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC,CAAC,wBAAwB;QACxC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,WAAwB;QAC9C,4CAA4C;QAC5C,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACjD,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,IAAI,WAAW,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2CAA2C;QAC3C,IACE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC9C,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAC7C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,4CAA4C;YAC5C,2BAA2B;YAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,yBAAyB,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;YAEhE,MAAM,SAAS,GAAkB,EAAE,CAAC;YAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBACtD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAEzB,6BAA6B;oBAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;oBAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;oBAE9C,SAAS,CAAC,IAAI,CAAC;wBACb,GAAG;wBACH,IAAI;wBACJ,OAAO;wBACP,GAAG;wBACH,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,GAAW;QACtC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,SAAS,GAAG,sBAAsB,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAExC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAElC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAExB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEzB,OAAO;gBACL,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC5B,OAAO;gBACP,GAAG;gBACH,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;aACvC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,GAAW;QACrC,IAAI,CAAC;YACH,2CAA2C;YAC3C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;gBACnC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YAED,qBAAqB;YACrB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,WAAW,GAAG,iCAAiC,CAChD,CAAC;gBACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC;YAED,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,OAAe;QACxC,6CAA6C;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAEzC,qCAAqC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAC1B,GAAW;QAEX,IAAI,CAAC;YACH,iDAAiD;YACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * PID file management for procman daemon
3
+ *
4
+ * Manages the daemon.pid file for preventing duplicate daemon processes
5
+ * and tracking daemon process status.
6
+ */
7
+ import { DataDirectory } from './data-directory.js';
8
+ /**
9
+ * Manages PID file for daemon process lifecycle
10
+ */
11
+ export declare class PIDManager {
12
+ private readonly dataDirectory;
13
+ constructor(dataDirectory: DataDirectory);
14
+ /**
15
+ * Get the path to the PID file
16
+ */
17
+ getPIDFilePath(): string;
18
+ /**
19
+ * Write current process PID to the PID file
20
+ */
21
+ writePIDFile(): Promise<void>;
22
+ /**
23
+ * Read PID from the PID file
24
+ * @returns PID number or null if file doesn't exist or contains invalid data
25
+ */
26
+ readPIDFile(): Promise<number | null>;
27
+ /**
28
+ * Remove the PID file
29
+ */
30
+ removePIDFile(): Promise<void>;
31
+ /**
32
+ * Check if a process with given PID is running
33
+ */
34
+ isProcessRunning(pid: number): boolean;
35
+ /**
36
+ * Check if daemon is currently running based on PID file
37
+ */
38
+ isDaemonRunning(): Promise<boolean>;
39
+ /**
40
+ * Ensure no daemon is currently running
41
+ * Throws error if daemon is running, cleans up stale PID files
42
+ */
43
+ ensureNoDaemonRunning(): Promise<void>;
44
+ /**
45
+ * Cleanup PID file (typically called on daemon shutdown)
46
+ */
47
+ cleanup(): Promise<void>;
48
+ }
49
+ //# sourceMappingURL=pid-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pid-manager.d.ts","sourceRoot":"","sources":["../../../src/daemon/pid-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAElC,aAAa,EAAE,aAAa;IAIxC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAOnC;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgB3C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IASpC;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAetC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAUzC;;;OAGG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * PID file management for procman daemon
3
+ *
4
+ * Manages the daemon.pid file for preventing duplicate daemon processes
5
+ * and tracking daemon process status.
6
+ */
7
+ import * as fs from 'fs/promises';
8
+ /**
9
+ * Manages PID file for daemon process lifecycle
10
+ */
11
+ export class PIDManager {
12
+ dataDirectory;
13
+ constructor(dataDirectory) {
14
+ this.dataDirectory = dataDirectory;
15
+ }
16
+ /**
17
+ * Get the path to the PID file
18
+ */
19
+ getPIDFilePath() {
20
+ return this.dataDirectory.getSubPath('daemon.pid');
21
+ }
22
+ /**
23
+ * Write current process PID to the PID file
24
+ */
25
+ async writePIDFile() {
26
+ const pidFilePath = this.getPIDFilePath();
27
+ const pid = process.pid.toString();
28
+ await this.dataDirectory.createFileWithPermissions(pidFilePath, pid);
29
+ }
30
+ /**
31
+ * Read PID from the PID file
32
+ * @returns PID number or null if file doesn't exist or contains invalid data
33
+ */
34
+ async readPIDFile() {
35
+ try {
36
+ const pidFilePath = this.getPIDFilePath();
37
+ const pidContent = await fs.readFile(pidFilePath, 'utf-8');
38
+ const pid = parseInt(pidContent.trim(), 10);
39
+ if (isNaN(pid) || pid <= 0) {
40
+ return null;
41
+ }
42
+ return pid;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ /**
49
+ * Remove the PID file
50
+ */
51
+ async removePIDFile() {
52
+ try {
53
+ const pidFilePath = this.getPIDFilePath();
54
+ await fs.unlink(pidFilePath);
55
+ }
56
+ catch {
57
+ // Ignore errors - file might not exist
58
+ }
59
+ }
60
+ /**
61
+ * Check if a process with given PID is running
62
+ */
63
+ isProcessRunning(pid) {
64
+ if (pid <= 0) {
65
+ return false;
66
+ }
67
+ try {
68
+ // Signal 0 can be used to check if process exists
69
+ // This doesn't actually send a signal, just checks permissions
70
+ process.kill(pid, 0);
71
+ return true;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ /**
78
+ * Check if daemon is currently running based on PID file
79
+ */
80
+ async isDaemonRunning() {
81
+ const pid = await this.readPIDFile();
82
+ if (pid === null) {
83
+ return false;
84
+ }
85
+ return this.isProcessRunning(pid);
86
+ }
87
+ /**
88
+ * Ensure no daemon is currently running
89
+ * Throws error if daemon is running, cleans up stale PID files
90
+ */
91
+ async ensureNoDaemonRunning() {
92
+ const pid = await this.readPIDFile();
93
+ if (pid === null) {
94
+ // No PID file exists
95
+ return;
96
+ }
97
+ if (this.isProcessRunning(pid)) {
98
+ throw new Error(`Daemon is already running with PID ${pid}`);
99
+ }
100
+ // Clean up stale PID file
101
+ await this.removePIDFile();
102
+ }
103
+ /**
104
+ * Cleanup PID file (typically called on daemon shutdown)
105
+ */
106
+ async cleanup() {
107
+ await this.removePIDFile();
108
+ }
109
+ }
110
+ //# sourceMappingURL=pid-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pid-manager.js","sourceRoot":"","sources":["../../../src/daemon/pid-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAGlC;;GAEG;AACH,MAAM,OAAO,UAAU;IACJ,aAAa,CAAgB;IAE9C,YAAY,aAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAEnC,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAE5C,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,GAAW;QAC1B,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,kDAAkD;YAClD,+DAA+D;YAC/D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,qBAAqB;QACzB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,qBAAqB;YACrB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,0BAA0B;QAC1B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;CACF"}