claude-mpm 3.9.11__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 +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 +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 +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 +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 -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 +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 +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/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 +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 +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 +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.3.dist-info}/METADATA +27 -1
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.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.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
| @@ -23,12 +23,12 @@ DESIGN DECISIONS: | |
| 23 23 | 
             
            """
         | 
| 24 24 |  | 
| 25 25 | 
             
            import asyncio
         | 
| 26 | 
            +
            import json
         | 
| 26 27 | 
             
            import platform
         | 
| 28 | 
            +
            import re
         | 
| 27 29 | 
             
            import sys
         | 
| 28 30 | 
             
            from datetime import datetime
         | 
| 29 | 
            -
            from typing import Any, Dict,  | 
| 30 | 
            -
            import json
         | 
| 31 | 
            -
            import re
         | 
| 31 | 
            +
            from typing import Any, Dict, List, Optional
         | 
| 32 32 |  | 
| 33 33 | 
             
            from claude_mpm.services.mcp_gateway.core.interfaces import (
         | 
| 34 34 | 
             
                MCPToolDefinition,
         | 
| @@ -41,10 +41,10 @@ from claude_mpm.services.mcp_gateway.tools.base_adapter import BaseToolAdapter | |
| 41 41 | 
             
            class HelloWorldTool(BaseToolAdapter):
         | 
| 42 42 | 
             
                """
         | 
| 43 43 | 
             
                Comprehensive Hello World tool for MCP Gateway testing.
         | 
| 44 | 
            -
             | 
| 44 | 
            +
             | 
| 45 45 | 
             
                This tool provides multiple greeting variations to thoroughly test
         | 
| 46 46 | 
             
                the MCP Gateway's tool execution capabilities.
         | 
| 47 | 
            -
             | 
| 47 | 
            +
             | 
| 48 48 | 
             
                Features:
         | 
| 49 49 | 
             
                - Simple greeting: Basic echo functionality
         | 
| 50 50 | 
             
                - Personalized greeting: Name-based customization
         | 
| @@ -53,14 +53,14 @@ class HelloWorldTool(BaseToolAdapter): | |
| 53 53 | 
             
                - System info greeting: Integration with system information
         | 
| 54 54 | 
             
                - Async greeting: Tests async operation support
         | 
| 55 55 | 
             
                - Error scenarios: Validates error handling
         | 
| 56 | 
            -
             | 
| 56 | 
            +
             | 
| 57 57 | 
             
                TRADE-OFFS:
         | 
| 58 58 | 
             
                - Comprehensive testing vs simplicity: We chose comprehensive testing
         | 
| 59 59 | 
             
                  to ensure all MCP features work correctly
         | 
| 60 60 | 
             
                - Multiple variations vs single greeting: Multiple variations allow
         | 
| 61 61 | 
             
                  testing different parameter combinations and edge cases
         | 
| 62 62 | 
             
                """
         | 
| 63 | 
            -
             | 
| 63 | 
            +
             | 
| 64 64 | 
             
                # Supported languages for multi-language greetings
         | 
| 65 65 | 
             
                LANGUAGES = {
         | 
| 66 66 | 
             
                    "english": "Hello",
         | 
| @@ -87,18 +87,18 @@ class HelloWorldTool(BaseToolAdapter): | |
| 87 87 | 
             
                    "thai": "สวัสดี",
         | 
| 88 88 | 
             
                    "vietnamese": "Xin chào",
         | 
| 89 89 | 
             
                    "indonesian": "Halo",
         | 
| 90 | 
            -
                    "malay": "Hai"
         | 
| 90 | 
            +
                    "malay": "Hai",
         | 
| 91 91 | 
             
                }
         | 
| 92 | 
            -
             | 
| 92 | 
            +
             | 
| 93 93 | 
             
                # Time-based greeting thresholds
         | 
| 94 94 | 
             
                TIME_GREETINGS = {
         | 
| 95 95 | 
             
                    (0, 5): "Good night",
         | 
| 96 96 | 
             
                    (5, 12): "Good morning",
         | 
| 97 97 | 
             
                    (12, 17): "Good afternoon",
         | 
| 98 98 | 
             
                    (17, 21): "Good evening",
         | 
| 99 | 
            -
                    (21, 24): "Good night"
         | 
| 99 | 
            +
                    (21, 24): "Good night",
         | 
| 100 100 | 
             
                }
         | 
| 101 | 
            -
             | 
| 101 | 
            +
             | 
| 102 102 | 
             
                def __init__(self):
         | 
| 103 103 | 
             
                    """Initialize the Hello World tool with comprehensive schema."""
         | 
| 104 104 | 
             
                    definition = MCPToolDefinition(
         | 
| @@ -120,71 +120,68 @@ class HelloWorldTool(BaseToolAdapter): | |
| 120 120 | 
             
                                        "multi_language",
         | 
| 121 121 | 
             
                                        "system_info",
         | 
| 122 122 | 
             
                                        "async_test",
         | 
| 123 | 
            -
                                        "error_test"
         | 
| 123 | 
            +
                                        "error_test",
         | 
| 124 124 | 
             
                                    ],
         | 
| 125 125 | 
             
                                    "description": "The greeting mode to use",
         | 
| 126 | 
            -
                                    "default": "simple"
         | 
| 126 | 
            +
                                    "default": "simple",
         | 
| 127 127 | 
             
                                },
         | 
| 128 128 | 
             
                                "name": {
         | 
| 129 129 | 
             
                                    "type": "string",
         | 
| 130 130 | 
             
                                    "description": "Name for personalized greeting (required for personalized mode)",
         | 
| 131 131 | 
             
                                    "minLength": 1,
         | 
| 132 | 
            -
                                    "maxLength": 100
         | 
| 132 | 
            +
                                    "maxLength": 100,
         | 
| 133 133 | 
             
                                },
         | 
| 134 134 | 
             
                                "language": {
         | 
| 135 135 | 
             
                                    "type": "string",
         | 
| 136 136 | 
             
                                    "description": "Language for multi-language greeting",
         | 
| 137 137 | 
             
                                    "enum": list(self.LANGUAGES.keys()),
         | 
| 138 | 
            -
                                    "default": "english"
         | 
| 138 | 
            +
                                    "default": "english",
         | 
| 139 139 | 
             
                                },
         | 
| 140 140 | 
             
                                "delay_ms": {
         | 
| 141 141 | 
             
                                    "type": "number",
         | 
| 142 142 | 
             
                                    "description": "Delay in milliseconds for async test",
         | 
| 143 143 | 
             
                                    "minimum": 0,
         | 
| 144 144 | 
             
                                    "maximum": 5000,
         | 
| 145 | 
            -
                                    "default": 1000
         | 
| 145 | 
            +
                                    "default": 1000,
         | 
| 146 146 | 
             
                                },
         | 
| 147 147 | 
             
                                "error_type": {
         | 
| 148 148 | 
             
                                    "type": "string",
         | 
| 149 149 | 
             
                                    "enum": ["validation", "runtime", "timeout"],
         | 
| 150 150 | 
             
                                    "description": "Type of error to simulate for error_test mode",
         | 
| 151 | 
            -
                                    "default": "validation"
         | 
| 151 | 
            +
                                    "default": "validation",
         | 
| 152 152 | 
             
                                },
         | 
| 153 153 | 
             
                                "include_metadata": {
         | 
| 154 154 | 
             
                                    "type": "boolean",
         | 
| 155 155 | 
             
                                    "description": "Whether to include detailed metadata in response",
         | 
| 156 | 
            -
                                    "default": True
         | 
| 156 | 
            +
                                    "default": True,
         | 
| 157 157 | 
             
                                },
         | 
| 158 158 | 
             
                                "uppercase": {
         | 
| 159 159 | 
             
                                    "type": "boolean",
         | 
| 160 160 | 
             
                                    "description": "Convert greeting to uppercase",
         | 
| 161 | 
            -
                                    "default": False
         | 
| 161 | 
            +
                                    "default": False,
         | 
| 162 162 | 
             
                                },
         | 
| 163 163 | 
             
                                "repeat": {
         | 
| 164 164 | 
             
                                    "type": "number",
         | 
| 165 165 | 
             
                                    "description": "Number of times to repeat the greeting",
         | 
| 166 166 | 
             
                                    "minimum": 1,
         | 
| 167 167 | 
             
                                    "maximum": 10,
         | 
| 168 | 
            -
                                    "default": 1
         | 
| 169 | 
            -
                                }
         | 
| 168 | 
            +
                                    "default": 1,
         | 
| 169 | 
            +
                                },
         | 
| 170 170 | 
             
                            },
         | 
| 171 171 | 
             
                            "required": ["mode"],
         | 
| 172 | 
            -
                            "additionalProperties": False
         | 
| 172 | 
            +
                            "additionalProperties": False,
         | 
| 173 173 | 
             
                        },
         | 
| 174 174 | 
             
                        output_schema={
         | 
| 175 175 | 
             
                            "type": "object",
         | 
| 176 176 | 
             
                            "properties": {
         | 
| 177 177 | 
             
                                "greeting": {
         | 
| 178 178 | 
             
                                    "type": "string",
         | 
| 179 | 
            -
                                    "description": "The generated greeting message"
         | 
| 180 | 
            -
                                },
         | 
| 181 | 
            -
                                "mode": {
         | 
| 182 | 
            -
                                    "type": "string",
         | 
| 183 | 
            -
                                    "description": "The mode that was used"
         | 
| 179 | 
            +
                                    "description": "The generated greeting message",
         | 
| 184 180 | 
             
                                },
         | 
| 181 | 
            +
                                "mode": {"type": "string", "description": "The mode that was used"},
         | 
| 185 182 | 
             
                                "timestamp": {
         | 
| 186 183 | 
             
                                    "type": "string",
         | 
| 187 | 
            -
                                    "description": "ISO timestamp when greeting was generated"
         | 
| 184 | 
            +
                                    "description": "ISO timestamp when greeting was generated",
         | 
| 188 185 | 
             
                                },
         | 
| 189 186 | 
             
                                "metadata": {
         | 
| 190 187 | 
             
                                    "type": "object",
         | 
| @@ -192,132 +189,139 @@ class HelloWorldTool(BaseToolAdapter): | |
| 192 189 | 
             
                                    "properties": {
         | 
| 193 190 | 
             
                                        "tool_version": {"type": "string"},
         | 
| 194 191 | 
             
                                        "execution_environment": {"type": "object"},
         | 
| 195 | 
            -
                                        "parameters_used": {"type": "object"}
         | 
| 196 | 
            -
                                    }
         | 
| 197 | 
            -
                                }
         | 
| 198 | 
            -
                            }
         | 
| 199 | 
            -
                        }
         | 
| 192 | 
            +
                                        "parameters_used": {"type": "object"},
         | 
| 193 | 
            +
                                    },
         | 
| 194 | 
            +
                                },
         | 
| 195 | 
            +
                            },
         | 
| 196 | 
            +
                        },
         | 
| 200 197 | 
             
                    )
         | 
| 201 198 | 
             
                    super().__init__(definition)
         | 
| 202 | 
            -
             | 
| 199 | 
            +
             | 
| 203 200 | 
             
                    # Tool version for tracking
         | 
| 204 201 | 
             
                    self.version = "1.0.0"
         | 
| 205 | 
            -
             | 
| 202 | 
            +
             | 
| 206 203 | 
             
                    # Track greeting history for analytics
         | 
| 207 204 | 
             
                    self.greeting_history: List[Dict[str, Any]] = []
         | 
| 208 205 | 
             
                    self.max_history_size = 100
         | 
| 209 | 
            -
             | 
| 206 | 
            +
             | 
| 210 207 | 
             
                def validate_parameters(self, parameters: Dict[str, Any]) -> bool:
         | 
| 211 208 | 
             
                    """
         | 
| 212 209 | 
             
                    Enhanced parameter validation with detailed error messages.
         | 
| 213 | 
            -
             | 
| 210 | 
            +
             | 
| 214 211 | 
             
                    Args:
         | 
| 215 212 | 
             
                        parameters: Parameters to validate
         | 
| 216 | 
            -
             | 
| 213 | 
            +
             | 
| 217 214 | 
             
                    Returns:
         | 
| 218 215 | 
             
                        True if parameters are valid, False otherwise
         | 
| 219 216 | 
             
                    """
         | 
| 220 217 | 
             
                    # First do base validation
         | 
| 221 218 | 
             
                    if not super().validate_parameters(parameters):
         | 
| 222 219 | 
             
                        return False
         | 
| 223 | 
            -
             | 
| 220 | 
            +
             | 
| 224 221 | 
             
                    mode = parameters.get("mode", "simple")
         | 
| 225 | 
            -
             | 
| 222 | 
            +
             | 
| 226 223 | 
             
                    # Validate mode is in allowed enum
         | 
| 227 | 
            -
                    valid_modes = [ | 
| 228 | 
            -
             | 
| 224 | 
            +
                    valid_modes = [
         | 
| 225 | 
            +
                        "simple",
         | 
| 226 | 
            +
                        "personalized",
         | 
| 227 | 
            +
                        "time_based",
         | 
| 228 | 
            +
                        "multi_language",
         | 
| 229 | 
            +
                        "system_info",
         | 
| 230 | 
            +
                        "async_test",
         | 
| 231 | 
            +
                        "error_test",
         | 
| 232 | 
            +
                    ]
         | 
| 229 233 | 
             
                    if mode not in valid_modes:
         | 
| 230 234 | 
             
                        self.log_error(f"Invalid mode: {mode}. Must be one of {valid_modes}")
         | 
| 231 235 | 
             
                        return False
         | 
| 232 | 
            -
             | 
| 236 | 
            +
             | 
| 233 237 | 
             
                    # Mode-specific validation
         | 
| 234 238 | 
             
                    if mode == "personalized":
         | 
| 235 239 | 
             
                        if "name" not in parameters or not parameters["name"]:
         | 
| 236 240 | 
             
                            self.log_error("Personalized mode requires 'name' parameter")
         | 
| 237 241 | 
             
                            return False
         | 
| 238 | 
            -
             | 
| 242 | 
            +
             | 
| 239 243 | 
             
                        # Validate name format (alphanumeric and basic punctuation)
         | 
| 240 244 | 
             
                        name = parameters["name"]
         | 
| 241 245 | 
             
                        if not re.match(r"^[a-zA-Z0-9\s\-\'\.]+$", name):
         | 
| 242 246 | 
             
                            self.log_error(f"Invalid name format: {name}")
         | 
| 243 247 | 
             
                            return False
         | 
| 244 | 
            -
             | 
| 248 | 
            +
             | 
| 245 249 | 
             
                    elif mode == "multi_language":
         | 
| 246 250 | 
             
                        language = parameters.get("language", "english")
         | 
| 247 251 | 
             
                        if language not in self.LANGUAGES:
         | 
| 248 252 | 
             
                            self.log_error(f"Unsupported language: {language}")
         | 
| 249 253 | 
             
                            return False
         | 
| 250 | 
            -
             | 
| 254 | 
            +
             | 
| 251 255 | 
             
                    elif mode == "async_test":
         | 
| 252 256 | 
             
                        delay = parameters.get("delay_ms", 1000)
         | 
| 253 257 | 
             
                        if not isinstance(delay, (int, float)) or delay < 0 or delay > 5000:
         | 
| 254 258 | 
             
                            self.log_error(f"Invalid delay_ms: {delay} (must be 0-5000)")
         | 
| 255 259 | 
             
                            return False
         | 
| 256 | 
            -
             | 
| 260 | 
            +
             | 
| 257 261 | 
             
                    elif mode == "error_test":
         | 
| 258 262 | 
             
                        error_type = parameters.get("error_type", "validation")
         | 
| 259 263 | 
             
                        if error_type not in ["validation", "runtime", "timeout"]:
         | 
| 260 264 | 
             
                            self.log_error(f"Invalid error_type: {error_type}")
         | 
| 261 265 | 
             
                            return False
         | 
| 262 | 
            -
             | 
| 266 | 
            +
             | 
| 263 267 | 
             
                    # Validate common parameters
         | 
| 264 268 | 
             
                    repeat = parameters.get("repeat", 1)
         | 
| 265 269 | 
             
                    if not isinstance(repeat, int) or repeat < 1 or repeat > 10:
         | 
| 266 270 | 
             
                        self.log_error(f"Invalid repeat value: {repeat} (must be 1-10)")
         | 
| 267 271 | 
             
                        return False
         | 
| 268 | 
            -
             | 
| 272 | 
            +
             | 
| 269 273 | 
             
                    return True
         | 
| 270 | 
            -
             | 
| 274 | 
            +
             | 
| 271 275 | 
             
                async def initialize(self) -> bool:
         | 
| 272 276 | 
             
                    """
         | 
| 273 277 | 
             
                    Initialize the Hello World tool.
         | 
| 274 | 
            -
             | 
| 278 | 
            +
             | 
| 275 279 | 
             
                    Returns:
         | 
| 276 280 | 
             
                        True if initialization successful
         | 
| 277 281 | 
             
                    """
         | 
| 278 282 | 
             
                    try:
         | 
| 279 283 | 
             
                        self.log_info(f"Initializing Hello World Tool v{self.version}")
         | 
| 280 | 
            -
             | 
| 284 | 
            +
             | 
| 281 285 | 
             
                        # Clear greeting history
         | 
| 282 286 | 
             
                        self.greeting_history.clear()
         | 
| 283 | 
            -
             | 
| 287 | 
            +
             | 
| 284 288 | 
             
                        # Mark as initialized
         | 
| 285 289 | 
             
                        self._initialized = True
         | 
| 286 | 
            -
             | 
| 290 | 
            +
             | 
| 287 291 | 
             
                        self.log_info("Hello World Tool initialized successfully")
         | 
| 288 292 | 
             
                        return True
         | 
| 289 | 
            -
             | 
| 293 | 
            +
             | 
| 290 294 | 
             
                    except Exception as e:
         | 
| 291 295 | 
             
                        self.log_error(f"Failed to initialize Hello World Tool: {e}")
         | 
| 292 296 | 
             
                        return False
         | 
| 293 | 
            -
             | 
| 297 | 
            +
             | 
| 294 298 | 
             
                async def invoke(self, invocation: MCPToolInvocation) -> MCPToolResult:
         | 
| 295 299 | 
             
                    """
         | 
| 296 300 | 
             
                    Invoke the Hello World tool with the specified mode.
         | 
| 297 | 
            -
             | 
| 301 | 
            +
             | 
| 298 302 | 
             
                    Args:
         | 
| 299 303 | 
             
                        invocation: Tool invocation request
         | 
| 300 | 
            -
             | 
| 304 | 
            +
             | 
| 301 305 | 
             
                    Returns:
         | 
| 302 306 | 
             
                        Tool execution result with greeting
         | 
| 303 307 | 
             
                    """
         | 
| 304 308 | 
             
                    start_time = datetime.now()
         | 
| 305 | 
            -
             | 
| 309 | 
            +
             | 
| 306 310 | 
             
                    try:
         | 
| 307 311 | 
             
                        # Validate parameters
         | 
| 308 312 | 
             
                        if not self.validate_parameters(invocation.parameters):
         | 
| 309 313 | 
             
                            return MCPToolResult(
         | 
| 310 314 | 
             
                                success=False,
         | 
| 311 315 | 
             
                                error="Parameter validation failed",
         | 
| 312 | 
            -
                                execution_time=0.0
         | 
| 316 | 
            +
                                execution_time=0.0,
         | 
| 313 317 | 
             
                            )
         | 
| 314 | 
            -
             | 
| 318 | 
            +
             | 
| 315 319 | 
             
                        # Extract parameters
         | 
| 316 320 | 
             
                        mode = invocation.parameters.get("mode", "simple")
         | 
| 317 321 | 
             
                        include_metadata = invocation.parameters.get("include_metadata", True)
         | 
| 318 322 | 
             
                        uppercase = invocation.parameters.get("uppercase", False)
         | 
| 319 323 | 
             
                        repeat = invocation.parameters.get("repeat", 1)
         | 
| 320 | 
            -
             | 
| 324 | 
            +
             | 
| 321 325 | 
             
                        # Generate greeting based on mode
         | 
| 322 326 | 
             
                        if mode == "simple":
         | 
| 323 327 | 
             
                            greeting = await self._simple_greeting()
         | 
| @@ -340,24 +344,24 @@ class HelloWorldTool(BaseToolAdapter): | |
| 340 344 | 
             
                            return await self._error_test(error_type)
         | 
| 341 345 | 
             
                        else:
         | 
| 342 346 | 
             
                            greeting = f"Hello World! (Unknown mode: {mode})"
         | 
| 343 | 
            -
             | 
| 347 | 
            +
             | 
| 344 348 | 
             
                        # Apply transformations
         | 
| 345 349 | 
             
                        if uppercase:
         | 
| 346 350 | 
             
                            greeting = greeting.upper()
         | 
| 347 | 
            -
             | 
| 351 | 
            +
             | 
| 348 352 | 
             
                        if repeat > 1:
         | 
| 349 353 | 
             
                            greeting = " ".join([greeting] * repeat)
         | 
| 350 | 
            -
             | 
| 354 | 
            +
             | 
| 351 355 | 
             
                        # Calculate execution time
         | 
| 352 356 | 
             
                        execution_time = (datetime.now() - start_time).total_seconds()
         | 
| 353 | 
            -
             | 
| 357 | 
            +
             | 
| 354 358 | 
             
                        # Build response data
         | 
| 355 359 | 
             
                        response_data = {
         | 
| 356 360 | 
             
                            "greeting": greeting,
         | 
| 357 361 | 
             
                            "mode": mode,
         | 
| 358 | 
            -
                            "timestamp": datetime.now().isoformat()
         | 
| 362 | 
            +
                            "timestamp": datetime.now().isoformat(),
         | 
| 359 363 | 
             
                        }
         | 
| 360 | 
            -
             | 
| 364 | 
            +
             | 
| 361 365 | 
             
                        # Add metadata if requested
         | 
| 362 366 | 
             
                        if include_metadata:
         | 
| 363 367 | 
             
                            response_data["metadata"] = {
         | 
| @@ -365,96 +369,94 @@ class HelloWorldTool(BaseToolAdapter): | |
| 365 369 | 
             
                                "execution_environment": {
         | 
| 366 370 | 
             
                                    "platform": platform.platform(),
         | 
| 367 371 | 
             
                                    "python_version": sys.version,
         | 
| 368 | 
            -
                                    "processor": platform.processor() or "unknown"
         | 
| 372 | 
            +
                                    "processor": platform.processor() or "unknown",
         | 
| 369 373 | 
             
                                },
         | 
| 370 374 | 
             
                                "parameters_used": invocation.parameters,
         | 
| 371 | 
            -
                                "execution_time_ms": execution_time * 1000
         | 
| 375 | 
            +
                                "execution_time_ms": execution_time * 1000,
         | 
| 372 376 | 
             
                            }
         | 
| 373 | 
            -
             | 
| 377 | 
            +
             | 
| 374 378 | 
             
                        # Track in history
         | 
| 375 379 | 
             
                        self._add_to_history(mode, greeting, execution_time)
         | 
| 376 | 
            -
             | 
| 380 | 
            +
             | 
| 377 381 | 
             
                        # Update metrics
         | 
| 378 382 | 
             
                        self._update_metrics(True, execution_time)
         | 
| 379 | 
            -
             | 
| 383 | 
            +
             | 
| 380 384 | 
             
                        return MCPToolResult(
         | 
| 381 385 | 
             
                            success=True,
         | 
| 382 386 | 
             
                            data=response_data,
         | 
| 383 387 | 
             
                            execution_time=execution_time,
         | 
| 384 | 
            -
                            metadata={
         | 
| 385 | 
            -
                                "tool": "hello_world",
         | 
| 386 | 
            -
                                "version": self.version,
         | 
| 387 | 
            -
                                "mode": mode
         | 
| 388 | 
            -
                            }
         | 
| 388 | 
            +
                            metadata={"tool": "hello_world", "version": self.version, "mode": mode},
         | 
| 389 389 | 
             
                        )
         | 
| 390 | 
            -
             | 
| 390 | 
            +
             | 
| 391 391 | 
             
                    except Exception as e:
         | 
| 392 392 | 
             
                        execution_time = (datetime.now() - start_time).total_seconds()
         | 
| 393 393 | 
             
                        self._update_metrics(False, execution_time)
         | 
| 394 394 | 
             
                        self._metrics["last_error"] = str(e)
         | 
| 395 | 
            -
             | 
| 395 | 
            +
             | 
| 396 396 | 
             
                        return MCPToolResult(
         | 
| 397 397 | 
             
                            success=False,
         | 
| 398 398 | 
             
                            error=f"Hello World tool failed: {str(e)}",
         | 
| 399 | 
            -
                            execution_time=execution_time
         | 
| 399 | 
            +
                            execution_time=execution_time,
         | 
| 400 400 | 
             
                        )
         | 
| 401 | 
            -
             | 
| 401 | 
            +
             | 
| 402 402 | 
             
                async def _simple_greeting(self) -> str:
         | 
| 403 403 | 
             
                    """Generate a simple greeting."""
         | 
| 404 404 | 
             
                    return "Hello World!"
         | 
| 405 | 
            -
             | 
| 405 | 
            +
             | 
| 406 406 | 
             
                async def _personalized_greeting(self, name: str) -> str:
         | 
| 407 407 | 
             
                    """Generate a personalized greeting."""
         | 
| 408 408 | 
             
                    return f"Hello, {name}! Welcome to the MCP Gateway."
         | 
| 409 | 
            -
             | 
| 409 | 
            +
             | 
| 410 410 | 
             
                async def _time_based_greeting(self) -> str:
         | 
| 411 411 | 
             
                    """Generate a greeting based on current time."""
         | 
| 412 412 | 
             
                    current_hour = datetime.now().hour
         | 
| 413 | 
            -
             | 
| 413 | 
            +
             | 
| 414 414 | 
             
                    for (start, end), greeting in self.TIME_GREETINGS.items():
         | 
| 415 415 | 
             
                        if start <= current_hour < end:
         | 
| 416 416 | 
             
                            return f"{greeting}! It's {datetime.now().strftime('%I:%M %p')}."
         | 
| 417 | 
            -
             | 
| 417 | 
            +
             | 
| 418 418 | 
             
                    return "Hello! Time is a curious thing."
         | 
| 419 | 
            -
             | 
| 420 | 
            -
                async def _multi_language_greeting( | 
| 419 | 
            +
             | 
| 420 | 
            +
                async def _multi_language_greeting(
         | 
| 421 | 
            +
                    self, language: str, name: Optional[str] = None
         | 
| 422 | 
            +
                ) -> str:
         | 
| 421 423 | 
             
                    """Generate a greeting in the specified language."""
         | 
| 422 424 | 
             
                    greeting_word = self.LANGUAGES.get(language, "Hello")
         | 
| 423 | 
            -
             | 
| 425 | 
            +
             | 
| 424 426 | 
             
                    if name:
         | 
| 425 427 | 
             
                        # Add name if provided (works for most languages)
         | 
| 426 428 | 
             
                        return f"{greeting_word}, {name}!"
         | 
| 427 429 | 
             
                    else:
         | 
| 428 430 | 
             
                        return f"{greeting_word}, World!"
         | 
| 429 | 
            -
             | 
| 431 | 
            +
             | 
| 430 432 | 
             
                async def _system_info_greeting(self) -> str:
         | 
| 431 433 | 
             
                    """Generate a greeting with system information."""
         | 
| 432 434 | 
             
                    system = platform.system()
         | 
| 433 435 | 
             
                    node = platform.node()
         | 
| 434 436 | 
             
                    py_version = platform.python_version()
         | 
| 435 | 
            -
             | 
| 437 | 
            +
             | 
| 436 438 | 
             
                    return (
         | 
| 437 439 | 
             
                        f"Hello from {system} on {node}! "
         | 
| 438 440 | 
             
                        f"Running Python {py_version} with MCP Gateway."
         | 
| 439 441 | 
             
                    )
         | 
| 440 | 
            -
             | 
| 442 | 
            +
             | 
| 441 443 | 
             
                async def _async_greeting(self, delay_ms: int) -> str:
         | 
| 442 444 | 
             
                    """Generate a greeting after an async delay."""
         | 
| 443 445 | 
             
                    self.log_info(f"Starting async greeting with {delay_ms}ms delay")
         | 
| 444 | 
            -
             | 
| 446 | 
            +
             | 
| 445 447 | 
             
                    # Convert milliseconds to seconds for asyncio.sleep
         | 
| 446 448 | 
             
                    delay_seconds = delay_ms / 1000.0
         | 
| 447 449 | 
             
                    await asyncio.sleep(delay_seconds)
         | 
| 448 | 
            -
             | 
| 450 | 
            +
             | 
| 449 451 | 
             
                    return f"Hello World! (after {delay_ms}ms async delay)"
         | 
| 450 | 
            -
             | 
| 452 | 
            +
             | 
| 451 453 | 
             
                async def _error_test(self, error_type: str) -> MCPToolResult:
         | 
| 452 454 | 
             
                    """Simulate various error conditions for testing."""
         | 
| 453 455 | 
             
                    if error_type == "validation":
         | 
| 454 456 | 
             
                        return MCPToolResult(
         | 
| 455 457 | 
             
                            success=False,
         | 
| 456 458 | 
             
                            error="Simulated validation error: Invalid input parameters",
         | 
| 457 | 
            -
                            execution_time=0.001
         | 
| 459 | 
            +
                            execution_time=0.001,
         | 
| 458 460 | 
             
                        )
         | 
| 459 461 | 
             
                    elif error_type == "runtime":
         | 
| 460 462 | 
             
                        # Simulate a runtime error
         | 
| @@ -463,21 +465,19 @@ class HelloWorldTool(BaseToolAdapter): | |
| 463 465 | 
             
                        # Simulate a timeout by sleeping longer than reasonable
         | 
| 464 466 | 
             
                        await asyncio.sleep(10)  # This would typically trigger a timeout
         | 
| 465 467 | 
             
                        return MCPToolResult(
         | 
| 466 | 
            -
                            success=False,
         | 
| 467 | 
            -
                            error="Operation timed out",
         | 
| 468 | 
            -
                            execution_time=10.0
         | 
| 468 | 
            +
                            success=False, error="Operation timed out", execution_time=10.0
         | 
| 469 469 | 
             
                        )
         | 
| 470 470 | 
             
                    else:
         | 
| 471 471 | 
             
                        return MCPToolResult(
         | 
| 472 472 | 
             
                            success=False,
         | 
| 473 473 | 
             
                            error=f"Unknown error type: {error_type}",
         | 
| 474 | 
            -
                            execution_time=0.001
         | 
| 474 | 
            +
                            execution_time=0.001,
         | 
| 475 475 | 
             
                        )
         | 
| 476 | 
            -
             | 
| 476 | 
            +
             | 
| 477 477 | 
             
                def _add_to_history(self, mode: str, greeting: str, execution_time: float) -> None:
         | 
| 478 478 | 
             
                    """
         | 
| 479 479 | 
             
                    Add greeting to history for analytics.
         | 
| 480 | 
            -
             | 
| 480 | 
            +
             | 
| 481 481 | 
             
                    Args:
         | 
| 482 482 | 
             
                        mode: Greeting mode used
         | 
| 483 483 | 
             
                        greeting: Generated greeting
         | 
| @@ -487,19 +487,19 @@ class HelloWorldTool(BaseToolAdapter): | |
| 487 487 | 
             
                        "timestamp": datetime.now().isoformat(),
         | 
| 488 488 | 
             
                        "mode": mode,
         | 
| 489 489 | 
             
                        "greeting": greeting[:100],  # Truncate long greetings
         | 
| 490 | 
            -
                        "execution_time": execution_time
         | 
| 490 | 
            +
                        "execution_time": execution_time,
         | 
| 491 491 | 
             
                    }
         | 
| 492 | 
            -
             | 
| 492 | 
            +
             | 
| 493 493 | 
             
                    self.greeting_history.append(entry)
         | 
| 494 | 
            -
             | 
| 494 | 
            +
             | 
| 495 495 | 
             
                    # Maintain history size limit
         | 
| 496 496 | 
             
                    if len(self.greeting_history) > self.max_history_size:
         | 
| 497 497 | 
             
                        self.greeting_history.pop(0)
         | 
| 498 | 
            -
             | 
| 498 | 
            +
             | 
| 499 499 | 
             
                def get_analytics(self) -> Dict[str, Any]:
         | 
| 500 500 | 
             
                    """
         | 
| 501 501 | 
             
                    Get analytics about tool usage.
         | 
| 502 | 
            -
             | 
| 502 | 
            +
             | 
| 503 503 | 
             
                    Returns:
         | 
| 504 504 | 
             
                        Analytics dictionary with usage statistics
         | 
| 505 505 | 
             
                    """
         | 
| @@ -508,44 +508,46 @@ class HelloWorldTool(BaseToolAdapter): | |
| 508 508 | 
             
                            "total_greetings": 0,
         | 
| 509 509 | 
             
                            "modes_used": {},
         | 
| 510 510 | 
             
                            "average_execution_time": 0.0,
         | 
| 511 | 
            -
                            "last_greeting": None
         | 
| 511 | 
            +
                            "last_greeting": None,
         | 
| 512 512 | 
             
                        }
         | 
| 513 | 
            -
             | 
| 513 | 
            +
             | 
| 514 514 | 
             
                    # Calculate mode usage
         | 
| 515 515 | 
             
                    modes_used = {}
         | 
| 516 516 | 
             
                    total_time = 0.0
         | 
| 517 | 
            -
             | 
| 517 | 
            +
             | 
| 518 518 | 
             
                    for entry in self.greeting_history:
         | 
| 519 519 | 
             
                        mode = entry["mode"]
         | 
| 520 520 | 
             
                        modes_used[mode] = modes_used.get(mode, 0) + 1
         | 
| 521 521 | 
             
                        total_time += entry["execution_time"]
         | 
| 522 | 
            -
             | 
| 522 | 
            +
             | 
| 523 523 | 
             
                    return {
         | 
| 524 524 | 
             
                        "total_greetings": len(self.greeting_history),
         | 
| 525 525 | 
             
                        "modes_used": modes_used,
         | 
| 526 526 | 
             
                        "average_execution_time": total_time / len(self.greeting_history),
         | 
| 527 | 
            -
                        "last_greeting": self.greeting_history[-1] | 
| 528 | 
            -
                         | 
| 527 | 
            +
                        "last_greeting": self.greeting_history[-1]
         | 
| 528 | 
            +
                        if self.greeting_history
         | 
| 529 | 
            +
                        else None,
         | 
| 530 | 
            +
                        "metrics": self.get_metrics(),
         | 
| 529 531 | 
             
                    }
         | 
| 530 | 
            -
             | 
| 532 | 
            +
             | 
| 531 533 | 
             
                async def shutdown(self) -> None:
         | 
| 532 534 | 
             
                    """
         | 
| 533 535 | 
             
                    Shutdown the Hello World tool and clean up resources.
         | 
| 534 536 | 
             
                    """
         | 
| 535 537 | 
             
                    try:
         | 
| 536 538 | 
             
                        self.log_info(f"Shutting down Hello World Tool v{self.version}")
         | 
| 537 | 
            -
             | 
| 539 | 
            +
             | 
| 538 540 | 
             
                        # Log final analytics
         | 
| 539 541 | 
             
                        analytics = self.get_analytics()
         | 
| 540 542 | 
             
                        self.log_info(f"Final analytics: {json.dumps(analytics, indent=2)}")
         | 
| 541 | 
            -
             | 
| 543 | 
            +
             | 
| 542 544 | 
             
                        # Clear history
         | 
| 543 545 | 
             
                        self.greeting_history.clear()
         | 
| 544 | 
            -
             | 
| 546 | 
            +
             | 
| 545 547 | 
             
                        # Mark as not initialized
         | 
| 546 548 | 
             
                        self._initialized = False
         | 
| 547 | 
            -
             | 
| 549 | 
            +
             | 
| 548 550 | 
             
                        self.log_info("Hello World Tool shutdown complete")
         | 
| 549 | 
            -
             | 
| 551 | 
            +
             | 
| 550 552 | 
             
                    except Exception as e:
         | 
| 551 | 
            -
                        self.log_error(f"Error during Hello World Tool shutdown: {e}")
         | 
| 553 | 
            +
                        self.log_error(f"Error during Hello World Tool shutdown: {e}")
         |