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.
- claude_mpm/VERSION +1 -1
- claude_mpm/cli/__init__.py +10 -0
- claude_mpm/cli/commands/local_deploy.py +536 -0
- claude_mpm/cli/parsers/base_parser.py +7 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/core/interactive_session.py +3 -0
- claude_mpm/services/core/interfaces/__init__.py +74 -2
- claude_mpm/services/core/interfaces/health.py +172 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/models/__init__.py +35 -0
- claude_mpm/services/core/models/health.py +189 -0
- claude_mpm/services/core/models/process.py +258 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/local_ops/__init__.py +163 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +223 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +235 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +254 -0
- claude_mpm/services/local_ops/health_manager.py +430 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +371 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/METADATA +1 -1
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/RECORD +44 -12
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.14.0.dist-info}/licenses/LICENSE +0 -0
- {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,5 +1,5 @@
|
|
|
1
1
|
claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
|
|
2
|
-
claude_mpm/VERSION,sha256
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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/
|
|
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.
|
|
826
|
-
claude_mpm-4.
|
|
827
|
-
claude_mpm-4.
|
|
828
|
-
claude_mpm-4.
|
|
829
|
-
claude_mpm-4.
|
|
830
|
-
claude_mpm-4.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|