claude-mpm 4.13.2__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 (44) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/cli/__init__.py +10 -0
  3. claude_mpm/cli/commands/local_deploy.py +536 -0
  4. claude_mpm/cli/parsers/base_parser.py +7 -0
  5. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  6. claude_mpm/config/model_config.py +428 -0
  7. claude_mpm/core/interactive_session.py +3 -0
  8. claude_mpm/services/core/interfaces/__init__.py +74 -2
  9. claude_mpm/services/core/interfaces/health.py +172 -0
  10. claude_mpm/services/core/interfaces/model.py +281 -0
  11. claude_mpm/services/core/interfaces/process.py +372 -0
  12. claude_mpm/services/core/interfaces/restart.py +307 -0
  13. claude_mpm/services/core/interfaces/stability.py +260 -0
  14. claude_mpm/services/core/models/__init__.py +35 -0
  15. claude_mpm/services/core/models/health.py +189 -0
  16. claude_mpm/services/core/models/process.py +258 -0
  17. claude_mpm/services/core/models/restart.py +302 -0
  18. claude_mpm/services/core/models/stability.py +264 -0
  19. claude_mpm/services/local_ops/__init__.py +163 -0
  20. claude_mpm/services/local_ops/crash_detector.py +257 -0
  21. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  22. claude_mpm/services/local_ops/health_checks/http_check.py +223 -0
  23. claude_mpm/services/local_ops/health_checks/process_check.py +235 -0
  24. claude_mpm/services/local_ops/health_checks/resource_check.py +254 -0
  25. claude_mpm/services/local_ops/health_manager.py +430 -0
  26. claude_mpm/services/local_ops/log_monitor.py +396 -0
  27. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  28. claude_mpm/services/local_ops/process_manager.py +595 -0
  29. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  30. claude_mpm/services/local_ops/restart_manager.py +401 -0
  31. claude_mpm/services/local_ops/restart_policy.py +387 -0
  32. claude_mpm/services/local_ops/state_manager.py +371 -0
  33. claude_mpm/services/local_ops/unified_manager.py +600 -0
  34. claude_mpm/services/model/__init__.py +147 -0
  35. claude_mpm/services/model/base_provider.py +365 -0
  36. claude_mpm/services/model/claude_provider.py +412 -0
  37. claude_mpm/services/model/model_router.py +453 -0
  38. claude_mpm/services/model/ollama_provider.py +415 -0
  39. {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/METADATA +1 -1
  40. {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/RECORD +44 -12
  41. {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/WHEEL +0 -0
  42. {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/entry_points.txt +0 -0
  43. {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/licenses/LICENSE +0 -0
  44. {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,415 @@
1
+ """
2
+ Ollama Model Provider Implementation for Claude MPM Framework
3
+ =============================================================
4
+
5
+ WHY: Enables local model execution via Ollama for privacy-sensitive content
6
+ analysis. Provides cost-effective alternative to cloud APIs with full control
7
+ over model selection and hosting.
8
+
9
+ DESIGN DECISION: Uses direct HTTP API calls to Ollama service rather than
10
+ heavyweight LangChain dependency. Keeps implementation lightweight and focused.
11
+
12
+ ARCHITECTURE:
13
+ - Direct integration with Ollama API (http://localhost:11434 by default)
14
+ - Task-specific model mapping based on research recommendations
15
+ - Automatic model availability checking and validation
16
+ - Graceful degradation when Ollama not available
17
+
18
+ RECOMMENDED MODELS (from research):
19
+ - SEO Analysis: llama3.3:70b (comprehensive analysis)
20
+ - Readability: gemma2:9b (fast, accurate)
21
+ - Grammar: qwen3:14b (specialized for grammar)
22
+ - Summarization: mistral:7b (concise summaries)
23
+ - Keyword Extraction: seoassistant (specialized SEO tool)
24
+ - General: gemma2:9b (good default balance)
25
+ """
26
+
27
+ import asyncio
28
+ from typing import Any, Dict, List, Optional
29
+
30
+ import aiohttp
31
+
32
+ from claude_mpm.services.core.interfaces.model import ModelCapability, ModelResponse
33
+ from claude_mpm.services.model.base_provider import BaseModelProvider
34
+
35
+
36
+ class OllamaProvider(BaseModelProvider):
37
+ """
38
+ Ollama local model provider.
39
+
40
+ WHY: Provides privacy-preserving local content analysis without sending
41
+ data to cloud services. Cost-effective for high-volume processing.
42
+
43
+ Configuration:
44
+ host: Ollama API endpoint (default: http://localhost:11434)
45
+ timeout: Request timeout in seconds (default: 30)
46
+ models: Dict mapping capabilities to model names (optional)
47
+
48
+ Usage:
49
+ provider = OllamaProvider(config={
50
+ "host": "http://localhost:11434",
51
+ "models": {
52
+ "seo_analysis": "llama3.3:70b"
53
+ }
54
+ })
55
+
56
+ if await provider.is_available():
57
+ response = await provider.analyze_content(
58
+ content="Your content",
59
+ task=ModelCapability.SEO_ANALYSIS
60
+ )
61
+ """
62
+
63
+ # Default model mappings based on research recommendations
64
+ DEFAULT_MODELS: Dict[ModelCapability, str] = {
65
+ ModelCapability.SEO_ANALYSIS: "llama3.3:70b",
66
+ ModelCapability.READABILITY: "gemma2:9b",
67
+ ModelCapability.GRAMMAR: "qwen3:14b",
68
+ ModelCapability.SUMMARIZATION: "mistral:7b",
69
+ ModelCapability.KEYWORD_EXTRACTION: "seoassistant",
70
+ ModelCapability.ACCESSIBILITY: "gemma2:9b",
71
+ ModelCapability.SENTIMENT: "gemma2:9b",
72
+ ModelCapability.GENERAL: "gemma2:9b",
73
+ }
74
+
75
+ def __init__(self, config: Optional[Dict[str, Any]] = None):
76
+ """
77
+ Initialize Ollama provider.
78
+
79
+ Args:
80
+ config: Configuration dict with:
81
+ - host: Ollama API endpoint
82
+ - timeout: Request timeout in seconds
83
+ - models: Custom model mappings
84
+ """
85
+ super().__init__(provider_name="ollama", config=config or {})
86
+
87
+ self.host = self.get_config("host", "http://localhost:11434")
88
+ self.timeout = self.get_config("timeout", 30)
89
+
90
+ # Merge custom models with defaults
91
+ custom_models = self.get_config("models", {})
92
+ self.model_mapping = self.DEFAULT_MODELS.copy()
93
+ if custom_models:
94
+ # Convert string keys to ModelCapability if needed
95
+ for key, value in custom_models.items():
96
+ if isinstance(key, str):
97
+ try:
98
+ capability = ModelCapability(key)
99
+ self.model_mapping[capability] = value
100
+ except ValueError:
101
+ self.log_warning(f"Unknown capability in config: {key}")
102
+ else:
103
+ self.model_mapping[key] = value
104
+
105
+ self._session: Optional[aiohttp.ClientSession] = None
106
+ self._available_models: List[str] = []
107
+
108
+ async def initialize(self) -> bool:
109
+ """
110
+ Initialize Ollama provider.
111
+
112
+ Returns:
113
+ True if initialization successful
114
+ """
115
+ self.log_info(f"Initializing Ollama provider at {self.host}")
116
+
117
+ # Create HTTP session
118
+ timeout = aiohttp.ClientTimeout(total=self.timeout)
119
+ self._session = aiohttp.ClientSession(timeout=timeout)
120
+
121
+ # Check availability
122
+ if not await self.is_available():
123
+ self.log_warning("Ollama service not available")
124
+ self._initialized = False
125
+ return False
126
+
127
+ # Fetch available models
128
+ self._available_models = await self.get_available_models()
129
+ self.log_info(f"Found {len(self._available_models)} available models")
130
+
131
+ self._initialized = True
132
+ return True
133
+
134
+ async def shutdown(self) -> None:
135
+ """Shutdown provider and cleanup resources."""
136
+ self.log_info("Shutting down Ollama provider")
137
+
138
+ if self._session and not self._session.closed:
139
+ await self._session.close()
140
+
141
+ self._shutdown = True
142
+
143
+ async def is_available(self) -> bool:
144
+ """
145
+ Check if Ollama service is available.
146
+
147
+ WHY: Enables auto-fallback routing. Returns False if service
148
+ is not running or unreachable.
149
+
150
+ Returns:
151
+ True if Ollama is reachable and functional
152
+ """
153
+ try:
154
+ # Ensure we have a session
155
+ if not self._session or self._session.closed:
156
+ timeout = aiohttp.ClientTimeout(total=5)
157
+ self._session = aiohttp.ClientSession(timeout=timeout)
158
+
159
+ # Try to fetch tags (models list)
160
+ async with self._session.get(f"{self.host}/api/tags") as response:
161
+ if response.status == 200:
162
+ return True
163
+ self.log_warning(f"Ollama returned status {response.status}")
164
+ return False
165
+
166
+ except aiohttp.ClientError as e:
167
+ self.log_debug(f"Ollama not available: {e}")
168
+ return False
169
+ except Exception as e:
170
+ self.log_warning(f"Error checking Ollama availability: {e}")
171
+ return False
172
+
173
+ async def get_available_models(self) -> List[str]:
174
+ """
175
+ List available models from Ollama.
176
+
177
+ Returns:
178
+ List of model names (e.g., ["llama3.3:70b", "gemma2:9b"])
179
+ """
180
+ try:
181
+ if not self._session or self._session.closed:
182
+ timeout = aiohttp.ClientTimeout(total=5)
183
+ self._session = aiohttp.ClientSession(timeout=timeout)
184
+
185
+ async with self._session.get(f"{self.host}/api/tags") as response:
186
+ if response.status == 200:
187
+ data = await response.json()
188
+ return [model["name"] for model in data.get("models", [])]
189
+ self.log_error(f"Failed to fetch models: status {response.status}")
190
+ return []
191
+
192
+ except Exception as e:
193
+ self.log_error(f"Error fetching available models: {e}")
194
+ return []
195
+
196
+ def get_supported_capabilities(self) -> List[ModelCapability]:
197
+ """
198
+ Return all supported capabilities.
199
+
200
+ WHY: Ollama supports all capabilities, routing to different models.
201
+
202
+ Returns:
203
+ List of all ModelCapability values
204
+ """
205
+ return list(ModelCapability)
206
+
207
+ def _get_model_for_task(self, task: ModelCapability) -> str:
208
+ """
209
+ Get optimal model for task.
210
+
211
+ Args:
212
+ task: Task capability
213
+
214
+ Returns:
215
+ Model name from mapping
216
+ """
217
+ return self.model_mapping.get(
218
+ task, self.DEFAULT_MODELS[ModelCapability.GENERAL]
219
+ )
220
+
221
+ async def analyze_content(
222
+ self,
223
+ content: str,
224
+ task: ModelCapability,
225
+ model: Optional[str] = None,
226
+ **kwargs,
227
+ ) -> ModelResponse:
228
+ """
229
+ Analyze content using Ollama model.
230
+
231
+ Args:
232
+ content: Text content to analyze
233
+ task: Type of analysis
234
+ model: Optional specific model (overrides task mapping)
235
+ **kwargs: Additional options:
236
+ - temperature: Sampling temperature (0.0-1.0)
237
+ - max_tokens: Maximum response tokens
238
+ - stream: Enable streaming (not yet implemented)
239
+
240
+ Returns:
241
+ ModelResponse with analysis results
242
+ """
243
+ # Validate content
244
+ if not self.validate_content(content, max_length=100000):
245
+ return self.create_response(
246
+ success=False,
247
+ model=model or "unknown",
248
+ task=task,
249
+ error="Invalid content provided",
250
+ )
251
+
252
+ # Check if initialized
253
+ if not self._initialized:
254
+ await self.initialize()
255
+
256
+ if not self._initialized:
257
+ return self.create_response(
258
+ success=False,
259
+ model=model or "unknown",
260
+ task=task,
261
+ error="Ollama provider not initialized",
262
+ )
263
+
264
+ # Select model
265
+ selected_model = model or self._get_model_for_task(task)
266
+
267
+ # Check if model is available
268
+ if selected_model not in self._available_models:
269
+ self.log_warning(
270
+ f"Model {selected_model} not found. "
271
+ f"Available: {', '.join(self._available_models[:5])}..."
272
+ )
273
+ return self.create_response(
274
+ success=False,
275
+ model=selected_model,
276
+ task=task,
277
+ error=f"Model {selected_model} not available in Ollama",
278
+ )
279
+
280
+ # Generate prompt
281
+ prompt = self.get_task_prompt(task, content)
282
+
283
+ # Call Ollama API with retry logic
284
+ return await self.analyze_with_retry(
285
+ self._call_ollama,
286
+ prompt,
287
+ task,
288
+ selected_model,
289
+ **kwargs,
290
+ )
291
+
292
+ async def _call_ollama(
293
+ self,
294
+ prompt: str,
295
+ task: ModelCapability,
296
+ model: str,
297
+ **kwargs,
298
+ ) -> ModelResponse:
299
+ """
300
+ Internal method to call Ollama API.
301
+
302
+ Args:
303
+ prompt: Generated prompt
304
+ task: Task capability
305
+ model: Model to use
306
+ **kwargs: Additional options
307
+
308
+ Returns:
309
+ ModelResponse
310
+ """
311
+ try:
312
+ # Prepare request
313
+ payload = {
314
+ "model": model,
315
+ "prompt": prompt,
316
+ "stream": False, # TODO: Implement streaming
317
+ "options": {},
318
+ }
319
+
320
+ # Add optional parameters
321
+ if "temperature" in kwargs:
322
+ payload["options"]["temperature"] = kwargs["temperature"]
323
+ if "max_tokens" in kwargs:
324
+ payload["options"]["num_predict"] = kwargs["max_tokens"]
325
+
326
+ # Make request
327
+ async with self._session.post(
328
+ f"{self.host}/api/generate",
329
+ json=payload,
330
+ ) as response:
331
+ if response.status == 200:
332
+ data = await response.json()
333
+ result_text = data.get("response", "")
334
+
335
+ # Extract metadata
336
+ metadata = {
337
+ "model": model,
338
+ "total_duration": data.get("total_duration", 0)
339
+ / 1e9, # ns to s
340
+ "load_duration": data.get("load_duration", 0) / 1e9,
341
+ "prompt_eval_count": data.get("prompt_eval_count", 0),
342
+ "eval_count": data.get("eval_count", 0),
343
+ }
344
+
345
+ return self.create_response(
346
+ success=True,
347
+ model=model,
348
+ task=task,
349
+ result=result_text,
350
+ metadata=metadata,
351
+ )
352
+ error_text = await response.text()
353
+ return self.create_response(
354
+ success=False,
355
+ model=model,
356
+ task=task,
357
+ error=f"Ollama API error {response.status}: {error_text}",
358
+ )
359
+
360
+ except asyncio.TimeoutError:
361
+ return self.create_response(
362
+ success=False,
363
+ model=model,
364
+ task=task,
365
+ error=f"Request timeout after {self.timeout}s",
366
+ )
367
+ except Exception as e:
368
+ return self.create_response(
369
+ success=False,
370
+ model=model,
371
+ task=task,
372
+ error=f"Request failed: {e!s}",
373
+ )
374
+
375
+ async def get_model_info(self, model: str) -> Dict[str, Any]:
376
+ """
377
+ Get detailed information about a model.
378
+
379
+ Args:
380
+ model: Model name
381
+
382
+ Returns:
383
+ Dictionary with model information
384
+ """
385
+ try:
386
+ if not self._session or self._session.closed:
387
+ timeout = aiohttp.ClientTimeout(total=5)
388
+ self._session = aiohttp.ClientSession(timeout=timeout)
389
+
390
+ async with self._session.post(
391
+ f"{self.host}/api/show",
392
+ json={"name": model},
393
+ ) as response:
394
+ if response.status == 200:
395
+ data = await response.json()
396
+ return {
397
+ "name": model,
398
+ "modelfile": data.get("modelfile", ""),
399
+ "parameters": data.get("parameters", ""),
400
+ "template": data.get("template", ""),
401
+ "details": data.get("details", {}),
402
+ }
403
+ return {
404
+ "name": model,
405
+ "error": f"Status {response.status}",
406
+ }
407
+
408
+ except Exception as e:
409
+ return {
410
+ "name": model,
411
+ "error": str(e),
412
+ }
413
+
414
+
415
+ __all__ = ["OllamaProvider"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.13.2
3
+ Version: 4.14.0
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=-9bAsjQWLJ_lPOMqq3ZKSFJfFptZVTO0Fx5-5NU0TcA,7
2
+ claude_mpm/VERSION,sha256=EsbNzYeGHvP0ZGb62vJDP5N02JE01T8kfdSU_SmCX9U,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
@@ -76,7 +76,7 @@ claude_mpm/agents/templates/.claude-mpm/memories/README.md,sha256=vEiG7cPjHRZfwX
76
76
  claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md,sha256=KMZSJrQi-wHOwfl2C0m3A4PpC4QuBtDolAtVybGahKc,77
77
77
  claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md,sha256=UBm4BycXtdaa-_l1VCh0alTGGOUSsnCbpKwbFuI-mUY,2219
78
78
  claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md,sha256=oPvFSYFnmJ4TkbTe4AZnNHWaJMJ-xqZP2WM6scUKQKo,13089
79
- claude_mpm/cli/__init__.py,sha256=ugJsK0_4hSx_9vzhjHF0oHuSWOlwTxtL70tYpQUSH6U,29745
79
+ claude_mpm/cli/__init__.py,sha256=GHKbVPW76UTMKENKvHKBn4vMDTqlx-Xp1f6TxSj7hr4,30107
80
80
  claude_mpm/cli/__main__.py,sha256=WnVGBwe10InxuZjJRFdwuMF6Gh16aXox6zFgxr0sRXk,847
81
81
  claude_mpm/cli/parser.py,sha256=Vqx9n-6Xo1uNhXR4rThmgWpZXTr0nOtkgDf3oMS9b0g,5855
82
82
  claude_mpm/cli/startup_logging.py,sha256=RTuyd6CbhiFQz7Z07LDDhK_ZAnZfuJ9B0NghVSntHFI,29390
@@ -99,6 +99,7 @@ claude_mpm/cli/commands/dashboard.py,sha256=4jPTmTl97DRNNJlYREWeE1iDdkct1uL-vv24
99
99
  claude_mpm/cli/commands/debug.py,sha256=YCfJ3aYf6hOCvLW_grdfINdEqI4RXVS28VJ7tkZBFS8,47115
100
100
  claude_mpm/cli/commands/doctor.py,sha256=nNKLZG3Qv_UsHNgrmetrWKgS7Pe2Jn5vq5aXyl60wKQ,7310
101
101
  claude_mpm/cli/commands/info.py,sha256=uiZ2GMkfr-4aeme2l6QhzxyawuhtuyVulfCi66yyvOs,7404
102
+ claude_mpm/cli/commands/local_deploy.py,sha256=BTZupWk36_zC0Nc4ANQ6DZa9mevWzVfbTjjJXvLGrzQ,21961
102
103
  claude_mpm/cli/commands/mcp.py,sha256=CLxxRzRNA3zYsiN1YVqks_N_FYThp7tMUIuQe2oZKpM,7153
103
104
  claude_mpm/cli/commands/mcp_command_router.py,sha256=j4tmnPRAmMlmtcP-n8Kl6S4l1vn3YY_dE79R3S4xpQ8,5984
104
105
  claude_mpm/cli/commands/mcp_config.py,sha256=xB5uLPn6QilJu78oVJe-SGC6Vv2AiORuUpLzVf-WWyw,4816
@@ -127,11 +128,12 @@ claude_mpm/cli/parsers/agents_parser.py,sha256=ztzbYFsu4q49MqNKC3oWBPwGPzs5JX4lx
127
128
  claude_mpm/cli/parsers/analyze_code_parser.py,sha256=cpJSMFbc3mqB4qrMBIEZiikzPekC2IQX-cjt9U2fHW4,5356
128
129
  claude_mpm/cli/parsers/analyze_parser.py,sha256=E00Ao0zwzbJPchs_AJt-aoQ7LQEtJPXRCNQ6Piivb4o,3908
129
130
  claude_mpm/cli/parsers/auto_configure_parser.py,sha256=NZWZRb00bsGU7_wgiYiPm2ZcPx1E9zy4Gp7MPecQmUA,7264
130
- claude_mpm/cli/parsers/base_parser.py,sha256=ToWS8WRddEwk-kArkBoZWKkydgqcndh90Fc-wPxhfFU,14467
131
+ claude_mpm/cli/parsers/base_parser.py,sha256=u6Mni33UZHHgiw8b6SwzkaJybVT_1z1nY9WmMFcucAg,14630
131
132
  claude_mpm/cli/parsers/config_parser.py,sha256=wp6NbV8_p9txP28MXFcQrri0JDIfGFM7u4aJbYJXcYQ,2699
132
133
  claude_mpm/cli/parsers/configure_parser.py,sha256=t3cwAQX3BfljDDRJH3i0LplpRprw5jdKcI9Uy3M8xtE,4382
133
134
  claude_mpm/cli/parsers/dashboard_parser.py,sha256=JBCM6v_iZhADr_Fwtk_d3up9AOod1avMab-vkNE61gE,3460
134
135
  claude_mpm/cli/parsers/debug_parser.py,sha256=F7MZdmiXiPfiIPMv21ZUqB2cMT8Ho1LDmpbvCXODLbY,9846
136
+ claude_mpm/cli/parsers/local_deploy_parser.py,sha256=k7CnhRc0zMzb_RtdAF1XlvYed2eJXWBwbu29UuCB0jI,7073
135
137
  claude_mpm/cli/parsers/mcp_parser.py,sha256=2j6ULhdu55Z2k_-Gu2QxIsFoTQFbDCEMSGePXSuPoQQ,6532
136
138
  claude_mpm/cli/parsers/memory_parser.py,sha256=ZwCDxJEgp-w03L-1tZsWTgisiwamP42s424bA5bvDJc,4760
137
139
  claude_mpm/cli/parsers/monitor_parser.py,sha256=PeoznSi_5Bw6THK_Espl8M20o6dKvvBSmFzAbovkaFQ,4920
@@ -165,6 +167,7 @@ claude_mpm/commands/mpm.md,sha256=tv_Mr6p2olRKIltKui4ljfCNG69VokkyIg951CeMBas,55
165
167
  claude_mpm/config/__init__.py,sha256=V2dyJQ8_gVCpNiCg8zYTQqE1RSeON5Zm8n5Ndkqhp1g,916
166
168
  claude_mpm/config/agent_config.py,sha256=sICpvJoOuJGRzdSIMWvC9ECzKTKF-3Psi-ATSaZQ9LU,14860
167
169
  claude_mpm/config/experimental_features.py,sha256=cH95HqMUEQL-_Hs833dAAC33GHMUE5e26qpOyiEtBWI,7546
170
+ claude_mpm/config/model_config.py,sha256=34JnIb_U19UYns3yLX-jjpuNywDnVZhiUSvvDzGzx0g,12410
168
171
  claude_mpm/config/paths.py,sha256=wTZxXt6LjD-gK9lG4i2QSuSnFRXe5lFaVU4dIr22ap8,7643
169
172
  claude_mpm/config/socketio_config.py,sha256=Z8O438z2taOPX2Eh_so-WOvvv-IHiM_WFbf4UBQ4iqg,11342
170
173
  claude_mpm/core/__init__.py,sha256=2bufzjbIXffZnSg5k-JH9czMDTkmtz-Jb9opgHmQY-0,2598
@@ -189,7 +192,7 @@ claude_mpm/core/hook_manager.py,sha256=Cq3vwYW7-ffKw_HSFqtv1RJTxs8YUpD_qeTiWvua3
189
192
  claude_mpm/core/hook_performance_config.py,sha256=e7a7oFctkRhA3aPXMO5Wavr-E6ku7ikLxMzPU7P1-yg,5779
190
193
  claude_mpm/core/injectable_service.py,sha256=9N4mHt6a_PwoP0pQo-QhVTnXLJlgDCCOg358d0jPEs4,7384
191
194
  claude_mpm/core/instruction_reinforcement_hook.py,sha256=s9KGkdJO8E9ip3MB5PlXo52-dTocHXqsVy5TcxOK8-A,9487
192
- claude_mpm/core/interactive_session.py,sha256=dMFuuZKXsGsDkXLaIgQKxbiG5LRRIEUFEKFFyYnsFbc,21979
195
+ claude_mpm/core/interactive_session.py,sha256=getJBbR4I3RmaOCQwEi_DL9ALe0-HskszK4jVsjjyz4,22106
193
196
  claude_mpm/core/interfaces.py,sha256=RNqXxUioEpV4vOaEoUJ38OvKYPMlpSb3V5Sb97l0w3Q,25625
194
197
  claude_mpm/core/lazy.py,sha256=pyCfEqGHyLz18yXTu_uG52-II-9nCaBcpzwwQGBrQro,14808
195
198
  claude_mpm/core/log_manager.py,sha256=yf82AKC-DYLtl7h0ka5IEoVC8aC0_II-zCjHOwD3RxQ,24661
@@ -578,14 +581,23 @@ claude_mpm/services/core/memory_manager.py,sha256=aajBuvBzTq0-EZrjnBjGRdUSaa6Mpb
578
581
  claude_mpm/services/core/path_resolver.py,sha256=VtqiOEUlskAr9nRsaS9uXQSSjDD8dIrYfNML0zLY2zo,17764
579
582
  claude_mpm/services/core/service_container.py,sha256=3hDwFUahxFZnokPzwgXqBP9swvZhLztKQqwe9xEHgsw,18497
580
583
  claude_mpm/services/core/service_interfaces.py,sha256=dlNp0K4gaMcLiNSZxXjsL-kto6vipYw87pBuFK7oVNo,10770
581
- claude_mpm/services/core/interfaces/__init__.py,sha256=G8-C1bA-LPrt_KxMtiZdxDeQCBJfnxLQDQjM4i0zvuI,6903
584
+ claude_mpm/services/core/interfaces/__init__.py,sha256=WsJ2ptrqGfLAJhwpmkwJ3GmaIuAalDNcI1IbZEP8E00,9080
582
585
  claude_mpm/services/core/interfaces/agent.py,sha256=bbGJCQM2E2T2C2ed2OOTFLzEXy4MR1NCwWiUimu0HNY,16953
583
586
  claude_mpm/services/core/interfaces/communication.py,sha256=evwtLbYCFa3Zb8kEfL10LOBVdwP4-n3a3wa7NqIHmKQ,8887
587
+ claude_mpm/services/core/interfaces/health.py,sha256=igPkOcpqIjhcabfkxXS3g5UHdsW3Zux2t7usKMNs41I,5143
584
588
  claude_mpm/services/core/interfaces/infrastructure.py,sha256=eLtr_dFhA3Ux3mPOV_4DbWhGjHpfpGnj6xOhfQcgZGk,10037
589
+ claude_mpm/services/core/interfaces/model.py,sha256=wExCaoiI1aQH0gzhXg0u7kf_jY84tWGG5v6yT7qyWTk,8422
590
+ claude_mpm/services/core/interfaces/process.py,sha256=oroWwXAUX9All2BOCX2K2tw24CwtjYA3BgPGVKE6vRA,10676
585
591
  claude_mpm/services/core/interfaces/project.py,sha256=O2kAjeuSTInUZ0LrZ6ElxRn3QbXlWseSx8T1ybhg99o,4168
592
+ claude_mpm/services/core/interfaces/restart.py,sha256=O9f5aAwK-H3vBmu6PmhD1TllwJCVauAc_gBB9uIIvWE,9120
586
593
  claude_mpm/services/core/interfaces/service.py,sha256=hNfHXe45LcPCp_dToOmZCfnUZBF5axMf_TdxqCSm2-I,11536
587
- claude_mpm/services/core/models/__init__.py,sha256=ZukIO02FFkkCpJPp-D2GWxCrshYzEPpFHh1WvTAbibI,1242
594
+ claude_mpm/services/core/interfaces/stability.py,sha256=Ppvwj3dlZdrBeVRBkeAffHV3nDOF1psgf9-8X_n4Ezg,8075
595
+ claude_mpm/services/core/models/__init__.py,sha256=OViDQwvlVwvyeCyGXc1bBfx1xEKPLubBl2t3b1nliCs,1973
588
596
  claude_mpm/services/core/models/agent_config.py,sha256=ygu0d7bDunUrmJRLO4lSXtxAY2ju1wrmP0buRzBVFkQ,14178
597
+ claude_mpm/services/core/models/health.py,sha256=5OlWE5kG3PVhkkv-FPLnyXgFdoemE1o96kwCAjNaAiI,5851
598
+ claude_mpm/services/core/models/process.py,sha256=jvEVkw3nnI4NaqAXVtgTh4B5LWk0zSVKxX6cJERQBCA,7855
599
+ claude_mpm/services/core/models/restart.py,sha256=-fSa5LIhnkCKGsPIttT2tB3Gv_n9giwVz_FY-vJxYrE,10032
600
+ claude_mpm/services/core/models/stability.py,sha256=CFCEXY3VkZNTdvYHinLgQTSJa7kz2apZE-J9IPykqLU,8615
589
601
  claude_mpm/services/core/models/toolchain.py,sha256=wkEnZgF944wq1SMqqmQVa91TtSKeFiZgO_Lg1wrO7KM,12167
590
602
  claude_mpm/services/diagnostics/__init__.py,sha256=WTRucANR9EwNi53rotjkeE4k75s18RjHJ8s1BfBj7ic,614
591
603
  claude_mpm/services/diagnostics/diagnostic_runner.py,sha256=PJje2C3_20JAeDBf2LpZ_rfi3rwSWk73EXJmZEkDcvs,9470
@@ -652,6 +664,21 @@ claude_mpm/services/infrastructure/monitoring/network.py,sha256=L874kGjryP_R8tDw
652
664
  claude_mpm/services/infrastructure/monitoring/process.py,sha256=_gh124mIemvHZE2wV1VWuMf-u7qI3VpXAUSSmuCOIJY,11054
653
665
  claude_mpm/services/infrastructure/monitoring/resources.py,sha256=7Mt9zvNAYGf7OTLBUFpGoDQncCuTYkpODRKV42T6wyI,7665
654
666
  claude_mpm/services/infrastructure/monitoring/service.py,sha256=guYB6rJtU18T2kPhZbKKg85l96lm2f7XVtPnBt1O3So,12613
667
+ claude_mpm/services/local_ops/__init__.py,sha256=gxVh8SifrYKgvrcY0Xbj08rrUFRRu8FrNUkCSry1084,4969
668
+ claude_mpm/services/local_ops/crash_detector.py,sha256=bc78Kx78hgqEl7nM-_T_t77nd3AGb37IVBWvKEcyZbo,8813
669
+ claude_mpm/services/local_ops/health_manager.py,sha256=hKS8h30tJiiBfk-FbpOUjvKqxzb0GK9CisM2idEMopc,15226
670
+ claude_mpm/services/local_ops/log_monitor.py,sha256=dCUzEXf2yXcFjcqyS7oWtI6MLR9oj_j3Hibd6ZWe5RI,12861
671
+ claude_mpm/services/local_ops/memory_leak_detector.py,sha256=uZC9AxMCk9rvf2IoOV9hq9ds2sCxOnfiDpJI11-d25c,10118
672
+ claude_mpm/services/local_ops/process_manager.py,sha256=ZAzfQOatz4d05es9yM5GDxqCV7GebBKJeKxHjz3Sl0U,19614
673
+ claude_mpm/services/local_ops/resource_monitor.py,sha256=k_TU4wkOwmJMR0BLSqAOIwckGyw_Xm9P8QXOTRapBA8,11357
674
+ claude_mpm/services/local_ops/restart_manager.py,sha256=HkSXPltljkxSxp_5bns72mTtEn7h7cayKjJLJD5ZRI8,13861
675
+ claude_mpm/services/local_ops/restart_policy.py,sha256=0HknpxkQXnngONu8hYx7b2z0BTZgvh_QQvvgsLw70pU,13452
676
+ claude_mpm/services/local_ops/state_manager.py,sha256=uyurW2r94fc9hCeLyp9LHq68ARObPsj2wKJkAJstspo,11931
677
+ claude_mpm/services/local_ops/unified_manager.py,sha256=Y0jJn6cuBUBhNgf0ZsmZ1_VqRQgq10DqYe58-HoMKBU,21833
678
+ claude_mpm/services/local_ops/health_checks/__init__.py,sha256=y2y7Yu-wawPyG3WW62Xs26t7ICFFTO-RWE3NHu5S40A,894
679
+ claude_mpm/services/local_ops/health_checks/http_check.py,sha256=vVQAvrwycWDdFkk04IJUTZFf-OEDI_p9mTCX1sGOjRQ,8324
680
+ claude_mpm/services/local_ops/health_checks/process_check.py,sha256=bHF8pls4J6G5bYiQdeQbh5DhLlngl-Kl0ID5GEOkbdI,8776
681
+ claude_mpm/services/local_ops/health_checks/resource_check.py,sha256=uEBJX1H8muVDkg-heWdK9asAwZEYYAY6y-JE6yUyeDM,9210
655
682
  claude_mpm/services/mcp_gateway/__init__.py,sha256=4fiMsd7i2QzZpEXCUeo0Vk_CXRi35TE94gPvwyuz2es,5099
656
683
  claude_mpm/services/mcp_gateway/auto_configure.py,sha256=JNos01nGb2qXACXNHC-UkLccqQ-p8GFUElXqBLUQl7A,12163
657
684
  claude_mpm/services/mcp_gateway/main.py,sha256=1e_-NGwVNr8cFtwWC_2NhZS-EYwC--MSfiZTx15x3ao,19121
@@ -692,6 +719,11 @@ claude_mpm/services/memory/router.py,sha256=c92j-7SXF254gvW-DvQ8OzvWKLdhklDndikN
692
719
  claude_mpm/services/memory/cache/__init__.py,sha256=6M6-P8ParyxX8vOgp_IxHgLMvacrQHPnXeZIvwJKtw8,351
693
720
  claude_mpm/services/memory/cache/shared_prompt_cache.py,sha256=sFw-50bNS8_d5mNYQyemuDa9zf3DNlqdpMPscW33MxE,28781
694
721
  claude_mpm/services/memory/cache/simple_cache.py,sha256=rePUw7poI2CM6l9ZuVgBqtsIkQpa_s0ugjXR3Kbgujg,10249
722
+ claude_mpm/services/model/__init__.py,sha256=JOvhp9qHykYOp4LEKJJVkn5EGE6uREL983IgnWnzj2g,4453
723
+ claude_mpm/services/model/base_provider.py,sha256=f7XSEkzLHHlygal2mfUMV2WcIRT4Stl13dKM3onbChw,11325
724
+ claude_mpm/services/model/claude_provider.py,sha256=Ny6UPQ3ATFJ2goy8p9b81QfsQfpjM0WawcMveevwIGg,13407
725
+ claude_mpm/services/model/model_router.py,sha256=cTYTgVJRREsYheOp_KzcAnYpCFYR_8S_TyOhkQuStDQ,14371
726
+ claude_mpm/services/model/ollama_provider.py,sha256=4KhvzNZKV1Xj0qh45xh0oWGsApjLrGVxMhRVXJ8rQTY,14036
695
727
  claude_mpm/services/monitor/__init__.py,sha256=X7gxSLUm9Fg_zEsX6LtCHP2ipF0qj6Emkun20h2So7g,745
696
728
  claude_mpm/services/monitor/daemon.py,sha256=nfOYeAxQHtxlRYx8bv6S9g1P0ofUsfK8RnxJQ5i96FY,25934
697
729
  claude_mpm/services/monitor/daemon_manager.py,sha256=bsl-sc75ih5h6ZeCYLB07RQnADZdkauZ7WZ0cY0XQEY,34210
@@ -822,9 +854,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
822
854
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
823
855
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
824
856
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
825
- claude_mpm-4.13.2.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
826
- claude_mpm-4.13.2.dist-info/METADATA,sha256=OLh7_XuogI3lwSVJHN0KoFQXrMJWw667nFCJMuC2WUc,17967
827
- claude_mpm-4.13.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
828
- claude_mpm-4.13.2.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
829
- claude_mpm-4.13.2.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
830
- claude_mpm-4.13.2.dist-info/RECORD,,
857
+ claude_mpm-4.14.0.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
858
+ claude_mpm-4.14.0.dist-info/METADATA,sha256=L28lbbRPKyA6pa5TC_vZhqbq1Sn2fH2G-YtSjOGzepM,17967
859
+ claude_mpm-4.14.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
860
+ claude_mpm-4.14.0.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
861
+ claude_mpm-4.14.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
862
+ claude_mpm-4.14.0.dist-info/RECORD,,