claude-mpm 4.15.1__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/core/enums.py +18 -0
- claude_mpm/core/types.py +2 -9
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/core/models/health.py +1 -28
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/local_ops/__init__.py +1 -1
- claude_mpm/services/local_ops/crash_detector.py +1 -1
- claude_mpm/services/local_ops/health_checks/http_check.py +2 -1
- claude_mpm/services/local_ops/health_checks/process_check.py +2 -1
- claude_mpm/services/local_ops/health_checks/resource_check.py +2 -1
- claude_mpm/services/local_ops/health_manager.py +1 -1
- claude_mpm/services/local_ops/restart_manager.py +1 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- {claude_mpm-4.15.1.dist-info → claude_mpm-4.15.3.dist-info}/METADATA +1 -1
- {claude_mpm-4.15.1.dist-info → claude_mpm-4.15.3.dist-info}/RECORD +41 -28
- {claude_mpm-4.15.1.dist-info → claude_mpm-4.15.3.dist-info}/WHEEL +0 -0
- {claude_mpm-4.15.1.dist-info → claude_mpm-4.15.3.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.15.1.dist-info → claude_mpm-4.15.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.15.1.dist-info → claude_mpm-4.15.3.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.15.
|
|
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."""
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
|
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
|
-
#
|
|
216
|
-
if status_counts[HealthStatus.
|
|
217
|
-
return HealthStatus.
|
|
215
|
+
# Unhealthy if any unhealthy metrics
|
|
216
|
+
if status_counts[HealthStatus.UNHEALTHY] > 0:
|
|
217
|
+
return HealthStatus.UNHEALTHY
|
|
218
218
|
|
|
219
|
-
#
|
|
220
|
-
|
|
221
|
-
if
|
|
222
|
-
return HealthStatus.
|
|
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.
|
|
379
|
-
aggregated_status = HealthStatus.
|
|
380
|
-
elif status_counts[HealthStatus.
|
|
381
|
-
aggregated_status = HealthStatus.
|
|
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
|
-
"
|
|
79
|
-
[m for m in self.metrics if m.status == HealthStatus.
|
|
70
|
+
"degraded_metrics": len(
|
|
71
|
+
[m for m in self.metrics if m.status == HealthStatus.DEGRADED]
|
|
80
72
|
),
|
|
81
|
-
"
|
|
82
|
-
[m for m in self.metrics if m.status == HealthStatus.
|
|
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 .
|
|
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.
|
|
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
|
|
146
|
+
# Determine if this is unhealthy or degraded based on endpoint type
|
|
146
147
|
status = (
|
|
147
|
-
HealthStatus.
|
|
148
|
+
HealthStatus.DEGRADED
|
|
148
149
|
if "optional" in name.lower()
|
|
149
|
-
else HealthStatus.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
183
|
+
HealthStatus.DEGRADED
|
|
183
184
|
if cpu_percent < self.cpu_threshold * 1.2
|
|
184
|
-
else HealthStatus.
|
|
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.
|
|
217
|
+
HealthStatus.DEGRADED
|
|
217
218
|
if memory_mb < self.memory_threshold_mb * 1.2
|
|
218
|
-
else HealthStatus.
|
|
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.
|
|
260
|
+
HealthStatus.DEGRADED
|
|
260
261
|
if fd_count < self.fd_threshold * 1.2
|
|
261
|
-
else HealthStatus.
|
|
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 .
|
|
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.
|
|
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.
|
|
186
|
+
load_status = HealthStatus.DEGRADED
|
|
186
187
|
if load1 > cpu_count * 1.5:
|
|
187
|
-
load_status = HealthStatus.
|
|
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.
|
|
224
|
-
return HealthStatus.
|
|
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 .
|
|
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.
|
|
83
|
+
client_status = HealthStatus.UNHEALTHY
|
|
83
84
|
elif client_count > self.max_clients * 0.8:
|
|
84
|
-
client_status = HealthStatus.
|
|
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.
|
|
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.
|
|
161
|
+
queue_status = HealthStatus.DEGRADED
|
|
161
162
|
if queue_size > 5000:
|
|
162
|
-
queue_status = HealthStatus.
|
|
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.
|
|
195
|
+
error_status = HealthStatus.UNHEALTHY
|
|
195
196
|
elif error_rate > self.max_error_rate * 0.5:
|
|
196
|
-
error_status = HealthStatus.
|
|
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.
|
|
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.
|
|
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.
|
|
267
|
+
activity_status = HealthStatus.UNHEALTHY
|
|
267
268
|
elif time_since_activity > self.stale_activity_seconds:
|
|
268
|
-
activity_status = HealthStatus.
|
|
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.
|
|
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.
|
|
311
|
+
time_status = HealthStatus.UNHEALTHY
|
|
311
312
|
elif avg_time > 500: # > 500ms
|
|
312
|
-
time_status = HealthStatus.
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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) ->
|
|
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 ==
|
|
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 ==
|
|
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 !=
|
|
71
|
+
if self._state != ServiceState.UNINITIALIZED:
|
|
83
72
|
self.logger.warning(f"Service {self.service_name} already initialized")
|
|
84
|
-
return self._state ==
|
|
73
|
+
return self._state == ServiceState.RUNNING
|
|
85
74
|
|
|
86
|
-
self._state =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 (
|
|
106
|
+
if self._state in (ServiceState.STOPPED, ServiceState.STOPPING):
|
|
118
107
|
return
|
|
119
108
|
|
|
120
|
-
self._state =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,5 +1,5 @@
|
|
|
1
1
|
claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
|
|
2
|
-
claude_mpm/VERSION,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
671
|
-
claude_mpm/services/infrastructure/monitoring/aggregator.py,sha256=
|
|
672
|
-
claude_mpm/services/infrastructure/monitoring/base.py,sha256=
|
|
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=
|
|
675
|
-
claude_mpm/services/infrastructure/monitoring/process.py,sha256=
|
|
676
|
-
claude_mpm/services/infrastructure/monitoring/resources.py,sha256=
|
|
677
|
-
claude_mpm/services/infrastructure/monitoring/service.py,sha256=
|
|
678
|
-
claude_mpm/services/local_ops/__init__.py,sha256
|
|
679
|
-
claude_mpm/services/local_ops/crash_detector.py,sha256
|
|
680
|
-
claude_mpm/services/local_ops/health_manager.py,sha256=
|
|
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=
|
|
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=
|
|
691
|
-
claude_mpm/services/local_ops/health_checks/process_check.py,sha256=
|
|
692
|
-
claude_mpm/services/local_ops/health_checks/resource_check.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
868
|
-
claude_mpm-4.15.
|
|
869
|
-
claude_mpm-4.15.
|
|
870
|
-
claude_mpm-4.15.
|
|
871
|
-
claude_mpm-4.15.
|
|
872
|
-
claude_mpm-4.15.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|