claude-mpm 3.4.10__py3-none-any.whl ā 5.4.85__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_FOUNDERS_OUTPUT_STYLE.md +405 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -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 +94 -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 +2501 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_reconcile.py +197 -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 +3253 -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 +1398 -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 +298 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +31 -0
- claude_mpm/cli/interactive/agent_wizard.py +1927 -0
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -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 +649 -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 +1578 -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 +133 -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 +491 -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 +612 -0
- claude_mpm/core/unified_paths.py +958 -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/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/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 +1377 -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_reconciler.py +577 -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/startup_reconciliation.py +138 -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 +1205 -0
- claude_mpm/services/agents/startup_sync.py +262 -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 +711 -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 +1340 -0
- claude_mpm/services/skills/selective_skill_deployer.py +743 -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/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -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/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -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/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -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/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -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/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
- claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -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/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -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 +1189 -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 +844 -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.85.dist-info/METADATA +1023 -0
- claude_mpm-5.4.85.dist-info/RECORD +980 -0
- {claude_mpm-3.4.10.dist-info ā claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.85.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.85.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info ā claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
|
@@ -22,42 +22,38 @@ Performance Impact:
|
|
|
22
22
|
- Reduces redundant file I/O operations
|
|
23
23
|
|
|
24
24
|
Usage:
|
|
25
|
-
from
|
|
26
|
-
|
|
25
|
+
from claude_mpm.services.shared_prompt_cache import SharedPromptCache
|
|
26
|
+
|
|
27
27
|
# Get singleton instance
|
|
28
28
|
cache = SharedPromptCache.get_instance()
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
# Cache prompt data
|
|
31
31
|
cache.set("engineer:profile", prompt_data, ttl=300)
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
# Retrieve cached data
|
|
34
34
|
prompt_data = cache.get("engineer:profile")
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
# Invalidate specific cache entries
|
|
37
37
|
cache.invalidate("engineer:profile")
|
|
38
38
|
"""
|
|
39
39
|
|
|
40
40
|
import asyncio
|
|
41
41
|
import json
|
|
42
|
-
import logging
|
|
43
42
|
import threading
|
|
44
43
|
import time
|
|
45
|
-
import weakref
|
|
46
44
|
from collections import OrderedDict
|
|
47
45
|
from dataclasses import dataclass, field
|
|
48
|
-
from datetime import datetime, timedelta
|
|
49
46
|
from functools import wraps
|
|
50
|
-
from pathlib import Path
|
|
51
47
|
from threading import RLock
|
|
52
|
-
from typing import Any, Dict, List, Optional, Set
|
|
48
|
+
from typing import Any, Dict, List, Optional, Set
|
|
53
49
|
|
|
54
|
-
from
|
|
50
|
+
from claude_mpm.core.base_service import BaseService
|
|
55
51
|
|
|
56
52
|
|
|
57
53
|
@dataclass
|
|
58
54
|
class CacheEntry:
|
|
59
55
|
"""Cache entry with TTL and metadata."""
|
|
60
|
-
|
|
56
|
+
|
|
61
57
|
key: str
|
|
62
58
|
value: Any
|
|
63
59
|
created_at: float
|
|
@@ -66,19 +62,19 @@ class CacheEntry:
|
|
|
66
62
|
last_accessed: float = field(default_factory=time.time)
|
|
67
63
|
size_bytes: int = 0
|
|
68
64
|
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
69
|
-
|
|
65
|
+
|
|
70
66
|
@property
|
|
71
67
|
def is_expired(self) -> bool:
|
|
72
68
|
"""Check if cache entry has expired."""
|
|
73
69
|
if self.ttl is None:
|
|
74
70
|
return False
|
|
75
71
|
return time.time() > (self.created_at + self.ttl)
|
|
76
|
-
|
|
72
|
+
|
|
77
73
|
@property
|
|
78
74
|
def age_seconds(self) -> float:
|
|
79
75
|
"""Get age of cache entry in seconds."""
|
|
80
76
|
return time.time() - self.created_at
|
|
81
|
-
|
|
77
|
+
|
|
82
78
|
def touch(self) -> None:
|
|
83
79
|
"""Update access metrics."""
|
|
84
80
|
self.access_count += 1
|
|
@@ -88,7 +84,7 @@ class CacheEntry:
|
|
|
88
84
|
@dataclass
|
|
89
85
|
class CacheMetrics:
|
|
90
86
|
"""Cache performance metrics."""
|
|
91
|
-
|
|
87
|
+
|
|
92
88
|
hits: int = 0
|
|
93
89
|
misses: int = 0
|
|
94
90
|
sets: int = 0
|
|
@@ -98,13 +94,13 @@ class CacheMetrics:
|
|
|
98
94
|
entry_count: int = 0
|
|
99
95
|
evictions: int = 0
|
|
100
96
|
expired_removals: int = 0
|
|
101
|
-
|
|
97
|
+
|
|
102
98
|
@property
|
|
103
99
|
def hit_rate(self) -> float:
|
|
104
100
|
"""Calculate cache hit rate."""
|
|
105
101
|
total = self.hits + self.misses
|
|
106
102
|
return self.hits / total if total > 0 else 0.0
|
|
107
|
-
|
|
103
|
+
|
|
108
104
|
@property
|
|
109
105
|
def miss_rate(self) -> float:
|
|
110
106
|
"""Calculate cache miss rate."""
|
|
@@ -114,59 +110,75 @@ class CacheMetrics:
|
|
|
114
110
|
class SharedPromptCache(BaseService):
|
|
115
111
|
"""
|
|
116
112
|
Shared Prompt Cache Service with Singleton Pattern
|
|
117
|
-
|
|
113
|
+
|
|
118
114
|
Thread-safe, high-performance caching service for subprocess agent prompts.
|
|
119
115
|
Implements LRU eviction with TTL support and comprehensive metrics.
|
|
120
116
|
"""
|
|
121
|
-
|
|
122
|
-
_instance: Optional[
|
|
117
|
+
|
|
118
|
+
_instance: Optional["SharedPromptCache"] = None
|
|
123
119
|
_lock = threading.Lock()
|
|
124
|
-
|
|
120
|
+
|
|
125
121
|
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
|
126
122
|
"""Initialize the shared cache service."""
|
|
127
123
|
# Singleton pattern enforcement
|
|
128
124
|
if SharedPromptCache._instance is not None:
|
|
129
|
-
raise RuntimeError(
|
|
130
|
-
|
|
125
|
+
raise RuntimeError(
|
|
126
|
+
"SharedPromptCache is a singleton. Use get_instance() instead."
|
|
127
|
+
)
|
|
128
|
+
|
|
131
129
|
super().__init__("shared_prompt_cache", config)
|
|
132
|
-
|
|
130
|
+
|
|
133
131
|
# Cache configuration
|
|
134
|
-
self.max_size = self.get_config(
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
self.
|
|
132
|
+
self.max_size = self.get_config(
|
|
133
|
+
"max_size", 500
|
|
134
|
+
) # Reduced maximum cache entries
|
|
135
|
+
self.max_memory_mb = self.get_config(
|
|
136
|
+
"max_memory_mb", 50
|
|
137
|
+
) # Reduced maximum memory usage
|
|
138
|
+
self.default_ttl = self.get_config(
|
|
139
|
+
"default_ttl", 300
|
|
140
|
+
) # 5 minutes default TTL (was 30)
|
|
141
|
+
self.cleanup_interval = self.get_config(
|
|
142
|
+
"cleanup_interval", 60
|
|
143
|
+
) # 1 minute cleanup (was 5)
|
|
138
144
|
self.enable_metrics = self.get_config("enable_metrics", True)
|
|
139
|
-
|
|
145
|
+
|
|
140
146
|
# Memory pressure handling
|
|
141
|
-
self.memory_pressure_threshold =
|
|
147
|
+
self.memory_pressure_threshold = (
|
|
148
|
+
0.8 # 80% of max memory triggers aggressive cleanup
|
|
149
|
+
)
|
|
142
150
|
self.aggressive_cleanup_active = False
|
|
143
|
-
|
|
151
|
+
|
|
144
152
|
# Cache storage - OrderedDict for LRU behavior
|
|
145
153
|
self._cache: OrderedDict[str, CacheEntry] = OrderedDict()
|
|
146
154
|
self._cache_lock = RLock() # Reentrant lock for nested operations
|
|
147
|
-
|
|
155
|
+
|
|
148
156
|
# Metrics and monitoring
|
|
149
157
|
self._metrics = CacheMetrics()
|
|
150
158
|
self._metrics_lock = threading.Lock()
|
|
151
|
-
|
|
159
|
+
|
|
152
160
|
# Background task tracking
|
|
153
161
|
self._cleanup_task: Optional[asyncio.Task] = None
|
|
154
|
-
|
|
162
|
+
|
|
155
163
|
# Cache invalidation tracking
|
|
156
164
|
self._invalidation_callbacks: Dict[str, List[callable]] = {}
|
|
157
165
|
self._namespace_dependencies: Dict[str, Set[str]] = {}
|
|
158
|
-
|
|
159
|
-
self.logger.info(
|
|
160
|
-
|
|
161
|
-
|
|
166
|
+
|
|
167
|
+
self.logger.info(
|
|
168
|
+
f"SharedPromptCache initialized with max_size={self.max_size}, "
|
|
169
|
+
f"max_memory_mb={self.max_memory_mb}, default_ttl={self.default_ttl}s"
|
|
170
|
+
)
|
|
171
|
+
|
|
162
172
|
@classmethod
|
|
163
|
-
def get_instance(
|
|
173
|
+
def get_instance(
|
|
174
|
+
cls, config: Optional[Dict[str, Any]] = None
|
|
175
|
+
) -> "SharedPromptCache":
|
|
164
176
|
"""
|
|
165
177
|
Get the singleton instance of SharedPromptCache.
|
|
166
|
-
|
|
178
|
+
|
|
167
179
|
Args:
|
|
168
180
|
config: Optional configuration (only used on first call)
|
|
169
|
-
|
|
181
|
+
|
|
170
182
|
Returns:
|
|
171
183
|
Singleton instance of SharedPromptCache
|
|
172
184
|
"""
|
|
@@ -175,94 +187,105 @@ class SharedPromptCache(BaseService):
|
|
|
175
187
|
if cls._instance is None:
|
|
176
188
|
cls._instance = cls(config)
|
|
177
189
|
return cls._instance
|
|
178
|
-
|
|
190
|
+
|
|
179
191
|
@classmethod
|
|
180
192
|
def reset_instance(cls) -> None:
|
|
181
193
|
"""Reset singleton instance (for testing purposes)."""
|
|
182
194
|
with cls._lock:
|
|
183
195
|
if cls._instance is not None:
|
|
184
196
|
if cls._instance.running:
|
|
185
|
-
asyncio.create_task(cls._instance.stop())
|
|
197
|
+
_task = asyncio.create_task(cls._instance.stop())
|
|
198
|
+
# Fire-and-forget cleanup task during test reset
|
|
186
199
|
cls._instance = None
|
|
187
|
-
|
|
200
|
+
|
|
188
201
|
async def _initialize(self) -> None:
|
|
189
202
|
"""Initialize the cache service."""
|
|
190
203
|
self.logger.info("Initializing SharedPromptCache service...")
|
|
191
|
-
|
|
204
|
+
|
|
192
205
|
# Start cleanup task
|
|
193
206
|
self._cleanup_task = asyncio.create_task(self._cleanup_expired_entries())
|
|
194
|
-
|
|
207
|
+
|
|
195
208
|
# Register with memory pressure coordinator
|
|
196
209
|
try:
|
|
197
210
|
from .memory_pressure_coordinator import register_service_cleanup
|
|
198
|
-
|
|
211
|
+
|
|
212
|
+
await register_service_cleanup(
|
|
213
|
+
"shared_prompt_cache", self.handle_memory_pressure
|
|
214
|
+
)
|
|
199
215
|
self.logger.info("Registered with memory pressure coordinator")
|
|
200
216
|
except Exception as e:
|
|
201
|
-
self.logger.warning(
|
|
202
|
-
|
|
217
|
+
self.logger.warning(
|
|
218
|
+
f"Failed to register with memory pressure coordinator: {e}"
|
|
219
|
+
)
|
|
220
|
+
|
|
203
221
|
# Note: Metrics collection is handled by parent class
|
|
204
222
|
# Custom metrics are collected in _collect_custom_metrics()
|
|
205
|
-
|
|
223
|
+
|
|
206
224
|
self.logger.info("SharedPromptCache service initialized successfully")
|
|
207
|
-
|
|
225
|
+
|
|
208
226
|
async def _cleanup(self) -> None:
|
|
209
227
|
"""Cleanup cache service resources."""
|
|
210
228
|
self.logger.info("Cleaning up SharedPromptCache service...")
|
|
211
|
-
|
|
229
|
+
|
|
212
230
|
# Cancel background tasks
|
|
213
231
|
if self._cleanup_task:
|
|
214
232
|
self._cleanup_task.cancel()
|
|
215
|
-
|
|
233
|
+
|
|
216
234
|
# Clear cache
|
|
217
235
|
with self._cache_lock:
|
|
218
236
|
self._cache.clear()
|
|
219
|
-
|
|
237
|
+
|
|
220
238
|
self.logger.info("SharedPromptCache service cleaned up")
|
|
221
|
-
|
|
239
|
+
|
|
222
240
|
async def _health_check(self) -> Dict[str, bool]:
|
|
223
241
|
"""Perform cache-specific health checks."""
|
|
224
242
|
checks = {}
|
|
225
|
-
|
|
243
|
+
|
|
226
244
|
try:
|
|
227
245
|
# Test cache operations
|
|
228
246
|
test_key = f"__health_check_{time.time()}"
|
|
229
247
|
test_value = {"test": True, "timestamp": time.time()}
|
|
230
|
-
|
|
248
|
+
|
|
231
249
|
# Test set operation
|
|
232
250
|
self.set(test_key, test_value, ttl=5)
|
|
233
251
|
checks["cache_set"] = True
|
|
234
|
-
|
|
252
|
+
|
|
235
253
|
# Test get operation
|
|
236
254
|
retrieved = self.get(test_key)
|
|
237
255
|
checks["cache_get"] = retrieved is not None and retrieved["test"] is True
|
|
238
|
-
|
|
256
|
+
|
|
239
257
|
# Test delete operation
|
|
240
258
|
self.delete(test_key)
|
|
241
259
|
checks["cache_delete"] = self.get(test_key) is None
|
|
242
|
-
|
|
260
|
+
|
|
243
261
|
# Check memory usage
|
|
244
262
|
checks["memory_usage_ok"] = self._get_memory_usage_mb() < self.max_memory_mb
|
|
245
|
-
|
|
263
|
+
|
|
246
264
|
# Check cache size
|
|
247
265
|
checks["cache_size_ok"] = len(self._cache) <= self.max_size
|
|
248
|
-
|
|
266
|
+
|
|
249
267
|
except Exception as e:
|
|
250
268
|
self.logger.error(f"Cache health check failed: {e}")
|
|
251
269
|
checks["cache_operations"] = False
|
|
252
|
-
|
|
270
|
+
|
|
253
271
|
return checks
|
|
254
|
-
|
|
255
|
-
def set(
|
|
256
|
-
|
|
272
|
+
|
|
273
|
+
def set(
|
|
274
|
+
self,
|
|
275
|
+
key: str,
|
|
276
|
+
value: Any,
|
|
277
|
+
ttl: Optional[float] = None,
|
|
278
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
279
|
+
) -> bool:
|
|
257
280
|
"""
|
|
258
281
|
Set a cache entry with optional TTL.
|
|
259
|
-
|
|
282
|
+
|
|
260
283
|
Args:
|
|
261
284
|
key: Cache key
|
|
262
285
|
value: Value to cache
|
|
263
286
|
ttl: Time to live in seconds (uses default_ttl if None)
|
|
264
287
|
metadata: Optional metadata for the cache entry
|
|
265
|
-
|
|
288
|
+
|
|
266
289
|
Returns:
|
|
267
290
|
True if successful, False otherwise
|
|
268
291
|
"""
|
|
@@ -271,10 +294,10 @@ class SharedPromptCache(BaseService):
|
|
|
271
294
|
# Use default TTL if not specified
|
|
272
295
|
if ttl is None:
|
|
273
296
|
ttl = self.default_ttl
|
|
274
|
-
|
|
297
|
+
|
|
275
298
|
# Calculate entry size
|
|
276
299
|
size_bytes = self._calculate_size(value)
|
|
277
|
-
|
|
300
|
+
|
|
278
301
|
# Create cache entry
|
|
279
302
|
entry = CacheEntry(
|
|
280
303
|
key=key,
|
|
@@ -282,54 +305,56 @@ class SharedPromptCache(BaseService):
|
|
|
282
305
|
created_at=time.time(),
|
|
283
306
|
ttl=ttl,
|
|
284
307
|
size_bytes=size_bytes,
|
|
285
|
-
metadata=metadata or {}
|
|
308
|
+
metadata=metadata or {},
|
|
286
309
|
)
|
|
287
|
-
|
|
310
|
+
|
|
288
311
|
# Check if we need to evict entries
|
|
289
312
|
self._ensure_cache_capacity(size_bytes)
|
|
290
|
-
|
|
313
|
+
|
|
291
314
|
# Remove existing entry if present
|
|
292
315
|
if key in self._cache:
|
|
293
316
|
old_entry = self._cache.pop(key)
|
|
294
317
|
with self._metrics_lock:
|
|
295
318
|
self._metrics.size_bytes -= old_entry.size_bytes
|
|
296
|
-
|
|
319
|
+
|
|
297
320
|
# Add new entry (to end for LRU)
|
|
298
321
|
self._cache[key] = entry
|
|
299
|
-
|
|
322
|
+
|
|
300
323
|
# Update metrics
|
|
301
324
|
with self._metrics_lock:
|
|
302
325
|
self._metrics.sets += 1
|
|
303
326
|
self._metrics.size_bytes += size_bytes
|
|
304
327
|
self._metrics.entry_count = len(self._cache)
|
|
305
|
-
|
|
306
|
-
self.logger.debug(
|
|
328
|
+
|
|
329
|
+
self.logger.debug(
|
|
330
|
+
f"Cached key '{key}' with TTL {ttl}s, size {size_bytes} bytes"
|
|
331
|
+
)
|
|
307
332
|
return True
|
|
308
|
-
|
|
333
|
+
|
|
309
334
|
except Exception as e:
|
|
310
335
|
self.logger.error(f"Failed to set cache key '{key}': {e}")
|
|
311
336
|
return False
|
|
312
|
-
|
|
337
|
+
|
|
313
338
|
def get(self, key: str) -> Optional[Any]:
|
|
314
339
|
"""
|
|
315
340
|
Get a cache entry by key.
|
|
316
|
-
|
|
341
|
+
|
|
317
342
|
Args:
|
|
318
343
|
key: Cache key to retrieve
|
|
319
|
-
|
|
344
|
+
|
|
320
345
|
Returns:
|
|
321
346
|
Cached value if found and not expired, None otherwise
|
|
322
347
|
"""
|
|
323
348
|
try:
|
|
324
349
|
with self._cache_lock:
|
|
325
350
|
entry = self._cache.get(key)
|
|
326
|
-
|
|
351
|
+
|
|
327
352
|
if entry is None:
|
|
328
353
|
# Cache miss
|
|
329
354
|
with self._metrics_lock:
|
|
330
355
|
self._metrics.misses += 1
|
|
331
356
|
return None
|
|
332
|
-
|
|
357
|
+
|
|
333
358
|
if entry.is_expired:
|
|
334
359
|
# Entry expired, remove it
|
|
335
360
|
self._remove_entry(key, entry)
|
|
@@ -337,118 +362,124 @@ class SharedPromptCache(BaseService):
|
|
|
337
362
|
self._metrics.misses += 1
|
|
338
363
|
self._metrics.expired_removals += 1
|
|
339
364
|
return None
|
|
340
|
-
|
|
365
|
+
|
|
341
366
|
# Cache hit - update access metrics and move to end (LRU)
|
|
342
367
|
entry.touch()
|
|
343
368
|
self._cache.move_to_end(key)
|
|
344
|
-
|
|
369
|
+
|
|
345
370
|
with self._metrics_lock:
|
|
346
371
|
self._metrics.hits += 1
|
|
347
|
-
|
|
348
|
-
self.logger.debug(
|
|
372
|
+
|
|
373
|
+
self.logger.debug(
|
|
374
|
+
f"Cache hit for key '{key}' (age: {entry.age_seconds:.1f}s)"
|
|
375
|
+
)
|
|
349
376
|
return entry.value
|
|
350
|
-
|
|
377
|
+
|
|
351
378
|
except Exception as e:
|
|
352
379
|
self.logger.error(f"Failed to get cache key '{key}': {e}")
|
|
353
380
|
with self._metrics_lock:
|
|
354
381
|
self._metrics.misses += 1
|
|
355
382
|
return None
|
|
356
|
-
|
|
383
|
+
|
|
357
384
|
def delete(self, key: str) -> bool:
|
|
358
385
|
"""
|
|
359
386
|
Delete a cache entry.
|
|
360
|
-
|
|
387
|
+
|
|
361
388
|
Args:
|
|
362
389
|
key: Cache key to delete
|
|
363
|
-
|
|
390
|
+
|
|
364
391
|
Returns:
|
|
365
392
|
True if deleted, False if not found
|
|
366
393
|
"""
|
|
367
394
|
try:
|
|
368
395
|
with self._cache_lock:
|
|
369
396
|
entry = self._cache.pop(key, None)
|
|
370
|
-
|
|
397
|
+
|
|
371
398
|
if entry is not None:
|
|
372
399
|
with self._metrics_lock:
|
|
373
400
|
self._metrics.deletes += 1
|
|
374
401
|
self._metrics.size_bytes -= entry.size_bytes
|
|
375
402
|
self._metrics.entry_count = len(self._cache)
|
|
376
|
-
|
|
403
|
+
|
|
377
404
|
self.logger.debug(f"Deleted cache key '{key}'")
|
|
378
405
|
return True
|
|
379
|
-
|
|
406
|
+
|
|
380
407
|
return False
|
|
381
|
-
|
|
408
|
+
|
|
382
409
|
except Exception as e:
|
|
383
410
|
self.logger.error(f"Failed to delete cache key '{key}': {e}")
|
|
384
411
|
return False
|
|
385
|
-
|
|
412
|
+
|
|
386
413
|
def invalidate(self, pattern: str) -> int:
|
|
387
414
|
"""
|
|
388
415
|
Invalidate cache entries matching a pattern.
|
|
389
|
-
|
|
416
|
+
|
|
390
417
|
Args:
|
|
391
418
|
pattern: Pattern to match keys (supports wildcards *)
|
|
392
|
-
|
|
419
|
+
|
|
393
420
|
Returns:
|
|
394
421
|
Number of entries invalidated
|
|
395
422
|
"""
|
|
396
423
|
try:
|
|
397
424
|
import fnmatch
|
|
398
|
-
|
|
425
|
+
|
|
399
426
|
invalidated = 0
|
|
400
|
-
|
|
427
|
+
|
|
401
428
|
with self._cache_lock:
|
|
402
429
|
keys_to_remove = []
|
|
403
|
-
|
|
404
|
-
for key in self._cache
|
|
430
|
+
|
|
431
|
+
for key in self._cache:
|
|
405
432
|
if fnmatch.fnmatch(key, pattern):
|
|
406
433
|
keys_to_remove.append(key)
|
|
407
|
-
|
|
434
|
+
|
|
408
435
|
for key in keys_to_remove:
|
|
409
436
|
entry = self._cache.pop(key)
|
|
410
437
|
with self._metrics_lock:
|
|
411
438
|
self._metrics.size_bytes -= entry.size_bytes
|
|
412
439
|
invalidated += 1
|
|
413
|
-
|
|
440
|
+
|
|
414
441
|
with self._metrics_lock:
|
|
415
442
|
self._metrics.invalidations += invalidated
|
|
416
443
|
self._metrics.entry_count = len(self._cache)
|
|
417
|
-
|
|
418
|
-
self.logger.info(
|
|
419
|
-
|
|
444
|
+
|
|
445
|
+
self.logger.info(
|
|
446
|
+
f"Invalidated {invalidated} cache entries matching pattern '{pattern}'"
|
|
447
|
+
)
|
|
448
|
+
|
|
420
449
|
# Trigger invalidation callbacks
|
|
421
450
|
self._trigger_invalidation_callbacks(pattern)
|
|
422
|
-
|
|
451
|
+
|
|
423
452
|
return invalidated
|
|
424
|
-
|
|
453
|
+
|
|
425
454
|
except Exception as e:
|
|
426
455
|
self.logger.error(f"Failed to invalidate pattern '{pattern}': {e}")
|
|
427
456
|
return 0
|
|
428
|
-
|
|
457
|
+
|
|
429
458
|
def clear(self) -> None:
|
|
430
459
|
"""Clear all cache entries."""
|
|
431
460
|
try:
|
|
432
461
|
with self._cache_lock:
|
|
433
462
|
entry_count = len(self._cache)
|
|
434
463
|
self._cache.clear()
|
|
435
|
-
|
|
464
|
+
|
|
436
465
|
with self._metrics_lock:
|
|
437
466
|
self._metrics.size_bytes = 0
|
|
438
467
|
self._metrics.entry_count = 0
|
|
439
468
|
self._metrics.invalidations += entry_count
|
|
440
|
-
|
|
469
|
+
|
|
441
470
|
self.logger.info(f"Cleared all {entry_count} cache entries")
|
|
442
|
-
|
|
471
|
+
|
|
443
472
|
except Exception as e:
|
|
444
473
|
self.logger.error(f"Failed to clear cache: {e}")
|
|
445
|
-
|
|
474
|
+
|
|
446
475
|
def get_metrics(self) -> Dict[str, Any]:
|
|
447
476
|
"""Get current cache metrics."""
|
|
448
477
|
with self._metrics_lock:
|
|
449
478
|
size_mb = self._metrics.size_bytes / (1024 * 1024)
|
|
450
|
-
memory_usage_percent = (
|
|
451
|
-
|
|
479
|
+
memory_usage_percent = (
|
|
480
|
+
(size_mb / self.max_memory_mb * 100) if self.max_memory_mb > 0 else 0
|
|
481
|
+
)
|
|
482
|
+
|
|
452
483
|
return {
|
|
453
484
|
"hits": self._metrics.hits,
|
|
454
485
|
"misses": self._metrics.misses,
|
|
@@ -467,15 +498,15 @@ class SharedPromptCache(BaseService):
|
|
|
467
498
|
"memory_usage_percent": memory_usage_percent,
|
|
468
499
|
"memory_pressure": memory_usage_percent > 80, # Flag high memory usage
|
|
469
500
|
"ttl_default": self.default_ttl,
|
|
470
|
-
"cleanup_interval": self.cleanup_interval
|
|
501
|
+
"cleanup_interval": self.cleanup_interval,
|
|
471
502
|
}
|
|
472
|
-
|
|
503
|
+
|
|
473
504
|
def get_cache_info(self) -> Dict[str, Any]:
|
|
474
505
|
"""Get detailed cache information."""
|
|
475
506
|
with self._cache_lock:
|
|
476
507
|
entries_info = []
|
|
477
508
|
total_size = 0
|
|
478
|
-
|
|
509
|
+
|
|
479
510
|
for key, entry in self._cache.items():
|
|
480
511
|
entry_info = {
|
|
481
512
|
"key": key,
|
|
@@ -484,30 +515,30 @@ class SharedPromptCache(BaseService):
|
|
|
484
515
|
"size_bytes": entry.size_bytes,
|
|
485
516
|
"is_expired": entry.is_expired,
|
|
486
517
|
"ttl": entry.ttl,
|
|
487
|
-
"metadata": entry.metadata
|
|
518
|
+
"metadata": entry.metadata,
|
|
488
519
|
}
|
|
489
520
|
entries_info.append(entry_info)
|
|
490
521
|
total_size += entry.size_bytes
|
|
491
|
-
|
|
522
|
+
|
|
492
523
|
return {
|
|
493
524
|
"total_entries": len(self._cache),
|
|
494
525
|
"total_size_bytes": total_size,
|
|
495
526
|
"total_size_mb": total_size / (1024 * 1024),
|
|
496
527
|
"entries": entries_info,
|
|
497
|
-
"metrics": self.get_metrics()
|
|
528
|
+
"metrics": self.get_metrics(),
|
|
498
529
|
}
|
|
499
|
-
|
|
530
|
+
|
|
500
531
|
def register_invalidation_callback(self, pattern: str, callback: callable) -> None:
|
|
501
532
|
"""Register a callback for cache invalidation events."""
|
|
502
533
|
if pattern not in self._invalidation_callbacks:
|
|
503
534
|
self._invalidation_callbacks[pattern] = []
|
|
504
535
|
self._invalidation_callbacks[pattern].append(callback)
|
|
505
|
-
|
|
536
|
+
|
|
506
537
|
def _ensure_cache_capacity(self, new_entry_size: int) -> None:
|
|
507
538
|
"""Ensure cache has capacity for new entry."""
|
|
508
539
|
current_memory_mb = self._get_memory_usage_mb()
|
|
509
540
|
max_memory_bytes = self.max_memory_mb * 1024 * 1024
|
|
510
|
-
|
|
541
|
+
|
|
511
542
|
# Check if we're under memory pressure
|
|
512
543
|
memory_usage_ratio = current_memory_mb / self.max_memory_mb
|
|
513
544
|
if memory_usage_ratio > self.memory_pressure_threshold:
|
|
@@ -516,61 +547,63 @@ class SharedPromptCache(BaseService):
|
|
|
516
547
|
while self._metrics.size_bytes > target_memory_bytes:
|
|
517
548
|
if not self._evict_lru_entry():
|
|
518
549
|
break
|
|
519
|
-
self.logger.warning(
|
|
520
|
-
|
|
521
|
-
|
|
550
|
+
self.logger.warning(
|
|
551
|
+
f"Memory pressure detected ({memory_usage_ratio:.1%}), "
|
|
552
|
+
f"aggressively cleaned cache to {self._get_memory_usage_mb():.1f} MB"
|
|
553
|
+
)
|
|
554
|
+
|
|
522
555
|
# Check memory limit
|
|
523
556
|
while (self._metrics.size_bytes + new_entry_size) > max_memory_bytes:
|
|
524
557
|
if not self._evict_lru_entry():
|
|
525
558
|
break
|
|
526
|
-
|
|
559
|
+
|
|
527
560
|
# Check size limit
|
|
528
561
|
while len(self._cache) >= self.max_size:
|
|
529
562
|
if not self._evict_lru_entry():
|
|
530
563
|
break
|
|
531
|
-
|
|
564
|
+
|
|
532
565
|
def _evict_lru_entry(self) -> bool:
|
|
533
566
|
"""Evict least recently used entry."""
|
|
534
567
|
if not self._cache:
|
|
535
568
|
return False
|
|
536
|
-
|
|
569
|
+
|
|
537
570
|
# Get LRU entry (first in OrderedDict)
|
|
538
571
|
key, entry = next(iter(self._cache.items()))
|
|
539
572
|
self._remove_entry(key, entry)
|
|
540
|
-
|
|
573
|
+
|
|
541
574
|
with self._metrics_lock:
|
|
542
575
|
self._metrics.evictions += 1
|
|
543
|
-
|
|
576
|
+
|
|
544
577
|
self.logger.debug(f"Evicted LRU entry '{key}' (age: {entry.age_seconds:.1f}s)")
|
|
545
578
|
return True
|
|
546
|
-
|
|
579
|
+
|
|
547
580
|
def _remove_entry(self, key: str, entry: CacheEntry) -> None:
|
|
548
581
|
"""Remove entry from cache and update metrics."""
|
|
549
582
|
self._cache.pop(key, None)
|
|
550
583
|
with self._metrics_lock:
|
|
551
584
|
self._metrics.size_bytes -= entry.size_bytes
|
|
552
585
|
self._metrics.entry_count = len(self._cache)
|
|
553
|
-
|
|
586
|
+
|
|
554
587
|
def _calculate_size(self, value: Any) -> int:
|
|
555
588
|
"""Calculate approximate size of value in bytes."""
|
|
556
589
|
try:
|
|
557
590
|
# Use JSON serialization as approximation
|
|
558
|
-
return len(json.dumps(value, default=str).encode(
|
|
591
|
+
return len(json.dumps(value, default=str).encode("utf-8"))
|
|
559
592
|
except Exception:
|
|
560
593
|
# Fallback to string representation
|
|
561
|
-
return len(str(value).encode(
|
|
562
|
-
|
|
594
|
+
return len(str(value).encode("utf-8"))
|
|
595
|
+
|
|
563
596
|
def _get_memory_usage_mb(self) -> float:
|
|
564
597
|
"""Get current memory usage in MB."""
|
|
565
598
|
return self._metrics.size_bytes / (1024 * 1024)
|
|
566
|
-
|
|
599
|
+
|
|
567
600
|
async def handle_memory_pressure(self, severity: str = "warning") -> Dict[str, Any]:
|
|
568
601
|
"""
|
|
569
602
|
Handle memory pressure by aggressively cleaning cache.
|
|
570
|
-
|
|
603
|
+
|
|
571
604
|
Args:
|
|
572
605
|
severity: "warning" or "critical" level of memory pressure
|
|
573
|
-
|
|
606
|
+
|
|
574
607
|
Returns:
|
|
575
608
|
Dict with cleanup statistics
|
|
576
609
|
"""
|
|
@@ -578,9 +611,9 @@ class SharedPromptCache(BaseService):
|
|
|
578
611
|
"entries_before": len(self._cache),
|
|
579
612
|
"memory_before_mb": self._get_memory_usage_mb(),
|
|
580
613
|
"entries_removed": 0,
|
|
581
|
-
"memory_freed_mb": 0
|
|
614
|
+
"memory_freed_mb": 0,
|
|
582
615
|
}
|
|
583
|
-
|
|
616
|
+
|
|
584
617
|
with self._cache_lock:
|
|
585
618
|
if severity == "critical":
|
|
586
619
|
# Critical: Clear 75% of cache
|
|
@@ -588,21 +621,21 @@ class SharedPromptCache(BaseService):
|
|
|
588
621
|
else:
|
|
589
622
|
# Warning: Clear 50% of cache
|
|
590
623
|
target_entries = int(len(self._cache) * 0.5)
|
|
591
|
-
|
|
624
|
+
|
|
592
625
|
# Remove oldest entries first
|
|
593
626
|
while len(self._cache) > target_entries:
|
|
594
627
|
if not self._evict_lru_entry():
|
|
595
628
|
break
|
|
596
629
|
stats["entries_removed"] += 1
|
|
597
|
-
|
|
630
|
+
|
|
598
631
|
# Force cleanup of expired entries
|
|
599
632
|
expired_count = 0
|
|
600
633
|
keys_to_remove = []
|
|
601
|
-
|
|
634
|
+
|
|
602
635
|
for key, entry in self._cache.items():
|
|
603
636
|
if entry.is_expired:
|
|
604
637
|
keys_to_remove.append(key)
|
|
605
|
-
|
|
638
|
+
|
|
606
639
|
for key in keys_to_remove:
|
|
607
640
|
entry = self._cache.pop(key)
|
|
608
641
|
with self._metrics_lock:
|
|
@@ -610,24 +643,26 @@ class SharedPromptCache(BaseService):
|
|
|
610
643
|
self._metrics.expired_removals += 1
|
|
611
644
|
expired_count += 1
|
|
612
645
|
stats["entries_removed"] += 1
|
|
613
|
-
|
|
646
|
+
|
|
614
647
|
if expired_count > 0:
|
|
615
648
|
with self._metrics_lock:
|
|
616
649
|
self._metrics.entry_count = len(self._cache)
|
|
617
|
-
|
|
650
|
+
|
|
618
651
|
stats["entries_after"] = len(self._cache)
|
|
619
652
|
stats["memory_after_mb"] = self._get_memory_usage_mb()
|
|
620
653
|
stats["memory_freed_mb"] = stats["memory_before_mb"] - stats["memory_after_mb"]
|
|
621
|
-
|
|
622
|
-
self.logger.info(
|
|
623
|
-
|
|
624
|
-
|
|
654
|
+
|
|
655
|
+
self.logger.info(
|
|
656
|
+
f"Memory pressure ({severity}): Removed {stats['entries_removed']} entries, "
|
|
657
|
+
f"freed {stats['memory_freed_mb']:.2f} MB"
|
|
658
|
+
)
|
|
659
|
+
|
|
625
660
|
return stats
|
|
626
|
-
|
|
661
|
+
|
|
627
662
|
def _trigger_invalidation_callbacks(self, pattern: str) -> None:
|
|
628
663
|
"""Trigger invalidation callbacks for pattern."""
|
|
629
664
|
import fnmatch
|
|
630
|
-
|
|
665
|
+
|
|
631
666
|
for callback_pattern, callbacks in self._invalidation_callbacks.items():
|
|
632
667
|
if fnmatch.fnmatch(pattern, callback_pattern):
|
|
633
668
|
for callback in callbacks:
|
|
@@ -635,43 +670,45 @@ class SharedPromptCache(BaseService):
|
|
|
635
670
|
callback(pattern)
|
|
636
671
|
except Exception as e:
|
|
637
672
|
self.logger.error(f"Invalidation callback failed: {e}")
|
|
638
|
-
|
|
673
|
+
|
|
639
674
|
async def _cleanup_expired_entries(self) -> None:
|
|
640
675
|
"""Background task to clean up expired entries."""
|
|
641
676
|
while not self._stop_event.is_set():
|
|
642
677
|
try:
|
|
643
678
|
expired_count = 0
|
|
644
|
-
|
|
679
|
+
|
|
645
680
|
with self._cache_lock:
|
|
646
681
|
keys_to_remove = []
|
|
647
|
-
|
|
682
|
+
|
|
648
683
|
for key, entry in self._cache.items():
|
|
649
684
|
if entry.is_expired:
|
|
650
685
|
keys_to_remove.append(key)
|
|
651
|
-
|
|
686
|
+
|
|
652
687
|
for key in keys_to_remove:
|
|
653
688
|
entry = self._cache.pop(key)
|
|
654
689
|
with self._metrics_lock:
|
|
655
690
|
self._metrics.size_bytes -= entry.size_bytes
|
|
656
691
|
self._metrics.expired_removals += 1
|
|
657
692
|
expired_count += 1
|
|
658
|
-
|
|
693
|
+
|
|
659
694
|
if expired_count > 0:
|
|
660
695
|
with self._metrics_lock:
|
|
661
696
|
self._metrics.entry_count = len(self._cache)
|
|
662
|
-
|
|
697
|
+
|
|
663
698
|
if expired_count > 0:
|
|
664
|
-
self.logger.debug(
|
|
665
|
-
|
|
699
|
+
self.logger.debug(
|
|
700
|
+
f"Cleaned up {expired_count} expired cache entries"
|
|
701
|
+
)
|
|
702
|
+
|
|
666
703
|
# Wait for next cleanup interval
|
|
667
704
|
await asyncio.sleep(self.cleanup_interval)
|
|
668
|
-
|
|
705
|
+
|
|
669
706
|
except asyncio.CancelledError:
|
|
670
707
|
break
|
|
671
708
|
except Exception as e:
|
|
672
709
|
self.logger.error(f"Cache cleanup task error: {e}")
|
|
673
710
|
await asyncio.sleep(self.cleanup_interval)
|
|
674
|
-
|
|
711
|
+
|
|
675
712
|
async def _collect_custom_metrics(self) -> None:
|
|
676
713
|
"""Collect custom metrics for the service."""
|
|
677
714
|
try:
|
|
@@ -682,58 +719,60 @@ class SharedPromptCache(BaseService):
|
|
|
682
719
|
cache_misses=metrics["misses"],
|
|
683
720
|
cache_hit_rate=metrics["hit_rate"],
|
|
684
721
|
cache_size_mb=metrics["size_mb"],
|
|
685
|
-
cache_entries=metrics["entry_count"]
|
|
722
|
+
cache_entries=metrics["entry_count"],
|
|
686
723
|
)
|
|
687
724
|
except Exception as e:
|
|
688
725
|
self.logger.warning(f"Failed to collect cache metrics: {e}")
|
|
689
726
|
|
|
690
727
|
|
|
691
728
|
# Decorator for caching function results
|
|
692
|
-
def cache_result(
|
|
693
|
-
|
|
729
|
+
def cache_result(
|
|
730
|
+
key_pattern: str, ttl: Optional[float] = None, namespace: Optional[str] = None
|
|
731
|
+
):
|
|
694
732
|
"""
|
|
695
733
|
Decorator to cache function results in SharedPromptCache.
|
|
696
|
-
|
|
734
|
+
|
|
697
735
|
Args:
|
|
698
736
|
key_pattern: Pattern for cache key (can use {args} placeholders)
|
|
699
737
|
ttl: Time to live for cached result
|
|
700
738
|
namespace: Optional namespace for cache keys
|
|
701
|
-
|
|
739
|
+
|
|
702
740
|
Example:
|
|
703
741
|
@cache_result("agent_profile:{agent_name}", ttl=300)
|
|
704
742
|
def load_agent_profile(agent_name: str):
|
|
705
743
|
# Load profile logic
|
|
706
744
|
return profile_data
|
|
707
745
|
"""
|
|
746
|
+
|
|
708
747
|
def decorator(func):
|
|
709
748
|
@wraps(func)
|
|
710
749
|
def wrapper(*args, **kwargs):
|
|
711
750
|
# Generate cache key
|
|
712
751
|
import hashlib
|
|
713
|
-
|
|
752
|
+
|
|
714
753
|
# Create key from pattern and args
|
|
715
754
|
cache_key = key_pattern.format(
|
|
716
|
-
**kwargs,
|
|
717
|
-
args_hash=hashlib.md5(str(args).encode()).hexdigest()[:8]
|
|
755
|
+
**kwargs, args_hash=hashlib.md5(str(args).encode()).hexdigest()[:8]
|
|
718
756
|
)
|
|
719
|
-
|
|
757
|
+
|
|
720
758
|
if namespace:
|
|
721
759
|
cache_key = f"{namespace}:{cache_key}"
|
|
722
|
-
|
|
760
|
+
|
|
723
761
|
# Try to get from cache
|
|
724
762
|
cache = SharedPromptCache.get_instance()
|
|
725
763
|
result = cache.get(cache_key)
|
|
726
|
-
|
|
764
|
+
|
|
727
765
|
if result is not None:
|
|
728
766
|
return result
|
|
729
|
-
|
|
767
|
+
|
|
730
768
|
# Call function and cache result
|
|
731
769
|
result = func(*args, **kwargs)
|
|
732
770
|
cache.set(cache_key, result, ttl=ttl)
|
|
733
|
-
|
|
771
|
+
|
|
734
772
|
return result
|
|
735
|
-
|
|
773
|
+
|
|
736
774
|
return wrapper
|
|
775
|
+
|
|
737
776
|
return decorator
|
|
738
777
|
|
|
739
778
|
|
|
@@ -755,65 +794,63 @@ if __name__ == "__main__":
|
|
|
755
794
|
"""Demonstrate SharedPromptCache usage."""
|
|
756
795
|
print("š SharedPromptCache Demo")
|
|
757
796
|
print("=" * 50)
|
|
758
|
-
|
|
797
|
+
|
|
759
798
|
# Get cache instance
|
|
760
|
-
cache = SharedPromptCache.get_instance(
|
|
761
|
-
"max_size": 100,
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
})
|
|
765
|
-
|
|
799
|
+
cache = SharedPromptCache.get_instance(
|
|
800
|
+
{"max_size": 100, "max_memory_mb": 10, "default_ttl": 60}
|
|
801
|
+
)
|
|
802
|
+
|
|
766
803
|
# Start the service
|
|
767
804
|
await cache.start()
|
|
768
|
-
|
|
805
|
+
|
|
769
806
|
try:
|
|
770
807
|
# Test basic operations
|
|
771
808
|
print("\nš Testing basic cache operations...")
|
|
772
|
-
|
|
809
|
+
|
|
773
810
|
# Set some data
|
|
774
811
|
cache.set("test:key1", {"data": "value1", "type": "test"})
|
|
775
812
|
cache.set("test:key2", {"data": "value2", "type": "test"}, ttl=5)
|
|
776
|
-
|
|
813
|
+
|
|
777
814
|
# Get data
|
|
778
815
|
result1 = cache.get("test:key1")
|
|
779
816
|
result2 = cache.get("test:key2")
|
|
780
817
|
print(f"Retrieved: {result1}, {result2}")
|
|
781
|
-
|
|
818
|
+
|
|
782
819
|
# Test metrics
|
|
783
820
|
print("\nš Cache metrics:")
|
|
784
821
|
metrics = cache.get_metrics()
|
|
785
822
|
for key, value in metrics.items():
|
|
786
823
|
print(f" {key}: {value}")
|
|
787
|
-
|
|
824
|
+
|
|
788
825
|
# Test invalidation
|
|
789
826
|
print("\nšļø Testing invalidation...")
|
|
790
827
|
cache.invalidate("test:*")
|
|
791
|
-
|
|
828
|
+
|
|
792
829
|
# Test decorator
|
|
793
830
|
print("\nšÆ Testing cache decorator...")
|
|
794
|
-
|
|
831
|
+
|
|
795
832
|
@cache_result("demo:{name}", ttl=30)
|
|
796
833
|
def get_demo_data(name: str):
|
|
797
834
|
print(f"Computing data for {name}...")
|
|
798
835
|
return {"name": name, "timestamp": time.time()}
|
|
799
|
-
|
|
836
|
+
|
|
800
837
|
# First call (cache miss)
|
|
801
838
|
data1 = get_demo_data("test")
|
|
802
839
|
print(f"First call: {data1}")
|
|
803
|
-
|
|
840
|
+
|
|
804
841
|
# Second call (cache hit)
|
|
805
842
|
data2 = get_demo_data("test")
|
|
806
843
|
print(f"Second call: {data2}")
|
|
807
|
-
|
|
844
|
+
|
|
808
845
|
# Final metrics
|
|
809
846
|
print("\nš Final metrics:")
|
|
810
847
|
final_metrics = cache.get_metrics()
|
|
811
848
|
for key, value in final_metrics.items():
|
|
812
849
|
print(f" {key}: {value}")
|
|
813
|
-
|
|
850
|
+
|
|
814
851
|
finally:
|
|
815
852
|
await cache.stop()
|
|
816
853
|
print("\nā
Demo completed")
|
|
817
|
-
|
|
854
|
+
|
|
818
855
|
# Run demo
|
|
819
|
-
asyncio.run(demo())
|
|
856
|
+
asyncio.run(demo())
|