claude-mpm 4.1.2__py3-none-any.whl → 4.1.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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/templates/engineer.json +33 -11
- claude_mpm/cli/commands/agents.py +556 -1009
- claude_mpm/cli/commands/memory.py +248 -927
- claude_mpm/cli/commands/run.py +139 -484
- claude_mpm/cli/startup_logging.py +76 -0
- claude_mpm/core/agent_registry.py +6 -10
- claude_mpm/core/framework_loader.py +114 -595
- claude_mpm/core/logging_config.py +2 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +7 -117
- claude_mpm/hooks/claude_hooks/hook_handler.py +91 -755
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +1040 -0
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +347 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +13 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +190 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +282 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +42 -454
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +42 -508
- claude_mpm/services/agents/memory/memory_categorization_service.py +165 -0
- claude_mpm/services/agents/memory/memory_file_service.py +103 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +99 -0
- claude_mpm/services/agents/registry/__init__.py +1 -1
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +407 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +589 -0
- claude_mpm/services/cli/dashboard_launcher.py +424 -0
- claude_mpm/services/cli/memory_crud_service.py +617 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/session_manager.py +513 -0
- claude_mpm/services/cli/socketio_manager.py +498 -0
- claude_mpm/services/cli/startup_checker.py +370 -0
- claude_mpm/services/core/cache_manager.py +311 -0
- claude_mpm/services/core/memory_manager.py +637 -0
- claude_mpm/services/core/path_resolver.py +498 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +65 -19
- {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/METADATA +1 -1
- {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/RECORD +52 -22
- claude_mpm/cli/commands/run_config_checker.py +0 -159
- {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/top_level.txt +0 -0
|
@@ -22,9 +22,58 @@ from datetime import datetime
|
|
|
22
22
|
from pathlib import Path
|
|
23
23
|
from typing import Any, Dict, Optional
|
|
24
24
|
|
|
25
|
+
try:
|
|
26
|
+
import psutil
|
|
27
|
+
|
|
28
|
+
PSUTIL_AVAILABLE = True
|
|
29
|
+
except ImportError:
|
|
30
|
+
PSUTIL_AVAILABLE = False
|
|
31
|
+
|
|
25
32
|
from ..core.logger import get_logger
|
|
26
33
|
|
|
27
34
|
|
|
35
|
+
def log_memory_stats(logger=None, prefix="Memory Usage"):
|
|
36
|
+
"""
|
|
37
|
+
Log current memory statistics.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
logger: Logger to use (defaults to 'cli' logger)
|
|
41
|
+
prefix: Prefix for the log message
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
Dict with memory stats or None if psutil unavailable
|
|
45
|
+
"""
|
|
46
|
+
if not PSUTIL_AVAILABLE:
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
if logger is None:
|
|
50
|
+
logger = get_logger("cli")
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
process = psutil.Process()
|
|
54
|
+
memory_info = process.memory_info()
|
|
55
|
+
|
|
56
|
+
# Convert to MB for readability
|
|
57
|
+
rss_mb = memory_info.rss / (1024 * 1024)
|
|
58
|
+
vms_mb = memory_info.vms / (1024 * 1024)
|
|
59
|
+
|
|
60
|
+
# Get percentage of system memory if available
|
|
61
|
+
try:
|
|
62
|
+
memory_percent = process.memory_percent()
|
|
63
|
+
logger.info(
|
|
64
|
+
f"{prefix}: RSS={rss_mb:.1f}MB, VMS={vms_mb:.1f}MB, "
|
|
65
|
+
f"System={memory_percent:.1f}%"
|
|
66
|
+
)
|
|
67
|
+
return {"rss_mb": rss_mb, "vms_mb": vms_mb, "percent": memory_percent}
|
|
68
|
+
except:
|
|
69
|
+
logger.info(f"{prefix}: RSS={rss_mb:.1f}MB, VMS={vms_mb:.1f}MB")
|
|
70
|
+
return {"rss_mb": rss_mb, "vms_mb": vms_mb, "percent": None}
|
|
71
|
+
|
|
72
|
+
except Exception as e:
|
|
73
|
+
logger.debug(f"Failed to get memory info: {e}")
|
|
74
|
+
return None
|
|
75
|
+
|
|
76
|
+
|
|
28
77
|
class StartupStatusLogger:
|
|
29
78
|
"""Logs MCP server and monitor setup status during startup."""
|
|
30
79
|
|
|
@@ -90,6 +139,19 @@ class StartupStatusLogger:
|
|
|
90
139
|
except Exception as e:
|
|
91
140
|
self.logger.warning(f"MCP Server: Status check failed - {e}")
|
|
92
141
|
|
|
142
|
+
def log_memory_status(self) -> None:
|
|
143
|
+
"""
|
|
144
|
+
Log current process memory usage.
|
|
145
|
+
|
|
146
|
+
Logs both RSS (Resident Set Size) and VMS (Virtual Memory Size)
|
|
147
|
+
to help track memory consumption and potential leaks.
|
|
148
|
+
"""
|
|
149
|
+
stats = log_memory_stats(self.logger, "Memory Usage")
|
|
150
|
+
|
|
151
|
+
# Log warning if memory usage is high
|
|
152
|
+
if stats and stats.get("rss_mb", 0) > 500: # Warn if using more than 500MB
|
|
153
|
+
self.logger.warning(f"High memory usage detected: {stats['rss_mb']:.1f}MB")
|
|
154
|
+
|
|
93
155
|
def log_monitor_setup_status(
|
|
94
156
|
self, monitor_mode: bool = False, websocket_port: int = 8765
|
|
95
157
|
) -> None:
|
|
@@ -447,6 +509,17 @@ def setup_startup_logging(project_root: Optional[Path] = None) -> Path:
|
|
|
447
509
|
logger.info(f"CWD: {Path.cwd()}")
|
|
448
510
|
logger.info(f"Project root: {project_root}")
|
|
449
511
|
|
|
512
|
+
# Log initial memory usage
|
|
513
|
+
if PSUTIL_AVAILABLE:
|
|
514
|
+
try:
|
|
515
|
+
process = psutil.Process()
|
|
516
|
+
memory_info = process.memory_info()
|
|
517
|
+
rss_mb = memory_info.rss / (1024 * 1024)
|
|
518
|
+
vms_mb = memory_info.vms / (1024 * 1024)
|
|
519
|
+
logger.info(f"Initial Memory: RSS={rss_mb:.1f}MB, VMS={vms_mb:.1f}MB")
|
|
520
|
+
except Exception as e:
|
|
521
|
+
logger.debug(f"Failed to get initial memory info: {e}")
|
|
522
|
+
|
|
450
523
|
return log_file
|
|
451
524
|
|
|
452
525
|
|
|
@@ -558,6 +631,9 @@ def log_startup_status(monitor_mode: bool = False, websocket_port: int = 8765) -
|
|
|
558
631
|
try:
|
|
559
632
|
status_logger = StartupStatusLogger("cli")
|
|
560
633
|
|
|
634
|
+
# Log memory status at startup
|
|
635
|
+
status_logger.log_memory_status()
|
|
636
|
+
|
|
561
637
|
# Log MCP server status
|
|
562
638
|
status_logger.log_mcp_server_status()
|
|
563
639
|
|
|
@@ -19,22 +19,18 @@ from pathlib import Path
|
|
|
19
19
|
from typing import Any, Dict, List, Optional, Set
|
|
20
20
|
|
|
21
21
|
# Import from the unified agent registry system
|
|
22
|
-
from .unified_agent_registry import AgentMetadata as UnifiedAgentMetadata
|
|
23
22
|
from .unified_agent_registry import (
|
|
23
|
+
AgentMetadata as UnifiedAgentMetadata,
|
|
24
24
|
AgentTier,
|
|
25
25
|
AgentType,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
from .unified_agent_registry import get_agent as unified_get_agent
|
|
29
|
-
from .unified_agent_registry import (
|
|
26
|
+
discover_agents as unified_discover_agents,
|
|
27
|
+
get_agent as unified_get_agent,
|
|
30
28
|
get_agent_registry,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
from .unified_agent_registry import get_registry_stats as unified_get_registry_stats
|
|
34
|
-
from .unified_agent_registry import (
|
|
29
|
+
get_core_agents as unified_get_core_agents,
|
|
30
|
+
get_registry_stats as unified_get_registry_stats,
|
|
35
31
|
get_specialized_agents as unified_get_specialized_agents,
|
|
32
|
+
list_agents as unified_list_agents,
|
|
36
33
|
)
|
|
37
|
-
from .unified_agent_registry import list_agents as unified_list_agents
|
|
38
34
|
|
|
39
35
|
try:
|
|
40
36
|
from ..core.logger import get_logger
|