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