claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__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 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +432 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +254 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +41 -14
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +21 -44
- claude_mpm/agents/frontmatter_validator.py +292 -252
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/circuit-breakers.md +1005 -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 +72 -376
- claude_mpm/cli/commands/__init__.py +4 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +344 -0
- claude_mpm/cli/commands/agents.py +1673 -178
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +11 -7
- claude_mpm/cli/commands/analyze.py +18 -13
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +566 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +54 -17
- claude_mpm/cli/commands/configure.py +1184 -1055
- claude_mpm/cli/commands/configure_agent_display.py +261 -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 +50 -52
- claude_mpm/cli/commands/debug.py +19 -19
- claude_mpm/cli/commands/doctor.py +51 -7
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -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/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +252 -167
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1225 -0
- 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 +279 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1872 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +369 -1
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +196 -3
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -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 +282 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +994 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +54 -3
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
- claude_mpm/commands/mpm-agents-detect.md +177 -0
- claude_mpm/commands/mpm-agents-list.md +131 -0
- claude_mpm/commands/mpm-agents-recommend.md +223 -0
- claude_mpm/commands/mpm-config-view.md +150 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +297 -5
- claude_mpm/commands/mpm-init.md +401 -17
- claude_mpm/commands/mpm-monitor.md +418 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +381 -0
- claude_mpm/commands/mpm-status.md +79 -8
- claude_mpm/commands/mpm-ticket-organize.md +304 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +122 -0
- claude_mpm/commands/mpm.md +12 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +28 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +24 -42
- claude_mpm/core/config.py +101 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +66 -1
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- 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 +288 -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 +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +181 -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 +321 -1631
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +49 -8
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +146 -18
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +22 -15
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +122 -15
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- 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 +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +600 -18
- claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
- claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +50 -13
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +36 -16
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
- claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
- claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
- claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +309 -178
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +183 -139
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +125 -122
- claude_mpm/experimental/cli_enhancements.py +5 -7
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- 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 +1 -1
- 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 +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +35 -9
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +56 -18
- claude_mpm/services/agents/agent_preset_service.py +238 -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/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
- claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -7
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +249 -53
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +10 -10
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -43
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +11 -14
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- 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 +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -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 +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- 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 +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +209 -13
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +31 -11
- claude_mpm/services/core/interfaces/__init__.py +88 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +169 -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/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- 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 +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +8 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +21 -21
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +305 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +11 -7
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -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 +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +2 -6
- claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- 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_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +24 -5
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +591 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +5 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +555 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- 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 +691 -0
- claude_mpm/services/monitor/daemon_manager.py +1040 -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 +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +3 -3
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- 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/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +23 -9
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +22 -41
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +9 -9
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +142 -8
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +24 -24
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +3 -5
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- 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 +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +14 -8
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- 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/tools/__main__.py +9 -9
- 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 +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +184 -36
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +5 -3
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +131 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-5.0.9.dist-info/METADATA +1028 -0
- claude_mpm-5.0.9.dist-info/RECORD +864 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -270
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
- claude_mpm/agents/templates/api_qa.json +0 -171
- claude_mpm/agents/templates/code_analyzer.json +0 -95
- claude_mpm/agents/templates/data_engineer.json +0 -152
- claude_mpm/agents/templates/documentation.json +0 -175
- claude_mpm/agents/templates/engineer.json +0 -176
- claude_mpm/agents/templates/imagemagick.json +0 -261
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/memory_manager.json +0 -155
- claude_mpm/agents/templates/ops.json +0 -175
- claude_mpm/agents/templates/project_organizer.json +0 -130
- claude_mpm/agents/templates/qa.json +0 -223
- claude_mpm/agents/templates/refactoring_engineer.json +0 -266
- claude_mpm/agents/templates/research.json +0 -163
- claude_mpm/agents/templates/security.json +0 -153
- claude_mpm/agents/templates/ticketing.json +0 -169
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
- claude_mpm/agents/templates/version_control.json +0 -147
- claude_mpm/agents/templates/web_qa.json +0 -254
- claude_mpm/agents/templates/web_ui.json +0 -176
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/commands/mpm-agents.md +0 -12
- claude_mpm/commands/mpm-config.md +0 -18
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Socket.IO Client for Claude MPM Dashboard
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* This module provides real-time WebSocket communication between the Claude MPM dashboard
|
|
5
5
|
* and the backend Socket.IO server. It handles connection management, event processing,
|
|
6
6
|
* retry logic, and health monitoring.
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
8
|
* Architecture:
|
|
9
9
|
* - Maintains persistent WebSocket connection to Claude MPM backend
|
|
10
10
|
* - Implements robust retry logic with exponential backoff
|
|
11
11
|
* - Provides event queuing during disconnections
|
|
12
12
|
* - Validates event schemas for data integrity
|
|
13
13
|
* - Monitors connection health with ping/pong mechanisms
|
|
14
|
-
*
|
|
14
|
+
*
|
|
15
15
|
* Event Flow:
|
|
16
16
|
* 1. Events from Claude Code hooks → Socket.IO server → Dashboard client
|
|
17
17
|
* 2. Dashboard requests → Socket.IO server → Backend services
|
|
18
18
|
* 3. Status updates → Socket.IO server → All connected clients
|
|
19
|
-
*
|
|
19
|
+
*
|
|
20
20
|
* Thread Safety:
|
|
21
21
|
* - Single-threaded JavaScript execution model ensures safety
|
|
22
22
|
* - Event callbacks are queued and executed sequentially
|
|
23
23
|
* - Connection state changes are atomic
|
|
24
|
-
*
|
|
24
|
+
*
|
|
25
25
|
* Performance Considerations:
|
|
26
26
|
* - Event queue limited to 100 items to prevent memory leaks
|
|
27
27
|
* - Health checks run every 45s to match server ping interval
|
|
28
28
|
* - Exponential backoff prevents connection spam
|
|
29
29
|
* - Lazy event validation reduces overhead
|
|
30
|
-
*
|
|
30
|
+
*
|
|
31
31
|
* Security:
|
|
32
32
|
* - Connects only to localhost to prevent external access
|
|
33
33
|
* - Event schema validation prevents malformed data processing
|
|
34
34
|
* - Connection timeout prevents hanging connections
|
|
35
|
-
*
|
|
35
|
+
*
|
|
36
36
|
* @author Claude MPM Team
|
|
37
37
|
* @version 1.0
|
|
38
38
|
* @since v4.0.25
|
|
@@ -44,42 +44,42 @@ const io = window.io;
|
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
46
|
* Primary Socket.IO client for dashboard communication.
|
|
47
|
-
*
|
|
47
|
+
*
|
|
48
48
|
* Manages WebSocket connection lifecycle, event processing, and error handling.
|
|
49
49
|
* Implements connection resilience with automatic retry and health monitoring.
|
|
50
|
-
*
|
|
50
|
+
*
|
|
51
51
|
* Key Features:
|
|
52
52
|
* - Automatic connection retry with exponential backoff
|
|
53
|
-
* - Event queue management during disconnections
|
|
53
|
+
* - Event queue management during disconnections
|
|
54
54
|
* - Schema validation for incoming events
|
|
55
55
|
* - Health monitoring with ping/pong
|
|
56
56
|
* - Session management and event history
|
|
57
|
-
*
|
|
57
|
+
*
|
|
58
58
|
* Connection States:
|
|
59
59
|
* - isConnected: Currently connected to server
|
|
60
60
|
* - isConnecting: Connection attempt in progress
|
|
61
61
|
* - disconnectTime: Timestamp of last disconnection
|
|
62
|
-
*
|
|
62
|
+
*
|
|
63
63
|
* Event Processing:
|
|
64
64
|
* - Validates against schema before processing
|
|
65
65
|
* - Queues events during disconnection (max 100)
|
|
66
66
|
* - Maintains event history and session tracking
|
|
67
|
-
*
|
|
67
|
+
*
|
|
68
68
|
* @class SocketClient
|
|
69
69
|
*/
|
|
70
70
|
class SocketClient {
|
|
71
71
|
/**
|
|
72
72
|
* Initialize Socket.IO client with default configuration.
|
|
73
|
-
*
|
|
73
|
+
*
|
|
74
74
|
* Sets up connection management, event processing, and health monitoring.
|
|
75
75
|
* Configures retry logic and event queue management.
|
|
76
|
-
*
|
|
76
|
+
*
|
|
77
77
|
* WHY this initialization approach:
|
|
78
78
|
* - Lazy socket creation allows for port specification
|
|
79
79
|
* - Event queue prevents data loss during reconnections
|
|
80
80
|
* - Health monitoring detects server issues early
|
|
81
81
|
* - Schema validation ensures data integrity
|
|
82
|
-
*
|
|
82
|
+
*
|
|
83
83
|
* @constructor
|
|
84
84
|
*/
|
|
85
85
|
constructor() {
|
|
@@ -89,14 +89,14 @@ class SocketClient {
|
|
|
89
89
|
* @private
|
|
90
90
|
*/
|
|
91
91
|
this.socket = null;
|
|
92
|
-
|
|
92
|
+
|
|
93
93
|
/**
|
|
94
94
|
* Current connection port.
|
|
95
95
|
* @type {string|null}
|
|
96
96
|
* @private
|
|
97
97
|
*/
|
|
98
98
|
this.port = null; // Store the current port
|
|
99
|
-
|
|
99
|
+
|
|
100
100
|
/**
|
|
101
101
|
* Event callback registry for connection lifecycle events.
|
|
102
102
|
* WHY: Allows multiple components to register for connection events.
|
|
@@ -105,11 +105,11 @@ class SocketClient {
|
|
|
105
105
|
*/
|
|
106
106
|
this.connectionCallbacks = {
|
|
107
107
|
connect: [], // Called on successful connection
|
|
108
|
-
disconnect: [], // Called on disconnection
|
|
108
|
+
disconnect: [], // Called on disconnection
|
|
109
109
|
error: [], // Called on connection errors
|
|
110
110
|
event: [] // Called on incoming events
|
|
111
111
|
};
|
|
112
|
-
|
|
112
|
+
|
|
113
113
|
/**
|
|
114
114
|
* Event schema definition for validation.
|
|
115
115
|
* WHY: Ensures data integrity and prevents processing malformed events.
|
|
@@ -127,7 +127,7 @@ class SocketClient {
|
|
|
127
127
|
* @private
|
|
128
128
|
*/
|
|
129
129
|
this.isConnected = false;
|
|
130
|
-
|
|
130
|
+
|
|
131
131
|
/**
|
|
132
132
|
* Connection attempt in progress flag.
|
|
133
133
|
* WHY: Prevents multiple simultaneous connection attempts.
|
|
@@ -135,14 +135,14 @@ class SocketClient {
|
|
|
135
135
|
* @private
|
|
136
136
|
*/
|
|
137
137
|
this.isConnecting = false;
|
|
138
|
-
|
|
138
|
+
|
|
139
139
|
/**
|
|
140
140
|
* Timestamp of last successful connection.
|
|
141
141
|
* @type {number|null}
|
|
142
142
|
* @private
|
|
143
143
|
*/
|
|
144
144
|
this.lastConnectTime = null;
|
|
145
|
-
|
|
145
|
+
|
|
146
146
|
/**
|
|
147
147
|
* Timestamp of last disconnection.
|
|
148
148
|
* WHY: Used to calculate downtime and trigger reconnection logic.
|
|
@@ -158,7 +158,7 @@ class SocketClient {
|
|
|
158
158
|
* @private
|
|
159
159
|
*/
|
|
160
160
|
this.events = [];
|
|
161
|
-
|
|
161
|
+
|
|
162
162
|
/**
|
|
163
163
|
* Session tracking map.
|
|
164
164
|
* WHY: Groups events by session for better organization.
|
|
@@ -166,7 +166,7 @@ class SocketClient {
|
|
|
166
166
|
* @private
|
|
167
167
|
*/
|
|
168
168
|
this.sessions = new Map();
|
|
169
|
-
|
|
169
|
+
|
|
170
170
|
/**
|
|
171
171
|
* Current active session identifier.
|
|
172
172
|
* @type {string|null}
|
|
@@ -181,7 +181,7 @@ class SocketClient {
|
|
|
181
181
|
* @private
|
|
182
182
|
*/
|
|
183
183
|
this.eventQueue = [];
|
|
184
|
-
|
|
184
|
+
|
|
185
185
|
/**
|
|
186
186
|
* Maximum queue size to prevent memory leaks.
|
|
187
187
|
* WHY: Limits memory usage during extended disconnections.
|
|
@@ -190,7 +190,7 @@ class SocketClient {
|
|
|
190
190
|
* @const
|
|
191
191
|
*/
|
|
192
192
|
this.maxQueueSize = 100;
|
|
193
|
-
|
|
193
|
+
|
|
194
194
|
/**
|
|
195
195
|
* Current retry attempt counter.
|
|
196
196
|
* WHY: Tracks retry attempts for exponential backoff logic.
|
|
@@ -198,7 +198,7 @@ class SocketClient {
|
|
|
198
198
|
* @private
|
|
199
199
|
*/
|
|
200
200
|
this.retryAttempts = 0;
|
|
201
|
-
|
|
201
|
+
|
|
202
202
|
/**
|
|
203
203
|
* Maximum retry attempts before giving up.
|
|
204
204
|
* WHY: Prevents infinite retry loops that could impact performance.
|
|
@@ -207,7 +207,7 @@ class SocketClient {
|
|
|
207
207
|
* @const
|
|
208
208
|
*/
|
|
209
209
|
this.maxRetryAttempts = 5; // Increased from 3 to 5 for better stability
|
|
210
|
-
|
|
210
|
+
|
|
211
211
|
/**
|
|
212
212
|
* Retry delay intervals in milliseconds (exponential backoff).
|
|
213
213
|
* WHY: Prevents server overload during connection issues.
|
|
@@ -216,7 +216,7 @@ class SocketClient {
|
|
|
216
216
|
* @const
|
|
217
217
|
*/
|
|
218
218
|
this.retryDelays = [1000, 2000, 3000, 4000, 5000]; // Exponential backoff with 5 attempts
|
|
219
|
-
|
|
219
|
+
|
|
220
220
|
/**
|
|
221
221
|
* Map of pending emissions for retry logic.
|
|
222
222
|
* WHY: Tracks failed emissions that need to be retried.
|
|
@@ -224,7 +224,7 @@ class SocketClient {
|
|
|
224
224
|
* @private
|
|
225
225
|
*/
|
|
226
226
|
this.pendingEmissions = new Map(); // Track pending emissions for retry
|
|
227
|
-
|
|
227
|
+
|
|
228
228
|
/**
|
|
229
229
|
* Timestamp of last ping sent to server.
|
|
230
230
|
* WHY: Used for health monitoring and connection validation.
|
|
@@ -232,7 +232,7 @@ class SocketClient {
|
|
|
232
232
|
* @private
|
|
233
233
|
*/
|
|
234
234
|
this.lastPingTime = null;
|
|
235
|
-
|
|
235
|
+
|
|
236
236
|
/**
|
|
237
237
|
* Timestamp of last pong received from server.
|
|
238
238
|
* WHY: Confirms server is responsive and connection is healthy.
|
|
@@ -240,7 +240,7 @@ class SocketClient {
|
|
|
240
240
|
* @private
|
|
241
241
|
*/
|
|
242
242
|
this.lastPongTime = null;
|
|
243
|
-
|
|
243
|
+
|
|
244
244
|
/**
|
|
245
245
|
* Health check timeout in milliseconds.
|
|
246
246
|
* WHY: More lenient than Socket.IO timeout to prevent false positives.
|
|
@@ -248,15 +248,15 @@ class SocketClient {
|
|
|
248
248
|
* @private
|
|
249
249
|
* @const
|
|
250
250
|
*/
|
|
251
|
-
this.pingTimeout =
|
|
252
|
-
|
|
251
|
+
this.pingTimeout = 120000; // 120 seconds for health check (more lenient for stability)
|
|
252
|
+
|
|
253
253
|
/**
|
|
254
254
|
* Health check interval timer.
|
|
255
255
|
* @type {number|null}
|
|
256
256
|
* @private
|
|
257
257
|
*/
|
|
258
258
|
this.healthCheckInterval = null;
|
|
259
|
-
|
|
259
|
+
|
|
260
260
|
// Initialize background monitoring
|
|
261
261
|
this.startStatusCheckFallback();
|
|
262
262
|
this.startHealthMonitoring();
|
|
@@ -264,27 +264,27 @@ class SocketClient {
|
|
|
264
264
|
|
|
265
265
|
/**
|
|
266
266
|
* Connect to Socket.IO server on specified port.
|
|
267
|
-
*
|
|
267
|
+
*
|
|
268
268
|
* Initiates WebSocket connection to the Claude MPM Socket.IO server.
|
|
269
269
|
* Handles connection conflicts and ensures clean state transitions.
|
|
270
|
-
*
|
|
270
|
+
*
|
|
271
271
|
* Connection Process:
|
|
272
272
|
* 1. Validates port and constructs localhost URL
|
|
273
273
|
* 2. Checks for existing connections and cleans up if needed
|
|
274
274
|
* 3. Delegates to doConnect() for actual connection logic
|
|
275
|
-
*
|
|
275
|
+
*
|
|
276
276
|
* Thread Safety:
|
|
277
277
|
* - Uses setTimeout for async cleanup to prevent race conditions
|
|
278
278
|
* - Connection state flags prevent multiple simultaneous attempts
|
|
279
|
-
*
|
|
279
|
+
*
|
|
280
280
|
* @param {string} [port='8765'] - Port number to connect to (defaults to 8765)
|
|
281
|
-
*
|
|
281
|
+
*
|
|
282
282
|
* @throws {Error} If Socket.IO library is not loaded
|
|
283
|
-
*
|
|
283
|
+
*
|
|
284
284
|
* @example
|
|
285
285
|
* // Connect to default port
|
|
286
286
|
* socketClient.connect();
|
|
287
|
-
*
|
|
287
|
+
*
|
|
288
288
|
* // Connect to specific port
|
|
289
289
|
* socketClient.connect('8766');
|
|
290
290
|
*/
|
|
@@ -307,38 +307,38 @@ class SocketClient {
|
|
|
307
307
|
|
|
308
308
|
/**
|
|
309
309
|
* Execute the actual Socket.IO connection with full configuration.
|
|
310
|
-
*
|
|
310
|
+
*
|
|
311
311
|
* Creates and configures Socket.IO client with appropriate timeouts,
|
|
312
312
|
* retry logic, and transport settings. Sets up event handlers for
|
|
313
313
|
* connection lifecycle management.
|
|
314
|
-
*
|
|
314
|
+
*
|
|
315
315
|
* Configuration Details:
|
|
316
316
|
* - autoConnect: true - Immediate connection attempt
|
|
317
317
|
* - reconnection: true - Built-in reconnection enabled
|
|
318
318
|
* - pingInterval: 25000ms - Matches server configuration
|
|
319
319
|
* - pingTimeout: 20000ms - Health check timeout
|
|
320
320
|
* - transports: ['websocket', 'polling'] - Fallback options
|
|
321
|
-
*
|
|
321
|
+
*
|
|
322
322
|
* WHY these settings:
|
|
323
323
|
* - Ping intervals must match server to prevent timeouts
|
|
324
324
|
* - Limited reconnection attempts prevent infinite loops
|
|
325
325
|
* - forceNew prevents socket reuse issues
|
|
326
|
-
*
|
|
326
|
+
*
|
|
327
327
|
* @param {string} url - Complete Socket.IO server URL (http://localhost:port)
|
|
328
328
|
* @private
|
|
329
|
-
*
|
|
329
|
+
*
|
|
330
330
|
* @throws {Error} If Socket.IO library is not available
|
|
331
331
|
*/
|
|
332
332
|
doConnect(url) {
|
|
333
333
|
console.log(`Connecting to Socket.IO server at ${url}`);
|
|
334
|
-
|
|
334
|
+
|
|
335
335
|
// Check if io is available
|
|
336
336
|
if (typeof io === 'undefined') {
|
|
337
337
|
console.error('Socket.IO library not loaded! Make sure socket.io.min.js is loaded before this script.');
|
|
338
338
|
this.notifyConnectionStatus('Socket.IO library not loaded', 'error');
|
|
339
339
|
return;
|
|
340
340
|
}
|
|
341
|
-
|
|
341
|
+
|
|
342
342
|
this.isConnecting = true;
|
|
343
343
|
this.notifyConnectionStatus('Connecting...', 'connecting');
|
|
344
344
|
|
|
@@ -346,13 +346,13 @@ class SocketClient {
|
|
|
346
346
|
autoConnect: true,
|
|
347
347
|
reconnection: true,
|
|
348
348
|
reconnectionDelay: 1000,
|
|
349
|
-
reconnectionDelayMax:
|
|
350
|
-
reconnectionAttempts:
|
|
351
|
-
timeout:
|
|
349
|
+
reconnectionDelayMax: 10000, // Increased max delay for stability
|
|
350
|
+
reconnectionAttempts: 10, // Increased attempts for better resilience
|
|
351
|
+
timeout: 30000, // Increased connection timeout to 30 seconds
|
|
352
352
|
forceNew: true,
|
|
353
353
|
transports: ['websocket', 'polling'],
|
|
354
|
-
|
|
355
|
-
|
|
354
|
+
// Remove client-side ping configuration - let server control this
|
|
355
|
+
// The server now properly configures: ping_interval=30s, ping_timeout=60s
|
|
356
356
|
});
|
|
357
357
|
|
|
358
358
|
this.setupSocketHandlers();
|
|
@@ -369,16 +369,16 @@ class SocketClient {
|
|
|
369
369
|
this.isConnecting = false;
|
|
370
370
|
this.lastConnectTime = Date.now();
|
|
371
371
|
this.retryAttempts = 0; // Reset retry counter on successful connect
|
|
372
|
-
|
|
372
|
+
|
|
373
373
|
// Calculate downtime if this is a reconnection
|
|
374
374
|
if (this.disconnectTime && previouslyConnected === false) {
|
|
375
375
|
const downtime = (Date.now() - this.disconnectTime) / 1000;
|
|
376
376
|
console.log(`Reconnected after ${downtime.toFixed(1)}s downtime`);
|
|
377
|
-
|
|
377
|
+
|
|
378
378
|
// Flush queued events after reconnection
|
|
379
379
|
this.flushEventQueue();
|
|
380
380
|
}
|
|
381
|
-
|
|
381
|
+
|
|
382
382
|
this.notifyConnectionStatus('Connected', 'connected');
|
|
383
383
|
|
|
384
384
|
// Expose socket globally for components that need direct access
|
|
@@ -405,20 +405,20 @@ class SocketClient {
|
|
|
405
405
|
lastPing: this.lastPingTime ? ((Date.now() - this.lastPingTime) / 1000).toFixed(1) + 's ago' : 'never',
|
|
406
406
|
lastPong: this.lastPongTime ? ((Date.now() - this.lastPongTime) / 1000).toFixed(1) + 's ago' : 'never'
|
|
407
407
|
};
|
|
408
|
-
|
|
408
|
+
|
|
409
409
|
console.log('Disconnected from server:', disconnectInfo);
|
|
410
|
-
|
|
410
|
+
|
|
411
411
|
this.isConnected = false;
|
|
412
412
|
this.isConnecting = false;
|
|
413
413
|
this.disconnectTime = Date.now();
|
|
414
|
-
|
|
414
|
+
|
|
415
415
|
this.notifyConnectionStatus(`Disconnected: ${reason}`, 'disconnected');
|
|
416
416
|
|
|
417
417
|
// Emit disconnect callback
|
|
418
418
|
this.connectionCallbacks.disconnect.forEach(callback =>
|
|
419
419
|
callback(reason)
|
|
420
420
|
);
|
|
421
|
-
|
|
421
|
+
|
|
422
422
|
// Detailed reason analysis for auto-reconnect decision
|
|
423
423
|
const reconnectReasons = [
|
|
424
424
|
'transport close', // Network issue
|
|
@@ -426,7 +426,7 @@ class SocketClient {
|
|
|
426
426
|
'transport error', // Connection error
|
|
427
427
|
'io server disconnect', // Server initiated disconnect (might be restart)
|
|
428
428
|
];
|
|
429
|
-
|
|
429
|
+
|
|
430
430
|
if (reconnectReasons.includes(reason)) {
|
|
431
431
|
console.log(`Auto-reconnect triggered for reason: ${reason}`);
|
|
432
432
|
this.scheduleReconnect();
|
|
@@ -448,8 +448,8 @@ class SocketClient {
|
|
|
448
448
|
this.addEvent({
|
|
449
449
|
type: 'connection.error',
|
|
450
450
|
timestamp: new Date().toISOString(),
|
|
451
|
-
data: {
|
|
452
|
-
error: errorMsg,
|
|
451
|
+
data: {
|
|
452
|
+
error: errorMsg,
|
|
453
453
|
url: this.socket.io.uri,
|
|
454
454
|
retry_attempt: this.retryAttempts
|
|
455
455
|
}
|
|
@@ -459,7 +459,7 @@ class SocketClient {
|
|
|
459
459
|
this.connectionCallbacks.error.forEach(callback =>
|
|
460
460
|
callback(errorMsg)
|
|
461
461
|
);
|
|
462
|
-
|
|
462
|
+
|
|
463
463
|
// Schedule reconnect with backoff
|
|
464
464
|
this.scheduleReconnect();
|
|
465
465
|
});
|
|
@@ -467,20 +467,20 @@ class SocketClient {
|
|
|
467
467
|
// Primary event handler - this is what the server actually emits
|
|
468
468
|
this.socket.on('claude_event', (data) => {
|
|
469
469
|
console.log('Received claude_event:', data);
|
|
470
|
-
|
|
470
|
+
|
|
471
471
|
// Validate event schema
|
|
472
472
|
const validatedEvent = this.validateEventSchema(data);
|
|
473
473
|
if (!validatedEvent) {
|
|
474
474
|
console.warn('Invalid event schema received:', data);
|
|
475
475
|
return;
|
|
476
476
|
}
|
|
477
|
-
|
|
477
|
+
|
|
478
478
|
// Code analysis events are now allowed to flow through to the events list for troubleshooting
|
|
479
479
|
// They will appear in both the Events tab and the Code tab
|
|
480
480
|
if (validatedEvent.type && validatedEvent.type.startsWith('code:')) {
|
|
481
481
|
console.log('Code analysis event received via claude_event, adding to events list for troubleshooting:', validatedEvent.type);
|
|
482
482
|
}
|
|
483
|
-
|
|
483
|
+
|
|
484
484
|
// Transform event to match expected format (for backward compatibility)
|
|
485
485
|
const transformedEvent = this.transformEvent(validatedEvent);
|
|
486
486
|
console.log('Transformed event:', transformedEvent);
|
|
@@ -491,20 +491,38 @@ class SocketClient {
|
|
|
491
491
|
this.socket.on('ping', (data) => {
|
|
492
492
|
// console.log('Received ping from server');
|
|
493
493
|
this.lastPingTime = Date.now();
|
|
494
|
-
|
|
494
|
+
|
|
495
495
|
// Send pong response immediately
|
|
496
|
-
this.socket.emit('pong', {
|
|
496
|
+
this.socket.emit('pong', {
|
|
497
497
|
timestamp: data.timestamp,
|
|
498
498
|
client_time: Date.now()
|
|
499
499
|
});
|
|
500
500
|
});
|
|
501
|
-
|
|
501
|
+
|
|
502
502
|
// Track pong responses from server
|
|
503
503
|
this.socket.on('pong', (data) => {
|
|
504
504
|
this.lastPongTime = Date.now();
|
|
505
505
|
// console.log('Received pong from server');
|
|
506
506
|
});
|
|
507
|
-
|
|
507
|
+
|
|
508
|
+
// Listen for heartbeat events from server (every 3 minutes)
|
|
509
|
+
this.socket.on('heartbeat', (data) => {
|
|
510
|
+
console.log('🫀 Received server heartbeat:', data);
|
|
511
|
+
// Add heartbeat to event list for visibility
|
|
512
|
+
this.addEvent({
|
|
513
|
+
type: 'system',
|
|
514
|
+
subtype: 'heartbeat',
|
|
515
|
+
timestamp: data.timestamp || new Date().toISOString(),
|
|
516
|
+
data: data
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
// Update last ping time to indicate server is alive
|
|
520
|
+
this.lastPingTime = Date.now();
|
|
521
|
+
|
|
522
|
+
// Log to console for debugging
|
|
523
|
+
console.log(`Server heartbeat #${data.heartbeat_number}: ${data.server_uptime_formatted} uptime, ${data.connected_clients} clients connected`);
|
|
524
|
+
});
|
|
525
|
+
|
|
508
526
|
// Session and event handlers (legacy/fallback)
|
|
509
527
|
this.socket.on('session.started', (data) => {
|
|
510
528
|
this.addEvent({ type: 'session', subtype: 'started', timestamp: new Date().toISOString(), data });
|
|
@@ -530,13 +548,15 @@ class SocketClient {
|
|
|
530
548
|
this.addEvent({ type: 'agent', subtype: 'executed', timestamp: new Date().toISOString(), data });
|
|
531
549
|
});
|
|
532
550
|
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
551
|
+
// DISABLED: Legacy hook handlers - events now come through claude_event pathway
|
|
552
|
+
// to prevent duplication. Hook events are processed by the claude_event handler above.
|
|
553
|
+
// this.socket.on('hook.pre', (data) => {
|
|
554
|
+
// this.addEvent({ type: 'hook', subtype: 'pre', timestamp: new Date().toISOString(), data });
|
|
555
|
+
// });
|
|
536
556
|
|
|
537
|
-
this.socket.on('hook.post', (data) => {
|
|
538
|
-
|
|
539
|
-
});
|
|
557
|
+
// this.socket.on('hook.post', (data) => {
|
|
558
|
+
// this.addEvent({ type: 'hook', subtype: 'post', timestamp: new Date().toISOString(), data });
|
|
559
|
+
// });
|
|
540
560
|
|
|
541
561
|
this.socket.on('todo.updated', (data) => {
|
|
542
562
|
this.addEvent({ type: 'todo', subtype: 'updated', timestamp: new Date().toISOString(), data });
|
|
@@ -558,43 +578,43 @@ class SocketClient {
|
|
|
558
578
|
console.log('Code analysis queued event received, adding to events list for troubleshooting');
|
|
559
579
|
this.addEvent({ type: 'code', subtype: 'analysis:queued', timestamp: new Date().toISOString(), data });
|
|
560
580
|
});
|
|
561
|
-
|
|
581
|
+
|
|
562
582
|
this.socket.on('code:analysis:accepted', (data) => {
|
|
563
583
|
// Add to events list for troubleshooting
|
|
564
584
|
console.log('Code analysis accepted event received, adding to events list for troubleshooting');
|
|
565
585
|
this.addEvent({ type: 'code', subtype: 'analysis:accepted', timestamp: new Date().toISOString(), data });
|
|
566
586
|
});
|
|
567
|
-
|
|
587
|
+
|
|
568
588
|
this.socket.on('code:analysis:start', (data) => {
|
|
569
589
|
// Add to events list for troubleshooting
|
|
570
590
|
console.log('Code analysis start event received, adding to events list for troubleshooting');
|
|
571
591
|
this.addEvent({ type: 'code', subtype: 'analysis:start', timestamp: new Date().toISOString(), data });
|
|
572
592
|
});
|
|
573
|
-
|
|
593
|
+
|
|
574
594
|
this.socket.on('code:analysis:complete', (data) => {
|
|
575
595
|
// Add to events list for troubleshooting
|
|
576
596
|
console.log('Code analysis complete event received, adding to events list for troubleshooting');
|
|
577
597
|
this.addEvent({ type: 'code', subtype: 'analysis:complete', timestamp: new Date().toISOString(), data });
|
|
578
598
|
});
|
|
579
|
-
|
|
599
|
+
|
|
580
600
|
this.socket.on('code:analysis:error', (data) => {
|
|
581
601
|
// Add to events list for troubleshooting
|
|
582
602
|
console.log('Code analysis error event received, adding to events list for troubleshooting');
|
|
583
603
|
this.addEvent({ type: 'code', subtype: 'analysis:error', timestamp: new Date().toISOString(), data });
|
|
584
604
|
});
|
|
585
|
-
|
|
605
|
+
|
|
586
606
|
this.socket.on('code:file:start', (data) => {
|
|
587
607
|
// Add to events list for troubleshooting
|
|
588
608
|
console.log('Code file start event received, adding to events list for troubleshooting');
|
|
589
609
|
this.addEvent({ type: 'code', subtype: 'file:start', timestamp: new Date().toISOString(), data });
|
|
590
610
|
});
|
|
591
|
-
|
|
611
|
+
|
|
592
612
|
this.socket.on('code:node:found', (data) => {
|
|
593
613
|
// Add to events list for troubleshooting
|
|
594
614
|
console.log('Code node found event received, adding to events list for troubleshooting');
|
|
595
615
|
this.addEvent({ type: 'code', subtype: 'node:found', timestamp: new Date().toISOString(), data });
|
|
596
616
|
});
|
|
597
|
-
|
|
617
|
+
|
|
598
618
|
this.socket.on('code:analysis:progress', (data) => {
|
|
599
619
|
// Add to events list for troubleshooting
|
|
600
620
|
console.log('Code analysis progress event received, adding to events list for troubleshooting');
|
|
@@ -613,6 +633,15 @@ class SocketClient {
|
|
|
613
633
|
});
|
|
614
634
|
this.notifyEventUpdate();
|
|
615
635
|
console.log(`Event history loaded: ${data.events.length} events added to dashboard`);
|
|
636
|
+
|
|
637
|
+
// FIX: Dispatch custom event after history is loaded
|
|
638
|
+
// WHY: Allows dashboard to render panes with initial data
|
|
639
|
+
document.dispatchEvent(new CustomEvent('historyLoaded', {
|
|
640
|
+
detail: {
|
|
641
|
+
eventCount: data.events.length,
|
|
642
|
+
totalAvailable: data.total_available
|
|
643
|
+
}
|
|
644
|
+
}));
|
|
616
645
|
} else if (Array.isArray(data)) {
|
|
617
646
|
// Handle legacy format for backward compatibility
|
|
618
647
|
console.log('Received legacy event history format:', data.length, 'events');
|
|
@@ -621,6 +650,14 @@ class SocketClient {
|
|
|
621
650
|
this.addEvent(transformedEvent, false);
|
|
622
651
|
});
|
|
623
652
|
this.notifyEventUpdate();
|
|
653
|
+
|
|
654
|
+
// FIX: Dispatch custom event for legacy format too
|
|
655
|
+
document.dispatchEvent(new CustomEvent('historyLoaded', {
|
|
656
|
+
detail: {
|
|
657
|
+
eventCount: data.length,
|
|
658
|
+
totalAvailable: data.length
|
|
659
|
+
}
|
|
660
|
+
}));
|
|
624
661
|
}
|
|
625
662
|
});
|
|
626
663
|
|
|
@@ -655,15 +692,15 @@ class SocketClient {
|
|
|
655
692
|
* @param {Object} options - Options for retry behavior
|
|
656
693
|
*/
|
|
657
694
|
emitWithRetry(event, data = null, options = {}) {
|
|
658
|
-
const {
|
|
695
|
+
const {
|
|
659
696
|
maxRetries = 3,
|
|
660
697
|
retryDelays = [1000, 2000, 4000],
|
|
661
698
|
onSuccess = null,
|
|
662
699
|
onFailure = null
|
|
663
700
|
} = options;
|
|
664
|
-
|
|
701
|
+
|
|
665
702
|
const emissionId = `${event}_${Date.now()}_${Math.random()}`;
|
|
666
|
-
|
|
703
|
+
|
|
667
704
|
const attemptEmission = (attemptNum = 0) => {
|
|
668
705
|
if (!this.socket || !this.socket.connected) {
|
|
669
706
|
// Queue for later if disconnected
|
|
@@ -674,24 +711,24 @@ class SocketClient {
|
|
|
674
711
|
}
|
|
675
712
|
return;
|
|
676
713
|
}
|
|
677
|
-
|
|
714
|
+
|
|
678
715
|
try {
|
|
679
716
|
// Attempt emission
|
|
680
717
|
this.socket.emit(event, data);
|
|
681
718
|
console.log(`Emitted ${event} successfully`);
|
|
682
|
-
|
|
719
|
+
|
|
683
720
|
// Remove from pending
|
|
684
721
|
this.pendingEmissions.delete(emissionId);
|
|
685
|
-
|
|
722
|
+
|
|
686
723
|
if (onSuccess) onSuccess();
|
|
687
|
-
|
|
724
|
+
|
|
688
725
|
} catch (error) {
|
|
689
726
|
console.error(`Failed to emit ${event} (attempt ${attemptNum + 1}):`, error);
|
|
690
|
-
|
|
727
|
+
|
|
691
728
|
if (attemptNum < maxRetries - 1) {
|
|
692
729
|
const delay = retryDelays[attemptNum] || retryDelays[retryDelays.length - 1];
|
|
693
730
|
console.log(`Retrying ${event} in ${delay}ms...`);
|
|
694
|
-
|
|
731
|
+
|
|
695
732
|
// Store pending emission
|
|
696
733
|
this.pendingEmissions.set(emissionId, {
|
|
697
734
|
event,
|
|
@@ -699,7 +736,7 @@ class SocketClient {
|
|
|
699
736
|
attemptNum: attemptNum + 1,
|
|
700
737
|
scheduledTime: Date.now() + delay
|
|
701
738
|
});
|
|
702
|
-
|
|
739
|
+
|
|
703
740
|
setTimeout(() => attemptEmission(attemptNum + 1), delay);
|
|
704
741
|
} else {
|
|
705
742
|
console.error(`Failed to emit ${event} after ${maxRetries} attempts`);
|
|
@@ -708,10 +745,10 @@ class SocketClient {
|
|
|
708
745
|
}
|
|
709
746
|
}
|
|
710
747
|
};
|
|
711
|
-
|
|
748
|
+
|
|
712
749
|
attemptEmission();
|
|
713
750
|
}
|
|
714
|
-
|
|
751
|
+
|
|
715
752
|
/**
|
|
716
753
|
* Queue an event for later emission
|
|
717
754
|
* @param {string} event - Event name
|
|
@@ -723,24 +760,24 @@ class SocketClient {
|
|
|
723
760
|
const removed = this.eventQueue.shift();
|
|
724
761
|
console.warn(`Event queue full, dropped oldest event: ${removed.event}`);
|
|
725
762
|
}
|
|
726
|
-
|
|
763
|
+
|
|
727
764
|
this.eventQueue.push({
|
|
728
765
|
event,
|
|
729
766
|
data,
|
|
730
767
|
timestamp: Date.now()
|
|
731
768
|
});
|
|
732
769
|
}
|
|
733
|
-
|
|
770
|
+
|
|
734
771
|
/**
|
|
735
772
|
* Flush queued events after reconnection
|
|
736
773
|
*/
|
|
737
774
|
flushEventQueue() {
|
|
738
775
|
if (this.eventQueue.length === 0) return;
|
|
739
|
-
|
|
776
|
+
|
|
740
777
|
console.log(`Flushing ${this.eventQueue.length} queued events...`);
|
|
741
778
|
const events = [...this.eventQueue];
|
|
742
779
|
this.eventQueue = [];
|
|
743
|
-
|
|
780
|
+
|
|
744
781
|
// Emit each queued event with a small delay between them
|
|
745
782
|
events.forEach((item, index) => {
|
|
746
783
|
setTimeout(() => {
|
|
@@ -751,7 +788,7 @@ class SocketClient {
|
|
|
751
788
|
}, index * 100); // 100ms between each event
|
|
752
789
|
});
|
|
753
790
|
}
|
|
754
|
-
|
|
791
|
+
|
|
755
792
|
/**
|
|
756
793
|
* Schedule a reconnection attempt with exponential backoff
|
|
757
794
|
*/
|
|
@@ -761,13 +798,13 @@ class SocketClient {
|
|
|
761
798
|
this.notifyConnectionStatus('Reconnection failed', 'disconnected');
|
|
762
799
|
return;
|
|
763
800
|
}
|
|
764
|
-
|
|
801
|
+
|
|
765
802
|
const delay = this.retryDelays[this.retryAttempts] || this.retryDelays[this.retryDelays.length - 1];
|
|
766
803
|
this.retryAttempts++;
|
|
767
|
-
|
|
804
|
+
|
|
768
805
|
console.log(`Scheduling reconnect attempt ${this.retryAttempts}/${this.maxRetryAttempts} in ${delay}ms...`);
|
|
769
806
|
this.notifyConnectionStatus(`Reconnecting in ${delay/1000}s...`, 'connecting');
|
|
770
|
-
|
|
807
|
+
|
|
771
808
|
setTimeout(() => {
|
|
772
809
|
if (!this.isConnected && this.port) {
|
|
773
810
|
console.log(`Attempting reconnection ${this.retryAttempts}/${this.maxRetryAttempts}...`);
|
|
@@ -775,7 +812,7 @@ class SocketClient {
|
|
|
775
812
|
}
|
|
776
813
|
}, delay);
|
|
777
814
|
}
|
|
778
|
-
|
|
815
|
+
|
|
779
816
|
/**
|
|
780
817
|
* Request server status
|
|
781
818
|
*/
|
|
@@ -846,7 +883,7 @@ class SocketClient {
|
|
|
846
883
|
const session = this.sessions.get(sessionId);
|
|
847
884
|
session.lastActivity = eventData.timestamp;
|
|
848
885
|
session.eventCount++;
|
|
849
|
-
|
|
886
|
+
|
|
850
887
|
// Extract working directory from event data if available (prioritize newer data)
|
|
851
888
|
// Check multiple possible locations for working directory
|
|
852
889
|
const possiblePaths = [
|
|
@@ -861,7 +898,7 @@ class SocketClient {
|
|
|
861
898
|
eventData.working_directory,
|
|
862
899
|
eventData.working_dir
|
|
863
900
|
];
|
|
864
|
-
|
|
901
|
+
|
|
865
902
|
for (const path of possiblePaths) {
|
|
866
903
|
if (path && typeof path === 'string' && path.trim()) {
|
|
867
904
|
session.working_directory = path;
|
|
@@ -869,7 +906,7 @@ class SocketClient {
|
|
|
869
906
|
break;
|
|
870
907
|
}
|
|
871
908
|
}
|
|
872
|
-
|
|
909
|
+
|
|
873
910
|
// Extract git branch if available
|
|
874
911
|
if (eventData.data.git_branch) {
|
|
875
912
|
session.git_branch = eventData.data.git_branch;
|
|
@@ -1045,10 +1082,10 @@ class SocketClient {
|
|
|
1045
1082
|
console.warn('Event data is not an object:', eventData);
|
|
1046
1083
|
return null;
|
|
1047
1084
|
}
|
|
1048
|
-
|
|
1085
|
+
|
|
1049
1086
|
// Make a copy to avoid modifying the original
|
|
1050
1087
|
const validated = { ...eventData };
|
|
1051
|
-
|
|
1088
|
+
|
|
1052
1089
|
// Check and provide defaults for required fields
|
|
1053
1090
|
if (!validated.source) {
|
|
1054
1091
|
validated.source = 'system'; // Default source for backward compatibility
|
|
@@ -1070,16 +1107,16 @@ class SocketClient {
|
|
|
1070
1107
|
if (!validated.data) {
|
|
1071
1108
|
validated.data = {};
|
|
1072
1109
|
}
|
|
1073
|
-
|
|
1110
|
+
|
|
1074
1111
|
// Ensure data field is an object
|
|
1075
1112
|
if (validated.data && typeof validated.data !== 'object') {
|
|
1076
1113
|
validated.data = { value: validated.data };
|
|
1077
1114
|
}
|
|
1078
|
-
|
|
1115
|
+
|
|
1079
1116
|
console.log('Validated event:', validated);
|
|
1080
1117
|
return validated;
|
|
1081
1118
|
}
|
|
1082
|
-
|
|
1119
|
+
|
|
1083
1120
|
/**
|
|
1084
1121
|
* Transform received event to match expected dashboard format
|
|
1085
1122
|
* @param {Object} eventData - Raw event data from server
|
|
@@ -1100,8 +1137,8 @@ class SocketClient {
|
|
|
1100
1137
|
|
|
1101
1138
|
// Check if event is already normalized (has both type and subtype as separate fields)
|
|
1102
1139
|
// This prevents double-transformation of events that were normalized on the backend
|
|
1103
|
-
const isAlreadyNormalized = eventData.type && eventData.subtype &&
|
|
1104
|
-
!eventData.type.includes('.') &&
|
|
1140
|
+
const isAlreadyNormalized = eventData.type && eventData.subtype &&
|
|
1141
|
+
!eventData.type.includes('.') &&
|
|
1105
1142
|
!eventData.type.includes(':');
|
|
1106
1143
|
|
|
1107
1144
|
if (isAlreadyNormalized) {
|
|
@@ -1120,7 +1157,7 @@ class SocketClient {
|
|
|
1120
1157
|
else if (!eventData.type && eventData.event) {
|
|
1121
1158
|
// Map common event names to proper type/subtype
|
|
1122
1159
|
const eventName = eventData.event;
|
|
1123
|
-
|
|
1160
|
+
|
|
1124
1161
|
// Check for known event patterns
|
|
1125
1162
|
if (eventName === 'TestStart' || eventName === 'TestEnd') {
|
|
1126
1163
|
transformedEvent.type = 'test';
|
|
@@ -1139,13 +1176,13 @@ class SocketClient {
|
|
|
1139
1176
|
// Use 'unknown' for type and the actual eventName for subtype
|
|
1140
1177
|
transformedEvent.type = 'unknown';
|
|
1141
1178
|
transformedEvent.subtype = eventName.toLowerCase();
|
|
1142
|
-
|
|
1179
|
+
|
|
1143
1180
|
// Prevent duplicate type/subtype values
|
|
1144
1181
|
if (transformedEvent.type === transformedEvent.subtype) {
|
|
1145
1182
|
transformedEvent.subtype = 'event';
|
|
1146
1183
|
}
|
|
1147
1184
|
}
|
|
1148
|
-
|
|
1185
|
+
|
|
1149
1186
|
// Remove the 'event' field to avoid confusion
|
|
1150
1187
|
delete transformedEvent.event;
|
|
1151
1188
|
// Store original event name for display purposes
|
|
@@ -1154,7 +1191,7 @@ class SocketClient {
|
|
|
1154
1191
|
// Handle standard format with 'type' field that needs transformation
|
|
1155
1192
|
else if (eventData.type) {
|
|
1156
1193
|
const type = eventData.type;
|
|
1157
|
-
|
|
1194
|
+
|
|
1158
1195
|
// Transform 'hook.subtype' format to separate type and subtype
|
|
1159
1196
|
if (type.startsWith('hook.')) {
|
|
1160
1197
|
const subtype = type.substring(5); // Remove 'hook.' prefix
|
|
@@ -1204,7 +1241,7 @@ class SocketClient {
|
|
|
1204
1241
|
if (eventData.data && typeof eventData.data === 'object') {
|
|
1205
1242
|
// Protected fields that should never be overwritten by data fields
|
|
1206
1243
|
const protectedFields = ['type', 'subtype', 'timestamp', 'id', 'event', 'event_type', 'originalEventName'];
|
|
1207
|
-
|
|
1244
|
+
|
|
1208
1245
|
// Copy all data fields to the top level, except protected ones
|
|
1209
1246
|
Object.keys(eventData.data).forEach(key => {
|
|
1210
1247
|
// Only copy if not a protected field
|
|
@@ -1218,11 +1255,14 @@ class SocketClient {
|
|
|
1218
1255
|
transformedEvent[key] = eventData.data[key];
|
|
1219
1256
|
}
|
|
1220
1257
|
} else {
|
|
1221
|
-
// Log
|
|
1222
|
-
|
|
1258
|
+
// Log debug info if data field would overwrite a protected field
|
|
1259
|
+
// Only log for non-timestamp fields to reduce noise
|
|
1260
|
+
if (key !== 'timestamp') {
|
|
1261
|
+
console.debug(`Protected field '${key}' in data object was not copied to top level to preserve event structure`);
|
|
1262
|
+
}
|
|
1223
1263
|
}
|
|
1224
1264
|
});
|
|
1225
|
-
|
|
1265
|
+
|
|
1226
1266
|
// Keep the original data object for backward compatibility
|
|
1227
1267
|
transformedEvent.data = eventData.data;
|
|
1228
1268
|
}
|
|
@@ -1267,7 +1307,7 @@ class SocketClient {
|
|
|
1267
1307
|
has_data: !!transformedEvent.data,
|
|
1268
1308
|
keys: Object.keys(transformedEvent).filter(k => k !== 'data')
|
|
1269
1309
|
});
|
|
1270
|
-
|
|
1310
|
+
|
|
1271
1311
|
// Extra debug logging for file-related tools
|
|
1272
1312
|
const fileTools = ['Read', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit'];
|
|
1273
1313
|
if (fileTools.includes(transformedEvent.tool_name)) {
|
|
@@ -1304,10 +1344,10 @@ class SocketClient {
|
|
|
1304
1344
|
this.healthCheckInterval = setInterval(() => {
|
|
1305
1345
|
if (this.isConnected && this.lastPingTime) {
|
|
1306
1346
|
const timeSinceLastPing = Date.now() - this.lastPingTime;
|
|
1307
|
-
|
|
1347
|
+
|
|
1308
1348
|
if (timeSinceLastPing > this.pingTimeout) {
|
|
1309
1349
|
console.warn(`No ping from server for ${timeSinceLastPing/1000}s, connection may be stale`);
|
|
1310
|
-
|
|
1350
|
+
|
|
1311
1351
|
// Force reconnection
|
|
1312
1352
|
if (this.socket) {
|
|
1313
1353
|
console.log('Forcing reconnection due to stale connection...');
|
|
@@ -1322,7 +1362,7 @@ class SocketClient {
|
|
|
1322
1362
|
}
|
|
1323
1363
|
}, 10000); // Check every 10 seconds
|
|
1324
1364
|
}
|
|
1325
|
-
|
|
1365
|
+
|
|
1326
1366
|
/**
|
|
1327
1367
|
* Stop health monitoring
|
|
1328
1368
|
*/
|
|
@@ -1332,7 +1372,7 @@ class SocketClient {
|
|
|
1332
1372
|
this.healthCheckInterval = null;
|
|
1333
1373
|
}
|
|
1334
1374
|
}
|
|
1335
|
-
|
|
1375
|
+
|
|
1336
1376
|
/**
|
|
1337
1377
|
* Start periodic status check as fallback mechanism
|
|
1338
1378
|
* This ensures the UI stays in sync with actual socket state
|
|
@@ -1366,6 +1406,12 @@ class SocketClient {
|
|
|
1366
1406
|
actualType = 'connected';
|
|
1367
1407
|
this.isConnected = true;
|
|
1368
1408
|
this.isConnecting = false;
|
|
1409
|
+
|
|
1410
|
+
// Expose socket globally when connected
|
|
1411
|
+
if (!window.socket) {
|
|
1412
|
+
window.socket = this.socket;
|
|
1413
|
+
console.log('SocketClient: Exposed socket globally as window.socket');
|
|
1414
|
+
}
|
|
1369
1415
|
} else if (this.socket.connecting || this.isConnecting) {
|
|
1370
1416
|
actualStatus = 'Connecting...';
|
|
1371
1417
|
actualType = 'connecting';
|
|
@@ -1378,17 +1424,15 @@ class SocketClient {
|
|
|
1378
1424
|
}
|
|
1379
1425
|
}
|
|
1380
1426
|
|
|
1381
|
-
//
|
|
1427
|
+
// Always update status to ensure consistency
|
|
1428
|
+
this.updateConnectionStatusDOM(actualStatus, actualType);
|
|
1429
|
+
|
|
1430
|
+
// Also ensure state is consistent
|
|
1382
1431
|
const statusElement = document.getElementById('connection-status');
|
|
1383
1432
|
if (statusElement) {
|
|
1384
1433
|
const currentText = statusElement.textContent.replace('●', '').trim();
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
// Update if status text or class doesn't match
|
|
1389
|
-
if (currentText !== actualStatus || currentClass !== expectedClass) {
|
|
1390
|
-
console.log(`SocketClient: Fallback update - was '${currentText}' (${currentClass}), now '${actualStatus}' (${expectedClass})`);
|
|
1391
|
-
this.updateConnectionStatusDOM(actualStatus, actualType);
|
|
1434
|
+
if (currentText !== actualStatus) {
|
|
1435
|
+
console.log(`SocketClient: Status sync - updating from '${currentText}' to '${actualStatus}'`);
|
|
1392
1436
|
}
|
|
1393
1437
|
}
|
|
1394
1438
|
}
|
|
@@ -1405,7 +1449,7 @@ class SocketClient {
|
|
|
1405
1449
|
this.eventQueue = [];
|
|
1406
1450
|
this.pendingEmissions.clear();
|
|
1407
1451
|
}
|
|
1408
|
-
|
|
1452
|
+
|
|
1409
1453
|
/**
|
|
1410
1454
|
* Get connection metrics
|
|
1411
1455
|
* @returns {Object} Connection metrics
|