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.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +1 -1
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +2 -2
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +140 -905
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +330 -86
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +363 -220
- claude_mpm/cli/parser.py +24 -1156
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +124 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/built/dashboard.js +2 -0
- claude_mpm/dashboard/static/built/socket-client.js +2 -0
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +133 -53
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +233 -199
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +30 -13
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +575 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +166 -64
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +185 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +19 -533
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
- claude_mpm-4.0.4.dist-info/RECORD +417 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
- {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
         |