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.
Files changed (53) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/templates/engineer.json +33 -11
  3. claude_mpm/cli/commands/agents.py +556 -1009
  4. claude_mpm/cli/commands/memory.py +248 -927
  5. claude_mpm/cli/commands/run.py +139 -484
  6. claude_mpm/cli/startup_logging.py +76 -0
  7. claude_mpm/core/agent_registry.py +6 -10
  8. claude_mpm/core/framework_loader.py +114 -595
  9. claude_mpm/core/logging_config.py +2 -4
  10. claude_mpm/hooks/claude_hooks/event_handlers.py +7 -117
  11. claude_mpm/hooks/claude_hooks/hook_handler.py +91 -755
  12. claude_mpm/hooks/claude_hooks/hook_handler_original.py +1040 -0
  13. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +347 -0
  14. claude_mpm/hooks/claude_hooks/services/__init__.py +13 -0
  15. claude_mpm/hooks/claude_hooks/services/connection_manager.py +190 -0
  16. claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
  17. claude_mpm/hooks/claude_hooks/services/state_manager.py +282 -0
  18. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
  19. claude_mpm/services/agents/deployment/agent_deployment.py +42 -454
  20. claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
  21. claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
  22. claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
  23. claude_mpm/services/agents/memory/agent_memory_manager.py +42 -508
  24. claude_mpm/services/agents/memory/memory_categorization_service.py +165 -0
  25. claude_mpm/services/agents/memory/memory_file_service.py +103 -0
  26. claude_mpm/services/agents/memory/memory_format_service.py +201 -0
  27. claude_mpm/services/agents/memory/memory_limits_service.py +99 -0
  28. claude_mpm/services/agents/registry/__init__.py +1 -1
  29. claude_mpm/services/cli/__init__.py +18 -0
  30. claude_mpm/services/cli/agent_cleanup_service.py +407 -0
  31. claude_mpm/services/cli/agent_dependency_service.py +395 -0
  32. claude_mpm/services/cli/agent_listing_service.py +463 -0
  33. claude_mpm/services/cli/agent_output_formatter.py +605 -0
  34. claude_mpm/services/cli/agent_validation_service.py +589 -0
  35. claude_mpm/services/cli/dashboard_launcher.py +424 -0
  36. claude_mpm/services/cli/memory_crud_service.py +617 -0
  37. claude_mpm/services/cli/memory_output_formatter.py +604 -0
  38. claude_mpm/services/cli/session_manager.py +513 -0
  39. claude_mpm/services/cli/socketio_manager.py +498 -0
  40. claude_mpm/services/cli/startup_checker.py +370 -0
  41. claude_mpm/services/core/cache_manager.py +311 -0
  42. claude_mpm/services/core/memory_manager.py +637 -0
  43. claude_mpm/services/core/path_resolver.py +498 -0
  44. claude_mpm/services/core/service_container.py +520 -0
  45. claude_mpm/services/core/service_interfaces.py +436 -0
  46. claude_mpm/services/diagnostics/checks/agent_check.py +65 -19
  47. {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/METADATA +1 -1
  48. {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/RECORD +52 -22
  49. claude_mpm/cli/commands/run_config_checker.py +0 -159
  50. {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/WHEEL +0 -0
  51. {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/entry_points.txt +0 -0
  52. {claude_mpm-4.1.2.dist-info → claude_mpm-4.1.3.dist-info}/licenses/LICENSE +0 -0
  53. {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
- from .unified_agent_registry import discover_agents as unified_discover_agents
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
- from .unified_agent_registry import get_core_agents as unified_get_core_agents
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