claude-mpm 4.13.1__py3-none-any.whl → 4.14.0__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 (50) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/PM_INSTRUCTIONS.md +68 -0
  3. claude_mpm/cli/__init__.py +10 -0
  4. claude_mpm/cli/commands/local_deploy.py +536 -0
  5. claude_mpm/cli/parsers/base_parser.py +7 -0
  6. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  7. claude_mpm/commands/mpm-agents-detect.md +168 -0
  8. claude_mpm/commands/mpm-agents-recommend.md +214 -0
  9. claude_mpm/commands/mpm-agents.md +75 -1
  10. claude_mpm/commands/mpm-auto-configure.md +217 -0
  11. claude_mpm/commands/mpm-help.md +160 -0
  12. claude_mpm/config/model_config.py +428 -0
  13. claude_mpm/core/interactive_session.py +3 -0
  14. claude_mpm/services/core/interfaces/__init__.py +74 -2
  15. claude_mpm/services/core/interfaces/health.py +172 -0
  16. claude_mpm/services/core/interfaces/model.py +281 -0
  17. claude_mpm/services/core/interfaces/process.py +372 -0
  18. claude_mpm/services/core/interfaces/restart.py +307 -0
  19. claude_mpm/services/core/interfaces/stability.py +260 -0
  20. claude_mpm/services/core/models/__init__.py +35 -0
  21. claude_mpm/services/core/models/health.py +189 -0
  22. claude_mpm/services/core/models/process.py +258 -0
  23. claude_mpm/services/core/models/restart.py +302 -0
  24. claude_mpm/services/core/models/stability.py +264 -0
  25. claude_mpm/services/local_ops/__init__.py +163 -0
  26. claude_mpm/services/local_ops/crash_detector.py +257 -0
  27. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  28. claude_mpm/services/local_ops/health_checks/http_check.py +223 -0
  29. claude_mpm/services/local_ops/health_checks/process_check.py +235 -0
  30. claude_mpm/services/local_ops/health_checks/resource_check.py +254 -0
  31. claude_mpm/services/local_ops/health_manager.py +430 -0
  32. claude_mpm/services/local_ops/log_monitor.py +396 -0
  33. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  34. claude_mpm/services/local_ops/process_manager.py +595 -0
  35. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  36. claude_mpm/services/local_ops/restart_manager.py +401 -0
  37. claude_mpm/services/local_ops/restart_policy.py +387 -0
  38. claude_mpm/services/local_ops/state_manager.py +371 -0
  39. claude_mpm/services/local_ops/unified_manager.py +600 -0
  40. claude_mpm/services/model/__init__.py +147 -0
  41. claude_mpm/services/model/base_provider.py +365 -0
  42. claude_mpm/services/model/claude_provider.py +412 -0
  43. claude_mpm/services/model/model_router.py +453 -0
  44. claude_mpm/services/model/ollama_provider.py +415 -0
  45. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/METADATA +1 -1
  46. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/RECORD +50 -15
  47. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/WHEEL +0 -0
  48. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/entry_points.txt +0 -0
  49. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/licenses/LICENSE +0 -0
  50. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,172 @@
1
+ """
2
+ Health Check Interfaces for Claude MPM Framework
3
+ =================================================
4
+
5
+ WHY: This module defines interfaces for health monitoring operations,
6
+ enabling the local-ops-agent to perform comprehensive health checks on
7
+ deployed processes including HTTP endpoints, process status, and resource usage.
8
+
9
+ DESIGN DECISION: Health check interfaces are separated to enable modular
10
+ health monitoring with different check types (HTTP, process, resource).
11
+
12
+ ARCHITECTURE:
13
+ - IHealthCheck: Interface for individual health check implementations
14
+ - IHealthCheckManager: Interface for orchestrating multiple health checks
15
+ - Health data models defined in models/health.py
16
+
17
+ USAGE:
18
+ http_check = HttpHealthCheck(endpoint="http://localhost:3000/health")
19
+ process_check = ProcessHealthCheck(process_manager)
20
+ resource_check = ResourceHealthCheck(process_manager)
21
+
22
+ health_manager = HealthCheckManager(
23
+ process_manager=process_manager,
24
+ check_interval=30
25
+ )
26
+ health_manager.start_monitoring()
27
+ """
28
+
29
+ from abc import ABC, abstractmethod
30
+ from typing import List
31
+
32
+ from claude_mpm.services.core.models.health import (
33
+ DeploymentHealth,
34
+ HealthCheckResult,
35
+ )
36
+
37
+
38
+ class IHealthCheck(ABC):
39
+ """
40
+ Interface for individual health check implementations.
41
+
42
+ WHY: Abstracts different types of health checks (HTTP, process, resource)
43
+ to enable flexible health monitoring strategies.
44
+
45
+ DESIGN DECISION: Each check type implements this interface to provide
46
+ a consistent API for executing checks and interpreting results.
47
+
48
+ Thread Safety: Implementations must be thread-safe for concurrent execution.
49
+ """
50
+
51
+ @abstractmethod
52
+ def check(self, deployment_id: str, **kwargs) -> HealthCheckResult:
53
+ """
54
+ Execute the health check for a deployment.
55
+
56
+ Args:
57
+ deployment_id: Unique deployment identifier
58
+ **kwargs: Check-specific parameters (e.g., endpoint URL, thresholds)
59
+
60
+ Returns:
61
+ HealthCheckResult with check status and details
62
+
63
+ Raises:
64
+ ValueError: If deployment_id not found
65
+ """
66
+
67
+ @abstractmethod
68
+ def get_check_type(self) -> str:
69
+ """
70
+ Get the type identifier for this health check.
71
+
72
+ Returns:
73
+ Check type string (e.g., "http", "process", "resource")
74
+ """
75
+
76
+
77
+ class IHealthCheckManager(ABC):
78
+ """
79
+ Interface for coordinating health checks across deployments.
80
+
81
+ WHY: Health monitoring requires orchestrating multiple check types,
82
+ aggregating results, and maintaining historical data. This interface
83
+ provides a high-level API for comprehensive health monitoring.
84
+
85
+ DESIGN DECISION: Provides both synchronous (check_health) and asynchronous
86
+ (background monitoring) operations to support different use cases.
87
+
88
+ Background Monitoring:
89
+ - Runs health checks at regular intervals
90
+ - Maintains historical health data
91
+ - Triggers callbacks on status changes
92
+ - Thread-safe with proper locking
93
+ """
94
+
95
+ @abstractmethod
96
+ def check_health(self, deployment_id: str) -> DeploymentHealth:
97
+ """
98
+ Execute all health checks for a deployment.
99
+
100
+ WHY: Provides a comprehensive health snapshot by running all
101
+ registered health checks and aggregating results.
102
+
103
+ Args:
104
+ deployment_id: Unique deployment identifier
105
+
106
+ Returns:
107
+ DeploymentHealth with aggregated status and check results
108
+
109
+ Raises:
110
+ ValueError: If deployment_id not found
111
+ """
112
+
113
+ @abstractmethod
114
+ def start_monitoring(self) -> None:
115
+ """
116
+ Start background health monitoring.
117
+
118
+ WHY: Enables continuous health tracking without manual polling.
119
+ Monitoring runs in a separate daemon thread.
120
+
121
+ Thread Safety: Creates a daemon thread that performs periodic checks.
122
+ """
123
+
124
+ @abstractmethod
125
+ def stop_monitoring(self) -> None:
126
+ """
127
+ Stop background health monitoring.
128
+
129
+ WHY: Gracefully stops the monitoring thread and releases resources.
130
+ """
131
+
132
+ @abstractmethod
133
+ def is_monitoring(self) -> bool:
134
+ """
135
+ Check if background monitoring is active.
136
+
137
+ Returns:
138
+ True if monitoring thread is running
139
+ """
140
+
141
+ @abstractmethod
142
+ def get_health_history(
143
+ self, deployment_id: str, limit: int = 10
144
+ ) -> List[DeploymentHealth]:
145
+ """
146
+ Get historical health check results for a deployment.
147
+
148
+ Args:
149
+ deployment_id: Unique deployment identifier
150
+ limit: Maximum number of historical entries to return
151
+
152
+ Returns:
153
+ List of DeploymentHealth objects, newest first
154
+ """
155
+
156
+ @abstractmethod
157
+ def register_status_callback(self, callback) -> None:
158
+ """
159
+ Register a callback for health status changes.
160
+
161
+ WHY: Enables reactive behavior based on health status changes
162
+ (e.g., alerts, auto-recovery, logging).
163
+
164
+ Args:
165
+ callback: Function called with (deployment_id, old_status, new_status)
166
+ """
167
+
168
+
169
+ __all__ = [
170
+ "IHealthCheck",
171
+ "IHealthCheckManager",
172
+ ]
@@ -0,0 +1,281 @@
1
+ """
2
+ Model Provider Interfaces for Claude MPM Framework
3
+ ==================================================
4
+
5
+ WHY: This module defines the interfaces for content processing model providers,
6
+ enabling support for both local (Ollama) and cloud (Claude) models with
7
+ intelligent routing and auto-fallback capabilities.
8
+
9
+ DESIGN DECISION: Model providers implement a common interface (IModelProvider)
10
+ to enable polymorphic use and easy switching between providers. The abstraction
11
+ allows for provider-specific optimizations while maintaining a consistent API.
12
+
13
+ ARCHITECTURE:
14
+ - IModelProvider: Core provider interface for content analysis
15
+ - ModelCapability: Enum of supported content processing tasks
16
+ - ModelProvider: Enum of available provider types
17
+ - ModelResponse: Standardized response format across providers
18
+
19
+ USAGE:
20
+ provider = OllamaProvider()
21
+ if await provider.is_available():
22
+ response = await provider.analyze_content(
23
+ content="Your text here",
24
+ task=ModelCapability.SEO_ANALYSIS
25
+ )
26
+ if response.success:
27
+ print(f"Analysis from {response.model}: {response.result}")
28
+ """
29
+
30
+ from abc import ABC, abstractmethod
31
+ from dataclasses import dataclass, field
32
+ from enum import Enum
33
+ from typing import Any, Dict, List, Optional
34
+
35
+
36
+ class ModelCapability(Enum):
37
+ """
38
+ Content processing capabilities supported by model providers.
39
+
40
+ WHY: Defines task-specific analysis types for content processing.
41
+ Each capability may route to different models optimized for that task.
42
+ """
43
+
44
+ SEO_ANALYSIS = "seo_analysis"
45
+ READABILITY = "readability"
46
+ GRAMMAR = "grammar"
47
+ SUMMARIZATION = "summarization"
48
+ KEYWORD_EXTRACTION = "keyword_extraction"
49
+ ACCESSIBILITY = "accessibility"
50
+ SENTIMENT = "sentiment"
51
+ GENERAL = "general"
52
+
53
+
54
+ class ModelProvider(Enum):
55
+ """
56
+ Available model provider backends.
57
+
58
+ WHY: Enables configuration-based routing between providers.
59
+
60
+ Values:
61
+ CLAUDE: Cloud-based Claude API (always available)
62
+ OLLAMA: Local Ollama installation (requires local setup)
63
+ AUTO: Intelligent routing with Ollama-first, Claude fallback
64
+ """
65
+
66
+ CLAUDE = "claude"
67
+ OLLAMA = "ollama"
68
+ AUTO = "auto"
69
+
70
+
71
+ @dataclass
72
+ class ModelResponse:
73
+ """
74
+ Standardized response from model providers.
75
+
76
+ WHY: Provides consistent response format across all providers,
77
+ enabling transparent provider switching and unified error handling.
78
+
79
+ Attributes:
80
+ success: Whether the operation succeeded
81
+ provider: Name of provider that handled request (e.g., "ollama", "claude")
82
+ model: Specific model used (e.g., "llama3.3:70b", "claude-3-5-sonnet")
83
+ task: Task that was performed
84
+ result: Analysis result text
85
+ metadata: Provider-specific metadata (tokens, timing, etc.)
86
+ error: Error message if success=False
87
+ """
88
+
89
+ success: bool
90
+ provider: str
91
+ model: str
92
+ task: str
93
+ result: str
94
+ metadata: Dict[str, Any] = field(default_factory=dict)
95
+ error: Optional[str] = None
96
+
97
+ def to_dict(self) -> Dict[str, Any]:
98
+ """Convert response to dictionary for serialization."""
99
+ return {
100
+ "success": self.success,
101
+ "provider": self.provider,
102
+ "model": self.model,
103
+ "task": self.task,
104
+ "result": self.result,
105
+ "metadata": self.metadata,
106
+ "error": self.error,
107
+ }
108
+
109
+
110
+ class IModelProvider(ABC):
111
+ """
112
+ Interface for content processing model providers.
113
+
114
+ WHY: Defines contract for all model providers (Claude, Ollama, future providers).
115
+ Enables polymorphic use and easy provider switching without changing client code.
116
+
117
+ DESIGN PATTERN: Strategy pattern - allows runtime selection of model provider
118
+ based on availability, configuration, and task requirements.
119
+
120
+ Implementations should:
121
+ - Handle provider-specific connection management
122
+ - Map capabilities to optimal models
123
+ - Provide robust error handling
124
+ - Return standardized ModelResponse objects
125
+ """
126
+
127
+ @abstractmethod
128
+ async def is_available(self) -> bool:
129
+ """
130
+ Check if provider is available and functional.
131
+
132
+ WHY: Enables auto-fallback routing. Local providers may not always be
133
+ available (Ollama not running), while cloud providers need API keys.
134
+
135
+ Returns:
136
+ True if provider is ready to handle requests
137
+ """
138
+
139
+ @abstractmethod
140
+ async def analyze_content(
141
+ self,
142
+ content: str,
143
+ task: ModelCapability,
144
+ model: Optional[str] = None,
145
+ **kwargs,
146
+ ) -> ModelResponse:
147
+ """
148
+ Analyze content with specified task.
149
+
150
+ WHY: Core content processing method. Handles all analysis types
151
+ with task-specific prompting and model selection.
152
+
153
+ Args:
154
+ content: Text content to analyze
155
+ task: Type of analysis to perform
156
+ model: Optional specific model to use (overrides default)
157
+ **kwargs: Provider-specific options (temperature, max_tokens, etc.)
158
+
159
+ Returns:
160
+ ModelResponse with analysis results or error
161
+
162
+ Example:
163
+ response = await provider.analyze_content(
164
+ content="Your article text",
165
+ task=ModelCapability.SEO_ANALYSIS,
166
+ temperature=0.7
167
+ )
168
+ """
169
+
170
+ @abstractmethod
171
+ def get_supported_capabilities(self) -> List[ModelCapability]:
172
+ """
173
+ Return list of capabilities this provider supports.
174
+
175
+ WHY: Enables capability-based routing. Some providers may not
176
+ support all task types.
177
+
178
+ Returns:
179
+ List of supported ModelCapability values
180
+ """
181
+
182
+ @abstractmethod
183
+ async def get_available_models(self) -> List[str]:
184
+ """
185
+ List models available from this provider.
186
+
187
+ WHY: Enables model validation and user selection. Local providers
188
+ may have different models installed than expected.
189
+
190
+ Returns:
191
+ List of model names/identifiers
192
+
193
+ Example:
194
+ models = await provider.get_available_models()
195
+ # ["llama3.3:70b", "gemma2:9b", "mistral:7b"]
196
+ """
197
+
198
+ @abstractmethod
199
+ async def get_model_info(self, model: str) -> Dict[str, Any]:
200
+ """
201
+ Get detailed information about a specific model.
202
+
203
+ WHY: Provides model metadata for UI display and capability checking.
204
+
205
+ Args:
206
+ model: Model name/identifier
207
+
208
+ Returns:
209
+ Dictionary with model details (size, parameters, capabilities, etc.)
210
+ """
211
+
212
+ @abstractmethod
213
+ async def shutdown(self) -> None:
214
+ """
215
+ Shutdown provider and cleanup resources.
216
+
217
+ WHY: Proper resource cleanup for connection pools, HTTP sessions, etc.
218
+ """
219
+
220
+
221
+ class IModelRouter(ABC):
222
+ """
223
+ Interface for intelligent model routing with fallback.
224
+
225
+ WHY: Manages provider selection and fallback logic. Routes requests
226
+ to optimal provider based on availability and configuration.
227
+
228
+ DESIGN PATTERN: Chain of Responsibility - tries providers in order
229
+ until one succeeds or all fail.
230
+ """
231
+
232
+ @abstractmethod
233
+ async def analyze_content(
234
+ self,
235
+ content: str,
236
+ task: ModelCapability,
237
+ model: Optional[str] = None,
238
+ **kwargs,
239
+ ) -> ModelResponse:
240
+ """
241
+ Route content analysis to optimal provider.
242
+
243
+ WHY: Single entry point for all content analysis. Handles provider
244
+ selection, fallback, and error recovery transparently.
245
+
246
+ Args:
247
+ content: Text content to analyze
248
+ task: Type of analysis to perform
249
+ model: Optional specific model to use
250
+ **kwargs: Provider-specific options
251
+
252
+ Returns:
253
+ ModelResponse from successful provider
254
+ """
255
+
256
+ @abstractmethod
257
+ def get_active_provider(self) -> Optional[str]:
258
+ """
259
+ Get name of currently active provider.
260
+
261
+ Returns:
262
+ Provider name or None if no provider active
263
+ """
264
+
265
+ @abstractmethod
266
+ async def get_provider_status(self) -> Dict[str, Dict[str, Any]]:
267
+ """
268
+ Get status of all configured providers.
269
+
270
+ Returns:
271
+ Dictionary mapping provider names to status info
272
+ """
273
+
274
+
275
+ __all__ = [
276
+ "IModelProvider",
277
+ "IModelRouter",
278
+ "ModelCapability",
279
+ "ModelProvider",
280
+ "ModelResponse",
281
+ ]