claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +1 -1
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +2 -2
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +140 -905
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +330 -86
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +363 -220
- claude_mpm/cli/parser.py +24 -1156
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +124 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/built/dashboard.js +2 -0
- claude_mpm/dashboard/static/built/socket-client.js +2 -0
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +133 -53
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +233 -199
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +30 -13
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +575 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +166 -64
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +185 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +19 -533
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
- claude_mpm-4.0.4.dist-info/RECORD +417 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/top_level.txt +0 -0
    
        claude_mpm/core/interfaces.py
    CHANGED
    
    | @@ -10,13 +10,13 @@ All new code should import from claude_mpm.services.core.interfaces | |
| 10 10 | 
             
            Part of TSK-0046: Service Layer Architecture Reorganization
         | 
| 11 11 |  | 
| 12 12 | 
             
            Original description:
         | 
| 13 | 
            -
            This module defines the core service interfaces that establish contracts for | 
| 13 | 
            +
            This module defines the core service interfaces that establish contracts for
         | 
| 14 14 | 
             
            dependency injection, service discovery, and framework orchestration.
         | 
| 15 15 |  | 
| 16 16 | 
             
            Phase 1 Refactoring: Interface extraction and dependency injection foundation
         | 
| 17 17 | 
             
            - IServiceContainer: Dependency injection container
         | 
| 18 18 | 
             
            - IAgentRegistry: Agent discovery and management
         | 
| 19 | 
            -
            - IPromptCache: Performance-critical caching | 
| 19 | 
            +
            - IPromptCache: Performance-critical caching
         | 
| 20 20 | 
             
            - IHealthMonitor: Service health monitoring
         | 
| 21 21 | 
             
            - IConfigurationManager: Configuration management
         | 
| 22 22 | 
             
            - ITemplateManager: Template processing and rendering
         | 
| @@ -25,46 +25,49 @@ Phase 1 Refactoring: Interface extraction and dependency injection foundation | |
| 25 25 | 
             
            These interfaces reduce cyclomatic complexity and establish clean separation of concerns.
         | 
| 26 26 | 
             
            """
         | 
| 27 27 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
            from claude_mpm.services.core.interfaces import *
         | 
| 28 | 
            +
            import asyncio
         | 
| 30 29 |  | 
| 31 30 | 
             
            # Keep original imports to prevent any parsing issues
         | 
| 32 31 | 
             
            from abc import ABC, abstractmethod
         | 
| 33 | 
            -
            from typing import Any, Dict, List, Optional, Set, Tuple, Union, TypeVar, Generic
         | 
| 34 32 | 
             
            from dataclasses import dataclass
         | 
| 35 33 | 
             
            from datetime import datetime
         | 
| 36 34 | 
             
            from pathlib import Path
         | 
| 37 | 
            -
            import  | 
| 35 | 
            +
            from typing import Any, Dict, Generic, List, Optional, Set, Tuple, TypeVar, Union
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            # Re-export everything from the new location for backward compatibility
         | 
| 38 | 
            +
            from claude_mpm.services.core.interfaces import *
         | 
| 38 39 |  | 
| 39 40 | 
             
            # Type variables for generic interfaces
         | 
| 40 | 
            -
            T = TypeVar( | 
| 41 | 
            -
            ServiceType = TypeVar( | 
| 41 | 
            +
            T = TypeVar("T")
         | 
| 42 | 
            +
            ServiceType = TypeVar("ServiceType")
         | 
| 42 43 |  | 
| 43 44 |  | 
| 44 45 | 
             
            # Core dependency injection interfaces
         | 
| 45 46 | 
             
            class IServiceContainer(ABC):
         | 
| 46 47 | 
             
                """Service container interface for dependency injection"""
         | 
| 47 | 
            -
             | 
| 48 | 
            +
             | 
| 48 49 | 
             
                @abstractmethod
         | 
| 49 | 
            -
                def register( | 
| 50 | 
            +
                def register(
         | 
| 51 | 
            +
                    self, service_type: type, implementation: type, singleton: bool = True
         | 
| 52 | 
            +
                ) -> None:
         | 
| 50 53 | 
             
                    """Register a service implementation"""
         | 
| 51 54 | 
             
                    pass
         | 
| 52 | 
            -
             | 
| 55 | 
            +
             | 
| 53 56 | 
             
                @abstractmethod
         | 
| 54 57 | 
             
                def register_instance(self, service_type: type, instance: Any) -> None:
         | 
| 55 58 | 
             
                    """Register a service instance"""
         | 
| 56 59 | 
             
                    pass
         | 
| 57 | 
            -
             | 
| 60 | 
            +
             | 
| 58 61 | 
             
                @abstractmethod
         | 
| 59 62 | 
             
                def resolve(self, service_type: type) -> Any:
         | 
| 60 63 | 
             
                    """Resolve a service by type"""
         | 
| 61 64 | 
             
                    pass
         | 
| 62 | 
            -
             | 
| 65 | 
            +
             | 
| 63 66 | 
             
                @abstractmethod
         | 
| 64 67 | 
             
                def resolve_all(self, service_type: type) -> List[Any]:
         | 
| 65 68 | 
             
                    """Resolve all implementations of a service type"""
         | 
| 66 69 | 
             
                    pass
         | 
| 67 | 
            -
             | 
| 70 | 
            +
             | 
| 68 71 | 
             
                @abstractmethod
         | 
| 69 72 | 
             
                def is_registered(self, service_type: type) -> bool:
         | 
| 70 73 | 
             
                    """Check if a service type is registered"""
         | 
| @@ -74,55 +77,56 @@ class IServiceContainer(ABC): | |
| 74 77 | 
             
            # Configuration management interfaces
         | 
| 75 78 | 
             
            class IConfigurationService(ABC):
         | 
| 76 79 | 
             
                """Interface for configuration service (legacy compatibility)"""
         | 
| 77 | 
            -
             | 
| 80 | 
            +
             | 
| 78 81 | 
             
                @abstractmethod
         | 
| 79 82 | 
             
                def get(self, key: str, default: Any = None) -> Any:
         | 
| 80 83 | 
             
                    """Get configuration value by key"""
         | 
| 81 84 | 
             
                    pass
         | 
| 82 | 
            -
             | 
| 85 | 
            +
             | 
| 83 86 | 
             
                @abstractmethod
         | 
| 84 87 | 
             
                def set(self, key: str, value: Any) -> None:
         | 
| 85 88 | 
             
                    """Set configuration value"""
         | 
| 86 89 | 
             
                    pass
         | 
| 87 | 
            -
             | 
| 90 | 
            +
             | 
| 88 91 | 
             
                @abstractmethod
         | 
| 89 92 | 
             
                def initialize(self) -> bool:
         | 
| 90 93 | 
             
                    """Initialize configuration service"""
         | 
| 91 94 | 
             
                    pass
         | 
| 92 | 
            -
             | 
| 95 | 
            +
             | 
| 93 96 | 
             
                @abstractmethod
         | 
| 94 97 | 
             
                def shutdown(self) -> None:
         | 
| 95 98 | 
             
                    """Shutdown configuration service"""
         | 
| 96 99 | 
             
                    pass
         | 
| 97 100 |  | 
| 101 | 
            +
             | 
| 98 102 | 
             
            class IConfigurationManager(ABC):
         | 
| 99 103 | 
             
                """Interface for configuration management and validation"""
         | 
| 100 | 
            -
             | 
| 104 | 
            +
             | 
| 101 105 | 
             
                @abstractmethod
         | 
| 102 106 | 
             
                def get(self, key: str, default: Any = None) -> Any:
         | 
| 103 107 | 
             
                    """Get configuration value by key"""
         | 
| 104 108 | 
             
                    pass
         | 
| 105 | 
            -
             | 
| 109 | 
            +
             | 
| 106 110 | 
             
                @abstractmethod
         | 
| 107 111 | 
             
                def set(self, key: str, value: Any) -> None:
         | 
| 108 112 | 
             
                    """Set configuration value"""
         | 
| 109 113 | 
             
                    pass
         | 
| 110 | 
            -
             | 
| 114 | 
            +
             | 
| 111 115 | 
             
                @abstractmethod
         | 
| 112 116 | 
             
                def get_section(self, section: str) -> Dict[str, Any]:
         | 
| 113 117 | 
             
                    """Get entire configuration section"""
         | 
| 114 118 | 
             
                    pass
         | 
| 115 | 
            -
             | 
| 119 | 
            +
             | 
| 116 120 | 
             
                @abstractmethod
         | 
| 117 121 | 
             
                def validate_schema(self, schema: Dict[str, Any]) -> bool:
         | 
| 118 122 | 
             
                    """Validate configuration against schema"""
         | 
| 119 123 | 
             
                    pass
         | 
| 120 | 
            -
             | 
| 124 | 
            +
             | 
| 121 125 | 
             
                @abstractmethod
         | 
| 122 126 | 
             
                def reload(self) -> None:
         | 
| 123 127 | 
             
                    """Reload configuration from sources"""
         | 
| 124 128 | 
             
                    pass
         | 
| 125 | 
            -
             | 
| 129 | 
            +
             | 
| 126 130 | 
             
                @abstractmethod
         | 
| 127 131 | 
             
                def watch_changes(self, callback: callable) -> None:
         | 
| 128 132 | 
             
                    """Watch for configuration changes"""
         | 
| @@ -132,32 +136,32 @@ class IConfigurationManager(ABC): | |
| 132 136 | 
             
            # Cache service interface
         | 
| 133 137 | 
             
            class ICacheService(ABC):
         | 
| 134 138 | 
             
                """Interface for cache service operations"""
         | 
| 135 | 
            -
             | 
| 139 | 
            +
             | 
| 136 140 | 
             
                @abstractmethod
         | 
| 137 141 | 
             
                def get(self, key: str) -> Any:
         | 
| 138 142 | 
             
                    """Get value from cache"""
         | 
| 139 143 | 
             
                    pass
         | 
| 140 | 
            -
             | 
| 144 | 
            +
             | 
| 141 145 | 
             
                @abstractmethod
         | 
| 142 146 | 
             
                def set(self, key: str, value: Any, ttl: Optional[int] = None) -> None:
         | 
| 143 147 | 
             
                    """Set value in cache with optional TTL"""
         | 
| 144 148 | 
             
                    pass
         | 
| 145 | 
            -
             | 
| 149 | 
            +
             | 
| 146 150 | 
             
                @abstractmethod
         | 
| 147 151 | 
             
                def delete(self, key: str) -> bool:
         | 
| 148 152 | 
             
                    """Delete key from cache"""
         | 
| 149 153 | 
             
                    pass
         | 
| 150 | 
            -
             | 
| 154 | 
            +
             | 
| 151 155 | 
             
                @abstractmethod
         | 
| 152 156 | 
             
                def invalidate(self, pattern: str) -> int:
         | 
| 153 157 | 
             
                    """Invalidate keys matching pattern"""
         | 
| 154 158 | 
             
                    pass
         | 
| 155 | 
            -
             | 
| 159 | 
            +
             | 
| 156 160 | 
             
                @abstractmethod
         | 
| 157 161 | 
             
                def clear(self) -> None:
         | 
| 158 162 | 
             
                    """Clear all cache entries"""
         | 
| 159 163 | 
             
                    pass
         | 
| 160 | 
            -
             | 
| 164 | 
            +
             | 
| 161 165 | 
             
                @abstractmethod
         | 
| 162 166 | 
             
                def get_cache_metrics(self) -> Dict[str, Any]:
         | 
| 163 167 | 
             
                    """Get cache performance metrics"""
         | 
| @@ -168,6 +172,7 @@ class ICacheService(ABC): | |
| 168 172 | 
             
            @dataclass
         | 
| 169 173 | 
             
            class HealthStatus:
         | 
| 170 174 | 
             
                """Health status data structure"""
         | 
| 175 | 
            +
             | 
| 171 176 | 
             
                status: str  # healthy, degraded, unhealthy, unknown
         | 
| 172 177 | 
             
                message: str
         | 
| 173 178 | 
             
                timestamp: datetime
         | 
| @@ -177,27 +182,27 @@ class HealthStatus: | |
| 177 182 |  | 
| 178 183 | 
             
            class IHealthMonitor(ABC):
         | 
| 179 184 | 
             
                """Interface for service health monitoring"""
         | 
| 180 | 
            -
             | 
| 185 | 
            +
             | 
| 181 186 | 
             
                @abstractmethod
         | 
| 182 187 | 
             
                async def check_health(self, service_name: str) -> HealthStatus:
         | 
| 183 188 | 
             
                    """Check health of a specific service"""
         | 
| 184 189 | 
             
                    pass
         | 
| 185 | 
            -
             | 
| 190 | 
            +
             | 
| 186 191 | 
             
                @abstractmethod
         | 
| 187 192 | 
             
                async def get_system_health(self) -> HealthStatus:
         | 
| 188 193 | 
             
                    """Get overall system health"""
         | 
| 189 194 | 
             
                    pass
         | 
| 190 | 
            -
             | 
| 195 | 
            +
             | 
| 191 196 | 
             
                @abstractmethod
         | 
| 192 197 | 
             
                def register_health_check(self, service_name: str, check_func: callable) -> None:
         | 
| 193 198 | 
             
                    """Register a health check function"""
         | 
| 194 199 | 
             
                    pass
         | 
| 195 | 
            -
             | 
| 200 | 
            +
             | 
| 196 201 | 
             
                @abstractmethod
         | 
| 197 202 | 
             
                async def start_monitoring(self) -> None:
         | 
| 198 203 | 
             
                    """Start health monitoring"""
         | 
| 199 204 | 
             
                    pass
         | 
| 200 | 
            -
             | 
| 205 | 
            +
             | 
| 201 206 | 
             
                @abstractmethod
         | 
| 202 207 | 
             
                async def stop_monitoring(self) -> None:
         | 
| 203 208 | 
             
                    """Stop health monitoring"""
         | 
| @@ -208,6 +213,7 @@ class IHealthMonitor(ABC): | |
| 208 213 | 
             
            @dataclass
         | 
| 209 214 | 
             
            class AgentMetadata:
         | 
| 210 215 | 
             
                """Enhanced agent metadata with specialization and model configuration support"""
         | 
| 216 | 
            +
             | 
| 211 217 | 
             
                name: str
         | 
| 212 218 | 
             
                type: str
         | 
| 213 219 | 
             
                path: str
         | 
| @@ -225,7 +231,7 @@ class AgentMetadata: | |
| 225 231 | 
             
                # Model configuration fields
         | 
| 226 232 | 
             
                preferred_model: Optional[str] = None
         | 
| 227 233 | 
             
                model_config: Optional[Dict[str, Any]] = None
         | 
| 228 | 
            -
             | 
| 234 | 
            +
             | 
| 229 235 | 
             
                def __post_init__(self):
         | 
| 230 236 | 
             
                    """Initialize default values for list fields"""
         | 
| 231 237 | 
             
                    if self.capabilities is None:
         | 
| @@ -244,32 +250,36 @@ class AgentMetadata: | |
| 244 250 |  | 
| 245 251 | 
             
            class IAgentRegistry(ABC):
         | 
| 246 252 | 
             
                """Interface for agent discovery and management"""
         | 
| 247 | 
            -
             | 
| 253 | 
            +
             | 
| 248 254 | 
             
                @abstractmethod
         | 
| 249 | 
            -
                async def discover_agents( | 
| 255 | 
            +
                async def discover_agents(
         | 
| 256 | 
            +
                    self, force_refresh: bool = False
         | 
| 257 | 
            +
                ) -> Dict[str, AgentMetadata]:
         | 
| 250 258 | 
             
                    """Discover all available agents"""
         | 
| 251 259 | 
             
                    pass
         | 
| 252 | 
            -
             | 
| 260 | 
            +
             | 
| 253 261 | 
             
                @abstractmethod
         | 
| 254 262 | 
             
                async def get_agent(self, agent_name: str) -> Optional[AgentMetadata]:
         | 
| 255 263 | 
             
                    """Get specific agent metadata"""
         | 
| 256 264 | 
             
                    pass
         | 
| 257 | 
            -
             | 
| 265 | 
            +
             | 
| 258 266 | 
             
                @abstractmethod
         | 
| 259 | 
            -
                async def list_agents( | 
| 267 | 
            +
                async def list_agents(
         | 
| 268 | 
            +
                    self, agent_type: Optional[str] = None, tier: Optional[str] = None
         | 
| 269 | 
            +
                ) -> List[AgentMetadata]:
         | 
| 260 270 | 
             
                    """List agents with optional filtering"""
         | 
| 261 271 | 
             
                    pass
         | 
| 262 | 
            -
             | 
| 272 | 
            +
             | 
| 263 273 | 
             
                @abstractmethod
         | 
| 264 274 | 
             
                async def get_specialized_agents(self, agent_type: str) -> List[AgentMetadata]:
         | 
| 265 275 | 
             
                    """Get agents of a specific specialized type"""
         | 
| 266 276 | 
             
                    pass
         | 
| 267 | 
            -
             | 
| 277 | 
            +
             | 
| 268 278 | 
             
                @abstractmethod
         | 
| 269 279 | 
             
                async def search_by_capability(self, capability: str) -> List[AgentMetadata]:
         | 
| 270 280 | 
             
                    """Search agents by capability"""
         | 
| 271 281 | 
             
                    pass
         | 
| 272 | 
            -
             | 
| 282 | 
            +
             | 
| 273 283 | 
             
                @abstractmethod
         | 
| 274 284 | 
             
                async def get_registry_stats(self) -> Dict[str, Any]:
         | 
| 275 285 | 
             
                    """Get registry statistics"""
         | 
| @@ -280,6 +290,7 @@ class IAgentRegistry(ABC): | |
| 280 290 | 
             
            @dataclass
         | 
| 281 291 | 
             
            class CacheEntry:
         | 
| 282 292 | 
             
                """Cache entry with metadata"""
         | 
| 293 | 
            +
             | 
| 283 294 | 
             
                key: str
         | 
| 284 295 | 
             
                value: Any
         | 
| 285 296 | 
             
                created_at: float
         | 
| @@ -288,7 +299,7 @@ class CacheEntry: | |
| 288 299 | 
             
                last_accessed: float = 0.0
         | 
| 289 300 | 
             
                size_bytes: int = 0
         | 
| 290 301 | 
             
                metadata: Dict[str, Any] = None
         | 
| 291 | 
            -
             | 
| 302 | 
            +
             | 
| 292 303 | 
             
                def __post_init__(self):
         | 
| 293 304 | 
             
                    if self.metadata is None:
         | 
| 294 305 | 
             
                        self.metadata = {}
         | 
| @@ -296,32 +307,38 @@ class CacheEntry: | |
| 296 307 |  | 
| 297 308 | 
             
            class IPromptCache(ABC):
         | 
| 298 309 | 
             
                """Interface for high-performance prompt caching"""
         | 
| 299 | 
            -
             | 
| 310 | 
            +
             | 
| 300 311 | 
             
                @abstractmethod
         | 
| 301 312 | 
             
                def get(self, key: str) -> Optional[Any]:
         | 
| 302 313 | 
             
                    """Get cached value by key"""
         | 
| 303 314 | 
             
                    pass
         | 
| 304 | 
            -
             | 
| 315 | 
            +
             | 
| 305 316 | 
             
                @abstractmethod
         | 
| 306 | 
            -
                def set( | 
| 317 | 
            +
                def set(
         | 
| 318 | 
            +
                    self,
         | 
| 319 | 
            +
                    key: str,
         | 
| 320 | 
            +
                    value: Any,
         | 
| 321 | 
            +
                    ttl: Optional[float] = None,
         | 
| 322 | 
            +
                    metadata: Optional[Dict[str, Any]] = None,
         | 
| 323 | 
            +
                ) -> bool:
         | 
| 307 324 | 
             
                    """Set cached value with optional TTL"""
         | 
| 308 325 | 
             
                    pass
         | 
| 309 | 
            -
             | 
| 326 | 
            +
             | 
| 310 327 | 
             
                @abstractmethod
         | 
| 311 328 | 
             
                def delete(self, key: str) -> bool:
         | 
| 312 329 | 
             
                    """Delete cached value"""
         | 
| 313 330 | 
             
                    pass
         | 
| 314 | 
            -
             | 
| 331 | 
            +
             | 
| 315 332 | 
             
                @abstractmethod
         | 
| 316 333 | 
             
                def invalidate(self, pattern: str) -> int:
         | 
| 317 334 | 
             
                    """Invalidate cached values matching pattern"""
         | 
| 318 335 | 
             
                    pass
         | 
| 319 | 
            -
             | 
| 336 | 
            +
             | 
| 320 337 | 
             
                @abstractmethod
         | 
| 321 338 | 
             
                def clear(self) -> None:
         | 
| 322 339 | 
             
                    """Clear all cached values"""
         | 
| 323 340 | 
             
                    pass
         | 
| 324 | 
            -
             | 
| 341 | 
            +
             | 
| 325 342 | 
             
                @abstractmethod
         | 
| 326 343 | 
             
                def get_metrics(self) -> Dict[str, Any]:
         | 
| 327 344 | 
             
                    """Get cache performance metrics"""
         | 
| @@ -332,6 +349,7 @@ class IPromptCache(ABC): | |
| 332 349 | 
             
            @dataclass
         | 
| 333 350 | 
             
            class TemplateRenderContext:
         | 
| 334 351 | 
             
                """Context for template rendering"""
         | 
| 352 | 
            +
             | 
| 335 353 | 
             
                variables: Dict[str, Any]
         | 
| 336 354 | 
             
                metadata: Dict[str, Any]
         | 
| 337 355 | 
             
                target_path: Optional[Path] = None
         | 
| @@ -340,22 +358,24 @@ class TemplateRenderContext: | |
| 340 358 |  | 
| 341 359 | 
             
            class ITemplateManager(ABC):
         | 
| 342 360 | 
             
                """Interface for template processing and rendering"""
         | 
| 343 | 
            -
             | 
| 361 | 
            +
             | 
| 344 362 | 
             
                @abstractmethod
         | 
| 345 | 
            -
                async def render_template( | 
| 363 | 
            +
                async def render_template(
         | 
| 364 | 
            +
                    self, template_content: str, context: TemplateRenderContext
         | 
| 365 | 
            +
                ) -> str:
         | 
| 346 366 | 
             
                    """Render template with given context"""
         | 
| 347 367 | 
             
                    pass
         | 
| 348 | 
            -
             | 
| 368 | 
            +
             | 
| 349 369 | 
             
                @abstractmethod
         | 
| 350 370 | 
             
                async def load_template(self, template_id: str) -> Optional[str]:
         | 
| 351 371 | 
             
                    """Load template by ID"""
         | 
| 352 372 | 
             
                    pass
         | 
| 353 | 
            -
             | 
| 373 | 
            +
             | 
| 354 374 | 
             
                @abstractmethod
         | 
| 355 375 | 
             
                async def validate_template(self, template_content: str) -> Tuple[bool, List[str]]:
         | 
| 356 376 | 
             
                    """Validate template syntax and variables"""
         | 
| 357 377 | 
             
                    pass
         | 
| 358 | 
            -
             | 
| 378 | 
            +
             | 
| 359 379 | 
             
                @abstractmethod
         | 
| 360 380 | 
             
                def register_template_function(self, name: str, func: callable) -> None:
         | 
| 361 381 | 
             
                    """Register custom template function"""
         | 
| @@ -365,17 +385,17 @@ class ITemplateManager(ABC): | |
| 365 385 | 
             
            # Service factory interface
         | 
| 366 386 | 
             
            class IServiceFactory(Generic[ServiceType], ABC):
         | 
| 367 387 | 
             
                """Generic interface for service factories"""
         | 
| 368 | 
            -
             | 
| 388 | 
            +
             | 
| 369 389 | 
             
                @abstractmethod
         | 
| 370 390 | 
             
                def create(self, **kwargs) -> ServiceType:
         | 
| 371 391 | 
             
                    """Create service instance"""
         | 
| 372 392 | 
             
                    pass
         | 
| 373 | 
            -
             | 
| 393 | 
            +
             | 
| 374 394 | 
             
                @abstractmethod
         | 
| 375 395 | 
             
                def create_with_config(self, config: Dict[str, Any]) -> ServiceType:
         | 
| 376 396 | 
             
                    """Create service instance with configuration"""
         | 
| 377 397 | 
             
                    pass
         | 
| 378 | 
            -
             | 
| 398 | 
            +
             | 
| 379 399 | 
             
                @abstractmethod
         | 
| 380 400 | 
             
                def supports_type(self, service_type: type) -> bool:
         | 
| 381 401 | 
             
                    """Check if factory supports service type"""
         | 
| @@ -385,32 +405,32 @@ class IServiceFactory(Generic[ServiceType], ABC): | |
| 385 405 | 
             
            # Logging interface
         | 
| 386 406 | 
             
            class IStructuredLogger(ABC):
         | 
| 387 407 | 
             
                """Interface for structured logging"""
         | 
| 388 | 
            -
             | 
| 408 | 
            +
             | 
| 389 409 | 
             
                @abstractmethod
         | 
| 390 410 | 
             
                def debug(self, message: str, **kwargs) -> None:
         | 
| 391 411 | 
             
                    """Log debug message with structured data"""
         | 
| 392 412 | 
             
                    pass
         | 
| 393 | 
            -
             | 
| 413 | 
            +
             | 
| 394 414 | 
             
                @abstractmethod
         | 
| 395 415 | 
             
                def info(self, message: str, **kwargs) -> None:
         | 
| 396 416 | 
             
                    """Log info message with structured data"""
         | 
| 397 417 | 
             
                    pass
         | 
| 398 | 
            -
             | 
| 418 | 
            +
             | 
| 399 419 | 
             
                @abstractmethod
         | 
| 400 420 | 
             
                def warning(self, message: str, **kwargs) -> None:
         | 
| 401 421 | 
             
                    """Log warning message with structured data"""
         | 
| 402 422 | 
             
                    pass
         | 
| 403 | 
            -
             | 
| 423 | 
            +
             | 
| 404 424 | 
             
                @abstractmethod
         | 
| 405 425 | 
             
                def error(self, message: str, **kwargs) -> None:
         | 
| 406 426 | 
             
                    """Log error message with structured data"""
         | 
| 407 427 | 
             
                    pass
         | 
| 408 | 
            -
             | 
| 428 | 
            +
             | 
| 409 429 | 
             
                @abstractmethod
         | 
| 410 430 | 
             
                def critical(self, message: str, **kwargs) -> None:
         | 
| 411 431 | 
             
                    """Log critical message with structured data"""
         | 
| 412 432 | 
             
                    pass
         | 
| 413 | 
            -
             | 
| 433 | 
            +
             | 
| 414 434 | 
             
                @abstractmethod
         | 
| 415 435 | 
             
                def set_context(self, **kwargs) -> None:
         | 
| 416 436 | 
             
                    """Set logging context for all subsequent messages"""
         | 
| @@ -420,27 +440,27 @@ class IStructuredLogger(ABC): | |
| 420 440 | 
             
            # Service lifecycle interface
         | 
| 421 441 | 
             
            class IServiceLifecycle(ABC):
         | 
| 422 442 | 
             
                """Interface for service lifecycle management"""
         | 
| 423 | 
            -
             | 
| 443 | 
            +
             | 
| 424 444 | 
             
                @abstractmethod
         | 
| 425 445 | 
             
                async def initialize(self) -> None:
         | 
| 426 446 | 
             
                    """Initialize the service"""
         | 
| 427 447 | 
             
                    pass
         | 
| 428 | 
            -
             | 
| 448 | 
            +
             | 
| 429 449 | 
             
                @abstractmethod
         | 
| 430 450 | 
             
                async def start(self) -> None:
         | 
| 431 451 | 
             
                    """Start the service"""
         | 
| 432 452 | 
             
                    pass
         | 
| 433 | 
            -
             | 
| 453 | 
            +
             | 
| 434 454 | 
             
                @abstractmethod
         | 
| 435 455 | 
             
                async def stop(self) -> None:
         | 
| 436 456 | 
             
                    """Stop the service"""
         | 
| 437 457 | 
             
                    pass
         | 
| 438 | 
            -
             | 
| 458 | 
            +
             | 
| 439 459 | 
             
                @abstractmethod
         | 
| 440 460 | 
             
                async def restart(self) -> None:
         | 
| 441 461 | 
             
                    """Restart the service"""
         | 
| 442 462 | 
             
                    pass
         | 
| 443 | 
            -
             | 
| 463 | 
            +
             | 
| 444 464 | 
             
                @abstractmethod
         | 
| 445 465 | 
             
                def is_running(self) -> bool:
         | 
| 446 466 | 
             
                    """Check if service is running"""
         | 
| @@ -450,17 +470,17 @@ class IServiceLifecycle(ABC): | |
| 450 470 | 
             
            # Error handling interface
         | 
| 451 471 | 
             
            class IErrorHandler(ABC):
         | 
| 452 472 | 
             
                """Interface for centralized error handling"""
         | 
| 453 | 
            -
             | 
| 473 | 
            +
             | 
| 454 474 | 
             
                @abstractmethod
         | 
| 455 475 | 
             
                def handle_error(self, error: Exception, context: Dict[str, Any]) -> None:
         | 
| 456 476 | 
             
                    """Handle error with context"""
         | 
| 457 477 | 
             
                    pass
         | 
| 458 | 
            -
             | 
| 478 | 
            +
             | 
| 459 479 | 
             
                @abstractmethod
         | 
| 460 480 | 
             
                def register_error_handler(self, error_type: type, handler: callable) -> None:
         | 
| 461 481 | 
             
                    """Register error handler for specific error type"""
         | 
| 462 482 | 
             
                    pass
         | 
| 463 | 
            -
             | 
| 483 | 
            +
             | 
| 464 484 | 
             
                @abstractmethod
         | 
| 465 485 | 
             
                def get_error_stats(self) -> Dict[str, Any]:
         | 
| 466 486 | 
             
                    """Get error statistics"""
         | 
| @@ -470,22 +490,24 @@ class IErrorHandler(ABC): | |
| 470 490 | 
             
            # Performance monitoring interface
         | 
| 471 491 | 
             
            class IPerformanceMonitor(ABC):
         | 
| 472 492 | 
             
                """Interface for performance monitoring"""
         | 
| 473 | 
            -
             | 
| 493 | 
            +
             | 
| 474 494 | 
             
                @abstractmethod
         | 
| 475 495 | 
             
                def start_timer(self, operation: str) -> str:
         | 
| 476 496 | 
             
                    """Start timing an operation"""
         | 
| 477 497 | 
             
                    pass
         | 
| 478 | 
            -
             | 
| 498 | 
            +
             | 
| 479 499 | 
             
                @abstractmethod
         | 
| 480 500 | 
             
                def stop_timer(self, timer_id: str) -> float:
         | 
| 481 501 | 
             
                    """Stop timing and return duration"""
         | 
| 482 502 | 
             
                    pass
         | 
| 483 | 
            -
             | 
| 503 | 
            +
             | 
| 484 504 | 
             
                @abstractmethod
         | 
| 485 | 
            -
                def record_metric( | 
| 505 | 
            +
                def record_metric(
         | 
| 506 | 
            +
                    self, name: str, value: float, tags: Optional[Dict[str, str]] = None
         | 
| 507 | 
            +
                ) -> None:
         | 
| 486 508 | 
             
                    """Record a performance metric"""
         | 
| 487 509 | 
             
                    pass
         | 
| 488 | 
            -
             | 
| 510 | 
            +
             | 
| 489 511 | 
             
                @abstractmethod
         | 
| 490 512 | 
             
                def get_metrics(self) -> Dict[str, Any]:
         | 
| 491 513 | 
             
                    """Get performance metrics"""
         | 
| @@ -495,22 +517,22 @@ class IPerformanceMonitor(ABC): | |
| 495 517 | 
             
            # Event system interface
         | 
| 496 518 | 
             
            class IEventBus(ABC):
         | 
| 497 519 | 
             
                """Interface for event-driven communication"""
         | 
| 498 | 
            -
             | 
| 520 | 
            +
             | 
| 499 521 | 
             
                @abstractmethod
         | 
| 500 522 | 
             
                def publish(self, event_type: str, data: Any) -> None:
         | 
| 501 523 | 
             
                    """Publish an event"""
         | 
| 502 524 | 
             
                    pass
         | 
| 503 | 
            -
             | 
| 525 | 
            +
             | 
| 504 526 | 
             
                @abstractmethod
         | 
| 505 527 | 
             
                def subscribe(self, event_type: str, handler: callable) -> str:
         | 
| 506 528 | 
             
                    """Subscribe to events"""
         | 
| 507 529 | 
             
                    pass
         | 
| 508 | 
            -
             | 
| 530 | 
            +
             | 
| 509 531 | 
             
                @abstractmethod
         | 
| 510 532 | 
             
                def unsubscribe(self, subscription_id: str) -> None:
         | 
| 511 533 | 
             
                    """Unsubscribe from events"""
         | 
| 512 534 | 
             
                    pass
         | 
| 513 | 
            -
             | 
| 535 | 
            +
             | 
| 514 536 | 
             
                @abstractmethod
         | 
| 515 537 | 
             
                async def publish_async(self, event_type: str, data: Any) -> None:
         | 
| 516 538 | 
             
                    """Publish an event asynchronously"""
         | 
| @@ -520,56 +542,58 @@ class IEventBus(ABC): | |
| 520 542 | 
             
            # Agent deployment interface
         | 
| 521 543 | 
             
            class AgentDeploymentInterface(ABC):
         | 
| 522 544 | 
             
                """Interface for agent deployment operations.
         | 
| 523 | 
            -
             | 
| 545 | 
            +
             | 
| 524 546 | 
             
                WHY: Agent deployment needs to be decoupled from concrete implementations
         | 
| 525 547 | 
             
                to enable different deployment strategies (local, remote, containerized).
         | 
| 526 548 | 
             
                This interface ensures consistency across different deployment backends.
         | 
| 527 | 
            -
             | 
| 549 | 
            +
             | 
| 528 550 | 
             
                DESIGN DECISION: Methods return deployment status/results to enable
         | 
| 529 551 | 
             
                proper error handling and rollback operations when deployments fail.
         | 
| 530 552 | 
             
                """
         | 
| 531 | 
            -
             | 
| 553 | 
            +
             | 
| 532 554 | 
             
                @abstractmethod
         | 
| 533 | 
            -
                def deploy_agents( | 
| 555 | 
            +
                def deploy_agents(
         | 
| 556 | 
            +
                    self, force: bool = False, include_all: bool = False
         | 
| 557 | 
            +
                ) -> Dict[str, Any]:
         | 
| 534 558 | 
             
                    """Deploy agents to target environment.
         | 
| 535 | 
            -
             | 
| 559 | 
            +
             | 
| 536 560 | 
             
                    Args:
         | 
| 537 561 | 
             
                        force: Force deployment even if agents already exist
         | 
| 538 562 | 
             
                        include_all: Include all agents, ignoring exclusion lists
         | 
| 539 | 
            -
             | 
| 563 | 
            +
             | 
| 540 564 | 
             
                    Returns:
         | 
| 541 565 | 
             
                        Dictionary with deployment results and status
         | 
| 542 566 | 
             
                    """
         | 
| 543 567 | 
             
                    pass
         | 
| 544 | 
            -
             | 
| 568 | 
            +
             | 
| 545 569 | 
             
                @abstractmethod
         | 
| 546 570 | 
             
                def validate_agent(self, agent_path: Path) -> Tuple[bool, List[str]]:
         | 
| 547 571 | 
             
                    """Validate agent configuration and structure.
         | 
| 548 | 
            -
             | 
| 572 | 
            +
             | 
| 549 573 | 
             
                    Args:
         | 
| 550 574 | 
             
                        agent_path: Path to agent configuration file
         | 
| 551 | 
            -
             | 
| 575 | 
            +
             | 
| 552 576 | 
             
                    Returns:
         | 
| 553 577 | 
             
                        Tuple of (is_valid, list_of_errors)
         | 
| 554 578 | 
             
                    """
         | 
| 555 579 | 
             
                    pass
         | 
| 556 | 
            -
             | 
| 580 | 
            +
             | 
| 557 581 | 
             
                @abstractmethod
         | 
| 558 582 | 
             
                def clean_deployment(self, preserve_user_agents: bool = True) -> bool:
         | 
| 559 583 | 
             
                    """Clean up deployed agents.
         | 
| 560 | 
            -
             | 
| 584 | 
            +
             | 
| 561 585 | 
             
                    Args:
         | 
| 562 586 | 
             
                        preserve_user_agents: Whether to keep user-created agents
         | 
| 563 | 
            -
             | 
| 587 | 
            +
             | 
| 564 588 | 
             
                    Returns:
         | 
| 565 589 | 
             
                        True if cleanup successful
         | 
| 566 590 | 
             
                    """
         | 
| 567 591 | 
             
                    pass
         | 
| 568 | 
            -
             | 
| 592 | 
            +
             | 
| 569 593 | 
             
                @abstractmethod
         | 
| 570 594 | 
             
                def get_deployment_status(self) -> Dict[str, Any]:
         | 
| 571 595 | 
             
                    """Get current deployment status and metrics.
         | 
| 572 | 
            -
             | 
| 596 | 
            +
             | 
| 573 597 | 
             
                    Returns:
         | 
| 574 598 | 
             
                        Dictionary with deployment status information
         | 
| 575 599 | 
             
                    """
         | 
| @@ -579,71 +603,71 @@ class AgentDeploymentInterface(ABC): | |
| 579 603 | 
             
            # Memory service interface
         | 
| 580 604 | 
             
            class MemoryServiceInterface(ABC):
         | 
| 581 605 | 
             
                """Interface for memory management operations.
         | 
| 582 | 
            -
             | 
| 606 | 
            +
             | 
| 583 607 | 
             
                WHY: Memory management is crucial for agent learning and context retention.
         | 
| 584 608 | 
             
                This interface abstracts memory storage, retrieval, and optimization to
         | 
| 585 609 | 
             
                enable different backends (file-based, database, distributed cache).
         | 
| 586 | 
            -
             | 
| 610 | 
            +
             | 
| 587 611 | 
             
                DESIGN DECISION: Memory operations return success/failure status to enable
         | 
| 588 612 | 
             
                proper error handling and fallback strategies when memory is unavailable.
         | 
| 589 613 | 
             
                """
         | 
| 590 | 
            -
             | 
| 614 | 
            +
             | 
| 591 615 | 
             
                @abstractmethod
         | 
| 592 616 | 
             
                def load_memory(self, agent_id: str) -> Optional[str]:
         | 
| 593 617 | 
             
                    """Load memory for a specific agent.
         | 
| 594 | 
            -
             | 
| 618 | 
            +
             | 
| 595 619 | 
             
                    Args:
         | 
| 596 620 | 
             
                        agent_id: Identifier of the agent
         | 
| 597 | 
            -
             | 
| 621 | 
            +
             | 
| 598 622 | 
             
                    Returns:
         | 
| 599 623 | 
             
                        Memory content as string or None if not found
         | 
| 600 624 | 
             
                    """
         | 
| 601 625 | 
             
                    pass
         | 
| 602 | 
            -
             | 
| 626 | 
            +
             | 
| 603 627 | 
             
                @abstractmethod
         | 
| 604 628 | 
             
                def save_memory(self, agent_id: str, content: str) -> bool:
         | 
| 605 629 | 
             
                    """Save memory for a specific agent.
         | 
| 606 | 
            -
             | 
| 630 | 
            +
             | 
| 607 631 | 
             
                    Args:
         | 
| 608 632 | 
             
                        agent_id: Identifier of the agent
         | 
| 609 633 | 
             
                        content: Memory content to save
         | 
| 610 | 
            -
             | 
| 634 | 
            +
             | 
| 611 635 | 
             
                    Returns:
         | 
| 612 636 | 
             
                        True if save successful
         | 
| 613 637 | 
             
                    """
         | 
| 614 638 | 
             
                    pass
         | 
| 615 | 
            -
             | 
| 639 | 
            +
             | 
| 616 640 | 
             
                @abstractmethod
         | 
| 617 641 | 
             
                def validate_memory_size(self, content: str) -> Tuple[bool, Optional[str]]:
         | 
| 618 642 | 
             
                    """Validate memory content size and structure.
         | 
| 619 | 
            -
             | 
| 643 | 
            +
             | 
| 620 644 | 
             
                    Args:
         | 
| 621 645 | 
             
                        content: Memory content to validate
         | 
| 622 | 
            -
             | 
| 646 | 
            +
             | 
| 623 647 | 
             
                    Returns:
         | 
| 624 648 | 
             
                        Tuple of (is_valid, error_message)
         | 
| 625 649 | 
             
                    """
         | 
| 626 650 | 
             
                    pass
         | 
| 627 | 
            -
             | 
| 651 | 
            +
             | 
| 628 652 | 
             
                @abstractmethod
         | 
| 629 653 | 
             
                def optimize_memory(self, agent_id: str) -> bool:
         | 
| 630 654 | 
             
                    """Optimize memory by removing duplicates and consolidating entries.
         | 
| 631 | 
            -
             | 
| 655 | 
            +
             | 
| 632 656 | 
             
                    Args:
         | 
| 633 657 | 
             
                        agent_id: Identifier of the agent
         | 
| 634 | 
            -
             | 
| 658 | 
            +
             | 
| 635 659 | 
             
                    Returns:
         | 
| 636 660 | 
             
                        True if optimization successful
         | 
| 637 661 | 
             
                    """
         | 
| 638 662 | 
             
                    pass
         | 
| 639 | 
            -
             | 
| 663 | 
            +
             | 
| 640 664 | 
             
                @abstractmethod
         | 
| 641 665 | 
             
                def get_memory_metrics(self, agent_id: Optional[str] = None) -> Dict[str, Any]:
         | 
| 642 666 | 
             
                    """Get memory usage metrics.
         | 
| 643 | 
            -
             | 
| 667 | 
            +
             | 
| 644 668 | 
             
                    Args:
         | 
| 645 669 | 
             
                        agent_id: Optional specific agent ID, or None for all
         | 
| 646 | 
            -
             | 
| 670 | 
            +
             | 
| 647 671 | 
             
                    Returns:
         | 
| 648 672 | 
             
                        Dictionary with memory metrics
         | 
| 649 673 | 
             
                    """
         | 
| @@ -653,64 +677,64 @@ class MemoryServiceInterface(ABC): | |
| 653 677 | 
             
            # Hook service interface
         | 
| 654 678 | 
             
            class HookServiceInterface(ABC):
         | 
| 655 679 | 
             
                """Interface for hook execution operations.
         | 
| 656 | 
            -
             | 
| 680 | 
            +
             | 
| 657 681 | 
             
                WHY: Hooks provide extensibility points for the framework, allowing plugins
         | 
| 658 682 | 
             
                and extensions to modify behavior. This interface ensures consistent hook
         | 
| 659 683 | 
             
                registration, priority handling, and execution across different hook systems.
         | 
| 660 | 
            -
             | 
| 684 | 
            +
             | 
| 661 685 | 
             
                DESIGN DECISION: Separate pre/post delegation methods for clarity and
         | 
| 662 686 | 
             
                performance - no runtime type checking needed during execution.
         | 
| 663 687 | 
             
                """
         | 
| 664 | 
            -
             | 
| 688 | 
            +
             | 
| 665 689 | 
             
                @abstractmethod
         | 
| 666 690 | 
             
                def register_hook(self, hook: Any) -> bool:
         | 
| 667 691 | 
             
                    """Register a hook with the service.
         | 
| 668 | 
            -
             | 
| 692 | 
            +
             | 
| 669 693 | 
             
                    Args:
         | 
| 670 694 | 
             
                        hook: Hook instance to register
         | 
| 671 | 
            -
             | 
| 695 | 
            +
             | 
| 672 696 | 
             
                    Returns:
         | 
| 673 697 | 
             
                        True if registration successful
         | 
| 674 698 | 
             
                    """
         | 
| 675 699 | 
             
                    pass
         | 
| 676 | 
            -
             | 
| 700 | 
            +
             | 
| 677 701 | 
             
                @abstractmethod
         | 
| 678 702 | 
             
                def execute_pre_delegation_hooks(self, context: Any) -> Any:
         | 
| 679 703 | 
             
                    """Execute all pre-delegation hooks.
         | 
| 680 | 
            -
             | 
| 704 | 
            +
             | 
| 681 705 | 
             
                    Args:
         | 
| 682 706 | 
             
                        context: Hook execution context
         | 
| 683 | 
            -
             | 
| 707 | 
            +
             | 
| 684 708 | 
             
                    Returns:
         | 
| 685 709 | 
             
                        Hook execution result
         | 
| 686 710 | 
             
                    """
         | 
| 687 711 | 
             
                    pass
         | 
| 688 | 
            -
             | 
| 712 | 
            +
             | 
| 689 713 | 
             
                @abstractmethod
         | 
| 690 714 | 
             
                def execute_post_delegation_hooks(self, context: Any) -> Any:
         | 
| 691 715 | 
             
                    """Execute all post-delegation hooks.
         | 
| 692 | 
            -
             | 
| 716 | 
            +
             | 
| 693 717 | 
             
                    Args:
         | 
| 694 718 | 
             
                        context: Hook execution context
         | 
| 695 | 
            -
             | 
| 719 | 
            +
             | 
| 696 720 | 
             
                    Returns:
         | 
| 697 721 | 
             
                        Hook execution result
         | 
| 698 722 | 
             
                    """
         | 
| 699 723 | 
             
                    pass
         | 
| 700 | 
            -
             | 
| 724 | 
            +
             | 
| 701 725 | 
             
                @abstractmethod
         | 
| 702 726 | 
             
                def get_registered_hooks(self) -> Dict[str, List[Any]]:
         | 
| 703 727 | 
             
                    """Get all registered hooks by type.
         | 
| 704 | 
            -
             | 
| 728 | 
            +
             | 
| 705 729 | 
             
                    Returns:
         | 
| 706 730 | 
             
                        Dictionary mapping hook types to lists of hooks
         | 
| 707 731 | 
             
                    """
         | 
| 708 732 | 
             
                    pass
         | 
| 709 | 
            -
             | 
| 733 | 
            +
             | 
| 710 734 | 
             
                @abstractmethod
         | 
| 711 735 | 
             
                def clear_hooks(self, hook_type: Optional[str] = None) -> None:
         | 
| 712 736 | 
             
                    """Clear registered hooks.
         | 
| 713 | 
            -
             | 
| 737 | 
            +
             | 
| 714 738 | 
             
                    Args:
         | 
| 715 739 | 
             
                        hook_type: Optional specific hook type to clear, or None for all
         | 
| 716 740 | 
             
                    """
         | 
| @@ -720,64 +744,64 @@ class HookServiceInterface(ABC): | |
| 720 744 | 
             
            # WebSocket/SocketIO service interface
         | 
| 721 745 | 
             
            class SocketIOServiceInterface(ABC):
         | 
| 722 746 | 
             
                """Interface for WebSocket communication.
         | 
| 723 | 
            -
             | 
| 747 | 
            +
             | 
| 724 748 | 
             
                WHY: Real-time communication is essential for monitoring and interactive
         | 
| 725 749 | 
             
                features. This interface abstracts WebSocket/SocketIO implementation to
         | 
| 726 750 | 
             
                enable different transport mechanisms and fallback strategies.
         | 
| 727 | 
            -
             | 
| 751 | 
            +
             | 
| 728 752 | 
             
                DESIGN DECISION: Async methods for non-blocking I/O operations, with
         | 
| 729 753 | 
             
                support for both broadcast and targeted messaging.
         | 
| 730 754 | 
             
                """
         | 
| 731 | 
            -
             | 
| 755 | 
            +
             | 
| 732 756 | 
             
                @abstractmethod
         | 
| 733 757 | 
             
                async def start(self, host: str = "localhost", port: int = 8765) -> None:
         | 
| 734 758 | 
             
                    """Start the WebSocket server.
         | 
| 735 | 
            -
             | 
| 759 | 
            +
             | 
| 736 760 | 
             
                    Args:
         | 
| 737 761 | 
             
                        host: Host to bind to
         | 
| 738 762 | 
             
                        port: Port to listen on
         | 
| 739 763 | 
             
                    """
         | 
| 740 764 | 
             
                    pass
         | 
| 741 | 
            -
             | 
| 765 | 
            +
             | 
| 742 766 | 
             
                @abstractmethod
         | 
| 743 767 | 
             
                async def stop(self) -> None:
         | 
| 744 768 | 
             
                    """Stop the WebSocket server."""
         | 
| 745 769 | 
             
                    pass
         | 
| 746 | 
            -
             | 
| 770 | 
            +
             | 
| 747 771 | 
             
                @abstractmethod
         | 
| 748 772 | 
             
                async def emit(self, event: str, data: Any, room: Optional[str] = None) -> None:
         | 
| 749 773 | 
             
                    """Emit an event to connected clients.
         | 
| 750 | 
            -
             | 
| 774 | 
            +
             | 
| 751 775 | 
             
                    Args:
         | 
| 752 776 | 
             
                        event: Event name
         | 
| 753 777 | 
             
                        data: Event data
         | 
| 754 778 | 
             
                        room: Optional room to target
         | 
| 755 779 | 
             
                    """
         | 
| 756 780 | 
             
                    pass
         | 
| 757 | 
            -
             | 
| 781 | 
            +
             | 
| 758 782 | 
             
                @abstractmethod
         | 
| 759 783 | 
             
                async def broadcast(self, event: str, data: Any) -> None:
         | 
| 760 784 | 
             
                    """Broadcast event to all connected clients.
         | 
| 761 | 
            -
             | 
| 785 | 
            +
             | 
| 762 786 | 
             
                    Args:
         | 
| 763 787 | 
             
                        event: Event name
         | 
| 764 788 | 
             
                        data: Event data
         | 
| 765 789 | 
             
                    """
         | 
| 766 790 | 
             
                    pass
         | 
| 767 | 
            -
             | 
| 791 | 
            +
             | 
| 768 792 | 
             
                @abstractmethod
         | 
| 769 793 | 
             
                def get_connection_count(self) -> int:
         | 
| 770 794 | 
             
                    """Get number of connected clients.
         | 
| 771 | 
            -
             | 
| 795 | 
            +
             | 
| 772 796 | 
             
                    Returns:
         | 
| 773 797 | 
             
                        Number of active connections
         | 
| 774 798 | 
             
                    """
         | 
| 775 799 | 
             
                    pass
         | 
| 776 | 
            -
             | 
| 800 | 
            +
             | 
| 777 801 | 
             
                @abstractmethod
         | 
| 778 802 | 
             
                def is_running(self) -> bool:
         | 
| 779 803 | 
             
                    """Check if server is running.
         | 
| 780 | 
            -
             | 
| 804 | 
            +
             | 
| 781 805 | 
             
                    Returns:
         | 
| 782 806 | 
             
                        True if server is active
         | 
| 783 807 | 
             
                    """
         | 
| @@ -787,58 +811,58 @@ class SocketIOServiceInterface(ABC): | |
| 787 811 | 
             
            # Project analyzer interface
         | 
| 788 812 | 
             
            class ProjectAnalyzerInterface(ABC):
         | 
| 789 813 | 
             
                """Interface for project analysis operations.
         | 
| 790 | 
            -
             | 
| 814 | 
            +
             | 
| 791 815 | 
             
                WHY: Understanding project structure and characteristics is essential for
         | 
| 792 816 | 
             
                context-aware agent behavior. This interface abstracts project analysis
         | 
| 793 817 | 
             
                to support different project types and structures.
         | 
| 794 | 
            -
             | 
| 818 | 
            +
             | 
| 795 819 | 
             
                DESIGN DECISION: Returns structured data classes for type safety and
         | 
| 796 820 | 
             
                clear contracts between analysis and consumption components.
         | 
| 797 821 | 
             
                """
         | 
| 798 | 
            -
             | 
| 822 | 
            +
             | 
| 799 823 | 
             
                @abstractmethod
         | 
| 800 824 | 
             
                def analyze_project(self, project_path: Optional[Path] = None) -> Any:
         | 
| 801 825 | 
             
                    """Analyze project characteristics.
         | 
| 802 | 
            -
             | 
| 826 | 
            +
             | 
| 803 827 | 
             
                    Args:
         | 
| 804 828 | 
             
                        project_path: Optional path to project, defaults to current
         | 
| 805 | 
            -
             | 
| 829 | 
            +
             | 
| 806 830 | 
             
                    Returns:
         | 
| 807 831 | 
             
                        ProjectCharacteristics or similar structured data
         | 
| 808 832 | 
             
                    """
         | 
| 809 833 | 
             
                    pass
         | 
| 810 | 
            -
             | 
| 834 | 
            +
             | 
| 811 835 | 
             
                @abstractmethod
         | 
| 812 836 | 
             
                def detect_technology_stack(self) -> List[str]:
         | 
| 813 837 | 
             
                    """Detect technologies used in the project.
         | 
| 814 | 
            -
             | 
| 838 | 
            +
             | 
| 815 839 | 
             
                    Returns:
         | 
| 816 840 | 
             
                        List of detected technologies
         | 
| 817 841 | 
             
                    """
         | 
| 818 842 | 
             
                    pass
         | 
| 819 | 
            -
             | 
| 843 | 
            +
             | 
| 820 844 | 
             
                @abstractmethod
         | 
| 821 845 | 
             
                def analyze_code_patterns(self) -> Dict[str, Any]:
         | 
| 822 846 | 
             
                    """Analyze code patterns and conventions.
         | 
| 823 | 
            -
             | 
| 847 | 
            +
             | 
| 824 848 | 
             
                    Returns:
         | 
| 825 849 | 
             
                        Dictionary of pattern analysis results
         | 
| 826 850 | 
             
                    """
         | 
| 827 851 | 
             
                    pass
         | 
| 828 | 
            -
             | 
| 852 | 
            +
             | 
| 829 853 | 
             
                @abstractmethod
         | 
| 830 854 | 
             
                def get_project_structure(self) -> Dict[str, Any]:
         | 
| 831 855 | 
             
                    """Get project directory structure analysis.
         | 
| 832 | 
            -
             | 
| 856 | 
            +
             | 
| 833 857 | 
             
                    Returns:
         | 
| 834 858 | 
             
                        Dictionary representing project structure
         | 
| 835 859 | 
             
                    """
         | 
| 836 860 | 
             
                    pass
         | 
| 837 | 
            -
             | 
| 861 | 
            +
             | 
| 838 862 | 
             
                @abstractmethod
         | 
| 839 863 | 
             
                def identify_entry_points(self) -> List[Path]:
         | 
| 840 864 | 
             
                    """Identify project entry points.
         | 
| 841 | 
            -
             | 
| 865 | 
            +
             | 
| 842 866 | 
             
                    Returns:
         | 
| 843 867 | 
             
                        List of entry point paths
         | 
| 844 868 | 
             
                    """
         | 
| @@ -848,75 +872,77 @@ class ProjectAnalyzerInterface(ABC): | |
| 848 872 | 
             
            # Ticket manager interface
         | 
| 849 873 | 
             
            class TicketManagerInterface(ABC):
         | 
| 850 874 | 
             
                """Interface for ticket management operations.
         | 
| 851 | 
            -
             | 
| 875 | 
            +
             | 
| 852 876 | 
             
                WHY: Ticket management provides work tracking and organization. This
         | 
| 853 877 | 
             
                interface abstracts ticket operations to support different backend
         | 
| 854 878 | 
             
                systems (file-based, API-based, database).
         | 
| 855 | 
            -
             | 
| 879 | 
            +
             | 
| 856 880 | 
             
                DESIGN DECISION: Uses string IDs for flexibility across different
         | 
| 857 881 | 
             
                ticketing systems, with structured data returns for consistency.
         | 
| 858 882 | 
             
                """
         | 
| 859 | 
            -
             | 
| 883 | 
            +
             | 
| 860 884 | 
             
                @abstractmethod
         | 
| 861 885 | 
             
                def create_task(self, title: str, description: str, **kwargs) -> Optional[str]:
         | 
| 862 886 | 
             
                    """Create a new task ticket.
         | 
| 863 | 
            -
             | 
| 887 | 
            +
             | 
| 864 888 | 
             
                    Args:
         | 
| 865 889 | 
             
                        title: Task title
         | 
| 866 890 | 
             
                        description: Task description
         | 
| 867 891 | 
             
                        **kwargs: Additional task properties
         | 
| 868 | 
            -
             | 
| 892 | 
            +
             | 
| 869 893 | 
             
                    Returns:
         | 
| 870 894 | 
             
                        Task ID if created successfully, None otherwise
         | 
| 871 895 | 
             
                    """
         | 
| 872 896 | 
             
                    pass
         | 
| 873 | 
            -
             | 
| 897 | 
            +
             | 
| 874 898 | 
             
                @abstractmethod
         | 
| 875 899 | 
             
                def update_task(self, task_id: str, **updates) -> bool:
         | 
| 876 900 | 
             
                    """Update an existing task.
         | 
| 877 | 
            -
             | 
| 901 | 
            +
             | 
| 878 902 | 
             
                    Args:
         | 
| 879 903 | 
             
                        task_id: ID of task to update
         | 
| 880 904 | 
             
                        **updates: Fields to update
         | 
| 881 | 
            -
             | 
| 905 | 
            +
             | 
| 882 906 | 
             
                    Returns:
         | 
| 883 907 | 
             
                        True if update successful
         | 
| 884 908 | 
             
                    """
         | 
| 885 909 | 
             
                    pass
         | 
| 886 | 
            -
             | 
| 910 | 
            +
             | 
| 887 911 | 
             
                @abstractmethod
         | 
| 888 912 | 
             
                def get_task(self, task_id: str) -> Optional[Dict[str, Any]]:
         | 
| 889 913 | 
             
                    """Get task details.
         | 
| 890 | 
            -
             | 
| 914 | 
            +
             | 
| 891 915 | 
             
                    Args:
         | 
| 892 916 | 
             
                        task_id: ID of task to retrieve
         | 
| 893 | 
            -
             | 
| 917 | 
            +
             | 
| 894 918 | 
             
                    Returns:
         | 
| 895 919 | 
             
                        Task data dictionary or None if not found
         | 
| 896 920 | 
             
                    """
         | 
| 897 921 | 
             
                    pass
         | 
| 898 | 
            -
             | 
| 922 | 
            +
             | 
| 899 923 | 
             
                @abstractmethod
         | 
| 900 | 
            -
                def list_tasks( | 
| 924 | 
            +
                def list_tasks(
         | 
| 925 | 
            +
                    self, status: Optional[str] = None, **filters
         | 
| 926 | 
            +
                ) -> List[Dict[str, Any]]:
         | 
| 901 927 | 
             
                    """List tasks with optional filtering.
         | 
| 902 | 
            -
             | 
| 928 | 
            +
             | 
| 903 929 | 
             
                    Args:
         | 
| 904 930 | 
             
                        status: Optional status filter
         | 
| 905 931 | 
             
                        **filters: Additional filter criteria
         | 
| 906 | 
            -
             | 
| 932 | 
            +
             | 
| 907 933 | 
             
                    Returns:
         | 
| 908 934 | 
             
                        List of task dictionaries
         | 
| 909 935 | 
             
                    """
         | 
| 910 936 | 
             
                    pass
         | 
| 911 | 
            -
             | 
| 937 | 
            +
             | 
| 912 938 | 
             
                @abstractmethod
         | 
| 913 939 | 
             
                def close_task(self, task_id: str, resolution: Optional[str] = None) -> bool:
         | 
| 914 940 | 
             
                    """Close a task.
         | 
| 915 | 
            -
             | 
| 941 | 
            +
             | 
| 916 942 | 
             
                    Args:
         | 
| 917 943 | 
             
                        task_id: ID of task to close
         | 
| 918 944 | 
             
                        resolution: Optional resolution description
         | 
| 919 | 
            -
             | 
| 945 | 
            +
             | 
| 920 946 | 
             
                    Returns:
         | 
| 921 947 | 
             
                        True if close successful
         | 
| 922 948 | 
             
                    """
         | 
| @@ -926,38 +952,38 @@ class TicketManagerInterface(ABC): | |
| 926 952 | 
             
            # Interface registry for dependency injection discovery
         | 
| 927 953 | 
             
            class InterfaceRegistry:
         | 
| 928 954 | 
             
                """Registry of all core interfaces for dependency injection"""
         | 
| 929 | 
            -
             | 
| 955 | 
            +
             | 
| 930 956 | 
             
                _interfaces = {
         | 
| 931 | 
            -
                     | 
| 932 | 
            -
                     | 
| 933 | 
            -
                     | 
| 934 | 
            -
                     | 
| 935 | 
            -
                     | 
| 936 | 
            -
                     | 
| 937 | 
            -
                     | 
| 938 | 
            -
                     | 
| 939 | 
            -
                     | 
| 940 | 
            -
                     | 
| 941 | 
            -
                     | 
| 942 | 
            -
                     | 
| 943 | 
            -
                     | 
| 944 | 
            -
                     | 
| 945 | 
            -
                     | 
| 946 | 
            -
                     | 
| 947 | 
            -
                     | 
| 957 | 
            +
                    "service_container": IServiceContainer,
         | 
| 958 | 
            +
                    "configuration_manager": IConfigurationManager,
         | 
| 959 | 
            +
                    "health_monitor": IHealthMonitor,
         | 
| 960 | 
            +
                    "agent_registry": IAgentRegistry,
         | 
| 961 | 
            +
                    "prompt_cache": IPromptCache,
         | 
| 962 | 
            +
                    "template_manager": ITemplateManager,
         | 
| 963 | 
            +
                    "structured_logger": IStructuredLogger,
         | 
| 964 | 
            +
                    "service_lifecycle": IServiceLifecycle,
         | 
| 965 | 
            +
                    "error_handler": IErrorHandler,
         | 
| 966 | 
            +
                    "performance_monitor": IPerformanceMonitor,
         | 
| 967 | 
            +
                    "event_bus": IEventBus,
         | 
| 968 | 
            +
                    "agent_deployment": AgentDeploymentInterface,
         | 
| 969 | 
            +
                    "memory_service": MemoryServiceInterface,
         | 
| 970 | 
            +
                    "hook_service": HookServiceInterface,
         | 
| 971 | 
            +
                    "socketio_service": SocketIOServiceInterface,
         | 
| 972 | 
            +
                    "project_analyzer": ProjectAnalyzerInterface,
         | 
| 973 | 
            +
                    "ticket_manager": TicketManagerInterface,
         | 
| 948 974 | 
             
                }
         | 
| 949 | 
            -
             | 
| 975 | 
            +
             | 
| 950 976 | 
             
                @classmethod
         | 
| 951 977 | 
             
                def get_interface(cls, name: str) -> Optional[type]:
         | 
| 952 978 | 
             
                    """Get interface by name"""
         | 
| 953 979 | 
             
                    return cls._interfaces.get(name)
         | 
| 954 | 
            -
             | 
| 980 | 
            +
             | 
| 955 981 | 
             
                @classmethod
         | 
| 956 982 | 
             
                def get_all_interfaces(cls) -> Dict[str, type]:
         | 
| 957 983 | 
             
                    """Get all registered interfaces"""
         | 
| 958 984 | 
             
                    return cls._interfaces.copy()
         | 
| 959 | 
            -
             | 
| 985 | 
            +
             | 
| 960 986 | 
             
                @classmethod
         | 
| 961 987 | 
             
                def register_interface(cls, name: str, interface: type) -> None:
         | 
| 962 988 | 
             
                    """Register a new interface"""
         | 
| 963 | 
            -
                    cls._interfaces[name] = interface
         | 
| 989 | 
            +
                    cls._interfaces[name] = interface
         |