@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,326 @@
1
+ /**
2
+ * Secure Configuration Loader
3
+ *
4
+ * Provides safer alternatives to using require() for loading configuration files.
5
+ * Implements multiple security modes including sandboxed execution and template-based configs.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as vm from 'vm';
10
+ import { createError } from '../shared/errors.js';
11
+ import { ConfigLoader } from './config-loader.js';
12
+ export var ConfigSecurityMode;
13
+ (function (ConfigSecurityMode) {
14
+ ConfigSecurityMode["LEGACY"] = "legacy";
15
+ ConfigSecurityMode["HYBRID"] = "hybrid";
16
+ ConfigSecurityMode["TEMPLATE"] = "template";
17
+ ConfigSecurityMode["ISOLATED"] = "isolated";
18
+ })(ConfigSecurityMode || (ConfigSecurityMode = {}));
19
+ /**
20
+ * Enhanced ConfigLoader with security modes
21
+ */
22
+ export class SecureConfigLoader extends ConfigLoader {
23
+ securityMode;
24
+ allowedModules;
25
+ sandboxTimeout;
26
+ constructor(options = {}) {
27
+ super(options);
28
+ this.securityMode = options.securityMode || ConfigSecurityMode.LEGACY;
29
+ this.allowedModules = new Set(options.allowedModules || ['path', 'os', 'url']);
30
+ this.sandboxTimeout = options.sandboxTimeout || 1000;
31
+ }
32
+ async load(filePath) {
33
+ switch (this.securityMode) {
34
+ case ConfigSecurityMode.LEGACY:
35
+ console.warn('⚠️ WARNING: Using legacy require() mode to load configuration.\n' +
36
+ ' This allows arbitrary code execution. Consider using HYBRID mode.\n' +
37
+ ' See: https://github.com/yourusername/procman/docs/config-security');
38
+ return super.load(filePath);
39
+ case ConfigSecurityMode.HYBRID:
40
+ return this.loadWithHybridSandbox(filePath);
41
+ case ConfigSecurityMode.TEMPLATE:
42
+ throw createError('CONFIG_SECURITY_ERROR', {
43
+ message: 'Template mode not yet implemented',
44
+ details: { mode: this.securityMode },
45
+ });
46
+ case ConfigSecurityMode.ISOLATED:
47
+ throw createError('CONFIG_SECURITY_ERROR', {
48
+ message: 'Isolated mode not yet implemented. Install isolated-vm package.',
49
+ details: { mode: this.securityMode },
50
+ });
51
+ default:
52
+ throw createError('CONFIG_SECURITY_ERROR', {
53
+ message: `Unknown security mode: ${this.securityMode}`,
54
+ details: { mode: this.securityMode },
55
+ });
56
+ }
57
+ }
58
+ /**
59
+ * Load configuration using VM sandbox with restricted context
60
+ */
61
+ async loadWithHybridSandbox(filePath) {
62
+ const absolutePath = path.resolve(filePath);
63
+ // Validate file exists and is readable
64
+ await this.validateFilePathSecure(filePath);
65
+ const content = await fs.promises.readFile(absolutePath, 'utf-8');
66
+ // Quick check for obvious dangerous patterns
67
+ this.performBasicSecurityCheck(content, absolutePath);
68
+ // Create sandbox context
69
+ const sandbox = this.createSandboxContext(absolutePath);
70
+ try {
71
+ // Compile and run script in sandbox
72
+ const script = new vm.Script(content, {
73
+ filename: path.basename(absolutePath),
74
+ // @ts-expect-error - displayErrors exists but not in types
75
+ displayErrors: true,
76
+ });
77
+ const context = vm.createContext(sandbox);
78
+ script.runInContext(context, { timeout: this.sandboxTimeout });
79
+ // Extract configuration from sandbox
80
+ const config = sandbox.module.exports;
81
+ // Validate the configuration
82
+ this.validator.validateConfig(config);
83
+ return config;
84
+ }
85
+ catch (error) {
86
+ if (error instanceof Error && error.message.includes('timed out')) {
87
+ throw createError('CONFIG_PARSE_ERROR', {
88
+ message: `Configuration script execution timed out after ${this.sandboxTimeout}ms`,
89
+ cause: error,
90
+ details: { filePath: absolutePath, timeout: this.sandboxTimeout },
91
+ });
92
+ }
93
+ throw createError('CONFIG_PARSE_ERROR', {
94
+ message: `Failed to execute configuration in sandbox: ${error instanceof Error ? error.message : String(error)}`,
95
+ cause: error instanceof Error ? error : undefined,
96
+ details: { filePath: absolutePath },
97
+ });
98
+ }
99
+ }
100
+ /**
101
+ * Basic security check for dangerous patterns
102
+ */
103
+ performBasicSecurityCheck(content, filePath) {
104
+ const dangerousPatterns = [
105
+ /child_process/,
106
+ /exec\s*\(/,
107
+ /spawn\s*\(/,
108
+ /eval\s*\(/,
109
+ /Function\s*\(/,
110
+ /\.constructor\s*\(/,
111
+ /__proto__/,
112
+ /process\.exit/,
113
+ /process\.kill/,
114
+ /fs\.(unlink|rmdir|rm)/,
115
+ ];
116
+ for (const pattern of dangerousPatterns) {
117
+ if (pattern.test(content)) {
118
+ throw createError('CONFIG_SECURITY_ERROR', {
119
+ message: `Configuration contains potentially dangerous pattern: ${pattern}`,
120
+ details: {
121
+ filePath,
122
+ pattern: pattern.toString(),
123
+ },
124
+ });
125
+ }
126
+ }
127
+ // Check for require() of non-allowed modules
128
+ const requirePattern = /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
129
+ let match;
130
+ while ((match = requirePattern.exec(content)) !== null) {
131
+ const moduleName = match[1];
132
+ if (!this.allowedModules.has(moduleName) &&
133
+ !moduleName.startsWith('./') &&
134
+ !moduleName.startsWith('../')) {
135
+ throw createError('CONFIG_SECURITY_ERROR', {
136
+ message: `Configuration attempts to require disallowed module: ${moduleName}`,
137
+ details: {
138
+ filePath,
139
+ module: moduleName,
140
+ allowedModules: Array.from(this.allowedModules),
141
+ },
142
+ });
143
+ }
144
+ }
145
+ }
146
+ /**
147
+ * Create sandboxed context for VM execution
148
+ */
149
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
150
+ createSandboxContext(filePath) {
151
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
152
+ const sandbox = {
153
+ // Basic module structure
154
+ module: { exports: {} },
155
+ exports: {},
156
+ // Limited console (no access to real console)
157
+ console: {
158
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
159
+ log: (..._args) => {
160
+ /* silent */
161
+ },
162
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
163
+ error: (..._args) => {
164
+ /* silent */
165
+ },
166
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
167
+ warn: (..._args) => {
168
+ /* silent */
169
+ },
170
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
171
+ info: (..._args) => {
172
+ /* silent */
173
+ },
174
+ },
175
+ // Limited process object
176
+ process: {
177
+ env: { ...process.env },
178
+ platform: process.platform,
179
+ arch: process.arch,
180
+ version: process.version,
181
+ versions: process.versions,
182
+ cwd: () => path.dirname(filePath),
183
+ },
184
+ // Paths relative to config file
185
+ __filename: filePath,
186
+ __dirname: path.dirname(filePath),
187
+ // Controlled require function
188
+ require: (id) => {
189
+ if (!this.allowedModules.has(id)) {
190
+ throw new Error(`Module '${id}' is not allowed in sandboxed configuration`);
191
+ }
192
+ // Limited module access
193
+ switch (id) {
194
+ case 'path':
195
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
196
+ return require('path');
197
+ case 'os':
198
+ return {
199
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
200
+ cpus: require('os').cpus,
201
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
202
+ platform: require('os').platform,
203
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
204
+ arch: require('os').arch,
205
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
206
+ hostname: require('os').hostname,
207
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
208
+ homedir: require('os').homedir,
209
+ };
210
+ case 'url':
211
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
212
+ return require('url');
213
+ default:
214
+ throw new Error(`Module '${id}' is not available in sandboxed configuration`);
215
+ }
216
+ },
217
+ // No access to global object properties
218
+ global: undefined,
219
+ setTimeout: undefined,
220
+ setInterval: undefined,
221
+ setImmediate: undefined,
222
+ Buffer: undefined,
223
+ };
224
+ return sandbox;
225
+ }
226
+ /**
227
+ * Get current security mode
228
+ */
229
+ getSecurityMode() {
230
+ return this.securityMode;
231
+ }
232
+ /**
233
+ * Set security mode (use with caution)
234
+ */
235
+ setSecurityMode(mode) {
236
+ this.securityMode = mode;
237
+ }
238
+ /**
239
+ * Get allowed modules for sandbox
240
+ */
241
+ getAllowedModules() {
242
+ return Array.from(this.allowedModules);
243
+ }
244
+ /**
245
+ * Add allowed module for sandbox
246
+ */
247
+ addAllowedModule(moduleName) {
248
+ this.allowedModules.add(moduleName);
249
+ }
250
+ /**
251
+ * Remove allowed module from sandbox
252
+ */
253
+ removeAllowedModule(moduleName) {
254
+ this.allowedModules.delete(moduleName);
255
+ }
256
+ /**
257
+ * Validate file path exists and is readable
258
+ */
259
+ async validateFilePathSecure(filePath) {
260
+ const absolutePath = path.resolve(filePath);
261
+ if (path.extname(absolutePath) !== '.js') {
262
+ throw createError('CONFIG_VALIDATION_ERROR', {
263
+ message: 'Configuration file must have .js extension',
264
+ details: { filePath: absolutePath },
265
+ });
266
+ }
267
+ try {
268
+ await fs.promises.access(absolutePath, fs.constants.F_OK);
269
+ }
270
+ catch {
271
+ throw createError('CONFIG_FILE_NOT_FOUND', {
272
+ message: `Configuration file not found: ${absolutePath}`,
273
+ details: { filePath: absolutePath },
274
+ });
275
+ }
276
+ try {
277
+ await fs.promises.access(absolutePath, fs.constants.R_OK);
278
+ }
279
+ catch (error) {
280
+ throw createError('PERMISSION_DENIED', {
281
+ message: `Cannot read configuration file: ${absolutePath}`,
282
+ cause: error instanceof Error ? error : undefined,
283
+ details: { filePath: absolutePath },
284
+ });
285
+ }
286
+ return absolutePath;
287
+ }
288
+ /**
289
+ * Validate that a configuration file is safe to load
290
+ */
291
+ async validateConfigSecurity(filePath) {
292
+ const issues = [];
293
+ try {
294
+ const content = await fs.promises.readFile(filePath, 'utf-8');
295
+ // Check for dangerous patterns
296
+ try {
297
+ this.performBasicSecurityCheck(content, filePath);
298
+ }
299
+ catch (error) {
300
+ if (error instanceof Error) {
301
+ issues.push(error.message);
302
+ }
303
+ }
304
+ // Additional checks can be added here
305
+ return {
306
+ safe: issues.length === 0,
307
+ issues,
308
+ };
309
+ }
310
+ catch (error) {
311
+ return {
312
+ safe: false,
313
+ issues: [
314
+ `Failed to read file: ${error instanceof Error ? error.message : String(error)}`,
315
+ ],
316
+ };
317
+ }
318
+ }
319
+ }
320
+ /**
321
+ * Create a secure configuration loader instance
322
+ */
323
+ export function createSecureConfigLoader(options) {
324
+ return new SecureConfigLoader(options);
325
+ }
326
+ //# sourceMappingURL=secure-config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-config-loader.js","sourceRoot":"","sources":["../../../src/config/secure-config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Base Socket Connection Implementation
3
+ *
4
+ * Abstract base class for socket connection implementations.
5
+ * Eliminates code duplication between UnixSocketConnection and NamedPipeConnection.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import * as net from 'net';
9
+ import type { IPCConnection, IPCMessage } from '../shared/ipc.js';
10
+ import { MessageProtocol } from './message-protocol.js';
11
+ import { IDisposable } from './resource-manager.js';
12
+ /**
13
+ * Base socket connection class implementing common functionality
14
+ */
15
+ export declare abstract class BaseSocketConnection extends EventEmitter implements IPCConnection, IDisposable {
16
+ readonly id: string;
17
+ status: 'connected' | 'disconnected' | 'connecting' | 'error';
18
+ readonly connectedAt: number;
19
+ lastActivity: number;
20
+ protected readonly socket: net.Socket;
21
+ protected readonly protocol: MessageProtocol;
22
+ private disposed;
23
+ private readonly cleanup;
24
+ constructor(socket: net.Socket);
25
+ /**
26
+ * Private method to register and track listeners
27
+ */
28
+ private registerListener;
29
+ /**
30
+ * Dispose resources
31
+ */
32
+ dispose(): Promise<void>;
33
+ isDisposed(): boolean;
34
+ /**
35
+ * Get statistics about listener management
36
+ */
37
+ getListenerStats(): {
38
+ managedListeners: number;
39
+ ownListeners: number;
40
+ };
41
+ /**
42
+ * Send message to this connection
43
+ */
44
+ send(message: IPCMessage): Promise<void>;
45
+ /**
46
+ * Close the connection
47
+ */
48
+ close(): Promise<void>;
49
+ /**
50
+ * Force destroy the connection immediately (synchronous)
51
+ */
52
+ destroy(): void;
53
+ /**
54
+ * Check if connection is alive
55
+ */
56
+ isAlive(): boolean;
57
+ /**
58
+ * Write buffer to socket
59
+ */
60
+ private writeToSocket;
61
+ /**
62
+ * Set up socket event handlers
63
+ */
64
+ private setupSocketHandlers;
65
+ }
66
+ //# sourceMappingURL=base-socket-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-socket-connection.d.ts","sourceRoot":"","sources":["../../../src/daemon/base-socket-connection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAE3B,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD;;GAEG;AACH,8BAAsB,oBACpB,SAAQ,YACR,YAAW,aAAa,EAAE,WAAW;IAErC,SAAgB,EAAE,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,YAAY,GAAG,OAAO,CACtD;IACd,SAAgB,WAAW,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IAE5B,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAS;IAGzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAExC,MAAM,EAAE,GAAG,CAAC,MAAM;IAc9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB9B,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACI,gBAAgB,IAAI;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;KACtB;IAcD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CA+B5B"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Base Socket Connection Implementation
3
+ *
4
+ * Abstract base class for socket connection implementations.
5
+ * Eliminates code duplication between UnixSocketConnection and NamedPipeConnection.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { setTimeout, clearTimeout } from 'timers';
9
+ import { generateMessageId } from '../shared/ipc.js';
10
+ import { MessageProtocol } from './message-protocol.js';
11
+ import { EventCleanupHelper } from '../utils/event-cleanup.js';
12
+ /**
13
+ * Base socket connection class implementing common functionality
14
+ */
15
+ export class BaseSocketConnection extends EventEmitter {
16
+ id;
17
+ status = 'connected';
18
+ connectedAt;
19
+ lastActivity;
20
+ socket;
21
+ protocol;
22
+ disposed = false;
23
+ // Use EventCleanupHelper for listener tracking
24
+ cleanup = new EventCleanupHelper();
25
+ constructor(socket) {
26
+ super();
27
+ this.id = generateMessageId();
28
+ this.socket = socket;
29
+ this.connectedAt = Date.now();
30
+ this.lastActivity = Date.now();
31
+ this.protocol = new MessageProtocol();
32
+ // No initialization needed for EventCleanupHelper
33
+ this.setupSocketHandlers();
34
+ }
35
+ /**
36
+ * Private method to register and track listeners
37
+ */
38
+ registerListener(emitter, event, listener) {
39
+ this.cleanup.track(emitter, event, listener);
40
+ }
41
+ /**
42
+ * Dispose resources
43
+ */
44
+ async dispose() {
45
+ if (this.disposed) {
46
+ return;
47
+ }
48
+ this.disposed = true;
49
+ // Clean up all tracked listeners
50
+ await this.cleanup.dispose();
51
+ // Remove all our own event listeners
52
+ this.removeAllListeners();
53
+ // Destroy socket if not already destroyed
54
+ if (!this.socket.destroyed) {
55
+ this.socket.destroy();
56
+ }
57
+ // Listeners cleaned up by EventCleanupHelper
58
+ }
59
+ isDisposed() {
60
+ return this.disposed;
61
+ }
62
+ /**
63
+ * Get statistics about listener management
64
+ */
65
+ getListenerStats() {
66
+ const ownEvents = this.eventNames();
67
+ let ownListenersCount = 0;
68
+ for (const event of ownEvents) {
69
+ ownListenersCount += this.listenerCount(event);
70
+ }
71
+ return {
72
+ managedListeners: this.cleanup.getListenerCount(),
73
+ ownListeners: ownListenersCount,
74
+ };
75
+ }
76
+ /**
77
+ * Send message to this connection
78
+ */
79
+ async send(message) {
80
+ if (this.status !== 'connected') {
81
+ throw new Error('Connection is not active');
82
+ }
83
+ try {
84
+ const buffer = this.protocol.encode(message);
85
+ await this.writeToSocket(buffer);
86
+ this.lastActivity = Date.now();
87
+ }
88
+ catch (error) {
89
+ this.status = 'error';
90
+ this.emit('error', error);
91
+ throw error;
92
+ }
93
+ }
94
+ /**
95
+ * Close the connection
96
+ */
97
+ async close() {
98
+ if (this.status === 'disconnected') {
99
+ return;
100
+ }
101
+ this.status = 'disconnected';
102
+ return new Promise((resolve) => {
103
+ // Set a timeout to prevent hanging
104
+ const timeout = setTimeout(() => {
105
+ if (!this.socket.destroyed) {
106
+ this.socket.destroy();
107
+ }
108
+ this.dispose();
109
+ resolve();
110
+ }, 2000);
111
+ this.socket.once('close', () => {
112
+ clearTimeout(timeout);
113
+ this.emit('close');
114
+ this.dispose();
115
+ resolve();
116
+ });
117
+ // Try graceful close first
118
+ if (!this.socket.destroyed) {
119
+ this.socket.end();
120
+ // Force close after a short delay if not closed gracefully
121
+ setTimeout(() => {
122
+ if (!this.socket.destroyed) {
123
+ this.socket.destroy();
124
+ }
125
+ }, 1000);
126
+ }
127
+ });
128
+ }
129
+ /**
130
+ * Force destroy the connection immediately (synchronous)
131
+ */
132
+ destroy() {
133
+ this.status = 'disconnected';
134
+ if (!this.socket.destroyed) {
135
+ this.socket.destroy();
136
+ }
137
+ this.dispose();
138
+ }
139
+ /**
140
+ * Check if connection is alive
141
+ */
142
+ isAlive() {
143
+ return this.status === 'connected' && !this.socket.destroyed;
144
+ }
145
+ /**
146
+ * Write buffer to socket
147
+ */
148
+ writeToSocket(buffer) {
149
+ return new Promise((resolve, reject) => {
150
+ this.socket.write(buffer, (error) => {
151
+ if (error) {
152
+ reject(error);
153
+ }
154
+ else {
155
+ resolve();
156
+ }
157
+ });
158
+ });
159
+ }
160
+ /**
161
+ * Set up socket event handlers
162
+ */
163
+ setupSocketHandlers() {
164
+ const dataHandler = (data) => {
165
+ try {
166
+ this.lastActivity = Date.now();
167
+ this.emit('data', data);
168
+ }
169
+ catch (error) {
170
+ this.emit('error', error);
171
+ }
172
+ };
173
+ const errorHandler = (error) => {
174
+ this.status = 'error';
175
+ this.emit('error', error);
176
+ };
177
+ const closeHandler = () => {
178
+ this.status = 'disconnected';
179
+ this.emit('close');
180
+ };
181
+ const endHandler = () => {
182
+ this.status = 'disconnected';
183
+ this.emit('end');
184
+ };
185
+ // Register and track event listeners with EventCleanupHelper
186
+ this.registerListener(this.socket, 'data', dataHandler);
187
+ this.registerListener(this.socket, 'error', errorHandler);
188
+ this.registerListener(this.socket, 'close', closeHandler);
189
+ this.registerListener(this.socket, 'end', endHandler);
190
+ }
191
+ }
192
+ //# sourceMappingURL=base-socket-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-socket-connection.js","sourceRoot":"","sources":["../../../src/daemon/base-socket-connection.ts"],"names":[],"mappings":"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"}