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,249 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Memory integration utilities for Claude Code hook handler.
|
|
3
|
+
|
|
4
|
+
This module provides utilities for integrating with the memory system,
|
|
5
|
+
including pre and post delegation hooks.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
# Install-type-aware logging configuration BEFORE kuzu-memory imports
|
|
13
|
+
# This overrides kuzu-memory's WARNING-level basicConfig (fixes 1M-445)
|
|
14
|
+
# but respects production install silence
|
|
15
|
+
try:
|
|
16
|
+
from claude_mpm.core.unified_paths import DeploymentContext, PathContext
|
|
17
|
+
|
|
18
|
+
context = PathContext.detect_deployment_context()
|
|
19
|
+
|
|
20
|
+
# Only configure verbose logging for development/editable installs
|
|
21
|
+
# Production installs remain silent by default
|
|
22
|
+
if context in (DeploymentContext.DEVELOPMENT, DeploymentContext.EDITABLE_INSTALL):
|
|
23
|
+
logging.basicConfig(
|
|
24
|
+
level=logging.INFO,
|
|
25
|
+
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
26
|
+
force=True, # Python 3.8+ - reconfigures root logger
|
|
27
|
+
stream=sys.stderr,
|
|
28
|
+
)
|
|
29
|
+
except ImportError:
|
|
30
|
+
# Fallback: if unified_paths not available, configure logging
|
|
31
|
+
# This maintains backward compatibility
|
|
32
|
+
logging.basicConfig(
|
|
33
|
+
level=logging.INFO,
|
|
34
|
+
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
35
|
+
force=True,
|
|
36
|
+
stream=sys.stderr,
|
|
37
|
+
)
|
|
38
|
+
from datetime import datetime, timezone
|
|
39
|
+
from typing import Optional
|
|
40
|
+
|
|
41
|
+
# Debug mode
|
|
42
|
+
DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
43
|
+
|
|
44
|
+
# Memory hooks integration
|
|
45
|
+
MEMORY_HOOKS_AVAILABLE = False
|
|
46
|
+
try:
|
|
47
|
+
# Use centralized path management for adding src to path
|
|
48
|
+
from claude_mpm.config.paths import paths
|
|
49
|
+
|
|
50
|
+
paths.ensure_in_path()
|
|
51
|
+
|
|
52
|
+
from claude_mpm.core.shared.config_loader import ConfigLoader
|
|
53
|
+
from claude_mpm.hooks.base_hook import HookContext, HookType
|
|
54
|
+
from claude_mpm.hooks.memory_integration_hook import (
|
|
55
|
+
MemoryPostDelegationHook,
|
|
56
|
+
MemoryPreDelegationHook,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
MEMORY_HOOKS_AVAILABLE = True
|
|
60
|
+
except Exception as e:
|
|
61
|
+
# Catch all exceptions to prevent any import errors from breaking the handler
|
|
62
|
+
if DEBUG:
|
|
63
|
+
print(f"Memory hooks not available: {e}", file=sys.stderr)
|
|
64
|
+
MEMORY_HOOKS_AVAILABLE = False
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class MemoryHookManager:
|
|
68
|
+
"""Manager for memory hook integration."""
|
|
69
|
+
|
|
70
|
+
def __init__(self):
|
|
71
|
+
self.memory_hooks_initialized = False
|
|
72
|
+
self.pre_delegation_hook: Optional[MemoryPreDelegationHook] = None
|
|
73
|
+
self.post_delegation_hook: Optional[MemoryPostDelegationHook] = None
|
|
74
|
+
|
|
75
|
+
if MEMORY_HOOKS_AVAILABLE:
|
|
76
|
+
self._initialize_memory_hooks()
|
|
77
|
+
|
|
78
|
+
def _initialize_memory_hooks(self):
|
|
79
|
+
"""Initialize memory hooks for automatic agent memory management.
|
|
80
|
+
|
|
81
|
+
WHY: This activates the memory system by connecting Claude Code hook events
|
|
82
|
+
to our memory integration hooks. This enables automatic memory injection
|
|
83
|
+
before delegations and learning extraction after delegations.
|
|
84
|
+
|
|
85
|
+
DESIGN DECISION: We initialize hooks here in the Claude hook handler because
|
|
86
|
+
this is where Claude Code events are processed. This ensures memory hooks
|
|
87
|
+
are triggered at the right times during agent delegation.
|
|
88
|
+
"""
|
|
89
|
+
try:
|
|
90
|
+
# Create configuration using ConfigLoader
|
|
91
|
+
config_loader = ConfigLoader()
|
|
92
|
+
config = config_loader.load_main_config()
|
|
93
|
+
|
|
94
|
+
# Only initialize if memory system is enabled
|
|
95
|
+
if not config.get("memory.enabled", True):
|
|
96
|
+
if DEBUG:
|
|
97
|
+
print(
|
|
98
|
+
"Memory system disabled - skipping hook initialization",
|
|
99
|
+
file=sys.stderr,
|
|
100
|
+
)
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
# Initialize pre-delegation hook for memory injection
|
|
104
|
+
self.pre_delegation_hook = MemoryPreDelegationHook(config)
|
|
105
|
+
|
|
106
|
+
# Initialize post-delegation hook if auto-learning is enabled
|
|
107
|
+
if config.get("memory.auto_learning", True): # Default to True now
|
|
108
|
+
self.post_delegation_hook = MemoryPostDelegationHook(config)
|
|
109
|
+
|
|
110
|
+
self.memory_hooks_initialized = True
|
|
111
|
+
|
|
112
|
+
if DEBUG:
|
|
113
|
+
hooks_info = []
|
|
114
|
+
if self.pre_delegation_hook:
|
|
115
|
+
hooks_info.append("pre-delegation")
|
|
116
|
+
if self.post_delegation_hook:
|
|
117
|
+
hooks_info.append("post-delegation")
|
|
118
|
+
print(
|
|
119
|
+
f"✅ Memory hooks initialized: {', '.join(hooks_info)}",
|
|
120
|
+
file=sys.stderr,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
except Exception as e:
|
|
124
|
+
if DEBUG:
|
|
125
|
+
print(f"❌ Failed to initialize memory hooks: {e}", file=sys.stderr)
|
|
126
|
+
# Don't fail the entire handler - memory system is optional
|
|
127
|
+
|
|
128
|
+
def trigger_pre_delegation_hook(
|
|
129
|
+
self, agent_type: str, tool_input: dict, session_id: str
|
|
130
|
+
):
|
|
131
|
+
"""Trigger memory pre-delegation hook for agent memory injection.
|
|
132
|
+
|
|
133
|
+
WHY: This connects Claude Code's Task delegation events to our memory system.
|
|
134
|
+
When Claude is about to delegate to an agent, we inject the agent's memory
|
|
135
|
+
into the delegation context so the agent has access to accumulated knowledge.
|
|
136
|
+
|
|
137
|
+
DESIGN DECISION: We modify the tool_input in place to inject memory context.
|
|
138
|
+
This ensures the agent receives the memory as part of their initial context.
|
|
139
|
+
"""
|
|
140
|
+
if not self.memory_hooks_initialized or not self.pre_delegation_hook:
|
|
141
|
+
return
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
# Create hook context for memory injection
|
|
145
|
+
hook_context = HookContext(
|
|
146
|
+
hook_type=HookType.PRE_DELEGATION,
|
|
147
|
+
data={
|
|
148
|
+
"agent": agent_type,
|
|
149
|
+
"context": tool_input,
|
|
150
|
+
"session_id": session_id,
|
|
151
|
+
},
|
|
152
|
+
metadata={"source": "claude_hook_handler", "tool_name": "Task"},
|
|
153
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
154
|
+
session_id=session_id,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# Execute pre-delegation hook
|
|
158
|
+
result = self.pre_delegation_hook.execute(hook_context)
|
|
159
|
+
|
|
160
|
+
if result.success and result.modified and result.data:
|
|
161
|
+
# Update tool_input with memory-enhanced context
|
|
162
|
+
enhanced_context = result.data.get("context", {})
|
|
163
|
+
if enhanced_context and "agent_memory" in enhanced_context:
|
|
164
|
+
# Inject memory into the task prompt/description
|
|
165
|
+
original_prompt = tool_input.get("prompt", "")
|
|
166
|
+
memory_section = enhanced_context["agent_memory"]
|
|
167
|
+
|
|
168
|
+
# Prepend memory to the original prompt
|
|
169
|
+
enhanced_prompt = f"{memory_section}\n\n{original_prompt}"
|
|
170
|
+
tool_input["prompt"] = enhanced_prompt
|
|
171
|
+
|
|
172
|
+
if DEBUG:
|
|
173
|
+
memory_size = len(memory_section.encode("utf-8"))
|
|
174
|
+
print(
|
|
175
|
+
f"✅ Injected {memory_size} bytes of memory for agent '{agent_type}'",
|
|
176
|
+
file=sys.stderr,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
except Exception as e:
|
|
180
|
+
if DEBUG:
|
|
181
|
+
print(f"❌ Memory pre-delegation hook failed: {e}", file=sys.stderr)
|
|
182
|
+
# Don't fail the delegation - memory is optional
|
|
183
|
+
|
|
184
|
+
def trigger_post_delegation_hook(
|
|
185
|
+
self, agent_type: str, event: dict, session_id: str
|
|
186
|
+
):
|
|
187
|
+
"""Trigger memory post-delegation hook for learning extraction.
|
|
188
|
+
|
|
189
|
+
WHY: This connects Claude Code's Task completion events to our memory system.
|
|
190
|
+
When an agent completes a task, we extract learnings from the result and
|
|
191
|
+
store them in the agent's memory for future use.
|
|
192
|
+
|
|
193
|
+
DESIGN DECISION: We extract learnings from both the tool output and any
|
|
194
|
+
error messages, providing comprehensive context for the memory system.
|
|
195
|
+
"""
|
|
196
|
+
if not self.memory_hooks_initialized or not self.post_delegation_hook:
|
|
197
|
+
return
|
|
198
|
+
|
|
199
|
+
try:
|
|
200
|
+
# Extract result content from the event
|
|
201
|
+
result_content = ""
|
|
202
|
+
output = event.get("output", "")
|
|
203
|
+
error = event.get("error", "")
|
|
204
|
+
exit_code = event.get("exit_code", 0)
|
|
205
|
+
|
|
206
|
+
# Build result content
|
|
207
|
+
if output:
|
|
208
|
+
result_content = str(output)
|
|
209
|
+
elif error:
|
|
210
|
+
result_content = f"Error: {error!s}"
|
|
211
|
+
else:
|
|
212
|
+
result_content = f"Task completed with exit code: {exit_code}"
|
|
213
|
+
|
|
214
|
+
# Create hook context for learning extraction
|
|
215
|
+
hook_context = HookContext(
|
|
216
|
+
hook_type=HookType.POST_DELEGATION,
|
|
217
|
+
data={
|
|
218
|
+
"agent": agent_type,
|
|
219
|
+
"result": {
|
|
220
|
+
"content": result_content,
|
|
221
|
+
"success": exit_code == 0,
|
|
222
|
+
"exit_code": exit_code,
|
|
223
|
+
},
|
|
224
|
+
"session_id": session_id,
|
|
225
|
+
},
|
|
226
|
+
metadata={
|
|
227
|
+
"source": "claude_hook_handler",
|
|
228
|
+
"tool_name": "Task",
|
|
229
|
+
"duration_ms": event.get("duration_ms", 0),
|
|
230
|
+
},
|
|
231
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
232
|
+
session_id=session_id,
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
# Execute post-delegation hook
|
|
236
|
+
result = self.post_delegation_hook.execute(hook_context)
|
|
237
|
+
|
|
238
|
+
if result.success and result.metadata:
|
|
239
|
+
learnings_extracted = result.metadata.get("learnings_extracted", 0)
|
|
240
|
+
if learnings_extracted > 0 and DEBUG:
|
|
241
|
+
print(
|
|
242
|
+
f"✅ Extracted {learnings_extracted} learnings for agent '{agent_type}'",
|
|
243
|
+
file=sys.stderr,
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
except Exception as e:
|
|
247
|
+
if DEBUG:
|
|
248
|
+
print(f"❌ Memory post-delegation hook failed: {e}", file=sys.stderr)
|
|
249
|
+
# Don't fail the delegation result - memory is optional
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Response tracking utilities for Claude Code hook handler.
|
|
3
|
+
|
|
4
|
+
This module provides utilities for tracking and correlating agent responses
|
|
5
|
+
with their original requests.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import json
|
|
9
|
+
import os
|
|
10
|
+
import re
|
|
11
|
+
import sys
|
|
12
|
+
from datetime import datetime, timezone
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Optional
|
|
15
|
+
|
|
16
|
+
# Debug mode
|
|
17
|
+
DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
18
|
+
|
|
19
|
+
# Response tracking integration
|
|
20
|
+
# NOTE: ResponseTracker import moved to _initialize_response_tracking() for lazy loading
|
|
21
|
+
# This prevents unnecessary import of heavy dependencies when hooks don't need response tracking
|
|
22
|
+
RESPONSE_TRACKING_AVAILABLE = (
|
|
23
|
+
True # Assume available, will check on actual initialization
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ResponseTrackingManager:
|
|
28
|
+
"""Manager for response tracking functionality."""
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
self.response_tracker: Optional[Any] = (
|
|
32
|
+
None # Type hint changed to Any for lazy import
|
|
33
|
+
)
|
|
34
|
+
self.response_tracking_enabled = False
|
|
35
|
+
self.track_all_interactions = (
|
|
36
|
+
False # Track all Claude interactions, not just delegations
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
if RESPONSE_TRACKING_AVAILABLE:
|
|
40
|
+
self._initialize_response_tracking()
|
|
41
|
+
|
|
42
|
+
def _initialize_response_tracking(self):
|
|
43
|
+
"""Initialize response tracking if enabled in configuration.
|
|
44
|
+
|
|
45
|
+
WHY: This enables automatic capture and storage of agent responses
|
|
46
|
+
for analysis, debugging, and learning purposes. Integration into the
|
|
47
|
+
existing hook handler avoids duplicate event capture.
|
|
48
|
+
|
|
49
|
+
DESIGN DECISION: Check configuration to allow enabling/disabling
|
|
50
|
+
response tracking without code changes.
|
|
51
|
+
|
|
52
|
+
NOTE: ResponseTracker is imported lazily here to avoid loading
|
|
53
|
+
heavy dependencies unless actually needed.
|
|
54
|
+
"""
|
|
55
|
+
try:
|
|
56
|
+
# Lazy import of ResponseTracker to avoid unnecessary dependency loading
|
|
57
|
+
from claude_mpm.services.response_tracker import ResponseTracker
|
|
58
|
+
|
|
59
|
+
# Create configuration with optional config file using ConfigLoader
|
|
60
|
+
config_file = os.environ.get("CLAUDE_PM_CONFIG_FILE")
|
|
61
|
+
from claude_mpm.core.shared.config_loader import ConfigLoader, ConfigPattern
|
|
62
|
+
|
|
63
|
+
config_loader = ConfigLoader()
|
|
64
|
+
if config_file:
|
|
65
|
+
# Use specific config file with ConfigLoader
|
|
66
|
+
pattern = ConfigPattern(
|
|
67
|
+
filenames=[Path(config_file).name],
|
|
68
|
+
search_paths=[Path(config_file).parent],
|
|
69
|
+
env_prefix="CLAUDE_MPM_",
|
|
70
|
+
)
|
|
71
|
+
config = config_loader.load_config(
|
|
72
|
+
pattern, cache_key=f"response_tracking_{config_file}"
|
|
73
|
+
)
|
|
74
|
+
else:
|
|
75
|
+
config = config_loader.load_main_config()
|
|
76
|
+
|
|
77
|
+
# Check if response tracking is enabled (check both sections for compatibility)
|
|
78
|
+
response_tracking_enabled = config.get("response_tracking.enabled", False)
|
|
79
|
+
response_logging_enabled = config.get("response_logging.enabled", False)
|
|
80
|
+
|
|
81
|
+
if not (response_tracking_enabled or response_logging_enabled):
|
|
82
|
+
if DEBUG:
|
|
83
|
+
print(
|
|
84
|
+
"Response tracking disabled - skipping initialization",
|
|
85
|
+
file=sys.stderr,
|
|
86
|
+
)
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
# Initialize response tracker with config
|
|
90
|
+
self.response_tracker = ResponseTracker(config=config)
|
|
91
|
+
self.response_tracking_enabled = self.response_tracker.is_enabled()
|
|
92
|
+
|
|
93
|
+
# Check if we should track all interactions (not just delegations)
|
|
94
|
+
self.track_all_interactions = config.get(
|
|
95
|
+
"response_tracking.track_all_interactions", False
|
|
96
|
+
) or config.get("response_logging.track_all_interactions", False)
|
|
97
|
+
|
|
98
|
+
if DEBUG:
|
|
99
|
+
mode = (
|
|
100
|
+
"all interactions"
|
|
101
|
+
if self.track_all_interactions
|
|
102
|
+
else "Task delegations only"
|
|
103
|
+
)
|
|
104
|
+
print(
|
|
105
|
+
f"✅ Response tracking initialized (mode: {mode})", file=sys.stderr
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
except Exception as e:
|
|
109
|
+
if DEBUG:
|
|
110
|
+
print(
|
|
111
|
+
f"❌ Failed to initialize response tracking: {e}", file=sys.stderr
|
|
112
|
+
)
|
|
113
|
+
# Don't fail the entire handler - response tracking is optional
|
|
114
|
+
|
|
115
|
+
def track_agent_response(
|
|
116
|
+
self, session_id: str, agent_type: str, event: dict, delegation_requests: dict
|
|
117
|
+
):
|
|
118
|
+
"""Track agent response by correlating with original request and saving response.
|
|
119
|
+
|
|
120
|
+
WHY: This integrates response tracking into the existing hook flow,
|
|
121
|
+
capturing agent responses when Task delegations complete. It correlates
|
|
122
|
+
the response with the original request stored during pre-tool processing.
|
|
123
|
+
|
|
124
|
+
DESIGN DECISION: Only track responses if response tracking is enabled
|
|
125
|
+
and we have the original request data. Graceful error handling ensures
|
|
126
|
+
response tracking failures don't break hook processing.
|
|
127
|
+
"""
|
|
128
|
+
if not self.response_tracking_enabled or not self.response_tracker:
|
|
129
|
+
return
|
|
130
|
+
|
|
131
|
+
try:
|
|
132
|
+
# Get the original request data stored during pre-tool
|
|
133
|
+
request_info = delegation_requests.get(session_id)
|
|
134
|
+
if not request_info:
|
|
135
|
+
if DEBUG:
|
|
136
|
+
print(
|
|
137
|
+
f"No request data found for session {session_id}, skipping response tracking",
|
|
138
|
+
file=sys.stderr,
|
|
139
|
+
)
|
|
140
|
+
return
|
|
141
|
+
|
|
142
|
+
# Extract response from event output
|
|
143
|
+
response = event.get("output", "")
|
|
144
|
+
if not response:
|
|
145
|
+
# If no output, use error or construct a basic response
|
|
146
|
+
error = event.get("error", "")
|
|
147
|
+
exit_code = event.get("exit_code", 0)
|
|
148
|
+
if error:
|
|
149
|
+
response = f"Error: {error}"
|
|
150
|
+
else:
|
|
151
|
+
response = f"Task completed with exit code: {exit_code}"
|
|
152
|
+
|
|
153
|
+
# Convert response to string if it's not already
|
|
154
|
+
response_text = str(response)
|
|
155
|
+
|
|
156
|
+
# Try to extract structured JSON response from agent output
|
|
157
|
+
structured_response = None
|
|
158
|
+
try:
|
|
159
|
+
# Look for JSON block in the response (agents should return JSON at the end)
|
|
160
|
+
json_match = re.search(
|
|
161
|
+
r"```json\s*(\{.*?\})\s*```", response_text, re.DOTALL
|
|
162
|
+
)
|
|
163
|
+
if json_match:
|
|
164
|
+
structured_response = json.loads(json_match.group(1))
|
|
165
|
+
if DEBUG:
|
|
166
|
+
print(
|
|
167
|
+
f"Extracted structured response from {agent_type} agent",
|
|
168
|
+
file=sys.stderr,
|
|
169
|
+
)
|
|
170
|
+
except (json.JSONDecodeError, AttributeError) as e:
|
|
171
|
+
if DEBUG:
|
|
172
|
+
print(
|
|
173
|
+
f"No structured JSON response found in {agent_type} agent output: {e}",
|
|
174
|
+
file=sys.stderr,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
# Get the original request (prompt + description)
|
|
178
|
+
original_request = request_info.get("request", {})
|
|
179
|
+
prompt = original_request.get("prompt", "")
|
|
180
|
+
description = original_request.get("description", "")
|
|
181
|
+
|
|
182
|
+
# Combine prompt and description for the full request
|
|
183
|
+
full_request = prompt
|
|
184
|
+
if description and description != prompt:
|
|
185
|
+
if full_request:
|
|
186
|
+
full_request += f"\n\nDescription: {description}"
|
|
187
|
+
else:
|
|
188
|
+
full_request = description
|
|
189
|
+
|
|
190
|
+
if not full_request:
|
|
191
|
+
full_request = f"Task delegation to {agent_type} agent"
|
|
192
|
+
|
|
193
|
+
# Prepare metadata with structured response data if available
|
|
194
|
+
metadata = {
|
|
195
|
+
"exit_code": event.get("exit_code", 0),
|
|
196
|
+
"success": event.get("exit_code", 0) == 0,
|
|
197
|
+
"has_error": bool(event.get("error")),
|
|
198
|
+
"duration_ms": event.get("duration_ms"),
|
|
199
|
+
"working_directory": event.get("cwd", ""),
|
|
200
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
201
|
+
"tool_name": "Task",
|
|
202
|
+
"original_request_timestamp": request_info.get("timestamp"),
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
# Add structured response data to metadata if available
|
|
206
|
+
if structured_response:
|
|
207
|
+
metadata["structured_response"] = {
|
|
208
|
+
"task_completed": structured_response.get("task_completed", False),
|
|
209
|
+
"instructions": structured_response.get("instructions", ""),
|
|
210
|
+
"results": structured_response.get("results", ""),
|
|
211
|
+
"files_modified": structured_response.get("files_modified", []),
|
|
212
|
+
"tools_used": structured_response.get("tools_used", []),
|
|
213
|
+
"remember": structured_response.get("remember"),
|
|
214
|
+
"MEMORIES": structured_response.get(
|
|
215
|
+
"MEMORIES"
|
|
216
|
+
), # Complete memory replacement
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
# Log if MEMORIES field is present
|
|
220
|
+
if structured_response.get("MEMORIES"):
|
|
221
|
+
if DEBUG:
|
|
222
|
+
memories_count = len(structured_response["MEMORIES"])
|
|
223
|
+
print(
|
|
224
|
+
f"Agent {agent_type} returned MEMORIES field with {memories_count} items",
|
|
225
|
+
file=sys.stderr,
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
# Check if task was completed for logging purposes
|
|
229
|
+
if structured_response.get("task_completed"):
|
|
230
|
+
metadata["task_completed"] = True
|
|
231
|
+
|
|
232
|
+
# Log files modified for debugging
|
|
233
|
+
if DEBUG and structured_response.get("files_modified"):
|
|
234
|
+
files = [f["file"] for f in structured_response["files_modified"]]
|
|
235
|
+
print(
|
|
236
|
+
f"Agent {agent_type} modified files: {files}", file=sys.stderr
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
# Track the response
|
|
240
|
+
file_path = self.response_tracker.track_response(
|
|
241
|
+
agent_name=agent_type,
|
|
242
|
+
request=full_request,
|
|
243
|
+
response=response_text,
|
|
244
|
+
session_id=session_id,
|
|
245
|
+
metadata=metadata,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
if file_path and DEBUG:
|
|
249
|
+
print(
|
|
250
|
+
f"✅ Tracked response for {agent_type} agent in session {session_id}: {file_path.name}",
|
|
251
|
+
file=sys.stderr,
|
|
252
|
+
)
|
|
253
|
+
elif DEBUG and not file_path:
|
|
254
|
+
print(
|
|
255
|
+
f"Response tracking returned None for {agent_type} agent (might be excluded or disabled)",
|
|
256
|
+
file=sys.stderr,
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
# Clean up the request data after successful tracking
|
|
260
|
+
delegation_requests.pop(session_id, None)
|
|
261
|
+
|
|
262
|
+
except Exception as e:
|
|
263
|
+
if DEBUG:
|
|
264
|
+
print(f"❌ Failed to track agent response: {e}", file=sys.stderr)
|
|
265
|
+
# Don't fail the hook processing - response tracking is optional
|
|
266
|
+
|
|
267
|
+
def track_stop_response(
|
|
268
|
+
self, event: dict, session_id: str, metadata: dict, pending_prompts: dict
|
|
269
|
+
):
|
|
270
|
+
"""Track response for stop events.
|
|
271
|
+
|
|
272
|
+
Captures Claude API stop_reason and usage data for context management.
|
|
273
|
+
"""
|
|
274
|
+
if not (self.response_tracking_enabled and self.response_tracker):
|
|
275
|
+
return
|
|
276
|
+
|
|
277
|
+
try:
|
|
278
|
+
# Extract output from event
|
|
279
|
+
output = (
|
|
280
|
+
event.get("output", "")
|
|
281
|
+
or event.get("final_output", "")
|
|
282
|
+
or event.get("response", "")
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
# Check if we have a pending prompt for this session
|
|
286
|
+
prompt_data = pending_prompts.get(session_id)
|
|
287
|
+
|
|
288
|
+
if DEBUG:
|
|
289
|
+
print(
|
|
290
|
+
f" - output present: {bool(output)} (length: {len(str(output)) if output else 0})",
|
|
291
|
+
file=sys.stderr,
|
|
292
|
+
)
|
|
293
|
+
print(f" - prompt_data present: {bool(prompt_data)}", file=sys.stderr)
|
|
294
|
+
|
|
295
|
+
if output and prompt_data:
|
|
296
|
+
# Add prompt timestamp to metadata
|
|
297
|
+
metadata["prompt_timestamp"] = prompt_data.get("timestamp")
|
|
298
|
+
|
|
299
|
+
# Capture Claude API stop_reason if available
|
|
300
|
+
if "stop_reason" in event:
|
|
301
|
+
metadata["stop_reason"] = event["stop_reason"]
|
|
302
|
+
if DEBUG:
|
|
303
|
+
print(
|
|
304
|
+
f" - Captured stop_reason: {event['stop_reason']}",
|
|
305
|
+
file=sys.stderr,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
# Capture Claude API usage data if available
|
|
309
|
+
if "usage" in event:
|
|
310
|
+
usage_data = event["usage"]
|
|
311
|
+
metadata["usage"] = {
|
|
312
|
+
"input_tokens": usage_data.get("input_tokens", 0),
|
|
313
|
+
"output_tokens": usage_data.get("output_tokens", 0),
|
|
314
|
+
"cache_creation_input_tokens": usage_data.get(
|
|
315
|
+
"cache_creation_input_tokens", 0
|
|
316
|
+
),
|
|
317
|
+
"cache_read_input_tokens": usage_data.get(
|
|
318
|
+
"cache_read_input_tokens", 0
|
|
319
|
+
),
|
|
320
|
+
}
|
|
321
|
+
if DEBUG:
|
|
322
|
+
total_tokens = usage_data.get(
|
|
323
|
+
"input_tokens", 0
|
|
324
|
+
) + usage_data.get("output_tokens", 0)
|
|
325
|
+
print(
|
|
326
|
+
f" - Captured usage: {total_tokens} total tokens",
|
|
327
|
+
file=sys.stderr,
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
# Track the main Claude response
|
|
331
|
+
file_path = self.response_tracker.track_response(
|
|
332
|
+
agent_name="claude_main",
|
|
333
|
+
request=prompt_data["prompt"],
|
|
334
|
+
response=str(output),
|
|
335
|
+
session_id=session_id,
|
|
336
|
+
metadata=metadata,
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
if file_path and DEBUG:
|
|
340
|
+
print(f" - Response tracked to: {file_path}", file=sys.stderr)
|
|
341
|
+
|
|
342
|
+
# Clean up pending prompt
|
|
343
|
+
del pending_prompts[session_id]
|
|
344
|
+
|
|
345
|
+
except Exception as e:
|
|
346
|
+
if DEBUG:
|
|
347
|
+
print(f"Error tracking stop response: {e}", file=sys.stderr)
|
|
348
|
+
|
|
349
|
+
def track_assistant_response(self, event: dict, pending_prompts: dict):
|
|
350
|
+
"""Handle assistant response events for comprehensive response tracking."""
|
|
351
|
+
if not self.response_tracking_enabled or not self.track_all_interactions:
|
|
352
|
+
return
|
|
353
|
+
|
|
354
|
+
session_id = event.get("session_id", "")
|
|
355
|
+
if not session_id:
|
|
356
|
+
return
|
|
357
|
+
|
|
358
|
+
# Get the stored prompt for this session
|
|
359
|
+
prompt_data = pending_prompts.get(session_id)
|
|
360
|
+
if not prompt_data:
|
|
361
|
+
if DEBUG:
|
|
362
|
+
print(
|
|
363
|
+
f"No stored prompt for session {session_id[:8]}..., skipping response tracking",
|
|
364
|
+
file=sys.stderr,
|
|
365
|
+
)
|
|
366
|
+
return
|
|
367
|
+
|
|
368
|
+
try:
|
|
369
|
+
# Extract response content from event
|
|
370
|
+
response_content = (
|
|
371
|
+
event.get("response", "")
|
|
372
|
+
or event.get("content", "")
|
|
373
|
+
or event.get("text", "")
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
if not response_content:
|
|
377
|
+
if DEBUG:
|
|
378
|
+
print(
|
|
379
|
+
f"No response content in event for session {session_id[:8]}...",
|
|
380
|
+
file=sys.stderr,
|
|
381
|
+
)
|
|
382
|
+
return
|
|
383
|
+
|
|
384
|
+
# Track the response
|
|
385
|
+
metadata = {
|
|
386
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
387
|
+
"prompt_timestamp": prompt_data.get("timestamp"),
|
|
388
|
+
"working_directory": prompt_data.get("working_directory", ""),
|
|
389
|
+
"event_type": "assistant_response",
|
|
390
|
+
"session_type": "interactive",
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
file_path = self.response_tracker.track_response(
|
|
394
|
+
agent_name="claude",
|
|
395
|
+
request=prompt_data["prompt"],
|
|
396
|
+
response=response_content,
|
|
397
|
+
session_id=session_id,
|
|
398
|
+
metadata=metadata,
|
|
399
|
+
)
|
|
400
|
+
|
|
401
|
+
if file_path and DEBUG:
|
|
402
|
+
print(
|
|
403
|
+
f"✅ Tracked Claude response for session {session_id[:8]}...: {file_path.name}",
|
|
404
|
+
file=sys.stderr,
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
# Clean up the stored prompt
|
|
408
|
+
del pending_prompts[session_id]
|
|
409
|
+
|
|
410
|
+
except Exception as e:
|
|
411
|
+
if DEBUG:
|
|
412
|
+
print(f"❌ Failed to track assistant response: {e}", file=sys.stderr)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Hook handler services for modular functionality."""
|
|
2
|
+
|
|
3
|
+
# Use HTTP-based connection manager for stable dashboard communication
|
|
4
|
+
# from .connection_manager import ConnectionManagerService # Old SocketIO-based
|
|
5
|
+
from .connection_manager_http import ConnectionManagerService # New HTTP-based
|
|
6
|
+
from .duplicate_detector import DuplicateEventDetector
|
|
7
|
+
from .state_manager import StateManagerService
|
|
8
|
+
from .subagent_processor import SubagentResponseProcessor
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"ConnectionManagerService",
|
|
12
|
+
"DuplicateEventDetector",
|
|
13
|
+
"StateManagerService",
|
|
14
|
+
"SubagentResponseProcessor",
|
|
15
|
+
]
|
|
Binary file
|
|
Binary file
|