claude-mpm 4.1.6__py3-none-any.whl → 4.24.0__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/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 +431 -214
- 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/MEMORY.md +3 -0
- claude_mpm/agents/OUTPUT_STYLE.md +335 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -187
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/agents_metadata.py +57 -0
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent_loader.py +11 -9
- claude_mpm/agents/frontmatter_validator.py +291 -251
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +267 -18
- claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
- claude_mpm/agents/templates/api_qa.json +16 -4
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +235 -0
- claude_mpm/agents/templates/code_analyzer.json +25 -9
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +307 -0
- claude_mpm/agents/templates/data_engineer.json +87 -14
- claude_mpm/agents/templates/documentation.json +76 -13
- claude_mpm/agents/templates/engineer.json +44 -10
- claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +5 -2
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/local_ops_agent.json +1840 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
- claude_mpm/agents/templates/memory_manager.json +6 -3
- claude_mpm/agents/templates/nextjs_engineer.json +285 -0
- claude_mpm/agents/templates/ops.json +27 -8
- claude_mpm/agents/templates/php-engineer.json +287 -0
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +262 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +19 -5
- claude_mpm/agents/templates/prompt-engineer.json +737 -0
- claude_mpm/agents/templates/python_engineer.json +387 -0
- claude_mpm/agents/templates/qa.json +26 -6
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +47 -22
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +280 -0
- claude_mpm/agents/templates/rust_engineer.json +275 -0
- claude_mpm/agents/templates/security.json +59 -10
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +16 -7
- claude_mpm/agents/templates/typescript_engineer.json +285 -0
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
- claude_mpm/agents/templates/version_control.json +16 -4
- claude_mpm/agents/templates/web_qa.json +243 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -363
- claude_mpm/cli/commands/__init__.py +8 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +722 -150
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +10 -6
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +488 -884
- 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 +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +43 -7
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +537 -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 +168 -617
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -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 +195 -0
- claude_mpm/cli/commands/run.py +169 -42
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skills.py +488 -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 +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +962 -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/agents_parser.py +116 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +187 -3
- claude_mpm/cli/parsers/configure_parser.py +34 -15
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -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 +562 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +53 -2
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +122 -0
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +141 -0
- claude_mpm/commands/mpm-doctor.md +24 -0
- claude_mpm/commands/mpm-help.md +290 -0
- claude_mpm/commands/mpm-init.md +521 -0
- claude_mpm/commands/mpm-monitor.md +409 -0
- claude_mpm/commands/mpm-organize.md +295 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-status.md +75 -0
- claude_mpm/commands/mpm-tickets.md +151 -0
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +21 -0
- claude_mpm/config/agent_config.py +4 -4
- 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/socketio_config.py +36 -7
- claude_mpm/constants.py +27 -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 +19 -8
- claude_mpm/core/config.py +103 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +65 -0
- 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 +38 -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 +223 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +161 -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 +323 -1491
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +55 -8
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +100 -28
- claude_mpm/core/logger.py +19 -14
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +51 -7
- 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 +118 -15
- 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/socketio_pool.py +15 -15
- 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 +116 -12
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/analysis_runner.py +455 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/activity.css +1958 -0
- claude_mpm/dashboard/static/css/dashboard.css +1413 -72
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +635 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +1871 -0
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +23 -13
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -107
- claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
- 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 +30 -10
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +68 -205
- claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
- claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
- claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
- claude_mpm/dashboard/static/js/connection-manager.js +1 -1
- claude_mpm/dashboard/static/js/dashboard.js +523 -622
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/js/shared/logger.js +385 -0
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/js/socket-client.js +549 -62
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +698 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -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/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +267 -9
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +4 -2
- 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/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
- claude_mpm/hooks/claude_hooks/hook_handler.py +209 -25
- claude_mpm/hooks/claude_hooks/installer.py +783 -0
- 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/connection_manager.py +64 -49
- 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 +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -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 +183 -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/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/claude-hook-handler.sh +187 -0
- 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 +156 -396
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +13 -11
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
- claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
- 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 +4 -2
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +5 -6
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- 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/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 +134 -38
- 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 +9 -6
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- 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/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 +2 -2
- claude_mpm/services/agents/local_template_manager.py +744 -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 +7 -7
- 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/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +6 -5
- claude_mpm/services/cli/agent_dependency_service.py +1 -1
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +6 -5
- 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 -21
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +17 -9
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/cache_manager.py +1 -3
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -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 +79 -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 +37 -18
- claude_mpm/services/core/service_container.py +2 -2
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +4 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
- 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 +22 -24
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +275 -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 +152 -13
- 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/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/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 +12 -12
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- 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/monitoring.py +12 -12
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +165 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -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 +430 -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 +1612 -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 +23 -4
- 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 +585 -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 +4 -4
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
- 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 +551 -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 +729 -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 +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +671 -0
- claude_mpm/services/monitor/daemon_manager.py +963 -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 +2 -2
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +6 -6
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +8 -8
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +553 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +3 -3
- claude_mpm/services/project/metrics_collector.py +7 -10
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +581 -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 +1 -0
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +7 -5
- 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/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +74 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -0
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +8 -8
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -0
- 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 +131 -68
- claude_mpm/services/socketio/server/core.py +275 -22
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +99 -29
- 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 +2 -2
- 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 +903 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -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 +475 -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 +470 -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 +8 -4
- 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 +19 -0
- claude_mpm/services/visualization/mermaid_generator.py +938 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +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/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/agent_dependency_loader.py +108 -27
- 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 +2 -2
- 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/log_cleanup.py +627 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/robust_installer.py +133 -24
- claude_mpm/utils/session_logging.py +2 -2
- 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-4.24.0.dist-info/METADATA +675 -0
- claude_mpm-4.24.0.dist-info/RECORD +1018 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -237
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/agent-manager.md +0 -304
- claude_mpm/cli/commands/configure_tui.py +0 -1921
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- 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_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 -424
- claude_mpm/services/cli/socketio_manager.py +0 -498
- 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-4.1.6.dist-info/METADATA +0 -325
- claude_mpm-4.1.6.dist-info/RECORD +0 -550
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -1,74 +1,303 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Socket.IO Client for Claude MPM Dashboard
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* This module provides real-time WebSocket communication between the Claude MPM dashboard
|
|
5
|
+
* and the backend Socket.IO server. It handles connection management, event processing,
|
|
6
|
+
* retry logic, and health monitoring.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* - Maintains persistent WebSocket connection to Claude MPM backend
|
|
10
|
+
* - Implements robust retry logic with exponential backoff
|
|
11
|
+
* - Provides event queuing during disconnections
|
|
12
|
+
* - Validates event schemas for data integrity
|
|
13
|
+
* - Monitors connection health with ping/pong mechanisms
|
|
14
|
+
*
|
|
15
|
+
* Event Flow:
|
|
16
|
+
* 1. Events from Claude Code hooks → Socket.IO server → Dashboard client
|
|
17
|
+
* 2. Dashboard requests → Socket.IO server → Backend services
|
|
18
|
+
* 3. Status updates → Socket.IO server → All connected clients
|
|
19
|
+
*
|
|
20
|
+
* Thread Safety:
|
|
21
|
+
* - Single-threaded JavaScript execution model ensures safety
|
|
22
|
+
* - Event callbacks are queued and executed sequentially
|
|
23
|
+
* - Connection state changes are atomic
|
|
24
|
+
*
|
|
25
|
+
* Performance Considerations:
|
|
26
|
+
* - Event queue limited to 100 items to prevent memory leaks
|
|
27
|
+
* - Health checks run every 45s to match server ping interval
|
|
28
|
+
* - Exponential backoff prevents connection spam
|
|
29
|
+
* - Lazy event validation reduces overhead
|
|
30
|
+
*
|
|
31
|
+
* Security:
|
|
32
|
+
* - Connects only to localhost to prevent external access
|
|
33
|
+
* - Event schema validation prevents malformed data processing
|
|
34
|
+
* - Connection timeout prevents hanging connections
|
|
35
|
+
*
|
|
36
|
+
* @author Claude MPM Team
|
|
37
|
+
* @version 1.0
|
|
38
|
+
* @since v4.0.25
|
|
4
39
|
*/
|
|
5
40
|
|
|
6
41
|
// Access the global io from window object in ES6 module context
|
|
42
|
+
// WHY: Socket.IO is loaded via CDN in HTML, available as window.io
|
|
7
43
|
const io = window.io;
|
|
8
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Primary Socket.IO client for dashboard communication.
|
|
47
|
+
*
|
|
48
|
+
* Manages WebSocket connection lifecycle, event processing, and error handling.
|
|
49
|
+
* Implements connection resilience with automatic retry and health monitoring.
|
|
50
|
+
*
|
|
51
|
+
* Key Features:
|
|
52
|
+
* - Automatic connection retry with exponential backoff
|
|
53
|
+
* - Event queue management during disconnections
|
|
54
|
+
* - Schema validation for incoming events
|
|
55
|
+
* - Health monitoring with ping/pong
|
|
56
|
+
* - Session management and event history
|
|
57
|
+
*
|
|
58
|
+
* Connection States:
|
|
59
|
+
* - isConnected: Currently connected to server
|
|
60
|
+
* - isConnecting: Connection attempt in progress
|
|
61
|
+
* - disconnectTime: Timestamp of last disconnection
|
|
62
|
+
*
|
|
63
|
+
* Event Processing:
|
|
64
|
+
* - Validates against schema before processing
|
|
65
|
+
* - Queues events during disconnection (max 100)
|
|
66
|
+
* - Maintains event history and session tracking
|
|
67
|
+
*
|
|
68
|
+
* @class SocketClient
|
|
69
|
+
*/
|
|
9
70
|
class SocketClient {
|
|
71
|
+
/**
|
|
72
|
+
* Initialize Socket.IO client with default configuration.
|
|
73
|
+
*
|
|
74
|
+
* Sets up connection management, event processing, and health monitoring.
|
|
75
|
+
* Configures retry logic and event queue management.
|
|
76
|
+
*
|
|
77
|
+
* WHY this initialization approach:
|
|
78
|
+
* - Lazy socket creation allows for port specification
|
|
79
|
+
* - Event queue prevents data loss during reconnections
|
|
80
|
+
* - Health monitoring detects server issues early
|
|
81
|
+
* - Schema validation ensures data integrity
|
|
82
|
+
*
|
|
83
|
+
* @constructor
|
|
84
|
+
*/
|
|
10
85
|
constructor() {
|
|
86
|
+
/**
|
|
87
|
+
* Socket.IO connection instance.
|
|
88
|
+
* @type {Socket|null}
|
|
89
|
+
* @private
|
|
90
|
+
*/
|
|
11
91
|
this.socket = null;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Current connection port.
|
|
95
|
+
* @type {string|null}
|
|
96
|
+
* @private
|
|
97
|
+
*/
|
|
12
98
|
this.port = null; // Store the current port
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Event callback registry for connection lifecycle events.
|
|
102
|
+
* WHY: Allows multiple components to register for connection events.
|
|
103
|
+
* @type {Object.<string, Function[]>}
|
|
104
|
+
* @private
|
|
105
|
+
*/
|
|
13
106
|
this.connectionCallbacks = {
|
|
14
|
-
connect: [],
|
|
15
|
-
disconnect: [],
|
|
16
|
-
error: [],
|
|
17
|
-
event: []
|
|
107
|
+
connect: [], // Called on successful connection
|
|
108
|
+
disconnect: [], // Called on disconnection
|
|
109
|
+
error: [], // Called on connection errors
|
|
110
|
+
event: [] // Called on incoming events
|
|
18
111
|
};
|
|
19
112
|
|
|
20
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Event schema definition for validation.
|
|
115
|
+
* WHY: Ensures data integrity and prevents processing malformed events.
|
|
116
|
+
* @type {Object}
|
|
117
|
+
* @private
|
|
118
|
+
*/
|
|
21
119
|
this.eventSchema = {
|
|
22
120
|
required: ['source', 'type', 'subtype', 'timestamp', 'data'],
|
|
23
121
|
optional: ['event', 'session_id']
|
|
24
122
|
};
|
|
25
123
|
|
|
26
|
-
|
|
124
|
+
/**
|
|
125
|
+
* Current connection state.
|
|
126
|
+
* @type {boolean}
|
|
127
|
+
* @private
|
|
128
|
+
*/
|
|
27
129
|
this.isConnected = false;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Connection attempt in progress flag.
|
|
133
|
+
* WHY: Prevents multiple simultaneous connection attempts.
|
|
134
|
+
* @type {boolean}
|
|
135
|
+
* @private
|
|
136
|
+
*/
|
|
28
137
|
this.isConnecting = false;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Timestamp of last successful connection.
|
|
141
|
+
* @type {number|null}
|
|
142
|
+
* @private
|
|
143
|
+
*/
|
|
29
144
|
this.lastConnectTime = null;
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Timestamp of last disconnection.
|
|
148
|
+
* WHY: Used to calculate downtime and trigger reconnection logic.
|
|
149
|
+
* @type {number|null}
|
|
150
|
+
* @private
|
|
151
|
+
*/
|
|
30
152
|
this.disconnectTime = null;
|
|
31
153
|
|
|
32
|
-
|
|
154
|
+
/**
|
|
155
|
+
* Event history storage.
|
|
156
|
+
* WHY: Maintains event history for dashboard display and analysis.
|
|
157
|
+
* @type {Array.<Object>}
|
|
158
|
+
* @private
|
|
159
|
+
*/
|
|
33
160
|
this.events = [];
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Session tracking map.
|
|
164
|
+
* WHY: Groups events by session for better organization.
|
|
165
|
+
* @type {Map<string, Object>}
|
|
166
|
+
* @private
|
|
167
|
+
*/
|
|
34
168
|
this.sessions = new Map();
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Current active session identifier.
|
|
172
|
+
* @type {string|null}
|
|
173
|
+
* @private
|
|
174
|
+
*/
|
|
35
175
|
this.currentSessionId = null;
|
|
36
176
|
|
|
37
|
-
|
|
177
|
+
/**
|
|
178
|
+
* Event queue for disconnection periods.
|
|
179
|
+
* WHY: Prevents event loss during temporary disconnections.
|
|
180
|
+
* @type {Array.<Object>}
|
|
181
|
+
* @private
|
|
182
|
+
*/
|
|
38
183
|
this.eventQueue = [];
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Maximum queue size to prevent memory leaks.
|
|
187
|
+
* WHY: Limits memory usage during extended disconnections.
|
|
188
|
+
* @type {number}
|
|
189
|
+
* @private
|
|
190
|
+
* @const
|
|
191
|
+
*/
|
|
39
192
|
this.maxQueueSize = 100;
|
|
40
193
|
|
|
41
|
-
|
|
194
|
+
/**
|
|
195
|
+
* Current retry attempt counter.
|
|
196
|
+
* WHY: Tracks retry attempts for exponential backoff logic.
|
|
197
|
+
* @type {number}
|
|
198
|
+
* @private
|
|
199
|
+
*/
|
|
42
200
|
this.retryAttempts = 0;
|
|
43
|
-
|
|
44
|
-
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Maximum retry attempts before giving up.
|
|
204
|
+
* WHY: Prevents infinite retry loops that could impact performance.
|
|
205
|
+
* @type {number}
|
|
206
|
+
* @private
|
|
207
|
+
* @const
|
|
208
|
+
*/
|
|
209
|
+
this.maxRetryAttempts = 5; // Increased from 3 to 5 for better stability
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Retry delay intervals in milliseconds (exponential backoff).
|
|
213
|
+
* WHY: Prevents server overload during connection issues.
|
|
214
|
+
* @type {number[]}
|
|
215
|
+
* @private
|
|
216
|
+
* @const
|
|
217
|
+
*/
|
|
218
|
+
this.retryDelays = [1000, 2000, 3000, 4000, 5000]; // Exponential backoff with 5 attempts
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Map of pending emissions for retry logic.
|
|
222
|
+
* WHY: Tracks failed emissions that need to be retried.
|
|
223
|
+
* @type {Map<string, Object>}
|
|
224
|
+
* @private
|
|
225
|
+
*/
|
|
45
226
|
this.pendingEmissions = new Map(); // Track pending emissions for retry
|
|
46
227
|
|
|
47
|
-
|
|
228
|
+
/**
|
|
229
|
+
* Timestamp of last ping sent to server.
|
|
230
|
+
* WHY: Used for health monitoring and connection validation.
|
|
231
|
+
* @type {number|null}
|
|
232
|
+
* @private
|
|
233
|
+
*/
|
|
48
234
|
this.lastPingTime = null;
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Timestamp of last pong received from server.
|
|
238
|
+
* WHY: Confirms server is responsive and connection is healthy.
|
|
239
|
+
* @type {number|null}
|
|
240
|
+
* @private
|
|
241
|
+
*/
|
|
49
242
|
this.lastPongTime = null;
|
|
50
|
-
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Health check timeout in milliseconds.
|
|
246
|
+
* WHY: More lenient than Socket.IO timeout to prevent false positives.
|
|
247
|
+
* @type {number}
|
|
248
|
+
* @private
|
|
249
|
+
* @const
|
|
250
|
+
*/
|
|
251
|
+
this.pingTimeout = 120000; // 120 seconds for health check (more lenient for stability)
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Health check interval timer.
|
|
255
|
+
* @type {number|null}
|
|
256
|
+
* @private
|
|
257
|
+
*/
|
|
51
258
|
this.healthCheckInterval = null;
|
|
52
259
|
|
|
53
|
-
//
|
|
260
|
+
// Initialize background monitoring
|
|
54
261
|
this.startStatusCheckFallback();
|
|
55
262
|
this.startHealthMonitoring();
|
|
56
263
|
}
|
|
57
264
|
|
|
58
265
|
/**
|
|
59
|
-
* Connect to Socket.IO server
|
|
60
|
-
*
|
|
266
|
+
* Connect to Socket.IO server on specified port.
|
|
267
|
+
*
|
|
268
|
+
* Initiates WebSocket connection to the Claude MPM Socket.IO server.
|
|
269
|
+
* Handles connection conflicts and ensures clean state transitions.
|
|
270
|
+
*
|
|
271
|
+
* Connection Process:
|
|
272
|
+
* 1. Validates port and constructs localhost URL
|
|
273
|
+
* 2. Checks for existing connections and cleans up if needed
|
|
274
|
+
* 3. Delegates to doConnect() for actual connection logic
|
|
275
|
+
*
|
|
276
|
+
* Thread Safety:
|
|
277
|
+
* - Uses setTimeout for async cleanup to prevent race conditions
|
|
278
|
+
* - Connection state flags prevent multiple simultaneous attempts
|
|
279
|
+
*
|
|
280
|
+
* @param {string} [port='8765'] - Port number to connect to (defaults to 8765)
|
|
281
|
+
*
|
|
282
|
+
* @throws {Error} If Socket.IO library is not loaded
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* // Connect to default port
|
|
286
|
+
* socketClient.connect();
|
|
287
|
+
*
|
|
288
|
+
* // Connect to specific port
|
|
289
|
+
* socketClient.connect('8766');
|
|
61
290
|
*/
|
|
62
291
|
connect(port = '8765') {
|
|
63
|
-
// Store the port for later use
|
|
292
|
+
// Store the port for later use in reconnections
|
|
64
293
|
this.port = port;
|
|
65
294
|
const url = `http://localhost:${port}`;
|
|
66
295
|
|
|
67
|
-
//
|
|
296
|
+
// WHY this check: Prevents connection conflicts that can cause memory leaks
|
|
68
297
|
if (this.socket && (this.socket.connected || this.socket.connecting)) {
|
|
69
298
|
console.log('Already connected or connecting, disconnecting first...');
|
|
70
299
|
this.socket.disconnect();
|
|
71
|
-
//
|
|
300
|
+
// WHY 100ms delay: Allows cleanup to complete before new connection
|
|
72
301
|
setTimeout(() => this.doConnect(url), 100);
|
|
73
302
|
return;
|
|
74
303
|
}
|
|
@@ -77,8 +306,28 @@ class SocketClient {
|
|
|
77
306
|
}
|
|
78
307
|
|
|
79
308
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
309
|
+
* Execute the actual Socket.IO connection with full configuration.
|
|
310
|
+
*
|
|
311
|
+
* Creates and configures Socket.IO client with appropriate timeouts,
|
|
312
|
+
* retry logic, and transport settings. Sets up event handlers for
|
|
313
|
+
* connection lifecycle management.
|
|
314
|
+
*
|
|
315
|
+
* Configuration Details:
|
|
316
|
+
* - autoConnect: true - Immediate connection attempt
|
|
317
|
+
* - reconnection: true - Built-in reconnection enabled
|
|
318
|
+
* - pingInterval: 25000ms - Matches server configuration
|
|
319
|
+
* - pingTimeout: 20000ms - Health check timeout
|
|
320
|
+
* - transports: ['websocket', 'polling'] - Fallback options
|
|
321
|
+
*
|
|
322
|
+
* WHY these settings:
|
|
323
|
+
* - Ping intervals must match server to prevent timeouts
|
|
324
|
+
* - Limited reconnection attempts prevent infinite loops
|
|
325
|
+
* - forceNew prevents socket reuse issues
|
|
326
|
+
*
|
|
327
|
+
* @param {string} url - Complete Socket.IO server URL (http://localhost:port)
|
|
328
|
+
* @private
|
|
329
|
+
*
|
|
330
|
+
* @throws {Error} If Socket.IO library is not available
|
|
82
331
|
*/
|
|
83
332
|
doConnect(url) {
|
|
84
333
|
console.log(`Connecting to Socket.IO server at ${url}`);
|
|
@@ -97,13 +346,13 @@ class SocketClient {
|
|
|
97
346
|
autoConnect: true,
|
|
98
347
|
reconnection: true,
|
|
99
348
|
reconnectionDelay: 1000,
|
|
100
|
-
reconnectionDelayMax:
|
|
101
|
-
reconnectionAttempts:
|
|
102
|
-
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
|
|
103
352
|
forceNew: true,
|
|
104
353
|
transports: ['websocket', 'polling'],
|
|
105
|
-
|
|
106
|
-
|
|
354
|
+
// Remove client-side ping configuration - let server control this
|
|
355
|
+
// The server now properly configures: ping_interval=30s, ping_timeout=60s
|
|
107
356
|
});
|
|
108
357
|
|
|
109
358
|
this.setupSocketHandlers();
|
|
@@ -132,6 +381,10 @@ class SocketClient {
|
|
|
132
381
|
|
|
133
382
|
this.notifyConnectionStatus('Connected', 'connected');
|
|
134
383
|
|
|
384
|
+
// Expose socket globally for components that need direct access
|
|
385
|
+
window.socket = this.socket;
|
|
386
|
+
console.log('SocketClient: Exposed socket globally as window.socket');
|
|
387
|
+
|
|
135
388
|
// Emit connect callback
|
|
136
389
|
this.connectionCallbacks.connect.forEach(callback =>
|
|
137
390
|
callback(this.socket.id)
|
|
@@ -143,17 +396,22 @@ class SocketClient {
|
|
|
143
396
|
});
|
|
144
397
|
|
|
145
398
|
this.socket.on('disconnect', (reason) => {
|
|
146
|
-
|
|
399
|
+
// Enhanced logging for debugging disconnection issues
|
|
400
|
+
const disconnectInfo = {
|
|
401
|
+
reason: reason,
|
|
402
|
+
timestamp: new Date().toISOString(),
|
|
403
|
+
wasConnected: this.isConnected,
|
|
404
|
+
uptimeSeconds: this.lastConnectTime ? ((Date.now() - this.lastConnectTime) / 1000).toFixed(1) : 0,
|
|
405
|
+
lastPing: this.lastPingTime ? ((Date.now() - this.lastPingTime) / 1000).toFixed(1) + 's ago' : 'never',
|
|
406
|
+
lastPong: this.lastPongTime ? ((Date.now() - this.lastPongTime) / 1000).toFixed(1) + 's ago' : 'never'
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
console.log('Disconnected from server:', disconnectInfo);
|
|
410
|
+
|
|
147
411
|
this.isConnected = false;
|
|
148
412
|
this.isConnecting = false;
|
|
149
413
|
this.disconnectTime = Date.now();
|
|
150
414
|
|
|
151
|
-
// Calculate uptime
|
|
152
|
-
if (this.lastConnectTime) {
|
|
153
|
-
const uptime = (Date.now() - this.lastConnectTime) / 1000;
|
|
154
|
-
console.log(`Connection uptime was ${uptime.toFixed(1)}s`);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
415
|
this.notifyConnectionStatus(`Disconnected: ${reason}`, 'disconnected');
|
|
158
416
|
|
|
159
417
|
// Emit disconnect callback
|
|
@@ -161,8 +419,21 @@ class SocketClient {
|
|
|
161
419
|
callback(reason)
|
|
162
420
|
);
|
|
163
421
|
|
|
164
|
-
//
|
|
165
|
-
|
|
422
|
+
// Detailed reason analysis for auto-reconnect decision
|
|
423
|
+
const reconnectReasons = [
|
|
424
|
+
'transport close', // Network issue
|
|
425
|
+
'ping timeout', // Server not responding
|
|
426
|
+
'transport error', // Connection error
|
|
427
|
+
'io server disconnect', // Server initiated disconnect (might be restart)
|
|
428
|
+
];
|
|
429
|
+
|
|
430
|
+
if (reconnectReasons.includes(reason)) {
|
|
431
|
+
console.log(`Auto-reconnect triggered for reason: ${reason}`);
|
|
432
|
+
this.scheduleReconnect();
|
|
433
|
+
} else if (reason === 'io client disconnect') {
|
|
434
|
+
console.log('Client-initiated disconnect, not auto-reconnecting');
|
|
435
|
+
} else {
|
|
436
|
+
console.log(`Unknown disconnect reason: ${reason}, attempting reconnect anyway`);
|
|
166
437
|
this.scheduleReconnect();
|
|
167
438
|
}
|
|
168
439
|
});
|
|
@@ -204,6 +475,12 @@ class SocketClient {
|
|
|
204
475
|
return;
|
|
205
476
|
}
|
|
206
477
|
|
|
478
|
+
// Code analysis events are now allowed to flow through to the events list for troubleshooting
|
|
479
|
+
// They will appear in both the Events tab and the Code tab
|
|
480
|
+
if (validatedEvent.type && validatedEvent.type.startsWith('code:')) {
|
|
481
|
+
console.log('Code analysis event received via claude_event, adding to events list for troubleshooting:', validatedEvent.type);
|
|
482
|
+
}
|
|
483
|
+
|
|
207
484
|
// Transform event to match expected format (for backward compatibility)
|
|
208
485
|
const transformedEvent = this.transformEvent(validatedEvent);
|
|
209
486
|
console.log('Transformed event:', transformedEvent);
|
|
@@ -222,6 +499,30 @@ class SocketClient {
|
|
|
222
499
|
});
|
|
223
500
|
});
|
|
224
501
|
|
|
502
|
+
// Track pong responses from server
|
|
503
|
+
this.socket.on('pong', (data) => {
|
|
504
|
+
this.lastPongTime = Date.now();
|
|
505
|
+
// console.log('Received pong from server');
|
|
506
|
+
});
|
|
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
|
+
|
|
225
526
|
// Session and event handlers (legacy/fallback)
|
|
226
527
|
this.socket.on('session.started', (data) => {
|
|
227
528
|
this.addEvent({ type: 'session', subtype: 'started', timestamp: new Date().toISOString(), data });
|
|
@@ -247,13 +548,15 @@ class SocketClient {
|
|
|
247
548
|
this.addEvent({ type: 'agent', subtype: 'executed', timestamp: new Date().toISOString(), data });
|
|
248
549
|
});
|
|
249
550
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
+
// });
|
|
253
556
|
|
|
254
|
-
this.socket.on('hook.post', (data) => {
|
|
255
|
-
|
|
256
|
-
});
|
|
557
|
+
// this.socket.on('hook.post', (data) => {
|
|
558
|
+
// this.addEvent({ type: 'hook', subtype: 'post', timestamp: new Date().toISOString(), data });
|
|
559
|
+
// });
|
|
257
560
|
|
|
258
561
|
this.socket.on('todo.updated', (data) => {
|
|
259
562
|
this.addEvent({ type: 'todo', subtype: 'updated', timestamp: new Date().toISOString(), data });
|
|
@@ -267,6 +570,57 @@ class SocketClient {
|
|
|
267
570
|
this.addEvent({ type: 'log', subtype: 'entry', timestamp: new Date().toISOString(), data });
|
|
268
571
|
});
|
|
269
572
|
|
|
573
|
+
// Code analysis events - now allowed to flow through for troubleshooting
|
|
574
|
+
// These are ALSO handled by the code-tree component and shown in the footer
|
|
575
|
+
// They will appear in both places: Events tab (for troubleshooting) and Code tab (for visualization)
|
|
576
|
+
this.socket.on('code:analysis:queued', (data) => {
|
|
577
|
+
// Add to events list for troubleshooting
|
|
578
|
+
console.log('Code analysis queued event received, adding to events list for troubleshooting');
|
|
579
|
+
this.addEvent({ type: 'code', subtype: 'analysis:queued', timestamp: new Date().toISOString(), data });
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
this.socket.on('code:analysis:accepted', (data) => {
|
|
583
|
+
// Add to events list for troubleshooting
|
|
584
|
+
console.log('Code analysis accepted event received, adding to events list for troubleshooting');
|
|
585
|
+
this.addEvent({ type: 'code', subtype: 'analysis:accepted', timestamp: new Date().toISOString(), data });
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
this.socket.on('code:analysis:start', (data) => {
|
|
589
|
+
// Add to events list for troubleshooting
|
|
590
|
+
console.log('Code analysis start event received, adding to events list for troubleshooting');
|
|
591
|
+
this.addEvent({ type: 'code', subtype: 'analysis:start', timestamp: new Date().toISOString(), data });
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
this.socket.on('code:analysis:complete', (data) => {
|
|
595
|
+
// Add to events list for troubleshooting
|
|
596
|
+
console.log('Code analysis complete event received, adding to events list for troubleshooting');
|
|
597
|
+
this.addEvent({ type: 'code', subtype: 'analysis:complete', timestamp: new Date().toISOString(), data });
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
this.socket.on('code:analysis:error', (data) => {
|
|
601
|
+
// Add to events list for troubleshooting
|
|
602
|
+
console.log('Code analysis error event received, adding to events list for troubleshooting');
|
|
603
|
+
this.addEvent({ type: 'code', subtype: 'analysis:error', timestamp: new Date().toISOString(), data });
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
this.socket.on('code:file:start', (data) => {
|
|
607
|
+
// Add to events list for troubleshooting
|
|
608
|
+
console.log('Code file start event received, adding to events list for troubleshooting');
|
|
609
|
+
this.addEvent({ type: 'code', subtype: 'file:start', timestamp: new Date().toISOString(), data });
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
this.socket.on('code:node:found', (data) => {
|
|
613
|
+
// Add to events list for troubleshooting
|
|
614
|
+
console.log('Code node found event received, adding to events list for troubleshooting');
|
|
615
|
+
this.addEvent({ type: 'code', subtype: 'node:found', timestamp: new Date().toISOString(), data });
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
this.socket.on('code:analysis:progress', (data) => {
|
|
619
|
+
// Add to events list for troubleshooting
|
|
620
|
+
console.log('Code analysis progress event received, adding to events list for troubleshooting');
|
|
621
|
+
this.addEvent({ type: 'code', subtype: 'analysis:progress', timestamp: new Date().toISOString(), data });
|
|
622
|
+
});
|
|
623
|
+
|
|
270
624
|
this.socket.on('history', (data) => {
|
|
271
625
|
console.log('Received event history:', data);
|
|
272
626
|
if (data && Array.isArray(data.events)) {
|
|
@@ -504,12 +858,44 @@ class SocketClient {
|
|
|
504
858
|
id: sessionId,
|
|
505
859
|
startTime: eventData.timestamp,
|
|
506
860
|
lastActivity: eventData.timestamp,
|
|
507
|
-
eventCount: 0
|
|
861
|
+
eventCount: 0,
|
|
862
|
+
working_directory: null,
|
|
863
|
+
git_branch: null
|
|
508
864
|
});
|
|
509
865
|
}
|
|
510
866
|
const session = this.sessions.get(sessionId);
|
|
511
867
|
session.lastActivity = eventData.timestamp;
|
|
512
868
|
session.eventCount++;
|
|
869
|
+
|
|
870
|
+
// Extract working directory from event data if available (prioritize newer data)
|
|
871
|
+
// Check multiple possible locations for working directory
|
|
872
|
+
const possiblePaths = [
|
|
873
|
+
eventData.data.cwd,
|
|
874
|
+
eventData.data.working_directory,
|
|
875
|
+
eventData.data.working_dir,
|
|
876
|
+
eventData.data.workingDirectory,
|
|
877
|
+
eventData.data.instance_info?.working_dir,
|
|
878
|
+
eventData.data.instance_info?.working_directory,
|
|
879
|
+
eventData.data.instance_info?.cwd,
|
|
880
|
+
eventData.cwd,
|
|
881
|
+
eventData.working_directory,
|
|
882
|
+
eventData.working_dir
|
|
883
|
+
];
|
|
884
|
+
|
|
885
|
+
for (const path of possiblePaths) {
|
|
886
|
+
if (path && typeof path === 'string' && path.trim()) {
|
|
887
|
+
session.working_directory = path;
|
|
888
|
+
console.log(`[SOCKET-CLIENT] Found working directory for session ${sessionId}:`, path);
|
|
889
|
+
break;
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
// Extract git branch if available
|
|
894
|
+
if (eventData.data.git_branch) {
|
|
895
|
+
session.git_branch = eventData.data.git_branch;
|
|
896
|
+
} else if (eventData.data.instance_info && eventData.data.instance_info.git_branch) {
|
|
897
|
+
session.git_branch = eventData.data.instance_info.git_branch;
|
|
898
|
+
}
|
|
513
899
|
}
|
|
514
900
|
|
|
515
901
|
if (notify) {
|
|
@@ -580,6 +966,32 @@ class SocketClient {
|
|
|
580
966
|
this.connectionCallbacks.event.push(callback);
|
|
581
967
|
}
|
|
582
968
|
|
|
969
|
+
/**
|
|
970
|
+
* Subscribe to socket events (proxy to underlying socket)
|
|
971
|
+
* @param {string} event - Event name
|
|
972
|
+
* @param {Function} callback - Callback function
|
|
973
|
+
*/
|
|
974
|
+
on(event, callback) {
|
|
975
|
+
if (this.socket) {
|
|
976
|
+
return this.socket.on(event, callback);
|
|
977
|
+
} else {
|
|
978
|
+
console.warn(`Cannot subscribe to '${event}': socket not initialized`);
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
/**
|
|
983
|
+
* Unsubscribe from socket events (proxy to underlying socket)
|
|
984
|
+
* @param {string} event - Event name
|
|
985
|
+
* @param {Function} callback - Callback function (optional)
|
|
986
|
+
*/
|
|
987
|
+
off(event, callback) {
|
|
988
|
+
if (this.socket) {
|
|
989
|
+
return this.socket.off(event, callback);
|
|
990
|
+
} else {
|
|
991
|
+
console.warn(`Cannot unsubscribe from '${event}': socket not initialized`);
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
|
|
583
995
|
/**
|
|
584
996
|
* Notify connection status change
|
|
585
997
|
* @param {string} status - Status message
|
|
@@ -698,6 +1110,7 @@ class SocketClient {
|
|
|
698
1110
|
// 1. Hook events: { type: 'hook.pre_tool', timestamp: '...', data: {...} }
|
|
699
1111
|
// 2. Legacy events: { event: 'TestStart', timestamp: '...', ... }
|
|
700
1112
|
// 3. Standard events: { type: 'session', subtype: 'started', ... }
|
|
1113
|
+
// 4. Normalized events: { type: 'code', subtype: 'progress', ... } - already normalized, keep as-is
|
|
701
1114
|
|
|
702
1115
|
if (!eventData) {
|
|
703
1116
|
return eventData; // Return as-is if null/undefined
|
|
@@ -705,8 +1118,26 @@ class SocketClient {
|
|
|
705
1118
|
|
|
706
1119
|
let transformedEvent = { ...eventData };
|
|
707
1120
|
|
|
1121
|
+
// Check if event is already normalized (has both type and subtype as separate fields)
|
|
1122
|
+
// This prevents double-transformation of events that were normalized on the backend
|
|
1123
|
+
const isAlreadyNormalized = eventData.type && eventData.subtype &&
|
|
1124
|
+
!eventData.type.includes('.') &&
|
|
1125
|
+
!eventData.type.includes(':');
|
|
1126
|
+
|
|
1127
|
+
if (isAlreadyNormalized) {
|
|
1128
|
+
// Event is already properly normalized from backend, just preserve it
|
|
1129
|
+
// Store a composite originalEventName for display if needed
|
|
1130
|
+
if (!transformedEvent.originalEventName) {
|
|
1131
|
+
if (eventData.subtype === 'generic' || eventData.type === eventData.subtype) {
|
|
1132
|
+
transformedEvent.originalEventName = eventData.type;
|
|
1133
|
+
} else {
|
|
1134
|
+
transformedEvent.originalEventName = `${eventData.type}.${eventData.subtype}`;
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
// Return early to avoid further transformation
|
|
1138
|
+
}
|
|
708
1139
|
// Handle legacy format with 'event' field but no 'type'
|
|
709
|
-
if (!eventData.type && eventData.event) {
|
|
1140
|
+
else if (!eventData.type && eventData.event) {
|
|
710
1141
|
// Map common event names to proper type/subtype
|
|
711
1142
|
const eventName = eventData.event;
|
|
712
1143
|
|
|
@@ -737,8 +1168,10 @@ class SocketClient {
|
|
|
737
1168
|
|
|
738
1169
|
// Remove the 'event' field to avoid confusion
|
|
739
1170
|
delete transformedEvent.event;
|
|
1171
|
+
// Store original event name for display purposes
|
|
1172
|
+
transformedEvent.originalEventName = eventName;
|
|
740
1173
|
}
|
|
741
|
-
// Handle standard format with 'type' field
|
|
1174
|
+
// Handle standard format with 'type' field that needs transformation
|
|
742
1175
|
else if (eventData.type) {
|
|
743
1176
|
const type = eventData.type;
|
|
744
1177
|
|
|
@@ -747,25 +1180,43 @@ class SocketClient {
|
|
|
747
1180
|
const subtype = type.substring(5); // Remove 'hook.' prefix
|
|
748
1181
|
transformedEvent.type = 'hook';
|
|
749
1182
|
transformedEvent.subtype = subtype;
|
|
1183
|
+
transformedEvent.originalEventName = type;
|
|
1184
|
+
}
|
|
1185
|
+
// Transform 'code:*' events to proper code type
|
|
1186
|
+
// Handle multi-level subtypes like 'code:analysis:queued'
|
|
1187
|
+
else if (type.startsWith('code:')) {
|
|
1188
|
+
transformedEvent.type = 'code';
|
|
1189
|
+
// Replace colons with underscores in subtype for consistency
|
|
1190
|
+
const subtypePart = type.substring(5); // Remove 'code:' prefix
|
|
1191
|
+
transformedEvent.subtype = subtypePart.replace(/:/g, '_');
|
|
1192
|
+
transformedEvent.originalEventName = type;
|
|
750
1193
|
}
|
|
751
1194
|
// Transform other dotted types like 'session.started' -> type: 'session', subtype: 'started'
|
|
752
1195
|
else if (type.includes('.')) {
|
|
753
1196
|
const [mainType, ...subtypeParts] = type.split('.');
|
|
754
1197
|
transformedEvent.type = mainType;
|
|
755
1198
|
transformedEvent.subtype = subtypeParts.join('.');
|
|
1199
|
+
transformedEvent.originalEventName = type;
|
|
1200
|
+
}
|
|
1201
|
+
// Transform any remaining colon-separated types generically
|
|
1202
|
+
else if (type.includes(':')) {
|
|
1203
|
+
const parts = type.split(':', 2); // Split into max 2 parts
|
|
1204
|
+
transformedEvent.type = parts[0];
|
|
1205
|
+
// Replace any remaining colons with underscores in subtype
|
|
1206
|
+
transformedEvent.subtype = parts.length > 1 ? parts[1].replace(/:/g, '_') : 'generic';
|
|
1207
|
+
transformedEvent.originalEventName = type;
|
|
1208
|
+
}
|
|
1209
|
+
// If type doesn't need transformation but has no subtype, set a default
|
|
1210
|
+
else if (!eventData.subtype) {
|
|
1211
|
+
transformedEvent.subtype = 'generic';
|
|
1212
|
+
transformedEvent.originalEventName = type;
|
|
756
1213
|
}
|
|
757
1214
|
}
|
|
758
1215
|
// If no type and no event field, mark as unknown
|
|
759
1216
|
else {
|
|
760
1217
|
transformedEvent.type = 'unknown';
|
|
761
1218
|
transformedEvent.subtype = '';
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
// Store original event name for display purposes (before any transformation)
|
|
765
|
-
if (!eventData.type && eventData.event) {
|
|
766
|
-
transformedEvent.originalEventName = eventData.event;
|
|
767
|
-
} else if (eventData.type) {
|
|
768
|
-
transformedEvent.originalEventName = eventData.type;
|
|
1219
|
+
transformedEvent.originalEventName = 'unknown';
|
|
769
1220
|
}
|
|
770
1221
|
|
|
771
1222
|
// Extract and flatten data fields to top level for dashboard compatibility
|
|
@@ -787,8 +1238,11 @@ class SocketClient {
|
|
|
787
1238
|
transformedEvent[key] = eventData.data[key];
|
|
788
1239
|
}
|
|
789
1240
|
} else {
|
|
790
|
-
// Log
|
|
791
|
-
|
|
1241
|
+
// Log debug info if data field would overwrite a protected field
|
|
1242
|
+
// Only log for non-timestamp fields to reduce noise
|
|
1243
|
+
if (key !== 'timestamp') {
|
|
1244
|
+
console.debug(`Protected field '${key}' in data object was not copied to top level to preserve event structure`);
|
|
1245
|
+
}
|
|
792
1246
|
}
|
|
793
1247
|
});
|
|
794
1248
|
|
|
@@ -796,11 +1250,40 @@ class SocketClient {
|
|
|
796
1250
|
transformedEvent.data = eventData.data;
|
|
797
1251
|
}
|
|
798
1252
|
|
|
1253
|
+
// Add hook_event_name for ActivityTree compatibility
|
|
1254
|
+
// Map the type/subtype structure to the expected hook_event_name format
|
|
1255
|
+
if (transformedEvent.type === 'hook') {
|
|
1256
|
+
if (transformedEvent.subtype === 'pre_tool') {
|
|
1257
|
+
transformedEvent.hook_event_name = 'PreToolUse';
|
|
1258
|
+
} else if (transformedEvent.subtype === 'post_tool') {
|
|
1259
|
+
transformedEvent.hook_event_name = 'PostToolUse';
|
|
1260
|
+
} else if (transformedEvent.subtype === 'subagent_start') {
|
|
1261
|
+
transformedEvent.hook_event_name = 'SubagentStart';
|
|
1262
|
+
} else if (transformedEvent.subtype === 'subagent_stop') {
|
|
1263
|
+
transformedEvent.hook_event_name = 'SubagentStop';
|
|
1264
|
+
} else if (transformedEvent.subtype === 'todo_write') {
|
|
1265
|
+
transformedEvent.hook_event_name = 'TodoWrite';
|
|
1266
|
+
} else if (transformedEvent.subtype === 'start') {
|
|
1267
|
+
transformedEvent.hook_event_name = 'Start';
|
|
1268
|
+
} else if (transformedEvent.subtype === 'stop') {
|
|
1269
|
+
transformedEvent.hook_event_name = 'Stop';
|
|
1270
|
+
}
|
|
1271
|
+
} else if (transformedEvent.type === 'subagent') {
|
|
1272
|
+
if (transformedEvent.subtype === 'start') {
|
|
1273
|
+
transformedEvent.hook_event_name = 'SubagentStart';
|
|
1274
|
+
} else if (transformedEvent.subtype === 'stop') {
|
|
1275
|
+
transformedEvent.hook_event_name = 'SubagentStop';
|
|
1276
|
+
}
|
|
1277
|
+
} else if (transformedEvent.type === 'todo' && transformedEvent.subtype === 'updated') {
|
|
1278
|
+
transformedEvent.hook_event_name = 'TodoWrite';
|
|
1279
|
+
}
|
|
1280
|
+
|
|
799
1281
|
// Debug logging for tool events
|
|
800
1282
|
if (transformedEvent.type === 'hook' && (transformedEvent.subtype === 'pre_tool' || transformedEvent.subtype === 'post_tool')) {
|
|
801
1283
|
console.log('Transformed tool event:', {
|
|
802
1284
|
type: transformedEvent.type,
|
|
803
1285
|
subtype: transformedEvent.subtype,
|
|
1286
|
+
hook_event_name: transformedEvent.hook_event_name,
|
|
804
1287
|
tool_name: transformedEvent.tool_name,
|
|
805
1288
|
has_tool_parameters: !!transformedEvent.tool_parameters,
|
|
806
1289
|
tool_parameters: transformedEvent.tool_parameters,
|
|
@@ -906,6 +1389,12 @@ class SocketClient {
|
|
|
906
1389
|
actualType = 'connected';
|
|
907
1390
|
this.isConnected = true;
|
|
908
1391
|
this.isConnecting = false;
|
|
1392
|
+
|
|
1393
|
+
// Expose socket globally when connected
|
|
1394
|
+
if (!window.socket) {
|
|
1395
|
+
window.socket = this.socket;
|
|
1396
|
+
console.log('SocketClient: Exposed socket globally as window.socket');
|
|
1397
|
+
}
|
|
909
1398
|
} else if (this.socket.connecting || this.isConnecting) {
|
|
910
1399
|
actualStatus = 'Connecting...';
|
|
911
1400
|
actualType = 'connecting';
|
|
@@ -918,17 +1407,15 @@ class SocketClient {
|
|
|
918
1407
|
}
|
|
919
1408
|
}
|
|
920
1409
|
|
|
921
|
-
//
|
|
1410
|
+
// Always update status to ensure consistency
|
|
1411
|
+
this.updateConnectionStatusDOM(actualStatus, actualType);
|
|
1412
|
+
|
|
1413
|
+
// Also ensure state is consistent
|
|
922
1414
|
const statusElement = document.getElementById('connection-status');
|
|
923
1415
|
if (statusElement) {
|
|
924
1416
|
const currentText = statusElement.textContent.replace('●', '').trim();
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
// Update if status text or class doesn't match
|
|
929
|
-
if (currentText !== actualStatus || currentClass !== expectedClass) {
|
|
930
|
-
console.log(`SocketClient: Fallback update - was '${currentText}' (${currentClass}), now '${actualStatus}' (${expectedClass})`);
|
|
931
|
-
this.updateConnectionStatusDOM(actualStatus, actualType);
|
|
1417
|
+
if (currentText !== actualStatus) {
|
|
1418
|
+
console.log(`SocketClient: Status sync - updating from '${currentText}' to '${actualStatus}'`);
|
|
932
1419
|
}
|
|
933
1420
|
}
|
|
934
1421
|
}
|