claude-mpm 3.4.10__py3-none-any.whl → 5.4.55__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 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +290 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1402 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +90 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2503 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +2654 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1246 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +297 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1947 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +644 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1743 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- 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 +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +132 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +278 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +483 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +570 -0
- claude_mpm/core/unified_paths.py +941 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +201 -107
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1369 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -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 +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -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/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -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 +162 -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 +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -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/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -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 +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1202 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- 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 +5 -4
- 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 +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +707 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1324 -0
- claude_mpm/services/skills/selective_skill_deployer.py +744 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1090 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +823 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.55.dist-info/METADATA +999 -0
- claude_mpm-5.4.55.dist-info/RECORD +868 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.55.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.55.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- 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 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/top_level.txt +0 -0
claude_mpm/core/base_service.py
CHANGED
|
@@ -18,29 +18,28 @@ Provides:
|
|
|
18
18
|
|
|
19
19
|
import asyncio
|
|
20
20
|
import logging
|
|
21
|
-
import signal
|
|
22
|
-
import sys
|
|
23
21
|
import os
|
|
22
|
+
import signal
|
|
23
|
+
import threading
|
|
24
24
|
import time
|
|
25
25
|
import traceback
|
|
26
|
-
import threading
|
|
27
26
|
from abc import ABC, abstractmethod
|
|
27
|
+
from contextlib import asynccontextmanager
|
|
28
28
|
from dataclasses import dataclass, field
|
|
29
|
-
from datetime import datetime, timedelta
|
|
30
|
-
from typing import Any, Dict, List, Optional, Union, Type, Callable
|
|
29
|
+
from datetime import datetime, timedelta, timezone
|
|
31
30
|
from pathlib import Path
|
|
32
|
-
from
|
|
33
|
-
import json
|
|
31
|
+
from typing import Any, Dict, List, Optional
|
|
34
32
|
|
|
35
33
|
from .config import Config
|
|
36
|
-
from .
|
|
34
|
+
from .enums import HealthStatus
|
|
37
35
|
from .mixins import LoggerMixin
|
|
38
36
|
|
|
39
37
|
|
|
40
38
|
@dataclass
|
|
41
39
|
class ServiceHealth:
|
|
42
40
|
"""Service health status information."""
|
|
43
|
-
|
|
41
|
+
|
|
42
|
+
status: HealthStatus # Type-safe health status using enum
|
|
44
43
|
message: str
|
|
45
44
|
timestamp: str
|
|
46
45
|
metrics: Dict[str, Any] = field(default_factory=dict)
|
|
@@ -50,6 +49,7 @@ class ServiceHealth:
|
|
|
50
49
|
@dataclass
|
|
51
50
|
class ServiceMetrics:
|
|
52
51
|
"""Service metrics collection."""
|
|
52
|
+
|
|
53
53
|
requests_total: int = 0
|
|
54
54
|
requests_failed: int = 0
|
|
55
55
|
response_time_avg: float = 0.0
|
|
@@ -61,6 +61,7 @@ class ServiceMetrics:
|
|
|
61
61
|
@dataclass
|
|
62
62
|
class ServiceContext:
|
|
63
63
|
"""Service execution context with request tracking (enhanced feature)."""
|
|
64
|
+
|
|
64
65
|
request_id: str
|
|
65
66
|
start_time: float
|
|
66
67
|
service_name: str
|
|
@@ -71,6 +72,7 @@ class ServiceContext:
|
|
|
71
72
|
@dataclass
|
|
72
73
|
class CircuitBreakerState:
|
|
73
74
|
"""Circuit breaker state for service resilience (enhanced feature)."""
|
|
75
|
+
|
|
74
76
|
failure_count: int = 0
|
|
75
77
|
last_failure_time: Optional[float] = None
|
|
76
78
|
state: str = "closed" # closed, open, half_open
|
|
@@ -100,12 +102,12 @@ class BaseService(LoggerMixin, ABC):
|
|
|
100
102
|
"""
|
|
101
103
|
|
|
102
104
|
def __init__(
|
|
103
|
-
self,
|
|
104
|
-
name: str,
|
|
105
|
-
config: Optional[Dict[str, Any]] = None,
|
|
105
|
+
self,
|
|
106
|
+
name: str,
|
|
107
|
+
config: Optional[Dict[str, Any]] = None,
|
|
106
108
|
config_path: Optional[Path] = None,
|
|
107
109
|
enable_enhanced_features: bool = False,
|
|
108
|
-
container: Optional[Any] = None
|
|
110
|
+
container: Optional[Any] = None,
|
|
109
111
|
):
|
|
110
112
|
"""
|
|
111
113
|
Initialize the base service.
|
|
@@ -118,12 +120,20 @@ class BaseService(LoggerMixin, ABC):
|
|
|
118
120
|
container: Optional service container for dependency injection
|
|
119
121
|
"""
|
|
120
122
|
self.name = name
|
|
121
|
-
|
|
123
|
+
# Use singleton Config instance to prevent duplicate configuration loading
|
|
124
|
+
# Only pass config_path if it's different from what might already be loaded
|
|
125
|
+
if config_path:
|
|
126
|
+
self.config = Config(config or {}, config_path)
|
|
127
|
+
else:
|
|
128
|
+
# Use existing singleton instance without forcing reload
|
|
129
|
+
self.config = Config(config or {})
|
|
122
130
|
self._enable_enhanced = enable_enhanced_features
|
|
123
131
|
self._container = container
|
|
124
|
-
|
|
132
|
+
|
|
125
133
|
# Set custom logger name based on service name
|
|
126
|
-
self._logger_name =
|
|
134
|
+
self._logger_name = (
|
|
135
|
+
f"{self.__class__.__module__}.{self.__class__.__name__}.{name}"
|
|
136
|
+
)
|
|
127
137
|
|
|
128
138
|
# Service state
|
|
129
139
|
self._running = False
|
|
@@ -133,7 +143,9 @@ class BaseService(LoggerMixin, ABC):
|
|
|
133
143
|
|
|
134
144
|
# Health and metrics
|
|
135
145
|
self._health = ServiceHealth(
|
|
136
|
-
status=
|
|
146
|
+
status=HealthStatus.UNKNOWN,
|
|
147
|
+
message="Service not started",
|
|
148
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
137
149
|
)
|
|
138
150
|
self._metrics = ServiceMetrics()
|
|
139
151
|
self._last_health_check: Optional[float] = None
|
|
@@ -144,39 +156,37 @@ class BaseService(LoggerMixin, ABC):
|
|
|
144
156
|
# Enhanced features (only initialized if enabled)
|
|
145
157
|
if self._enable_enhanced:
|
|
146
158
|
self._init_enhanced_features()
|
|
147
|
-
|
|
159
|
+
|
|
148
160
|
# Check for quiet mode
|
|
149
|
-
|
|
150
|
-
if os.getenv('CLAUDE_PM_QUIET_MODE') == 'true':
|
|
151
|
-
default_log_level = "WARNING"
|
|
161
|
+
if os.getenv("CLAUDE_PM_QUIET_MODE") == "true":
|
|
152
162
|
self.logger.setLevel(logging.WARNING)
|
|
153
|
-
|
|
163
|
+
|
|
154
164
|
# Only log if not in quiet mode
|
|
155
|
-
if
|
|
156
|
-
self.logger.
|
|
165
|
+
if os.environ.get("CLAUDE_PM_QUIET_MODE", "").lower() != "true":
|
|
166
|
+
self.logger.debug(f"Initialized {self.name} service")
|
|
157
167
|
|
|
158
168
|
def _init_enhanced_features(self):
|
|
159
169
|
"""Initialize enhanced features when enabled."""
|
|
160
170
|
# Circuit breaker for resilience
|
|
161
171
|
self._circuit_breaker = CircuitBreakerState()
|
|
162
|
-
|
|
172
|
+
|
|
163
173
|
# Error tracking
|
|
164
174
|
self._error_counts: Dict[str, int] = {}
|
|
165
|
-
|
|
175
|
+
|
|
166
176
|
# Request tracking
|
|
167
177
|
self._request_contexts: Dict[str, ServiceContext] = {}
|
|
168
|
-
|
|
178
|
+
|
|
169
179
|
# Performance metrics
|
|
170
180
|
self._performance_metrics: Dict[str, List[float]] = {}
|
|
171
|
-
|
|
181
|
+
|
|
172
182
|
# Thread safety
|
|
173
183
|
self._lock = threading.RLock()
|
|
174
|
-
|
|
184
|
+
|
|
175
185
|
# Optional service dependencies
|
|
176
186
|
self._health_monitor: Optional[Any] = None
|
|
177
187
|
self._error_handler: Optional[Any] = None
|
|
178
188
|
self._cache: Optional[Any] = None
|
|
179
|
-
|
|
189
|
+
|
|
180
190
|
# Register dependencies if container provided
|
|
181
191
|
if self._container:
|
|
182
192
|
self._register_service_dependencies()
|
|
@@ -190,7 +200,7 @@ class BaseService(LoggerMixin, ABC):
|
|
|
190
200
|
def uptime(self) -> Optional[float]:
|
|
191
201
|
"""Get service uptime in seconds."""
|
|
192
202
|
if self._start_time and self._running:
|
|
193
|
-
return (datetime.now() - self._start_time).total_seconds()
|
|
203
|
+
return (datetime.now(timezone.utc) - self._start_time).total_seconds()
|
|
194
204
|
return None
|
|
195
205
|
|
|
196
206
|
@property
|
|
@@ -226,14 +236,16 @@ class BaseService(LoggerMixin, ABC):
|
|
|
226
236
|
except Exception as e:
|
|
227
237
|
self.logger.error(f"Failed to start service {self.name}: {e}")
|
|
228
238
|
self._health = ServiceHealth(
|
|
229
|
-
status=
|
|
230
|
-
message=f"Startup failed: {
|
|
231
|
-
timestamp=datetime.now().isoformat(),
|
|
239
|
+
status=HealthStatus.UNHEALTHY,
|
|
240
|
+
message=f"Startup failed: {e!s}",
|
|
241
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
232
242
|
checks={"startup": False},
|
|
233
243
|
)
|
|
234
|
-
|
|
235
|
-
if self._enable_enhanced and hasattr(self,
|
|
236
|
-
await self._handle_error(
|
|
244
|
+
|
|
245
|
+
if self._enable_enhanced and hasattr(self, "_handle_error"):
|
|
246
|
+
await self._handle_error(
|
|
247
|
+
e, {"operation": "start", "service": self.name}
|
|
248
|
+
)
|
|
237
249
|
raise
|
|
238
250
|
|
|
239
251
|
async def _start_internal(self):
|
|
@@ -242,7 +254,7 @@ class BaseService(LoggerMixin, ABC):
|
|
|
242
254
|
self._setup_signal_handlers()
|
|
243
255
|
|
|
244
256
|
# Initialize dependencies if enhanced
|
|
245
|
-
if self._enable_enhanced and hasattr(self,
|
|
257
|
+
if self._enable_enhanced and hasattr(self, "_initialize_dependencies"):
|
|
246
258
|
await self._initialize_dependencies()
|
|
247
259
|
|
|
248
260
|
# Initialize service
|
|
@@ -252,20 +264,20 @@ class BaseService(LoggerMixin, ABC):
|
|
|
252
264
|
await self._start_background_tasks()
|
|
253
265
|
|
|
254
266
|
# Register with health monitor if available
|
|
255
|
-
if self._enable_enhanced and hasattr(self,
|
|
267
|
+
if self._enable_enhanced and hasattr(self, "_register_with_health_monitor"):
|
|
256
268
|
await self._register_with_health_monitor()
|
|
257
269
|
|
|
258
270
|
# Mark as running
|
|
259
271
|
self._running = True
|
|
260
|
-
self._start_time = datetime.now()
|
|
272
|
+
self._start_time = datetime.now(timezone.utc)
|
|
261
273
|
|
|
262
274
|
# Update health status
|
|
263
275
|
self._health = ServiceHealth(
|
|
264
|
-
status=
|
|
276
|
+
status=HealthStatus.HEALTHY,
|
|
265
277
|
message="Service started successfully",
|
|
266
|
-
timestamp=datetime.now().isoformat(),
|
|
278
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
267
279
|
checks={"startup": True},
|
|
268
|
-
metrics=self._get_health_metrics() if self._enable_enhanced else {}
|
|
280
|
+
metrics=self._get_health_metrics() if self._enable_enhanced else {},
|
|
269
281
|
)
|
|
270
282
|
|
|
271
283
|
async def stop(self) -> None:
|
|
@@ -295,7 +307,7 @@ class BaseService(LoggerMixin, ABC):
|
|
|
295
307
|
raise
|
|
296
308
|
except Exception as e:
|
|
297
309
|
self.logger.error(f"Error stopping service {self.name}: {e}")
|
|
298
|
-
if self._enable_enhanced and hasattr(self,
|
|
310
|
+
if self._enable_enhanced and hasattr(self, "_handle_error"):
|
|
299
311
|
await self._handle_error(e, {"operation": "stop", "service": self.name})
|
|
300
312
|
raise
|
|
301
313
|
|
|
@@ -305,7 +317,7 @@ class BaseService(LoggerMixin, ABC):
|
|
|
305
317
|
self._stop_event.set()
|
|
306
318
|
|
|
307
319
|
# Unregister from health monitor if available
|
|
308
|
-
if self._enable_enhanced and hasattr(self,
|
|
320
|
+
if self._enable_enhanced and hasattr(self, "_unregister_from_health_monitor"):
|
|
309
321
|
await self._unregister_from_health_monitor()
|
|
310
322
|
|
|
311
323
|
# Cancel background tasks
|
|
@@ -325,9 +337,9 @@ class BaseService(LoggerMixin, ABC):
|
|
|
325
337
|
|
|
326
338
|
# Update health status
|
|
327
339
|
self._health = ServiceHealth(
|
|
328
|
-
status=
|
|
340
|
+
status=HealthStatus.UNKNOWN,
|
|
329
341
|
message="Service stopped",
|
|
330
|
-
timestamp=datetime.now().isoformat(),
|
|
342
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
331
343
|
checks={"running": False},
|
|
332
344
|
)
|
|
333
345
|
|
|
@@ -346,7 +358,7 @@ class BaseService(LoggerMixin, ABC):
|
|
|
346
358
|
"""
|
|
347
359
|
try:
|
|
348
360
|
# Use enhanced health check if enabled
|
|
349
|
-
if self._enable_enhanced and hasattr(self,
|
|
361
|
+
if self._enable_enhanced and hasattr(self, "_enhanced_health_check"):
|
|
350
362
|
return await self._enhanced_health_check()
|
|
351
363
|
|
|
352
364
|
# Basic health check
|
|
@@ -361,23 +373,23 @@ class BaseService(LoggerMixin, ABC):
|
|
|
361
373
|
|
|
362
374
|
# Determine overall status
|
|
363
375
|
if not checks["running"]:
|
|
364
|
-
status =
|
|
376
|
+
status = HealthStatus.UNHEALTHY
|
|
365
377
|
message = "Service is not running"
|
|
366
378
|
elif all(checks.values()):
|
|
367
|
-
status =
|
|
379
|
+
status = HealthStatus.HEALTHY
|
|
368
380
|
message = "All health checks passed"
|
|
369
381
|
elif any(checks.values()):
|
|
370
|
-
status =
|
|
382
|
+
status = HealthStatus.DEGRADED
|
|
371
383
|
message = "Some health checks failed"
|
|
372
384
|
else:
|
|
373
|
-
status =
|
|
385
|
+
status = HealthStatus.UNHEALTHY
|
|
374
386
|
message = "Multiple health checks failed"
|
|
375
387
|
|
|
376
388
|
# Update health status
|
|
377
389
|
self._health = ServiceHealth(
|
|
378
390
|
status=status,
|
|
379
391
|
message=message,
|
|
380
|
-
timestamp=datetime.now().isoformat(),
|
|
392
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
381
393
|
checks=checks,
|
|
382
394
|
metrics={
|
|
383
395
|
"uptime": self.uptime,
|
|
@@ -391,9 +403,9 @@ class BaseService(LoggerMixin, ABC):
|
|
|
391
403
|
except Exception as e:
|
|
392
404
|
self.logger.error(f"Health check failed for {self.name}: {e}")
|
|
393
405
|
self._health = ServiceHealth(
|
|
394
|
-
status=
|
|
395
|
-
message=f"Health check error: {
|
|
396
|
-
timestamp=datetime.now().isoformat(),
|
|
406
|
+
status=HealthStatus.UNHEALTHY,
|
|
407
|
+
message=f"Health check error: {e!s}",
|
|
408
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
397
409
|
checks={"health_check_error": True},
|
|
398
410
|
)
|
|
399
411
|
return self._health
|
|
@@ -412,9 +424,21 @@ class BaseService(LoggerMixin, ABC):
|
|
|
412
424
|
|
|
413
425
|
def _setup_signal_handlers(self) -> None:
|
|
414
426
|
"""Setup signal handlers for graceful shutdown."""
|
|
427
|
+
|
|
415
428
|
def signal_handler(signum, frame):
|
|
416
|
-
self.logger.info(
|
|
417
|
-
|
|
429
|
+
self.logger.info(
|
|
430
|
+
f"Received signal {signum}, initiating graceful shutdown..."
|
|
431
|
+
)
|
|
432
|
+
# Get the event loop and create a tracked shutdown task
|
|
433
|
+
try:
|
|
434
|
+
loop = asyncio.get_event_loop()
|
|
435
|
+
task = loop.create_task(self.stop())
|
|
436
|
+
# Store reference to prevent GC during shutdown
|
|
437
|
+
if not hasattr(self, "_shutdown_task"):
|
|
438
|
+
self._shutdown_task = task
|
|
439
|
+
except RuntimeError:
|
|
440
|
+
# No event loop, call stop synchronously
|
|
441
|
+
self.logger.warning("No event loop available for graceful shutdown")
|
|
418
442
|
|
|
419
443
|
signal.signal(signal.SIGINT, signal_handler)
|
|
420
444
|
signal.signal(signal.SIGTERM, signal_handler)
|
|
@@ -472,6 +496,7 @@ class BaseService(LoggerMixin, ABC):
|
|
|
472
496
|
# Memory usage (basic implementation)
|
|
473
497
|
try:
|
|
474
498
|
import psutil
|
|
499
|
+
|
|
475
500
|
process = psutil.Process()
|
|
476
501
|
self._metrics.memory_usage_mb = process.memory_info().rss / 1024 / 1024
|
|
477
502
|
except ImportError:
|
|
@@ -484,72 +509,76 @@ class BaseService(LoggerMixin, ABC):
|
|
|
484
509
|
self.logger.warning(f"Failed to collect metrics: {e}")
|
|
485
510
|
|
|
486
511
|
# Enhanced features (conditionally included)
|
|
487
|
-
|
|
512
|
+
|
|
488
513
|
@asynccontextmanager
|
|
489
514
|
async def _service_operation(self, operation: str):
|
|
490
515
|
"""Context manager for tracking service operations (enhanced feature)."""
|
|
491
516
|
if not self._enable_enhanced:
|
|
492
517
|
yield
|
|
493
518
|
return
|
|
494
|
-
|
|
519
|
+
|
|
495
520
|
request_id = f"{self.name}_{operation}_{time.time()}"
|
|
496
521
|
context = ServiceContext(
|
|
497
522
|
request_id=request_id,
|
|
498
523
|
start_time=time.time(),
|
|
499
524
|
service_name=self.name,
|
|
500
|
-
operation=operation
|
|
525
|
+
operation=operation,
|
|
501
526
|
)
|
|
502
|
-
|
|
527
|
+
|
|
503
528
|
self._request_contexts[request_id] = context
|
|
504
|
-
|
|
529
|
+
|
|
505
530
|
try:
|
|
506
531
|
yield context
|
|
507
|
-
|
|
532
|
+
|
|
508
533
|
# Record success metrics
|
|
509
534
|
duration = time.time() - context.start_time
|
|
510
535
|
self._record_operation_metrics(operation, duration, success=True)
|
|
511
|
-
|
|
536
|
+
|
|
512
537
|
except Exception as e:
|
|
513
538
|
# Record failure metrics
|
|
514
539
|
duration = time.time() - context.start_time
|
|
515
540
|
self._record_operation_metrics(operation, duration, success=False)
|
|
516
|
-
|
|
541
|
+
|
|
517
542
|
# Update error counts
|
|
518
543
|
error_type = type(e).__name__
|
|
519
544
|
self._error_counts[error_type] = self._error_counts.get(error_type, 0) + 1
|
|
520
|
-
|
|
545
|
+
|
|
521
546
|
raise
|
|
522
|
-
|
|
547
|
+
|
|
523
548
|
finally:
|
|
524
549
|
# Cleanup context
|
|
525
550
|
self._request_contexts.pop(request_id, None)
|
|
526
551
|
|
|
527
|
-
def _record_operation_metrics(
|
|
552
|
+
def _record_operation_metrics(
|
|
553
|
+
self, operation: str, duration: float, success: bool
|
|
554
|
+
) -> None:
|
|
528
555
|
"""Record operation performance metrics (enhanced feature)."""
|
|
529
556
|
if not self._enable_enhanced:
|
|
530
557
|
return
|
|
531
|
-
|
|
558
|
+
|
|
532
559
|
with self._lock:
|
|
533
560
|
# Update general metrics
|
|
534
561
|
self._metrics.requests_total += 1
|
|
535
562
|
if not success:
|
|
536
563
|
self._metrics.requests_failed += 1
|
|
537
|
-
|
|
564
|
+
|
|
538
565
|
# Update performance tracking
|
|
539
566
|
if operation not in self._performance_metrics:
|
|
540
567
|
self._performance_metrics[operation] = []
|
|
541
|
-
|
|
568
|
+
|
|
542
569
|
self._performance_metrics[operation].append(duration)
|
|
543
|
-
|
|
570
|
+
|
|
544
571
|
# Keep only recent metrics (last 100 operations)
|
|
545
572
|
if len(self._performance_metrics[operation]) > 100:
|
|
546
|
-
self._performance_metrics[operation] = self._performance_metrics[
|
|
547
|
-
|
|
573
|
+
self._performance_metrics[operation] = self._performance_metrics[
|
|
574
|
+
operation
|
|
575
|
+
][-100:]
|
|
576
|
+
|
|
548
577
|
# Calculate average
|
|
549
578
|
all_times = []
|
|
550
579
|
for times in self._performance_metrics.values():
|
|
551
580
|
all_times.extend(times)
|
|
552
|
-
|
|
581
|
+
|
|
553
582
|
if all_times:
|
|
554
583
|
self._metrics.response_time_avg = sum(all_times) / len(all_times)
|
|
555
584
|
|
|
@@ -560,32 +589,34 @@ class BaseService(LoggerMixin, ABC):
|
|
|
560
589
|
if self._circuit_breaker.state == "open":
|
|
561
590
|
if self._should_attempt_circuit_recovery():
|
|
562
591
|
self._circuit_breaker.state = "half_open"
|
|
563
|
-
self.logger.info(
|
|
592
|
+
self.logger.info(
|
|
593
|
+
f"Circuit breaker for {self.name} moved to half-open"
|
|
594
|
+
)
|
|
564
595
|
else:
|
|
565
596
|
return ServiceHealth(
|
|
566
|
-
status=
|
|
597
|
+
status=HealthStatus.DEGRADED,
|
|
567
598
|
message="Service circuit breaker is open",
|
|
568
|
-
timestamp=datetime.now().isoformat(),
|
|
599
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
569
600
|
checks={"circuit_breaker": False},
|
|
570
|
-
metrics=self._get_health_metrics()
|
|
601
|
+
metrics=self._get_health_metrics(),
|
|
571
602
|
)
|
|
572
|
-
|
|
603
|
+
|
|
573
604
|
# Perform standard health check
|
|
574
605
|
health = await self.health_check()
|
|
575
|
-
|
|
606
|
+
|
|
576
607
|
# Update circuit breaker
|
|
577
|
-
if health.status in
|
|
608
|
+
if health.status in (HealthStatus.HEALTHY, HealthStatus.DEGRADED):
|
|
578
609
|
self._record_circuit_success()
|
|
579
610
|
else:
|
|
580
611
|
self._record_circuit_failure()
|
|
581
|
-
|
|
612
|
+
|
|
582
613
|
return health
|
|
583
614
|
|
|
584
615
|
def _should_attempt_circuit_recovery(self) -> bool:
|
|
585
616
|
"""Check if circuit breaker should attempt recovery."""
|
|
586
617
|
if not self._enable_enhanced or self._circuit_breaker.last_failure_time is None:
|
|
587
618
|
return True
|
|
588
|
-
|
|
619
|
+
|
|
589
620
|
time_since_failure = time.time() - self._circuit_breaker.last_failure_time
|
|
590
621
|
return time_since_failure >= self._circuit_breaker.timeout_seconds
|
|
591
622
|
|
|
@@ -593,27 +624,33 @@ class BaseService(LoggerMixin, ABC):
|
|
|
593
624
|
"""Record circuit breaker failure."""
|
|
594
625
|
if not self._enable_enhanced:
|
|
595
626
|
return
|
|
596
|
-
|
|
627
|
+
|
|
597
628
|
self._circuit_breaker.failure_count += 1
|
|
598
629
|
self._circuit_breaker.last_failure_time = time.time()
|
|
599
|
-
|
|
600
|
-
if
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
630
|
+
|
|
631
|
+
if (
|
|
632
|
+
self._circuit_breaker.failure_count
|
|
633
|
+
>= self._circuit_breaker.failure_threshold
|
|
634
|
+
) and self._circuit_breaker.state != "open":
|
|
635
|
+
self._circuit_breaker.state = "open"
|
|
636
|
+
self.logger.warning(f"Circuit breaker opened for service {self.name}")
|
|
604
637
|
|
|
605
638
|
def _record_circuit_success(self) -> None:
|
|
606
639
|
"""Record circuit breaker success."""
|
|
607
640
|
if not self._enable_enhanced:
|
|
608
641
|
return
|
|
609
|
-
|
|
642
|
+
|
|
610
643
|
if self._circuit_breaker.state == "half_open":
|
|
611
|
-
self._circuit_breaker.failure_count = max(
|
|
644
|
+
self._circuit_breaker.failure_count = max(
|
|
645
|
+
0, self._circuit_breaker.failure_count - 1
|
|
646
|
+
)
|
|
612
647
|
if self._circuit_breaker.failure_count == 0:
|
|
613
648
|
self._circuit_breaker.state = "closed"
|
|
614
649
|
self.logger.info(f"Circuit breaker closed for service {self.name}")
|
|
615
650
|
elif self._circuit_breaker.state == "closed":
|
|
616
|
-
self._circuit_breaker.failure_count = max(
|
|
651
|
+
self._circuit_breaker.failure_count = max(
|
|
652
|
+
0, self._circuit_breaker.failure_count - 1
|
|
653
|
+
)
|
|
617
654
|
|
|
618
655
|
def _get_health_metrics(self) -> Dict[str, Any]:
|
|
619
656
|
"""Get metrics for health status."""
|
|
@@ -623,22 +660,24 @@ class BaseService(LoggerMixin, ABC):
|
|
|
623
660
|
"requests_failed": self._metrics.requests_failed,
|
|
624
661
|
"response_time_avg": self._metrics.response_time_avg,
|
|
625
662
|
}
|
|
626
|
-
|
|
663
|
+
|
|
627
664
|
if self._enable_enhanced:
|
|
628
|
-
base_metrics.update(
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
665
|
+
base_metrics.update(
|
|
666
|
+
{
|
|
667
|
+
"circuit_breaker_state": self._circuit_breaker.state,
|
|
668
|
+
"error_counts": self._error_counts.copy(),
|
|
669
|
+
}
|
|
670
|
+
)
|
|
671
|
+
|
|
633
672
|
return base_metrics
|
|
634
673
|
|
|
635
674
|
async def _handle_error(self, error: Exception, context: Dict[str, Any]) -> None:
|
|
636
675
|
"""Handle service errors with context (enhanced feature)."""
|
|
637
676
|
if not self._enable_enhanced:
|
|
638
677
|
return
|
|
639
|
-
|
|
678
|
+
|
|
640
679
|
try:
|
|
641
|
-
if hasattr(self,
|
|
680
|
+
if hasattr(self, "_error_handler") and self._error_handler:
|
|
642
681
|
await self._error_handler.handle_error(error, context)
|
|
643
682
|
else:
|
|
644
683
|
# Default error handling
|
|
@@ -647,8 +686,8 @@ class BaseService(LoggerMixin, ABC):
|
|
|
647
686
|
extra={
|
|
648
687
|
"service": self.name,
|
|
649
688
|
"context": context,
|
|
650
|
-
"traceback": traceback.format_exc()
|
|
651
|
-
}
|
|
689
|
+
"traceback": traceback.format_exc(),
|
|
690
|
+
},
|
|
652
691
|
)
|
|
653
692
|
except Exception as handler_error:
|
|
654
693
|
self.logger.error(f"Error handler failed: {handler_error}")
|
|
@@ -657,21 +696,22 @@ class BaseService(LoggerMixin, ABC):
|
|
|
657
696
|
"""Register service dependencies (enhanced feature)."""
|
|
658
697
|
if not self._container:
|
|
659
698
|
return
|
|
660
|
-
|
|
699
|
+
|
|
661
700
|
try:
|
|
662
701
|
# Get optional dependencies from container
|
|
663
702
|
# This is a simplified version - real implementation would use interfaces
|
|
664
|
-
if hasattr(self._container,
|
|
665
|
-
self._health_monitor = self._container.get_service(
|
|
666
|
-
|
|
667
|
-
|
|
703
|
+
if hasattr(self._container, "get_service"):
|
|
704
|
+
self._health_monitor = self._container.get_service(
|
|
705
|
+
"IHealthMonitor", None
|
|
706
|
+
)
|
|
707
|
+
self._error_handler = self._container.get_service("IErrorHandler", None)
|
|
708
|
+
self._cache = self._container.get_service("ICacheService", None)
|
|
668
709
|
except Exception as e:
|
|
669
710
|
self.logger.warning(f"Failed to register dependencies for {self.name}: {e}")
|
|
670
711
|
|
|
671
712
|
async def _initialize_dependencies(self) -> None:
|
|
672
713
|
"""Initialize service dependencies (enhanced feature)."""
|
|
673
714
|
# Override in subclasses for specific dependency setup
|
|
674
|
-
pass
|
|
675
715
|
|
|
676
716
|
async def _register_with_health_monitor(self) -> None:
|
|
677
717
|
"""Register service with health monitor (enhanced feature)."""
|
|
@@ -694,12 +734,10 @@ class BaseService(LoggerMixin, ABC):
|
|
|
694
734
|
@abstractmethod
|
|
695
735
|
async def _initialize(self) -> None:
|
|
696
736
|
"""Initialize the service. Must be implemented by subclasses."""
|
|
697
|
-
pass
|
|
698
737
|
|
|
699
738
|
@abstractmethod
|
|
700
739
|
async def _cleanup(self) -> None:
|
|
701
740
|
"""Cleanup service resources. Must be implemented by subclasses."""
|
|
702
|
-
pass
|
|
703
741
|
|
|
704
742
|
async def _health_check(self) -> Dict[str, bool]:
|
|
705
743
|
"""
|
|
@@ -721,29 +759,29 @@ class BaseService(LoggerMixin, ABC):
|
|
|
721
759
|
|
|
722
760
|
async def _collect_custom_metrics(self) -> None:
|
|
723
761
|
"""Collect custom metrics. Override in subclasses.
|
|
724
|
-
|
|
762
|
+
|
|
725
763
|
METRICS COLLECTION PATTERN:
|
|
726
764
|
This method is called periodically by the metrics task to collect
|
|
727
765
|
service-specific metrics. Subclasses should override this to:
|
|
728
|
-
|
|
766
|
+
|
|
729
767
|
1. COLLECT OPERATIONAL METRICS:
|
|
730
768
|
- Request rates and latencies
|
|
731
769
|
- Queue depths and processing times
|
|
732
770
|
- Error rates by type
|
|
733
771
|
- Resource utilization
|
|
734
|
-
|
|
772
|
+
|
|
735
773
|
2. COLLECT BUSINESS METRICS:
|
|
736
774
|
- Agent usage patterns
|
|
737
775
|
- Model selection distribution
|
|
738
776
|
- Task complexity trends
|
|
739
777
|
- Cost tracking metrics
|
|
740
|
-
|
|
778
|
+
|
|
741
779
|
3. COLLECT PERFORMANCE METRICS:
|
|
742
780
|
- Cache hit rates
|
|
743
781
|
- Database query times
|
|
744
782
|
- API call latencies
|
|
745
783
|
- Memory usage patterns
|
|
746
|
-
|
|
784
|
+
|
|
747
785
|
EXAMPLE IMPLEMENTATION:
|
|
748
786
|
```python
|
|
749
787
|
async def _collect_custom_metrics(self) -> None:
|
|
@@ -754,7 +792,7 @@ class BaseService(LoggerMixin, ABC):
|
|
|
754
792
|
cache_hit_rate=loader_metrics['cache_hit_rate_percent'],
|
|
755
793
|
top_agents=loader_metrics['top_agents_by_usage']
|
|
756
794
|
)
|
|
757
|
-
|
|
795
|
+
|
|
758
796
|
# Collect deployment metrics
|
|
759
797
|
if hasattr(self, 'deployment_service'):
|
|
760
798
|
deploy_metrics = self.deployment_service.get_deployment_metrics()
|
|
@@ -762,7 +800,7 @@ class BaseService(LoggerMixin, ABC):
|
|
|
762
800
|
deployment_success_rate=deploy_metrics['success_rate_percent'],
|
|
763
801
|
avg_deployment_time=deploy_metrics['average_deployment_time_ms']
|
|
764
802
|
)
|
|
765
|
-
|
|
803
|
+
|
|
766
804
|
# Collect resource metrics
|
|
767
805
|
import psutil
|
|
768
806
|
process = psutil.Process()
|
|
@@ -773,7 +811,7 @@ class BaseService(LoggerMixin, ABC):
|
|
|
773
811
|
thread_count=process.num_threads()
|
|
774
812
|
)
|
|
775
813
|
```
|
|
776
|
-
|
|
814
|
+
|
|
777
815
|
BEST PRACTICES:
|
|
778
816
|
- Keep collection fast (< 100ms)
|
|
779
817
|
- Handle errors gracefully
|
|
@@ -781,7 +819,6 @@ class BaseService(LoggerMixin, ABC):
|
|
|
781
819
|
- Store aggregated data, not raw events
|
|
782
820
|
- Consider metric cardinality
|
|
783
821
|
"""
|
|
784
|
-
pass
|
|
785
822
|
|
|
786
823
|
# Utility methods
|
|
787
824
|
|
|
@@ -804,4 +841,4 @@ class BaseService(LoggerMixin, ABC):
|
|
|
804
841
|
|
|
805
842
|
|
|
806
843
|
# For backwards compatibility, create an alias
|
|
807
|
-
EnhancedBaseService = BaseService
|
|
844
|
+
EnhancedBaseService = BaseService
|