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,137 +8,141 @@ from ...core.config import Config
|
|
|
8
8
|
from ...core.logger import get_logger
|
|
9
9
|
from ...core.shared import ConfigLoader, PathResolver, SingletonManager
|
|
10
10
|
|
|
11
|
-
T = TypeVar(
|
|
11
|
+
T = TypeVar("T")
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class ServiceFactory:
|
|
15
15
|
"""
|
|
16
16
|
Factory for creating services with common patterns.
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
Reduces duplication by providing standard service creation patterns:
|
|
19
19
|
- Configuration injection
|
|
20
20
|
- Dependency resolution
|
|
21
21
|
- Singleton management
|
|
22
22
|
- Standard initialization
|
|
23
23
|
"""
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
def __init__(self):
|
|
26
26
|
"""Initialize service factory."""
|
|
27
27
|
self.logger = get_logger("service_factory")
|
|
28
28
|
self._config_loader = ConfigLoader()
|
|
29
29
|
self._path_resolver = PathResolver()
|
|
30
30
|
self._registered_services: Dict[str, Type] = {}
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
def register_service(self, service_name: str, service_class: Type[T]) -> None:
|
|
33
33
|
"""
|
|
34
34
|
Register a service class.
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
Args:
|
|
37
37
|
service_name: Name to register service under
|
|
38
38
|
service_class: Service class to register
|
|
39
39
|
"""
|
|
40
40
|
self._registered_services[service_name] = service_class
|
|
41
|
-
self.logger.debug(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
self.logger.debug(
|
|
42
|
+
f"Registered service: {service_name} -> {service_class.__name__}"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
def create_service(
|
|
46
|
+
self,
|
|
47
|
+
service_class: Type[T],
|
|
48
|
+
service_name: Optional[str] = None,
|
|
49
|
+
config: Optional[Dict[str, Any]] = None,
|
|
50
|
+
singleton: bool = False,
|
|
51
|
+
**kwargs,
|
|
52
|
+
) -> T:
|
|
49
53
|
"""
|
|
50
54
|
Create a service instance with standard patterns.
|
|
51
|
-
|
|
55
|
+
|
|
52
56
|
Args:
|
|
53
57
|
service_class: Service class to instantiate
|
|
54
58
|
service_name: Optional service name (defaults to class name)
|
|
55
59
|
config: Optional configuration override
|
|
56
60
|
singleton: Whether to use singleton pattern
|
|
57
61
|
**kwargs: Additional constructor arguments
|
|
58
|
-
|
|
62
|
+
|
|
59
63
|
Returns:
|
|
60
64
|
Service instance
|
|
61
65
|
"""
|
|
62
66
|
if service_name is None:
|
|
63
67
|
service_name = service_class.__name__
|
|
64
|
-
|
|
68
|
+
|
|
65
69
|
self.logger.debug(f"Creating service: {service_name}")
|
|
66
|
-
|
|
70
|
+
|
|
67
71
|
# Load configuration if not provided
|
|
68
72
|
if config is None:
|
|
69
73
|
config = self._load_service_config(service_name)
|
|
70
|
-
|
|
74
|
+
|
|
71
75
|
# Prepare constructor arguments
|
|
72
|
-
constructor_args = {
|
|
73
|
-
|
|
74
|
-
"config": config,
|
|
75
|
-
**kwargs
|
|
76
|
-
}
|
|
77
|
-
|
|
76
|
+
constructor_args = {"service_name": service_name, "config": config, **kwargs}
|
|
77
|
+
|
|
78
78
|
# Filter arguments based on constructor signature
|
|
79
79
|
filtered_args = self._filter_constructor_args(service_class, constructor_args)
|
|
80
|
-
|
|
80
|
+
|
|
81
81
|
# Create instance
|
|
82
82
|
if singleton:
|
|
83
83
|
instance = SingletonManager.get_instance(service_class, **filtered_args)
|
|
84
84
|
else:
|
|
85
85
|
instance = service_class(**filtered_args)
|
|
86
|
-
|
|
86
|
+
|
|
87
87
|
self.logger.info(f"Created service: {service_name} ({service_class.__name__})")
|
|
88
88
|
return instance
|
|
89
|
-
|
|
90
|
-
def create_registered_service(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
89
|
+
|
|
90
|
+
def create_registered_service(
|
|
91
|
+
self,
|
|
92
|
+
service_name: str,
|
|
93
|
+
config: Optional[Dict[str, Any]] = None,
|
|
94
|
+
singleton: bool = False,
|
|
95
|
+
**kwargs,
|
|
96
|
+
) -> Any:
|
|
95
97
|
"""
|
|
96
98
|
Create a service by registered name.
|
|
97
|
-
|
|
99
|
+
|
|
98
100
|
Args:
|
|
99
101
|
service_name: Name of registered service
|
|
100
102
|
config: Optional configuration override
|
|
101
103
|
singleton: Whether to use singleton pattern
|
|
102
104
|
**kwargs: Additional constructor arguments
|
|
103
|
-
|
|
105
|
+
|
|
104
106
|
Returns:
|
|
105
107
|
Service instance
|
|
106
|
-
|
|
108
|
+
|
|
107
109
|
Raises:
|
|
108
110
|
ValueError: If service not registered
|
|
109
111
|
"""
|
|
110
112
|
if service_name not in self._registered_services:
|
|
111
113
|
raise ValueError(f"Service not registered: {service_name}")
|
|
112
|
-
|
|
114
|
+
|
|
113
115
|
service_class = self._registered_services[service_name]
|
|
114
116
|
return self.create_service(
|
|
115
117
|
service_class=service_class,
|
|
116
118
|
service_name=service_name,
|
|
117
119
|
config=config,
|
|
118
120
|
singleton=singleton,
|
|
119
|
-
**kwargs
|
|
121
|
+
**kwargs,
|
|
120
122
|
)
|
|
121
|
-
|
|
122
|
-
def create_agent_service(
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
123
|
+
|
|
124
|
+
def create_agent_service(
|
|
125
|
+
self,
|
|
126
|
+
service_class: Type[T],
|
|
127
|
+
agent_name: str,
|
|
128
|
+
agent_dir: Optional[str] = None,
|
|
129
|
+
**kwargs,
|
|
130
|
+
) -> T:
|
|
127
131
|
"""
|
|
128
132
|
Create an agent-related service.
|
|
129
|
-
|
|
133
|
+
|
|
130
134
|
Args:
|
|
131
135
|
service_class: Service class to instantiate
|
|
132
136
|
agent_name: Name of the agent
|
|
133
137
|
agent_dir: Optional agent directory
|
|
134
138
|
**kwargs: Additional constructor arguments
|
|
135
|
-
|
|
139
|
+
|
|
136
140
|
Returns:
|
|
137
141
|
Service instance
|
|
138
142
|
"""
|
|
139
143
|
# Load agent-specific configuration
|
|
140
144
|
config = self._config_loader.load_agent_config(agent_dir)
|
|
141
|
-
|
|
145
|
+
|
|
142
146
|
# Add agent-specific paths
|
|
143
147
|
if agent_dir:
|
|
144
148
|
agent_path = self._path_resolver.resolve_relative_path(agent_dir)
|
|
@@ -146,97 +150,94 @@ class ServiceFactory:
|
|
|
146
150
|
agent_path = self._path_resolver.find_agent_file(agent_name)
|
|
147
151
|
if agent_path:
|
|
148
152
|
agent_path = agent_path.parent
|
|
149
|
-
|
|
153
|
+
|
|
150
154
|
constructor_args = {
|
|
151
155
|
"agent_name": agent_name,
|
|
152
156
|
"agent_dir": agent_path,
|
|
153
157
|
"config": config,
|
|
154
|
-
**kwargs
|
|
158
|
+
**kwargs,
|
|
155
159
|
}
|
|
156
|
-
|
|
160
|
+
|
|
157
161
|
return self.create_service(
|
|
158
162
|
service_class=service_class,
|
|
159
163
|
service_name=f"agent_{agent_name}",
|
|
160
164
|
config=config,
|
|
161
|
-
**constructor_args
|
|
165
|
+
**constructor_args,
|
|
162
166
|
)
|
|
163
|
-
|
|
164
|
-
def create_memory_service(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
167
|
+
|
|
168
|
+
def create_memory_service(
|
|
169
|
+
self,
|
|
170
|
+
service_class: Type[T],
|
|
171
|
+
agent_name: Optional[str] = None,
|
|
172
|
+
memory_dir: Optional[str] = None,
|
|
173
|
+
**kwargs,
|
|
174
|
+
) -> T:
|
|
169
175
|
"""
|
|
170
176
|
Create a memory-related service.
|
|
171
|
-
|
|
177
|
+
|
|
172
178
|
Args:
|
|
173
179
|
service_class: Service class to instantiate
|
|
174
180
|
agent_name: Optional agent name
|
|
175
181
|
memory_dir: Optional memory directory
|
|
176
182
|
**kwargs: Additional constructor arguments
|
|
177
|
-
|
|
183
|
+
|
|
178
184
|
Returns:
|
|
179
185
|
Service instance
|
|
180
186
|
"""
|
|
181
187
|
# Load memory-specific configuration
|
|
182
188
|
config = self._config_loader.load_memory_config(memory_dir)
|
|
183
|
-
|
|
189
|
+
|
|
184
190
|
# Resolve memory directory
|
|
185
191
|
if memory_dir:
|
|
186
192
|
memory_path = self._path_resolver.resolve_relative_path(memory_dir)
|
|
187
193
|
else:
|
|
188
194
|
memory_path = self._path_resolver.resolve_memories_dir(create=True)
|
|
189
|
-
|
|
190
|
-
constructor_args = {
|
|
191
|
-
|
|
192
|
-
"config": config,
|
|
193
|
-
**kwargs
|
|
194
|
-
}
|
|
195
|
-
|
|
195
|
+
|
|
196
|
+
constructor_args = {"memory_dir": memory_path, "config": config, **kwargs}
|
|
197
|
+
|
|
196
198
|
if agent_name:
|
|
197
199
|
constructor_args["agent_name"] = agent_name
|
|
198
|
-
|
|
200
|
+
|
|
199
201
|
service_name = f"memory_{agent_name}" if agent_name else "memory"
|
|
200
|
-
|
|
202
|
+
|
|
201
203
|
return self.create_service(
|
|
202
204
|
service_class=service_class,
|
|
203
205
|
service_name=service_name,
|
|
204
206
|
config=config,
|
|
205
|
-
**constructor_args
|
|
207
|
+
**constructor_args,
|
|
206
208
|
)
|
|
207
|
-
|
|
208
|
-
def create_config_service(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
**kwargs) -> T:
|
|
209
|
+
|
|
210
|
+
def create_config_service(
|
|
211
|
+
self, service_class: Type[T], config_section: Optional[str] = None, **kwargs
|
|
212
|
+
) -> T:
|
|
212
213
|
"""
|
|
213
214
|
Create a configuration-heavy service.
|
|
214
|
-
|
|
215
|
+
|
|
215
216
|
Args:
|
|
216
217
|
service_class: Service class to instantiate
|
|
217
218
|
config_section: Configuration section name
|
|
218
219
|
**kwargs: Additional constructor arguments
|
|
219
|
-
|
|
220
|
+
|
|
220
221
|
Returns:
|
|
221
222
|
Service instance
|
|
222
223
|
"""
|
|
223
224
|
# Load service-specific configuration
|
|
224
225
|
service_name = config_section or service_class.__name__.lower()
|
|
225
226
|
config = self._config_loader.load_service_config(service_name)
|
|
226
|
-
|
|
227
|
+
|
|
227
228
|
constructor_args = {
|
|
228
229
|
"config": config,
|
|
229
230
|
"config_section": config_section,
|
|
230
|
-
**kwargs
|
|
231
|
+
**kwargs,
|
|
231
232
|
}
|
|
232
|
-
|
|
233
|
+
|
|
233
234
|
return self.create_service(
|
|
234
235
|
service_class=service_class,
|
|
235
236
|
service_name=service_name,
|
|
236
237
|
config=config,
|
|
237
|
-
**constructor_args
|
|
238
|
+
**constructor_args,
|
|
238
239
|
)
|
|
239
|
-
|
|
240
|
+
|
|
240
241
|
def _load_service_config(self, service_name: str) -> Config:
|
|
241
242
|
"""Load configuration for a service."""
|
|
242
243
|
try:
|
|
@@ -245,44 +246,41 @@ class ServiceFactory:
|
|
|
245
246
|
self.logger.warning(f"Failed to load config for {service_name}: {e}")
|
|
246
247
|
# Return default config using ConfigLoader
|
|
247
248
|
return self._config_loader.load_main_config()
|
|
248
|
-
|
|
249
|
-
def _filter_constructor_args(
|
|
250
|
-
|
|
251
|
-
|
|
249
|
+
|
|
250
|
+
def _filter_constructor_args(
|
|
251
|
+
self, service_class: Type, args: Dict[str, Any]
|
|
252
|
+
) -> Dict[str, Any]:
|
|
252
253
|
"""Filter constructor arguments based on class signature."""
|
|
253
254
|
import inspect
|
|
254
|
-
|
|
255
|
+
|
|
255
256
|
try:
|
|
256
257
|
# Get constructor signature
|
|
257
258
|
sig = inspect.signature(service_class.__init__)
|
|
258
|
-
param_names = set(sig.parameters.keys()) - {
|
|
259
|
-
|
|
259
|
+
param_names = set(sig.parameters.keys()) - {"self"}
|
|
260
|
+
|
|
260
261
|
# Filter arguments
|
|
261
262
|
filtered = {k: v for k, v in args.items() if k in param_names}
|
|
262
|
-
|
|
263
|
+
|
|
263
264
|
# Log filtered arguments
|
|
264
265
|
if len(filtered) != len(args):
|
|
265
266
|
filtered_out = set(args.keys()) - set(filtered.keys())
|
|
266
267
|
self.logger.debug(f"Filtered out arguments: {filtered_out}")
|
|
267
|
-
|
|
268
|
+
|
|
268
269
|
return filtered
|
|
269
|
-
|
|
270
|
+
|
|
270
271
|
except Exception as e:
|
|
271
272
|
self.logger.warning(f"Failed to filter constructor args: {e}")
|
|
272
273
|
return args
|
|
273
|
-
|
|
274
|
+
|
|
274
275
|
def get_registered_services(self) -> Dict[str, str]:
|
|
275
276
|
"""
|
|
276
277
|
Get list of registered services.
|
|
277
|
-
|
|
278
|
+
|
|
278
279
|
Returns:
|
|
279
280
|
Dictionary mapping service names to class names
|
|
280
281
|
"""
|
|
281
|
-
return {
|
|
282
|
-
|
|
283
|
-
for name, cls in self._registered_services.items()
|
|
284
|
-
}
|
|
285
|
-
|
|
282
|
+
return {name: cls.__name__ for name, cls in self._registered_services.items()}
|
|
283
|
+
|
|
286
284
|
def clear_registrations(self) -> None:
|
|
287
285
|
"""Clear all service registrations."""
|
|
288
286
|
self._registered_services.clear()
|
|
@@ -17,9 +17,9 @@ from .handlers import (
|
|
|
17
17
|
__all__ = [
|
|
18
18
|
"BaseEventHandler",
|
|
19
19
|
"ConnectionEventHandler",
|
|
20
|
-
"
|
|
21
|
-
"MemoryEventHandler",
|
|
20
|
+
"EventHandlerRegistry",
|
|
22
21
|
"FileEventHandler",
|
|
23
22
|
"GitEventHandler",
|
|
24
|
-
"
|
|
23
|
+
"MemoryEventHandler",
|
|
24
|
+
"ProjectEventHandler",
|
|
25
25
|
]
|
|
@@ -14,7 +14,7 @@ import asyncio
|
|
|
14
14
|
import threading
|
|
15
15
|
import time
|
|
16
16
|
from datetime import datetime
|
|
17
|
-
from typing import Any, Dict, List, Optional
|
|
17
|
+
from typing import Any, Dict, List, Optional
|
|
18
18
|
|
|
19
19
|
try:
|
|
20
20
|
import socketio
|
|
@@ -55,7 +55,7 @@ class SocketIOClientProxy:
|
|
|
55
55
|
|
|
56
56
|
def stop_sync(self):
|
|
57
57
|
"""Stop the Socket.IO client connection."""
|
|
58
|
-
self.logger.debug(
|
|
58
|
+
self.logger.debug("SocketIOClientProxy: Disconnecting from server")
|
|
59
59
|
if self._sio_client:
|
|
60
60
|
self._sio_client.disconnect()
|
|
61
61
|
|
|
@@ -90,7 +90,7 @@ class SocketIOClientProxy:
|
|
|
90
90
|
|
|
91
91
|
@self._sio_client.event
|
|
92
92
|
async def disconnect():
|
|
93
|
-
self.logger.info(
|
|
93
|
+
self.logger.info("SocketIOClientProxy: Disconnected from server")
|
|
94
94
|
|
|
95
95
|
# Connect to the server
|
|
96
96
|
await self._sio_client.connect(f"http://127.0.0.1:{self.port}")
|
|
@@ -128,7 +128,7 @@ class SocketIOClientProxy:
|
|
|
128
128
|
and not self._client_loop.is_closed()
|
|
129
129
|
):
|
|
130
130
|
try:
|
|
131
|
-
|
|
131
|
+
asyncio.run_coroutine_threadsafe(
|
|
132
132
|
self._sio_client.emit("claude_event", event),
|
|
133
133
|
self._client_loop,
|
|
134
134
|
)
|
|
@@ -160,7 +160,7 @@ class SocketIOClientProxy:
|
|
|
160
160
|
self.logger.debug(f"SocketIOClientProxy: Session started {session_id}")
|
|
161
161
|
|
|
162
162
|
def session_ended(self):
|
|
163
|
-
self.logger.debug(
|
|
163
|
+
self.logger.debug("SocketIOClientProxy: Session ended")
|
|
164
164
|
|
|
165
165
|
def claude_status_changed(
|
|
166
166
|
self, status: str, pid: Optional[int] = None, message: str = ""
|