claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__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.

Files changed (520) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +35 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/circuit-breakers.md +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +37 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +924 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  41. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  42. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  44. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  46. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  47. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  48. claude_mpm/cli/commands/postmortem.py +401 -0
  49. claude_mpm/cli/commands/run.py +125 -167
  50. claude_mpm/cli/commands/skill_source.py +694 -0
  51. claude_mpm/cli/commands/skills.py +835 -44
  52. claude_mpm/cli/executor.py +78 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +256 -4
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  57. claude_mpm/cli/parsers/base_parser.py +53 -0
  58. claude_mpm/cli/parsers/config_parser.py +96 -43
  59. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +145 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +564 -108
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  68. claude_mpm/commands/mpm-agents-detect.md +9 -0
  69. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  70. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  71. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  72. claude_mpm/commands/mpm-doctor.md +9 -0
  73. claude_mpm/commands/mpm-help.md +17 -2
  74. claude_mpm/commands/mpm-init.md +28 -3
  75. claude_mpm/commands/mpm-monitor.md +9 -0
  76. claude_mpm/commands/mpm-postmortem.md +123 -0
  77. claude_mpm/commands/mpm-session-resume.md +381 -0
  78. claude_mpm/commands/mpm-status.md +9 -0
  79. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  80. claude_mpm/commands/mpm-ticket-view.md +552 -0
  81. claude_mpm/commands/mpm-version.md +9 -0
  82. claude_mpm/commands/mpm.md +11 -0
  83. claude_mpm/config/agent_presets.py +488 -0
  84. claude_mpm/config/agent_sources.py +325 -0
  85. claude_mpm/config/skill_presets.py +392 -0
  86. claude_mpm/config/skill_sources.py +590 -0
  87. claude_mpm/constants.py +13 -0
  88. claude_mpm/core/api_validator.py +1 -1
  89. claude_mpm/core/claude_runner.py +19 -35
  90. claude_mpm/core/config.py +24 -0
  91. claude_mpm/core/constants.py +1 -1
  92. claude_mpm/core/framework/__init__.py +3 -16
  93. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  94. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  95. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  96. claude_mpm/core/hook_error_memory.py +381 -0
  97. claude_mpm/core/hook_manager.py +41 -2
  98. claude_mpm/core/interactive_session.py +131 -10
  99. claude_mpm/core/interfaces.py +56 -1
  100. claude_mpm/core/logger.py +3 -1
  101. claude_mpm/core/oneshot_session.py +110 -8
  102. claude_mpm/core/protocols/__init__.py +23 -0
  103. claude_mpm/core/protocols/runner_protocol.py +103 -0
  104. claude_mpm/core/protocols/session_protocol.py +131 -0
  105. claude_mpm/core/shared/singleton_manager.py +11 -4
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_config.py +22 -0
  108. claude_mpm/dashboard/static/css/activity.css +69 -69
  109. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  110. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  111. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  112. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  114. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  117. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  118. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  119. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  120. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  121. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  122. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  123. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  124. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  125. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  126. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  127. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  128. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  129. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  130. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  131. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  132. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  133. claude_mpm/dashboard/templates/code_simple.html +23 -23
  134. claude_mpm/dashboard/templates/index.html +18 -18
  135. claude_mpm/experimental/cli_enhancements.py +1 -5
  136. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  137. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  138. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  139. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  140. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  141. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  142. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  143. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  144. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  145. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  151. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  152. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  153. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  154. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  155. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  156. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  157. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  158. claude_mpm/models/git_repository.py +198 -0
  159. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +45 -9
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_selection_service.py +484 -0
  164. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  165. claude_mpm/services/agents/cache_git_manager.py +621 -0
  166. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  167. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  168. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  169. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  170. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  171. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  172. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  173. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  174. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  175. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  176. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  177. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  178. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  179. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  180. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  181. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  182. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  183. claude_mpm/services/agents/git_source_manager.py +629 -0
  184. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  185. claude_mpm/services/agents/local_template_manager.py +50 -10
  186. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  187. claude_mpm/services/agents/sources/__init__.py +13 -0
  188. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  189. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  190. claude_mpm/services/agents/startup_sync.py +239 -0
  191. claude_mpm/services/agents/toolchain_detector.py +474 -0
  192. claude_mpm/services/analysis/__init__.py +25 -0
  193. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  194. claude_mpm/services/analysis/postmortem_service.py +765 -0
  195. claude_mpm/services/cli/session_pause_manager.py +504 -0
  196. claude_mpm/services/cli/session_resume_helper.py +36 -16
  197. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  198. claude_mpm/services/command_deployment_service.py +200 -6
  199. claude_mpm/services/core/base.py +31 -11
  200. claude_mpm/services/core/interfaces/__init__.py +1 -3
  201. claude_mpm/services/core/interfaces/health.py +1 -4
  202. claude_mpm/services/core/interfaces.py +56 -1
  203. claude_mpm/services/core/models/__init__.py +2 -11
  204. claude_mpm/services/core/models/agent_config.py +3 -0
  205. claude_mpm/services/core/models/process.py +4 -0
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/diagnostics/models.py +21 -0
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/event_bus/event_bus.py +36 -3
  219. claude_mpm/services/event_bus/relay.py +23 -7
  220. claude_mpm/services/events/consumers/logging.py +1 -2
  221. claude_mpm/services/git/__init__.py +21 -0
  222. claude_mpm/services/git/git_operations_service.py +494 -0
  223. claude_mpm/services/github/__init__.py +21 -0
  224. claude_mpm/services/github/github_cli_service.py +397 -0
  225. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  226. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  227. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  228. claude_mpm/services/instructions/__init__.py +9 -0
  229. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  230. claude_mpm/services/local_ops/__init__.py +5 -13
  231. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  232. claude_mpm/services/local_ops/health_manager.py +1 -4
  233. claude_mpm/services/local_ops/process_manager.py +1 -1
  234. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  235. claude_mpm/services/mcp_config_manager.py +75 -145
  236. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  237. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
  239. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  240. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  241. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  242. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  243. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  244. claude_mpm/services/mcp_service_verifier.py +6 -3
  245. claude_mpm/services/memory/failure_tracker.py +19 -4
  246. claude_mpm/services/memory/optimizer.py +1 -1
  247. claude_mpm/services/model/model_router.py +8 -9
  248. claude_mpm/services/monitor/daemon.py +29 -9
  249. claude_mpm/services/monitor/daemon_manager.py +96 -19
  250. claude_mpm/services/monitor/server.py +2 -2
  251. claude_mpm/services/native_agent_converter.py +356 -0
  252. claude_mpm/services/port_manager.py +1 -1
  253. claude_mpm/services/pr/__init__.py +14 -0
  254. claude_mpm/services/pr/pr_template_service.py +329 -0
  255. claude_mpm/services/project/documentation_manager.py +2 -1
  256. claude_mpm/services/project/project_organizer.py +4 -0
  257. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  258. claude_mpm/services/runner_configuration_service.py +17 -3
  259. claude_mpm/services/self_upgrade_service.py +165 -7
  260. claude_mpm/services/session_management_service.py +16 -4
  261. claude_mpm/services/skills/__init__.py +18 -0
  262. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  263. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  264. claude_mpm/services/skills_config.py +547 -0
  265. claude_mpm/services/skills_deployer.py +955 -0
  266. claude_mpm/services/socketio/handlers/connection.py +1 -1
  267. claude_mpm/services/socketio/handlers/git.py +2 -2
  268. claude_mpm/services/socketio/server/core.py +1 -4
  269. claude_mpm/services/socketio/server/main.py +1 -3
  270. claude_mpm/services/system_instructions_service.py +1 -3
  271. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  272. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  273. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  274. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  275. claude_mpm/services/unified/unified_deployment.py +1 -5
  276. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  277. claude_mpm/services/visualization/__init__.py +1 -5
  278. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  279. claude_mpm/skills/__init__.py +3 -3
  280. claude_mpm/skills/agent_skills_injector.py +42 -49
  281. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  282. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  283. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  284. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  285. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  286. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  287. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  288. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  289. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  290. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  291. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  292. claude_mpm/skills/skills_registry.py +44 -48
  293. claude_mpm/skills/skills_service.py +117 -108
  294. claude_mpm/templates/questions/__init__.py +38 -0
  295. claude_mpm/templates/questions/base.py +193 -0
  296. claude_mpm/templates/questions/pr_strategy.py +311 -0
  297. claude_mpm/templates/questions/project_init.py +385 -0
  298. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  299. claude_mpm/tools/__main__.py +8 -8
  300. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  301. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  302. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  303. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  304. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  305. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  306. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  307. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  308. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  309. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  310. claude_mpm/utils/agent_dependency_loader.py +80 -13
  311. claude_mpm/utils/agent_filters.py +288 -0
  312. claude_mpm/utils/dependency_cache.py +3 -1
  313. claude_mpm/utils/gitignore.py +244 -0
  314. claude_mpm/utils/log_cleanup.py +3 -3
  315. claude_mpm/utils/migration.py +372 -0
  316. claude_mpm/utils/progress.py +387 -0
  317. claude_mpm/utils/robust_installer.py +3 -5
  318. claude_mpm/utils/structured_questions.py +619 -0
  319. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
  320. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
  321. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  322. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  323. claude_mpm/agents/templates/agent-manager.json +0 -273
  324. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  325. claude_mpm/agents/templates/api_qa.json +0 -180
  326. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  327. claude_mpm/agents/templates/clerk-ops.json +0 -235
  328. claude_mpm/agents/templates/code_analyzer.json +0 -101
  329. claude_mpm/agents/templates/content-agent.json +0 -358
  330. claude_mpm/agents/templates/dart_engineer.json +0 -307
  331. claude_mpm/agents/templates/data_engineer.json +0 -225
  332. claude_mpm/agents/templates/documentation.json +0 -211
  333. claude_mpm/agents/templates/engineer.json +0 -210
  334. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  335. claude_mpm/agents/templates/golang_engineer.json +0 -270
  336. claude_mpm/agents/templates/imagemagick.json +0 -264
  337. claude_mpm/agents/templates/java_engineer.json +0 -346
  338. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  339. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  340. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  341. claude_mpm/agents/templates/memory_manager.json +0 -158
  342. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  343. claude_mpm/agents/templates/ops.json +0 -185
  344. claude_mpm/agents/templates/php-engineer.json +0 -281
  345. claude_mpm/agents/templates/product_owner.json +0 -338
  346. claude_mpm/agents/templates/project_organizer.json +0 -140
  347. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  348. claude_mpm/agents/templates/python_engineer.json +0 -387
  349. claude_mpm/agents/templates/qa.json +0 -242
  350. claude_mpm/agents/templates/react_engineer.json +0 -238
  351. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  352. claude_mpm/agents/templates/research.json +0 -188
  353. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  354. claude_mpm/agents/templates/rust_engineer.json +0 -275
  355. claude_mpm/agents/templates/security.json +0 -202
  356. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  357. claude_mpm/agents/templates/ticketing.json +0 -177
  358. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  359. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  360. claude_mpm/agents/templates/version_control.json +0 -157
  361. claude_mpm/agents/templates/web_qa.json +0 -399
  362. claude_mpm/agents/templates/web_ui.json +0 -189
  363. claude_mpm/cli/commands/mpm_init.py +0 -2093
  364. claude_mpm/commands/mpm-tickets.md +0 -102
  365. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  366. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  367. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  368. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  369. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  370. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  371. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  372. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  373. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  374. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  375. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  376. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  377. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  378. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  379. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  380. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  381. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  382. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  383. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  384. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  385. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  386. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  387. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  388. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  389. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  390. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  391. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  392. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  393. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  394. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  395. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  396. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  397. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  398. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  399. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  400. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  402. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  403. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  404. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  405. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  406. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  407. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  408. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  409. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  410. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  411. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  412. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  413. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  414. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  415. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  416. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  417. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  418. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  419. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  420. claude_mpm/dashboard/static/built/react/events.js +0 -30
  421. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  422. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  423. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  424. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  425. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  426. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  427. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  428. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  429. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  430. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  444. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  445. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  446. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  447. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  448. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  449. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  450. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  451. claude_mpm/dashboard/static/events.html +0 -607
  452. claude_mpm/dashboard/static/index.html +0 -635
  453. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  454. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  455. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  456. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  457. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  458. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  459. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  460. claude_mpm/dashboard/static/legacy/files.html +0 -747
  461. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  462. claude_mpm/dashboard/static/monitors.html +0 -431
  463. claude_mpm/dashboard/static/production/events.html +0 -659
  464. claude_mpm/dashboard/static/production/main.html +0 -698
  465. claude_mpm/dashboard/static/production/monitors.html +0 -483
  466. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  467. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  468. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  469. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  470. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  471. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -75
  472. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
  473. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
  474. claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
  475. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
  476. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
  477. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  478. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  479. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  480. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  481. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  482. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  483. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  484. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  485. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  486. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  487. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -175
  488. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  489. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
  490. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
  491. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
  492. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
  493. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  494. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  495. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  496. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  497. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -328
  498. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  499. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  500. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  501. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  502. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -209
  503. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
  504. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  505. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  506. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  507. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  508. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  509. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  510. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -304
  511. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
  512. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  513. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  514. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  515. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  516. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  517. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  518. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  519. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  520. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.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