claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__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/VERSION +1 -1
- claude_mpm/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +1 -1
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +2 -2
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +140 -905
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +330 -86
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +363 -220
- claude_mpm/cli/parser.py +24 -1156
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +124 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- 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 +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/built/dashboard.js +2 -0
- claude_mpm/dashboard/static/built/socket-client.js +2 -0
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +133 -53
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -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 +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -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/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 +159 -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 +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -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/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -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 +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- 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 +4 -3
- 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 +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +233 -199
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +30 -13
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +575 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +166 -64
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +185 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +19 -533
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
- claude_mpm-4.0.4.dist-info/RECORD +417 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- 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 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/top_level.txt +0 -0
    
        claude_mpm/core/config_paths.py
    DELETED
    
    | @@ -1,150 +0,0 @@ | |
| 1 | 
            -
            """
         | 
| 2 | 
            -
            Centralized configuration paths for claude-mpm.
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            This module provides a single source of truth for all configuration-related paths
         | 
| 5 | 
            -
            throughout the codebase. All modules should import and use these constants
         | 
| 6 | 
            -
            instead of hardcoding directory names.
         | 
| 7 | 
            -
            """
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            from enum import Enum
         | 
| 10 | 
            -
            from pathlib import Path
         | 
| 11 | 
            -
            from typing import Optional
         | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
            class ConfigDirName(Enum):
         | 
| 15 | 
            -
                """Enum for configuration directory names to ensure type safety."""
         | 
| 16 | 
            -
                CLAUDE_MPM = ".claude-mpm"
         | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
            # Core configuration directory name - MUST be consistent everywhere
         | 
| 20 | 
            -
            CONFIG_DIR_NAME = ConfigDirName.CLAUDE_MPM.value
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            # Legacy name that should NOT be used (kept for reference during migration)
         | 
| 23 | 
            -
            _LEGACY_CONFIG_DIR_NAME = ".claude-pm"  # DO NOT USE THIS
         | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
            class ConfigPaths:
         | 
| 27 | 
            -
                """Centralized configuration path constants."""
         | 
| 28 | 
            -
                
         | 
| 29 | 
            -
                # Base directory names
         | 
| 30 | 
            -
                CONFIG_DIR = ConfigDirName.CLAUDE_MPM.value
         | 
| 31 | 
            -
                AGENTS_DIR = "agents"
         | 
| 32 | 
            -
                BACKUPS_DIR = "backups"
         | 
| 33 | 
            -
                TRACKING_DIR = "agent_tracking"
         | 
| 34 | 
            -
                MEMORIES_DIR = "memories"
         | 
| 35 | 
            -
                RESPONSES_DIR = "responses"
         | 
| 36 | 
            -
                
         | 
| 37 | 
            -
                # Agent subdirectories
         | 
| 38 | 
            -
                AGENT_USER_AGENTS = "user-agents"
         | 
| 39 | 
            -
                AGENT_USER_DEFINED = "user-defined"
         | 
| 40 | 
            -
                AGENT_SYSTEM = "templates"
         | 
| 41 | 
            -
                
         | 
| 42 | 
            -
                # Configuration files
         | 
| 43 | 
            -
                CONFIG_FILE = "config.json"
         | 
| 44 | 
            -
                CONFIGURATION_YAML = "configuration.yaml"
         | 
| 45 | 
            -
                LIFECYCLE_RECORDS = "lifecycle_records.json"
         | 
| 46 | 
            -
                VERSION_FILE = "VERSION"
         | 
| 47 | 
            -
                INSTRUCTIONS_FILE = "INSTRUCTIONS.md"
         | 
| 48 | 
            -
                
         | 
| 49 | 
            -
                @classmethod
         | 
| 50 | 
            -
                def get_user_config_dir(cls) -> Path:
         | 
| 51 | 
            -
                    """Get the user-level configuration directory."""
         | 
| 52 | 
            -
                    return Path.home() / cls.CONFIG_DIR
         | 
| 53 | 
            -
                
         | 
| 54 | 
            -
                @classmethod
         | 
| 55 | 
            -
                def get_project_config_dir(cls, project_root: Optional[Path] = None) -> Path:
         | 
| 56 | 
            -
                    """Get the project-level configuration directory."""
         | 
| 57 | 
            -
                    root = project_root or Path.cwd()
         | 
| 58 | 
            -
                    return root / cls.CONFIG_DIR
         | 
| 59 | 
            -
                
         | 
| 60 | 
            -
                @classmethod
         | 
| 61 | 
            -
                def get_framework_config_dir(cls, framework_root: Path) -> Path:
         | 
| 62 | 
            -
                    """Get the framework-level configuration directory."""
         | 
| 63 | 
            -
                    return framework_root / cls.CONFIG_DIR
         | 
| 64 | 
            -
                
         | 
| 65 | 
            -
                @classmethod
         | 
| 66 | 
            -
                def get_user_agents_dir(cls) -> Path:
         | 
| 67 | 
            -
                    """Get the user-level agents directory."""
         | 
| 68 | 
            -
                    return cls.get_user_config_dir() / cls.AGENTS_DIR
         | 
| 69 | 
            -
                
         | 
| 70 | 
            -
                @classmethod
         | 
| 71 | 
            -
                def get_project_agents_dir(cls, project_root: Optional[Path] = None) -> Path:
         | 
| 72 | 
            -
                    """Get the project-level agents directory."""
         | 
| 73 | 
            -
                    return cls.get_project_config_dir(project_root) / cls.AGENTS_DIR
         | 
| 74 | 
            -
                
         | 
| 75 | 
            -
                @classmethod
         | 
| 76 | 
            -
                def get_tracking_dir(cls) -> Path:
         | 
| 77 | 
            -
                    """Get the agent tracking directory."""
         | 
| 78 | 
            -
                    return cls.get_user_config_dir() / cls.TRACKING_DIR
         | 
| 79 | 
            -
                
         | 
| 80 | 
            -
                @classmethod
         | 
| 81 | 
            -
                def get_backups_dir(cls, base_dir: Optional[Path] = None) -> Path:
         | 
| 82 | 
            -
                    """Get the backups directory."""
         | 
| 83 | 
            -
                    if base_dir:
         | 
| 84 | 
            -
                        return base_dir / cls.CONFIG_DIR / cls.BACKUPS_DIR
         | 
| 85 | 
            -
                    return cls.get_user_config_dir() / cls.BACKUPS_DIR
         | 
| 86 | 
            -
                
         | 
| 87 | 
            -
                @classmethod
         | 
| 88 | 
            -
                def get_memories_dir(cls, base_dir: Optional[Path] = None) -> Path:
         | 
| 89 | 
            -
                    """Get the memories directory."""
         | 
| 90 | 
            -
                    if base_dir:
         | 
| 91 | 
            -
                        return base_dir / cls.CONFIG_DIR / cls.MEMORIES_DIR
         | 
| 92 | 
            -
                    return cls.get_project_config_dir() / cls.MEMORIES_DIR
         | 
| 93 | 
            -
                
         | 
| 94 | 
            -
                @classmethod
         | 
| 95 | 
            -
                def get_responses_dir(cls, base_dir: Optional[Path] = None) -> Path:
         | 
| 96 | 
            -
                    """Get the responses directory."""
         | 
| 97 | 
            -
                    if base_dir:
         | 
| 98 | 
            -
                        return base_dir / cls.CONFIG_DIR / cls.RESPONSES_DIR
         | 
| 99 | 
            -
                    return cls.get_project_config_dir() / cls.RESPONSES_DIR
         | 
| 100 | 
            -
                
         | 
| 101 | 
            -
                @classmethod
         | 
| 102 | 
            -
                def find_config_dir(cls, start_path: Optional[Path] = None) -> Optional[Path]:
         | 
| 103 | 
            -
                    """
         | 
| 104 | 
            -
                    Find the nearest configuration directory by walking up the directory tree.
         | 
| 105 | 
            -
                    
         | 
| 106 | 
            -
                    Args:
         | 
| 107 | 
            -
                        start_path: Starting directory (defaults to current working directory)
         | 
| 108 | 
            -
                        
         | 
| 109 | 
            -
                    Returns:
         | 
| 110 | 
            -
                        Path to the configuration directory if found, None otherwise
         | 
| 111 | 
            -
                    """
         | 
| 112 | 
            -
                    current = start_path or Path.cwd()
         | 
| 113 | 
            -
                    
         | 
| 114 | 
            -
                    # Check current directory and parents
         | 
| 115 | 
            -
                    for path in [current] + list(current.parents):
         | 
| 116 | 
            -
                        config_dir = path / cls.CONFIG_DIR
         | 
| 117 | 
            -
                        if config_dir.exists():
         | 
| 118 | 
            -
                            return config_dir
         | 
| 119 | 
            -
                    
         | 
| 120 | 
            -
                    return None
         | 
| 121 | 
            -
                
         | 
| 122 | 
            -
                @classmethod
         | 
| 123 | 
            -
                def validate_not_legacy(cls, path: Path) -> bool:
         | 
| 124 | 
            -
                    """
         | 
| 125 | 
            -
                    Check if a path contains the legacy configuration directory name.
         | 
| 126 | 
            -
                    
         | 
| 127 | 
            -
                    Args:
         | 
| 128 | 
            -
                        path: Path to check
         | 
| 129 | 
            -
                        
         | 
| 130 | 
            -
                    Returns:
         | 
| 131 | 
            -
                        True if path is valid (not legacy), False if it contains legacy name
         | 
| 132 | 
            -
                    """
         | 
| 133 | 
            -
                    path_str = str(path)
         | 
| 134 | 
            -
                    return _LEGACY_CONFIG_DIR_NAME not in path_str
         | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            -
            # Export commonly used paths as module-level constants for convenience
         | 
| 138 | 
            -
            USER_CONFIG_DIR = ConfigPaths.get_user_config_dir()
         | 
| 139 | 
            -
            USER_AGENTS_DIR = ConfigPaths.get_user_agents_dir()
         | 
| 140 | 
            -
            USER_TRACKING_DIR = ConfigPaths.get_tracking_dir()
         | 
| 141 | 
            -
             | 
| 142 | 
            -
            # Export all public symbols
         | 
| 143 | 
            -
            __all__ = [
         | 
| 144 | 
            -
                "ConfigDirName",
         | 
| 145 | 
            -
                "ConfigPaths",
         | 
| 146 | 
            -
                "CONFIG_DIR_NAME",
         | 
| 147 | 
            -
                "USER_CONFIG_DIR",
         | 
| 148 | 
            -
                "USER_AGENTS_DIR",
         | 
| 149 | 
            -
                "USER_TRACKING_DIR",
         | 
| 150 | 
            -
            ]
         | 
| @@ -1,353 +0,0 @@ | |
| 1 | 
            -
            """Memory-aware Claude runner with automatic restart capabilities.
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            This runner extends ClaudeRunner to add memory monitoring and automatic
         | 
| 4 | 
            -
            restart capabilities when memory thresholds are exceeded.
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            Design Principles:
         | 
| 7 | 
            -
            - Seamless integration with existing ClaudeRunner
         | 
| 8 | 
            -
            - State preservation across restarts
         | 
| 9 | 
            -
            - Configurable memory thresholds and policies
         | 
| 10 | 
            -
            - Minimal overhead when monitoring is disabled
         | 
| 11 | 
            -
            """
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            import asyncio
         | 
| 14 | 
            -
            import json
         | 
| 15 | 
            -
            import os
         | 
| 16 | 
            -
            import sys
         | 
| 17 | 
            -
            import time
         | 
| 18 | 
            -
            from pathlib import Path
         | 
| 19 | 
            -
            from typing import Optional, Dict, Any, List
         | 
| 20 | 
            -
            from datetime import datetime
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            from claude_mpm.core.claude_runner import ClaudeRunner
         | 
| 23 | 
            -
            from claude_mpm.core.logging_config import get_logger
         | 
| 24 | 
            -
            from claude_mpm.services.infrastructure.memory_guardian import MemoryGuardian
         | 
| 25 | 
            -
            from claude_mpm.services.infrastructure.state_manager import StateManager
         | 
| 26 | 
            -
            from claude_mpm.config.memory_guardian_config import (
         | 
| 27 | 
            -
                MemoryGuardianConfig,
         | 
| 28 | 
            -
                MemoryThresholds,
         | 
| 29 | 
            -
                RestartPolicy,
         | 
| 30 | 
            -
                MonitoringConfig,
         | 
| 31 | 
            -
                get_default_config
         | 
| 32 | 
            -
            )
         | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
            class MemoryAwareClaudeRunner(ClaudeRunner):
         | 
| 36 | 
            -
                """Claude runner with memory monitoring and automatic restart capabilities.
         | 
| 37 | 
            -
                
         | 
| 38 | 
            -
                This class extends ClaudeRunner to add memory monitoring through the
         | 
| 39 | 
            -
                MemoryGuardian service. When memory thresholds are exceeded, it can
         | 
| 40 | 
            -
                automatically restart Claude Code while preserving conversation state.
         | 
| 41 | 
            -
                
         | 
| 42 | 
            -
                WHY: Large conversation histories in .claude.json can consume 2GB+ of memory,
         | 
| 43 | 
            -
                causing system instability. This runner monitors memory usage and performs
         | 
| 44 | 
            -
                controlled restarts with state preservation.
         | 
| 45 | 
            -
                
         | 
| 46 | 
            -
                DESIGN DECISION: We extend ClaudeRunner rather than wrap it to maintain
         | 
| 47 | 
            -
                full compatibility with existing code while adding new capabilities.
         | 
| 48 | 
            -
                """
         | 
| 49 | 
            -
                
         | 
| 50 | 
            -
                def __init__(
         | 
| 51 | 
            -
                    self,
         | 
| 52 | 
            -
                    enable_tickets: bool = True,
         | 
| 53 | 
            -
                    log_level: str = "OFF",
         | 
| 54 | 
            -
                    claude_args: Optional[list] = None,
         | 
| 55 | 
            -
                    launch_method: str = "subprocess",  # Default to subprocess for monitoring
         | 
| 56 | 
            -
                    enable_websocket: bool = False,
         | 
| 57 | 
            -
                    websocket_port: int = 8765,
         | 
| 58 | 
            -
                    memory_config: Optional[MemoryGuardianConfig] = None,
         | 
| 59 | 
            -
                    enable_monitoring: bool = True,
         | 
| 60 | 
            -
                    state_dir: Optional[Path] = None
         | 
| 61 | 
            -
                ):
         | 
| 62 | 
            -
                    """Initialize memory-aware Claude runner.
         | 
| 63 | 
            -
                    
         | 
| 64 | 
            -
                    Args:
         | 
| 65 | 
            -
                        enable_tickets: Enable ticket extraction
         | 
| 66 | 
            -
                        log_level: Logging level
         | 
| 67 | 
            -
                        claude_args: Additional arguments for Claude
         | 
| 68 | 
            -
                        launch_method: Launch method (subprocess required for monitoring)
         | 
| 69 | 
            -
                        enable_websocket: Enable WebSocket server
         | 
| 70 | 
            -
                        websocket_port: WebSocket server port
         | 
| 71 | 
            -
                        memory_config: Memory guardian configuration
         | 
| 72 | 
            -
                        enable_monitoring: Enable memory monitoring
         | 
| 73 | 
            -
                        state_dir: Directory for state preservation
         | 
| 74 | 
            -
                    """
         | 
| 75 | 
            -
                    # Force subprocess mode if monitoring is enabled
         | 
| 76 | 
            -
                    if enable_monitoring and launch_method == "exec":
         | 
| 77 | 
            -
                        launch_method = "subprocess"
         | 
| 78 | 
            -
                        get_logger(__name__).info(
         | 
| 79 | 
            -
                            "Switching to subprocess launch method for memory monitoring"
         | 
| 80 | 
            -
                        )
         | 
| 81 | 
            -
                    
         | 
| 82 | 
            -
                    # Initialize parent
         | 
| 83 | 
            -
                    super().__init__(
         | 
| 84 | 
            -
                        enable_tickets=enable_tickets,
         | 
| 85 | 
            -
                        log_level=log_level,
         | 
| 86 | 
            -
                        claude_args=claude_args,
         | 
| 87 | 
            -
                        launch_method=launch_method,
         | 
| 88 | 
            -
                        enable_websocket=enable_websocket,
         | 
| 89 | 
            -
                        websocket_port=websocket_port
         | 
| 90 | 
            -
                    )
         | 
| 91 | 
            -
                    
         | 
| 92 | 
            -
                    # Memory monitoring configuration
         | 
| 93 | 
            -
                    self.enable_monitoring = enable_monitoring
         | 
| 94 | 
            -
                    self.memory_config = memory_config or get_default_config()
         | 
| 95 | 
            -
                    self.memory_config.enabled = enable_monitoring
         | 
| 96 | 
            -
                    
         | 
| 97 | 
            -
                    # State management
         | 
| 98 | 
            -
                    self.state_dir = state_dir or Path.home() / ".claude-mpm" / "state"
         | 
| 99 | 
            -
                    self.state_manager: Optional[StateManager] = None
         | 
| 100 | 
            -
                    self.memory_guardian: Optional[MemoryGuardian] = None
         | 
| 101 | 
            -
                    
         | 
| 102 | 
            -
                    # Monitoring state
         | 
| 103 | 
            -
                    self.monitoring_task: Optional[asyncio.Task] = None
         | 
| 104 | 
            -
                    self.restart_count = 0
         | 
| 105 | 
            -
                    self.max_restarts = 3  # Default max restarts
         | 
| 106 | 
            -
                    
         | 
| 107 | 
            -
                    self.logger.info(f"Memory-aware runner initialized with monitoring: {enable_monitoring}")
         | 
| 108 | 
            -
                
         | 
| 109 | 
            -
                def run_interactive_with_monitoring(
         | 
| 110 | 
            -
                    self,
         | 
| 111 | 
            -
                    initial_context: Optional[str] = None,
         | 
| 112 | 
            -
                    memory_threshold: Optional[float] = None,
         | 
| 113 | 
            -
                    check_interval: Optional[int] = None,
         | 
| 114 | 
            -
                    max_restarts: Optional[int] = None,
         | 
| 115 | 
            -
                    enable_state_preservation: bool = True
         | 
| 116 | 
            -
                ):
         | 
| 117 | 
            -
                    """Run Claude in interactive mode with memory monitoring.
         | 
| 118 | 
            -
                    
         | 
| 119 | 
            -
                    This method wraps the standard interactive session with memory monitoring
         | 
| 120 | 
            -
                    and automatic restart capabilities.
         | 
| 121 | 
            -
                    
         | 
| 122 | 
            -
                    Args:
         | 
| 123 | 
            -
                        initial_context: Optional initial context
         | 
| 124 | 
            -
                        memory_threshold: Override memory threshold in MB
         | 
| 125 | 
            -
                        check_interval: Override check interval in seconds
         | 
| 126 | 
            -
                        max_restarts: Maximum number of automatic restarts
         | 
| 127 | 
            -
                        enable_state_preservation: Enable state preservation across restarts
         | 
| 128 | 
            -
                    """
         | 
| 129 | 
            -
                    if not self.enable_monitoring:
         | 
| 130 | 
            -
                        # Fall back to standard interactive mode
         | 
| 131 | 
            -
                        self.logger.info("Memory monitoring disabled, using standard interactive mode")
         | 
| 132 | 
            -
                        return self.run_interactive(initial_context)
         | 
| 133 | 
            -
                    
         | 
| 134 | 
            -
                    # Update configuration with overrides
         | 
| 135 | 
            -
                    if memory_threshold:
         | 
| 136 | 
            -
                        self.memory_config.thresholds.critical = memory_threshold
         | 
| 137 | 
            -
                        self.memory_config.thresholds.emergency = memory_threshold * 1.2
         | 
| 138 | 
            -
                    
         | 
| 139 | 
            -
                    if check_interval:
         | 
| 140 | 
            -
                        self.memory_config.monitoring.normal_interval = check_interval
         | 
| 141 | 
            -
                    
         | 
| 142 | 
            -
                    if max_restarts is not None:
         | 
| 143 | 
            -
                        self.max_restarts = max_restarts
         | 
| 144 | 
            -
                        self.memory_config.restart_policy.max_attempts = max_restarts
         | 
| 145 | 
            -
                    
         | 
| 146 | 
            -
                    # Run async monitoring loop
         | 
| 147 | 
            -
                    try:
         | 
| 148 | 
            -
                        asyncio.run(self._run_with_monitoring_async(
         | 
| 149 | 
            -
                            initial_context,
         | 
| 150 | 
            -
                            enable_state_preservation
         | 
| 151 | 
            -
                        ))
         | 
| 152 | 
            -
                    except KeyboardInterrupt:
         | 
| 153 | 
            -
                        self.logger.info("Interactive session interrupted by user")
         | 
| 154 | 
            -
                    except Exception as e:
         | 
| 155 | 
            -
                        self.logger.error(f"Error in monitored session: {e}")
         | 
| 156 | 
            -
                        raise
         | 
| 157 | 
            -
                
         | 
| 158 | 
            -
                async def _run_with_monitoring_async(
         | 
| 159 | 
            -
                    self,
         | 
| 160 | 
            -
                    initial_context: Optional[str],
         | 
| 161 | 
            -
                    enable_state_preservation: bool
         | 
| 162 | 
            -
                ):
         | 
| 163 | 
            -
                    """Async implementation of monitored interactive session.
         | 
| 164 | 
            -
                    
         | 
| 165 | 
            -
                    This method sets up the memory monitoring infrastructure and manages
         | 
| 166 | 
            -
                    the Claude subprocess lifecycle with automatic restarts.
         | 
| 167 | 
            -
                    """
         | 
| 168 | 
            -
                    try:
         | 
| 169 | 
            -
                        # Initialize services
         | 
| 170 | 
            -
                        await self._initialize_monitoring_services(enable_state_preservation)
         | 
| 171 | 
            -
                        
         | 
| 172 | 
            -
                        # Display monitoring information
         | 
| 173 | 
            -
                        self._display_monitoring_info()
         | 
| 174 | 
            -
                        
         | 
| 175 | 
            -
                        # Start monitoring loop
         | 
| 176 | 
            -
                        while self.restart_count <= self.max_restarts:
         | 
| 177 | 
            -
                            try:
         | 
| 178 | 
            -
                                # Run Claude subprocess
         | 
| 179 | 
            -
                                await self._run_monitored_subprocess(initial_context)
         | 
| 180 | 
            -
                                
         | 
| 181 | 
            -
                                # If we exit normally, break the loop
         | 
| 182 | 
            -
                                break
         | 
| 183 | 
            -
                                
         | 
| 184 | 
            -
                            except MemoryThresholdExceeded as e:
         | 
| 185 | 
            -
                                self.logger.warning(f"Memory threshold exceeded: {e}")
         | 
| 186 | 
            -
                                
         | 
| 187 | 
            -
                                if self.restart_count >= self.max_restarts:
         | 
| 188 | 
            -
                                    self.logger.error("Maximum restart attempts reached")
         | 
| 189 | 
            -
                                    break
         | 
| 190 | 
            -
                                
         | 
| 191 | 
            -
                                # Perform controlled restart
         | 
| 192 | 
            -
                                await self._perform_controlled_restart()
         | 
| 193 | 
            -
                                self.restart_count += 1
         | 
| 194 | 
            -
                                
         | 
| 195 | 
            -
                                # Clear initial context after first run
         | 
| 196 | 
            -
                                initial_context = None
         | 
| 197 | 
            -
                                
         | 
| 198 | 
            -
                            except Exception as e:
         | 
| 199 | 
            -
                                self.logger.error(f"Unexpected error in monitored session: {e}")
         | 
| 200 | 
            -
                                break
         | 
| 201 | 
            -
                        
         | 
| 202 | 
            -
                    finally:
         | 
| 203 | 
            -
                        # Cleanup
         | 
| 204 | 
            -
                        await self._cleanup_monitoring_services()
         | 
| 205 | 
            -
                
         | 
| 206 | 
            -
                async def _initialize_monitoring_services(self, enable_state_preservation: bool):
         | 
| 207 | 
            -
                    """Initialize memory guardian and state manager services."""
         | 
| 208 | 
            -
                    self.logger.info("Initializing monitoring services")
         | 
| 209 | 
            -
                    
         | 
| 210 | 
            -
                    # Initialize state manager if enabled
         | 
| 211 | 
            -
                    if enable_state_preservation:
         | 
| 212 | 
            -
                        self.state_manager = StateManager(self.state_dir)
         | 
| 213 | 
            -
                        await self.state_manager.initialize()
         | 
| 214 | 
            -
                        self.logger.info("State preservation enabled")
         | 
| 215 | 
            -
                    
         | 
| 216 | 
            -
                    # Initialize memory guardian
         | 
| 217 | 
            -
                    self.memory_guardian = MemoryGuardian(self.memory_config)
         | 
| 218 | 
            -
                    if self.state_manager:
         | 
| 219 | 
            -
                        self.memory_guardian.set_state_manager(self.state_manager)
         | 
| 220 | 
            -
                    await self.memory_guardian.initialize()
         | 
| 221 | 
            -
                    
         | 
| 222 | 
            -
                    self.logger.info("Monitoring services initialized")
         | 
| 223 | 
            -
                
         | 
| 224 | 
            -
                async def _cleanup_monitoring_services(self):
         | 
| 225 | 
            -
                    """Cleanup monitoring services."""
         | 
| 226 | 
            -
                    self.logger.info("Cleaning up monitoring services")
         | 
| 227 | 
            -
                    
         | 
| 228 | 
            -
                    if self.memory_guardian:
         | 
| 229 | 
            -
                        await self.memory_guardian.shutdown()
         | 
| 230 | 
            -
                    
         | 
| 231 | 
            -
                    if self.state_manager:
         | 
| 232 | 
            -
                        await self.state_manager.shutdown()
         | 
| 233 | 
            -
                
         | 
| 234 | 
            -
                async def _run_monitored_subprocess(self, initial_context: Optional[str]):
         | 
| 235 | 
            -
                    """Run Claude subprocess with memory monitoring.
         | 
| 236 | 
            -
                    
         | 
| 237 | 
            -
                    This method launches Claude as a subprocess and monitors its memory usage,
         | 
| 238 | 
            -
                    triggering restarts when thresholds are exceeded.
         | 
| 239 | 
            -
                    """
         | 
| 240 | 
            -
                    # Set up the process command
         | 
| 241 | 
            -
                    cmd = self._build_claude_command(initial_context)
         | 
| 242 | 
            -
                    
         | 
| 243 | 
            -
                    # Configure memory guardian with our command
         | 
| 244 | 
            -
                    self.memory_config.process_command = cmd
         | 
| 245 | 
            -
                    self.memory_config.working_directory = os.getcwd()
         | 
| 246 | 
            -
                    
         | 
| 247 | 
            -
                    # Start the process through memory guardian
         | 
| 248 | 
            -
                    success = await self.memory_guardian.start_process()
         | 
| 249 | 
            -
                    if not success:
         | 
| 250 | 
            -
                        raise RuntimeError("Failed to start Claude process")
         | 
| 251 | 
            -
                    
         | 
| 252 | 
            -
                    # Start memory monitoring
         | 
| 253 | 
            -
                    self.memory_guardian.start_monitoring()
         | 
| 254 | 
            -
                    
         | 
| 255 | 
            -
                    # Wait for process to complete or be restarted
         | 
| 256 | 
            -
                    while self.memory_guardian.process_state.value == "running":
         | 
| 257 | 
            -
                        await asyncio.sleep(1)
         | 
| 258 | 
            -
                        
         | 
| 259 | 
            -
                        # Check for memory threshold exceeded
         | 
| 260 | 
            -
                        if self.memory_guardian.memory_state.value in ["critical", "emergency"]:
         | 
| 261 | 
            -
                            raise MemoryThresholdExceeded(
         | 
| 262 | 
            -
                                f"Memory state: {self.memory_guardian.memory_state.value}, "
         | 
| 263 | 
            -
                                f"Current: {self.memory_guardian.memory_stats.current_mb:.2f}MB"
         | 
| 264 | 
            -
                            )
         | 
| 265 | 
            -
                
         | 
| 266 | 
            -
                async def _perform_controlled_restart(self):
         | 
| 267 | 
            -
                    """Perform a controlled restart with state preservation."""
         | 
| 268 | 
            -
                    self.logger.info(f"Performing controlled restart (attempt {self.restart_count + 1}/{self.max_restarts})")
         | 
| 269 | 
            -
                    
         | 
| 270 | 
            -
                    # Capture state before restart
         | 
| 271 | 
            -
                    if self.state_manager:
         | 
| 272 | 
            -
                        state = await self.state_manager.capture_state(
         | 
| 273 | 
            -
                            restart_reason=f"Memory threshold exceeded (restart {self.restart_count + 1})"
         | 
| 274 | 
            -
                        )
         | 
| 275 | 
            -
                        if state:
         | 
| 276 | 
            -
                            await self.state_manager.persist_state(state)
         | 
| 277 | 
            -
                            self.logger.info("State captured and persisted")
         | 
| 278 | 
            -
                    
         | 
| 279 | 
            -
                    # Restart through memory guardian
         | 
| 280 | 
            -
                    success = await self.memory_guardian.restart_process(
         | 
| 281 | 
            -
                        reason=f"Memory threshold exceeded (automatic restart {self.restart_count + 1})"
         | 
| 282 | 
            -
                    )
         | 
| 283 | 
            -
                    
         | 
| 284 | 
            -
                    if not success:
         | 
| 285 | 
            -
                        raise RuntimeError("Failed to restart Claude process")
         | 
| 286 | 
            -
                    
         | 
| 287 | 
            -
                    # Restore state after restart
         | 
| 288 | 
            -
                    if self.state_manager:
         | 
| 289 | 
            -
                        restored = await self.state_manager.restore_state()
         | 
| 290 | 
            -
                        if restored:
         | 
| 291 | 
            -
                            self.logger.info("State restored successfully")
         | 
| 292 | 
            -
                
         | 
| 293 | 
            -
                def _build_claude_command(self, initial_context: Optional[str]) -> List[str]:
         | 
| 294 | 
            -
                    """Build the Claude command line.
         | 
| 295 | 
            -
                    
         | 
| 296 | 
            -
                    Returns:
         | 
| 297 | 
            -
                        List of command arguments
         | 
| 298 | 
            -
                    """
         | 
| 299 | 
            -
                    # Find Claude CLI executable
         | 
| 300 | 
            -
                    claude_cli = "claude"  # Assume it's in PATH
         | 
| 301 | 
            -
                    
         | 
| 302 | 
            -
                    # Build command
         | 
| 303 | 
            -
                    cmd = [claude_cli]
         | 
| 304 | 
            -
                    
         | 
| 305 | 
            -
                    # Add context if provided
         | 
| 306 | 
            -
                    if initial_context:
         | 
| 307 | 
            -
                        # Save context to temp file
         | 
| 308 | 
            -
                        import tempfile
         | 
| 309 | 
            -
                        with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
         | 
| 310 | 
            -
                            f.write(initial_context)
         | 
| 311 | 
            -
                            context_file = f.name
         | 
| 312 | 
            -
                        
         | 
| 313 | 
            -
                        cmd.extend(['--context-file', context_file])
         | 
| 314 | 
            -
                    
         | 
| 315 | 
            -
                    # Add any additional Claude arguments
         | 
| 316 | 
            -
                    if self.claude_args:
         | 
| 317 | 
            -
                        cmd.extend(self.claude_args)
         | 
| 318 | 
            -
                    
         | 
| 319 | 
            -
                    return cmd
         | 
| 320 | 
            -
                
         | 
| 321 | 
            -
                def _display_monitoring_info(self):
         | 
| 322 | 
            -
                    """Display memory monitoring configuration to user."""
         | 
| 323 | 
            -
                    print("\n" + "="*60)
         | 
| 324 | 
            -
                    print("🛡️  Memory Guardian Active")
         | 
| 325 | 
            -
                    print("="*60)
         | 
| 326 | 
            -
                    print(f"Memory Thresholds:")
         | 
| 327 | 
            -
                    print(f"  • Warning:   {self.memory_config.thresholds.warning:,.0f} MB")
         | 
| 328 | 
            -
                    print(f"  • Critical:  {self.memory_config.thresholds.critical:,.0f} MB")
         | 
| 329 | 
            -
                    print(f"  • Emergency: {self.memory_config.thresholds.emergency:,.0f} MB")
         | 
| 330 | 
            -
                    print(f"Monitoring:")
         | 
| 331 | 
            -
                    print(f"  • Check Interval: {self.memory_config.monitoring.normal_interval} seconds")
         | 
| 332 | 
            -
                    print(f"  • Max Restarts:   {self.max_restarts}")
         | 
| 333 | 
            -
                    print(f"  • State Preservation: {'Enabled' if self.state_manager else 'Disabled'}")
         | 
| 334 | 
            -
                    print("="*60 + "\n")
         | 
| 335 | 
            -
                
         | 
| 336 | 
            -
                def get_monitoring_status(self) -> Dict[str, Any]:
         | 
| 337 | 
            -
                    """Get current monitoring status.
         | 
| 338 | 
            -
                    
         | 
| 339 | 
            -
                    Returns:
         | 
| 340 | 
            -
                        Dictionary containing monitoring status
         | 
| 341 | 
            -
                    """
         | 
| 342 | 
            -
                    if not self.memory_guardian:
         | 
| 343 | 
            -
                        return {
         | 
| 344 | 
            -
                            'enabled': False,
         | 
| 345 | 
            -
                            'message': 'Memory monitoring not initialized'
         | 
| 346 | 
            -
                        }
         | 
| 347 | 
            -
                    
         | 
| 348 | 
            -
                    return self.memory_guardian.get_status()
         | 
| 349 | 
            -
             | 
| 350 | 
            -
             | 
| 351 | 
            -
            class MemoryThresholdExceeded(Exception):
         | 
| 352 | 
            -
                """Exception raised when memory threshold is exceeded."""
         | 
| 353 | 
            -
                pass
         |