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
@@ -0,0 +1,587 @@
1
+ from pathlib import Path
2
+
3
+ """Runner configuration service for initializing and configuring ClaudeRunner.
4
+
5
+ This service handles:
6
+ 1. Service registration and dependency injection setup
7
+ 2. Configuration loading and validation
8
+ 3. Logger initialization (project and response loggers)
9
+ 4. Session management setup
10
+ 5. Hook service registration
11
+
12
+ Extracted from ClaudeRunner to follow Single Responsibility Principle.
13
+ """
14
+
15
+ import os
16
+ from typing import Any, Dict, List, Optional, Tuple
17
+
18
+ from claude_mpm.core.base_service import BaseService
19
+ from claude_mpm.core.config import Config
20
+ from claude_mpm.core.container import ServiceLifetime, get_container
21
+ from claude_mpm.core.logger import get_project_logger
22
+ from claude_mpm.core.logging_config import get_logger
23
+ from claude_mpm.services.core.interfaces import RunnerConfigurationInterface
24
+
25
+
26
+ class RunnerConfigurationService(BaseService, RunnerConfigurationInterface):
27
+ """Service for configuring and initializing ClaudeRunner components."""
28
+
29
+ def __init__(self):
30
+ """Initialize the runner configuration service."""
31
+ super().__init__(name="runner_configuration_service")
32
+
33
+ async def _initialize(self) -> None:
34
+ """Initialize the service. No special initialization needed."""
35
+ pass
36
+
37
+ async def _cleanup(self) -> None:
38
+ """Cleanup service resources. No cleanup needed."""
39
+ pass
40
+
41
+ # Implementation of abstract methods from RunnerConfigurationInterface
42
+
43
+ def initialize_runner(self, config: Dict[str, Any]) -> Dict[str, Any]:
44
+ """Initialize runner with configuration.
45
+
46
+ Args:
47
+ config: Configuration dictionary
48
+
49
+ Returns:
50
+ Dictionary with initialization results
51
+ """
52
+ # This method can delegate to the existing initialize_configuration method
53
+ return self.initialize_configuration(**config)
54
+
55
+ def register_services(self, service_container) -> None:
56
+ """Register services with the dependency injection container.
57
+
58
+ Args:
59
+ service_container: Service container for registration
60
+ """
61
+ # This method can delegate to existing service registration methods
62
+ # For now, this is a no-op as service registration is handled elsewhere
63
+ pass
64
+
65
+ def load_configuration(self, config_path: Optional[Path] = None) -> Dict[str, Any]:
66
+ """Load configuration from file or defaults.
67
+
68
+ Args:
69
+ config_path: Optional path to configuration file
70
+
71
+ Returns:
72
+ Loaded configuration dictionary
73
+ """
74
+ try:
75
+ if config_path:
76
+ # Load from specific path if provided
77
+ config = Config(config_path)
78
+ else:
79
+ # Load from default location
80
+ config = Config()
81
+
82
+ return {
83
+ "config": config,
84
+ "enable_tickets": True,
85
+ "log_level": "OFF",
86
+ "claude_args": [],
87
+ "launch_method": "exec",
88
+ "enable_websocket": False,
89
+ "websocket_port": 8765,
90
+ }
91
+ except Exception as e:
92
+ self.logger.error("Failed to load configuration", exc_info=True)
93
+ raise RuntimeError(f"Configuration loading failed: {e}") from e
94
+
95
+ def validate_configuration(self, config: Dict[str, Any]) -> Tuple[bool, List[str]]:
96
+ """Validate configuration structure and values.
97
+
98
+ Args:
99
+ config: Configuration to validate
100
+
101
+ Returns:
102
+ Tuple of (is_valid, list_of_errors)
103
+ """
104
+ errors = []
105
+
106
+ # Validate required keys
107
+ required_keys = ["enable_tickets", "log_level", "claude_args", "launch_method"]
108
+ for key in required_keys:
109
+ if key not in config:
110
+ errors.append(f"Missing required configuration key: {key}")
111
+
112
+ # Validate specific values
113
+ if "launch_method" in config and config["launch_method"] not in [
114
+ "exec",
115
+ "subprocess",
116
+ ]:
117
+ errors.append("launch_method must be 'exec' or 'subprocess'")
118
+
119
+ if "websocket_port" in config:
120
+ try:
121
+ port = int(config["websocket_port"])
122
+ if port < 1 or port > 65535:
123
+ errors.append("websocket_port must be between 1 and 65535")
124
+ except (ValueError, TypeError):
125
+ errors.append("websocket_port must be a valid integer")
126
+
127
+ return len(errors) == 0, errors
128
+
129
+ def setup_logging(self, config: Dict[str, Any]) -> None:
130
+ """Setup logging configuration.
131
+
132
+ Args:
133
+ config: Logging configuration
134
+ """
135
+ log_level = config.get("log_level", "OFF")
136
+ if log_level != "OFF":
137
+ try:
138
+ # Initialize project logger if needed
139
+ project_logger = self.initialize_project_logger(log_level)
140
+ if project_logger:
141
+ self.logger.info(
142
+ f"Project logging initialized with level: {log_level}"
143
+ )
144
+ except Exception as e:
145
+ self.logger.warning(f"Failed to setup logging: {e}")
146
+
147
+ def initialize_configuration(self, **kwargs) -> Dict[str, Any]:
148
+ """Initialize configuration and return configuration data.
149
+
150
+ Args:
151
+ **kwargs: Configuration parameters from ClaudeRunner constructor
152
+
153
+ Returns:
154
+ Dictionary containing initialized configuration data
155
+ """
156
+ config_data = {
157
+ "enable_tickets": kwargs.get("enable_tickets", True),
158
+ "log_level": kwargs.get("log_level", "OFF"),
159
+ "claude_args": kwargs.get("claude_args", []) or [],
160
+ "launch_method": kwargs.get("launch_method", "exec"),
161
+ "enable_websocket": kwargs.get("enable_websocket", False),
162
+ "websocket_port": kwargs.get("websocket_port", 8765),
163
+ }
164
+
165
+ # Initialize main configuration
166
+ try:
167
+ config = Config()
168
+ except FileNotFoundError as e:
169
+ self.logger.warning(
170
+ "Configuration file not found, using defaults", extra={"error": str(e)}
171
+ )
172
+ config = Config() # Will use defaults
173
+ except Exception as e:
174
+ self.logger.error("Failed to load configuration", exc_info=True)
175
+ raise RuntimeError(f"Configuration initialization failed: {e}") from e
176
+
177
+ config_data["config"] = config
178
+
179
+ return config_data
180
+
181
+ def initialize_project_logger(self, log_level: str):
182
+ """Initialize project logger for session logging.
183
+
184
+ Args:
185
+ log_level: Logging level
186
+
187
+ Returns:
188
+ Initialized project logger or None if disabled/failed
189
+ """
190
+ if log_level == "OFF":
191
+ return None
192
+
193
+ try:
194
+ project_logger = get_project_logger(log_level)
195
+ project_logger.log_system(
196
+ f"Initializing ClaudeRunner", level="INFO", component="runner"
197
+ )
198
+ return project_logger
199
+ except ImportError as e:
200
+ self.logger.warning(f"Project logger module not available: {e}")
201
+ return None
202
+ except Exception as e:
203
+ self.logger.warning(f"Failed to initialize project logger: {e}")
204
+ return None
205
+
206
+ def initialize_response_logger(self, config: Config, project_logger=None):
207
+ """Initialize response logger if enabled in configuration.
208
+
209
+ Args:
210
+ config: Configuration object
211
+ project_logger: Optional project logger for system events
212
+
213
+ Returns:
214
+ Initialized response logger or None if disabled/failed
215
+ """
216
+ response_config = config.get("response_logging", {})
217
+ if not response_config.get("enabled", False):
218
+ return None
219
+
220
+ try:
221
+ from claude_mpm.services.claude_session_logger import get_session_logger
222
+
223
+ response_logger = get_session_logger(config)
224
+ if project_logger:
225
+ project_logger.log_system(
226
+ "Response logging initialized", level="INFO", component="logging"
227
+ )
228
+ return response_logger
229
+ except Exception as e:
230
+ self.logger.warning("Failed to initialize response logger", exc_info=True)
231
+ return None
232
+
233
+ def get_user_working_directory(self) -> Optional[Path]:
234
+ """Get user working directory from environment.
235
+
236
+ Returns:
237
+ Path to user working directory or None if not set
238
+ """
239
+ if "CLAUDE_MPM_USER_PWD" in os.environ:
240
+ user_working_dir = Path(os.environ["CLAUDE_MPM_USER_PWD"])
241
+ self.logger.info(
242
+ f"Using user working directory from CLAUDE_MPM_USER_PWD",
243
+ extra={"directory": str(user_working_dir)},
244
+ )
245
+ return user_working_dir
246
+ return None
247
+
248
+ def register_core_services(
249
+ self, container, user_working_dir: Optional[Path] = None
250
+ ):
251
+ """Register core services in the DI container.
252
+
253
+ Args:
254
+ container: DI container instance
255
+ user_working_dir: Optional user working directory
256
+ """
257
+ # Register deployment service
258
+ from claude_mpm.core.interfaces import AgentDeploymentInterface
259
+
260
+ if not container.is_registered(AgentDeploymentInterface):
261
+ from claude_mpm.services.agents.deployment import AgentDeploymentService
262
+
263
+ container.register_factory(
264
+ AgentDeploymentInterface,
265
+ lambda c: AgentDeploymentService(working_directory=user_working_dir),
266
+ lifetime=ServiceLifetime.SINGLETON,
267
+ )
268
+
269
+ def register_ticket_manager(self, container, enable_tickets: bool):
270
+ """Register ticket manager service if enabled.
271
+
272
+ Args:
273
+ container: DI container instance
274
+ enable_tickets: Whether to enable ticket management
275
+
276
+ Returns:
277
+ Tuple of (ticket_manager, actual_enable_tickets_flag)
278
+ """
279
+ # Ticket manager is now disabled by default - use claude-mpm tickets CLI instead
280
+ self.logger.info(
281
+ "Ticket manager disabled - use 'claude-mpm tickets' CLI commands for ticket management"
282
+ )
283
+ return None, False
284
+
285
+ def register_hook_service(self, container, config: Config):
286
+ """Register hook service in the DI container.
287
+
288
+ Args:
289
+ container: DI container instance
290
+ config: Configuration object
291
+
292
+ Returns:
293
+ Initialized hook service or None if failed
294
+ """
295
+ from claude_mpm.core.interfaces import HookServiceInterface
296
+
297
+ if not container.is_registered(HookServiceInterface):
298
+ from claude_mpm.services.hook_service import HookService
299
+
300
+ container.register_factory(
301
+ HookServiceInterface,
302
+ lambda c: HookService(config),
303
+ lifetime=ServiceLifetime.SINGLETON,
304
+ )
305
+
306
+ try:
307
+ return container.get(HookServiceInterface)
308
+ except Exception as e:
309
+ self.logger.warning("Failed to initialize hook service", exc_info=True)
310
+ return None
311
+
312
+ def register_agent_capabilities_service(self, container):
313
+ """Register agent capabilities service in the DI container.
314
+
315
+ Args:
316
+ container: DI container instance
317
+
318
+ Returns:
319
+ Initialized agent capabilities service or None if failed
320
+ """
321
+ from claude_mpm.services.core.interfaces import AgentCapabilitiesInterface
322
+
323
+ if not container.is_registered(AgentCapabilitiesInterface):
324
+ from claude_mpm.services.agent_capabilities_service import (
325
+ AgentCapabilitiesService,
326
+ )
327
+
328
+ container.register_singleton(
329
+ AgentCapabilitiesInterface, AgentCapabilitiesService
330
+ )
331
+
332
+ try:
333
+ return container.get(AgentCapabilitiesInterface)
334
+ except Exception as e:
335
+ self.logger.warning(
336
+ "Failed to initialize agent capabilities service", exc_info=True
337
+ )
338
+ return None
339
+
340
+ def register_system_instructions_service(
341
+ self, container, agent_capabilities_service
342
+ ):
343
+ """Register system instructions service in the DI container.
344
+
345
+ Args:
346
+ container: DI container instance
347
+ agent_capabilities_service: Agent capabilities service dependency
348
+
349
+ Returns:
350
+ Initialized system instructions service or None if failed
351
+ """
352
+ from claude_mpm.services.core.interfaces import SystemInstructionsInterface
353
+
354
+ if not container.is_registered(SystemInstructionsInterface):
355
+ from claude_mpm.services.system_instructions_service import (
356
+ SystemInstructionsService,
357
+ )
358
+
359
+ container.register_factory(
360
+ SystemInstructionsInterface,
361
+ lambda c: SystemInstructionsService(
362
+ agent_capabilities_service=agent_capabilities_service
363
+ ),
364
+ lifetime=ServiceLifetime.SINGLETON,
365
+ )
366
+
367
+ try:
368
+ return container.get(SystemInstructionsInterface)
369
+ except Exception as e:
370
+ self.logger.warning(
371
+ "Failed to initialize system instructions service", exc_info=True
372
+ )
373
+ return None
374
+
375
+ def register_subprocess_launcher_service(
376
+ self, container, project_logger, websocket_server
377
+ ):
378
+ """Register subprocess launcher service in the DI container.
379
+
380
+ Args:
381
+ container: DI container instance
382
+ project_logger: Project logger dependency
383
+ websocket_server: WebSocket server dependency
384
+
385
+ Returns:
386
+ Initialized subprocess launcher service or None if failed
387
+ """
388
+ from claude_mpm.services.core.interfaces import SubprocessLauncherInterface
389
+
390
+ if not container.is_registered(SubprocessLauncherInterface):
391
+ from claude_mpm.services.subprocess_launcher_service import (
392
+ SubprocessLauncherService,
393
+ )
394
+
395
+ container.register_factory(
396
+ SubprocessLauncherInterface,
397
+ lambda c: SubprocessLauncherService(
398
+ project_logger=project_logger, websocket_server=websocket_server
399
+ ),
400
+ lifetime=ServiceLifetime.SINGLETON,
401
+ )
402
+
403
+ try:
404
+ return container.get(SubprocessLauncherInterface)
405
+ except Exception as e:
406
+ self.logger.warning(
407
+ "Failed to initialize subprocess launcher service", exc_info=True
408
+ )
409
+ return None
410
+
411
+ def register_version_service(self, container):
412
+ """Register version service in the DI container.
413
+
414
+ Args:
415
+ container: DI container instance
416
+
417
+ Returns:
418
+ Initialized version service or None if failed
419
+ """
420
+ from claude_mpm.services.core.interfaces import VersionServiceInterface
421
+
422
+ if not container.is_registered(VersionServiceInterface):
423
+ from claude_mpm.services.version_service import VersionService
424
+
425
+ container.register_singleton(VersionServiceInterface, VersionService)
426
+
427
+ try:
428
+ return container.get(VersionServiceInterface)
429
+ except Exception as e:
430
+ self.logger.warning("Failed to initialize version service", exc_info=True)
431
+ return None
432
+
433
+ def register_command_handler_service(self, container, project_logger):
434
+ """Register command handler service in the DI container.
435
+
436
+ Args:
437
+ container: DI container instance
438
+ project_logger: Project logger dependency
439
+
440
+ Returns:
441
+ Initialized command handler service or None if failed
442
+ """
443
+ from claude_mpm.services.core.interfaces import CommandHandlerInterface
444
+
445
+ if not container.is_registered(CommandHandlerInterface):
446
+ from claude_mpm.services.command_handler_service import (
447
+ CommandHandlerService,
448
+ )
449
+
450
+ container.register_factory(
451
+ CommandHandlerInterface,
452
+ lambda c: CommandHandlerService(project_logger=project_logger),
453
+ lifetime=ServiceLifetime.SINGLETON,
454
+ )
455
+
456
+ try:
457
+ return container.get(CommandHandlerInterface)
458
+ except Exception as e:
459
+ self.logger.warning(
460
+ "Failed to initialize command handler service", exc_info=True
461
+ )
462
+ return None
463
+
464
+ def register_memory_hook_service(self, container, hook_service):
465
+ """Register memory hook service in the DI container.
466
+
467
+ Args:
468
+ container: DI container instance
469
+ hook_service: Hook service dependency
470
+
471
+ Returns:
472
+ Initialized memory hook service or None if failed
473
+ """
474
+ from claude_mpm.services.core.interfaces import MemoryHookInterface
475
+
476
+ if not container.is_registered(MemoryHookInterface):
477
+ from claude_mpm.services.memory_hook_service import MemoryHookService
478
+
479
+ container.register_factory(
480
+ MemoryHookInterface,
481
+ lambda c: MemoryHookService(hook_service=hook_service),
482
+ lifetime=ServiceLifetime.SINGLETON,
483
+ )
484
+
485
+ try:
486
+ return container.get(MemoryHookInterface)
487
+ except Exception as e:
488
+ self.logger.warning(
489
+ "Failed to initialize memory hook service", exc_info=True
490
+ )
491
+ return None
492
+
493
+ def register_session_management_service(self, container, runner):
494
+ """Register session management service in the DI container.
495
+
496
+ Args:
497
+ container: DI container instance
498
+ runner: ClaudeRunner instance dependency
499
+
500
+ Returns:
501
+ Initialized session management service or None if failed
502
+ """
503
+ from claude_mpm.services.core.interfaces import SessionManagementInterface
504
+
505
+ if not container.is_registered(SessionManagementInterface):
506
+ from claude_mpm.services.session_management_service import (
507
+ SessionManagementService,
508
+ )
509
+
510
+ container.register_factory(
511
+ SessionManagementInterface,
512
+ lambda c: SessionManagementService(runner=runner),
513
+ lifetime=ServiceLifetime.SINGLETON,
514
+ )
515
+
516
+ try:
517
+ return container.get(SessionManagementInterface)
518
+ except Exception as e:
519
+ self.logger.warning(
520
+ "Failed to initialize session management service", exc_info=True
521
+ )
522
+ return None
523
+
524
+ def register_utility_service(self, container):
525
+ """Register utility service in the DI container.
526
+
527
+ Args:
528
+ container: DI container instance
529
+
530
+ Returns:
531
+ Initialized utility service or None if failed
532
+ """
533
+ from claude_mpm.services.core.interfaces import UtilityServiceInterface
534
+
535
+ if not container.is_registered(UtilityServiceInterface):
536
+ from claude_mpm.services.utility_service import UtilityService
537
+
538
+ container.register_singleton(UtilityServiceInterface, UtilityService)
539
+
540
+ try:
541
+ return container.get(UtilityServiceInterface)
542
+ except Exception as e:
543
+ self.logger.warning("Failed to initialize utility service", exc_info=True)
544
+ return None
545
+
546
+ def create_session_log_file(
547
+ self, project_logger, log_level: str, config_data: Dict[str, Any]
548
+ ) -> Optional[Path]:
549
+ """Create session log file and log session start event.
550
+
551
+ Args:
552
+ project_logger: Project logger instance
553
+ log_level: Logging level
554
+ config_data: Configuration data for logging
555
+
556
+ Returns:
557
+ Path to session log file or None if failed
558
+ """
559
+ if not project_logger or log_level == "OFF":
560
+ return None
561
+
562
+ try:
563
+ # Create a system.jsonl file in the session directory
564
+ session_log_file = project_logger.session_dir / "system.jsonl"
565
+
566
+ # Log session start event
567
+ session_event = {
568
+ "event": "session_start",
569
+ "runner": "ClaudeRunner",
570
+ "enable_tickets": config_data.get("enable_tickets"),
571
+ "log_level": log_level,
572
+ "launch_method": config_data.get("launch_method"),
573
+ }
574
+
575
+ # Write session event (this would be handled by a session logging method)
576
+ # For now, we'll return the file path
577
+ return session_log_file
578
+
579
+ except PermissionError as e:
580
+ self.logger.debug(f"Permission denied creating session log file: {e}")
581
+ return None
582
+ except OSError as e:
583
+ self.logger.debug(f"OS error creating session log file: {e}")
584
+ return None
585
+ except Exception as e:
586
+ self.logger.debug(f"Failed to create session log file: {e}")
587
+ return None