claude-mpm 4.1.0__py3-none-any.whl → 4.1.2__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/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__main__.py +1 -1
- claude_mpm/agents/BASE_PM.md +74 -46
- claude_mpm/agents/INSTRUCTIONS.md +11 -153
- claude_mpm/agents/WORKFLOW.md +61 -321
- claude_mpm/agents/__init__.py +11 -11
- claude_mpm/agents/agent_loader.py +23 -20
- claude_mpm/agents/agent_loader_integration.py +1 -1
- claude_mpm/agents/agents_metadata.py +27 -0
- claude_mpm/agents/async_agent_loader.py +5 -8
- claude_mpm/agents/base_agent_loader.py +36 -25
- claude_mpm/agents/frontmatter_validator.py +6 -6
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +9 -9
- claude_mpm/agents/templates/api_qa.json +47 -2
- claude_mpm/agents/templates/imagemagick.json +256 -0
- claude_mpm/agents/templates/qa.json +41 -2
- claude_mpm/agents/templates/ticketing.json +5 -5
- claude_mpm/agents/templates/web_qa.json +133 -58
- claude_mpm/agents/templates/web_ui.json +3 -3
- claude_mpm/cli/__init__.py +51 -46
- claude_mpm/cli/__main__.py +1 -1
- claude_mpm/cli/commands/__init__.py +10 -12
- claude_mpm/cli/commands/agent_manager.py +186 -181
- claude_mpm/cli/commands/agents.py +271 -268
- claude_mpm/cli/commands/aggregate.py +30 -29
- claude_mpm/cli/commands/cleanup.py +50 -44
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
- claude_mpm/cli/commands/config.py +162 -127
- claude_mpm/cli/commands/doctor.py +52 -62
- claude_mpm/cli/commands/info.py +37 -25
- claude_mpm/cli/commands/mcp.py +3 -7
- claude_mpm/cli/commands/mcp_command_router.py +14 -18
- claude_mpm/cli/commands/mcp_install_commands.py +28 -23
- claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
- claude_mpm/cli/commands/mcp_server_commands.py +23 -17
- claude_mpm/cli/commands/memory.py +192 -141
- claude_mpm/cli/commands/monitor.py +117 -88
- claude_mpm/cli/commands/run.py +120 -84
- claude_mpm/cli/commands/run_config_checker.py +4 -5
- claude_mpm/cli/commands/socketio_monitor.py +17 -19
- claude_mpm/cli/commands/tickets.py +92 -92
- claude_mpm/cli/parser.py +1 -5
- claude_mpm/cli/parsers/__init__.py +1 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
- claude_mpm/cli/parsers/agents_parser.py +2 -3
- claude_mpm/cli/parsers/base_parser.py +7 -5
- claude_mpm/cli/parsers/mcp_parser.py +4 -2
- claude_mpm/cli/parsers/monitor_parser.py +26 -18
- claude_mpm/cli/shared/__init__.py +10 -10
- claude_mpm/cli/shared/argument_patterns.py +57 -71
- claude_mpm/cli/shared/base_command.py +61 -53
- claude_mpm/cli/shared/error_handling.py +62 -58
- claude_mpm/cli/shared/output_formatters.py +78 -77
- claude_mpm/cli/startup_logging.py +204 -172
- claude_mpm/cli/utils.py +10 -11
- claude_mpm/cli_module/__init__.py +1 -1
- claude_mpm/cli_module/args.py +1 -1
- claude_mpm/cli_module/migration_example.py +5 -5
- claude_mpm/config/__init__.py +9 -9
- claude_mpm/config/agent_config.py +15 -14
- claude_mpm/config/experimental_features.py +4 -4
- claude_mpm/config/paths.py +0 -1
- claude_mpm/config/socketio_config.py +5 -6
- claude_mpm/constants.py +1 -2
- claude_mpm/core/__init__.py +8 -8
- claude_mpm/core/agent_name_normalizer.py +1 -1
- claude_mpm/core/agent_registry.py +20 -23
- claude_mpm/core/agent_session_manager.py +3 -3
- claude_mpm/core/base_service.py +7 -15
- claude_mpm/core/cache.py +4 -6
- claude_mpm/core/claude_runner.py +85 -113
- claude_mpm/core/config.py +43 -28
- claude_mpm/core/config_aliases.py +0 -9
- claude_mpm/core/config_constants.py +52 -30
- claude_mpm/core/constants.py +0 -1
- claude_mpm/core/container.py +18 -27
- claude_mpm/core/exceptions.py +2 -2
- claude_mpm/core/factories.py +10 -12
- claude_mpm/core/framework_loader.py +581 -280
- claude_mpm/core/hook_manager.py +26 -22
- claude_mpm/core/hook_performance_config.py +58 -47
- claude_mpm/core/injectable_service.py +1 -1
- claude_mpm/core/interactive_session.py +61 -152
- claude_mpm/core/interfaces.py +1 -100
- claude_mpm/core/lazy.py +5 -5
- claude_mpm/core/log_manager.py +587 -0
- claude_mpm/core/logger.py +125 -8
- claude_mpm/core/logging_config.py +15 -15
- claude_mpm/core/minimal_framework_loader.py +5 -8
- claude_mpm/core/oneshot_session.py +15 -33
- claude_mpm/core/optimized_agent_loader.py +4 -6
- claude_mpm/core/optimized_startup.py +2 -1
- claude_mpm/core/output_style_manager.py +147 -106
- claude_mpm/core/pm_hook_interceptor.py +0 -1
- claude_mpm/core/service_registry.py +11 -8
- claude_mpm/core/session_manager.py +1 -2
- claude_mpm/core/shared/__init__.py +1 -1
- claude_mpm/core/shared/config_loader.py +101 -97
- claude_mpm/core/shared/path_resolver.py +72 -68
- claude_mpm/core/shared/singleton_manager.py +56 -50
- claude_mpm/core/socketio_pool.py +26 -6
- claude_mpm/core/tool_access_control.py +4 -5
- claude_mpm/core/typing_utils.py +50 -59
- claude_mpm/core/unified_agent_registry.py +14 -19
- claude_mpm/core/unified_config.py +4 -6
- claude_mpm/core/unified_paths.py +197 -109
- claude_mpm/dashboard/open_dashboard.py +2 -4
- claude_mpm/experimental/cli_enhancements.py +51 -36
- claude_mpm/generators/agent_profile_generator.py +2 -4
- claude_mpm/hooks/base_hook.py +1 -2
- claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
- claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
- claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
- claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
- claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
- claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
- claude_mpm/hooks/memory_integration_hook.py +5 -5
- claude_mpm/hooks/tool_call_interceptor.py +1 -1
- claude_mpm/hooks/validation_hooks.py +4 -4
- claude_mpm/init.py +4 -9
- claude_mpm/models/__init__.py +2 -2
- claude_mpm/models/agent_session.py +11 -14
- claude_mpm/scripts/mcp_server.py +20 -11
- claude_mpm/scripts/mcp_wrapper.py +5 -5
- claude_mpm/scripts/mpm_doctor.py +321 -0
- claude_mpm/scripts/socketio_daemon.py +28 -25
- claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
- claude_mpm/scripts/socketio_server_manager.py +116 -95
- claude_mpm/services/__init__.py +49 -49
- claude_mpm/services/agent_capabilities_service.py +12 -18
- claude_mpm/services/agents/__init__.py +22 -22
- claude_mpm/services/agents/agent_builder.py +140 -119
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
- claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
- claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
- claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
- claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
- claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
- claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
- claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
- claude_mpm/services/agents/deployment/agent_validator.py +0 -1
- claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
- claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
- claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
- claude_mpm/services/agents/deployment/config/__init__.py +1 -1
- claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
- claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
- claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
- claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
- claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
- claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
- claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
- claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
- claude_mpm/services/agents/deployment/results/__init__.py +1 -1
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
- claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
- claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
- claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
- claude_mpm/services/agents/loading/__init__.py +1 -1
- claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
- claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
- claude_mpm/services/agents/management/__init__.py +1 -1
- claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
- claude_mpm/services/agents/management/agent_management_service.py +5 -9
- claude_mpm/services/agents/memory/__init__.py +4 -4
- claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
- claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
- claude_mpm/services/agents/memory/content_manager.py +44 -38
- claude_mpm/services/agents/memory/template_generator.py +4 -6
- claude_mpm/services/agents/registry/__init__.py +10 -6
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
- claude_mpm/services/agents/registry/modification_tracker.py +3 -6
- claude_mpm/services/async_session_logger.py +1 -2
- claude_mpm/services/claude_session_logger.py +1 -2
- claude_mpm/services/command_deployment_service.py +173 -0
- claude_mpm/services/command_handler_service.py +20 -22
- claude_mpm/services/core/__init__.py +25 -25
- claude_mpm/services/core/base.py +0 -5
- claude_mpm/services/core/interfaces/__init__.py +32 -32
- claude_mpm/services/core/interfaces/agent.py +0 -21
- claude_mpm/services/core/interfaces/communication.py +0 -27
- claude_mpm/services/core/interfaces/infrastructure.py +0 -56
- claude_mpm/services/core/interfaces/service.py +0 -29
- claude_mpm/services/diagnostics/__init__.py +1 -1
- claude_mpm/services/diagnostics/checks/__init__.py +6 -6
- claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
- claude_mpm/services/diagnostics/checks/base_check.py +12 -16
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
- claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
- claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
- claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
- claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
- claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
- claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
- claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
- claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
- claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
- claude_mpm/services/diagnostics/models.py +21 -19
- claude_mpm/services/event_aggregator.py +10 -17
- claude_mpm/services/event_bus/__init__.py +1 -1
- claude_mpm/services/event_bus/config.py +54 -35
- claude_mpm/services/event_bus/event_bus.py +76 -71
- claude_mpm/services/event_bus/relay.py +74 -64
- claude_mpm/services/events/__init__.py +11 -11
- claude_mpm/services/events/consumers/__init__.py +3 -3
- claude_mpm/services/events/consumers/dead_letter.py +71 -63
- claude_mpm/services/events/consumers/logging.py +39 -37
- claude_mpm/services/events/consumers/metrics.py +56 -57
- claude_mpm/services/events/consumers/socketio.py +82 -81
- claude_mpm/services/events/core.py +110 -99
- claude_mpm/services/events/interfaces.py +56 -72
- claude_mpm/services/events/producers/__init__.py +1 -1
- claude_mpm/services/events/producers/hook.py +38 -38
- claude_mpm/services/events/producers/system.py +46 -44
- claude_mpm/services/exceptions.py +81 -80
- claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
- claude_mpm/services/hook_service.py +6 -9
- claude_mpm/services/infrastructure/__init__.py +1 -1
- claude_mpm/services/infrastructure/context_preservation.py +8 -12
- claude_mpm/services/infrastructure/monitoring.py +21 -23
- claude_mpm/services/mcp_gateway/__init__.py +37 -37
- claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
- claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
- claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
- claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
- claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
- claude_mpm/services/mcp_gateway/core/base.py +0 -3
- claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
- claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
- claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
- claude_mpm/services/mcp_gateway/main.py +2 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
- claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
- claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
- claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
- claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
- claude_mpm/services/memory/__init__.py +3 -3
- claude_mpm/services/memory/builder.py +3 -6
- claude_mpm/services/memory/cache/__init__.py +1 -1
- claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
- claude_mpm/services/memory/cache/simple_cache.py +1 -1
- claude_mpm/services/memory/indexed_memory.py +5 -7
- claude_mpm/services/memory/optimizer.py +7 -10
- claude_mpm/services/memory/router.py +8 -9
- claude_mpm/services/memory_hook_service.py +48 -34
- claude_mpm/services/monitor_build_service.py +77 -73
- claude_mpm/services/port_manager.py +130 -108
- claude_mpm/services/project/analyzer.py +12 -10
- claude_mpm/services/project/registry.py +11 -11
- claude_mpm/services/recovery_manager.py +10 -19
- claude_mpm/services/response_tracker.py +0 -1
- claude_mpm/services/runner_configuration_service.py +19 -20
- claude_mpm/services/session_management_service.py +7 -11
- claude_mpm/services/shared/__init__.py +1 -1
- claude_mpm/services/shared/async_service_base.py +58 -50
- claude_mpm/services/shared/config_service_base.py +73 -67
- claude_mpm/services/shared/lifecycle_service_base.py +82 -78
- claude_mpm/services/shared/manager_base.py +94 -82
- claude_mpm/services/shared/service_factory.py +96 -98
- claude_mpm/services/socketio/__init__.py +3 -3
- claude_mpm/services/socketio/client_proxy.py +5 -5
- claude_mpm/services/socketio/event_normalizer.py +199 -181
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +5 -4
- claude_mpm/services/socketio/handlers/connection.py +163 -136
- claude_mpm/services/socketio/handlers/file.py +13 -14
- claude_mpm/services/socketio/handlers/git.py +12 -7
- claude_mpm/services/socketio/handlers/hook.py +49 -44
- claude_mpm/services/socketio/handlers/memory.py +0 -1
- claude_mpm/services/socketio/handlers/project.py +0 -1
- claude_mpm/services/socketio/handlers/registry.py +37 -19
- claude_mpm/services/socketio/migration_utils.py +98 -84
- claude_mpm/services/socketio/server/__init__.py +1 -1
- claude_mpm/services/socketio/server/broadcaster.py +81 -87
- claude_mpm/services/socketio/server/core.py +65 -54
- claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
- claude_mpm/services/socketio/server/main.py +64 -38
- claude_mpm/services/socketio_client_manager.py +10 -12
- claude_mpm/services/subprocess_launcher_service.py +4 -7
- claude_mpm/services/system_instructions_service.py +13 -14
- claude_mpm/services/ticket_manager.py +2 -2
- claude_mpm/services/utility_service.py +5 -13
- claude_mpm/services/version_control/__init__.py +16 -16
- claude_mpm/services/version_control/branch_strategy.py +5 -8
- claude_mpm/services/version_control/conflict_resolution.py +9 -23
- claude_mpm/services/version_control/git_operations.py +5 -7
- claude_mpm/services/version_control/semantic_versioning.py +16 -17
- claude_mpm/services/version_control/version_parser.py +13 -18
- claude_mpm/services/version_service.py +10 -11
- claude_mpm/storage/__init__.py +1 -1
- claude_mpm/storage/state_storage.py +22 -28
- claude_mpm/utils/__init__.py +6 -6
- claude_mpm/utils/agent_dependency_loader.py +47 -33
- claude_mpm/utils/config_manager.py +11 -14
- claude_mpm/utils/dependency_cache.py +1 -1
- claude_mpm/utils/dependency_manager.py +13 -17
- claude_mpm/utils/dependency_strategies.py +8 -10
- claude_mpm/utils/environment_context.py +3 -9
- claude_mpm/utils/error_handler.py +3 -13
- claude_mpm/utils/file_utils.py +1 -1
- claude_mpm/utils/path_operations.py +8 -12
- claude_mpm/utils/robust_installer.py +110 -33
- claude_mpm/utils/subprocess_utils.py +5 -6
- claude_mpm/validation/agent_validator.py +3 -6
- claude_mpm/validation/frontmatter_validator.py +1 -1
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
- claude_mpm-4.1.2.dist-info/RECORD +498 -0
- claude_mpm-4.1.0.dist-info/RECORD +0 -494
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
|
@@ -8,223 +8,207 @@ Defines the contracts for event producers and consumers in the event bus system.
|
|
|
8
8
|
from abc import ABC, abstractmethod
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from enum import Enum
|
|
11
|
-
from typing import Any, Callable, Dict, List, Optional, Pattern
|
|
11
|
+
from typing import Any, Callable, Dict, List, Optional, Pattern
|
|
12
12
|
|
|
13
13
|
from .core import Event
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class ConsumerPriority(Enum):
|
|
17
17
|
"""Priority levels for event consumers."""
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
|
|
19
|
+
CRITICAL = 1 # Process first (e.g., error handlers)
|
|
20
|
+
HIGH = 2 # Important consumers (e.g., Socket.IO)
|
|
21
|
+
NORMAL = 3 # Default priority
|
|
22
|
+
LOW = 4 # Background processing
|
|
23
|
+
DEFERRED = 5 # Process last (e.g., metrics, logging)
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
@dataclass
|
|
26
27
|
class ConsumerConfig:
|
|
27
28
|
"""Configuration for an event consumer."""
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
|
|
30
|
+
name: str # Consumer identifier
|
|
31
|
+
topics: Optional[List[str]] = None # Topics to subscribe to (None = all)
|
|
32
|
+
topic_pattern: Optional[Pattern] = None # Regex pattern for topics
|
|
31
33
|
priority: ConsumerPriority = ConsumerPriority.NORMAL
|
|
32
|
-
batch_size: int = 1
|
|
33
|
-
batch_timeout: float = 0.0
|
|
34
|
-
max_retries: int = 3
|
|
35
|
-
retry_backoff: float = 1.0
|
|
36
|
-
error_handler: Optional[Callable] = None
|
|
37
|
-
filter_func: Optional[Callable] = None
|
|
38
|
-
transform_func: Optional[Callable] = None
|
|
34
|
+
batch_size: int = 1 # Process events in batches
|
|
35
|
+
batch_timeout: float = 0.0 # Max time to wait for batch
|
|
36
|
+
max_retries: int = 3 # Retry failed events
|
|
37
|
+
retry_backoff: float = 1.0 # Backoff multiplier
|
|
38
|
+
error_handler: Optional[Callable] = None # Custom error handler
|
|
39
|
+
filter_func: Optional[Callable] = None # Event filter function
|
|
40
|
+
transform_func: Optional[Callable] = None # Event transformation
|
|
39
41
|
|
|
40
42
|
|
|
41
43
|
class IEventProducer(ABC):
|
|
42
44
|
"""
|
|
43
45
|
Interface for event producers.
|
|
44
|
-
|
|
46
|
+
|
|
45
47
|
Producers create and publish events to the event bus without
|
|
46
48
|
knowing about consumers or handling errors.
|
|
47
49
|
"""
|
|
48
|
-
|
|
50
|
+
|
|
49
51
|
@abstractmethod
|
|
50
52
|
async def publish(self, event: Event) -> bool:
|
|
51
53
|
"""
|
|
52
54
|
Publish an event to the bus.
|
|
53
|
-
|
|
55
|
+
|
|
54
56
|
Args:
|
|
55
57
|
event: The event to publish
|
|
56
|
-
|
|
58
|
+
|
|
57
59
|
Returns:
|
|
58
60
|
True if event was accepted, False otherwise
|
|
59
61
|
"""
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
|
|
62
63
|
@abstractmethod
|
|
63
64
|
async def publish_batch(self, events: List[Event]) -> int:
|
|
64
65
|
"""
|
|
65
66
|
Publish multiple events efficiently.
|
|
66
|
-
|
|
67
|
+
|
|
67
68
|
Args:
|
|
68
69
|
events: List of events to publish
|
|
69
|
-
|
|
70
|
+
|
|
70
71
|
Returns:
|
|
71
72
|
Number of events successfully published
|
|
72
73
|
"""
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
@property
|
|
76
76
|
@abstractmethod
|
|
77
77
|
def source_name(self) -> str:
|
|
78
78
|
"""Get the name of this event source."""
|
|
79
|
-
pass
|
|
80
79
|
|
|
81
80
|
|
|
82
81
|
class IEventConsumer(ABC):
|
|
83
82
|
"""
|
|
84
83
|
Interface for event consumers.
|
|
85
|
-
|
|
84
|
+
|
|
86
85
|
Consumers subscribe to events and process them asynchronously.
|
|
87
86
|
Each consumer is responsible for its own error handling.
|
|
88
87
|
"""
|
|
89
|
-
|
|
88
|
+
|
|
90
89
|
@abstractmethod
|
|
91
90
|
async def initialize(self) -> bool:
|
|
92
91
|
"""
|
|
93
92
|
Initialize the consumer.
|
|
94
|
-
|
|
93
|
+
|
|
95
94
|
Returns:
|
|
96
95
|
True if initialization successful
|
|
97
96
|
"""
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
|
|
100
98
|
@abstractmethod
|
|
101
99
|
async def consume(self, event: Event) -> bool:
|
|
102
100
|
"""
|
|
103
101
|
Process a single event.
|
|
104
|
-
|
|
102
|
+
|
|
105
103
|
Args:
|
|
106
104
|
event: The event to process
|
|
107
|
-
|
|
105
|
+
|
|
108
106
|
Returns:
|
|
109
107
|
True if event processed successfully
|
|
110
108
|
"""
|
|
111
|
-
|
|
112
|
-
|
|
109
|
+
|
|
113
110
|
@abstractmethod
|
|
114
111
|
async def consume_batch(self, events: List[Event]) -> int:
|
|
115
112
|
"""
|
|
116
113
|
Process multiple events in a batch.
|
|
117
|
-
|
|
114
|
+
|
|
118
115
|
Args:
|
|
119
116
|
events: List of events to process
|
|
120
|
-
|
|
117
|
+
|
|
121
118
|
Returns:
|
|
122
119
|
Number of events successfully processed
|
|
123
120
|
"""
|
|
124
|
-
|
|
125
|
-
|
|
121
|
+
|
|
126
122
|
@abstractmethod
|
|
127
123
|
async def shutdown(self) -> None:
|
|
128
124
|
"""Shutdown the consumer gracefully."""
|
|
129
|
-
|
|
130
|
-
|
|
125
|
+
|
|
131
126
|
@property
|
|
132
127
|
@abstractmethod
|
|
133
128
|
def config(self) -> ConsumerConfig:
|
|
134
129
|
"""Get consumer configuration."""
|
|
135
|
-
|
|
136
|
-
|
|
130
|
+
|
|
137
131
|
@property
|
|
138
132
|
@abstractmethod
|
|
139
133
|
def is_healthy(self) -> bool:
|
|
140
134
|
"""Check if consumer is healthy."""
|
|
141
|
-
|
|
142
|
-
|
|
135
|
+
|
|
143
136
|
@abstractmethod
|
|
144
137
|
def get_metrics(self) -> Dict[str, Any]:
|
|
145
138
|
"""
|
|
146
139
|
Get consumer metrics.
|
|
147
|
-
|
|
140
|
+
|
|
148
141
|
Returns:
|
|
149
142
|
Dictionary of metrics (events processed, errors, etc.)
|
|
150
143
|
"""
|
|
151
|
-
pass
|
|
152
144
|
|
|
153
145
|
|
|
154
146
|
class IEventBus(ABC):
|
|
155
147
|
"""
|
|
156
148
|
Interface for the event bus.
|
|
157
|
-
|
|
149
|
+
|
|
158
150
|
The event bus manages subscriptions and routes events from
|
|
159
151
|
producers to consumers.
|
|
160
152
|
"""
|
|
161
|
-
|
|
153
|
+
|
|
162
154
|
@abstractmethod
|
|
163
155
|
async def start(self) -> None:
|
|
164
156
|
"""Start the event bus."""
|
|
165
|
-
|
|
166
|
-
|
|
157
|
+
|
|
167
158
|
@abstractmethod
|
|
168
159
|
async def stop(self) -> None:
|
|
169
160
|
"""Stop the event bus gracefully."""
|
|
170
|
-
|
|
171
|
-
|
|
161
|
+
|
|
172
162
|
@abstractmethod
|
|
173
163
|
async def publish(self, event: Event) -> bool:
|
|
174
164
|
"""
|
|
175
165
|
Publish an event to the bus.
|
|
176
|
-
|
|
166
|
+
|
|
177
167
|
Args:
|
|
178
168
|
event: The event to publish
|
|
179
|
-
|
|
169
|
+
|
|
180
170
|
Returns:
|
|
181
171
|
True if event was queued successfully
|
|
182
172
|
"""
|
|
183
|
-
|
|
184
|
-
|
|
173
|
+
|
|
185
174
|
@abstractmethod
|
|
186
175
|
async def subscribe(self, consumer: IEventConsumer) -> bool:
|
|
187
176
|
"""
|
|
188
177
|
Subscribe a consumer to the bus.
|
|
189
|
-
|
|
178
|
+
|
|
190
179
|
Args:
|
|
191
180
|
consumer: The consumer to subscribe
|
|
192
|
-
|
|
181
|
+
|
|
193
182
|
Returns:
|
|
194
183
|
True if subscription successful
|
|
195
184
|
"""
|
|
196
|
-
|
|
197
|
-
|
|
185
|
+
|
|
198
186
|
@abstractmethod
|
|
199
187
|
async def unsubscribe(self, consumer_name: str) -> bool:
|
|
200
188
|
"""
|
|
201
189
|
Unsubscribe a consumer from the bus.
|
|
202
|
-
|
|
190
|
+
|
|
203
191
|
Args:
|
|
204
192
|
consumer_name: Name of the consumer to unsubscribe
|
|
205
|
-
|
|
193
|
+
|
|
206
194
|
Returns:
|
|
207
195
|
True if unsubscription successful
|
|
208
196
|
"""
|
|
209
|
-
|
|
210
|
-
|
|
197
|
+
|
|
211
198
|
@abstractmethod
|
|
212
199
|
def get_consumers(self) -> List[IEventConsumer]:
|
|
213
200
|
"""Get list of active consumers."""
|
|
214
|
-
|
|
215
|
-
|
|
201
|
+
|
|
216
202
|
@abstractmethod
|
|
217
203
|
def get_metrics(self) -> Dict[str, Any]:
|
|
218
204
|
"""
|
|
219
205
|
Get event bus metrics.
|
|
220
|
-
|
|
206
|
+
|
|
221
207
|
Returns:
|
|
222
208
|
Dictionary of metrics (queue size, throughput, etc.)
|
|
223
209
|
"""
|
|
224
|
-
|
|
225
|
-
|
|
210
|
+
|
|
226
211
|
@property
|
|
227
212
|
@abstractmethod
|
|
228
213
|
def is_running(self) -> bool:
|
|
229
214
|
"""Check if event bus is running."""
|
|
230
|
-
pass
|
|
@@ -19,64 +19,64 @@ from ..interfaces import IEventBus, IEventProducer
|
|
|
19
19
|
class HookEventProducer(IEventProducer):
|
|
20
20
|
"""
|
|
21
21
|
Publishes hook events to the event bus.
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
This producer is used by the hook handler to publish events
|
|
24
24
|
without knowing about Socket.IO or other consumers.
|
|
25
25
|
"""
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
def __init__(self, event_bus: IEventBus):
|
|
28
28
|
"""
|
|
29
29
|
Initialize hook event producer.
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
Args:
|
|
32
32
|
event_bus: The event bus to publish to
|
|
33
33
|
"""
|
|
34
34
|
self.logger = get_logger("HookEventProducer")
|
|
35
35
|
self.event_bus = event_bus
|
|
36
36
|
self._source_name = "hook_handler"
|
|
37
|
-
|
|
37
|
+
|
|
38
38
|
# Metrics
|
|
39
39
|
self._metrics = {
|
|
40
40
|
"events_published": 0,
|
|
41
41
|
"events_failed": 0,
|
|
42
42
|
"batch_published": 0,
|
|
43
43
|
}
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
async def publish(self, event: Event) -> bool:
|
|
46
46
|
"""Publish a hook event to the bus."""
|
|
47
47
|
try:
|
|
48
48
|
success = await self.event_bus.publish(event)
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
if success:
|
|
51
51
|
self._metrics["events_published"] += 1
|
|
52
52
|
else:
|
|
53
53
|
self._metrics["events_failed"] += 1
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
return success
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
except Exception as e:
|
|
58
58
|
self.logger.error(f"Error publishing hook event: {e}")
|
|
59
59
|
self._metrics["events_failed"] += 1
|
|
60
60
|
return False
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
async def publish_batch(self, events: List[Event]) -> int:
|
|
63
63
|
"""Publish multiple hook events."""
|
|
64
64
|
successful = 0
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
for event in events:
|
|
67
67
|
if await self.publish(event):
|
|
68
68
|
successful += 1
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
self._metrics["batch_published"] += 1
|
|
71
71
|
return successful
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
@property
|
|
74
74
|
def source_name(self) -> str:
|
|
75
75
|
"""Get the name of this event source."""
|
|
76
76
|
return self._source_name
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
# Convenience methods for common hook events
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
async def publish_response(
|
|
81
81
|
self,
|
|
82
82
|
response_data: Dict[str, Any],
|
|
@@ -84,11 +84,11 @@ class HookEventProducer(IEventProducer):
|
|
|
84
84
|
) -> bool:
|
|
85
85
|
"""
|
|
86
86
|
Publish an assistant response event.
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
Args:
|
|
89
89
|
response_data: The response data
|
|
90
90
|
correlation_id: Optional correlation ID
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
Returns:
|
|
93
93
|
True if published successfully
|
|
94
94
|
"""
|
|
@@ -102,9 +102,9 @@ class HookEventProducer(IEventProducer):
|
|
|
102
102
|
correlation_id=correlation_id,
|
|
103
103
|
priority=EventPriority.HIGH,
|
|
104
104
|
)
|
|
105
|
-
|
|
105
|
+
|
|
106
106
|
return await self.publish(event)
|
|
107
|
-
|
|
107
|
+
|
|
108
108
|
async def publish_tool_use(
|
|
109
109
|
self,
|
|
110
110
|
tool_name: str,
|
|
@@ -114,13 +114,13 @@ class HookEventProducer(IEventProducer):
|
|
|
114
114
|
) -> bool:
|
|
115
115
|
"""
|
|
116
116
|
Publish a tool usage event.
|
|
117
|
-
|
|
117
|
+
|
|
118
118
|
Args:
|
|
119
119
|
tool_name: Name of the tool used
|
|
120
120
|
tool_params: Parameters passed to the tool
|
|
121
121
|
tool_result: Optional tool result
|
|
122
122
|
correlation_id: Optional correlation ID
|
|
123
|
-
|
|
123
|
+
|
|
124
124
|
Returns:
|
|
125
125
|
True if published successfully
|
|
126
126
|
"""
|
|
@@ -138,9 +138,9 @@ class HookEventProducer(IEventProducer):
|
|
|
138
138
|
correlation_id=correlation_id,
|
|
139
139
|
priority=EventPriority.NORMAL,
|
|
140
140
|
)
|
|
141
|
-
|
|
141
|
+
|
|
142
142
|
return await self.publish(event)
|
|
143
|
-
|
|
143
|
+
|
|
144
144
|
async def publish_error(
|
|
145
145
|
self,
|
|
146
146
|
error_type: str,
|
|
@@ -150,13 +150,13 @@ class HookEventProducer(IEventProducer):
|
|
|
150
150
|
) -> bool:
|
|
151
151
|
"""
|
|
152
152
|
Publish an error event.
|
|
153
|
-
|
|
153
|
+
|
|
154
154
|
Args:
|
|
155
155
|
error_type: Type of error
|
|
156
156
|
error_message: Error message
|
|
157
157
|
error_details: Optional additional details
|
|
158
158
|
correlation_id: Optional correlation ID
|
|
159
|
-
|
|
159
|
+
|
|
160
160
|
Returns:
|
|
161
161
|
True if published successfully
|
|
162
162
|
"""
|
|
@@ -174,9 +174,9 @@ class HookEventProducer(IEventProducer):
|
|
|
174
174
|
correlation_id=correlation_id,
|
|
175
175
|
priority=EventPriority.CRITICAL,
|
|
176
176
|
)
|
|
177
|
-
|
|
177
|
+
|
|
178
178
|
return await self.publish(event)
|
|
179
|
-
|
|
179
|
+
|
|
180
180
|
async def publish_subagent_event(
|
|
181
181
|
self,
|
|
182
182
|
subagent_name: str,
|
|
@@ -186,13 +186,13 @@ class HookEventProducer(IEventProducer):
|
|
|
186
186
|
) -> bool:
|
|
187
187
|
"""
|
|
188
188
|
Publish a subagent-related event.
|
|
189
|
-
|
|
189
|
+
|
|
190
190
|
Args:
|
|
191
191
|
subagent_name: Name of the subagent
|
|
192
192
|
event_type: Type of subagent event
|
|
193
193
|
event_data: Event data
|
|
194
194
|
correlation_id: Optional correlation ID
|
|
195
|
-
|
|
195
|
+
|
|
196
196
|
Returns:
|
|
197
197
|
True if published successfully
|
|
198
198
|
"""
|
|
@@ -209,9 +209,9 @@ class HookEventProducer(IEventProducer):
|
|
|
209
209
|
correlation_id=correlation_id,
|
|
210
210
|
priority=EventPriority.NORMAL,
|
|
211
211
|
)
|
|
212
|
-
|
|
212
|
+
|
|
213
213
|
return await self.publish(event)
|
|
214
|
-
|
|
214
|
+
|
|
215
215
|
async def publish_raw_hook_event(
|
|
216
216
|
self,
|
|
217
217
|
hook_type: str,
|
|
@@ -220,14 +220,14 @@ class HookEventProducer(IEventProducer):
|
|
|
220
220
|
) -> bool:
|
|
221
221
|
"""
|
|
222
222
|
Publish a raw hook event.
|
|
223
|
-
|
|
223
|
+
|
|
224
224
|
This is for hook events that don't fit the standard patterns.
|
|
225
|
-
|
|
225
|
+
|
|
226
226
|
Args:
|
|
227
227
|
hook_type: Type of hook event
|
|
228
228
|
hook_data: Raw hook data
|
|
229
229
|
correlation_id: Optional correlation ID
|
|
230
|
-
|
|
230
|
+
|
|
231
231
|
Returns:
|
|
232
232
|
True if published successfully
|
|
233
233
|
"""
|
|
@@ -242,7 +242,7 @@ class HookEventProducer(IEventProducer):
|
|
|
242
242
|
topic = "hook.subagent"
|
|
243
243
|
else:
|
|
244
244
|
topic = "hook.generic"
|
|
245
|
-
|
|
245
|
+
|
|
246
246
|
# Determine priority
|
|
247
247
|
if "error" in hook_type.lower() or "critical" in hook_type.lower():
|
|
248
248
|
priority = EventPriority.CRITICAL
|
|
@@ -250,7 +250,7 @@ class HookEventProducer(IEventProducer):
|
|
|
250
250
|
priority = EventPriority.HIGH
|
|
251
251
|
else:
|
|
252
252
|
priority = EventPriority.NORMAL
|
|
253
|
-
|
|
253
|
+
|
|
254
254
|
event = Event(
|
|
255
255
|
id=str(uuid.uuid4()),
|
|
256
256
|
topic=topic,
|
|
@@ -261,9 +261,9 @@ class HookEventProducer(IEventProducer):
|
|
|
261
261
|
correlation_id=correlation_id,
|
|
262
262
|
priority=priority,
|
|
263
263
|
)
|
|
264
|
-
|
|
264
|
+
|
|
265
265
|
return await self.publish(event)
|
|
266
|
-
|
|
266
|
+
|
|
267
267
|
def get_metrics(self) -> Dict[str, Any]:
|
|
268
268
|
"""Get producer metrics."""
|
|
269
|
-
return self._metrics
|
|
269
|
+
return self._metrics
|