claude-mpm 4.21.3__py3-none-any.whl → 5.1.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.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +10 -35
- claude_mpm/agents/frontmatter_validator.py +69 -1
- claude_mpm/agents/templates/circuit-breakers.md +1254 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -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/cli/__init__.py +37 -2
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +188 -30
- claude_mpm/cli/commands/agents.py +1128 -36
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +537 -239
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +935 -45
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +50 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +125 -167
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +757 -20
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +1032 -47
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +310 -4
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +53 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +145 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +564 -108
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +14 -2
- claude_mpm/commands/mpm-init.md +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +19 -35
- claude_mpm/core/config.py +24 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +131 -10
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +110 -8
- claude_mpm/core/output_style_manager.py +173 -43
- 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/shared/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +129 -1
- claude_mpm/core/unified_config.py +22 -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 +15 -15
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +45 -9
- 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_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +225 -18
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +557 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- 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/cli/session_pause_manager.py +1 -1
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +200 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- 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/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- 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 +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +29 -9
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_management_service.py +16 -4
- 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/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skills_registry.py +0 -1
- 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 +8 -8
- claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
- 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 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -180
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -211
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -140
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -242
- claude_mpm/agents/templates/react_engineer.json +0 -238
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/ticketing.json +0 -177
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -157
- claude_mpm/agents/templates/web_qa.json +0 -399
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- 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/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- 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-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.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/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- 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/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- 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/file-viewer.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/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.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.
|
|
@@ -249,14 +249,14 @@ class SocketClient {
|
|
|
249
249
|
* @const
|
|
250
250
|
*/
|
|
251
251
|
this.pingTimeout = 120000; // 120 seconds for health check (more lenient for stability)
|
|
252
|
-
|
|
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
|
|
|
@@ -347,7 +347,7 @@ class SocketClient {
|
|
|
347
347
|
reconnection: true,
|
|
348
348
|
reconnectionDelay: 1000,
|
|
349
349
|
reconnectionDelayMax: 10000, // Increased max delay for stability
|
|
350
|
-
reconnectionAttempts: 10, // Increased attempts for better resilience
|
|
350
|
+
reconnectionAttempts: 10, // Increased attempts for better resilience
|
|
351
351
|
timeout: 30000, // Increased connection timeout to 30 seconds
|
|
352
352
|
forceNew: true,
|
|
353
353
|
transports: ['websocket', 'polling'],
|
|
@@ -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,20 @@ 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
508
|
// Listen for heartbeat events from server (every 3 minutes)
|
|
509
509
|
this.socket.on('heartbeat', (data) => {
|
|
510
510
|
console.log('🫀 Received server heartbeat:', data);
|
|
@@ -515,14 +515,14 @@ class SocketClient {
|
|
|
515
515
|
timestamp: data.timestamp || new Date().toISOString(),
|
|
516
516
|
data: data
|
|
517
517
|
});
|
|
518
|
-
|
|
518
|
+
|
|
519
519
|
// Update last ping time to indicate server is alive
|
|
520
520
|
this.lastPingTime = Date.now();
|
|
521
|
-
|
|
521
|
+
|
|
522
522
|
// Log to console for debugging
|
|
523
523
|
console.log(`Server heartbeat #${data.heartbeat_number}: ${data.server_uptime_formatted} uptime, ${data.connected_clients} clients connected`);
|
|
524
524
|
});
|
|
525
|
-
|
|
525
|
+
|
|
526
526
|
// Session and event handlers (legacy/fallback)
|
|
527
527
|
this.socket.on('session.started', (data) => {
|
|
528
528
|
this.addEvent({ type: 'session', subtype: 'started', timestamp: new Date().toISOString(), data });
|
|
@@ -578,43 +578,43 @@ class SocketClient {
|
|
|
578
578
|
console.log('Code analysis queued event received, adding to events list for troubleshooting');
|
|
579
579
|
this.addEvent({ type: 'code', subtype: 'analysis:queued', timestamp: new Date().toISOString(), data });
|
|
580
580
|
});
|
|
581
|
-
|
|
581
|
+
|
|
582
582
|
this.socket.on('code:analysis:accepted', (data) => {
|
|
583
583
|
// Add to events list for troubleshooting
|
|
584
584
|
console.log('Code analysis accepted event received, adding to events list for troubleshooting');
|
|
585
585
|
this.addEvent({ type: 'code', subtype: 'analysis:accepted', timestamp: new Date().toISOString(), data });
|
|
586
586
|
});
|
|
587
|
-
|
|
587
|
+
|
|
588
588
|
this.socket.on('code:analysis:start', (data) => {
|
|
589
589
|
// Add to events list for troubleshooting
|
|
590
590
|
console.log('Code analysis start event received, adding to events list for troubleshooting');
|
|
591
591
|
this.addEvent({ type: 'code', subtype: 'analysis:start', timestamp: new Date().toISOString(), data });
|
|
592
592
|
});
|
|
593
|
-
|
|
593
|
+
|
|
594
594
|
this.socket.on('code:analysis:complete', (data) => {
|
|
595
595
|
// Add to events list for troubleshooting
|
|
596
596
|
console.log('Code analysis complete event received, adding to events list for troubleshooting');
|
|
597
597
|
this.addEvent({ type: 'code', subtype: 'analysis:complete', timestamp: new Date().toISOString(), data });
|
|
598
598
|
});
|
|
599
|
-
|
|
599
|
+
|
|
600
600
|
this.socket.on('code:analysis:error', (data) => {
|
|
601
601
|
// Add to events list for troubleshooting
|
|
602
602
|
console.log('Code analysis error event received, adding to events list for troubleshooting');
|
|
603
603
|
this.addEvent({ type: 'code', subtype: 'analysis:error', timestamp: new Date().toISOString(), data });
|
|
604
604
|
});
|
|
605
|
-
|
|
605
|
+
|
|
606
606
|
this.socket.on('code:file:start', (data) => {
|
|
607
607
|
// Add to events list for troubleshooting
|
|
608
608
|
console.log('Code file start event received, adding to events list for troubleshooting');
|
|
609
609
|
this.addEvent({ type: 'code', subtype: 'file:start', timestamp: new Date().toISOString(), data });
|
|
610
610
|
});
|
|
611
|
-
|
|
611
|
+
|
|
612
612
|
this.socket.on('code:node:found', (data) => {
|
|
613
613
|
// Add to events list for troubleshooting
|
|
614
614
|
console.log('Code node found event received, adding to events list for troubleshooting');
|
|
615
615
|
this.addEvent({ type: 'code', subtype: 'node:found', timestamp: new Date().toISOString(), data });
|
|
616
616
|
});
|
|
617
|
-
|
|
617
|
+
|
|
618
618
|
this.socket.on('code:analysis:progress', (data) => {
|
|
619
619
|
// Add to events list for troubleshooting
|
|
620
620
|
console.log('Code analysis progress event received, adding to events list for troubleshooting');
|
|
@@ -633,6 +633,15 @@ class SocketClient {
|
|
|
633
633
|
});
|
|
634
634
|
this.notifyEventUpdate();
|
|
635
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
|
+
}));
|
|
636
645
|
} else if (Array.isArray(data)) {
|
|
637
646
|
// Handle legacy format for backward compatibility
|
|
638
647
|
console.log('Received legacy event history format:', data.length, 'events');
|
|
@@ -641,6 +650,14 @@ class SocketClient {
|
|
|
641
650
|
this.addEvent(transformedEvent, false);
|
|
642
651
|
});
|
|
643
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
|
+
}));
|
|
644
661
|
}
|
|
645
662
|
});
|
|
646
663
|
|
|
@@ -675,15 +692,15 @@ class SocketClient {
|
|
|
675
692
|
* @param {Object} options - Options for retry behavior
|
|
676
693
|
*/
|
|
677
694
|
emitWithRetry(event, data = null, options = {}) {
|
|
678
|
-
const {
|
|
695
|
+
const {
|
|
679
696
|
maxRetries = 3,
|
|
680
697
|
retryDelays = [1000, 2000, 4000],
|
|
681
698
|
onSuccess = null,
|
|
682
699
|
onFailure = null
|
|
683
700
|
} = options;
|
|
684
|
-
|
|
701
|
+
|
|
685
702
|
const emissionId = `${event}_${Date.now()}_${Math.random()}`;
|
|
686
|
-
|
|
703
|
+
|
|
687
704
|
const attemptEmission = (attemptNum = 0) => {
|
|
688
705
|
if (!this.socket || !this.socket.connected) {
|
|
689
706
|
// Queue for later if disconnected
|
|
@@ -694,24 +711,24 @@ class SocketClient {
|
|
|
694
711
|
}
|
|
695
712
|
return;
|
|
696
713
|
}
|
|
697
|
-
|
|
714
|
+
|
|
698
715
|
try {
|
|
699
716
|
// Attempt emission
|
|
700
717
|
this.socket.emit(event, data);
|
|
701
718
|
console.log(`Emitted ${event} successfully`);
|
|
702
|
-
|
|
719
|
+
|
|
703
720
|
// Remove from pending
|
|
704
721
|
this.pendingEmissions.delete(emissionId);
|
|
705
|
-
|
|
722
|
+
|
|
706
723
|
if (onSuccess) onSuccess();
|
|
707
|
-
|
|
724
|
+
|
|
708
725
|
} catch (error) {
|
|
709
726
|
console.error(`Failed to emit ${event} (attempt ${attemptNum + 1}):`, error);
|
|
710
|
-
|
|
727
|
+
|
|
711
728
|
if (attemptNum < maxRetries - 1) {
|
|
712
729
|
const delay = retryDelays[attemptNum] || retryDelays[retryDelays.length - 1];
|
|
713
730
|
console.log(`Retrying ${event} in ${delay}ms...`);
|
|
714
|
-
|
|
731
|
+
|
|
715
732
|
// Store pending emission
|
|
716
733
|
this.pendingEmissions.set(emissionId, {
|
|
717
734
|
event,
|
|
@@ -719,7 +736,7 @@ class SocketClient {
|
|
|
719
736
|
attemptNum: attemptNum + 1,
|
|
720
737
|
scheduledTime: Date.now() + delay
|
|
721
738
|
});
|
|
722
|
-
|
|
739
|
+
|
|
723
740
|
setTimeout(() => attemptEmission(attemptNum + 1), delay);
|
|
724
741
|
} else {
|
|
725
742
|
console.error(`Failed to emit ${event} after ${maxRetries} attempts`);
|
|
@@ -728,10 +745,10 @@ class SocketClient {
|
|
|
728
745
|
}
|
|
729
746
|
}
|
|
730
747
|
};
|
|
731
|
-
|
|
748
|
+
|
|
732
749
|
attemptEmission();
|
|
733
750
|
}
|
|
734
|
-
|
|
751
|
+
|
|
735
752
|
/**
|
|
736
753
|
* Queue an event for later emission
|
|
737
754
|
* @param {string} event - Event name
|
|
@@ -743,24 +760,24 @@ class SocketClient {
|
|
|
743
760
|
const removed = this.eventQueue.shift();
|
|
744
761
|
console.warn(`Event queue full, dropped oldest event: ${removed.event}`);
|
|
745
762
|
}
|
|
746
|
-
|
|
763
|
+
|
|
747
764
|
this.eventQueue.push({
|
|
748
765
|
event,
|
|
749
766
|
data,
|
|
750
767
|
timestamp: Date.now()
|
|
751
768
|
});
|
|
752
769
|
}
|
|
753
|
-
|
|
770
|
+
|
|
754
771
|
/**
|
|
755
772
|
* Flush queued events after reconnection
|
|
756
773
|
*/
|
|
757
774
|
flushEventQueue() {
|
|
758
775
|
if (this.eventQueue.length === 0) return;
|
|
759
|
-
|
|
776
|
+
|
|
760
777
|
console.log(`Flushing ${this.eventQueue.length} queued events...`);
|
|
761
778
|
const events = [...this.eventQueue];
|
|
762
779
|
this.eventQueue = [];
|
|
763
|
-
|
|
780
|
+
|
|
764
781
|
// Emit each queued event with a small delay between them
|
|
765
782
|
events.forEach((item, index) => {
|
|
766
783
|
setTimeout(() => {
|
|
@@ -771,7 +788,7 @@ class SocketClient {
|
|
|
771
788
|
}, index * 100); // 100ms between each event
|
|
772
789
|
});
|
|
773
790
|
}
|
|
774
|
-
|
|
791
|
+
|
|
775
792
|
/**
|
|
776
793
|
* Schedule a reconnection attempt with exponential backoff
|
|
777
794
|
*/
|
|
@@ -781,13 +798,13 @@ class SocketClient {
|
|
|
781
798
|
this.notifyConnectionStatus('Reconnection failed', 'disconnected');
|
|
782
799
|
return;
|
|
783
800
|
}
|
|
784
|
-
|
|
801
|
+
|
|
785
802
|
const delay = this.retryDelays[this.retryAttempts] || this.retryDelays[this.retryDelays.length - 1];
|
|
786
803
|
this.retryAttempts++;
|
|
787
|
-
|
|
804
|
+
|
|
788
805
|
console.log(`Scheduling reconnect attempt ${this.retryAttempts}/${this.maxRetryAttempts} in ${delay}ms...`);
|
|
789
806
|
this.notifyConnectionStatus(`Reconnecting in ${delay/1000}s...`, 'connecting');
|
|
790
|
-
|
|
807
|
+
|
|
791
808
|
setTimeout(() => {
|
|
792
809
|
if (!this.isConnected && this.port) {
|
|
793
810
|
console.log(`Attempting reconnection ${this.retryAttempts}/${this.maxRetryAttempts}...`);
|
|
@@ -795,7 +812,7 @@ class SocketClient {
|
|
|
795
812
|
}
|
|
796
813
|
}, delay);
|
|
797
814
|
}
|
|
798
|
-
|
|
815
|
+
|
|
799
816
|
/**
|
|
800
817
|
* Request server status
|
|
801
818
|
*/
|
|
@@ -866,7 +883,7 @@ class SocketClient {
|
|
|
866
883
|
const session = this.sessions.get(sessionId);
|
|
867
884
|
session.lastActivity = eventData.timestamp;
|
|
868
885
|
session.eventCount++;
|
|
869
|
-
|
|
886
|
+
|
|
870
887
|
// Extract working directory from event data if available (prioritize newer data)
|
|
871
888
|
// Check multiple possible locations for working directory
|
|
872
889
|
const possiblePaths = [
|
|
@@ -881,7 +898,7 @@ class SocketClient {
|
|
|
881
898
|
eventData.working_directory,
|
|
882
899
|
eventData.working_dir
|
|
883
900
|
];
|
|
884
|
-
|
|
901
|
+
|
|
885
902
|
for (const path of possiblePaths) {
|
|
886
903
|
if (path && typeof path === 'string' && path.trim()) {
|
|
887
904
|
session.working_directory = path;
|
|
@@ -889,7 +906,7 @@ class SocketClient {
|
|
|
889
906
|
break;
|
|
890
907
|
}
|
|
891
908
|
}
|
|
892
|
-
|
|
909
|
+
|
|
893
910
|
// Extract git branch if available
|
|
894
911
|
if (eventData.data.git_branch) {
|
|
895
912
|
session.git_branch = eventData.data.git_branch;
|
|
@@ -1065,10 +1082,10 @@ class SocketClient {
|
|
|
1065
1082
|
console.warn('Event data is not an object:', eventData);
|
|
1066
1083
|
return null;
|
|
1067
1084
|
}
|
|
1068
|
-
|
|
1085
|
+
|
|
1069
1086
|
// Make a copy to avoid modifying the original
|
|
1070
1087
|
const validated = { ...eventData };
|
|
1071
|
-
|
|
1088
|
+
|
|
1072
1089
|
// Check and provide defaults for required fields
|
|
1073
1090
|
if (!validated.source) {
|
|
1074
1091
|
validated.source = 'system'; // Default source for backward compatibility
|
|
@@ -1090,16 +1107,16 @@ class SocketClient {
|
|
|
1090
1107
|
if (!validated.data) {
|
|
1091
1108
|
validated.data = {};
|
|
1092
1109
|
}
|
|
1093
|
-
|
|
1110
|
+
|
|
1094
1111
|
// Ensure data field is an object
|
|
1095
1112
|
if (validated.data && typeof validated.data !== 'object') {
|
|
1096
1113
|
validated.data = { value: validated.data };
|
|
1097
1114
|
}
|
|
1098
|
-
|
|
1115
|
+
|
|
1099
1116
|
console.log('Validated event:', validated);
|
|
1100
1117
|
return validated;
|
|
1101
1118
|
}
|
|
1102
|
-
|
|
1119
|
+
|
|
1103
1120
|
/**
|
|
1104
1121
|
* Transform received event to match expected dashboard format
|
|
1105
1122
|
* @param {Object} eventData - Raw event data from server
|
|
@@ -1120,8 +1137,8 @@ class SocketClient {
|
|
|
1120
1137
|
|
|
1121
1138
|
// Check if event is already normalized (has both type and subtype as separate fields)
|
|
1122
1139
|
// This prevents double-transformation of events that were normalized on the backend
|
|
1123
|
-
const isAlreadyNormalized = eventData.type && eventData.subtype &&
|
|
1124
|
-
!eventData.type.includes('.') &&
|
|
1140
|
+
const isAlreadyNormalized = eventData.type && eventData.subtype &&
|
|
1141
|
+
!eventData.type.includes('.') &&
|
|
1125
1142
|
!eventData.type.includes(':');
|
|
1126
1143
|
|
|
1127
1144
|
if (isAlreadyNormalized) {
|
|
@@ -1140,7 +1157,7 @@ class SocketClient {
|
|
|
1140
1157
|
else if (!eventData.type && eventData.event) {
|
|
1141
1158
|
// Map common event names to proper type/subtype
|
|
1142
1159
|
const eventName = eventData.event;
|
|
1143
|
-
|
|
1160
|
+
|
|
1144
1161
|
// Check for known event patterns
|
|
1145
1162
|
if (eventName === 'TestStart' || eventName === 'TestEnd') {
|
|
1146
1163
|
transformedEvent.type = 'test';
|
|
@@ -1159,13 +1176,13 @@ class SocketClient {
|
|
|
1159
1176
|
// Use 'unknown' for type and the actual eventName for subtype
|
|
1160
1177
|
transformedEvent.type = 'unknown';
|
|
1161
1178
|
transformedEvent.subtype = eventName.toLowerCase();
|
|
1162
|
-
|
|
1179
|
+
|
|
1163
1180
|
// Prevent duplicate type/subtype values
|
|
1164
1181
|
if (transformedEvent.type === transformedEvent.subtype) {
|
|
1165
1182
|
transformedEvent.subtype = 'event';
|
|
1166
1183
|
}
|
|
1167
1184
|
}
|
|
1168
|
-
|
|
1185
|
+
|
|
1169
1186
|
// Remove the 'event' field to avoid confusion
|
|
1170
1187
|
delete transformedEvent.event;
|
|
1171
1188
|
// Store original event name for display purposes
|
|
@@ -1174,7 +1191,7 @@ class SocketClient {
|
|
|
1174
1191
|
// Handle standard format with 'type' field that needs transformation
|
|
1175
1192
|
else if (eventData.type) {
|
|
1176
1193
|
const type = eventData.type;
|
|
1177
|
-
|
|
1194
|
+
|
|
1178
1195
|
// Transform 'hook.subtype' format to separate type and subtype
|
|
1179
1196
|
if (type.startsWith('hook.')) {
|
|
1180
1197
|
const subtype = type.substring(5); // Remove 'hook.' prefix
|
|
@@ -1224,7 +1241,7 @@ class SocketClient {
|
|
|
1224
1241
|
if (eventData.data && typeof eventData.data === 'object') {
|
|
1225
1242
|
// Protected fields that should never be overwritten by data fields
|
|
1226
1243
|
const protectedFields = ['type', 'subtype', 'timestamp', 'id', 'event', 'event_type', 'originalEventName'];
|
|
1227
|
-
|
|
1244
|
+
|
|
1228
1245
|
// Copy all data fields to the top level, except protected ones
|
|
1229
1246
|
Object.keys(eventData.data).forEach(key => {
|
|
1230
1247
|
// Only copy if not a protected field
|
|
@@ -1245,7 +1262,7 @@ class SocketClient {
|
|
|
1245
1262
|
}
|
|
1246
1263
|
}
|
|
1247
1264
|
});
|
|
1248
|
-
|
|
1265
|
+
|
|
1249
1266
|
// Keep the original data object for backward compatibility
|
|
1250
1267
|
transformedEvent.data = eventData.data;
|
|
1251
1268
|
}
|
|
@@ -1290,7 +1307,7 @@ class SocketClient {
|
|
|
1290
1307
|
has_data: !!transformedEvent.data,
|
|
1291
1308
|
keys: Object.keys(transformedEvent).filter(k => k !== 'data')
|
|
1292
1309
|
});
|
|
1293
|
-
|
|
1310
|
+
|
|
1294
1311
|
// Extra debug logging for file-related tools
|
|
1295
1312
|
const fileTools = ['Read', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit'];
|
|
1296
1313
|
if (fileTools.includes(transformedEvent.tool_name)) {
|
|
@@ -1327,10 +1344,10 @@ class SocketClient {
|
|
|
1327
1344
|
this.healthCheckInterval = setInterval(() => {
|
|
1328
1345
|
if (this.isConnected && this.lastPingTime) {
|
|
1329
1346
|
const timeSinceLastPing = Date.now() - this.lastPingTime;
|
|
1330
|
-
|
|
1347
|
+
|
|
1331
1348
|
if (timeSinceLastPing > this.pingTimeout) {
|
|
1332
1349
|
console.warn(`No ping from server for ${timeSinceLastPing/1000}s, connection may be stale`);
|
|
1333
|
-
|
|
1350
|
+
|
|
1334
1351
|
// Force reconnection
|
|
1335
1352
|
if (this.socket) {
|
|
1336
1353
|
console.log('Forcing reconnection due to stale connection...');
|
|
@@ -1345,7 +1362,7 @@ class SocketClient {
|
|
|
1345
1362
|
}
|
|
1346
1363
|
}, 10000); // Check every 10 seconds
|
|
1347
1364
|
}
|
|
1348
|
-
|
|
1365
|
+
|
|
1349
1366
|
/**
|
|
1350
1367
|
* Stop health monitoring
|
|
1351
1368
|
*/
|
|
@@ -1355,7 +1372,7 @@ class SocketClient {
|
|
|
1355
1372
|
this.healthCheckInterval = null;
|
|
1356
1373
|
}
|
|
1357
1374
|
}
|
|
1358
|
-
|
|
1375
|
+
|
|
1359
1376
|
/**
|
|
1360
1377
|
* Start periodic status check as fallback mechanism
|
|
1361
1378
|
* This ensures the UI stays in sync with actual socket state
|
|
@@ -1432,7 +1449,7 @@ class SocketClient {
|
|
|
1432
1449
|
this.eventQueue = [];
|
|
1433
1450
|
this.pendingEmissions.clear();
|
|
1434
1451
|
}
|
|
1435
|
-
|
|
1452
|
+
|
|
1436
1453
|
/**
|
|
1437
1454
|
* Get connection metrics
|
|
1438
1455
|
* @returns {Object} Connection metrics
|