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
|
@@ -0,0 +1,957 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Agent Lifecycle Manager - ISS-0118 Integration Service (Refactored)
|
|
4
|
+
===================================================================
|
|
5
|
+
|
|
6
|
+
Comprehensive agent lifecycle management integrating modification tracking,
|
|
7
|
+
persistence, and registry services for complete agent management across
|
|
8
|
+
the three-tier hierarchy.
|
|
9
|
+
|
|
10
|
+
This refactored version delegates responsibilities to specialized services:
|
|
11
|
+
- AgentStateService: State tracking and transitions
|
|
12
|
+
- AgentOperationService: CRUD operations
|
|
13
|
+
- AgentRecordService: Persistence and history
|
|
14
|
+
- LifecycleHealthChecker: Health monitoring
|
|
15
|
+
|
|
16
|
+
Key Features:
|
|
17
|
+
- Unified agent lifecycle management (create, modify, delete, restore)
|
|
18
|
+
- Integrated modification tracking and persistence
|
|
19
|
+
- Automatic cache invalidation and registry updates
|
|
20
|
+
- Comprehensive backup and versioning system
|
|
21
|
+
- Conflict detection and resolution workflows
|
|
22
|
+
- Performance monitoring and optimization
|
|
23
|
+
|
|
24
|
+
Performance Impact:
|
|
25
|
+
- <100ms end-to-end agent operations
|
|
26
|
+
- Automatic cache coherency maintenance
|
|
27
|
+
- Intelligent persistence routing
|
|
28
|
+
- Real-time modification detection
|
|
29
|
+
|
|
30
|
+
Created for ISS-0118: Agent Registry and Hierarchical Discovery System
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
import asyncio
|
|
34
|
+
import time
|
|
35
|
+
from datetime import datetime, timezone
|
|
36
|
+
from pathlib import Path
|
|
37
|
+
from typing import Any, Dict, List, Optional
|
|
38
|
+
|
|
39
|
+
from claude_mpm.core.base_service import BaseService
|
|
40
|
+
from claude_mpm.core.unified_paths import get_path_manager
|
|
41
|
+
from claude_mpm.models.agent_definition import AgentDefinition
|
|
42
|
+
from claude_mpm.services.agents.management import AgentManager
|
|
43
|
+
from claude_mpm.services.agents.memory import (
|
|
44
|
+
AgentPersistenceService,
|
|
45
|
+
PersistenceOperation,
|
|
46
|
+
PersistenceRecord,
|
|
47
|
+
PersistenceStrategy,
|
|
48
|
+
)
|
|
49
|
+
from claude_mpm.services.agents.registry import AgentRegistry
|
|
50
|
+
from claude_mpm.services.agents.registry.modification_tracker import (
|
|
51
|
+
AgentModification,
|
|
52
|
+
AgentModificationTracker,
|
|
53
|
+
ModificationTier,
|
|
54
|
+
ModificationType,
|
|
55
|
+
)
|
|
56
|
+
from claude_mpm.services.memory.cache.shared_prompt_cache import SharedPromptCache
|
|
57
|
+
from claude_mpm.utils.path_operations import path_ops
|
|
58
|
+
|
|
59
|
+
# Import extracted services
|
|
60
|
+
from .agent_operation_service import (
|
|
61
|
+
AgentOperationService,
|
|
62
|
+
LifecycleOperation,
|
|
63
|
+
LifecycleOperationResult,
|
|
64
|
+
)
|
|
65
|
+
from .agent_record_service import AgentRecordService
|
|
66
|
+
from .agent_state_service import AgentLifecycleRecord, AgentStateService, LifecycleState
|
|
67
|
+
|
|
68
|
+
# Re-export for backward compatibility
|
|
69
|
+
__all__ = [
|
|
70
|
+
"AgentLifecycleManager",
|
|
71
|
+
"AgentLifecycleRecord",
|
|
72
|
+
"LifecycleOperation",
|
|
73
|
+
"LifecycleOperationResult",
|
|
74
|
+
"LifecycleState",
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class AgentLifecycleManager(BaseService):
|
|
79
|
+
"""
|
|
80
|
+
Agent Lifecycle Manager - Unified agent management across hierarchy tiers.
|
|
81
|
+
|
|
82
|
+
Refactored to use specialized services following SOLID principles:
|
|
83
|
+
- AgentStateService handles state tracking
|
|
84
|
+
- AgentOperationService handles CRUD operations
|
|
85
|
+
- AgentRecordService handles persistence
|
|
86
|
+
- LifecycleHealthChecker handles health monitoring
|
|
87
|
+
|
|
88
|
+
Features:
|
|
89
|
+
- Complete agent lifecycle management (CRUD operations)
|
|
90
|
+
- Integrated modification tracking and persistence
|
|
91
|
+
- Automatic cache invalidation and registry synchronization
|
|
92
|
+
- Comprehensive backup and versioning system
|
|
93
|
+
- Real-time conflict detection and resolution
|
|
94
|
+
- Performance monitoring and optimization
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
|
98
|
+
"""Initialize the agent lifecycle manager."""
|
|
99
|
+
super().__init__("agent_lifecycle_manager", config)
|
|
100
|
+
|
|
101
|
+
# Configuration
|
|
102
|
+
self.enable_auto_backup = self.get_config("enable_auto_backup", True)
|
|
103
|
+
self.enable_auto_validation = self.get_config("enable_auto_validation", True)
|
|
104
|
+
self.enable_cache_invalidation = self.get_config(
|
|
105
|
+
"enable_cache_invalidation", True
|
|
106
|
+
)
|
|
107
|
+
self.enable_registry_sync = self.get_config("enable_registry_sync", True)
|
|
108
|
+
self.default_persistence_strategy = PersistenceStrategy(
|
|
109
|
+
self.get_config(
|
|
110
|
+
"default_persistence_strategy", PersistenceStrategy.USER_OVERRIDE.value
|
|
111
|
+
)
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Core external services
|
|
115
|
+
self.shared_cache: Optional[SharedPromptCache] = None
|
|
116
|
+
self.agent_registry: Optional[AgentRegistry] = None
|
|
117
|
+
self.modification_tracker: Optional[AgentModificationTracker] = None
|
|
118
|
+
self.persistence_service: Optional[AgentPersistenceService] = None
|
|
119
|
+
self.agent_manager: Optional[AgentManager] = None
|
|
120
|
+
|
|
121
|
+
# Extracted internal services
|
|
122
|
+
self.state_service = AgentStateService()
|
|
123
|
+
self.operation_service = AgentOperationService()
|
|
124
|
+
self.record_service = AgentRecordService()
|
|
125
|
+
|
|
126
|
+
# Backward compatibility - expose service data through properties
|
|
127
|
+
self._operation_lock = asyncio.Lock()
|
|
128
|
+
|
|
129
|
+
# Performance metrics
|
|
130
|
+
self.performance_metrics = {
|
|
131
|
+
"total_operations": 0,
|
|
132
|
+
"successful_operations": 0,
|
|
133
|
+
"failed_operations": 0,
|
|
134
|
+
"average_duration_ms": 0.0,
|
|
135
|
+
"cache_hit_rate": 0.0,
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
self.logger.info("AgentLifecycleManager initialized (refactored)")
|
|
139
|
+
|
|
140
|
+
async def _initialize(self) -> None:
|
|
141
|
+
"""Initialize the lifecycle manager."""
|
|
142
|
+
self.logger.info("Initializing AgentLifecycleManager...")
|
|
143
|
+
|
|
144
|
+
# Initialize core services
|
|
145
|
+
await self._initialize_core_services()
|
|
146
|
+
|
|
147
|
+
# Initialize extracted services
|
|
148
|
+
await self.state_service.start()
|
|
149
|
+
await self.operation_service.start()
|
|
150
|
+
await self.record_service.start()
|
|
151
|
+
|
|
152
|
+
# Load existing agent records into state service
|
|
153
|
+
records = await self.record_service.load_records()
|
|
154
|
+
self.state_service.agent_records = records
|
|
155
|
+
|
|
156
|
+
# Setup operation service dependencies
|
|
157
|
+
self.operation_service.agent_manager = self.agent_manager
|
|
158
|
+
self.operation_service.set_modification_tracker(self.modification_tracker)
|
|
159
|
+
|
|
160
|
+
# Start service integrations
|
|
161
|
+
await self._setup_service_integrations()
|
|
162
|
+
|
|
163
|
+
# Perform initial registry sync
|
|
164
|
+
if self.enable_registry_sync:
|
|
165
|
+
await self._sync_with_registry()
|
|
166
|
+
|
|
167
|
+
self.logger.info("AgentLifecycleManager initialized successfully")
|
|
168
|
+
|
|
169
|
+
async def _cleanup(self) -> None:
|
|
170
|
+
"""Cleanup lifecycle manager resources."""
|
|
171
|
+
self.logger.info("Cleaning up AgentLifecycleManager...")
|
|
172
|
+
|
|
173
|
+
# Save agent records through record service
|
|
174
|
+
await self.record_service.save_records(self.state_service.agent_records)
|
|
175
|
+
await self.record_service.save_history(self.operation_service.operation_history)
|
|
176
|
+
|
|
177
|
+
# Stop extracted services
|
|
178
|
+
await self.state_service.stop()
|
|
179
|
+
await self.operation_service.stop()
|
|
180
|
+
await self.record_service.stop()
|
|
181
|
+
|
|
182
|
+
# Stop core services if we own them
|
|
183
|
+
await self._cleanup_core_services()
|
|
184
|
+
|
|
185
|
+
self.logger.info("AgentLifecycleManager cleaned up")
|
|
186
|
+
|
|
187
|
+
async def _health_check(self) -> Dict[str, bool]:
|
|
188
|
+
"""Perform lifecycle manager health checks."""
|
|
189
|
+
from .lifecycle_health_checker import LifecycleHealthChecker
|
|
190
|
+
|
|
191
|
+
checker = LifecycleHealthChecker(self)
|
|
192
|
+
return await checker.perform_health_check()
|
|
193
|
+
|
|
194
|
+
async def _initialize_core_services(self) -> None:
|
|
195
|
+
"""Initialize core service dependencies."""
|
|
196
|
+
try:
|
|
197
|
+
# Initialize SharedPromptCache
|
|
198
|
+
self.shared_cache = SharedPromptCache.get_instance()
|
|
199
|
+
|
|
200
|
+
# Initialize AgentRegistry
|
|
201
|
+
self.agent_registry = AgentRegistry(cache_service=self.shared_cache)
|
|
202
|
+
|
|
203
|
+
# Initialize AgentModificationTracker
|
|
204
|
+
self.modification_tracker = AgentModificationTracker()
|
|
205
|
+
await self.modification_tracker.start()
|
|
206
|
+
|
|
207
|
+
# Initialize AgentPersistenceService
|
|
208
|
+
self.persistence_service = AgentPersistenceService()
|
|
209
|
+
await self.persistence_service.start()
|
|
210
|
+
|
|
211
|
+
# Initialize AgentManager
|
|
212
|
+
self.agent_manager = AgentManager()
|
|
213
|
+
|
|
214
|
+
self.logger.info("Core services initialized successfully")
|
|
215
|
+
|
|
216
|
+
except Exception as e:
|
|
217
|
+
self.logger.error(f"Failed to initialize core services: {e}")
|
|
218
|
+
raise
|
|
219
|
+
|
|
220
|
+
async def _setup_service_integrations(self) -> None:
|
|
221
|
+
"""Set up integrations between services."""
|
|
222
|
+
try:
|
|
223
|
+
# Register modification callback
|
|
224
|
+
if self.modification_tracker:
|
|
225
|
+
self.modification_tracker.register_modification_callback(
|
|
226
|
+
self._handle_modification_event
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
self.logger.debug("Service integrations set up successfully")
|
|
230
|
+
|
|
231
|
+
except Exception as e:
|
|
232
|
+
self.logger.warning(f"Failed to setup some service integrations: {e}")
|
|
233
|
+
|
|
234
|
+
@property
|
|
235
|
+
def agent_records(self) -> Dict[str, AgentLifecycleRecord]:
|
|
236
|
+
"""Get agent records from state service (backward compatibility)."""
|
|
237
|
+
return self.state_service.agent_records
|
|
238
|
+
|
|
239
|
+
@property
|
|
240
|
+
def operation_history(self) -> List[LifecycleOperationResult]:
|
|
241
|
+
"""Get operation history from operation service (backward compatibility)."""
|
|
242
|
+
return self.operation_service.operation_history
|
|
243
|
+
|
|
244
|
+
@property
|
|
245
|
+
def active_operations(self) -> Dict[str, LifecycleOperation]:
|
|
246
|
+
"""Get active operations from operation service (backward compatibility)."""
|
|
247
|
+
return self.operation_service.active_operations
|
|
248
|
+
|
|
249
|
+
async def _save_agent_records(self) -> None:
|
|
250
|
+
"""Save agent lifecycle records to disk."""
|
|
251
|
+
try:
|
|
252
|
+
records_file = (
|
|
253
|
+
get_path_manager().get_tracking_dir() / "lifecycle_records.json"
|
|
254
|
+
)
|
|
255
|
+
path_ops.ensure_dir(records_file.parent)
|
|
256
|
+
|
|
257
|
+
data = {}
|
|
258
|
+
for agent_name, record in self.agent_records.items():
|
|
259
|
+
record_dict = record.__dict__.copy()
|
|
260
|
+
# Convert enums to strings for JSON serialization
|
|
261
|
+
record_dict["current_state"] = record.current_state.value
|
|
262
|
+
record_dict["tier"] = record.tier.value
|
|
263
|
+
data[agent_name] = record_dict
|
|
264
|
+
|
|
265
|
+
# Use save_json with custom encoder for datetime serialization
|
|
266
|
+
import json
|
|
267
|
+
|
|
268
|
+
# First convert to JSON string with custom encoder, then save
|
|
269
|
+
json_str = json.dumps(data, indent=2, default=str)
|
|
270
|
+
records_file.parent.mkdir(parents=True, exist_ok=True)
|
|
271
|
+
with records_file.open("w", encoding="utf-8") as f:
|
|
272
|
+
f.write(json_str)
|
|
273
|
+
|
|
274
|
+
self.logger.debug(f"Saved {len(self.agent_records)} agent records")
|
|
275
|
+
|
|
276
|
+
except Exception as e:
|
|
277
|
+
self.logger.error(f"Failed to save agent records: {e}")
|
|
278
|
+
|
|
279
|
+
async def _sync_with_registry(self) -> None:
|
|
280
|
+
"""Synchronize with agent registry."""
|
|
281
|
+
try:
|
|
282
|
+
if not self.agent_registry:
|
|
283
|
+
return
|
|
284
|
+
|
|
285
|
+
# Discover all agents via registry (sync methods)
|
|
286
|
+
self.agent_registry.discover_agents()
|
|
287
|
+
all_agents = self.agent_registry.list_agents()
|
|
288
|
+
|
|
289
|
+
# Update lifecycle records with registry data
|
|
290
|
+
for agent_metadata in all_agents:
|
|
291
|
+
if agent_metadata.name not in self.agent_records:
|
|
292
|
+
# Create new lifecycle record
|
|
293
|
+
tier_map = {
|
|
294
|
+
"project": ModificationTier.PROJECT,
|
|
295
|
+
"user": ModificationTier.USER,
|
|
296
|
+
"system": ModificationTier.SYSTEM,
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
record = AgentLifecycleRecord(
|
|
300
|
+
agent_name=agent_metadata.name,
|
|
301
|
+
current_state=LifecycleState.ACTIVE,
|
|
302
|
+
tier=tier_map.get(agent_metadata.tier, ModificationTier.USER),
|
|
303
|
+
file_path=agent_metadata.path,
|
|
304
|
+
created_at=agent_metadata.last_modified or time.time(),
|
|
305
|
+
last_modified=agent_metadata.last_modified or time.time(),
|
|
306
|
+
version="1.0.0",
|
|
307
|
+
metadata={
|
|
308
|
+
"type": agent_metadata.type,
|
|
309
|
+
"description": agent_metadata.description,
|
|
310
|
+
"capabilities": agent_metadata.capabilities,
|
|
311
|
+
"validated": agent_metadata.validated,
|
|
312
|
+
},
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
self.agent_records[agent_metadata.name] = record
|
|
316
|
+
|
|
317
|
+
self.logger.info(f"Synchronized with registry: {len(all_agents)} agents")
|
|
318
|
+
|
|
319
|
+
except Exception as e:
|
|
320
|
+
self.logger.error(f"Failed to sync with registry: {e}")
|
|
321
|
+
|
|
322
|
+
async def create_agent(
|
|
323
|
+
self,
|
|
324
|
+
agent_name: str,
|
|
325
|
+
agent_content: str,
|
|
326
|
+
tier: ModificationTier = ModificationTier.USER,
|
|
327
|
+
agent_type: str = "custom",
|
|
328
|
+
**kwargs,
|
|
329
|
+
) -> LifecycleOperationResult:
|
|
330
|
+
"""
|
|
331
|
+
Create a new agent with complete lifecycle tracking.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
agent_name: Name of the agent to create
|
|
335
|
+
agent_content: Content of the agent file
|
|
336
|
+
tier: Target tier for creation
|
|
337
|
+
agent_type: Type of agent (for classification)
|
|
338
|
+
**kwargs: Additional metadata
|
|
339
|
+
|
|
340
|
+
Returns:
|
|
341
|
+
LifecycleOperationResult with operation details
|
|
342
|
+
"""
|
|
343
|
+
start_time = time.time()
|
|
344
|
+
|
|
345
|
+
# Check if agent already exists
|
|
346
|
+
if self.state_service.get_record(agent_name):
|
|
347
|
+
return LifecycleOperationResult(
|
|
348
|
+
operation=LifecycleOperation.CREATE,
|
|
349
|
+
agent_name=agent_name,
|
|
350
|
+
success=False,
|
|
351
|
+
duration_ms=0,
|
|
352
|
+
error_message="Agent already exists",
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
# Create agent definition
|
|
356
|
+
agent_def = await self._create_agent_definition(
|
|
357
|
+
agent_name, agent_content, tier, agent_type, **kwargs
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
# Determine location based on tier
|
|
361
|
+
location = "project" if tier == ModificationTier.PROJECT else "framework"
|
|
362
|
+
|
|
363
|
+
# Create agent using AgentManager (sync call in executor)
|
|
364
|
+
try:
|
|
365
|
+
if self.agent_manager:
|
|
366
|
+
file_path = await self._run_sync_in_executor(
|
|
367
|
+
self.agent_manager.create_agent,
|
|
368
|
+
agent_name,
|
|
369
|
+
agent_def,
|
|
370
|
+
location,
|
|
371
|
+
)
|
|
372
|
+
else:
|
|
373
|
+
# Fallback to direct file creation if AgentManager not available
|
|
374
|
+
file_path = await self._determine_agent_file_path(agent_name, tier)
|
|
375
|
+
path_ops.ensure_dir(file_path.parent)
|
|
376
|
+
path_ops.safe_write(file_path, agent_content)
|
|
377
|
+
except Exception as e:
|
|
378
|
+
self.logger.error(f"AgentManager failed to create agent: {e}")
|
|
379
|
+
# Fallback to direct file creation
|
|
380
|
+
file_path = await self._determine_agent_file_path(agent_name, tier)
|
|
381
|
+
path_ops.ensure_dir(file_path.parent)
|
|
382
|
+
path_ops.safe_write(file_path, agent_content)
|
|
383
|
+
|
|
384
|
+
# Track modification
|
|
385
|
+
modification = await self.modification_tracker.track_modification(
|
|
386
|
+
agent_name=agent_name,
|
|
387
|
+
modification_type=ModificationType.CREATE,
|
|
388
|
+
file_path=str(file_path),
|
|
389
|
+
tier=tier,
|
|
390
|
+
agent_type=agent_type,
|
|
391
|
+
**kwargs,
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
# Note: We don't use persistence_service for the actual write anymore
|
|
395
|
+
# since AgentManager handles that. We create a synthetic record for compatibility.
|
|
396
|
+
persistence_record = PersistenceRecord(
|
|
397
|
+
operation_id=f"create_{agent_name}_{time.time()}",
|
|
398
|
+
operation_type=PersistenceOperation.CREATE,
|
|
399
|
+
agent_name=agent_name,
|
|
400
|
+
source_tier=tier,
|
|
401
|
+
target_tier=tier,
|
|
402
|
+
strategy=self.default_persistence_strategy,
|
|
403
|
+
success=True,
|
|
404
|
+
timestamp=time.time(),
|
|
405
|
+
file_path=str(file_path),
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
# Create lifecycle record
|
|
409
|
+
lifecycle_record = AgentLifecycleRecord(
|
|
410
|
+
agent_name=agent_name,
|
|
411
|
+
current_state=LifecycleState.ACTIVE,
|
|
412
|
+
tier=tier,
|
|
413
|
+
file_path=str(file_path),
|
|
414
|
+
created_at=time.time(),
|
|
415
|
+
last_modified=time.time(),
|
|
416
|
+
version="1.0.0",
|
|
417
|
+
modifications=[modification.modification_id],
|
|
418
|
+
persistence_operations=[persistence_record.operation_id],
|
|
419
|
+
metadata={"agent_type": agent_type, **kwargs},
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
self.agent_records[agent_name] = lifecycle_record
|
|
423
|
+
|
|
424
|
+
# Invalidate cache and update registry
|
|
425
|
+
cache_invalidated = await self._invalidate_agent_cache(agent_name)
|
|
426
|
+
registry_updated = await self._update_registry(agent_name)
|
|
427
|
+
|
|
428
|
+
# Create result
|
|
429
|
+
result = LifecycleOperationResult(
|
|
430
|
+
operation=LifecycleOperation.CREATE,
|
|
431
|
+
agent_name=agent_name,
|
|
432
|
+
success=persistence_record.success,
|
|
433
|
+
duration_ms=(time.time() - start_time) * 1000,
|
|
434
|
+
modification_id=modification.modification_id,
|
|
435
|
+
persistence_id=persistence_record.operation_id,
|
|
436
|
+
cache_invalidated=cache_invalidated,
|
|
437
|
+
registry_updated=registry_updated,
|
|
438
|
+
metadata={"file_path": str(file_path)},
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
if not persistence_record.success:
|
|
442
|
+
result.error_message = persistence_record.error_message
|
|
443
|
+
lifecycle_record.current_state = LifecycleState.CONFLICTED
|
|
444
|
+
|
|
445
|
+
# Update performance metrics
|
|
446
|
+
await self._update_performance_metrics(result)
|
|
447
|
+
|
|
448
|
+
self.operation_history.append(result)
|
|
449
|
+
self.logger.info(f"Created agent '{agent_name}' in {result.duration_ms:.1f}ms")
|
|
450
|
+
|
|
451
|
+
return result
|
|
452
|
+
|
|
453
|
+
async def update_agent(
|
|
454
|
+
self, agent_name: str, agent_content: str, **kwargs
|
|
455
|
+
) -> LifecycleOperationResult:
|
|
456
|
+
"""
|
|
457
|
+
Update an existing agent with lifecycle tracking.
|
|
458
|
+
|
|
459
|
+
Args:
|
|
460
|
+
agent_name: Name of the agent to update
|
|
461
|
+
agent_content: New content for the agent
|
|
462
|
+
**kwargs: Additional metadata
|
|
463
|
+
|
|
464
|
+
Returns:
|
|
465
|
+
LifecycleOperationResult with operation details
|
|
466
|
+
"""
|
|
467
|
+
start_time = time.time()
|
|
468
|
+
|
|
469
|
+
async with self._operation_lock:
|
|
470
|
+
self.active_operations[agent_name] = LifecycleOperation.UPDATE
|
|
471
|
+
|
|
472
|
+
try:
|
|
473
|
+
# Check if agent exists
|
|
474
|
+
if agent_name not in self.agent_records:
|
|
475
|
+
return LifecycleOperationResult(
|
|
476
|
+
operation=LifecycleOperation.UPDATE,
|
|
477
|
+
agent_name=agent_name,
|
|
478
|
+
success=False,
|
|
479
|
+
duration_ms=(time.time() - start_time) * 1000,
|
|
480
|
+
error_message="Agent not found",
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
record = self.agent_records[agent_name]
|
|
484
|
+
|
|
485
|
+
# Update agent using AgentManager
|
|
486
|
+
try:
|
|
487
|
+
if self.agent_manager:
|
|
488
|
+
# Read current agent to get full definition
|
|
489
|
+
current_def = await self._run_sync_in_executor(
|
|
490
|
+
self.agent_manager.read_agent, agent_name
|
|
491
|
+
)
|
|
492
|
+
|
|
493
|
+
if current_def:
|
|
494
|
+
# Update raw content
|
|
495
|
+
current_def.raw_content = agent_content
|
|
496
|
+
|
|
497
|
+
# Apply any metadata updates from kwargs
|
|
498
|
+
if "model_preference" in kwargs:
|
|
499
|
+
current_def.metadata.model_preference = kwargs[
|
|
500
|
+
"model_preference"
|
|
501
|
+
]
|
|
502
|
+
if "tags" in kwargs:
|
|
503
|
+
current_def.metadata.tags = kwargs["tags"]
|
|
504
|
+
if "specializations" in kwargs:
|
|
505
|
+
current_def.metadata.specializations = kwargs[
|
|
506
|
+
"specializations"
|
|
507
|
+
]
|
|
508
|
+
|
|
509
|
+
# Update via AgentManager
|
|
510
|
+
updated_def = await self._run_sync_in_executor(
|
|
511
|
+
self.agent_manager.update_agent,
|
|
512
|
+
agent_name,
|
|
513
|
+
{"raw_content": agent_content},
|
|
514
|
+
True,
|
|
515
|
+
)
|
|
516
|
+
|
|
517
|
+
if not updated_def:
|
|
518
|
+
raise Exception("AgentManager update failed")
|
|
519
|
+
else:
|
|
520
|
+
raise Exception("Could not read current agent definition")
|
|
521
|
+
else:
|
|
522
|
+
# Fallback to direct file update
|
|
523
|
+
file_path = Path(record.file_path)
|
|
524
|
+
if path_ops.validate_exists(file_path):
|
|
525
|
+
path_ops.safe_write(file_path, agent_content)
|
|
526
|
+
except Exception as e:
|
|
527
|
+
self.logger.error(f"AgentManager failed to update agent: {e}")
|
|
528
|
+
# Fallback to direct file update
|
|
529
|
+
file_path = Path(record.file_path)
|
|
530
|
+
if path_ops.validate_exists(file_path):
|
|
531
|
+
path_ops.safe_write(file_path, agent_content)
|
|
532
|
+
|
|
533
|
+
# Track modification
|
|
534
|
+
modification = await self.modification_tracker.track_modification(
|
|
535
|
+
agent_name=agent_name,
|
|
536
|
+
modification_type=ModificationType.MODIFY,
|
|
537
|
+
file_path=record.file_path,
|
|
538
|
+
tier=record.tier,
|
|
539
|
+
**kwargs,
|
|
540
|
+
)
|
|
541
|
+
|
|
542
|
+
# Create synthetic persistence record for compatibility
|
|
543
|
+
persistence_record = PersistenceRecord(
|
|
544
|
+
operation_id=f"update_{agent_name}_{time.time()}",
|
|
545
|
+
operation_type=PersistenceOperation.UPDATE,
|
|
546
|
+
agent_name=agent_name,
|
|
547
|
+
source_tier=record.tier,
|
|
548
|
+
target_tier=record.tier,
|
|
549
|
+
strategy=self.default_persistence_strategy,
|
|
550
|
+
success=True,
|
|
551
|
+
timestamp=time.time(),
|
|
552
|
+
file_path=record.file_path,
|
|
553
|
+
)
|
|
554
|
+
|
|
555
|
+
# Update lifecycle record
|
|
556
|
+
record.current_state = LifecycleState.MODIFIED
|
|
557
|
+
record.last_modified = time.time()
|
|
558
|
+
record.modifications.append(modification.modification_id)
|
|
559
|
+
record.persistence_operations.append(persistence_record.operation_id)
|
|
560
|
+
|
|
561
|
+
# Increment version
|
|
562
|
+
current_version = record.version.split(".")
|
|
563
|
+
current_version[-1] = str(int(current_version[-1]) + 1)
|
|
564
|
+
record.version = ".".join(current_version)
|
|
565
|
+
|
|
566
|
+
# Invalidate cache and update registry
|
|
567
|
+
cache_invalidated = await self._invalidate_agent_cache(agent_name)
|
|
568
|
+
registry_updated = await self._update_registry(agent_name)
|
|
569
|
+
|
|
570
|
+
# Create result
|
|
571
|
+
result = LifecycleOperationResult(
|
|
572
|
+
operation=LifecycleOperation.UPDATE,
|
|
573
|
+
agent_name=agent_name,
|
|
574
|
+
success=persistence_record.success,
|
|
575
|
+
duration_ms=(time.time() - start_time) * 1000,
|
|
576
|
+
modification_id=modification.modification_id,
|
|
577
|
+
persistence_id=persistence_record.operation_id,
|
|
578
|
+
cache_invalidated=cache_invalidated,
|
|
579
|
+
registry_updated=registry_updated,
|
|
580
|
+
metadata={"new_version": record.version},
|
|
581
|
+
)
|
|
582
|
+
|
|
583
|
+
if not persistence_record.success:
|
|
584
|
+
result.error_message = persistence_record.error_message
|
|
585
|
+
record.current_state = LifecycleState.CONFLICTED
|
|
586
|
+
|
|
587
|
+
# Update performance metrics
|
|
588
|
+
await self._update_performance_metrics(result)
|
|
589
|
+
|
|
590
|
+
self.operation_history.append(result)
|
|
591
|
+
self.logger.info(
|
|
592
|
+
f"Updated agent '{agent_name}' to version {record.version} in {result.duration_ms:.1f}ms"
|
|
593
|
+
)
|
|
594
|
+
|
|
595
|
+
return result
|
|
596
|
+
|
|
597
|
+
except Exception as e:
|
|
598
|
+
result = LifecycleOperationResult(
|
|
599
|
+
operation=LifecycleOperation.UPDATE,
|
|
600
|
+
agent_name=agent_name,
|
|
601
|
+
success=False,
|
|
602
|
+
duration_ms=(time.time() - start_time) * 1000,
|
|
603
|
+
error_message=str(e),
|
|
604
|
+
)
|
|
605
|
+
|
|
606
|
+
self.operation_history.append(result)
|
|
607
|
+
await self._update_performance_metrics(result)
|
|
608
|
+
|
|
609
|
+
self.logger.error(f"Failed to update agent '{agent_name}': {e}")
|
|
610
|
+
return result
|
|
611
|
+
|
|
612
|
+
finally:
|
|
613
|
+
self.active_operations.pop(agent_name, None)
|
|
614
|
+
|
|
615
|
+
async def delete_agent(self, agent_name: str, **kwargs) -> LifecycleOperationResult:
|
|
616
|
+
"""
|
|
617
|
+
Delete an agent with lifecycle tracking.
|
|
618
|
+
|
|
619
|
+
Args:
|
|
620
|
+
agent_name: Name of the agent to delete
|
|
621
|
+
**kwargs: Additional metadata
|
|
622
|
+
|
|
623
|
+
Returns:
|
|
624
|
+
LifecycleOperationResult with operation details
|
|
625
|
+
"""
|
|
626
|
+
start_time = time.time()
|
|
627
|
+
|
|
628
|
+
async with self._operation_lock:
|
|
629
|
+
self.active_operations[agent_name] = LifecycleOperation.DELETE
|
|
630
|
+
|
|
631
|
+
try:
|
|
632
|
+
# Check if agent exists
|
|
633
|
+
if agent_name not in self.agent_records:
|
|
634
|
+
return LifecycleOperationResult(
|
|
635
|
+
operation=LifecycleOperation.DELETE,
|
|
636
|
+
agent_name=agent_name,
|
|
637
|
+
success=False,
|
|
638
|
+
duration_ms=(time.time() - start_time) * 1000,
|
|
639
|
+
error_message="Agent not found",
|
|
640
|
+
)
|
|
641
|
+
|
|
642
|
+
record = self.agent_records[agent_name]
|
|
643
|
+
|
|
644
|
+
# Create backup before deletion
|
|
645
|
+
backup_path = None
|
|
646
|
+
if self.enable_auto_backup:
|
|
647
|
+
backup_path = await self._create_deletion_backup(agent_name, record)
|
|
648
|
+
|
|
649
|
+
# Track modification
|
|
650
|
+
modification = await self.modification_tracker.track_modification(
|
|
651
|
+
agent_name=agent_name,
|
|
652
|
+
modification_type=ModificationType.DELETE,
|
|
653
|
+
file_path=record.file_path,
|
|
654
|
+
tier=record.tier,
|
|
655
|
+
backup_path=backup_path,
|
|
656
|
+
**kwargs,
|
|
657
|
+
)
|
|
658
|
+
|
|
659
|
+
# Delete agent using AgentManager
|
|
660
|
+
deletion_success = False
|
|
661
|
+
try:
|
|
662
|
+
if self.agent_manager:
|
|
663
|
+
deletion_success = await self._run_sync_in_executor(
|
|
664
|
+
self.agent_manager.delete_agent, agent_name
|
|
665
|
+
)
|
|
666
|
+
if not deletion_success:
|
|
667
|
+
raise Exception("AgentManager delete failed")
|
|
668
|
+
else:
|
|
669
|
+
# Fallback to direct file deletion
|
|
670
|
+
file_path = Path(record.file_path)
|
|
671
|
+
if path_ops.validate_exists(file_path):
|
|
672
|
+
path_ops.safe_delete(file_path)
|
|
673
|
+
deletion_success = True
|
|
674
|
+
except Exception as e:
|
|
675
|
+
self.logger.error(f"AgentManager failed to delete agent: {e}")
|
|
676
|
+
# Fallback to direct file deletion
|
|
677
|
+
file_path = Path(record.file_path)
|
|
678
|
+
if path_ops.validate_exists(file_path):
|
|
679
|
+
path_ops.safe_delete(file_path)
|
|
680
|
+
deletion_success = True
|
|
681
|
+
|
|
682
|
+
# Update lifecycle record
|
|
683
|
+
record.current_state = LifecycleState.DELETED
|
|
684
|
+
record.last_modified = time.time()
|
|
685
|
+
record.modifications.append(modification.modification_id)
|
|
686
|
+
if backup_path:
|
|
687
|
+
record.backup_paths.append(backup_path)
|
|
688
|
+
|
|
689
|
+
# Invalidate cache and update registry
|
|
690
|
+
cache_invalidated = await self._invalidate_agent_cache(agent_name)
|
|
691
|
+
registry_updated = await self._update_registry(agent_name)
|
|
692
|
+
|
|
693
|
+
# Create result
|
|
694
|
+
result = LifecycleOperationResult(
|
|
695
|
+
operation=LifecycleOperation.DELETE,
|
|
696
|
+
agent_name=agent_name,
|
|
697
|
+
success=True,
|
|
698
|
+
duration_ms=(time.time() - start_time) * 1000,
|
|
699
|
+
modification_id=modification.modification_id,
|
|
700
|
+
cache_invalidated=cache_invalidated,
|
|
701
|
+
registry_updated=registry_updated,
|
|
702
|
+
metadata={"backup_path": backup_path},
|
|
703
|
+
)
|
|
704
|
+
|
|
705
|
+
# Update performance metrics
|
|
706
|
+
await self._update_performance_metrics(result)
|
|
707
|
+
|
|
708
|
+
self.operation_history.append(result)
|
|
709
|
+
self.logger.info(
|
|
710
|
+
f"Deleted agent '{agent_name}' in {result.duration_ms:.1f}ms"
|
|
711
|
+
)
|
|
712
|
+
|
|
713
|
+
return result
|
|
714
|
+
|
|
715
|
+
except Exception as e:
|
|
716
|
+
result = LifecycleOperationResult(
|
|
717
|
+
operation=LifecycleOperation.DELETE,
|
|
718
|
+
agent_name=agent_name,
|
|
719
|
+
success=False,
|
|
720
|
+
duration_ms=(time.time() - start_time) * 1000,
|
|
721
|
+
error_message=str(e),
|
|
722
|
+
)
|
|
723
|
+
|
|
724
|
+
self.operation_history.append(result)
|
|
725
|
+
await self._update_performance_metrics(result)
|
|
726
|
+
|
|
727
|
+
self.logger.error(f"Failed to delete agent '{agent_name}': {e}")
|
|
728
|
+
return result
|
|
729
|
+
|
|
730
|
+
finally:
|
|
731
|
+
self.active_operations.pop(agent_name, None)
|
|
732
|
+
|
|
733
|
+
async def _determine_agent_file_path(
|
|
734
|
+
self, agent_name: str, tier: ModificationTier
|
|
735
|
+
) -> Path:
|
|
736
|
+
"""Determine appropriate file path for agent."""
|
|
737
|
+
if tier == ModificationTier.USER:
|
|
738
|
+
base_path = get_path_manager().get_user_agents_dir()
|
|
739
|
+
elif tier == ModificationTier.PROJECT:
|
|
740
|
+
base_path = get_path_manager().get_project_agents_dir()
|
|
741
|
+
else: # SYSTEM
|
|
742
|
+
base_path = Path.cwd() / "claude_pm" / "agents"
|
|
743
|
+
|
|
744
|
+
path_ops.ensure_dir(base_path)
|
|
745
|
+
return base_path / f"{agent_name}_agent.py"
|
|
746
|
+
|
|
747
|
+
async def _create_deletion_backup(
|
|
748
|
+
self, agent_name: str, record: AgentLifecycleRecord
|
|
749
|
+
) -> Optional[str]:
|
|
750
|
+
"""Create backup before agent deletion."""
|
|
751
|
+
try:
|
|
752
|
+
source_path = Path(record.file_path)
|
|
753
|
+
if not path_ops.validate_exists(source_path):
|
|
754
|
+
return None
|
|
755
|
+
|
|
756
|
+
backup_dir = get_path_manager().get_tracking_dir() / "backups"
|
|
757
|
+
path_ops.ensure_dir(backup_dir)
|
|
758
|
+
|
|
759
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
760
|
+
backup_filename = f"{agent_name}_deleted_{timestamp}{source_path.suffix}"
|
|
761
|
+
backup_path = backup_dir / backup_filename
|
|
762
|
+
|
|
763
|
+
path_ops.safe_copy(source_path, backup_path)
|
|
764
|
+
return str(backup_path)
|
|
765
|
+
|
|
766
|
+
except Exception as e:
|
|
767
|
+
self.logger.warning(
|
|
768
|
+
f"Failed to create deletion backup for {agent_name}: {e}"
|
|
769
|
+
)
|
|
770
|
+
return None
|
|
771
|
+
|
|
772
|
+
async def _invalidate_agent_cache(self, agent_name: str) -> bool:
|
|
773
|
+
"""Invalidate cache entries for agent."""
|
|
774
|
+
if not self.enable_cache_invalidation or not self.shared_cache:
|
|
775
|
+
return False
|
|
776
|
+
|
|
777
|
+
try:
|
|
778
|
+
patterns = [
|
|
779
|
+
f"agent_profile:{agent_name}:*",
|
|
780
|
+
f"task_prompt:{agent_name}:*",
|
|
781
|
+
"agent_registry_discovery",
|
|
782
|
+
f"agent_profile_enhanced:{agent_name}:*",
|
|
783
|
+
]
|
|
784
|
+
|
|
785
|
+
for pattern in patterns:
|
|
786
|
+
await asyncio.get_event_loop().run_in_executor(
|
|
787
|
+
None, lambda p=pattern: self.shared_cache.invalidate(p)
|
|
788
|
+
)
|
|
789
|
+
|
|
790
|
+
return True
|
|
791
|
+
|
|
792
|
+
except Exception as e:
|
|
793
|
+
self.logger.warning(f"Failed to invalidate cache for {agent_name}: {e}")
|
|
794
|
+
return False
|
|
795
|
+
|
|
796
|
+
async def _update_registry(self, agent_name: str) -> bool:
|
|
797
|
+
"""Update agent registry after modification."""
|
|
798
|
+
if not self.enable_registry_sync or not self.agent_registry:
|
|
799
|
+
return False
|
|
800
|
+
|
|
801
|
+
try:
|
|
802
|
+
# Refresh registry (discover_agents is synchronous)
|
|
803
|
+
self.agent_registry.discover_agents()
|
|
804
|
+
return True
|
|
805
|
+
|
|
806
|
+
except Exception as e:
|
|
807
|
+
self.logger.warning(f"Failed to update registry for {agent_name}: {e}")
|
|
808
|
+
return False
|
|
809
|
+
|
|
810
|
+
async def _update_performance_metrics(
|
|
811
|
+
self, result: LifecycleOperationResult
|
|
812
|
+
) -> None:
|
|
813
|
+
"""Update performance metrics with operation result."""
|
|
814
|
+
from .lifecycle_performance_tracker import LifecyclePerformanceTracker
|
|
815
|
+
|
|
816
|
+
tracker = LifecyclePerformanceTracker(self.performance_metrics)
|
|
817
|
+
tracker.update_metrics(result)
|
|
818
|
+
|
|
819
|
+
async def _handle_modification_event(self, modification: AgentModification) -> None:
|
|
820
|
+
"""Handle modification events from tracker."""
|
|
821
|
+
try:
|
|
822
|
+
agent_name = modification.agent_name
|
|
823
|
+
|
|
824
|
+
# Update lifecycle record if exists
|
|
825
|
+
if agent_name in self.agent_records:
|
|
826
|
+
record = self.agent_records[agent_name]
|
|
827
|
+
record.last_modified = modification.timestamp
|
|
828
|
+
record.modifications.append(modification.modification_id)
|
|
829
|
+
|
|
830
|
+
# Update state based on modification type
|
|
831
|
+
if modification.modification_type == ModificationType.DELETE:
|
|
832
|
+
record.current_state = LifecycleState.DELETED
|
|
833
|
+
elif modification.modification_type in [
|
|
834
|
+
ModificationType.CREATE,
|
|
835
|
+
ModificationType.MODIFY,
|
|
836
|
+
]:
|
|
837
|
+
record.current_state = LifecycleState.MODIFIED
|
|
838
|
+
|
|
839
|
+
self.logger.debug(
|
|
840
|
+
f"Updated lifecycle record for {agent_name} due to {modification.modification_type.value}"
|
|
841
|
+
)
|
|
842
|
+
|
|
843
|
+
except Exception as e:
|
|
844
|
+
self.logger.error(f"Error handling modification event: {e}")
|
|
845
|
+
|
|
846
|
+
# Test capability methods moved to LifecycleHealthChecker
|
|
847
|
+
|
|
848
|
+
async def _cleanup_core_services(self) -> None:
|
|
849
|
+
"""Cleanup core services if we manage their lifecycle."""
|
|
850
|
+
try:
|
|
851
|
+
if self.modification_tracker:
|
|
852
|
+
await self.modification_tracker.stop()
|
|
853
|
+
|
|
854
|
+
if self.persistence_service:
|
|
855
|
+
await self.persistence_service.stop()
|
|
856
|
+
|
|
857
|
+
except Exception as e:
|
|
858
|
+
self.logger.error(f"Error cleaning up core services: {e}")
|
|
859
|
+
|
|
860
|
+
# Public API Methods
|
|
861
|
+
|
|
862
|
+
async def get_agent_status(self, agent_name: str) -> Optional[AgentLifecycleRecord]:
|
|
863
|
+
"""Get current status of an agent."""
|
|
864
|
+
return self.agent_records.get(agent_name)
|
|
865
|
+
|
|
866
|
+
async def list_agents(
|
|
867
|
+
self, state_filter: Optional[LifecycleState] = None
|
|
868
|
+
) -> List[AgentLifecycleRecord]:
|
|
869
|
+
"""List agents with optional state filtering."""
|
|
870
|
+
agents = list(self.agent_records.values())
|
|
871
|
+
|
|
872
|
+
if state_filter:
|
|
873
|
+
agents = [agent for agent in agents if agent.current_state == state_filter]
|
|
874
|
+
|
|
875
|
+
return sorted(agents, key=lambda x: x.last_modified, reverse=True)
|
|
876
|
+
|
|
877
|
+
async def get_operation_history(
|
|
878
|
+
self, agent_name: Optional[str] = None, limit: int = 100
|
|
879
|
+
) -> List[LifecycleOperationResult]:
|
|
880
|
+
"""Get operation history with optional filtering."""
|
|
881
|
+
history = self.operation_history
|
|
882
|
+
|
|
883
|
+
if agent_name:
|
|
884
|
+
history = [op for op in history if op.agent_name == agent_name]
|
|
885
|
+
|
|
886
|
+
return sorted(history, key=lambda x: x.duration_ms, reverse=True)[:limit]
|
|
887
|
+
|
|
888
|
+
async def get_lifecycle_stats(self) -> Dict[str, Any]:
|
|
889
|
+
"""Get comprehensive lifecycle statistics."""
|
|
890
|
+
stats = {
|
|
891
|
+
"total_agents": len(self.agent_records),
|
|
892
|
+
"active_operations": len(self.active_operations),
|
|
893
|
+
"performance_metrics": self.performance_metrics.copy(),
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
# State distribution
|
|
897
|
+
state_counts = {}
|
|
898
|
+
for record in self.agent_records.values():
|
|
899
|
+
state_counts[record.current_state.value] = (
|
|
900
|
+
state_counts.get(record.current_state.value, 0) + 1
|
|
901
|
+
)
|
|
902
|
+
|
|
903
|
+
stats["agents_by_state"] = state_counts
|
|
904
|
+
|
|
905
|
+
# Tier distribution
|
|
906
|
+
tier_counts = {}
|
|
907
|
+
for record in self.agent_records.values():
|
|
908
|
+
tier_counts[record.tier.value] = tier_counts.get(record.tier.value, 0) + 1
|
|
909
|
+
|
|
910
|
+
stats["agents_by_tier"] = tier_counts
|
|
911
|
+
|
|
912
|
+
# Recent activity
|
|
913
|
+
recent_ops = [
|
|
914
|
+
op
|
|
915
|
+
for op in self.operation_history
|
|
916
|
+
if (time.time() - (op.duration_ms / 1000)) < 3600 # Last hour
|
|
917
|
+
]
|
|
918
|
+
stats["recent_operations"] = len(recent_ops)
|
|
919
|
+
|
|
920
|
+
return stats
|
|
921
|
+
|
|
922
|
+
async def _create_agent_definition(
|
|
923
|
+
self,
|
|
924
|
+
agent_name: str,
|
|
925
|
+
agent_content: str,
|
|
926
|
+
tier: ModificationTier,
|
|
927
|
+
agent_type: str,
|
|
928
|
+
**kwargs,
|
|
929
|
+
) -> AgentDefinition:
|
|
930
|
+
"""Create an AgentDefinition from lifecycle parameters."""
|
|
931
|
+
from .agent_definition_factory import AgentDefinitionFactory
|
|
932
|
+
|
|
933
|
+
factory = AgentDefinitionFactory()
|
|
934
|
+
return factory.create_agent_definition(
|
|
935
|
+
agent_name, agent_content, tier, agent_type, **kwargs
|
|
936
|
+
)
|
|
937
|
+
|
|
938
|
+
async def _run_sync_in_executor(self, func, *args, **kwargs):
|
|
939
|
+
"""
|
|
940
|
+
Run a synchronous function in an executor to avoid blocking.
|
|
941
|
+
|
|
942
|
+
WHY: AgentManager has synchronous methods but AgentLifecycleManager is async.
|
|
943
|
+
This allows us to call sync methods without blocking the event loop.
|
|
944
|
+
|
|
945
|
+
PERFORMANCE: Uses the default executor which manages a thread pool efficiently.
|
|
946
|
+
"""
|
|
947
|
+
loop = asyncio.get_event_loop()
|
|
948
|
+
return await loop.run_in_executor(None, func, *args, **kwargs)
|
|
949
|
+
|
|
950
|
+
async def restore_agent(
|
|
951
|
+
self, agent_name: str, backup_path: Optional[str] = None
|
|
952
|
+
) -> LifecycleOperationResult:
|
|
953
|
+
"""Restore agent from backup."""
|
|
954
|
+
from .agent_restore_handler import AgentRestoreHandler
|
|
955
|
+
|
|
956
|
+
handler = AgentRestoreHandler(self)
|
|
957
|
+
return await handler.restore_agent(agent_name, backup_path)
|