claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__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 (434) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +2 -2
  3. claude_mpm/__main__.py +3 -2
  4. claude_mpm/agents/__init__.py +85 -79
  5. claude_mpm/agents/agent_loader.py +464 -1003
  6. claude_mpm/agents/agent_loader_integration.py +45 -45
  7. claude_mpm/agents/agents_metadata.py +29 -30
  8. claude_mpm/agents/async_agent_loader.py +156 -138
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/base_agent_loader.py +179 -151
  11. claude_mpm/agents/frontmatter_validator.py +229 -130
  12. claude_mpm/agents/schema/agent_schema.json +1 -1
  13. claude_mpm/agents/system_agent_config.py +213 -147
  14. claude_mpm/agents/templates/__init__.py +13 -13
  15. claude_mpm/agents/templates/code_analyzer.json +2 -2
  16. claude_mpm/agents/templates/data_engineer.json +1 -1
  17. claude_mpm/agents/templates/documentation.json +23 -11
  18. claude_mpm/agents/templates/engineer.json +22 -6
  19. claude_mpm/agents/templates/memory_manager.json +1 -1
  20. claude_mpm/agents/templates/ops.json +2 -2
  21. claude_mpm/agents/templates/project_organizer.json +1 -1
  22. claude_mpm/agents/templates/qa.json +1 -1
  23. claude_mpm/agents/templates/refactoring_engineer.json +222 -0
  24. claude_mpm/agents/templates/research.json +20 -14
  25. claude_mpm/agents/templates/security.json +1 -1
  26. claude_mpm/agents/templates/ticketing.json +2 -2
  27. claude_mpm/agents/templates/version_control.json +1 -1
  28. claude_mpm/agents/templates/web_qa.json +3 -1
  29. claude_mpm/agents/templates/web_ui.json +2 -2
  30. claude_mpm/cli/__init__.py +79 -51
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +20 -20
  33. claude_mpm/cli/commands/agents.py +279 -247
  34. claude_mpm/cli/commands/aggregate.py +138 -157
  35. claude_mpm/cli/commands/cleanup.py +147 -147
  36. claude_mpm/cli/commands/config.py +93 -76
  37. claude_mpm/cli/commands/info.py +17 -16
  38. claude_mpm/cli/commands/mcp.py +140 -905
  39. claude_mpm/cli/commands/mcp_command_router.py +139 -0
  40. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  41. claude_mpm/cli/commands/mcp_install_commands.py +20 -0
  42. claude_mpm/cli/commands/mcp_server_commands.py +175 -0
  43. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  44. claude_mpm/cli/commands/memory.py +239 -203
  45. claude_mpm/cli/commands/monitor.py +330 -86
  46. claude_mpm/cli/commands/run.py +380 -429
  47. claude_mpm/cli/commands/run_config_checker.py +160 -0
  48. claude_mpm/cli/commands/socketio_monitor.py +235 -0
  49. claude_mpm/cli/commands/tickets.py +363 -220
  50. claude_mpm/cli/parser.py +24 -1156
  51. claude_mpm/cli/parsers/__init__.py +29 -0
  52. claude_mpm/cli/parsers/agents_parser.py +136 -0
  53. claude_mpm/cli/parsers/base_parser.py +331 -0
  54. claude_mpm/cli/parsers/config_parser.py +85 -0
  55. claude_mpm/cli/parsers/mcp_parser.py +152 -0
  56. claude_mpm/cli/parsers/memory_parser.py +138 -0
  57. claude_mpm/cli/parsers/monitor_parser.py +124 -0
  58. claude_mpm/cli/parsers/run_parser.py +147 -0
  59. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  60. claude_mpm/cli/ticket_cli.py +7 -3
  61. claude_mpm/cli/utils.py +55 -37
  62. claude_mpm/cli_module/__init__.py +6 -6
  63. claude_mpm/cli_module/args.py +188 -140
  64. claude_mpm/cli_module/commands.py +79 -70
  65. claude_mpm/cli_module/migration_example.py +38 -60
  66. claude_mpm/config/__init__.py +32 -25
  67. claude_mpm/config/agent_config.py +151 -119
  68. claude_mpm/config/experimental_features.py +71 -73
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +35 -18
  72. claude_mpm/core/__init__.py +9 -6
  73. claude_mpm/core/agent_name_normalizer.py +68 -71
  74. claude_mpm/core/agent_registry.py +372 -521
  75. claude_mpm/core/agent_session_manager.py +74 -63
  76. claude_mpm/core/base_service.py +116 -87
  77. claude_mpm/core/cache.py +119 -153
  78. claude_mpm/core/claude_runner.py +425 -1120
  79. claude_mpm/core/config.py +263 -168
  80. claude_mpm/core/config_aliases.py +69 -61
  81. claude_mpm/core/config_constants.py +292 -0
  82. claude_mpm/core/constants.py +57 -99
  83. claude_mpm/core/container.py +211 -178
  84. claude_mpm/core/exceptions.py +233 -89
  85. claude_mpm/core/factories.py +92 -54
  86. claude_mpm/core/framework_loader.py +378 -220
  87. claude_mpm/core/hook_manager.py +198 -83
  88. claude_mpm/core/hook_performance_config.py +136 -0
  89. claude_mpm/core/injectable_service.py +61 -55
  90. claude_mpm/core/interactive_session.py +165 -155
  91. claude_mpm/core/interfaces.py +221 -195
  92. claude_mpm/core/lazy.py +96 -96
  93. claude_mpm/core/logger.py +133 -107
  94. claude_mpm/core/logging_config.py +185 -157
  95. claude_mpm/core/minimal_framework_loader.py +20 -15
  96. claude_mpm/core/mixins.py +30 -29
  97. claude_mpm/core/oneshot_session.py +215 -181
  98. claude_mpm/core/optimized_agent_loader.py +134 -138
  99. claude_mpm/core/optimized_startup.py +159 -157
  100. claude_mpm/core/pm_hook_interceptor.py +85 -72
  101. claude_mpm/core/service_registry.py +103 -101
  102. claude_mpm/core/session_manager.py +97 -87
  103. claude_mpm/core/socketio_pool.py +212 -158
  104. claude_mpm/core/tool_access_control.py +58 -51
  105. claude_mpm/core/types.py +46 -24
  106. claude_mpm/core/typing_utils.py +166 -82
  107. claude_mpm/core/unified_agent_registry.py +721 -0
  108. claude_mpm/core/unified_config.py +550 -0
  109. claude_mpm/core/unified_paths.py +549 -0
  110. claude_mpm/dashboard/index.html +1 -1
  111. claude_mpm/dashboard/open_dashboard.py +51 -17
  112. claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
  113. claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
  114. claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
  115. claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
  116. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
  117. claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
  118. claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
  119. claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
  120. claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
  121. claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
  122. claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
  123. claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
  124. claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
  125. claude_mpm/dashboard/static/built/dashboard.js +2 -0
  126. claude_mpm/dashboard/static/built/socket-client.js +2 -0
  127. claude_mpm/dashboard/static/css/dashboard.css +27 -8
  128. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  129. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  130. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  131. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  132. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  133. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  134. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  135. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  136. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  137. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  138. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  139. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  140. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  141. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  142. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  143. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  144. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  145. claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
  146. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  147. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
  148. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  149. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  150. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  151. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  152. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  153. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  154. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  155. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  156. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  157. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  158. claude_mpm/dashboard/static/js/socket-client.js +133 -53
  159. claude_mpm/dashboard/templates/index.html +40 -50
  160. claude_mpm/experimental/cli_enhancements.py +60 -58
  161. claude_mpm/generators/__init__.py +1 -1
  162. claude_mpm/generators/agent_profile_generator.py +75 -65
  163. claude_mpm/hooks/__init__.py +1 -1
  164. claude_mpm/hooks/base_hook.py +33 -28
  165. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  166. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  167. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  168. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  169. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  170. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  171. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  172. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  173. claude_mpm/hooks/memory_integration_hook.py +140 -100
  174. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  175. claude_mpm/hooks/validation_hooks.py +57 -49
  176. claude_mpm/init.py +145 -121
  177. claude_mpm/models/__init__.py +9 -9
  178. claude_mpm/models/agent_definition.py +33 -23
  179. claude_mpm/models/agent_session.py +228 -200
  180. claude_mpm/scripts/__init__.py +1 -1
  181. claude_mpm/scripts/socketio_daemon.py +192 -75
  182. claude_mpm/scripts/socketio_server_manager.py +328 -0
  183. claude_mpm/scripts/start_activity_logging.py +25 -22
  184. claude_mpm/services/__init__.py +68 -43
  185. claude_mpm/services/agent_capabilities_service.py +271 -0
  186. claude_mpm/services/agents/__init__.py +23 -32
  187. claude_mpm/services/agents/deployment/__init__.py +3 -3
  188. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  189. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  190. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  191. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  192. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  193. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  194. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  195. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  196. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  197. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  198. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  199. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  200. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  201. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  202. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  203. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  204. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  205. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  206. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  207. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  208. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  209. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  210. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  211. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  212. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  213. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  214. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  215. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  216. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  217. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  218. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  219. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  220. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  221. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  222. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  223. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  224. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  225. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  226. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  227. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  228. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  229. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  230. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  231. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  232. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  233. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  234. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  235. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  236. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  237. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  238. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  239. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  240. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  241. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  242. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  243. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  244. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  245. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  246. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  247. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  248. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  249. claude_mpm/services/agents/loading/__init__.py +2 -2
  250. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  251. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  252. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  253. claude_mpm/services/agents/management/__init__.py +2 -2
  254. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  255. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  256. claude_mpm/services/agents/memory/__init__.py +9 -6
  257. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  258. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  259. claude_mpm/services/agents/memory/analyzer.py +430 -0
  260. claude_mpm/services/agents/memory/content_manager.py +376 -0
  261. claude_mpm/services/agents/memory/template_generator.py +468 -0
  262. claude_mpm/services/agents/registry/__init__.py +7 -10
  263. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  264. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  265. claude_mpm/services/async_session_logger.py +187 -153
  266. claude_mpm/services/claude_session_logger.py +87 -72
  267. claude_mpm/services/command_handler_service.py +217 -0
  268. claude_mpm/services/communication/__init__.py +3 -2
  269. claude_mpm/services/core/__init__.py +50 -97
  270. claude_mpm/services/core/base.py +60 -53
  271. claude_mpm/services/core/interfaces/__init__.py +188 -0
  272. claude_mpm/services/core/interfaces/agent.py +351 -0
  273. claude_mpm/services/core/interfaces/communication.py +343 -0
  274. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  275. claude_mpm/services/core/interfaces/service.py +434 -0
  276. claude_mpm/services/core/interfaces.py +19 -944
  277. claude_mpm/services/event_aggregator.py +208 -170
  278. claude_mpm/services/exceptions.py +387 -308
  279. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  280. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  281. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  282. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  283. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  284. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  285. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  286. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  287. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  288. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  289. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  290. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  291. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  292. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  293. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  294. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  295. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  296. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  297. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  298. claude_mpm/services/hook_service.py +106 -114
  299. claude_mpm/services/infrastructure/__init__.py +7 -5
  300. claude_mpm/services/infrastructure/context_preservation.py +233 -199
  301. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  302. claude_mpm/services/infrastructure/logging.py +83 -76
  303. claude_mpm/services/infrastructure/monitoring.py +547 -404
  304. claude_mpm/services/mcp_gateway/__init__.py +30 -13
  305. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  306. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  307. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  308. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  309. claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
  310. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  311. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  312. claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
  313. claude_mpm/services/mcp_gateway/main.py +287 -137
  314. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  315. claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
  316. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  317. claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
  318. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
  319. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  320. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  321. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  322. claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
  323. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  324. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  325. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  326. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  327. claude_mpm/services/memory/__init__.py +2 -2
  328. claude_mpm/services/memory/builder.py +451 -362
  329. claude_mpm/services/memory/cache/__init__.py +2 -2
  330. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  331. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  332. claude_mpm/services/memory/indexed_memory.py +195 -193
  333. claude_mpm/services/memory/optimizer.py +267 -234
  334. claude_mpm/services/memory/router.py +571 -263
  335. claude_mpm/services/memory_hook_service.py +237 -0
  336. claude_mpm/services/port_manager.py +575 -0
  337. claude_mpm/services/project/__init__.py +3 -3
  338. claude_mpm/services/project/analyzer.py +451 -305
  339. claude_mpm/services/project/registry.py +262 -240
  340. claude_mpm/services/recovery_manager.py +287 -231
  341. claude_mpm/services/response_tracker.py +87 -67
  342. claude_mpm/services/runner_configuration_service.py +587 -0
  343. claude_mpm/services/session_management_service.py +304 -0
  344. claude_mpm/services/socketio/__init__.py +4 -4
  345. claude_mpm/services/socketio/client_proxy.py +174 -0
  346. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  347. claude_mpm/services/socketio/handlers/base.py +44 -30
  348. claude_mpm/services/socketio/handlers/connection.py +166 -64
  349. claude_mpm/services/socketio/handlers/file.py +123 -108
  350. claude_mpm/services/socketio/handlers/git.py +607 -373
  351. claude_mpm/services/socketio/handlers/hook.py +185 -0
  352. claude_mpm/services/socketio/handlers/memory.py +4 -4
  353. claude_mpm/services/socketio/handlers/project.py +4 -4
  354. claude_mpm/services/socketio/handlers/registry.py +53 -38
  355. claude_mpm/services/socketio/server/__init__.py +18 -0
  356. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  357. claude_mpm/services/socketio/server/core.py +399 -0
  358. claude_mpm/services/socketio/server/main.py +323 -0
  359. claude_mpm/services/socketio_client_manager.py +160 -133
  360. claude_mpm/services/socketio_server.py +36 -1885
  361. claude_mpm/services/subprocess_launcher_service.py +316 -0
  362. claude_mpm/services/system_instructions_service.py +258 -0
  363. claude_mpm/services/ticket_manager.py +19 -533
  364. claude_mpm/services/utility_service.py +285 -0
  365. claude_mpm/services/version_control/__init__.py +18 -21
  366. claude_mpm/services/version_control/branch_strategy.py +20 -10
  367. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  368. claude_mpm/services/version_control/git_operations.py +52 -21
  369. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  370. claude_mpm/services/version_control/version_parser.py +145 -125
  371. claude_mpm/services/version_service.py +270 -0
  372. claude_mpm/storage/__init__.py +2 -2
  373. claude_mpm/storage/state_storage.py +177 -181
  374. claude_mpm/ticket_wrapper.py +2 -2
  375. claude_mpm/utils/__init__.py +2 -2
  376. claude_mpm/utils/agent_dependency_loader.py +453 -243
  377. claude_mpm/utils/config_manager.py +157 -118
  378. claude_mpm/utils/console.py +1 -1
  379. claude_mpm/utils/dependency_cache.py +102 -107
  380. claude_mpm/utils/dependency_manager.py +52 -47
  381. claude_mpm/utils/dependency_strategies.py +131 -96
  382. claude_mpm/utils/environment_context.py +110 -102
  383. claude_mpm/utils/error_handler.py +75 -55
  384. claude_mpm/utils/file_utils.py +80 -67
  385. claude_mpm/utils/framework_detection.py +12 -11
  386. claude_mpm/utils/import_migration_example.py +12 -60
  387. claude_mpm/utils/imports.py +48 -45
  388. claude_mpm/utils/path_operations.py +100 -93
  389. claude_mpm/utils/robust_installer.py +172 -164
  390. claude_mpm/utils/session_logging.py +30 -23
  391. claude_mpm/utils/subprocess_utils.py +99 -61
  392. claude_mpm/validation/__init__.py +1 -1
  393. claude_mpm/validation/agent_validator.py +151 -111
  394. claude_mpm/validation/frontmatter_validator.py +92 -71
  395. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
  396. claude_mpm-4.0.4.dist-info/RECORD +417 -0
  397. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
  398. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
  399. claude_mpm/cli/commands/run_guarded.py +0 -511
  400. claude_mpm/config/memory_guardian_config.py +0 -325
  401. claude_mpm/config/memory_guardian_yaml.py +0 -335
  402. claude_mpm/core/config_paths.py +0 -150
  403. claude_mpm/core/memory_aware_runner.py +0 -353
  404. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  405. claude_mpm/deployment_paths.py +0 -261
  406. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  407. claude_mpm/models/state_models.py +0 -433
  408. claude_mpm/services/agent/__init__.py +0 -24
  409. claude_mpm/services/agent/deployment.py +0 -2548
  410. claude_mpm/services/agent/management.py +0 -598
  411. claude_mpm/services/agent/registry.py +0 -813
  412. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  413. claude_mpm/services/communication/socketio.py +0 -1935
  414. claude_mpm/services/communication/websocket.py +0 -479
  415. claude_mpm/services/framework_claude_md_generator.py +0 -624
  416. claude_mpm/services/health_monitor.py +0 -893
  417. claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
  418. claude_mpm/services/infrastructure/health_monitor.py +0 -775
  419. claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
  420. claude_mpm/services/infrastructure/memory_guardian.py +0 -944
  421. claude_mpm/services/infrastructure/restart_protection.py +0 -642
  422. claude_mpm/services/infrastructure/state_manager.py +0 -774
  423. claude_mpm/services/mcp_gateway/manager.py +0 -334
  424. claude_mpm/services/optimized_hook_service.py +0 -542
  425. claude_mpm/services/project_analyzer.py +0 -864
  426. claude_mpm/services/project_registry.py +0 -608
  427. claude_mpm/services/standalone_socketio_server.py +0 -1300
  428. claude_mpm/services/ticket_manager_di.py +0 -318
  429. claude_mpm/services/ticketing_service_original.py +0 -510
  430. claude_mpm/utils/paths.py +0 -395
  431. claude_mpm/utils/platform_memory.py +0 -524
  432. claude_mpm-3.9.11.dist-info/RECORD +0 -306
  433. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
  434. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/top_level.txt +0 -0
@@ -1,454 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Optimized Claude Code hook handler with fixed memory management.
3
-
4
- MEMORY LEAK FIXES:
5
- 1. Use singleton pattern for ClaudeHookHandler to prevent multiple instances
6
- 2. Proper cleanup of Socket.IO connections with connection pooling
7
- 3. Bounded dictionaries with automatic cleanup of old entries
8
- 4. Improved git branch cache with proper expiration
9
- 5. Better resource management and connection reuse
10
-
11
- WHY these fixes:
12
- - Singleton pattern ensures only one handler instance exists
13
- - Connection pooling prevents creating new connections for each event
14
- - Bounded dictionaries prevent unbounded memory growth
15
- - Regular cleanup prevents accumulation of stale data
16
- """
17
-
18
- import json
19
- import sys
20
- import os
21
- import subprocess
22
- from datetime import datetime, timedelta
23
- import time
24
- import asyncio
25
- from pathlib import Path
26
- from collections import deque
27
- import weakref
28
- import gc
29
-
30
- # Import constants for configuration
31
- try:
32
- from claude_mpm.core.constants import (
33
- NetworkConfig,
34
- TimeoutConfig,
35
- RetryConfig
36
- )
37
- except ImportError:
38
- # Fallback values if constants module not available
39
- class NetworkConfig:
40
- SOCKETIO_PORT_RANGE = (8080, 8099)
41
- RECONNECTION_DELAY = 0.5
42
- SOCKET_WAIT_TIMEOUT = 1.0
43
- class TimeoutConfig:
44
- QUICK_TIMEOUT = 2.0
45
- QUEUE_GET_TIMEOUT = 1.0
46
- class RetryConfig:
47
- MAX_RETRIES = 3
48
- INITIAL_RETRY_DELAY = 0.1
49
-
50
- # Debug mode is enabled by default for better visibility into hook processing
51
- DEBUG = os.environ.get('CLAUDE_MPM_HOOK_DEBUG', 'true').lower() != 'false'
52
-
53
- # Socket.IO import
54
- try:
55
- import socketio
56
- SOCKETIO_AVAILABLE = True
57
- except ImportError:
58
- SOCKETIO_AVAILABLE = False
59
- socketio = None
60
-
61
- # Memory hooks and response tracking imports (simplified)
62
- MEMORY_HOOKS_AVAILABLE = False
63
- RESPONSE_TRACKING_AVAILABLE = False
64
-
65
- # Maximum size for tracking dictionaries to prevent unbounded growth
66
- MAX_DELEGATION_TRACKING = 100
67
- MAX_PROMPT_TRACKING = 50
68
- MAX_CACHE_AGE_SECONDS = 300 # 5 minutes
69
- CLEANUP_INTERVAL_EVENTS = 100 # Clean up every 100 events
70
-
71
-
72
- class SocketIOConnectionPool:
73
- """Connection pool for Socket.IO clients to prevent connection leaks.
74
-
75
- WHY: Reuses connections instead of creating new ones for each event,
76
- preventing the accumulation of zombie connections over time.
77
- """
78
-
79
- def __init__(self, max_connections=3):
80
- self.max_connections = max_connections
81
- self.connections = []
82
- self.current_index = 0
83
- self.last_cleanup = time.time()
84
-
85
- def get_connection(self, port):
86
- """Get or create a connection to the specified port."""
87
- # Clean up dead connections periodically
88
- if time.time() - self.last_cleanup > 60: # Every minute
89
- self._cleanup_dead_connections()
90
- self.last_cleanup = time.time()
91
-
92
- # Look for existing connection to this port
93
- for conn in self.connections:
94
- if conn.get('port') == port and conn.get('client'):
95
- client = conn['client']
96
- if self._is_connection_alive(client):
97
- return client
98
- else:
99
- # Remove dead connection
100
- self.connections.remove(conn)
101
-
102
- # Create new connection if under limit
103
- if len(self.connections) < self.max_connections:
104
- client = self._create_connection(port)
105
- if client:
106
- self.connections.append({
107
- 'port': port,
108
- 'client': client,
109
- 'created': time.time()
110
- })
111
- return client
112
-
113
- # Reuse oldest connection if at limit
114
- if self.connections:
115
- oldest = min(self.connections, key=lambda x: x['created'])
116
- self._close_connection(oldest['client'])
117
- oldest['client'] = self._create_connection(port)
118
- oldest['port'] = port
119
- oldest['created'] = time.time()
120
- return oldest['client']
121
-
122
- return None
123
-
124
- def _create_connection(self, port):
125
- """Create a new Socket.IO connection."""
126
- if not SOCKETIO_AVAILABLE:
127
- return None
128
-
129
- try:
130
- client = socketio.Client(
131
- reconnection=False, # Disable auto-reconnect to prevent zombies
132
- logger=False,
133
- engineio_logger=False
134
- )
135
- client.connect(f'http://localhost:{port}',
136
- wait=True,
137
- wait_timeout=NetworkConfig.SOCKET_WAIT_TIMEOUT)
138
- if client.connected:
139
- return client
140
- except Exception:
141
- pass
142
- return None
143
-
144
- def _is_connection_alive(self, client):
145
- """Check if a connection is still alive."""
146
- try:
147
- return client and client.connected
148
- except:
149
- return False
150
-
151
- def _close_connection(self, client):
152
- """Safely close a connection."""
153
- try:
154
- if client:
155
- client.disconnect()
156
- except:
157
- pass
158
-
159
- def _cleanup_dead_connections(self):
160
- """Remove dead connections from the pool."""
161
- self.connections = [
162
- conn for conn in self.connections
163
- if self._is_connection_alive(conn.get('client'))
164
- ]
165
-
166
- def close_all(self):
167
- """Close all connections in the pool."""
168
- for conn in self.connections:
169
- self._close_connection(conn.get('client'))
170
- self.connections.clear()
171
-
172
-
173
- class BoundedDict(dict):
174
- """Dictionary with maximum size that removes oldest entries.
175
-
176
- WHY: Prevents unbounded memory growth by automatically removing
177
- old entries when the size limit is reached.
178
- """
179
-
180
- def __init__(self, max_size=100):
181
- super().__init__()
182
- self.max_size = max_size
183
- self.access_times = {}
184
-
185
- def __setitem__(self, key, value):
186
- # Remove oldest entries if at capacity
187
- if len(self) >= self.max_size and key not in self:
188
- # Find and remove the oldest entry
189
- if self.access_times:
190
- oldest_key = min(self.access_times, key=self.access_times.get)
191
- del self[oldest_key]
192
- del self.access_times[oldest_key]
193
-
194
- super().__setitem__(key, value)
195
- self.access_times[key] = time.time()
196
-
197
- def __delitem__(self, key):
198
- super().__delitem__(key)
199
- self.access_times.pop(key, None)
200
-
201
- def cleanup_old_entries(self, max_age_seconds=300):
202
- """Remove entries older than specified age."""
203
- current_time = time.time()
204
- keys_to_remove = [
205
- key for key, access_time in self.access_times.items()
206
- if current_time - access_time > max_age_seconds
207
- ]
208
- for key in keys_to_remove:
209
- del self[key]
210
-
211
-
212
- class ClaudeHookHandler:
213
- """Optimized hook handler with proper memory management.
214
-
215
- FIXES:
216
- - Uses connection pooling for Socket.IO clients
217
- - Bounded dictionaries prevent unbounded growth
218
- - Regular cleanup of old entries
219
- - Proper cache expiration
220
- """
221
-
222
- # Class-level singleton instance
223
- _instance = None
224
- _instance_lock = None
225
-
226
- def __new__(cls):
227
- """Implement singleton pattern to prevent multiple instances."""
228
- if cls._instance is None:
229
- cls._instance = super().__new__(cls)
230
- cls._instance._initialized = False
231
- return cls._instance
232
-
233
- def __init__(self):
234
- # Only initialize once
235
- if self._initialized:
236
- return
237
- self._initialized = True
238
-
239
- # Socket.IO connection pool
240
- self.connection_pool = SocketIOConnectionPool(max_connections=3)
241
-
242
- # Use bounded dictionaries to prevent unbounded memory growth
243
- self.active_delegations = BoundedDict(MAX_DELEGATION_TRACKING)
244
- self.delegation_requests = BoundedDict(MAX_DELEGATION_TRACKING)
245
- self.pending_prompts = BoundedDict(MAX_PROMPT_TRACKING)
246
-
247
- # Limited delegation history
248
- self.delegation_history = deque(maxlen=100)
249
-
250
- # Git branch cache with expiration
251
- self._git_branch_cache = {}
252
- self._git_branch_cache_time = {}
253
-
254
- # Track events processed for periodic cleanup
255
- self.events_processed = 0
256
-
257
- # Initialize other components (simplified for brevity)
258
- self.memory_hooks_initialized = False
259
- self.pre_delegation_hook = None
260
- self.post_delegation_hook = None
261
- self.response_tracker = None
262
- self.response_tracking_enabled = False
263
- self.track_all_interactions = False
264
-
265
- if DEBUG:
266
- print(f"✅ ClaudeHookHandler singleton initialized (pid: {os.getpid()})", file=sys.stderr)
267
-
268
- def _periodic_cleanup(self):
269
- """Perform periodic cleanup of old data."""
270
- self.events_processed += 1
271
-
272
- if self.events_processed % CLEANUP_INTERVAL_EVENTS == 0:
273
- # Clean up old entries in bounded dictionaries
274
- self.active_delegations.cleanup_old_entries(MAX_CACHE_AGE_SECONDS)
275
- self.delegation_requests.cleanup_old_entries(MAX_CACHE_AGE_SECONDS)
276
- self.pending_prompts.cleanup_old_entries(MAX_CACHE_AGE_SECONDS)
277
-
278
- # Clean up git branch cache
279
- current_time = time.time()
280
- expired_keys = [
281
- key for key, cache_time in self._git_branch_cache_time.items()
282
- if current_time - cache_time > MAX_CACHE_AGE_SECONDS
283
- ]
284
- for key in expired_keys:
285
- self._git_branch_cache.pop(key, None)
286
- self._git_branch_cache_time.pop(key, None)
287
-
288
- # Force garbage collection periodically
289
- if self.events_processed % (CLEANUP_INTERVAL_EVENTS * 10) == 0:
290
- gc.collect()
291
- if DEBUG:
292
- print(f"🧹 Performed cleanup after {self.events_processed} events", file=sys.stderr)
293
-
294
- def _track_delegation(self, session_id: str, agent_type: str, request_data: dict = None):
295
- """Track a new agent delegation with automatic cleanup."""
296
- if session_id and agent_type and agent_type != 'unknown':
297
- self.active_delegations[session_id] = agent_type
298
- key = f"{session_id}:{datetime.now().timestamp()}"
299
- self.delegation_history.append((key, agent_type))
300
-
301
- if request_data:
302
- self.delegation_requests[session_id] = {
303
- 'agent_type': agent_type,
304
- 'request': request_data,
305
- 'timestamp': datetime.now().isoformat()
306
- }
307
-
308
- def _get_delegation_agent_type(self, session_id: str) -> str:
309
- """Get the agent type for a session's active delegation."""
310
- if session_id and session_id in self.active_delegations:
311
- return self.active_delegations[session_id]
312
-
313
- # Check recent history
314
- if session_id:
315
- for key, agent_type in reversed(self.delegation_history):
316
- if key.startswith(session_id):
317
- return agent_type
318
-
319
- return 'unknown'
320
-
321
- def _get_git_branch(self, working_dir: str = None) -> str:
322
- """Get git branch with proper caching and expiration."""
323
- if not working_dir:
324
- working_dir = os.getcwd()
325
-
326
- cache_key = working_dir
327
- current_time = time.time()
328
-
329
- # Check cache with expiration
330
- if (cache_key in self._git_branch_cache and
331
- cache_key in self._git_branch_cache_time and
332
- current_time - self._git_branch_cache_time[cache_key] < 30):
333
- return self._git_branch_cache[cache_key]
334
-
335
- # Get git branch
336
- try:
337
- original_cwd = os.getcwd()
338
- os.chdir(working_dir)
339
-
340
- result = subprocess.run(
341
- ['git', 'branch', '--show-current'],
342
- capture_output=True,
343
- text=True,
344
- timeout=TimeoutConfig.QUICK_TIMEOUT
345
- )
346
-
347
- os.chdir(original_cwd)
348
-
349
- if result.returncode == 0 and result.stdout.strip():
350
- branch = result.stdout.strip()
351
- self._git_branch_cache[cache_key] = branch
352
- self._git_branch_cache_time[cache_key] = current_time
353
- return branch
354
- except:
355
- pass
356
-
357
- self._git_branch_cache[cache_key] = 'Unknown'
358
- self._git_branch_cache_time[cache_key] = current_time
359
- return 'Unknown'
360
-
361
- def _emit_socketio_event(self, namespace: str, event: str, data: dict):
362
- """Emit Socket.IO event using connection pool."""
363
- port = int(os.environ.get('CLAUDE_MPM_SOCKETIO_PORT', '8765'))
364
- client = self.connection_pool.get_connection(port)
365
-
366
- if not client:
367
- return
368
-
369
- try:
370
- claude_event_data = {
371
- 'type': f'hook.{event}',
372
- 'timestamp': datetime.now().isoformat(),
373
- 'data': data
374
- }
375
- client.emit('claude_event', claude_event_data)
376
- except Exception as e:
377
- if DEBUG:
378
- print(f"❌ Socket.IO emit failed: {e}", file=sys.stderr)
379
-
380
- def handle(self):
381
- """Process hook event with minimal overhead."""
382
- try:
383
- # Perform periodic cleanup
384
- self._periodic_cleanup()
385
-
386
- # Read and parse event
387
- event = self._read_hook_event()
388
- if not event:
389
- self._continue_execution()
390
- return
391
-
392
- # Route event to appropriate handler
393
- self._route_event(event)
394
-
395
- # Always continue execution
396
- self._continue_execution()
397
-
398
- except:
399
- # Fail fast and silent
400
- self._continue_execution()
401
-
402
- def _read_hook_event(self) -> dict:
403
- """Read and parse hook event from stdin."""
404
- try:
405
- event_data = sys.stdin.read()
406
- return json.loads(event_data)
407
- except:
408
- return None
409
-
410
- def _route_event(self, event: dict) -> None:
411
- """Route event to appropriate handler based on type."""
412
- hook_type = event.get('hook_event_name', 'unknown')
413
-
414
- # Simplified routing (implement actual handlers as needed)
415
- if DEBUG:
416
- print(f"📥 Processing {hook_type} event", file=sys.stderr)
417
-
418
- def _continue_execution(self) -> None:
419
- """Send continue action to Claude."""
420
- print(json.dumps({"action": "continue"}))
421
-
422
- def __del__(self):
423
- """Cleanup when handler is destroyed."""
424
- if hasattr(self, 'connection_pool'):
425
- self.connection_pool.close_all()
426
-
427
-
428
- # Global singleton instance
429
- _handler_instance = None
430
-
431
-
432
- def get_handler():
433
- """Get the singleton handler instance."""
434
- global _handler_instance
435
- if _handler_instance is None:
436
- _handler_instance = ClaudeHookHandler()
437
- return _handler_instance
438
-
439
-
440
- def main():
441
- """Entry point with proper singleton usage."""
442
- try:
443
- handler = get_handler()
444
- handler.handle()
445
- except Exception as e:
446
- # Always output continue action to not block Claude
447
- print(json.dumps({"action": "continue"}))
448
- if DEBUG:
449
- print(f"Hook handler error: {e}", file=sys.stderr)
450
- sys.exit(0)
451
-
452
-
453
- if __name__ == "__main__":
454
- main()