@masuidrive/procman 0.1.1 → 0.2.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 (204) hide show
  1. package/dist/src/cli/commands/help.d.ts.map +1 -1
  2. package/dist/src/cli/commands/help.js +3 -1
  3. package/dist/src/cli/commands/help.js.map +1 -1
  4. package/dist/src/cli/index.js +6 -2
  5. package/dist/src/cli/index.js.map +1 -1
  6. package/dist/src/cli/parser.d.ts.map +1 -1
  7. package/dist/src/cli/parser.js +20 -0
  8. package/dist/src/cli/parser.js.map +1 -1
  9. package/dist/src/cli/utils/find-package-json.d.ts +4 -0
  10. package/dist/src/cli/utils/find-package-json.d.ts.map +1 -0
  11. package/dist/src/cli/utils/find-package-json.js +15 -0
  12. package/dist/src/cli/utils/find-package-json.js.map +1 -0
  13. package/dist/src/config/config-loader.d.ts +1 -0
  14. package/dist/src/config/config-loader.d.ts.map +1 -1
  15. package/dist/src/config/config-loader.js +16 -6
  16. package/dist/src/config/config-loader.js.map +1 -1
  17. package/dist/src/config/config-validator.d.ts +18 -49
  18. package/dist/src/config/config-validator.d.ts.map +1 -1
  19. package/dist/src/config/config-validator.js +64 -172
  20. package/dist/src/config/config-validator.js.map +1 -1
  21. package/dist/src/config/path-security-validator.d.ts +39 -0
  22. package/dist/src/config/path-security-validator.d.ts.map +1 -0
  23. package/dist/src/config/path-security-validator.js +134 -0
  24. package/dist/src/config/path-security-validator.js.map +1 -0
  25. package/dist/src/config/secure-config-loader.d.ts.map +1 -1
  26. package/dist/src/config/secure-config-loader.js +10 -2
  27. package/dist/src/config/secure-config-loader.js.map +1 -1
  28. package/dist/src/config/validation-suggestions.d.ts +13 -0
  29. package/dist/src/config/validation-suggestions.d.ts.map +1 -0
  30. package/dist/src/config/validation-suggestions.js +40 -0
  31. package/dist/src/config/validation-suggestions.js.map +1 -0
  32. package/dist/src/config/validation-types.d.ts +38 -0
  33. package/dist/src/config/validation-types.d.ts.map +1 -0
  34. package/dist/src/config/validation-types.js +7 -0
  35. package/dist/src/config/validation-types.js.map +1 -0
  36. package/dist/src/daemon/component-command-wiring.d.ts +19 -0
  37. package/dist/src/daemon/component-command-wiring.d.ts.map +1 -0
  38. package/dist/src/daemon/component-command-wiring.js +27 -0
  39. package/dist/src/daemon/component-command-wiring.js.map +1 -0
  40. package/dist/src/daemon/component-daemon-interface.d.ts +38 -0
  41. package/dist/src/daemon/component-daemon-interface.d.ts.map +1 -0
  42. package/dist/src/daemon/component-daemon-interface.js +72 -0
  43. package/dist/src/daemon/component-daemon-interface.js.map +1 -0
  44. package/dist/src/daemon/component-health.d.ts +38 -0
  45. package/dist/src/daemon/component-health.d.ts.map +1 -0
  46. package/dist/src/daemon/component-health.js +146 -0
  47. package/dist/src/daemon/component-health.js.map +1 -0
  48. package/dist/src/daemon/component-manager-errors.d.ts +20 -0
  49. package/dist/src/daemon/component-manager-errors.d.ts.map +1 -0
  50. package/dist/src/daemon/component-manager-errors.js +30 -0
  51. package/dist/src/daemon/component-manager-errors.js.map +1 -0
  52. package/dist/src/daemon/component-manager-types.d.ts +23 -0
  53. package/dist/src/daemon/component-manager-types.d.ts.map +1 -0
  54. package/dist/src/daemon/component-manager-types.js +5 -0
  55. package/dist/src/daemon/component-manager-types.js.map +1 -0
  56. package/dist/src/daemon/component-manager.d.ts +16 -64
  57. package/dist/src/daemon/component-manager.d.ts.map +1 -1
  58. package/dist/src/daemon/component-manager.js +72 -509
  59. package/dist/src/daemon/component-manager.js.map +1 -1
  60. package/dist/src/daemon/component-registration.d.ts +14 -0
  61. package/dist/src/daemon/component-registration.d.ts.map +1 -0
  62. package/dist/src/daemon/component-registration.js +92 -0
  63. package/dist/src/daemon/component-registration.js.map +1 -0
  64. package/dist/src/daemon/component-streaming.d.ts +36 -0
  65. package/dist/src/daemon/component-streaming.d.ts.map +1 -0
  66. package/dist/src/daemon/component-streaming.js +112 -0
  67. package/dist/src/daemon/component-streaming.js.map +1 -0
  68. package/dist/src/daemon/daemon-lifecycle.d.ts +37 -0
  69. package/dist/src/daemon/daemon-lifecycle.d.ts.map +1 -0
  70. package/dist/src/daemon/daemon-lifecycle.js +362 -0
  71. package/dist/src/daemon/daemon-lifecycle.js.map +1 -0
  72. package/dist/src/daemon/daemon-queries.d.ts +53 -0
  73. package/dist/src/daemon/daemon-queries.d.ts.map +1 -0
  74. package/dist/src/daemon/daemon-queries.js +113 -0
  75. package/dist/src/daemon/daemon-queries.js.map +1 -0
  76. package/dist/src/daemon/daemon-types.d.ts +30 -0
  77. package/dist/src/daemon/daemon-types.d.ts.map +1 -0
  78. package/dist/src/daemon/daemon-types.js +8 -0
  79. package/dist/src/daemon/daemon-types.js.map +1 -0
  80. package/dist/src/daemon/disposable-base.d.ts +49 -0
  81. package/dist/src/daemon/disposable-base.d.ts.map +1 -0
  82. package/dist/src/daemon/disposable-base.js +70 -0
  83. package/dist/src/daemon/disposable-base.js.map +1 -0
  84. package/dist/src/daemon/disposal-guard.d.ts +27 -0
  85. package/dist/src/daemon/disposal-guard.d.ts.map +1 -0
  86. package/dist/src/daemon/disposal-guard.js +58 -0
  87. package/dist/src/daemon/disposal-guard.js.map +1 -0
  88. package/dist/src/daemon/ipc-command-handler.d.ts +8 -34
  89. package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -1
  90. package/dist/src/daemon/ipc-command-handler.js +14 -362
  91. package/dist/src/daemon/ipc-command-handler.js.map +1 -1
  92. package/dist/src/daemon/log-command-handlers.d.ts +19 -0
  93. package/dist/src/daemon/log-command-handlers.d.ts.map +1 -0
  94. package/dist/src/daemon/log-command-handlers.js +114 -0
  95. package/dist/src/daemon/log-command-handlers.js.map +1 -0
  96. package/dist/src/daemon/process-command-handlers.d.ts +32 -0
  97. package/dist/src/daemon/process-command-handlers.d.ts.map +1 -0
  98. package/dist/src/daemon/process-command-handlers.js +223 -0
  99. package/dist/src/daemon/process-command-handlers.js.map +1 -0
  100. package/dist/src/daemon/procman-daemon.d.ts +22 -98
  101. package/dist/src/daemon/procman-daemon.d.ts.map +1 -1
  102. package/dist/src/daemon/procman-daemon.js +107 -604
  103. package/dist/src/daemon/procman-daemon.js.map +1 -1
  104. package/dist/src/daemon/resource-manager.d.ts +6 -124
  105. package/dist/src/daemon/resource-manager.d.ts.map +1 -1
  106. package/dist/src/daemon/resource-manager.js +5 -231
  107. package/dist/src/daemon/resource-manager.js.map +1 -1
  108. package/dist/src/daemon/resource-types.d.ts +23 -0
  109. package/dist/src/daemon/resource-types.d.ts.map +1 -0
  110. package/dist/src/daemon/resource-types.js +7 -0
  111. package/dist/src/daemon/resource-types.js.map +1 -0
  112. package/dist/src/daemon/shutdown-orchestrator.d.ts +32 -0
  113. package/dist/src/daemon/shutdown-orchestrator.d.ts.map +1 -0
  114. package/dist/src/daemon/shutdown-orchestrator.js +123 -0
  115. package/dist/src/daemon/shutdown-orchestrator.js.map +1 -0
  116. package/dist/src/daemon/tracked-resources.d.ts +60 -0
  117. package/dist/src/daemon/tracked-resources.d.ts.map +1 -0
  118. package/dist/src/daemon/tracked-resources.js +124 -0
  119. package/dist/src/daemon/tracked-resources.js.map +1 -0
  120. package/dist/src/process-manager/index.d.ts +5 -1
  121. package/dist/src/process-manager/index.d.ts.map +1 -1
  122. package/dist/src/process-manager/index.js +3 -0
  123. package/dist/src/process-manager/index.js.map +1 -1
  124. package/dist/src/process-manager/interfaces/process-group.d.ts +6 -0
  125. package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -1
  126. package/dist/src/process-manager/managed-process-events.d.ts +22 -0
  127. package/dist/src/process-manager/managed-process-events.d.ts.map +1 -0
  128. package/dist/src/process-manager/managed-process-events.js +5 -0
  129. package/dist/src/process-manager/managed-process-events.js.map +1 -0
  130. package/dist/src/process-manager/managed-process-info.d.ts +11 -53
  131. package/dist/src/process-manager/managed-process-info.d.ts.map +1 -1
  132. package/dist/src/process-manager/managed-process-info.js +46 -133
  133. package/dist/src/process-manager/managed-process-info.js.map +1 -1
  134. package/dist/src/process-manager/process-batch-operations.d.ts +62 -0
  135. package/dist/src/process-manager/process-batch-operations.d.ts.map +1 -0
  136. package/dist/src/process-manager/process-batch-operations.js +80 -0
  137. package/dist/src/process-manager/process-batch-operations.js.map +1 -0
  138. package/dist/src/process-manager/process-config.d.ts +49 -0
  139. package/dist/src/process-manager/process-config.d.ts.map +1 -0
  140. package/dist/src/process-manager/process-config.js +68 -0
  141. package/dist/src/process-manager/process-config.js.map +1 -0
  142. package/dist/src/process-manager/process-event-forwarding.d.ts +18 -0
  143. package/dist/src/process-manager/process-event-forwarding.d.ts.map +1 -0
  144. package/dist/src/process-manager/process-event-forwarding.js +105 -0
  145. package/dist/src/process-manager/process-event-forwarding.js.map +1 -0
  146. package/dist/src/process-manager/process-group-manager.d.ts.map +1 -1
  147. package/dist/src/process-manager/process-group-manager.js +0 -1
  148. package/dist/src/process-manager/process-group-manager.js.map +1 -1
  149. package/dist/src/process-manager/process-info-queries.d.ts +48 -0
  150. package/dist/src/process-manager/process-info-queries.d.ts.map +1 -0
  151. package/dist/src/process-manager/process-info-queries.js +92 -0
  152. package/dist/src/process-manager/process-info-queries.js.map +1 -0
  153. package/dist/src/process-manager/process-manager.d.ts +5 -174
  154. package/dist/src/process-manager/process-manager.d.ts.map +1 -1
  155. package/dist/src/process-manager/process-manager.js +58 -398
  156. package/dist/src/process-manager/process-manager.js.map +1 -1
  157. package/dist/src/process-manager/process-monitoring.d.ts +80 -0
  158. package/dist/src/process-manager/process-monitoring.d.ts.map +1 -0
  159. package/dist/src/process-manager/process-monitoring.js +142 -0
  160. package/dist/src/process-manager/process-monitoring.js.map +1 -0
  161. package/dist/src/process-manager/process-statistics.d.ts +37 -0
  162. package/dist/src/process-manager/process-statistics.d.ts.map +1 -0
  163. package/dist/src/process-manager/process-statistics.js +24 -0
  164. package/dist/src/process-manager/process-statistics.js.map +1 -0
  165. package/dist/src/process-manager/restart-manager.d.ts +82 -0
  166. package/dist/src/process-manager/restart-manager.d.ts.map +1 -0
  167. package/dist/src/process-manager/restart-manager.js +150 -0
  168. package/dist/src/process-manager/restart-manager.js.map +1 -0
  169. package/dist/src/services/app-logger.d.ts +144 -0
  170. package/dist/src/services/app-logger.d.ts.map +1 -0
  171. package/dist/src/services/app-logger.js +489 -0
  172. package/dist/src/services/app-logger.js.map +1 -0
  173. package/dist/src/services/log-buffer.d.ts +35 -0
  174. package/dist/src/services/log-buffer.d.ts.map +1 -0
  175. package/dist/src/services/log-buffer.js +87 -0
  176. package/dist/src/services/log-buffer.js.map +1 -0
  177. package/dist/src/services/log-event-manager.d.ts +32 -0
  178. package/dist/src/services/log-event-manager.d.ts.map +1 -0
  179. package/dist/src/services/log-event-manager.js +31 -0
  180. package/dist/src/services/log-event-manager.js.map +1 -0
  181. package/dist/src/services/log-file-manager.d.ts +46 -0
  182. package/dist/src/services/log-file-manager.d.ts.map +1 -0
  183. package/dist/src/services/log-file-manager.js +156 -0
  184. package/dist/src/services/log-file-manager.js.map +1 -0
  185. package/dist/src/services/log-level-strategy.d.ts +19 -0
  186. package/dist/src/services/log-level-strategy.d.ts.map +1 -0
  187. package/dist/src/services/log-level-strategy.js +40 -0
  188. package/dist/src/services/log-level-strategy.js.map +1 -0
  189. package/dist/src/services/log-manager-types.d.ts +117 -0
  190. package/dist/src/services/log-manager-types.d.ts.map +1 -0
  191. package/dist/src/services/log-manager-types.js +12 -0
  192. package/dist/src/services/log-manager-types.js.map +1 -0
  193. package/dist/src/services/log-manager.d.ts +8 -35
  194. package/dist/src/services/log-manager.d.ts.map +1 -1
  195. package/dist/src/services/log-manager.js +10 -870
  196. package/dist/src/services/log-manager.js.map +1 -1
  197. package/dist/src/services/log-preprocessor.d.ts +30 -0
  198. package/dist/src/services/log-preprocessor.d.ts.map +1 -0
  199. package/dist/src/services/log-preprocessor.js +65 -0
  200. package/dist/src/services/log-preprocessor.js.map +1 -0
  201. package/dist/src/services/process-log-integration.d.ts +7 -2
  202. package/dist/src/services/process-log-integration.d.ts.map +1 -1
  203. package/dist/src/services/process-log-integration.js.map +1 -1
  204. package/package.json +5 -7
@@ -19,10 +19,10 @@ import { ProcessMonitorImpl } from './process-monitor.js';
19
19
  import { ProcessPersistenceImpl } from './process-persistence.js';
20
20
  import { ProcessGroupManagerImpl } from './process-group-manager.js';
21
21
  import { ManagedProcessInfo } from './managed-process-info.js';
22
- import { parseMemorySize } from '../shared/config.js';
23
- /**
24
- * Type definition for batch operation results
25
- */
22
+ import { validateAppConfig, convertAppConfigToProcessConfig, } from './process-config.js';
23
+ import { setupEventForwarding, setupInternalEventHandlers, } from './process-event-forwarding.js';
24
+ import * as ProcessInfoQueries from './process-info-queries.js';
25
+ import * as BatchOps from './process-batch-operations.js';
26
26
  /**
27
27
  * ProcessManager - Main facade class for process management
28
28
  *
@@ -51,7 +51,6 @@ export class ProcessManager extends EventEmitter {
51
51
  this.monitor = new ProcessMonitorImpl(this.processes, this.childProcesses);
52
52
  this.persistence = new ProcessPersistenceImpl(this.processes);
53
53
  // Initialize persistence with default config
54
- // Enhanced HOME detection: process.env.HOME || os.homedir()
55
54
  const homeDir = process.env.HOME || os.homedir();
56
55
  if (!homeDir && !persistenceFilePath) {
57
56
  throw new Error('Unable to determine home directory for persistence path');
@@ -69,107 +68,9 @@ export class ProcessManager extends EventEmitter {
69
68
  restartProcess: (name) => this.lifecycle.restartProcess(name),
70
69
  });
71
70
  // Forward events from components
72
- this.setupEventForwarding();
71
+ setupEventForwarding(this, this.processes, this.lifecycle, this.monitor, this.persistence, this.groups);
73
72
  // Setup internal event handlers
74
- this.setupInternalEventHandlers();
75
- }
76
- /**
77
- * Set up event forwarding from components to maintain compatibility
78
- */
79
- setupEventForwarding() {
80
- // Cast components to EventEmitter for event forwarding
81
- const lifecycleEmitter = this.lifecycle;
82
- const monitorEmitter = this.monitor;
83
- const persistenceEmitter = this.persistence;
84
- const groupsEmitter = this.groups;
85
- // Forward lifecycle events
86
- lifecycleEmitter.on('process:started', (name) => {
87
- const processInfo = this.processes.get(name)?.getProcessInfo();
88
- if (processInfo) {
89
- this.emit('process:started', name, processInfo);
90
- }
91
- });
92
- lifecycleEmitter.on('process:stopped', (name) => {
93
- const processInfo = this.processes.get(name)?.getProcessInfo();
94
- if (processInfo) {
95
- this.emit('process:stopped', name, processInfo);
96
- }
97
- });
98
- lifecycleEmitter.on('process:exit', (name, code, signal) => {
99
- this.emit('process:exit', name, code, signal);
100
- });
101
- lifecycleEmitter.on('process:error', (name, error) => {
102
- this.emit('process:error', name, error);
103
- });
104
- lifecycleEmitter.on('process:restart', (name) => {
105
- this.emit('process:restart', name);
106
- });
107
- lifecycleEmitter.on('process:restarted', (name) => {
108
- this.emit('process:restarted', name);
109
- });
110
- // Forward monitor events
111
- monitorEmitter.on('process:memory-limit', (data) => {
112
- this.emit('process:memory-limit', data.name, data.usage, data.limit);
113
- });
114
- monitorEmitter.on('process:unhealthy', (data) => {
115
- this.emit('process:unhealthy', data.name, data.consecutiveFailures);
116
- });
117
- monitorEmitter.on('process:died', (data) => {
118
- this.emit('process:died', data.name);
119
- });
120
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
- monitorEmitter.on('process:stats', (data) => {
122
- this.emit('process:stats', data.name, data.stats);
123
- });
124
- // Forward persistence events
125
- persistenceEmitter.on('persistence:saved', (filePath) => {
126
- this.emit('persistence:saved', filePath);
127
- });
128
- persistenceEmitter.on('persistence:save-error', (error) => {
129
- this.emit('persistence:save-error', error);
130
- });
131
- persistenceEmitter.on('persistence:loaded', (filePath, processCount) => {
132
- this.emit('persistence:loaded', filePath, processCount);
133
- });
134
- persistenceEmitter.on('persistence:load-error', (error) => {
135
- this.emit('persistence:load-error', error);
136
- });
137
- // Forward group events
138
- groupsEmitter.on('namespace:operation-start', (namespace, operation) => {
139
- this.emit('namespace:operation-start', namespace, operation);
140
- });
141
- groupsEmitter.on('namespace:operation-complete',
142
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
143
- (namespace, operation, results) => {
144
- this.emit('namespace:operation-complete', namespace, operation, results);
145
- });
146
- groupsEmitter.on('batch:operation-start', (processNames, operation) => {
147
- this.emit('batch:operation-start', processNames, operation);
148
- });
149
- groupsEmitter.on('batch:operation-complete',
150
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
151
- (operation, results) => {
152
- this.emit('batch:operation-complete', operation, results);
153
- });
154
- }
155
- /**
156
- * Set up internal event handlers for process management
157
- */
158
- setupInternalEventHandlers() {
159
- // Handle memory limit exceeded - trigger restart
160
- this.on('process:memory-limit', async (name, usage, limit) => {
161
- console.log(`Process '${name}' exceeded memory limit: ${Math.round(usage / 1024 / 1024)}MB > ${Math.round(limit / 1024 / 1024)}MB`);
162
- const managedProcess = this.processes.get(name);
163
- if (managedProcess && managedProcess.isAutoRestartEnabled()) {
164
- console.log(`Auto-restarting process '${name}' due to memory limit`);
165
- try {
166
- await this.restartProcess(name);
167
- }
168
- catch (error) {
169
- console.error(`Failed to restart process '${name}' after memory limit:`, error);
170
- }
171
- }
172
- });
73
+ setupInternalEventHandlers(this, this.processes, (name) => this.restartProcess(name));
173
74
  }
174
75
  /**
175
76
  * Static factory method to create ProcessManager with default components
@@ -178,134 +79,46 @@ export class ProcessManager extends EventEmitter {
178
79
  return new ProcessManager(healthCheckInterval, memoryCheckInterval, persistenceFilePath);
179
80
  }
180
81
  // ===== CONFIGURATION MANAGEMENT =====
181
- /**
182
- * Configure a process from app configuration
183
- */
184
82
  configureProcess(appConfig) {
185
- // t_wada boundary principle: validate inputs at boundaries
186
- if (appConfig == null) {
187
- throw new Error('App configuration cannot be null or undefined');
188
- }
189
- if (typeof appConfig !== 'object') {
190
- throw new Error('App configuration must be an object');
191
- }
192
- if (!appConfig.name || typeof appConfig.name !== 'string') {
193
- throw new Error('App configuration must have a valid name');
194
- }
195
- // Validate process name contains only safe characters
196
- const namePattern = /^[a-zA-Z0-9_-]+$/;
197
- if (!namePattern.test(appConfig.name.trim())) {
198
- throw new Error(`Invalid process name: "${appConfig.name}". Name must contain only alphanumeric characters, hyphens, and underscores`);
199
- }
200
- const processConfig = this.convertAppConfigToProcessConfig(appConfig);
83
+ validateAppConfig(appConfig);
84
+ const processConfig = convertAppConfigToProcessConfig(appConfig);
201
85
  this.processConfigs.set(appConfig.name, processConfig);
202
- // Initialize process info if not exists
203
86
  if (!this.processes.has(appConfig.name)) {
204
87
  this.initializeProcess(appConfig.name);
205
88
  }
206
89
  }
207
- /**
208
- * Remove process configuration
209
- */
210
90
  removeProcessConfig(name) {
211
91
  this.processConfigs.delete(name);
212
92
  }
213
- /**
214
- * Get process configuration
215
- */
216
93
  getProcessConfig(name) {
217
94
  return this.processConfigs.get(name);
218
95
  }
219
- // ===== PROCESS INFO ACCESS =====
220
- /**
221
- * Get process information
222
- */
96
+ // ===== PROCESS INFO ACCESS (delegated to ProcessInfoQueries) =====
223
97
  getProcessInfo(name) {
224
- const processInfo = this.processes.get(name);
225
- return processInfo?.getProcessInfo();
98
+ return ProcessInfoQueries.getProcessInfo(this.processes, name);
226
99
  }
227
- /**
228
- * Get all process information
229
- */
230
100
  getAllProcessInfo() {
231
- return Array.from(this.processes.values()).map((p) => p.getProcessInfo());
101
+ return ProcessInfoQueries.getAllProcessInfo(this.processes);
232
102
  }
233
- /**
234
- * Get processes by namespace
235
- */
236
103
  getProcessesByNamespace(namespace) {
237
- return Array.from(this.processes.values())
238
- .filter((p) => p.getProcessInfo().namespace === namespace)
239
- .map((p) => p.getProcessInfo());
104
+ return ProcessInfoQueries.getProcessesByNamespace(this.processes, namespace);
240
105
  }
241
- /**
242
- * Get process names by namespace
243
- */
244
106
  getProcessNamesByNamespace(namespace) {
245
- return Array.from(this.processes.values())
246
- .filter((p) => p.getProcessInfo().namespace === namespace)
247
- .map((p) => p.getProcessInfo().name);
107
+ return ProcessInfoQueries.getProcessNamesByNamespace(this.processes, namespace);
248
108
  }
249
- /**
250
- * Get all namespaces
251
- */
252
109
  getNamespaces() {
253
- const namespaces = new Set();
254
- for (const processInfo of this.processes.values()) {
255
- namespaces.add(processInfo.getProcessInfo().namespace || 'default');
256
- }
257
- return Array.from(namespaces).sort();
110
+ return ProcessInfoQueries.getNamespaces(this.processes);
258
111
  }
259
- /**
260
- * Get namespace status
261
- */
262
112
  getNamespaceStatus(namespace) {
263
- const processes = this.getProcessesByNamespace(namespace);
264
- const status = {
265
- total: processes.length,
266
- online: 0,
267
- stopped: 0,
268
- errored: 0,
269
- starting: 0,
270
- stopping: 0,
271
- };
272
- for (const process of processes) {
273
- switch (process.status) {
274
- case 'online':
275
- status.online++;
276
- break;
277
- case 'stopped':
278
- status.stopped++;
279
- break;
280
- case 'errored':
281
- status.errored++;
282
- break;
283
- case 'starting':
284
- status.starting++;
285
- break;
286
- case 'stopping':
287
- status.stopping++;
288
- break;
289
- }
290
- }
291
- return status;
113
+ return ProcessInfoQueries.getNamespaceStatus(this.processes, namespace);
292
114
  }
293
- /**
294
- * Get all process names
295
- */
296
115
  getProcessNames() {
297
- return Array.from(this.processes.keys()).sort();
116
+ return ProcessInfoQueries.getProcessNames(this.processes);
298
117
  }
299
- /**
300
- * Check if process exists
301
- */
302
118
  hasProcess(name) {
303
- return this.processes.has(name);
119
+ return ProcessInfoQueries.hasProcess(this.processes, name);
304
120
  }
305
121
  // ===== PROCESS LIFECYCLE MANAGEMENT =====
306
- /**
307
- * Initialize a process (create ManagedProcessInfo)
308
- */
309
122
  initializeProcess(name) {
310
123
  if (this.processes.has(name)) {
311
124
  return false;
@@ -316,7 +129,6 @@ export class ProcessManager extends EventEmitter {
316
129
  }
317
130
  const processInfo = new ManagedProcessInfo(config);
318
131
  this.processes.set(name, processInfo);
319
- // Forward ManagedProcessInfo events
320
132
  processInfo.on('start', () => {
321
133
  this.emit('process:started', name, processInfo.getProcessInfo());
322
134
  });
@@ -328,25 +140,17 @@ export class ProcessManager extends EventEmitter {
328
140
  });
329
141
  return true;
330
142
  }
331
- /**
332
- * Remove a process
333
- */
334
143
  removeProcess(name) {
335
144
  const processInfo = this.processes.get(name);
336
145
  if (!processInfo) {
337
146
  return false;
338
147
  }
339
- // Clean up and remove
340
148
  processInfo.dispose();
341
149
  this.processes.delete(name);
342
150
  this.processConfigs.delete(name);
343
151
  return true;
344
152
  }
345
- /**
346
- * Start a process
347
- */
348
153
  async startProcess(name) {
349
- // t_wada boundary principle: validate inputs at boundaries
350
154
  if (name == null) {
351
155
  throw new Error('Process name cannot be null or undefined');
352
156
  }
@@ -361,250 +165,147 @@ export class ProcessManager extends EventEmitter {
361
165
  throw new Error(result.error || `Failed to start process: ${name}`);
362
166
  }
363
167
  }
364
- /**
365
- * Stop a process
366
- */
367
168
  async stopProcess(name) {
368
169
  const result = await this.lifecycle.stopProcess(name);
369
170
  if (!result.success) {
370
171
  throw new Error(result.error || `Failed to stop process: ${name}`);
371
172
  }
372
173
  }
373
- /**
374
- * Restart a process
375
- */
376
174
  async restartProcess(name) {
377
175
  const result = await this.lifecycle.restartProcess(name);
378
176
  if (!result.success) {
379
177
  throw new Error(result.error || `Failed to restart process: ${name}`);
380
178
  }
381
179
  }
382
- // ===== BATCH OPERATIONS =====
383
- /**
384
- * Start multiple processes
385
- */
180
+ // ===== BATCH OPERATIONS (delegated to BatchOps) =====
386
181
  async startProcesses(names) {
387
- const result = await this.groups.startProcesses(names);
388
- return result.results;
182
+ return BatchOps.startProcesses(this.groups, names);
389
183
  }
390
- /**
391
- * Stop multiple processes
392
- */
393
184
  async stopProcesses(names) {
394
- const result = await this.groups.stopProcesses(names);
395
- return result.results;
185
+ return BatchOps.stopProcesses(this.groups, names);
396
186
  }
397
- /**
398
- * Restart multiple processes
399
- */
400
187
  async restartProcesses(names) {
401
- const result = await this.groups.restartProcesses(names);
402
- return result.results;
188
+ return BatchOps.restartProcesses(this.groups, names);
403
189
  }
404
- /**
405
- * Start all processes in a namespace
406
- */
407
190
  async startNamespace(namespace) {
408
- const result = await this.groups.startNamespace(namespace);
409
- return result.results;
191
+ return BatchOps.startNamespace(this.groups, namespace);
410
192
  }
411
- /**
412
- * Stop all processes in a namespace
413
- */
414
193
  async stopNamespace(namespace) {
415
- const result = await this.groups.stopNamespace(namespace);
416
- return result.results;
194
+ return BatchOps.stopNamespace(this.groups, namespace);
417
195
  }
418
- /**
419
- * Restart all processes in a namespace
420
- */
421
196
  async restartNamespace(namespace) {
422
- const result = await this.groups.restartNamespace(namespace);
423
- return result.results;
197
+ return BatchOps.restartNamespace(this.groups, namespace);
424
198
  }
425
199
  // ===== MONITORING MANAGEMENT =====
426
- /**
427
- * Start monitoring all processes
428
- */
429
200
  startMonitoring() {
430
201
  this.monitor.startMonitoring({
431
202
  healthCheckInterval: this.healthCheckInterval,
432
203
  memoryCheckInterval: this.memoryCheckInterval,
433
204
  });
434
205
  }
435
- /**
436
- * Stop monitoring all processes
437
- */
438
206
  stopMonitoring() {
439
207
  this.monitor.stopMonitoring();
440
208
  }
441
209
  // ===== AUTO-RESTART MANAGEMENT =====
442
- /**
443
- * Enable auto-restart for a process
444
- */
445
210
  enableAutoRestart(name) {
446
211
  const processInfo = this.processes.get(name);
447
- if (processInfo && 'enableAutoRestart' in processInfo) {
448
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
449
- processInfo.enableAutoRestart();
212
+ if (processInfo) {
213
+ processInfo.setAutoRestartEnabled(true);
450
214
  }
451
215
  }
452
- /**
453
- * Disable auto-restart for a process
454
- */
455
216
  disableAutoRestart(name) {
456
217
  const processInfo = this.processes.get(name);
457
- if (processInfo && 'disableAutoRestart' in processInfo) {
458
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
459
- processInfo.disableAutoRestart();
218
+ if (processInfo) {
219
+ processInfo.setAutoRestartEnabled(false);
460
220
  }
461
221
  }
462
- /**
463
- * Reset restart failures for a process
464
- */
465
222
  resetRestartFailures(name) {
466
223
  const processInfo = this.processes.get(name);
467
- if (processInfo && 'resetRestartFailures' in processInfo) {
468
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
224
+ if (processInfo) {
469
225
  processInfo.resetRestartFailures();
470
226
  }
471
227
  }
472
- /**
473
- * Get auto-restart status for a process
474
- */
475
228
  getAutoRestartStatus(name) {
476
229
  const processInfo = this.processes.get(name);
477
- if (!processInfo || !('getAutoRestartStatus' in processInfo)) {
478
- return {
479
- enabled: false,
480
- consecutiveFailures: 0,
481
- };
230
+ if (!processInfo) {
231
+ return { enabled: false, consecutiveFailures: 0 };
482
232
  }
483
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
484
- return processInfo.getAutoRestartStatus();
233
+ return {
234
+ enabled: processInfo.isAutoRestartEnabled(),
235
+ consecutiveFailures: processInfo.getConsecutiveFailures(),
236
+ };
485
237
  }
486
- // ===== DEPENDENCY MANAGEMENT =====
487
- /**
488
- * Configure a process dependency
489
- */
238
+ // ===== DEPENDENCY MANAGEMENT (delegated to BatchOps) =====
490
239
  configureDependency(dependency) {
491
- this.groups.configureDependency(dependency);
240
+ BatchOps.configureDependency(this.groups, dependency);
492
241
  }
493
- /**
494
- * Remove a process dependency
495
- */
496
242
  removeDependency(name) {
497
- this.groups.removeDependency(name);
243
+ BatchOps.removeDependency(this.groups, name);
498
244
  }
499
- /**
500
- * Get process dependency
501
- */
502
245
  getDependency(name) {
503
- return this.groups.getDependency(name);
246
+ return BatchOps.getDependency(this.groups, name);
504
247
  }
505
- /**
506
- * Get all dependencies
507
- */
508
248
  getAllDependencies() {
509
- return this.groups.getAllDependencies();
249
+ return BatchOps.getAllDependencies(this.groups);
510
250
  }
511
- /**
512
- * Resolve dependencies for a set of processes
513
- */
514
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
515
251
  resolveDependencies(names) {
516
- return this.groups.resolveDependencies(names);
252
+ return BatchOps.resolveDependencies(this.groups, names);
517
253
  }
518
- /**
519
- * Start processes with dependencies
520
- */
521
254
  async startProcessesWithDependencies(processNames) {
522
- // This is a placeholder for future implementation
523
- // For now, just start processes in order
524
255
  return this.startProcesses(processNames);
525
256
  }
526
- /**
527
- * Start dependency monitoring
528
- */
529
257
  startDependencyMonitoring() {
530
258
  // Placeholder for future implementation
531
259
  }
532
- /**
533
- * Stop dependency monitoring
534
- */
535
260
  stopDependencyMonitoring() {
536
261
  // Placeholder for future implementation
537
262
  }
538
263
  // ===== PERSISTENCE MANAGEMENT =====
539
- /**
540
- * Initialize the process manager
541
- */
542
264
  async initialize() {
543
265
  if (this.isInitialized) {
544
266
  return;
545
267
  }
546
- // Load persisted state
547
268
  const persistedProcesses = await this.persistence.loadState();
548
- // Restore process states
549
269
  for (const persistedProcess of persistedProcesses) {
550
- // Check if we have a configuration for this process
551
270
  const processInfo = this.processes.get(persistedProcess.name);
552
271
  if (processInfo) {
553
- // Restore the state
554
272
  processInfo.restoreState(persistedProcess);
555
273
  }
556
274
  }
557
275
  this.isInitialized = true;
558
276
  }
559
- /**
560
- * Save current state
561
- */
562
277
  async saveState() {
563
278
  const processData = Array.from(this.processes.values()).map((p) => p.toJSON());
564
279
  await this.persistence.saveState(processData);
565
280
  }
566
- /**
567
- * Force save state immediately
568
- */
569
281
  async forceSaveState() {
570
282
  const processData = Array.from(this.processes.values()).map((p) => p.toJSON());
571
283
  await this.persistence.forceSaveState(processData);
572
284
  }
573
- /**
574
- * Get persistence file path
575
- */
576
285
  getPersistenceFilePath() {
577
286
  return this.persistence.getFilePath();
578
287
  }
579
288
  // ===== CLEANUP =====
580
- /**
581
- * Clean up all resources
582
- */
583
289
  async cleanup() {
584
- // Stop monitoring
585
290
  this.stopMonitoring();
586
- // Save final state
587
291
  await this.forceSaveState();
588
- // Cleanup components
589
- const cleanupPromises = [];
590
- if ('cleanup' in this.lifecycle) {
591
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
592
- cleanupPromises.push(this.lifecycle.cleanup());
593
- }
594
- if ('cleanup' in this.monitor) {
595
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
596
- cleanupPromises.push(this.monitor.cleanup());
597
- }
598
- if ('cleanup' in this.persistence) {
599
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
600
- cleanupPromises.push(this.persistence.cleanup());
601
- }
602
- if ('cleanup' in this.groups) {
603
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
604
- cleanupPromises.push(this.groups.cleanup());
605
- }
292
+ const cleanupIfAvailable = (component) => {
293
+ if ('cleanup' in component &&
294
+ typeof component.cleanup ===
295
+ 'function') {
296
+ return component.cleanup();
297
+ }
298
+ return undefined;
299
+ };
300
+ const cleanupPromises = [
301
+ this.lifecycle,
302
+ this.monitor,
303
+ this.persistence,
304
+ this.groups,
305
+ ]
306
+ .map(cleanupIfAvailable)
307
+ .filter(Boolean);
606
308
  await Promise.all(cleanupPromises);
607
- // Clean up processes
608
309
  for (const processInfo of this.processes.values()) {
609
310
  processInfo.dispose();
610
311
  }
@@ -612,48 +313,7 @@ export class ProcessManager extends EventEmitter {
612
313
  this.processConfigs.clear();
613
314
  this.isInitialized = false;
614
315
  }
615
- // ===== HELPER METHODS =====
616
- /**
617
- * Convert AppConfig to ProcessConfig
618
- */
619
- convertAppConfigToProcessConfig(appConfig) {
620
- // Parse memory limit if specified
621
- let max_memory_restart;
622
- if (appConfig.max_memory_restart) {
623
- const result = parseMemorySize(appConfig.max_memory_restart);
624
- if (result.success && result.value) {
625
- max_memory_restart = result.value;
626
- }
627
- }
628
- const processConfig = {
629
- name: appConfig.name,
630
- script: appConfig.script,
631
- cwd: appConfig.cwd || process.cwd(),
632
- args: appConfig.args
633
- ? appConfig.args.split(' ').filter((arg) => arg.length > 0)
634
- : [],
635
- namespace: appConfig.namespace || 'default',
636
- instances: 1, // AppConfig doesn't have instances
637
- autorestart: true, // Default to true for auto-restart
638
- watch: false, // AppConfig doesn't have watch
639
- max_memory_restart,
640
- max_restarts: 10, // Default max restarts
641
- min_uptime: 1000, // Default min uptime
642
- restart_delay: 1000, // Default restart delay
643
- note: appConfig.note,
644
- env: {},
645
- };
646
- // Process environment variables (remove undefined values)
647
- if (appConfig.env) {
648
- for (const [key, value] of Object.entries(appConfig.env)) {
649
- if (value !== undefined) {
650
- processConfig.env[key] = value;
651
- }
652
- }
653
- }
654
- return processConfig;
655
- }
656
316
  }
657
- // Re-export types for backward compatibility
317
+ export { validateAppConfig, convertAppConfigToProcessConfig, } from './process-config.js';
658
318
  export { ManagedProcessInfo, };
659
319
  //# sourceMappingURL=process-manager.js.map