claude-mpm 4.15.2__py3-none-any.whl → 4.15.3__py3-none-any.whl

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.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (41) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/core/enums.py +18 -0
  3. claude_mpm/core/types.py +2 -9
  4. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  5. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  6. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  7. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-313.pyc +0 -0
  8. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  9. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  10. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  11. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  12. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-313.pyc +0 -0
  13. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  14. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  15. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  16. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  17. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  18. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  19. claude_mpm/services/core/models/health.py +1 -28
  20. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
  21. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  22. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  23. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  24. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  25. claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
  26. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  27. claude_mpm/services/local_ops/__init__.py +1 -1
  28. claude_mpm/services/local_ops/crash_detector.py +1 -1
  29. claude_mpm/services/local_ops/health_checks/http_check.py +2 -1
  30. claude_mpm/services/local_ops/health_checks/process_check.py +2 -1
  31. claude_mpm/services/local_ops/health_checks/resource_check.py +2 -1
  32. claude_mpm/services/local_ops/health_manager.py +1 -1
  33. claude_mpm/services/local_ops/restart_manager.py +1 -1
  34. claude_mpm/services/shared/async_service_base.py +16 -27
  35. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  36. {claude_mpm-4.15.2.dist-info → claude_mpm-4.15.3.dist-info}/METADATA +1 -1
  37. {claude_mpm-4.15.2.dist-info → claude_mpm-4.15.3.dist-info}/RECORD +41 -28
  38. {claude_mpm-4.15.2.dist-info → claude_mpm-4.15.3.dist-info}/WHEEL +0 -0
  39. {claude_mpm-4.15.2.dist-info → claude_mpm-4.15.3.dist-info}/entry_points.txt +0 -0
  40. {claude_mpm-4.15.2.dist-info → claude_mpm-4.15.3.dist-info}/licenses/LICENSE +0 -0
  41. {claude_mpm-4.15.2.dist-info → claude_mpm-4.15.3.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION CHANGED
@@ -1 +1 @@
1
- 4.15.2
1
+ 4.15.3
claude_mpm/core/enums.py CHANGED
@@ -251,6 +251,24 @@ class HealthStatus(StrEnum):
251
251
  TIMEOUT = "timeout"
252
252
  """Health check exceeded time limit."""
253
253
 
254
+ def is_operational(self) -> bool:
255
+ """
256
+ Check if health status indicates operational state.
257
+
258
+ Returns:
259
+ True if status is HEALTHY or DEGRADED
260
+ """
261
+ return self in (HealthStatus.HEALTHY, HealthStatus.DEGRADED)
262
+
263
+ def is_critical(self) -> bool:
264
+ """
265
+ Check if health status indicates critical failure.
266
+
267
+ Returns:
268
+ True if status is UNHEALTHY
269
+ """
270
+ return self == HealthStatus.UNHEALTHY
271
+
254
272
 
255
273
  class ModelTier(StrEnum):
256
274
  """
claude_mpm/core/types.py CHANGED
@@ -20,6 +20,8 @@ from datetime import datetime, timezone
20
20
  from enum import Enum
21
21
  from typing import Any, Dict, List, Optional, Tuple, Union
22
22
 
23
+ from .enums import HealthStatus
24
+
23
25
 
24
26
  # Service operation results
25
27
  @dataclass
@@ -230,15 +232,6 @@ class SocketMessage:
230
232
 
231
233
 
232
234
  # Health monitoring types
233
- class HealthStatus(Enum):
234
- """Service health status levels."""
235
-
236
- HEALTHY = "healthy"
237
- DEGRADED = "degraded"
238
- UNHEALTHY = "unhealthy"
239
- UNKNOWN = "unknown"
240
-
241
-
242
235
  @dataclass
243
236
  class HealthCheck:
244
237
  """Health check result."""
@@ -5,10 +5,12 @@ including template validation, agent file validation, and
5
5
  deployment environment validation.
6
6
  """
7
7
 
8
+ from claude_mpm.core.enums import ValidationSeverity
9
+
8
10
  from .agent_validator import AgentValidator
9
11
  from .deployment_validator import DeploymentValidator
10
12
  from .template_validator import TemplateValidator
11
- from .validation_result import ValidationResult, ValidationSeverity
13
+ from .validation_result import ValidationResult
12
14
 
13
15
  __all__ = [
14
16
  "AgentValidator",
@@ -1,17 +1,9 @@
1
1
  """Validation result classes for deployment validation."""
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from enum import Enum
5
4
  from typing import Any, Dict, List, Optional
6
5
 
7
-
8
- class ValidationSeverity(Enum):
9
- """Severity levels for validation issues."""
10
-
11
- INFO = "info"
12
- WARNING = "warning"
13
- ERROR = "error"
14
- CRITICAL = "critical"
6
+ from claude_mpm.core.enums import ValidationSeverity
15
7
 
16
8
 
17
9
  @dataclass
@@ -16,36 +16,9 @@ ARCHITECTURE:
16
16
 
17
17
  from dataclasses import asdict, dataclass, field
18
18
  from datetime import datetime
19
- from enum import Enum
20
19
  from typing import Any, Dict, List
21
20
 
22
-
23
- class HealthStatus(Enum):
24
- """
25
- Health status levels.
26
-
27
- WHY: Provides granular health states to distinguish between different
28
- levels of service degradation.
29
-
30
- States:
31
- HEALTHY: All checks passing, process operating normally
32
- DEGRADED: Process running but with issues (high resource usage, slow responses)
33
- UNHEALTHY: Critical failure (process dead, crashed, or unresponsive)
34
- UNKNOWN: Cannot determine health status
35
- """
36
-
37
- HEALTHY = "healthy"
38
- DEGRADED = "degraded"
39
- UNHEALTHY = "unhealthy"
40
- UNKNOWN = "unknown"
41
-
42
- def is_operational(self) -> bool:
43
- """Check if status indicates operational service."""
44
- return self in (HealthStatus.HEALTHY, HealthStatus.DEGRADED)
45
-
46
- def is_critical(self) -> bool:
47
- """Check if status indicates critical failure."""
48
- return self == HealthStatus.UNHEALTHY
21
+ from ....core.enums import HealthStatus
49
22
 
50
23
 
51
24
  @dataclass
@@ -3,12 +3,12 @@
3
3
  Exports main monitoring components for backward compatibility.
4
4
  """
5
5
 
6
+ from ....core.enums import HealthStatus
6
7
  from .aggregator import MonitoringAggregatorService
7
8
  from .base import (
8
9
  HealthChecker,
9
10
  HealthCheckResult,
10
11
  HealthMetric,
11
- HealthStatus,
12
12
  )
13
13
 
14
14
  # Legacy exports for backward compatibility
@@ -9,12 +9,12 @@ import time
9
9
  from collections import deque
10
10
  from typing import Any, Callable, Dict, List, Optional
11
11
 
12
+ from ....core.enums import HealthStatus
12
13
  from .base import (
13
14
  BaseMonitoringService,
14
15
  HealthChecker,
15
16
  HealthCheckResult,
16
17
  HealthMetric,
17
- HealthStatus,
18
18
  )
19
19
 
20
20
 
@@ -212,14 +212,14 @@ class MonitoringAggregatorService(BaseMonitoringService):
212
212
 
213
213
  total_metrics = len(metrics)
214
214
 
215
- # Critical if any critical metrics
216
- if status_counts[HealthStatus.CRITICAL] > 0:
217
- return HealthStatus.CRITICAL
215
+ # Unhealthy if any unhealthy metrics
216
+ if status_counts[HealthStatus.UNHEALTHY] > 0:
217
+ return HealthStatus.UNHEALTHY
218
218
 
219
- # Warning if >30% warning metrics
220
- warning_ratio = status_counts[HealthStatus.WARNING] / total_metrics
221
- if warning_ratio > 0.3:
222
- return HealthStatus.WARNING
219
+ # Degraded if >30% degraded metrics
220
+ degraded_ratio = status_counts[HealthStatus.DEGRADED] / total_metrics
221
+ if degraded_ratio > 0.3:
222
+ return HealthStatus.DEGRADED
223
223
 
224
224
  # Unknown if >50% unknown metrics
225
225
  unknown_ratio = status_counts[HealthStatus.UNKNOWN] / total_metrics
@@ -375,10 +375,10 @@ class MonitoringAggregatorService(BaseMonitoringService):
375
375
  checks_count = len(recent_results)
376
376
 
377
377
  # Determine aggregated status
378
- if status_counts[HealthStatus.CRITICAL] > 0:
379
- aggregated_status = HealthStatus.CRITICAL
380
- elif status_counts[HealthStatus.WARNING] > checks_count * 0.3:
381
- aggregated_status = HealthStatus.WARNING
378
+ if status_counts[HealthStatus.UNHEALTHY] > 0:
379
+ aggregated_status = HealthStatus.UNHEALTHY
380
+ elif status_counts[HealthStatus.DEGRADED] > checks_count * 0.3:
381
+ aggregated_status = HealthStatus.DEGRADED
382
382
  elif status_counts[HealthStatus.UNKNOWN] > checks_count * 0.5:
383
383
  aggregated_status = HealthStatus.UNKNOWN
384
384
  else:
@@ -7,17 +7,9 @@ import time
7
7
  from abc import ABC, abstractmethod
8
8
  from dataclasses import asdict, dataclass
9
9
  from datetime import datetime, timezone
10
- from enum import Enum
11
10
  from typing import Any, Dict, List, Optional, Union
12
11
 
13
-
14
- class HealthStatus(Enum):
15
- """Health status levels for monitoring."""
16
-
17
- HEALTHY = "healthy"
18
- WARNING = "warning"
19
- CRITICAL = "critical"
20
- UNKNOWN = "unknown"
12
+ from ....core.enums import HealthStatus
21
13
 
22
14
 
23
15
  @dataclass
@@ -75,11 +67,11 @@ class HealthCheckResult:
75
67
  "healthy_metrics": len(
76
68
  [m for m in self.metrics if m.status == HealthStatus.HEALTHY]
77
69
  ),
78
- "warning_metrics": len(
79
- [m for m in self.metrics if m.status == HealthStatus.WARNING]
70
+ "degraded_metrics": len(
71
+ [m for m in self.metrics if m.status == HealthStatus.DEGRADED]
80
72
  ),
81
- "critical_metrics": len(
82
- [m for m in self.metrics if m.status == HealthStatus.CRITICAL]
73
+ "unhealthy_metrics": len(
74
+ [m for m in self.metrics if m.status == HealthStatus.UNHEALTHY]
83
75
  ),
84
76
  }
85
77
 
@@ -6,7 +6,8 @@ Monitors network connectivity, port availability, and socket health.
6
6
  import socket
7
7
  from typing import Dict, List, Optional
8
8
 
9
- from .base import BaseMonitoringService, HealthMetric, HealthStatus
9
+ from ....core.enums import HealthStatus
10
+ from .base import BaseMonitoringService, HealthMetric
10
11
 
11
12
 
12
13
  class NetworkHealthService(BaseMonitoringService):
@@ -98,7 +99,7 @@ class NetworkHealthService(BaseMonitoringService):
98
99
  HealthMetric(
99
100
  name="socket_creation",
100
101
  value=False,
101
- status=HealthStatus.CRITICAL,
102
+ status=HealthStatus.UNHEALTHY,
102
103
  message=f"Failed to create socket: {e}",
103
104
  )
104
105
  )
@@ -142,11 +143,11 @@ class NetworkHealthService(BaseMonitoringService):
142
143
  )
143
144
  )
144
145
  else:
145
- # Determine if this is critical or warning based on endpoint type
146
+ # Determine if this is unhealthy or degraded based on endpoint type
146
147
  status = (
147
- HealthStatus.WARNING
148
+ HealthStatus.DEGRADED
148
149
  if "optional" in name.lower()
149
- else HealthStatus.CRITICAL
150
+ else HealthStatus.UNHEALTHY
150
151
  )
151
152
  metrics.append(
152
153
  HealthMetric(
@@ -161,7 +162,7 @@ class NetworkHealthService(BaseMonitoringService):
161
162
  HealthMetric(
162
163
  name=metric_name,
163
164
  value=False,
164
- status=HealthStatus.WARNING,
165
+ status=HealthStatus.DEGRADED,
165
166
  message=f"Connection to {host}:{port} timed out after {timeout}s",
166
167
  )
167
168
  )
@@ -6,8 +6,9 @@ Monitors individual process health including CPU, memory, file descriptors, and
6
6
  from typing import List
7
7
 
8
8
  from claude_mpm.core.constants import ResourceLimits, TimeoutConfig
9
+ from claude_mpm.core.enums import HealthStatus
9
10
 
10
- from .base import BaseMonitoringService, HealthMetric, HealthStatus
11
+ from .base import BaseMonitoringService, HealthMetric
11
12
 
12
13
  try:
13
14
  import psutil
@@ -66,7 +67,7 @@ class ProcessHealthService(BaseMonitoringService):
66
67
  HealthMetric(
67
68
  name="psutil_availability",
68
69
  value=False,
69
- status=HealthStatus.WARNING,
70
+ status=HealthStatus.DEGRADED,
70
71
  message="psutil not available for process monitoring",
71
72
  )
72
73
  )
@@ -77,7 +78,7 @@ class ProcessHealthService(BaseMonitoringService):
77
78
  HealthMetric(
78
79
  name="process_exists",
79
80
  value=False,
80
- status=HealthStatus.CRITICAL,
81
+ status=HealthStatus.UNHEALTHY,
81
82
  message=f"Process {self.pid} not found",
82
83
  )
83
84
  )
@@ -90,7 +91,7 @@ class ProcessHealthService(BaseMonitoringService):
90
91
  HealthMetric(
91
92
  name="process_exists",
92
93
  value=False,
93
- status=HealthStatus.CRITICAL,
94
+ status=HealthStatus.UNHEALTHY,
94
95
  message=f"Process {self.pid} is no longer running",
95
96
  )
96
97
  )
@@ -119,7 +120,7 @@ class ProcessHealthService(BaseMonitoringService):
119
120
  HealthMetric(
120
121
  name="process_exists",
121
122
  value=False,
122
- status=HealthStatus.CRITICAL,
123
+ status=HealthStatus.UNHEALTHY,
123
124
  message=f"Process {self.pid} no longer exists",
124
125
  )
125
126
  )
@@ -153,7 +154,7 @@ class ProcessHealthService(BaseMonitoringService):
153
154
  status=(
154
155
  HealthStatus.HEALTHY
155
156
  if process_healthy
156
- else HealthStatus.CRITICAL
157
+ else HealthStatus.UNHEALTHY
157
158
  ),
158
159
  message=f"Process status: {status}",
159
160
  )
@@ -179,9 +180,9 @@ class ProcessHealthService(BaseMonitoringService):
179
180
  cpu_status = HealthStatus.HEALTHY
180
181
  if cpu_percent > self.cpu_threshold:
181
182
  cpu_status = (
182
- HealthStatus.WARNING
183
+ HealthStatus.DEGRADED
183
184
  if cpu_percent < self.cpu_threshold * 1.2
184
- else HealthStatus.CRITICAL
185
+ else HealthStatus.UNHEALTHY
185
186
  )
186
187
 
187
188
  metrics.append(
@@ -213,9 +214,9 @@ class ProcessHealthService(BaseMonitoringService):
213
214
  memory_status = HealthStatus.HEALTHY
214
215
  if memory_mb > self.memory_threshold_mb:
215
216
  memory_status = (
216
- HealthStatus.WARNING
217
+ HealthStatus.DEGRADED
217
218
  if memory_mb < self.memory_threshold_mb * 1.2
218
- else HealthStatus.CRITICAL
219
+ else HealthStatus.UNHEALTHY
219
220
  )
220
221
 
221
222
  metrics.append(
@@ -256,9 +257,9 @@ class ProcessHealthService(BaseMonitoringService):
256
257
  fd_status = HealthStatus.HEALTHY
257
258
  if fd_count > self.fd_threshold:
258
259
  fd_status = (
259
- HealthStatus.WARNING
260
+ HealthStatus.DEGRADED
260
261
  if fd_count < self.fd_threshold * 1.2
261
- else HealthStatus.CRITICAL
262
+ else HealthStatus.UNHEALTHY
262
263
  )
263
264
 
264
265
  metrics.append(
@@ -5,7 +5,8 @@ Monitors system-wide resource usage including CPU, memory, and disk utilization.
5
5
 
6
6
  from typing import Dict, List, Optional
7
7
 
8
- from .base import BaseMonitoringService, HealthMetric, HealthStatus
8
+ from ....core.enums import HealthStatus
9
+ from .base import BaseMonitoringService, HealthMetric
9
10
 
10
11
  try:
11
12
  import psutil
@@ -53,7 +54,7 @@ class ResourceMonitorService(BaseMonitoringService):
53
54
  HealthMetric(
54
55
  name="psutil_availability",
55
56
  value=False,
56
- status=HealthStatus.WARNING,
57
+ status=HealthStatus.DEGRADED,
57
58
  message="psutil not available for resource monitoring",
58
59
  )
59
60
  )
@@ -182,9 +183,9 @@ class ResourceMonitorService(BaseMonitoringService):
182
183
  # Load is concerning if > cpu_count
183
184
  load_status = HealthStatus.HEALTHY
184
185
  if load1 > cpu_count:
185
- load_status = HealthStatus.WARNING
186
+ load_status = HealthStatus.DEGRADED
186
187
  if load1 > cpu_count * 1.5:
187
- load_status = HealthStatus.CRITICAL
188
+ load_status = HealthStatus.UNHEALTHY
188
189
 
189
190
  metrics.append(
190
191
  HealthMetric(
@@ -220,8 +221,8 @@ class ResourceMonitorService(BaseMonitoringService):
220
221
  if value < threshold:
221
222
  return HealthStatus.HEALTHY
222
223
  if value < threshold * 1.1: # 10% above threshold
223
- return HealthStatus.WARNING
224
- return HealthStatus.CRITICAL
224
+ return HealthStatus.DEGRADED
225
+ return HealthStatus.UNHEALTHY
225
226
 
226
227
  def get_resource_summary(self) -> Optional[Dict[str, float]]:
227
228
  """Get quick resource summary without full health check.
@@ -6,7 +6,8 @@ Monitors service-specific metrics like client connections, event processing, and
6
6
  import time
7
7
  from typing import Any, Dict, List
8
8
 
9
- from .base import BaseMonitoringService, HealthMetric, HealthStatus
9
+ from ....core.enums import HealthStatus
10
+ from .base import BaseMonitoringService, HealthMetric
10
11
 
11
12
 
12
13
  class ServiceHealthService(BaseMonitoringService):
@@ -79,9 +80,9 @@ class ServiceHealthService(BaseMonitoringService):
79
80
 
80
81
  # Determine status based on thresholds
81
82
  if client_count > self.max_clients:
82
- client_status = HealthStatus.CRITICAL
83
+ client_status = HealthStatus.UNHEALTHY
83
84
  elif client_count > self.max_clients * 0.8:
84
- client_status = HealthStatus.WARNING
85
+ client_status = HealthStatus.DEGRADED
85
86
  else:
86
87
  client_status = HealthStatus.HEALTHY
87
88
 
@@ -129,7 +130,7 @@ class ServiceHealthService(BaseMonitoringService):
129
130
  # Determine status based on rate
130
131
  rate_status = HealthStatus.HEALTHY
131
132
  if event_rate == 0 and events_processed > 0:
132
- rate_status = HealthStatus.WARNING # Processing stopped
133
+ rate_status = HealthStatus.DEGRADED # Processing stopped
133
134
 
134
135
  metrics.append(
135
136
  HealthMetric(
@@ -157,9 +158,9 @@ class ServiceHealthService(BaseMonitoringService):
157
158
  queue_size = self.service_stats["event_queue_size"]
158
159
  queue_status = HealthStatus.HEALTHY
159
160
  if queue_size > 1000:
160
- queue_status = HealthStatus.WARNING
161
+ queue_status = HealthStatus.DEGRADED
161
162
  if queue_size > 5000:
162
- queue_status = HealthStatus.CRITICAL
163
+ queue_status = HealthStatus.UNHEALTHY
163
164
 
164
165
  metrics.append(
165
166
  HealthMetric(
@@ -191,9 +192,9 @@ class ServiceHealthService(BaseMonitoringService):
191
192
 
192
193
  # Determine status based on rate
193
194
  if error_rate > self.max_error_rate:
194
- error_status = HealthStatus.CRITICAL
195
+ error_status = HealthStatus.UNHEALTHY
195
196
  elif error_rate > self.max_error_rate * 0.5:
196
- error_status = HealthStatus.WARNING
197
+ error_status = HealthStatus.DEGRADED
197
198
  else:
198
199
  error_status = HealthStatus.HEALTHY
199
200
 
@@ -213,7 +214,7 @@ class ServiceHealthService(BaseMonitoringService):
213
214
  name="total_errors",
214
215
  value=errors,
215
216
  status=(
216
- HealthStatus.HEALTHY if errors == 0 else HealthStatus.WARNING
217
+ HealthStatus.HEALTHY if errors == 0 else HealthStatus.DEGRADED
217
218
  ),
218
219
  )
219
220
  )
@@ -228,7 +229,7 @@ class ServiceHealthService(BaseMonitoringService):
228
229
  status=(
229
230
  HealthStatus.HEALTHY
230
231
  if recent_errors == 0
231
- else HealthStatus.WARNING
232
+ else HealthStatus.DEGRADED
232
233
  ),
233
234
  )
234
235
  )
@@ -263,9 +264,9 @@ class ServiceHealthService(BaseMonitoringService):
263
264
 
264
265
  # Determine status based on staleness
265
266
  if time_since_activity > self.stale_activity_seconds * 2:
266
- activity_status = HealthStatus.CRITICAL
267
+ activity_status = HealthStatus.UNHEALTHY
267
268
  elif time_since_activity > self.stale_activity_seconds:
268
- activity_status = HealthStatus.WARNING
269
+ activity_status = HealthStatus.DEGRADED
269
270
  else:
270
271
  activity_status = HealthStatus.HEALTHY
271
272
 
@@ -282,7 +283,7 @@ class ServiceHealthService(BaseMonitoringService):
282
283
  HealthMetric(
283
284
  name="time_since_last_activity",
284
285
  value=-1,
285
- status=HealthStatus.WARNING,
286
+ status=HealthStatus.DEGRADED,
286
287
  message="No last activity recorded",
287
288
  )
288
289
  )
@@ -307,9 +308,9 @@ class ServiceHealthService(BaseMonitoringService):
307
308
 
308
309
  # Determine status based on response time
309
310
  if avg_time > 1000: # > 1 second
310
- time_status = HealthStatus.CRITICAL
311
+ time_status = HealthStatus.UNHEALTHY
311
312
  elif avg_time > 500: # > 500ms
312
- time_status = HealthStatus.WARNING
313
+ time_status = HealthStatus.DEGRADED
313
314
  else:
314
315
  time_status = HealthStatus.HEALTHY
315
316
 
@@ -59,6 +59,7 @@ Note: ProcessStatus has been consolidated into ServiceState (core.enums) as of P
59
59
  """
60
60
 
61
61
  # Re-export data models and interfaces for convenience
62
+ from claude_mpm.core.enums import HealthStatus
62
63
  from claude_mpm.services.core.interfaces.health import (
63
64
  IHealthCheck,
64
65
  IHealthCheckManager,
@@ -80,7 +81,6 @@ from claude_mpm.services.core.interfaces.stability import (
80
81
  from claude_mpm.services.core.models.health import (
81
82
  DeploymentHealth,
82
83
  HealthCheckResult,
83
- HealthStatus,
84
84
  )
85
85
  from claude_mpm.services.core.models.process import (
86
86
  PROTECTED_PORT_RANGES,
@@ -26,10 +26,10 @@ import threading
26
26
  from collections import defaultdict
27
27
  from typing import Callable, Dict, List, Set
28
28
 
29
+ from claude_mpm.core.enums import HealthStatus
29
30
  from claude_mpm.services.core.base import SyncBaseService
30
31
  from claude_mpm.services.core.interfaces.health import IHealthCheckManager
31
32
  from claude_mpm.services.core.interfaces.restart import ICrashDetector
32
- from claude_mpm.services.core.models.health import HealthStatus
33
33
 
34
34
 
35
35
  class CrashDetector(SyncBaseService, ICrashDetector):
@@ -29,10 +29,11 @@ import time
29
29
  import requests
30
30
  from requests.exceptions import ConnectionError, RequestException, Timeout
31
31
 
32
+ from claude_mpm.core.enums import HealthStatus
32
33
  from claude_mpm.services.core.base import SyncBaseService
33
34
  from claude_mpm.services.core.interfaces.health import IHealthCheck
34
35
  from claude_mpm.services.core.interfaces.process import ILocalProcessManager
35
- from claude_mpm.services.core.models.health import HealthCheckResult, HealthStatus
36
+ from claude_mpm.services.core.models.health import HealthCheckResult
36
37
 
37
38
 
38
39
  class HttpHealthCheck(SyncBaseService, IHealthCheck):
@@ -22,10 +22,11 @@ USAGE:
22
22
 
23
23
  import psutil
24
24
 
25
+ from claude_mpm.core.enums import HealthStatus
25
26
  from claude_mpm.services.core.base import SyncBaseService
26
27
  from claude_mpm.services.core.interfaces.health import IHealthCheck
27
28
  from claude_mpm.services.core.interfaces.process import ILocalProcessManager
28
- from claude_mpm.services.core.models.health import HealthCheckResult, HealthStatus
29
+ from claude_mpm.services.core.models.health import HealthCheckResult
29
30
 
30
31
 
31
32
  class ProcessHealthCheck(SyncBaseService, IHealthCheck):
@@ -28,10 +28,11 @@ import platform
28
28
 
29
29
  import psutil
30
30
 
31
+ from claude_mpm.core.enums import HealthStatus
31
32
  from claude_mpm.services.core.base import SyncBaseService
32
33
  from claude_mpm.services.core.interfaces.health import IHealthCheck
33
34
  from claude_mpm.services.core.interfaces.process import ILocalProcessManager
34
- from claude_mpm.services.core.models.health import HealthCheckResult, HealthStatus
35
+ from claude_mpm.services.core.models.health import HealthCheckResult
35
36
 
36
37
 
37
38
  class ResourceHealthCheck(SyncBaseService, IHealthCheck):
@@ -39,13 +39,13 @@ import threading
39
39
  from collections import defaultdict
40
40
  from typing import Callable, Dict, List, Optional
41
41
 
42
+ from claude_mpm.core.enums import HealthStatus
42
43
  from claude_mpm.services.core.base import SyncBaseService
43
44
  from claude_mpm.services.core.interfaces.health import IHealthCheckManager
44
45
  from claude_mpm.services.core.interfaces.process import ILocalProcessManager
45
46
  from claude_mpm.services.core.models.health import (
46
47
  DeploymentHealth,
47
48
  HealthCheckResult,
48
- HealthStatus,
49
49
  )
50
50
  from claude_mpm.services.local_ops.health_checks import (
51
51
  HttpHealthCheck,
@@ -43,6 +43,7 @@ import time
43
43
  from pathlib import Path
44
44
  from typing import Optional, Set
45
45
 
46
+ from claude_mpm.core.enums import HealthStatus
46
47
  from claude_mpm.services.core.base import SyncBaseService
47
48
  from claude_mpm.services.core.interfaces.health import IHealthCheckManager
48
49
  from claude_mpm.services.core.interfaces.process import ILocalProcessManager
@@ -51,7 +52,6 @@ from claude_mpm.services.core.interfaces.restart import (
51
52
  IRestartManager,
52
53
  IRestartPolicy,
53
54
  )
54
- from claude_mpm.services.core.models.health import HealthStatus
55
55
  from claude_mpm.services.core.models.restart import RestartHistory
56
56
 
57
57
 
@@ -4,23 +4,12 @@ Base class for asynchronous services to reduce duplication.
4
4
 
5
5
  import asyncio
6
6
  from abc import ABC, abstractmethod
7
- from enum import Enum
8
7
  from typing import Any, Dict, Optional
9
8
 
9
+ from ...core.enums import ServiceState
10
10
  from ...core.mixins import LoggerMixin
11
11
 
12
12
 
13
- class AsyncServiceState(Enum):
14
- """Standard states for async services."""
15
-
16
- UNINITIALIZED = "uninitialized"
17
- INITIALIZING = "initializing"
18
- RUNNING = "running"
19
- STOPPING = "stopping"
20
- STOPPED = "stopped"
21
- ERROR = "error"
22
-
23
-
24
13
  class AsyncServiceBase(LoggerMixin, ABC):
25
14
  """
26
15
  Base class for asynchronous services.
@@ -45,7 +34,7 @@ class AsyncServiceBase(LoggerMixin, ABC):
45
34
  self.config = config or {}
46
35
 
47
36
  # State management
48
- self._state = AsyncServiceState.UNINITIALIZED
37
+ self._state = ServiceState.UNINITIALIZED
49
38
  self._state_lock = asyncio.Lock()
50
39
 
51
40
  # Background tasks
@@ -57,19 +46,19 @@ class AsyncServiceBase(LoggerMixin, ABC):
57
46
  self._error_count = 0
58
47
 
59
48
  @property
60
- def state(self) -> AsyncServiceState:
49
+ def state(self) -> ServiceState:
61
50
  """Get current service state."""
62
51
  return self._state
63
52
 
64
53
  @property
65
54
  def is_running(self) -> bool:
66
55
  """Check if service is running."""
67
- return self._state == AsyncServiceState.RUNNING
56
+ return self._state == ServiceState.RUNNING
68
57
 
69
58
  @property
70
59
  def is_healthy(self) -> bool:
71
60
  """Check if service is healthy."""
72
- return self._state == AsyncServiceState.RUNNING and self._last_error is None
61
+ return self._state == ServiceState.RUNNING and self._last_error is None
73
62
 
74
63
  async def initialize(self) -> bool:
75
64
  """
@@ -79,22 +68,22 @@ class AsyncServiceBase(LoggerMixin, ABC):
79
68
  True if initialization successful
80
69
  """
81
70
  async with self._state_lock:
82
- if self._state != AsyncServiceState.UNINITIALIZED:
71
+ if self._state != ServiceState.UNINITIALIZED:
83
72
  self.logger.warning(f"Service {self.service_name} already initialized")
84
- return self._state == AsyncServiceState.RUNNING
73
+ return self._state == ServiceState.RUNNING
85
74
 
86
- self._state = AsyncServiceState.INITIALIZING
75
+ self._state = ServiceState.INITIALIZING
87
76
  self.logger.info(f"Initializing service: {self.service_name}")
88
77
 
89
78
  try:
90
79
  success = await self._do_initialize()
91
80
  if success:
92
- self._state = AsyncServiceState.RUNNING
81
+ self._state = ServiceState.RUNNING
93
82
  self.logger.info(
94
83
  f"Service {self.service_name} initialized successfully"
95
84
  )
96
85
  else:
97
- self._state = AsyncServiceState.ERROR
86
+ self._state = ServiceState.ERROR
98
87
  self.logger.error(
99
88
  f"Service {self.service_name} initialization failed"
100
89
  )
@@ -102,7 +91,7 @@ class AsyncServiceBase(LoggerMixin, ABC):
102
91
  return success
103
92
 
104
93
  except Exception as e:
105
- self._state = AsyncServiceState.ERROR
94
+ self._state = ServiceState.ERROR
106
95
  self._last_error = e
107
96
  self._error_count += 1
108
97
  self.logger.error(
@@ -114,10 +103,10 @@ class AsyncServiceBase(LoggerMixin, ABC):
114
103
  async def shutdown(self) -> None:
115
104
  """Shutdown the service gracefully."""
116
105
  async with self._state_lock:
117
- if self._state in (AsyncServiceState.STOPPED, AsyncServiceState.STOPPING):
106
+ if self._state in (ServiceState.STOPPED, ServiceState.STOPPING):
118
107
  return
119
108
 
120
- self._state = AsyncServiceState.STOPPING
109
+ self._state = ServiceState.STOPPING
121
110
  self.logger.info(f"Shutting down service: {self.service_name}")
122
111
 
123
112
  try:
@@ -130,11 +119,11 @@ class AsyncServiceBase(LoggerMixin, ABC):
130
119
  # Service-specific shutdown
131
120
  await self._do_shutdown()
132
121
 
133
- self._state = AsyncServiceState.STOPPED
122
+ self._state = ServiceState.STOPPED
134
123
  self.logger.info(f"Service {self.service_name} shut down successfully")
135
124
 
136
125
  except Exception as e:
137
- self._state = AsyncServiceState.ERROR
126
+ self._state = ServiceState.ERROR
138
127
  self._last_error = e
139
128
  self.logger.error(
140
129
  f"Service {self.service_name} shutdown error: {e}", exc_info=True
@@ -146,7 +135,7 @@ class AsyncServiceBase(LoggerMixin, ABC):
146
135
  await self.shutdown()
147
136
 
148
137
  # Reset state for restart
149
- self._state = AsyncServiceState.UNINITIALIZED
138
+ self._state = ServiceState.UNINITIALIZED
150
139
  self._shutdown_event.clear()
151
140
  self._last_error = None
152
141
 
@@ -4,25 +4,12 @@ Base class for services with complex lifecycle management.
4
4
 
5
5
  import time
6
6
  from abc import ABC, abstractmethod
7
- from enum import Enum
8
7
  from typing import Any, Dict, List, Optional
9
8
 
9
+ from ...core.enums import ServiceState
10
10
  from ...core.mixins import LoggerMixin
11
11
 
12
12
 
13
- class ServiceState(Enum):
14
- """Standard service states."""
15
-
16
- UNINITIALIZED = "uninitialized"
17
- INITIALIZING = "initializing"
18
- INITIALIZED = "initialized"
19
- STARTING = "starting"
20
- RUNNING = "running"
21
- STOPPING = "stopping"
22
- STOPPED = "stopped"
23
- ERROR = "error"
24
-
25
-
26
13
  class LifecycleServiceBase(LoggerMixin, ABC):
27
14
  """
28
15
  Base class for services with complex lifecycle management.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.15.2
3
+ Version: 4.15.3
4
4
  Summary: Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking
5
5
  Author-email: Bob Matsuoka <bob@matsuoka.com>
6
6
  Maintainer: Claude MPM Team
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=3_LkiVeH6VwGYcZk6ByV2zB8Nb61h10Du0aQVedzFmY,7
2
+ claude_mpm/VERSION,sha256=ly0QkYCNWfrV0Cni9YK5Q0OYumAT2UVMYOcWS8kUqNM,7
3
3
  claude_mpm/__init__.py,sha256=UCw6j9e_tZQ3kJtTqmdfNv7MHyw9nD1jkj80WurwM2g,2064
4
4
  claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
5
5
  claude_mpm/constants.py,sha256=sLjJF6Kw7H4V9WWeaEYltM-77TgXqzEMX5vx4ukM5-0,5977
@@ -197,7 +197,7 @@ claude_mpm/core/config_aliases.py,sha256=QpNNECkTY4TYYAhVlFZvB-msPnZrui90g19u0-v
197
197
  claude_mpm/core/config_constants.py,sha256=MEF35Y2Lj5FMzRdhgSgZrZeTzHfCzistPGZVY8INta4,10073
198
198
  claude_mpm/core/constants.py,sha256=uBCd4kUbwSFKW79pH7_yUzRpMoNY2AcAflENTkIZIaU,11558
199
199
  claude_mpm/core/container.py,sha256=oLM91UOJUQ6D-DDVomqkTAozpgBcM2YFzk_JDbjgg8o,32277
200
- claude_mpm/core/enums.py,sha256=WmiOw8I_dWwggUu0oouaXbV0lz_cjqJmuuhwhtmJmi8,11796
200
+ claude_mpm/core/enums.py,sha256=0wZGz73IXlZQ29I1OaUDbMa9E9vEimvhO6E_8LiRHSc,12279
201
201
  claude_mpm/core/error_handler.py,sha256=fqTstzmWaidfiVm-IvPGBRCjDwqBbQgjofyP31EkVNU,19276
202
202
  claude_mpm/core/exceptions.py,sha256=vrEJGpgThvqRRD6qsNkmaQcYAoUMQSNuHUOnNFJcEGg,19628
203
203
  claude_mpm/core/factories.py,sha256=vtlwkbpxeWzqgPRGO1ehnMOzddLCHWTeiKa8halV_dU,7271
@@ -225,7 +225,7 @@ claude_mpm/core/service_registry.py,sha256=QpmAMWCov8XXaxQwE7WiNbgv6u_CRjpKPB64k
225
225
  claude_mpm/core/session_manager.py,sha256=iEDZWKBYHSu001nFX8vFvH33RvQOW0eIgomWhFM53sw,12078
226
226
  claude_mpm/core/socketio_pool.py,sha256=PK9Who6P_9kdfU_K4hCqkx8EixnV8WAl0Qbh7tDAEYE,31079
227
227
  claude_mpm/core/tool_access_control.py,sha256=dpdxxp_77SuxGM2C7SsHUZbtysJmHw1rLDXIeOvS7IA,6428
228
- claude_mpm/core/types.py,sha256=B-0xENu1JFuBtZM8rwdfQJXXfm8iqz-RVyfMLBtZRGE,7857
228
+ claude_mpm/core/types.py,sha256=Sv62QhMYvfxbt7oIGoAhhN_jxonFTeLRf-BuhxZ4vYw,7719
229
229
  claude_mpm/core/typing_utils.py,sha256=qny3rA9mAeXqdLgUj9DZg642shw4LmLbkPqADN-765s,13314
230
230
  claude_mpm/core/unified_agent_registry.py,sha256=LFWZUZMmgUuOBmn2vxYPXfZpJwBimjcaEP-paeS4W-g,30375
231
231
  claude_mpm/core/unified_config.py,sha256=dYdaEnioqE-f4UaHzBLJJhP5aly3XJ7qzQjBZOxmUdo,19679
@@ -424,12 +424,25 @@ claude_mpm/hooks/claude_hooks/installer.py,sha256=XXmcUjvMGYmrt5Axllypo1MCXkGCzr
424
424
  claude_mpm/hooks/claude_hooks/memory_integration.py,sha256=9PogijgklM7iSNRTK2Sdz3s9AOlxL8Rt5axtU71-J2M,8866
425
425
  claude_mpm/hooks/claude_hooks/response_tracking.py,sha256=0ZIqDaebyXgmP9zfdl2Pke44UyjbF8QlefIldR0QrEw,15430
426
426
  claude_mpm/hooks/claude_hooks/tool_analysis.py,sha256=3_o2PP9D7wEMwLriCtIBOw0cj2fSZfepN7lI4P1meSQ,7862
427
+ claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc,sha256=bRXmkaVByqCv8qmFpfSJOEeKUOzLNgFVgFc5GVZ1oGo,322
428
+ claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc,sha256=8FI_Kf7Ejh07mtknWwCxD20_Dn9n-eVkLvq9E-vNiyQ,28986
429
+ claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc,sha256=HTbwMv0BW8gMg9DxzH6UbEPRPZ8a0e_R7sNaRMJ6I1w,21336
430
+ claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-313.pyc,sha256=XmivrbKRMdNX9g12kYh4C9X0ZJr3koIfkeMntdC7-58,29202
431
+ claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc,sha256=qhDYC403V_m8NG2LHMXtcK_SH3qMuPADSp0sJ9D6YTo,8895
432
+ claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc,sha256=AYQvL02kj36XIgc5eTvaJjbp91m7r_WsLF58QHnYOvA,14103
433
+ claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc,sha256=C5YqvfqA2-6BEEwq9OlhvBJTje2qi5C41IyD_q6bOVk,9137
427
434
  claude_mpm/hooks/claude_hooks/services/__init__.py,sha256=OIYOKsUNw1BHYawOCp-KFK5kmQKuj92cCqCEPO0nwo0,585
428
435
  claude_mpm/hooks/claude_hooks/services/connection_manager.py,sha256=6GSZ6lB0j6u7jE-w9ay-57YX-VVBFGfK_wmZNNM6hxE,8280
429
436
  claude_mpm/hooks/claude_hooks/services/connection_manager_http.py,sha256=n14k1byOBbviu0nFab3q0gb7p6eMqGO8hS0b7Gt2JRg,10262
430
437
  claude_mpm/hooks/claude_hooks/services/duplicate_detector.py,sha256=Fh9LmEMsVmQM9t0U1v2l_fuBwvNpVkl_0EF8Wu5KLHQ,3882
431
438
  claude_mpm/hooks/claude_hooks/services/state_manager.py,sha256=QB0JPJQThTVg0TGRO3Dc_3y3bac-hkulgMqqzo_71ng,11189
432
439
  claude_mpm/hooks/claude_hooks/services/subagent_processor.py,sha256=f7a_vgo_kuG9MalDTka2UPXwDyCkqNgCvG8i1hp0oRo,15263
440
+ claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc,sha256=bk04TMdGscqiVyfzkby3gPrW6DcSqzHJOCnclbO5Qrs,565
441
+ claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-313.pyc,sha256=xEEOqJmCwu_rOaZTzfYdLQtamwrlvn_Uv4M9GcTJeIA,8713
442
+ claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc,sha256=70EoAv9NFvqIU9pusxykEK5mKCqZURZkBhd0g8XmEKI,11364
443
+ claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc,sha256=87ROjkadSdZB1L24rVdjdOHggYRfaGZ2v0nnhLlUnJk,4722
444
+ claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc,sha256=6xv0WkDpLnE8moXxFaWP_Cj9huYDQWJMOZszQls9doU,11811
445
+ claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc,sha256=svC-kX-MYT5YIbWrY_aNf-Biz-JL49noI--1D-dSx_Q,13821
433
446
  claude_mpm/hooks/failure_learning/__init__.py,sha256=SDeSTQODgiad_WKqZ6JA-iz_Lwa5FDq1_BjA2xnw0c8,1831
434
447
  claude_mpm/hooks/failure_learning/failure_detection_hook.py,sha256=x4pNfJ86o7791HL9Zl53pjgxcmgcQUPu2Vrr3PkvJco,7521
435
448
  claude_mpm/hooks/failure_learning/fix_detection_hook.py,sha256=u-RTf5sBJhiiZq5enu5h_kyPCpOF2eUYZH7fCko7JG8,7185
@@ -548,11 +561,11 @@ claude_mpm/services/agents/deployment/strategies/project_strategy.py,sha256=0XQ7
548
561
  claude_mpm/services/agents/deployment/strategies/strategy_selector.py,sha256=lWgDrsUOtOCGf7l3CgVLaAoUQymCm4pog9pqXaFE1mU,4065
549
562
  claude_mpm/services/agents/deployment/strategies/system_strategy.py,sha256=hEIB61IuFL4sKPjYrb4CJB25_5yEBdzuOYKghqM2Y1s,4475
550
563
  claude_mpm/services/agents/deployment/strategies/user_strategy.py,sha256=FFuTMFWyoE39QhR3mdmiEZLxwKH1zyum7xS9t5Gq2qs,4305
551
- claude_mpm/services/agents/deployment/validation/__init__.py,sha256=FzPJHDJX9d_LiXcEW0RUnFLVQrtqCNExDa1J4MynOh0,562
564
+ claude_mpm/services/agents/deployment/validation/__init__.py,sha256=t3QU9YS4gq5wvTKGuObjdgAtrMIfdN42lq0TIH9kGbM,596
552
565
  claude_mpm/services/agents/deployment/validation/agent_validator.py,sha256=ZpWtXRQZtZ8G0OCAtSpu8j6QDm_6txEaSx9VTp0zxwM,11005
553
566
  claude_mpm/services/agents/deployment/validation/deployment_validator.py,sha256=Fn0LALAcbEfPmRiNj89ZfNjTUILeCfRASqqI4KmT_0o,8395
554
567
  claude_mpm/services/agents/deployment/validation/template_validator.py,sha256=WR4oU15xOCaRh8mj1N8xA5l0P5Ju4fmlFKqqtuZc2Yk,11799
555
- claude_mpm/services/agents/deployment/validation/validation_result.py,sha256=IQHGalSuk1NK7DacytTmCMVTvn-UrEmcthsXcFi_YY8,6417
568
+ claude_mpm/services/agents/deployment/validation/validation_result.py,sha256=SxDU5PmquklhRQYFylIoVtHvL7Boiky6863P42CNwK4,6277
556
569
  claude_mpm/services/agents/loading/__init__.py,sha256=jDKxJ4kmuMT5kJkeqUjazADtfr4zXtd8dm8EwZIfWhQ,306
557
570
  claude_mpm/services/agents/loading/agent_profile_loader.py,sha256=AjGOXrLP20_ekBMwtVf0eS-hqxZj5R-EMlMoIFjvucs,25042
558
571
  claude_mpm/services/agents/loading/base_agent_manager.py,sha256=2M-eiObw6MRRHlP2viVRgmF49j0AAd34VgwptT4XoSA,15416
@@ -605,7 +618,7 @@ claude_mpm/services/core/interfaces/service.py,sha256=hNfHXe45LcPCp_dToOmZCfnUZB
605
618
  claude_mpm/services/core/interfaces/stability.py,sha256=Ppvwj3dlZdrBeVRBkeAffHV3nDOF1psgf9-8X_n4Ezg,8075
606
619
  claude_mpm/services/core/models/__init__.py,sha256=_7a-bdIAt0ix6ighwJnre3e3QXYCqgyDZbkZ1CeWEPI,1933
607
620
  claude_mpm/services/core/models/agent_config.py,sha256=9r-0luv9MXMkJ6Ji1aTzXYUySmePFZWKfDfGfn5DC40,13826
608
- claude_mpm/services/core/models/health.py,sha256=5OlWE5kG3PVhkkv-FPLnyXgFdoemE1o96kwCAjNaAiI,5851
621
+ claude_mpm/services/core/models/health.py,sha256=6AvuFLTHqxO3SX2P07YDbMiRxG6VKOa2q9w-H40UFOQ,4988
609
622
  claude_mpm/services/core/models/process.py,sha256=bqrXUgjDZ8ut3uj6tUTyHTSTJhuxtLh67wgU4LmZXnA,7356
610
623
  claude_mpm/services/core/models/restart.py,sha256=-fSa5LIhnkCKGsPIttT2tB3Gv_n9giwVz_FY-vJxYrE,10032
611
624
  claude_mpm/services/core/models/stability.py,sha256=CFCEXY3VkZNTdvYHinLgQTSJa7kz2apZE-J9IPykqLU,8615
@@ -667,29 +680,29 @@ claude_mpm/services/infrastructure/context_preservation.py,sha256=gvIRHzuhQpO5Bd
667
680
  claude_mpm/services/infrastructure/daemon_manager.py,sha256=sfDxzEy5ZMFy6Gf5ZKgzioejU95ud7LF_LklvjRAIuI,8607
668
681
  claude_mpm/services/infrastructure/logging.py,sha256=4JVEigdBZYVqtHr_SVIuG-g8pxkZxkfhlCEXQ1SoE-o,6492
669
682
  claude_mpm/services/infrastructure/monitoring.py,sha256=XkcTMRj9R4gST77Yoxg2OyAYWWeF9iF9brw8aGeU2GA,2129
670
- claude_mpm/services/infrastructure/monitoring/__init__.py,sha256=4Wo3CV8F2Gcc0OyPHEf1Uz1JkMYksdKky_yUDxF0vTE,1066
671
- claude_mpm/services/infrastructure/monitoring/aggregator.py,sha256=vvPSDrvJmO2l9QhUajz4ZxBNT1Yk3XOVp-8wZKxv_wc,15201
672
- claude_mpm/services/infrastructure/monitoring/base.py,sha256=f4sOTWbfH5p9P7n4N2iOVe3GWGxhqlLv6UD1LdKzV70,3864
683
+ claude_mpm/services/infrastructure/monitoring/__init__.py,sha256=whysxCLHioNPEwkwbiGKY9B8cStZr8ShZbktBiWPdts,1088
684
+ claude_mpm/services/infrastructure/monitoring/aggregator.py,sha256=OWIgetSQHFEvP_sauQCIhJpXqxM6gx42iGuAVbxl0Eo,15237
685
+ claude_mpm/services/infrastructure/monitoring/base.py,sha256=0eZik3od0GNIQLQASjfamVt8-A8uKiJTmNQsb6fGTVM,3713
673
686
  claude_mpm/services/infrastructure/monitoring/legacy.py,sha256=Na1nomigLkJ25pdmofQVBWEca7tDxUxfsDmp2Hy9nPc,7171
674
- claude_mpm/services/infrastructure/monitoring/network.py,sha256=L874kGjryP_R8tDwz4jgN7MGlfGrDJGa2tM8zVbtrEk,6933
675
- claude_mpm/services/infrastructure/monitoring/process.py,sha256=_gh124mIemvHZE2wV1VWuMf-u7qI3VpXAUSSmuCOIJY,11054
676
- claude_mpm/services/infrastructure/monitoring/resources.py,sha256=7Mt9zvNAYGf7OTLBUFpGoDQncCuTYkpODRKV42T6wyI,7665
677
- claude_mpm/services/infrastructure/monitoring/service.py,sha256=guYB6rJtU18T2kPhZbKKg85l96lm2f7XVtPnBt1O3So,12613
678
- claude_mpm/services/local_ops/__init__.py,sha256=-jiXPdKCgaEky1NdR4X1YUGQL2lfrT3xQ-XEHV2ICFs,5056
679
- claude_mpm/services/local_ops/crash_detector.py,sha256=bc78Kx78hgqEl7nM-_T_t77nd3AGb37IVBWvKEcyZbo,8813
680
- claude_mpm/services/local_ops/health_manager.py,sha256=hKS8h30tJiiBfk-FbpOUjvKqxzb0GK9CisM2idEMopc,15226
687
+ claude_mpm/services/infrastructure/monitoring/network.py,sha256=Sxhe43czCInLhJDwEy2cqjleiQRY9qbjfzXhAVEIjNk,6965
688
+ claude_mpm/services/infrastructure/monitoring/process.py,sha256=88-s0iY_AXTRs7cdZRw5sjF-_YXCigrbAIOZqwDDhL4,11098
689
+ claude_mpm/services/infrastructure/monitoring/resources.py,sha256=aBojL1IJkAOVawynRH_RvfXmmD7uBkhQSyRp9Fqtiqs,7696
690
+ claude_mpm/services/infrastructure/monitoring/service.py,sha256=3xEFuHFHytHSPmh3orxxRbI9L7Eus2wb2ZmRR0qrpnE,12653
691
+ claude_mpm/services/local_ops/__init__.py,sha256=THhORMQlnmzdnUAOhjhjQwahe6AupFnwWVkEdC5yAdM,5085
692
+ claude_mpm/services/local_ops/crash_detector.py,sha256=-VVEurT960GRFyfEmGo9Z049EY2tPVmvm5DeIPxHkFI,8796
693
+ claude_mpm/services/local_ops/health_manager.py,sha256=oFKvA_n0rBcDiBP8vzcT3NBJZe0TyysJRu9bLEXN56U,15255
681
694
  claude_mpm/services/local_ops/log_monitor.py,sha256=dCUzEXf2yXcFjcqyS7oWtI6MLR9oj_j3Hibd6ZWe5RI,12861
682
695
  claude_mpm/services/local_ops/memory_leak_detector.py,sha256=uZC9AxMCk9rvf2IoOV9hq9ds2sCxOnfiDpJI11-d25c,10118
683
696
  claude_mpm/services/local_ops/process_manager.py,sha256=_CG1cVei5VY0TEPRaXARSowpicAxymdoCtRawU9vX_I,19673
684
697
  claude_mpm/services/local_ops/resource_monitor.py,sha256=k_TU4wkOwmJMR0BLSqAOIwckGyw_Xm9P8QXOTRapBA8,11357
685
- claude_mpm/services/local_ops/restart_manager.py,sha256=HkSXPltljkxSxp_5bns72mTtEn7h7cayKjJLJD5ZRI8,13861
698
+ claude_mpm/services/local_ops/restart_manager.py,sha256=0P_9f6fGGizRZ3onKUUx_0AJdE260Ko7SfBvC_eP0u4,13844
686
699
  claude_mpm/services/local_ops/restart_policy.py,sha256=0HknpxkQXnngONu8hYx7b2z0BTZgvh_QQvvgsLw70pU,13452
687
700
  claude_mpm/services/local_ops/state_manager.py,sha256=aW8eGPKouuckyBDXQTS7L_AEWqO6qJCdK79aYbpwIz0,11959
688
701
  claude_mpm/services/local_ops/unified_manager.py,sha256=eEnvOIEVhB36xFnaKrb5UxrTqQFq4I4iuPIKoYPZSOg,21860
689
702
  claude_mpm/services/local_ops/health_checks/__init__.py,sha256=y2y7Yu-wawPyG3WW62Xs26t7ICFFTO-RWE3NHu5S40A,894
690
- claude_mpm/services/local_ops/health_checks/http_check.py,sha256=vVQAvrwycWDdFkk04IJUTZFf-OEDI_p9mTCX1sGOjRQ,8324
691
- claude_mpm/services/local_ops/health_checks/process_check.py,sha256=bHF8pls4J6G5bYiQdeQbh5DhLlngl-Kl0ID5GEOkbdI,8776
692
- claude_mpm/services/local_ops/health_checks/resource_check.py,sha256=uEBJX1H8muVDkg-heWdK9asAwZEYYAY6y-JE6yUyeDM,9210
703
+ claude_mpm/services/local_ops/health_checks/http_check.py,sha256=8o64myTMh7O3sFKxolEg2ZCJ_OycT8iqxCoQNq21hTE,8357
704
+ claude_mpm/services/local_ops/health_checks/process_check.py,sha256=L1XcbSLngbyYSMKJCUHv7v2ARaVd_OsDyMVv5ajWt9Q,8809
705
+ claude_mpm/services/local_ops/health_checks/resource_check.py,sha256=V8Mq99qwGlrgncEKN7oaBbQwZyPIAzLNZD1bwk-Ugw8,9243
693
706
  claude_mpm/services/mcp_gateway/__init__.py,sha256=4fiMsd7i2QzZpEXCUeo0Vk_CXRi35TE94gPvwyuz2es,5099
694
707
  claude_mpm/services/mcp_gateway/auto_configure.py,sha256=JNos01nGb2qXACXNHC-UkLccqQ-p8GFUElXqBLUQl7A,12163
695
708
  claude_mpm/services/mcp_gateway/main.py,sha256=1e_-NGwVNr8cFtwWC_2NhZS-EYwC--MSfiZTx15x3ao,19121
@@ -763,9 +776,9 @@ claude_mpm/services/project/project_organizer.py,sha256=9uAHI5MISum7YKNibRwH2jxb
763
776
  claude_mpm/services/project/registry.py,sha256=izNHLAhWcxJKWK1hQ557eOrvBlxxVuqJcxZOQ1wvYe8,24342
764
777
  claude_mpm/services/project/toolchain_analyzer.py,sha256=FkqKz3cQr7k5kzIqlhU8wB85TD-G0ypd3i6VwCT41ik,21280
765
778
  claude_mpm/services/shared/__init__.py,sha256=9sL2GHHGg8-lboHTZ8mzIfhcCWiFCQyWbpC27jkBRI0,597
766
- claude_mpm/services/shared/async_service_base.py,sha256=46Z-ATX5N0FhugNsF6byJ42frs4Rw5ZWfhw3Paf2788,7010
779
+ claude_mpm/services/shared/async_service_base.py,sha256=eIWAdoZmrl1_aB8L9NCPj2D_KqYCisOpLbFkzvv25U8,6703
767
780
  claude_mpm/services/shared/config_service_base.py,sha256=YJewpCTXV6VkJsRiDkxL3MWa-8Lj04AQREBqnFk_Ws8,10124
768
- claude_mpm/services/shared/lifecycle_service_base.py,sha256=WiAUJ5_k-2dYkDRMbJl7qymhtj-KfSt8Ev6jD_pxrbc,10124
781
+ claude_mpm/services/shared/lifecycle_service_base.py,sha256=YJZHs2sUrnIsbHHjrd8ltu5VSmi_82B8iPbwi0kAUKU,9855
769
782
  claude_mpm/services/shared/manager_base.py,sha256=kmjhpVqgfYC1N4YQnPAilCfdrSpAh9Qz7wcQ602L4x4,9296
770
783
  claude_mpm/services/shared/service_factory.py,sha256=9yvnD62urrNQCGmtk_3OcR5tVUCnoS6wHkaI5PK34mg,9891
771
784
  claude_mpm/services/socketio/__init__.py,sha256=PS-2twllga-2mhSfKdu4MgpikfKp_730gMLAqU_9YX4,556
@@ -864,9 +877,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
864
877
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
865
878
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
866
879
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
867
- claude_mpm-4.15.2.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
868
- claude_mpm-4.15.2.dist-info/METADATA,sha256=C8lvyVuhjSuHkqFwlYpblJvFIIHastmA_CXdwTLx-PI,17967
869
- claude_mpm-4.15.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
870
- claude_mpm-4.15.2.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
871
- claude_mpm-4.15.2.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
872
- claude_mpm-4.15.2.dist-info/RECORD,,
880
+ claude_mpm-4.15.3.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
881
+ claude_mpm-4.15.3.dist-info/METADATA,sha256=JEhnlCA4qB96EMbzJc4YqI83nAYa6Nf1AHEkHE3s6o8,17967
882
+ claude_mpm-4.15.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
883
+ claude_mpm-4.15.3.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
884
+ claude_mpm-4.15.3.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
885
+ claude_mpm-4.15.3.dist-info/RECORD,,