claude-mpm 3.9.9__py3-none-any.whl → 4.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +155 -0
- 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 +1 -1
- 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 +90 -49
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +21 -18
- 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 +143 -762
- 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 +203 -81
- 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 +305 -197
- claude_mpm/cli/parser.py +24 -1150
- 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 +104 -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 +217 -0
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +36 -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/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 +74 -70
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
- 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 +120 -54
- 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 +571 -0
- 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 +40 -23
- 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 +14 -21
- 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 +97 -93
- claude_mpm/services/mcp_gateway/main.py +307 -127
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
- claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
- 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 +110 -121
- 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 +223 -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 +145 -65
- 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 +170 -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 +20 -534
- 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 +9 -0
- claude_mpm/storage/state_storage.py +552 -0
- 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.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/core/config_paths.py +0 -150
- 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/memory_guardian.py +0 -770
- claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
- 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.9.dist-info/RECORD +0 -293
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
| @@ -5,42 +5,35 @@ MCP Gateway Core Module | |
| 5 5 | 
             
            Core interfaces and base classes for the MCP Gateway service.
         | 
| 6 6 | 
             
            """
         | 
| 7 7 |  | 
| 8 | 
            -
            from . | 
| 9 | 
            -
                IMCPServer,
         | 
| 10 | 
            -
                IMCPToolRegistry,
         | 
| 11 | 
            -
                IMCPConfiguration,
         | 
| 12 | 
            -
                IMCPToolAdapter,
         | 
| 13 | 
            -
                IMCPLifecycle,
         | 
| 14 | 
            -
                IMCPCommunication,
         | 
| 15 | 
            -
            )
         | 
| 16 | 
            -
             | 
| 17 | 
            -
            from .base import (
         | 
| 18 | 
            -
                BaseMCPService,
         | 
| 19 | 
            -
                MCPServiceState,
         | 
| 20 | 
            -
            )
         | 
| 21 | 
            -
             | 
| 8 | 
            +
            from .base import BaseMCPService, MCPServiceState
         | 
| 22 9 | 
             
            from .exceptions import (
         | 
| 23 | 
            -
                 | 
| 10 | 
            +
                MCPCommunicationError,
         | 
| 24 11 | 
             
                MCPConfigurationError,
         | 
| 25 | 
            -
                 | 
| 12 | 
            +
                MCPException,
         | 
| 26 13 | 
             
                MCPServerError,
         | 
| 27 | 
            -
                 | 
| 14 | 
            +
                MCPToolNotFoundError,
         | 
| 28 15 | 
             
                MCPValidationError,
         | 
| 29 16 | 
             
            )
         | 
| 17 | 
            +
            from .interfaces import (
         | 
| 18 | 
            +
                IMCPCommunication,
         | 
| 19 | 
            +
                IMCPConfiguration,
         | 
| 20 | 
            +
                IMCPGateway,
         | 
| 21 | 
            +
                IMCPLifecycle,
         | 
| 22 | 
            +
                IMCPToolAdapter,
         | 
| 23 | 
            +
                IMCPToolRegistry,
         | 
| 24 | 
            +
            )
         | 
| 30 25 |  | 
| 31 26 | 
             
            __all__ = [
         | 
| 32 27 | 
             
                # Interfaces
         | 
| 33 | 
            -
                " | 
| 28 | 
            +
                "IMCPGateway",
         | 
| 34 29 | 
             
                "IMCPToolRegistry",
         | 
| 35 30 | 
             
                "IMCPConfiguration",
         | 
| 36 31 | 
             
                "IMCPToolAdapter",
         | 
| 37 32 | 
             
                "IMCPLifecycle",
         | 
| 38 33 | 
             
                "IMCPCommunication",
         | 
| 39 | 
            -
                
         | 
| 40 34 | 
             
                # Base classes
         | 
| 41 35 | 
             
                "BaseMCPService",
         | 
| 42 36 | 
             
                "MCPServiceState",
         | 
| 43 | 
            -
                
         | 
| 44 37 | 
             
                # Exceptions
         | 
| 45 38 | 
             
                "MCPException",
         | 
| 46 39 | 
             
                "MCPConfigurationError",
         | 
| @@ -48,4 +41,4 @@ __all__ = [ | |
| 48 41 | 
             
                "MCPServerError",
         | 
| 49 42 | 
             
                "MCPCommunicationError",
         | 
| 50 43 | 
             
                "MCPValidationError",
         | 
| 51 | 
            -
            ]
         | 
| 44 | 
            +
            ]
         | 
| @@ -7,18 +7,18 @@ Base implementations for MCP Gateway services. | |
| 7 7 | 
             
            Part of ISS-0034: Infrastructure Setup - MCP Gateway Project Foundation
         | 
| 8 8 | 
             
            """
         | 
| 9 9 |  | 
| 10 | 
            -
            from enum import Enum
         | 
| 11 | 
            -
            from typing import Any, Dict, Optional
         | 
| 12 10 | 
             
            import asyncio
         | 
| 13 11 | 
             
            import logging
         | 
| 14 | 
            -
            from  | 
| 12 | 
            +
            from enum import Enum
         | 
| 13 | 
            +
            from typing import Any, Dict, Optional
         | 
| 15 14 |  | 
| 16 | 
            -
            from claude_mpm.services.core.base import BaseService
         | 
| 17 15 | 
             
            from claude_mpm.core.logger import get_logger
         | 
| 16 | 
            +
            from claude_mpm.services.core.base import BaseService
         | 
| 18 17 |  | 
| 19 18 |  | 
| 20 19 | 
             
            class MCPServiceState(Enum):
         | 
| 21 20 | 
             
                """MCP service lifecycle states."""
         | 
| 21 | 
            +
             | 
| 22 22 | 
             
                UNINITIALIZED = "uninitialized"
         | 
| 23 23 | 
             
                INITIALIZING = "initializing"
         | 
| 24 24 | 
             
                INITIALIZED = "initialized"
         | 
| @@ -32,20 +32,24 @@ class MCPServiceState(Enum): | |
| 32 32 | 
             
            class BaseMCPService(BaseService):
         | 
| 33 33 | 
             
                """
         | 
| 34 34 | 
             
                Base class for all MCP Gateway services.
         | 
| 35 | 
            -
             | 
| 35 | 
            +
             | 
| 36 36 | 
             
                Extends the claude-mpm BaseService with MCP-specific functionality
         | 
| 37 37 | 
             
                including state management, health monitoring, and async lifecycle support.
         | 
| 38 | 
            -
             | 
| 38 | 
            +
             | 
| 39 39 | 
             
                WHY: We extend BaseService to maintain consistency with the claude-mpm
         | 
| 40 40 | 
             
                architecture while adding MCP-specific capabilities. This ensures all
         | 
| 41 41 | 
             
                MCP services integrate seamlessly with the existing service container
         | 
| 42 42 | 
             
                and dependency injection system.
         | 
| 43 43 | 
             
                """
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                def __init__( | 
| 44 | 
            +
             | 
| 45 | 
            +
                def __init__(
         | 
| 46 | 
            +
                    self,
         | 
| 47 | 
            +
                    service_name: Optional[str] = None,
         | 
| 48 | 
            +
                    config: Optional[Dict[str, Any]] = None,
         | 
| 49 | 
            +
                ):
         | 
| 46 50 | 
             
                    """
         | 
| 47 51 | 
             
                    Initialize MCP service.
         | 
| 48 | 
            -
             | 
| 52 | 
            +
             | 
| 49 53 | 
             
                    Args:
         | 
| 50 54 | 
             
                        service_name: Name of the service for logging
         | 
| 51 55 | 
             
                        config: Service-specific configuration
         | 
| @@ -56,34 +60,37 @@ class BaseMCPService(BaseService): | |
| 56 60 | 
             
                        "healthy": False,
         | 
| 57 61 | 
             
                        "state": self._state.value,
         | 
| 58 62 | 
             
                        "last_check": None,
         | 
| 59 | 
            -
                        "details": {}
         | 
| 63 | 
            +
                        "details": {},
         | 
| 60 64 | 
             
                    }
         | 
| 61 65 | 
             
                    self._state_lock = asyncio.Lock()
         | 
| 62 66 | 
             
                    self._initialization_task = None
         | 
| 63 67 | 
             
                    self._shutdown_task = None
         | 
| 64 | 
            -
             | 
| 68 | 
            +
             | 
| 65 69 | 
             
                async def initialize(self) -> bool:
         | 
| 66 70 | 
             
                    """
         | 
| 67 71 | 
             
                    Initialize the MCP service.
         | 
| 68 | 
            -
             | 
| 72 | 
            +
             | 
| 69 73 | 
             
                    This method manages state transitions and ensures thread-safe initialization.
         | 
| 70 74 | 
             
                    Subclasses should override _do_initialize() for custom initialization logic.
         | 
| 71 | 
            -
             | 
| 75 | 
            +
             | 
| 72 76 | 
             
                    Returns:
         | 
| 73 77 | 
             
                        True if initialization successful, False otherwise
         | 
| 74 78 | 
             
                    """
         | 
| 75 79 | 
             
                    async with self._state_lock:
         | 
| 76 | 
            -
                        if self._state not in [ | 
| 80 | 
            +
                        if self._state not in [
         | 
| 81 | 
            +
                            MCPServiceState.UNINITIALIZED,
         | 
| 82 | 
            +
                            MCPServiceState.STOPPED,
         | 
| 83 | 
            +
                        ]:
         | 
| 77 84 | 
             
                            self.log_warning(f"Cannot initialize from state {self._state.value}")
         | 
| 78 85 | 
             
                            return False
         | 
| 79 | 
            -
             | 
| 86 | 
            +
             | 
| 80 87 | 
             
                        self._state = MCPServiceState.INITIALIZING
         | 
| 81 88 | 
             
                        self.log_info("Initializing MCP service")
         | 
| 82 | 
            -
             | 
| 89 | 
            +
             | 
| 83 90 | 
             
                    try:
         | 
| 84 91 | 
             
                        # Call subclass initialization
         | 
| 85 92 | 
             
                        success = await self._do_initialize()
         | 
| 86 | 
            -
             | 
| 93 | 
            +
             | 
| 87 94 | 
             
                        async with self._state_lock:
         | 
| 88 95 | 
             
                            if success:
         | 
| 89 96 | 
             
                                self._state = MCPServiceState.INITIALIZED
         | 
| @@ -96,35 +103,35 @@ class BaseMCPService(BaseService): | |
| 96 103 | 
             
                                self._health_status["healthy"] = False
         | 
| 97 104 | 
             
                                self._health_status["state"] = self._state.value
         | 
| 98 105 | 
             
                                self.log_error("MCP service initialization failed")
         | 
| 99 | 
            -
             | 
| 106 | 
            +
             | 
| 100 107 | 
             
                            return success
         | 
| 101 | 
            -
             | 
| 108 | 
            +
             | 
| 102 109 | 
             
                    except Exception as e:
         | 
| 103 110 | 
             
                        async with self._state_lock:
         | 
| 104 111 | 
             
                            self._state = MCPServiceState.ERROR
         | 
| 105 112 | 
             
                            self._health_status["healthy"] = False
         | 
| 106 113 | 
             
                            self._health_status["state"] = self._state.value
         | 
| 107 114 | 
             
                            self._health_status["details"]["error"] = str(e)
         | 
| 108 | 
            -
             | 
| 115 | 
            +
             | 
| 109 116 | 
             
                        self.log_error(f"Exception during initialization: {e}")
         | 
| 110 117 | 
             
                        return False
         | 
| 111 | 
            -
             | 
| 118 | 
            +
             | 
| 112 119 | 
             
                async def _do_initialize(self) -> bool:
         | 
| 113 120 | 
             
                    """
         | 
| 114 121 | 
             
                    Perform actual initialization logic.
         | 
| 115 | 
            -
             | 
| 122 | 
            +
             | 
| 116 123 | 
             
                    Subclasses should override this method to implement custom initialization.
         | 
| 117 | 
            -
             | 
| 124 | 
            +
             | 
| 118 125 | 
             
                    Returns:
         | 
| 119 126 | 
             
                        True if initialization successful
         | 
| 120 127 | 
             
                    """
         | 
| 121 128 | 
             
                    # Default implementation - subclasses should override
         | 
| 122 129 | 
             
                    return True
         | 
| 123 | 
            -
             | 
| 130 | 
            +
             | 
| 124 131 | 
             
                async def start(self) -> bool:
         | 
| 125 132 | 
             
                    """
         | 
| 126 133 | 
             
                    Start the MCP service.
         | 
| 127 | 
            -
             | 
| 134 | 
            +
             | 
| 128 135 | 
             
                    Returns:
         | 
| 129 136 | 
             
                        True if startup successful
         | 
| 130 137 | 
             
                    """
         | 
| @@ -132,13 +139,13 @@ class BaseMCPService(BaseService): | |
| 132 139 | 
             
                        if self._state != MCPServiceState.INITIALIZED:
         | 
| 133 140 | 
             
                            self.log_warning(f"Cannot start from state {self._state.value}")
         | 
| 134 141 | 
             
                            return False
         | 
| 135 | 
            -
             | 
| 142 | 
            +
             | 
| 136 143 | 
             
                        self._state = MCPServiceState.STARTING
         | 
| 137 144 | 
             
                        self.log_info("Starting MCP service")
         | 
| 138 | 
            -
             | 
| 145 | 
            +
             | 
| 139 146 | 
             
                    try:
         | 
| 140 147 | 
             
                        success = await self._do_start()
         | 
| 141 | 
            -
             | 
| 148 | 
            +
             | 
| 142 149 | 
             
                        async with self._state_lock:
         | 
| 143 150 | 
             
                            if success:
         | 
| 144 151 | 
             
                                self._state = MCPServiceState.RUNNING
         | 
| @@ -150,35 +157,35 @@ class BaseMCPService(BaseService): | |
| 150 157 | 
             
                                self._health_status["healthy"] = False
         | 
| 151 158 | 
             
                                self._health_status["state"] = self._state.value
         | 
| 152 159 | 
             
                                self.log_error("MCP service startup failed")
         | 
| 153 | 
            -
             | 
| 160 | 
            +
             | 
| 154 161 | 
             
                            return success
         | 
| 155 | 
            -
             | 
| 162 | 
            +
             | 
| 156 163 | 
             
                    except Exception as e:
         | 
| 157 164 | 
             
                        async with self._state_lock:
         | 
| 158 165 | 
             
                            self._state = MCPServiceState.ERROR
         | 
| 159 166 | 
             
                            self._health_status["healthy"] = False
         | 
| 160 167 | 
             
                            self._health_status["state"] = self._state.value
         | 
| 161 168 | 
             
                            self._health_status["details"]["error"] = str(e)
         | 
| 162 | 
            -
             | 
| 169 | 
            +
             | 
| 163 170 | 
             
                        self.log_error(f"Exception during startup: {e}")
         | 
| 164 171 | 
             
                        return False
         | 
| 165 | 
            -
             | 
| 172 | 
            +
             | 
| 166 173 | 
             
                async def _do_start(self) -> bool:
         | 
| 167 174 | 
             
                    """
         | 
| 168 175 | 
             
                    Perform actual startup logic.
         | 
| 169 | 
            -
             | 
| 176 | 
            +
             | 
| 170 177 | 
             
                    Subclasses should override this method to implement custom startup.
         | 
| 171 | 
            -
             | 
| 178 | 
            +
             | 
| 172 179 | 
             
                    Returns:
         | 
| 173 180 | 
             
                        True if startup successful
         | 
| 174 181 | 
             
                    """
         | 
| 175 182 | 
             
                    # Default implementation - subclasses should override
         | 
| 176 183 | 
             
                    return True
         | 
| 177 | 
            -
             | 
| 184 | 
            +
             | 
| 178 185 | 
             
                async def shutdown(self) -> None:
         | 
| 179 186 | 
             
                    """
         | 
| 180 187 | 
             
                    Shutdown the MCP service gracefully.
         | 
| 181 | 
            -
             | 
| 188 | 
            +
             | 
| 182 189 | 
             
                    This method manages state transitions and ensures clean shutdown.
         | 
| 183 190 | 
             
                    Subclasses should override _do_shutdown() for custom shutdown logic.
         | 
| 184 191 | 
             
                    """
         | 
| @@ -186,106 +193,110 @@ class BaseMCPService(BaseService): | |
| 186 193 | 
             
                        if self._state in [MCPServiceState.STOPPED, MCPServiceState.STOPPING]:
         | 
| 187 194 | 
             
                            self.log_warning(f"Already in state {self._state.value}")
         | 
| 188 195 | 
             
                            return
         | 
| 189 | 
            -
             | 
| 196 | 
            +
             | 
| 190 197 | 
             
                        self._state = MCPServiceState.STOPPING
         | 
| 191 198 | 
             
                        self.log_info("Shutting down MCP service")
         | 
| 192 | 
            -
             | 
| 199 | 
            +
             | 
| 193 200 | 
             
                    try:
         | 
| 194 201 | 
             
                        await self._do_shutdown()
         | 
| 195 | 
            -
             | 
| 202 | 
            +
             | 
| 196 203 | 
             
                        async with self._state_lock:
         | 
| 197 204 | 
             
                            self._state = MCPServiceState.STOPPED
         | 
| 198 205 | 
             
                            self._shutdown = True
         | 
| 199 206 | 
             
                            self._health_status["healthy"] = False
         | 
| 200 207 | 
             
                            self._health_status["state"] = self._state.value
         | 
| 201 208 | 
             
                            self.log_info("MCP service shutdown complete")
         | 
| 202 | 
            -
             | 
| 209 | 
            +
             | 
| 203 210 | 
             
                    except Exception as e:
         | 
| 204 211 | 
             
                        async with self._state_lock:
         | 
| 205 212 | 
             
                            self._state = MCPServiceState.ERROR
         | 
| 206 213 | 
             
                            self._health_status["healthy"] = False
         | 
| 207 214 | 
             
                            self._health_status["state"] = self._state.value
         | 
| 208 215 | 
             
                            self._health_status["details"]["error"] = str(e)
         | 
| 209 | 
            -
             | 
| 216 | 
            +
             | 
| 210 217 | 
             
                        self.log_error(f"Exception during shutdown: {e}")
         | 
| 211 | 
            -
             | 
| 218 | 
            +
             | 
| 212 219 | 
             
                async def _do_shutdown(self) -> None:
         | 
| 213 220 | 
             
                    """
         | 
| 214 221 | 
             
                    Perform actual shutdown logic.
         | 
| 215 | 
            -
             | 
| 222 | 
            +
             | 
| 216 223 | 
             
                    Subclasses should override this method to implement custom shutdown.
         | 
| 217 224 | 
             
                    """
         | 
| 218 225 | 
             
                    # Default implementation - subclasses should override
         | 
| 219 226 | 
             
                    pass
         | 
| 220 | 
            -
             | 
| 227 | 
            +
             | 
| 221 228 | 
             
                async def restart(self) -> bool:
         | 
| 222 229 | 
             
                    """
         | 
| 223 230 | 
             
                    Restart the MCP service.
         | 
| 224 | 
            -
             | 
| 231 | 
            +
             | 
| 225 232 | 
             
                    Returns:
         | 
| 226 233 | 
             
                        True if restart successful
         | 
| 227 234 | 
             
                    """
         | 
| 228 235 | 
             
                    self.log_info("Restarting MCP service")
         | 
| 229 | 
            -
             | 
| 236 | 
            +
             | 
| 230 237 | 
             
                    # Shutdown if running
         | 
| 231 238 | 
             
                    if self._state == MCPServiceState.RUNNING:
         | 
| 232 239 | 
             
                        await self.shutdown()
         | 
| 233 | 
            -
             | 
| 240 | 
            +
             | 
| 234 241 | 
             
                    # Re-initialize
         | 
| 235 242 | 
             
                    if not await self.initialize():
         | 
| 236 243 | 
             
                        return False
         | 
| 237 | 
            -
             | 
| 244 | 
            +
             | 
| 238 245 | 
             
                    # Start again
         | 
| 239 246 | 
             
                    return await self.start()
         | 
| 240 | 
            -
             | 
| 247 | 
            +
             | 
| 241 248 | 
             
                def get_state(self) -> str:
         | 
| 242 249 | 
             
                    """
         | 
| 243 250 | 
             
                    Get current service state.
         | 
| 244 | 
            -
             | 
| 251 | 
            +
             | 
| 245 252 | 
             
                    Returns:
         | 
| 246 253 | 
             
                        Service state string
         | 
| 247 254 | 
             
                    """
         | 
| 248 255 | 
             
                    return self._state.value
         | 
| 249 | 
            -
             | 
| 256 | 
            +
             | 
| 250 257 | 
             
                def is_healthy(self) -> bool:
         | 
| 251 258 | 
             
                    """
         | 
| 252 259 | 
             
                    Check if service is healthy.
         | 
| 253 | 
            -
             | 
| 260 | 
            +
             | 
| 254 261 | 
             
                    Returns:
         | 
| 255 262 | 
             
                        True if service is healthy
         | 
| 256 263 | 
             
                    """
         | 
| 257 264 | 
             
                    return self._health_status["healthy"]
         | 
| 258 | 
            -
             | 
| 265 | 
            +
             | 
| 259 266 | 
             
                def get_health_status(self) -> Dict[str, Any]:
         | 
| 260 267 | 
             
                    """
         | 
| 261 268 | 
             
                    Get detailed health status.
         | 
| 262 | 
            -
             | 
| 269 | 
            +
             | 
| 263 270 | 
             
                    Returns:
         | 
| 264 271 | 
             
                        Health status information
         | 
| 265 272 | 
             
                    """
         | 
| 266 273 | 
             
                    return self._health_status.copy()
         | 
| 267 | 
            -
             | 
| 268 | 
            -
                def update_health_status( | 
| 274 | 
            +
             | 
| 275 | 
            +
                def update_health_status(
         | 
| 276 | 
            +
                    self, healthy: bool, details: Optional[Dict[str, Any]] = None
         | 
| 277 | 
            +
                ) -> None:
         | 
| 269 278 | 
             
                    """
         | 
| 270 279 | 
             
                    Update health status.
         | 
| 271 | 
            -
             | 
| 280 | 
            +
             | 
| 272 281 | 
             
                    Args:
         | 
| 273 282 | 
             
                        healthy: Whether service is healthy
         | 
| 274 283 | 
             
                        details: Additional health details
         | 
| 275 284 | 
             
                    """
         | 
| 276 285 | 
             
                    from datetime import datetime
         | 
| 277 | 
            -
             | 
| 286 | 
            +
             | 
| 278 287 | 
             
                    self._health_status["healthy"] = healthy
         | 
| 279 288 | 
             
                    self._health_status["last_check"] = datetime.now().isoformat()
         | 
| 280 | 
            -
             | 
| 289 | 
            +
             | 
| 281 290 | 
             
                    if details:
         | 
| 282 291 | 
             
                        self._health_status["details"].update(details)
         | 
| 283 | 
            -
             | 
| 292 | 
            +
             | 
| 284 293 | 
             
                # Additional logging methods for MCP-specific events
         | 
| 285 | 
            -
                def log_mcp_event( | 
| 294 | 
            +
                def log_mcp_event(
         | 
| 295 | 
            +
                    self, event_type: str, data: Optional[Dict[str, Any]] = None
         | 
| 296 | 
            +
                ) -> None:
         | 
| 286 297 | 
             
                    """
         | 
| 287 298 | 
             
                    Log an MCP-specific event.
         | 
| 288 | 
            -
             | 
| 299 | 
            +
             | 
| 289 300 | 
             
                    Args:
         | 
| 290 301 | 
             
                        event_type: Type of MCP event
         | 
| 291 302 | 
             
                        data: Event data
         | 
| @@ -294,11 +305,13 @@ class BaseMCPService(BaseService): | |
| 294 305 | 
             
                    if data:
         | 
| 295 306 | 
             
                        message += f" - {data}"
         | 
| 296 307 | 
             
                    self.log_info(message)
         | 
| 297 | 
            -
             | 
| 298 | 
            -
                def log_tool_invocation( | 
| 308 | 
            +
             | 
| 309 | 
            +
                def log_tool_invocation(
         | 
| 310 | 
            +
                    self, tool_name: str, success: bool, duration: Optional[float] = None
         | 
| 311 | 
            +
                ) -> None:
         | 
| 299 312 | 
             
                    """
         | 
| 300 313 | 
             
                    Log a tool invocation.
         | 
| 301 | 
            -
             | 
| 314 | 
            +
             | 
| 302 315 | 
             
                    Args:
         | 
| 303 316 | 
             
                        tool_name: Name of the tool invoked
         | 
| 304 317 | 
             
                        success: Whether invocation was successful
         | 
| @@ -308,8 +321,8 @@ class BaseMCPService(BaseService): | |
| 308 321 | 
             
                    message = f"Tool invocation: {tool_name} {status}"
         | 
| 309 322 | 
             
                    if duration:
         | 
| 310 323 | 
             
                        message += f" ({duration:.3f}s)"
         | 
| 311 | 
            -
             | 
| 324 | 
            +
             | 
| 312 325 | 
             
                    if success:
         | 
| 313 326 | 
             
                        self.log_info(message)
         | 
| 314 327 | 
             
                    else:
         | 
| 315 | 
            -
                        self.log_warning(message)
         | 
| 328 | 
            +
                        self.log_warning(message)
         | 
| @@ -7,22 +7,22 @@ Custom exceptions for MCP Gateway operations. | |
| 7 7 | 
             
            Part of ISS-0034: Infrastructure Setup - MCP Gateway Project Foundation
         | 
| 8 8 | 
             
            """
         | 
| 9 9 |  | 
| 10 | 
            -
            from typing import  | 
| 10 | 
            +
            from typing import Any, Dict, Optional
         | 
| 11 11 |  | 
| 12 12 |  | 
| 13 13 | 
             
            class MCPException(Exception):
         | 
| 14 14 | 
             
                """
         | 
| 15 15 | 
             
                Base exception for all MCP Gateway errors.
         | 
| 16 | 
            -
             | 
| 16 | 
            +
             | 
| 17 17 | 
             
                WHY: We create a base exception to allow catching all MCP-related
         | 
| 18 18 | 
             
                errors in a single except block while still being able to handle
         | 
| 19 19 | 
             
                specific error types when needed.
         | 
| 20 20 | 
             
                """
         | 
| 21 | 
            -
             | 
| 21 | 
            +
             | 
| 22 22 | 
             
                def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
         | 
| 23 23 | 
             
                    """
         | 
| 24 24 | 
             
                    Initialize MCP exception.
         | 
| 25 | 
            -
             | 
| 25 | 
            +
             | 
| 26 26 | 
             
                    Args:
         | 
| 27 27 | 
             
                        message: Error message
         | 
| 28 28 | 
             
                        details: Additional error details
         | 
| @@ -30,7 +30,7 @@ class MCPException(Exception): | |
| 30 30 | 
             
                    super().__init__(message)
         | 
| 31 31 | 
             
                    self.message = message
         | 
| 32 32 | 
             
                    self.details = details or {}
         | 
| 33 | 
            -
             | 
| 33 | 
            +
             | 
| 34 34 | 
             
                def __str__(self) -> str:
         | 
| 35 35 | 
             
                    """String representation of the exception."""
         | 
| 36 36 | 
             
                    if self.details:
         | 
| @@ -41,19 +41,23 @@ class MCPException(Exception): | |
| 41 41 | 
             
            class MCPConfigurationError(MCPException):
         | 
| 42 42 | 
             
                """
         | 
| 43 43 | 
             
                Raised when MCP configuration is invalid or cannot be loaded.
         | 
| 44 | 
            -
             | 
| 44 | 
            +
             | 
| 45 45 | 
             
                Common scenarios:
         | 
| 46 46 | 
             
                - Missing required configuration fields
         | 
| 47 47 | 
             
                - Invalid configuration values
         | 
| 48 48 | 
             
                - Configuration file not found
         | 
| 49 49 | 
             
                - YAML parsing errors
         | 
| 50 50 | 
             
                """
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                def __init__( | 
| 53 | 
            -
             | 
| 51 | 
            +
             | 
| 52 | 
            +
                def __init__(
         | 
| 53 | 
            +
                    self,
         | 
| 54 | 
            +
                    message: str,
         | 
| 55 | 
            +
                    config_key: Optional[str] = None,
         | 
| 56 | 
            +
                    expected_type: Optional[str] = None,
         | 
| 57 | 
            +
                ):
         | 
| 54 58 | 
             
                    """
         | 
| 55 59 | 
             
                    Initialize configuration error.
         | 
| 56 | 
            -
             | 
| 60 | 
            +
             | 
| 57 61 | 
             
                    Args:
         | 
| 58 62 | 
             
                        message: Error message
         | 
| 59 63 | 
             
                        config_key: Configuration key that caused the error
         | 
| @@ -64,54 +68,58 @@ class MCPConfigurationError(MCPException): | |
| 64 68 | 
             
                        details["config_key"] = config_key
         | 
| 65 69 | 
             
                    if expected_type:
         | 
| 66 70 | 
             
                        details["expected_type"] = expected_type
         | 
| 67 | 
            -
             | 
| 71 | 
            +
             | 
| 68 72 | 
             
                    super().__init__(message, details)
         | 
| 69 73 |  | 
| 70 74 |  | 
| 71 75 | 
             
            class MCPToolNotFoundError(MCPException):
         | 
| 72 76 | 
             
                """
         | 
| 73 77 | 
             
                Raised when a requested tool is not found in the registry.
         | 
| 74 | 
            -
             | 
| 78 | 
            +
             | 
| 75 79 | 
             
                This error occurs when:
         | 
| 76 80 | 
             
                - Attempting to invoke a non-existent tool
         | 
| 77 81 | 
             
                - Trying to unregister a tool that isn't registered
         | 
| 78 82 | 
             
                - Searching for a tool that doesn't exist
         | 
| 79 83 | 
             
                """
         | 
| 80 | 
            -
             | 
| 84 | 
            +
             | 
| 81 85 | 
             
                def __init__(self, tool_name: str, available_tools: Optional[list] = None):
         | 
| 82 86 | 
             
                    """
         | 
| 83 87 | 
             
                    Initialize tool not found error.
         | 
| 84 | 
            -
             | 
| 88 | 
            +
             | 
| 85 89 | 
             
                    Args:
         | 
| 86 90 | 
             
                        tool_name: Name of the tool that wasn't found
         | 
| 87 91 | 
             
                        available_tools: List of available tool names for reference
         | 
| 88 92 | 
             
                    """
         | 
| 89 93 | 
             
                    message = f"Tool '{tool_name}' not found in registry"
         | 
| 90 94 | 
             
                    details = {"tool_name": tool_name}
         | 
| 91 | 
            -
             | 
| 95 | 
            +
             | 
| 92 96 | 
             
                    if available_tools:
         | 
| 93 97 | 
             
                        details["available_tools"] = available_tools
         | 
| 94 98 | 
             
                        message += f". Available tools: {', '.join(available_tools)}"
         | 
| 95 | 
            -
             | 
| 99 | 
            +
             | 
| 96 100 | 
             
                    super().__init__(message, details)
         | 
| 97 101 |  | 
| 98 102 |  | 
| 99 103 | 
             
            class MCPServerError(MCPException):
         | 
| 100 104 | 
             
                """
         | 
| 101 105 | 
             
                Raised when MCP server encounters an error.
         | 
| 102 | 
            -
             | 
| 106 | 
            +
             | 
| 103 107 | 
             
                Common scenarios:
         | 
| 104 108 | 
             
                - Server initialization failure
         | 
| 105 109 | 
             
                - Port binding issues
         | 
| 106 110 | 
             
                - Server crash during operation
         | 
| 107 111 | 
             
                - Invalid server state transitions
         | 
| 108 112 | 
             
                """
         | 
| 109 | 
            -
             | 
| 110 | 
            -
                def __init__( | 
| 111 | 
            -
             | 
| 113 | 
            +
             | 
| 114 | 
            +
                def __init__(
         | 
| 115 | 
            +
                    self,
         | 
| 116 | 
            +
                    message: str,
         | 
| 117 | 
            +
                    server_state: Optional[str] = None,
         | 
| 118 | 
            +
                    error_code: Optional[int] = None,
         | 
| 119 | 
            +
                ):
         | 
| 112 120 | 
             
                    """
         | 
| 113 121 | 
             
                    Initialize server error.
         | 
| 114 | 
            -
             | 
| 122 | 
            +
             | 
| 115 123 | 
             
                    Args:
         | 
| 116 124 | 
             
                        message: Error message
         | 
| 117 125 | 
             
                        server_state: Current server state when error occurred
         | 
| @@ -122,26 +130,30 @@ class MCPServerError(MCPException): | |
| 122 130 | 
             
                        details["server_state"] = server_state
         | 
| 123 131 | 
             
                    if error_code:
         | 
| 124 132 | 
             
                        details["error_code"] = error_code
         | 
| 125 | 
            -
             | 
| 133 | 
            +
             | 
| 126 134 | 
             
                    super().__init__(message, details)
         | 
| 127 135 |  | 
| 128 136 |  | 
| 129 137 | 
             
            class MCPCommunicationError(MCPException):
         | 
| 130 138 | 
             
                """
         | 
| 131 139 | 
             
                Raised when communication with MCP client fails.
         | 
| 132 | 
            -
             | 
| 140 | 
            +
             | 
| 133 141 | 
             
                This includes:
         | 
| 134 142 | 
             
                - Stdio communication failures
         | 
| 135 143 | 
             
                - Message parsing errors
         | 
| 136 144 | 
             
                - Protocol violations
         | 
| 137 145 | 
             
                - Timeout errors
         | 
| 138 146 | 
             
                """
         | 
| 139 | 
            -
             | 
| 140 | 
            -
                def __init__( | 
| 141 | 
            -
             | 
| 147 | 
            +
             | 
| 148 | 
            +
                def __init__(
         | 
| 149 | 
            +
                    self,
         | 
| 150 | 
            +
                    message: str,
         | 
| 151 | 
            +
                    direction: Optional[str] = None,
         | 
| 152 | 
            +
                    raw_data: Optional[str] = None,
         | 
| 153 | 
            +
                ):
         | 
| 142 154 | 
             
                    """
         | 
| 143 155 | 
             
                    Initialize communication error.
         | 
| 144 | 
            -
             | 
| 156 | 
            +
             | 
| 145 157 | 
             
                    Args:
         | 
| 146 158 | 
             
                        message: Error message
         | 
| 147 159 | 
             
                        direction: Direction of communication ("send" or "receive")
         | 
| @@ -154,26 +166,31 @@ class MCPCommunicationError(MCPException): | |
| 154 166 | 
             
                        details["raw_data"] = raw_data
         | 
| 155 167 | 
             
                    elif raw_data:
         | 
| 156 168 | 
             
                        details["raw_data"] = raw_data[:1000] + "... (truncated)"
         | 
| 157 | 
            -
             | 
| 169 | 
            +
             | 
| 158 170 | 
             
                    super().__init__(message, details)
         | 
| 159 171 |  | 
| 160 172 |  | 
| 161 173 | 
             
            class MCPValidationError(MCPException):
         | 
| 162 174 | 
             
                """
         | 
| 163 175 | 
             
                Raised when validation fails.
         | 
| 164 | 
            -
             | 
| 176 | 
            +
             | 
| 165 177 | 
             
                Used for:
         | 
| 166 178 | 
             
                - Tool parameter validation
         | 
| 167 179 | 
             
                - Schema validation
         | 
| 168 180 | 
             
                - Input validation
         | 
| 169 181 | 
             
                - Response validation
         | 
| 170 182 | 
             
                """
         | 
| 171 | 
            -
             | 
| 172 | 
            -
                def __init__( | 
| 173 | 
            -
             | 
| 183 | 
            +
             | 
| 184 | 
            +
                def __init__(
         | 
| 185 | 
            +
                    self,
         | 
| 186 | 
            +
                    message: str,
         | 
| 187 | 
            +
                    field: Optional[str] = None,
         | 
| 188 | 
            +
                    expected: Optional[Any] = None,
         | 
| 189 | 
            +
                    actual: Optional[Any] = None,
         | 
| 190 | 
            +
                ):
         | 
| 174 191 | 
             
                    """
         | 
| 175 192 | 
             
                    Initialize validation error.
         | 
| 176 | 
            -
             | 
| 193 | 
            +
             | 
| 177 194 | 
             
                    Args:
         | 
| 178 195 | 
             
                        message: Error message
         | 
| 179 196 | 
             
                        field: Field that failed validation
         | 
| @@ -187,47 +204,44 @@ class MCPValidationError(MCPException): | |
| 187 204 | 
             
                        details["expected"] = str(expected)
         | 
| 188 205 | 
             
                    if actual is not None:
         | 
| 189 206 | 
             
                        details["actual"] = str(actual)
         | 
| 190 | 
            -
             | 
| 207 | 
            +
             | 
| 191 208 | 
             
                    super().__init__(message, details)
         | 
| 192 209 |  | 
| 193 210 |  | 
| 194 211 | 
             
            class MCPTimeoutError(MCPException):
         | 
| 195 212 | 
             
                """
         | 
| 196 213 | 
             
                Raised when an operation times out.
         | 
| 197 | 
            -
             | 
| 214 | 
            +
             | 
| 198 215 | 
             
                Common scenarios:
         | 
| 199 216 | 
             
                - Tool invocation timeout
         | 
| 200 217 | 
             
                - Server startup timeout
         | 
| 201 218 | 
             
                - Communication timeout
         | 
| 202 219 | 
             
                """
         | 
| 203 | 
            -
             | 
| 220 | 
            +
             | 
| 204 221 | 
             
                def __init__(self, operation: str, timeout_seconds: float):
         | 
| 205 222 | 
             
                    """
         | 
| 206 223 | 
             
                    Initialize timeout error.
         | 
| 207 | 
            -
             | 
| 224 | 
            +
             | 
| 208 225 | 
             
                    Args:
         | 
| 209 226 | 
             
                        operation: Operation that timed out
         | 
| 210 227 | 
             
                        timeout_seconds: Timeout duration in seconds
         | 
| 211 228 | 
             
                    """
         | 
| 212 229 | 
             
                    message = f"Operation '{operation}' timed out after {timeout_seconds} seconds"
         | 
| 213 | 
            -
                    details = {
         | 
| 214 | 
            -
                        "operation": operation,
         | 
| 215 | 
            -
                        "timeout_seconds": timeout_seconds
         | 
| 216 | 
            -
                    }
         | 
| 230 | 
            +
                    details = {"operation": operation, "timeout_seconds": timeout_seconds}
         | 
| 217 231 | 
             
                    super().__init__(message, details)
         | 
| 218 232 |  | 
| 219 233 |  | 
| 220 234 | 
             
            class MCPAuthenticationError(MCPException):
         | 
| 221 235 | 
             
                """
         | 
| 222 236 | 
             
                Raised when authentication fails.
         | 
| 223 | 
            -
             | 
| 237 | 
            +
             | 
| 224 238 | 
             
                For future use when MCP supports authentication.
         | 
| 225 239 | 
             
                """
         | 
| 226 | 
            -
             | 
| 240 | 
            +
             | 
| 227 241 | 
             
                def __init__(self, message: str, auth_method: Optional[str] = None):
         | 
| 228 242 | 
             
                    """
         | 
| 229 243 | 
             
                    Initialize authentication error.
         | 
| 230 | 
            -
             | 
| 244 | 
            +
             | 
| 231 245 | 
             
                    Args:
         | 
| 232 246 | 
             
                        message: Error message
         | 
| 233 247 | 
             
                        auth_method: Authentication method that failed
         | 
| @@ -235,5 +249,5 @@ class MCPAuthenticationError(MCPException): | |
| 235 249 | 
             
                    details = {}
         | 
| 236 250 | 
             
                    if auth_method:
         | 
| 237 251 | 
             
                        details["auth_method"] = auth_method
         | 
| 238 | 
            -
             | 
| 239 | 
            -
                    super().__init__(message, details)
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                    super().__init__(message, details)
         |