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,150 +0,0 @@
1
- """
2
- Centralized configuration paths for claude-mpm.
3
-
4
- This module provides a single source of truth for all configuration-related paths
5
- throughout the codebase. All modules should import and use these constants
6
- instead of hardcoding directory names.
7
- """
8
-
9
- from enum import Enum
10
- from pathlib import Path
11
- from typing import Optional
12
-
13
-
14
- class ConfigDirName(Enum):
15
- """Enum for configuration directory names to ensure type safety."""
16
- CLAUDE_MPM = ".claude-mpm"
17
-
18
-
19
- # Core configuration directory name - MUST be consistent everywhere
20
- CONFIG_DIR_NAME = ConfigDirName.CLAUDE_MPM.value
21
-
22
- # Legacy name that should NOT be used (kept for reference during migration)
23
- _LEGACY_CONFIG_DIR_NAME = ".claude-pm" # DO NOT USE THIS
24
-
25
-
26
- class ConfigPaths:
27
- """Centralized configuration path constants."""
28
-
29
- # Base directory names
30
- CONFIG_DIR = ConfigDirName.CLAUDE_MPM.value
31
- AGENTS_DIR = "agents"
32
- BACKUPS_DIR = "backups"
33
- TRACKING_DIR = "agent_tracking"
34
- MEMORIES_DIR = "memories"
35
- RESPONSES_DIR = "responses"
36
-
37
- # Agent subdirectories
38
- AGENT_USER_AGENTS = "user-agents"
39
- AGENT_USER_DEFINED = "user-defined"
40
- AGENT_SYSTEM = "templates"
41
-
42
- # Configuration files
43
- CONFIG_FILE = "config.json"
44
- CONFIGURATION_YAML = "configuration.yaml"
45
- LIFECYCLE_RECORDS = "lifecycle_records.json"
46
- VERSION_FILE = "VERSION"
47
- INSTRUCTIONS_FILE = "INSTRUCTIONS.md"
48
-
49
- @classmethod
50
- def get_user_config_dir(cls) -> Path:
51
- """Get the user-level configuration directory."""
52
- return Path.home() / cls.CONFIG_DIR
53
-
54
- @classmethod
55
- def get_project_config_dir(cls, project_root: Optional[Path] = None) -> Path:
56
- """Get the project-level configuration directory."""
57
- root = project_root or Path.cwd()
58
- return root / cls.CONFIG_DIR
59
-
60
- @classmethod
61
- def get_framework_config_dir(cls, framework_root: Path) -> Path:
62
- """Get the framework-level configuration directory."""
63
- return framework_root / cls.CONFIG_DIR
64
-
65
- @classmethod
66
- def get_user_agents_dir(cls) -> Path:
67
- """Get the user-level agents directory."""
68
- return cls.get_user_config_dir() / cls.AGENTS_DIR
69
-
70
- @classmethod
71
- def get_project_agents_dir(cls, project_root: Optional[Path] = None) -> Path:
72
- """Get the project-level agents directory."""
73
- return cls.get_project_config_dir(project_root) / cls.AGENTS_DIR
74
-
75
- @classmethod
76
- def get_tracking_dir(cls) -> Path:
77
- """Get the agent tracking directory."""
78
- return cls.get_user_config_dir() / cls.TRACKING_DIR
79
-
80
- @classmethod
81
- def get_backups_dir(cls, base_dir: Optional[Path] = None) -> Path:
82
- """Get the backups directory."""
83
- if base_dir:
84
- return base_dir / cls.CONFIG_DIR / cls.BACKUPS_DIR
85
- return cls.get_user_config_dir() / cls.BACKUPS_DIR
86
-
87
- @classmethod
88
- def get_memories_dir(cls, base_dir: Optional[Path] = None) -> Path:
89
- """Get the memories directory."""
90
- if base_dir:
91
- return base_dir / cls.CONFIG_DIR / cls.MEMORIES_DIR
92
- return cls.get_project_config_dir() / cls.MEMORIES_DIR
93
-
94
- @classmethod
95
- def get_responses_dir(cls, base_dir: Optional[Path] = None) -> Path:
96
- """Get the responses directory."""
97
- if base_dir:
98
- return base_dir / cls.CONFIG_DIR / cls.RESPONSES_DIR
99
- return cls.get_project_config_dir() / cls.RESPONSES_DIR
100
-
101
- @classmethod
102
- def find_config_dir(cls, start_path: Optional[Path] = None) -> Optional[Path]:
103
- """
104
- Find the nearest configuration directory by walking up the directory tree.
105
-
106
- Args:
107
- start_path: Starting directory (defaults to current working directory)
108
-
109
- Returns:
110
- Path to the configuration directory if found, None otherwise
111
- """
112
- current = start_path or Path.cwd()
113
-
114
- # Check current directory and parents
115
- for path in [current] + list(current.parents):
116
- config_dir = path / cls.CONFIG_DIR
117
- if config_dir.exists():
118
- return config_dir
119
-
120
- return None
121
-
122
- @classmethod
123
- def validate_not_legacy(cls, path: Path) -> bool:
124
- """
125
- Check if a path contains the legacy configuration directory name.
126
-
127
- Args:
128
- path: Path to check
129
-
130
- Returns:
131
- True if path is valid (not legacy), False if it contains legacy name
132
- """
133
- path_str = str(path)
134
- return _LEGACY_CONFIG_DIR_NAME not in path_str
135
-
136
-
137
- # Export commonly used paths as module-level constants for convenience
138
- USER_CONFIG_DIR = ConfigPaths.get_user_config_dir()
139
- USER_AGENTS_DIR = ConfigPaths.get_user_agents_dir()
140
- USER_TRACKING_DIR = ConfigPaths.get_tracking_dir()
141
-
142
- # Export all public symbols
143
- __all__ = [
144
- "ConfigDirName",
145
- "ConfigPaths",
146
- "CONFIG_DIR_NAME",
147
- "USER_CONFIG_DIR",
148
- "USER_AGENTS_DIR",
149
- "USER_TRACKING_DIR",
150
- ]
@@ -1,353 +0,0 @@
1
- """Memory-aware Claude runner with automatic restart capabilities.
2
-
3
- This runner extends ClaudeRunner to add memory monitoring and automatic
4
- restart capabilities when memory thresholds are exceeded.
5
-
6
- Design Principles:
7
- - Seamless integration with existing ClaudeRunner
8
- - State preservation across restarts
9
- - Configurable memory thresholds and policies
10
- - Minimal overhead when monitoring is disabled
11
- """
12
-
13
- import asyncio
14
- import json
15
- import os
16
- import sys
17
- import time
18
- from pathlib import Path
19
- from typing import Optional, Dict, Any, List
20
- from datetime import datetime
21
-
22
- from claude_mpm.core.claude_runner import ClaudeRunner
23
- from claude_mpm.core.logging_config import get_logger
24
- from claude_mpm.services.infrastructure.memory_guardian import MemoryGuardian
25
- from claude_mpm.services.infrastructure.state_manager import StateManager
26
- from claude_mpm.config.memory_guardian_config import (
27
- MemoryGuardianConfig,
28
- MemoryThresholds,
29
- RestartPolicy,
30
- MonitoringConfig,
31
- get_default_config
32
- )
33
-
34
-
35
- class MemoryAwareClaudeRunner(ClaudeRunner):
36
- """Claude runner with memory monitoring and automatic restart capabilities.
37
-
38
- This class extends ClaudeRunner to add memory monitoring through the
39
- MemoryGuardian service. When memory thresholds are exceeded, it can
40
- automatically restart Claude Code while preserving conversation state.
41
-
42
- WHY: Large conversation histories in .claude.json can consume 2GB+ of memory,
43
- causing system instability. This runner monitors memory usage and performs
44
- controlled restarts with state preservation.
45
-
46
- DESIGN DECISION: We extend ClaudeRunner rather than wrap it to maintain
47
- full compatibility with existing code while adding new capabilities.
48
- """
49
-
50
- def __init__(
51
- self,
52
- enable_tickets: bool = True,
53
- log_level: str = "OFF",
54
- claude_args: Optional[list] = None,
55
- launch_method: str = "subprocess", # Default to subprocess for monitoring
56
- enable_websocket: bool = False,
57
- websocket_port: int = 8765,
58
- memory_config: Optional[MemoryGuardianConfig] = None,
59
- enable_monitoring: bool = True,
60
- state_dir: Optional[Path] = None
61
- ):
62
- """Initialize memory-aware Claude runner.
63
-
64
- Args:
65
- enable_tickets: Enable ticket extraction
66
- log_level: Logging level
67
- claude_args: Additional arguments for Claude
68
- launch_method: Launch method (subprocess required for monitoring)
69
- enable_websocket: Enable WebSocket server
70
- websocket_port: WebSocket server port
71
- memory_config: Memory guardian configuration
72
- enable_monitoring: Enable memory monitoring
73
- state_dir: Directory for state preservation
74
- """
75
- # Force subprocess mode if monitoring is enabled
76
- if enable_monitoring and launch_method == "exec":
77
- launch_method = "subprocess"
78
- get_logger(__name__).info(
79
- "Switching to subprocess launch method for memory monitoring"
80
- )
81
-
82
- # Initialize parent
83
- super().__init__(
84
- enable_tickets=enable_tickets,
85
- log_level=log_level,
86
- claude_args=claude_args,
87
- launch_method=launch_method,
88
- enable_websocket=enable_websocket,
89
- websocket_port=websocket_port
90
- )
91
-
92
- # Memory monitoring configuration
93
- self.enable_monitoring = enable_monitoring
94
- self.memory_config = memory_config or get_default_config()
95
- self.memory_config.enabled = enable_monitoring
96
-
97
- # State management
98
- self.state_dir = state_dir or Path.home() / ".claude-mpm" / "state"
99
- self.state_manager: Optional[StateManager] = None
100
- self.memory_guardian: Optional[MemoryGuardian] = None
101
-
102
- # Monitoring state
103
- self.monitoring_task: Optional[asyncio.Task] = None
104
- self.restart_count = 0
105
- self.max_restarts = 3 # Default max restarts
106
-
107
- self.logger.info(f"Memory-aware runner initialized with monitoring: {enable_monitoring}")
108
-
109
- def run_interactive_with_monitoring(
110
- self,
111
- initial_context: Optional[str] = None,
112
- memory_threshold: Optional[float] = None,
113
- check_interval: Optional[int] = None,
114
- max_restarts: Optional[int] = None,
115
- enable_state_preservation: bool = True
116
- ):
117
- """Run Claude in interactive mode with memory monitoring.
118
-
119
- This method wraps the standard interactive session with memory monitoring
120
- and automatic restart capabilities.
121
-
122
- Args:
123
- initial_context: Optional initial context
124
- memory_threshold: Override memory threshold in MB
125
- check_interval: Override check interval in seconds
126
- max_restarts: Maximum number of automatic restarts
127
- enable_state_preservation: Enable state preservation across restarts
128
- """
129
- if not self.enable_monitoring:
130
- # Fall back to standard interactive mode
131
- self.logger.info("Memory monitoring disabled, using standard interactive mode")
132
- return self.run_interactive(initial_context)
133
-
134
- # Update configuration with overrides
135
- if memory_threshold:
136
- self.memory_config.thresholds.critical = memory_threshold
137
- self.memory_config.thresholds.emergency = memory_threshold * 1.2
138
-
139
- if check_interval:
140
- self.memory_config.monitoring.normal_interval = check_interval
141
-
142
- if max_restarts is not None:
143
- self.max_restarts = max_restarts
144
- self.memory_config.restart_policy.max_attempts = max_restarts
145
-
146
- # Run async monitoring loop
147
- try:
148
- asyncio.run(self._run_with_monitoring_async(
149
- initial_context,
150
- enable_state_preservation
151
- ))
152
- except KeyboardInterrupt:
153
- self.logger.info("Interactive session interrupted by user")
154
- except Exception as e:
155
- self.logger.error(f"Error in monitored session: {e}")
156
- raise
157
-
158
- async def _run_with_monitoring_async(
159
- self,
160
- initial_context: Optional[str],
161
- enable_state_preservation: bool
162
- ):
163
- """Async implementation of monitored interactive session.
164
-
165
- This method sets up the memory monitoring infrastructure and manages
166
- the Claude subprocess lifecycle with automatic restarts.
167
- """
168
- try:
169
- # Initialize services
170
- await self._initialize_monitoring_services(enable_state_preservation)
171
-
172
- # Display monitoring information
173
- self._display_monitoring_info()
174
-
175
- # Start monitoring loop
176
- while self.restart_count <= self.max_restarts:
177
- try:
178
- # Run Claude subprocess
179
- await self._run_monitored_subprocess(initial_context)
180
-
181
- # If we exit normally, break the loop
182
- break
183
-
184
- except MemoryThresholdExceeded as e:
185
- self.logger.warning(f"Memory threshold exceeded: {e}")
186
-
187
- if self.restart_count >= self.max_restarts:
188
- self.logger.error("Maximum restart attempts reached")
189
- break
190
-
191
- # Perform controlled restart
192
- await self._perform_controlled_restart()
193
- self.restart_count += 1
194
-
195
- # Clear initial context after first run
196
- initial_context = None
197
-
198
- except Exception as e:
199
- self.logger.error(f"Unexpected error in monitored session: {e}")
200
- break
201
-
202
- finally:
203
- # Cleanup
204
- await self._cleanup_monitoring_services()
205
-
206
- async def _initialize_monitoring_services(self, enable_state_preservation: bool):
207
- """Initialize memory guardian and state manager services."""
208
- self.logger.info("Initializing monitoring services")
209
-
210
- # Initialize state manager if enabled
211
- if enable_state_preservation:
212
- self.state_manager = StateManager(self.state_dir)
213
- await self.state_manager.initialize()
214
- self.logger.info("State preservation enabled")
215
-
216
- # Initialize memory guardian
217
- self.memory_guardian = MemoryGuardian(self.memory_config)
218
- if self.state_manager:
219
- self.memory_guardian.set_state_manager(self.state_manager)
220
- await self.memory_guardian.initialize()
221
-
222
- self.logger.info("Monitoring services initialized")
223
-
224
- async def _cleanup_monitoring_services(self):
225
- """Cleanup monitoring services."""
226
- self.logger.info("Cleaning up monitoring services")
227
-
228
- if self.memory_guardian:
229
- await self.memory_guardian.shutdown()
230
-
231
- if self.state_manager:
232
- await self.state_manager.shutdown()
233
-
234
- async def _run_monitored_subprocess(self, initial_context: Optional[str]):
235
- """Run Claude subprocess with memory monitoring.
236
-
237
- This method launches Claude as a subprocess and monitors its memory usage,
238
- triggering restarts when thresholds are exceeded.
239
- """
240
- # Set up the process command
241
- cmd = self._build_claude_command(initial_context)
242
-
243
- # Configure memory guardian with our command
244
- self.memory_config.process_command = cmd
245
- self.memory_config.working_directory = os.getcwd()
246
-
247
- # Start the process through memory guardian
248
- success = await self.memory_guardian.start_process()
249
- if not success:
250
- raise RuntimeError("Failed to start Claude process")
251
-
252
- # Start memory monitoring
253
- self.memory_guardian.start_monitoring()
254
-
255
- # Wait for process to complete or be restarted
256
- while self.memory_guardian.process_state.value == "running":
257
- await asyncio.sleep(1)
258
-
259
- # Check for memory threshold exceeded
260
- if self.memory_guardian.memory_state.value in ["critical", "emergency"]:
261
- raise MemoryThresholdExceeded(
262
- f"Memory state: {self.memory_guardian.memory_state.value}, "
263
- f"Current: {self.memory_guardian.memory_stats.current_mb:.2f}MB"
264
- )
265
-
266
- async def _perform_controlled_restart(self):
267
- """Perform a controlled restart with state preservation."""
268
- self.logger.info(f"Performing controlled restart (attempt {self.restart_count + 1}/{self.max_restarts})")
269
-
270
- # Capture state before restart
271
- if self.state_manager:
272
- state = await self.state_manager.capture_state(
273
- restart_reason=f"Memory threshold exceeded (restart {self.restart_count + 1})"
274
- )
275
- if state:
276
- await self.state_manager.persist_state(state)
277
- self.logger.info("State captured and persisted")
278
-
279
- # Restart through memory guardian
280
- success = await self.memory_guardian.restart_process(
281
- reason=f"Memory threshold exceeded (automatic restart {self.restart_count + 1})"
282
- )
283
-
284
- if not success:
285
- raise RuntimeError("Failed to restart Claude process")
286
-
287
- # Restore state after restart
288
- if self.state_manager:
289
- restored = await self.state_manager.restore_state()
290
- if restored:
291
- self.logger.info("State restored successfully")
292
-
293
- def _build_claude_command(self, initial_context: Optional[str]) -> List[str]:
294
- """Build the Claude command line.
295
-
296
- Returns:
297
- List of command arguments
298
- """
299
- # Find Claude CLI executable
300
- claude_cli = "claude" # Assume it's in PATH
301
-
302
- # Build command
303
- cmd = [claude_cli]
304
-
305
- # Add context if provided
306
- if initial_context:
307
- # Save context to temp file
308
- import tempfile
309
- with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
310
- f.write(initial_context)
311
- context_file = f.name
312
-
313
- cmd.extend(['--context-file', context_file])
314
-
315
- # Add any additional Claude arguments
316
- if self.claude_args:
317
- cmd.extend(self.claude_args)
318
-
319
- return cmd
320
-
321
- def _display_monitoring_info(self):
322
- """Display memory monitoring configuration to user."""
323
- print("\n" + "="*60)
324
- print("🛡️ Memory Guardian Active")
325
- print("="*60)
326
- print(f"Memory Thresholds:")
327
- print(f" • Warning: {self.memory_config.thresholds.warning:,.0f} MB")
328
- print(f" • Critical: {self.memory_config.thresholds.critical:,.0f} MB")
329
- print(f" • Emergency: {self.memory_config.thresholds.emergency:,.0f} MB")
330
- print(f"Monitoring:")
331
- print(f" • Check Interval: {self.memory_config.monitoring.normal_interval} seconds")
332
- print(f" • Max Restarts: {self.max_restarts}")
333
- print(f" • State Preservation: {'Enabled' if self.state_manager else 'Disabled'}")
334
- print("="*60 + "\n")
335
-
336
- def get_monitoring_status(self) -> Dict[str, Any]:
337
- """Get current monitoring status.
338
-
339
- Returns:
340
- Dictionary containing monitoring status
341
- """
342
- if not self.memory_guardian:
343
- return {
344
- 'enabled': False,
345
- 'message': 'Memory monitoring not initialized'
346
- }
347
-
348
- return self.memory_guardian.get_status()
349
-
350
-
351
- class MemoryThresholdExceeded(Exception):
352
- """Exception raised when memory threshold is exceeded."""
353
- pass