claude-mpm 4.1.6__py3-none-any.whl → 4.24.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (866) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__init__.py +20 -5
  4. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
  5. claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/BASE_OPS.md +219 -0
  8. claude_mpm/agents/BASE_PM.md +431 -214
  9. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
  10. claude_mpm/agents/BASE_QA.md +167 -0
  11. claude_mpm/agents/BASE_RESEARCH.md +53 -0
  12. claude_mpm/agents/MEMORY.md +3 -0
  13. claude_mpm/agents/OUTPUT_STYLE.md +335 -0
  14. claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
  15. claude_mpm/agents/WORKFLOW.md +355 -187
  16. claude_mpm/agents/agent_loader.py +40 -10
  17. claude_mpm/agents/agent_loader_integration.py +3 -2
  18. claude_mpm/agents/agents_metadata.py +57 -0
  19. claude_mpm/agents/async_agent_loader.py +3 -3
  20. claude_mpm/agents/base_agent_loader.py +11 -9
  21. claude_mpm/agents/frontmatter_validator.py +291 -251
  22. claude_mpm/agents/system_agent_config.py +3 -2
  23. claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
  24. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
  25. claude_mpm/agents/templates/README.md +465 -0
  26. claude_mpm/agents/templates/agent-manager.json +267 -18
  27. claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
  28. claude_mpm/agents/templates/api_qa.json +16 -4
  29. claude_mpm/agents/templates/circuit_breakers.md +638 -0
  30. claude_mpm/agents/templates/clerk-ops.json +235 -0
  31. claude_mpm/agents/templates/code_analyzer.json +25 -9
  32. claude_mpm/agents/templates/content-agent.json +358 -0
  33. claude_mpm/agents/templates/dart_engineer.json +307 -0
  34. claude_mpm/agents/templates/data_engineer.json +87 -14
  35. claude_mpm/agents/templates/documentation.json +76 -13
  36. claude_mpm/agents/templates/engineer.json +44 -10
  37. claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
  38. claude_mpm/agents/templates/git_file_tracking.md +584 -0
  39. claude_mpm/agents/templates/golang_engineer.json +270 -0
  40. claude_mpm/agents/templates/imagemagick.json +5 -2
  41. claude_mpm/agents/templates/java_engineer.json +346 -0
  42. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  43. claude_mpm/agents/templates/local_ops_agent.json +1840 -0
  44. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
  45. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
  46. claude_mpm/agents/templates/memory_manager.json +6 -3
  47. claude_mpm/agents/templates/nextjs_engineer.json +285 -0
  48. claude_mpm/agents/templates/ops.json +27 -8
  49. claude_mpm/agents/templates/php-engineer.json +287 -0
  50. claude_mpm/agents/templates/pm_examples.md +474 -0
  51. claude_mpm/agents/templates/pm_red_flags.md +262 -0
  52. claude_mpm/agents/templates/product_owner.json +338 -0
  53. claude_mpm/agents/templates/project_organizer.json +19 -5
  54. claude_mpm/agents/templates/prompt-engineer.json +737 -0
  55. claude_mpm/agents/templates/python_engineer.json +387 -0
  56. claude_mpm/agents/templates/qa.json +26 -6
  57. claude_mpm/agents/templates/react_engineer.json +239 -0
  58. claude_mpm/agents/templates/refactoring_engineer.json +15 -5
  59. claude_mpm/agents/templates/research.json +47 -22
  60. claude_mpm/agents/templates/response_format.md +583 -0
  61. claude_mpm/agents/templates/ruby-engineer.json +280 -0
  62. claude_mpm/agents/templates/rust_engineer.json +275 -0
  63. claude_mpm/agents/templates/security.json +59 -10
  64. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  65. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  66. claude_mpm/agents/templates/ticketing.json +16 -7
  67. claude_mpm/agents/templates/typescript_engineer.json +285 -0
  68. claude_mpm/agents/templates/validation_templates.md +312 -0
  69. claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
  70. claude_mpm/agents/templates/version_control.json +16 -4
  71. claude_mpm/agents/templates/web_qa.json +243 -21
  72. claude_mpm/agents/templates/web_ui.json +18 -5
  73. claude_mpm/cli/__init__.py +38 -363
  74. claude_mpm/cli/commands/__init__.py +8 -0
  75. claude_mpm/cli/commands/agent_manager.py +675 -20
  76. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  77. claude_mpm/cli/commands/agents.py +722 -150
  78. claude_mpm/cli/commands/agents_detect.py +380 -0
  79. claude_mpm/cli/commands/agents_recommend.py +309 -0
  80. claude_mpm/cli/commands/aggregate.py +10 -6
  81. claude_mpm/cli/commands/analyze.py +553 -0
  82. claude_mpm/cli/commands/analyze_code.py +528 -0
  83. claude_mpm/cli/commands/auto_configure.py +570 -0
  84. claude_mpm/cli/commands/cleanup.py +12 -12
  85. claude_mpm/cli/commands/config.py +47 -13
  86. claude_mpm/cli/commands/configure.py +488 -884
  87. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  88. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  89. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  90. claude_mpm/cli/commands/configure_models.py +18 -0
  91. claude_mpm/cli/commands/configure_navigation.py +167 -0
  92. claude_mpm/cli/commands/configure_paths.py +104 -0
  93. claude_mpm/cli/commands/configure_persistence.py +254 -0
  94. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  95. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  96. claude_mpm/cli/commands/configure_validators.py +73 -0
  97. claude_mpm/cli/commands/dashboard.py +286 -0
  98. claude_mpm/cli/commands/debug.py +1386 -0
  99. claude_mpm/cli/commands/doctor.py +43 -7
  100. claude_mpm/cli/commands/info.py +3 -4
  101. claude_mpm/cli/commands/local_deploy.py +537 -0
  102. claude_mpm/cli/commands/mcp.py +17 -10
  103. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  104. claude_mpm/cli/commands/mcp_config.py +154 -0
  105. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  106. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  107. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  108. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  109. claude_mpm/cli/commands/memory.py +55 -21
  110. claude_mpm/cli/commands/monitor.py +168 -617
  111. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  112. claude_mpm/cli/commands/mpm_init/core.py +525 -0
  113. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  114. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  115. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  116. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  117. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  118. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  119. claude_mpm/cli/commands/run.py +169 -42
  120. claude_mpm/cli/commands/search.py +458 -0
  121. claude_mpm/cli/commands/skills.py +488 -0
  122. claude_mpm/cli/commands/uninstall.py +176 -0
  123. claude_mpm/cli/commands/upgrade.py +152 -0
  124. claude_mpm/cli/commands/verify.py +119 -0
  125. claude_mpm/cli/executor.py +204 -0
  126. claude_mpm/cli/helpers.py +105 -0
  127. claude_mpm/cli/interactive/__init__.py +21 -0
  128. claude_mpm/cli/interactive/agent_wizard.py +962 -0
  129. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  130. claude_mpm/cli/parser.py +79 -2
  131. claude_mpm/cli/parsers/__init__.py +7 -1
  132. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  133. claude_mpm/cli/parsers/agents_parser.py +116 -0
  134. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  135. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  136. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  137. claude_mpm/cli/parsers/base_parser.py +187 -3
  138. claude_mpm/cli/parsers/configure_parser.py +34 -15
  139. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  140. claude_mpm/cli/parsers/debug_parser.py +319 -0
  141. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  142. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  143. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  144. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  145. claude_mpm/cli/parsers/run_parser.py +5 -0
  146. claude_mpm/cli/parsers/search_parser.py +245 -0
  147. claude_mpm/cli/parsers/skills_parser.py +137 -0
  148. claude_mpm/cli/shared/argument_patterns.py +20 -13
  149. claude_mpm/cli/shared/base_command.py +2 -2
  150. claude_mpm/cli/shared/output_formatters.py +28 -19
  151. claude_mpm/cli/startup.py +562 -0
  152. claude_mpm/cli/startup_logging.py +179 -13
  153. claude_mpm/cli/utils.py +53 -2
  154. claude_mpm/commands/__init__.py +14 -0
  155. claude_mpm/commands/mpm-agents-detect.md +168 -0
  156. claude_mpm/commands/mpm-agents-recommend.md +214 -0
  157. claude_mpm/commands/mpm-agents.md +122 -0
  158. claude_mpm/commands/mpm-auto-configure.md +269 -0
  159. claude_mpm/commands/mpm-config.md +141 -0
  160. claude_mpm/commands/mpm-doctor.md +24 -0
  161. claude_mpm/commands/mpm-help.md +290 -0
  162. claude_mpm/commands/mpm-init.md +521 -0
  163. claude_mpm/commands/mpm-monitor.md +409 -0
  164. claude_mpm/commands/mpm-organize.md +295 -0
  165. claude_mpm/commands/mpm-resume.md +372 -0
  166. claude_mpm/commands/mpm-status.md +75 -0
  167. claude_mpm/commands/mpm-tickets.md +151 -0
  168. claude_mpm/commands/mpm-version.md +113 -0
  169. claude_mpm/commands/mpm.md +21 -0
  170. claude_mpm/config/agent_config.py +4 -4
  171. claude_mpm/config/experimental_features.py +7 -7
  172. claude_mpm/config/model_config.py +428 -0
  173. claude_mpm/config/paths.py +3 -2
  174. claude_mpm/config/socketio_config.py +36 -7
  175. claude_mpm/constants.py +27 -1
  176. claude_mpm/core/__init__.py +53 -17
  177. claude_mpm/core/agent_name_normalizer.py +3 -2
  178. claude_mpm/core/agent_registry.py +2 -2
  179. claude_mpm/core/agent_session_manager.py +10 -10
  180. claude_mpm/core/api_validator.py +330 -0
  181. claude_mpm/core/base_service.py +33 -23
  182. claude_mpm/core/cache.py +9 -9
  183. claude_mpm/core/claude_runner.py +19 -8
  184. claude_mpm/core/config.py +103 -8
  185. claude_mpm/core/config_aliases.py +7 -6
  186. claude_mpm/core/constants.py +65 -0
  187. claude_mpm/core/container.py +11 -5
  188. claude_mpm/core/enums.py +452 -0
  189. claude_mpm/core/error_handler.py +623 -0
  190. claude_mpm/core/factories.py +1 -1
  191. claude_mpm/core/file_utils.py +764 -0
  192. claude_mpm/core/framework/__init__.py +38 -0
  193. claude_mpm/core/framework/formatters/__init__.py +11 -0
  194. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  195. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  196. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  197. claude_mpm/core/framework/loaders/__init__.py +13 -0
  198. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  199. claude_mpm/core/framework/loaders/file_loader.py +223 -0
  200. claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
  201. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  202. claude_mpm/core/framework/processors/__init__.py +11 -0
  203. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  204. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  205. claude_mpm/core/framework/processors/template_processor.py +244 -0
  206. claude_mpm/core/framework_loader.py +323 -1491
  207. claude_mpm/core/hook_manager.py +8 -6
  208. claude_mpm/core/injectable_service.py +11 -8
  209. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  210. claude_mpm/core/interactive_session.py +55 -8
  211. claude_mpm/core/interfaces.py +56 -1
  212. claude_mpm/core/lazy.py +3 -3
  213. claude_mpm/core/log_manager.py +100 -28
  214. claude_mpm/core/logger.py +19 -14
  215. claude_mpm/core/logging_config.py +6 -2
  216. claude_mpm/core/logging_utils.py +520 -0
  217. claude_mpm/core/oneshot_session.py +51 -7
  218. claude_mpm/core/optimized_agent_loader.py +9 -9
  219. claude_mpm/core/optimized_startup.py +1 -1
  220. claude_mpm/core/output_style_manager.py +12 -192
  221. claude_mpm/core/pm_hook_interceptor.py +118 -15
  222. claude_mpm/core/service_registry.py +7 -3
  223. claude_mpm/core/session_manager.py +14 -12
  224. claude_mpm/core/shared/config_loader.py +1 -1
  225. claude_mpm/core/socketio_pool.py +15 -15
  226. claude_mpm/core/tool_access_control.py +3 -2
  227. claude_mpm/core/types.py +4 -11
  228. claude_mpm/core/typing_utils.py +7 -6
  229. claude_mpm/core/unified_agent_registry.py +116 -12
  230. claude_mpm/core/unified_config.py +6 -6
  231. claude_mpm/core/unified_paths.py +23 -20
  232. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
  233. claude_mpm/dashboard/__init__.py +12 -0
  234. claude_mpm/dashboard/analysis_runner.py +455 -0
  235. claude_mpm/dashboard/api/simple_directory.py +261 -0
  236. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  237. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  238. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  239. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  240. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  241. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  242. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  243. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  244. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  245. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  246. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  247. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  248. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  249. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  250. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  251. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  252. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  253. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  254. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  255. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  256. claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
  257. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  258. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  259. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  260. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  261. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  262. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  263. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  264. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  265. claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
  266. claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
  267. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  268. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  269. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  270. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  271. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  272. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  273. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  274. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  275. claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
  276. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  277. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  278. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  279. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  280. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
  281. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  282. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  283. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  284. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  285. claude_mpm/dashboard/static/built/react/events.js +30 -0
  286. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  287. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  288. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  289. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  290. claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
  291. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  292. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  293. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  294. claude_mpm/dashboard/static/css/activity.css +1958 -0
  295. claude_mpm/dashboard/static/css/dashboard.css +1413 -72
  296. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  297. claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
  298. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  299. claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
  300. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  301. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  302. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  303. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  304. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  305. claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
  306. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  307. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  308. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
  309. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  310. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  311. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  312. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  313. claude_mpm/dashboard/static/events.html +607 -0
  314. claude_mpm/dashboard/static/index.html +635 -0
  315. claude_mpm/dashboard/static/js/components/activity-tree.js +1871 -0
  316. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  317. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  318. claude_mpm/dashboard/static/js/components/build-tracker.js +23 -13
  319. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  320. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  321. claude_mpm/dashboard/static/js/components/event-processor.js +3 -107
  322. claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
  323. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  324. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  325. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  326. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  327. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  328. claude_mpm/dashboard/static/js/components/module-viewer.js +68 -205
  329. claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
  330. claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
  331. claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
  332. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
  333. claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
  334. claude_mpm/dashboard/static/js/connection-manager.js +1 -1
  335. claude_mpm/dashboard/static/js/dashboard.js +523 -622
  336. claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
  337. claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
  338. claude_mpm/dashboard/static/js/shared/logger.js +385 -0
  339. claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
  340. claude_mpm/dashboard/static/js/socket-client.js +549 -62
  341. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  342. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  343. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  344. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  345. claude_mpm/dashboard/static/legacy/files.html +747 -0
  346. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  347. claude_mpm/dashboard/static/monitors.html +431 -0
  348. claude_mpm/dashboard/static/production/events.html +659 -0
  349. claude_mpm/dashboard/static/production/main.html +698 -0
  350. claude_mpm/dashboard/static/production/monitors.html +483 -0
  351. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  352. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  353. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  354. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  355. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  356. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  357. claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
  358. claude_mpm/dashboard/templates/code_simple.html +153 -0
  359. claude_mpm/dashboard/templates/index.html +267 -9
  360. claude_mpm/experimental/__init__.py +10 -0
  361. claude_mpm/experimental/cli_enhancements.py +4 -2
  362. claude_mpm/generators/agent_profile_generator.py +5 -3
  363. claude_mpm/hooks/__init__.py +37 -1
  364. claude_mpm/hooks/base_hook.py +5 -4
  365. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  366. claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
  367. claude_mpm/hooks/claude_hooks/hook_handler.py +209 -25
  368. claude_mpm/hooks/claude_hooks/installer.py +783 -0
  369. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  370. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  371. claude_mpm/hooks/claude_hooks/services/connection_manager.py +64 -49
  372. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  373. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  374. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  375. claude_mpm/hooks/failure_learning/__init__.py +60 -0
  376. claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
  377. claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
  378. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
  379. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  380. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  381. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  382. claude_mpm/hooks/kuzu_response_hook.py +183 -0
  383. claude_mpm/hooks/memory_integration_hook.py +1 -1
  384. claude_mpm/hooks/session_resume_hook.py +121 -0
  385. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  386. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  387. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  388. claude_mpm/hooks/validation_hooks.py +3 -3
  389. claude_mpm/init.py +23 -4
  390. claude_mpm/models/agent_session.py +8 -6
  391. claude_mpm/models/resume_log.py +340 -0
  392. claude_mpm/schemas/__init__.py +12 -0
  393. claude_mpm/scripts/claude-hook-handler.sh +187 -0
  394. claude_mpm/scripts/launch_monitor.py +85 -0
  395. claude_mpm/scripts/mcp_server.py +3 -5
  396. claude_mpm/scripts/mpm_doctor.py +3 -2
  397. claude_mpm/scripts/socketio_daemon.py +156 -396
  398. claude_mpm/services/__init__.py +144 -160
  399. claude_mpm/services/agents/__init__.py +18 -5
  400. claude_mpm/services/agents/agent_builder.py +13 -11
  401. claude_mpm/services/agents/auto_config_manager.py +796 -0
  402. claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
  403. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  404. claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
  405. claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
  406. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  407. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  408. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
  409. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  410. claude_mpm/services/agents/deployment/agent_record_service.py +5 -6
  411. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  412. claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
  413. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  414. claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
  415. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  416. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  417. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  418. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  419. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  420. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  421. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  422. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
  423. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  424. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  425. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  426. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  427. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  428. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  429. claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
  430. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  431. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  432. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  433. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  434. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  435. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
  436. claude_mpm/services/agents/local_template_manager.py +744 -0
  437. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  438. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  439. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  440. claude_mpm/services/agents/memory/content_manager.py +17 -9
  441. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  442. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  443. claude_mpm/services/agents/memory/memory_format_service.py +7 -7
  444. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  445. claude_mpm/services/agents/memory/template_generator.py +3 -3
  446. claude_mpm/services/agents/observers.py +547 -0
  447. claude_mpm/services/agents/recommender.py +615 -0
  448. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  449. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  450. claude_mpm/services/async_session_logger.py +141 -98
  451. claude_mpm/services/claude_session_logger.py +82 -74
  452. claude_mpm/services/cli/agent_cleanup_service.py +6 -5
  453. claude_mpm/services/cli/agent_dependency_service.py +1 -1
  454. claude_mpm/services/cli/agent_listing_service.py +5 -5
  455. claude_mpm/services/cli/agent_validation_service.py +6 -5
  456. claude_mpm/services/cli/memory_crud_service.py +12 -7
  457. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  458. claude_mpm/services/cli/resume_service.py +617 -0
  459. claude_mpm/services/cli/session_manager.py +104 -13
  460. claude_mpm/services/cli/session_pause_manager.py +504 -0
  461. claude_mpm/services/cli/session_resume_helper.py +372 -0
  462. claude_mpm/services/cli/startup_checker.py +13 -21
  463. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  464. claude_mpm/services/command_deployment_service.py +17 -9
  465. claude_mpm/services/command_handler_service.py +11 -5
  466. claude_mpm/services/core/__init__.py +33 -1
  467. claude_mpm/services/core/base.py +26 -11
  468. claude_mpm/services/core/cache_manager.py +1 -3
  469. claude_mpm/services/core/interfaces/__init__.py +90 -3
  470. claude_mpm/services/core/interfaces/agent.py +184 -0
  471. claude_mpm/services/core/interfaces/health.py +172 -0
  472. claude_mpm/services/core/interfaces/model.py +281 -0
  473. claude_mpm/services/core/interfaces/process.py +372 -0
  474. claude_mpm/services/core/interfaces/project.py +121 -0
  475. claude_mpm/services/core/interfaces/restart.py +307 -0
  476. claude_mpm/services/core/interfaces/stability.py +260 -0
  477. claude_mpm/services/core/interfaces.py +56 -1
  478. claude_mpm/services/core/memory_manager.py +92 -47
  479. claude_mpm/services/core/models/__init__.py +79 -0
  480. claude_mpm/services/core/models/agent_config.py +384 -0
  481. claude_mpm/services/core/models/health.py +162 -0
  482. claude_mpm/services/core/models/process.py +239 -0
  483. claude_mpm/services/core/models/restart.py +302 -0
  484. claude_mpm/services/core/models/stability.py +264 -0
  485. claude_mpm/services/core/models/toolchain.py +306 -0
  486. claude_mpm/services/core/path_resolver.py +37 -18
  487. claude_mpm/services/core/service_container.py +2 -2
  488. claude_mpm/services/diagnostics/__init__.py +2 -2
  489. claude_mpm/services/diagnostics/checks/__init__.py +4 -2
  490. claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
  491. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  492. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  493. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  494. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  495. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  496. claude_mpm/services/diagnostics/checks/instructions_check.py +22 -24
  497. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
  498. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
  499. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
  500. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  501. claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
  502. claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
  503. claude_mpm/services/diagnostics/models.py +37 -21
  504. claude_mpm/services/event_aggregator.py +5 -3
  505. claude_mpm/services/event_bus/direct_relay.py +152 -13
  506. claude_mpm/services/event_bus/event_bus.py +51 -9
  507. claude_mpm/services/event_bus/relay.py +33 -14
  508. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  509. claude_mpm/services/events/core.py +5 -6
  510. claude_mpm/services/events/producers/hook.py +6 -6
  511. claude_mpm/services/events/producers/system.py +8 -8
  512. claude_mpm/services/exceptions.py +5 -5
  513. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  514. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  515. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  516. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  517. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  518. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  519. claude_mpm/services/hook_installer_service.py +506 -0
  520. claude_mpm/services/hook_service.py +5 -6
  521. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  522. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  523. claude_mpm/services/infrastructure/logging.py +2 -2
  524. claude_mpm/services/infrastructure/monitoring/__init__.py +12 -12
  525. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  526. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  527. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  528. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  529. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  530. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  531. claude_mpm/services/infrastructure/monitoring.py +12 -12
  532. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  533. claude_mpm/services/local_ops/__init__.py +165 -0
  534. claude_mpm/services/local_ops/crash_detector.py +257 -0
  535. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  536. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  537. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  538. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  539. claude_mpm/services/local_ops/health_manager.py +430 -0
  540. claude_mpm/services/local_ops/log_monitor.py +396 -0
  541. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  542. claude_mpm/services/local_ops/process_manager.py +595 -0
  543. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  544. claude_mpm/services/local_ops/restart_manager.py +401 -0
  545. claude_mpm/services/local_ops/restart_policy.py +387 -0
  546. claude_mpm/services/local_ops/state_manager.py +372 -0
  547. claude_mpm/services/local_ops/unified_manager.py +600 -0
  548. claude_mpm/services/mcp_config_manager.py +1612 -0
  549. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  550. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  551. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  552. claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
  553. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  554. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  555. claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
  556. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  557. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  558. claude_mpm/services/mcp_gateway/main.py +90 -15
  559. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  560. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  561. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
  562. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
  563. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  564. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  565. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  566. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  567. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  568. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  569. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
  570. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  571. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  572. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  573. claude_mpm/services/mcp_service_verifier.py +729 -0
  574. claude_mpm/services/memory/builder.py +9 -8
  575. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  576. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  577. claude_mpm/services/memory/failure_tracker.py +578 -0
  578. claude_mpm/services/memory/indexed_memory.py +8 -8
  579. claude_mpm/services/memory/optimizer.py +8 -9
  580. claude_mpm/services/memory/router.py +3 -3
  581. claude_mpm/services/memory_hook_service.py +165 -4
  582. claude_mpm/services/model/__init__.py +147 -0
  583. claude_mpm/services/model/base_provider.py +365 -0
  584. claude_mpm/services/model/claude_provider.py +412 -0
  585. claude_mpm/services/model/model_router.py +453 -0
  586. claude_mpm/services/model/ollama_provider.py +415 -0
  587. claude_mpm/services/monitor/__init__.py +20 -0
  588. claude_mpm/services/monitor/daemon.py +671 -0
  589. claude_mpm/services/monitor/daemon_manager.py +963 -0
  590. claude_mpm/services/monitor/event_emitter.py +350 -0
  591. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  592. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  593. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  594. claude_mpm/services/monitor/handlers/file.py +264 -0
  595. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  596. claude_mpm/services/monitor/management/__init__.py +18 -0
  597. claude_mpm/services/monitor/management/health.py +124 -0
  598. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  599. claude_mpm/services/monitor/server.py +817 -0
  600. claude_mpm/services/monitor_build_service.py +2 -2
  601. claude_mpm/services/native_agent_converter.py +356 -0
  602. claude_mpm/services/orphan_detection.py +786 -0
  603. claude_mpm/services/port_manager.py +2 -2
  604. claude_mpm/services/project/__init__.py +23 -0
  605. claude_mpm/services/project/analyzer.py +3 -3
  606. claude_mpm/services/project/architecture_analyzer.py +6 -6
  607. claude_mpm/services/project/archive_manager.py +1045 -0
  608. claude_mpm/services/project/dependency_analyzer.py +8 -8
  609. claude_mpm/services/project/detection_strategies.py +719 -0
  610. claude_mpm/services/project/documentation_manager.py +553 -0
  611. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  612. claude_mpm/services/project/language_analyzer.py +3 -3
  613. claude_mpm/services/project/metrics_collector.py +7 -10
  614. claude_mpm/services/project/project_organizer.py +1005 -0
  615. claude_mpm/services/project/registry.py +13 -7
  616. claude_mpm/services/project/toolchain_analyzer.py +581 -0
  617. claude_mpm/services/project_port_allocator.py +596 -0
  618. claude_mpm/services/response_tracker.py +21 -10
  619. claude_mpm/services/runner_configuration_service.py +1 -0
  620. claude_mpm/services/self_upgrade_service.py +500 -0
  621. claude_mpm/services/session_management_service.py +7 -5
  622. claude_mpm/services/session_manager.py +380 -0
  623. claude_mpm/services/shared/__init__.py +2 -1
  624. claude_mpm/services/shared/async_service_base.py +16 -27
  625. claude_mpm/services/shared/config_service_base.py +17 -14
  626. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  627. claude_mpm/services/shared/service_factory.py +8 -5
  628. claude_mpm/services/socketio/client_proxy.py +60 -5
  629. claude_mpm/services/socketio/dashboard_server.py +361 -0
  630. claude_mpm/services/socketio/event_normalizer.py +74 -6
  631. claude_mpm/services/socketio/handlers/__init__.py +5 -0
  632. claude_mpm/services/socketio/handlers/base.py +2 -2
  633. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  634. claude_mpm/services/socketio/handlers/connection.py +21 -40
  635. claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
  636. claude_mpm/services/socketio/handlers/file.py +46 -10
  637. claude_mpm/services/socketio/handlers/git.py +8 -8
  638. claude_mpm/services/socketio/handlers/hook.py +29 -17
  639. claude_mpm/services/socketio/handlers/registry.py +4 -0
  640. claude_mpm/services/socketio/monitor_client.py +364 -0
  641. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  642. claude_mpm/services/socketio/server/connection_manager.py +131 -68
  643. claude_mpm/services/socketio/server/core.py +275 -22
  644. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  645. claude_mpm/services/socketio/server/main.py +99 -29
  646. claude_mpm/services/socketio_client_manager.py +4 -4
  647. claude_mpm/services/subprocess_launcher_service.py +19 -15
  648. claude_mpm/services/system_instructions_service.py +2 -2
  649. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  650. claude_mpm/services/ticket_services/validation_service.py +5 -5
  651. claude_mpm/services/unified/__init__.py +65 -0
  652. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  653. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  654. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  655. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
  656. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
  657. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  658. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  659. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  660. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  661. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  662. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  663. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  664. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  665. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  666. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  667. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  668. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  669. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  670. claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
  671. claude_mpm/services/unified/interfaces.py +475 -0
  672. claude_mpm/services/unified/migration.py +509 -0
  673. claude_mpm/services/unified/strategies.py +534 -0
  674. claude_mpm/services/unified/unified_analyzer.py +542 -0
  675. claude_mpm/services/unified/unified_config.py +691 -0
  676. claude_mpm/services/unified/unified_deployment.py +470 -0
  677. claude_mpm/services/utility_service.py +6 -3
  678. claude_mpm/services/version_control/branch_strategy.py +2 -2
  679. claude_mpm/services/version_control/conflict_resolution.py +8 -4
  680. claude_mpm/services/version_control/git_operations.py +26 -24
  681. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  682. claude_mpm/services/version_control/version_parser.py +14 -11
  683. claude_mpm/services/version_service.py +104 -1
  684. claude_mpm/services/visualization/__init__.py +19 -0
  685. claude_mpm/services/visualization/mermaid_generator.py +938 -0
  686. claude_mpm/skills/__init__.py +42 -0
  687. claude_mpm/skills/agent_skills_injector.py +324 -0
  688. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  689. claude_mpm/skills/bundled/__init__.py +6 -0
  690. claude_mpm/skills/bundled/api-documentation.md +393 -0
  691. claude_mpm/skills/bundled/async-testing.md +571 -0
  692. claude_mpm/skills/bundled/code-review.md +143 -0
  693. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  694. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  695. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  696. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  697. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  698. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  699. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  700. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  701. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  702. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  703. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  704. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  705. claude_mpm/skills/bundled/database-migration.md +199 -0
  706. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  707. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  708. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  709. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  710. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  711. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  712. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  713. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  714. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  715. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  716. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  717. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  718. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  719. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  720. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  721. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  722. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  723. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  724. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  725. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  726. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  727. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  728. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  729. claude_mpm/skills/bundled/git-workflow.md +414 -0
  730. claude_mpm/skills/bundled/imagemagick.md +204 -0
  731. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  732. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  733. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  734. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  735. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  736. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  737. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  738. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  739. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  740. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  741. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  742. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  743. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  744. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  745. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  746. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  747. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  748. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  749. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  750. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  751. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  752. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  753. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  754. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  755. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  756. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  757. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  758. claude_mpm/skills/bundled/pdf.md +141 -0
  759. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  760. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  761. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  762. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  763. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  764. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  765. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  766. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  767. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  768. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  769. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  770. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  771. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  772. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  773. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  774. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  775. claude_mpm/skills/bundled/security-scanning.md +327 -0
  776. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  777. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  778. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  779. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  780. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  781. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  782. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  783. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  784. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  785. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  786. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  787. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  788. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  789. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  790. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  791. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  792. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  793. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  794. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  795. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  796. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  797. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  798. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  799. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  800. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  801. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  802. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  803. claude_mpm/skills/bundled/xlsx.md +157 -0
  804. claude_mpm/skills/registry.py +286 -0
  805. claude_mpm/skills/skill_manager.py +310 -0
  806. claude_mpm/skills/skills_registry.py +348 -0
  807. claude_mpm/skills/skills_service.py +739 -0
  808. claude_mpm/storage/state_storage.py +31 -31
  809. claude_mpm/tools/__init__.py +10 -0
  810. claude_mpm/tools/__main__.py +208 -0
  811. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  812. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  813. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  814. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  815. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  816. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  817. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  818. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  819. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  820. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  821. claude_mpm/tools/code_tree_builder.py +631 -0
  822. claude_mpm/tools/code_tree_events.py +420 -0
  823. claude_mpm/tools/socketio_debug.py +671 -0
  824. claude_mpm/utils/agent_dependency_loader.py +108 -27
  825. claude_mpm/utils/common.py +544 -0
  826. claude_mpm/utils/config_manager.py +12 -6
  827. claude_mpm/utils/database_connector.py +298 -0
  828. claude_mpm/utils/dependency_cache.py +2 -2
  829. claude_mpm/utils/dependency_strategies.py +15 -10
  830. claude_mpm/utils/display_helper.py +260 -0
  831. claude_mpm/utils/environment_context.py +4 -3
  832. claude_mpm/utils/error_handler.py +5 -3
  833. claude_mpm/utils/file_utils.py +13 -14
  834. claude_mpm/utils/git_analyzer.py +407 -0
  835. claude_mpm/utils/log_cleanup.py +627 -0
  836. claude_mpm/utils/path_operations.py +7 -4
  837. claude_mpm/utils/robust_installer.py +133 -24
  838. claude_mpm/utils/session_logging.py +2 -2
  839. claude_mpm/utils/subprocess_utils.py +9 -8
  840. claude_mpm/validation/agent_validator.py +6 -6
  841. claude_mpm/validation/frontmatter_validator.py +6 -6
  842. claude_mpm-4.24.0.dist-info/METADATA +675 -0
  843. claude_mpm-4.24.0.dist-info/RECORD +1018 -0
  844. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
  845. claude_mpm/agents/INSTRUCTIONS.md +0 -237
  846. claude_mpm/agents/schema/agent_schema.json +0 -314
  847. claude_mpm/agents/templates/agent-manager.md +0 -304
  848. claude_mpm/cli/commands/configure_tui.py +0 -1921
  849. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  850. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  851. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  852. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  853. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  854. claude_mpm/scripts/socketio_server_manager.py +0 -349
  855. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  856. claude_mpm/services/cli/dashboard_launcher.py +0 -424
  857. claude_mpm/services/cli/socketio_manager.py +0 -498
  858. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  859. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  860. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  861. claude_mpm/services/project/analyzer_refactored.py +0 -450
  862. claude_mpm-4.1.6.dist-info/METADATA +0 -325
  863. claude_mpm-4.1.6.dist-info/RECORD +0 -550
  864. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
  865. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
  866. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
@@ -1,74 +1,303 @@
1
1
  /**
2
2
  * Socket.IO Client for Claude MPM Dashboard
3
- * Handles WebSocket connections and event processing
3
+ *
4
+ * This module provides real-time WebSocket communication between the Claude MPM dashboard
5
+ * and the backend Socket.IO server. It handles connection management, event processing,
6
+ * retry logic, and health monitoring.
7
+ *
8
+ * Architecture:
9
+ * - Maintains persistent WebSocket connection to Claude MPM backend
10
+ * - Implements robust retry logic with exponential backoff
11
+ * - Provides event queuing during disconnections
12
+ * - Validates event schemas for data integrity
13
+ * - Monitors connection health with ping/pong mechanisms
14
+ *
15
+ * Event Flow:
16
+ * 1. Events from Claude Code hooks → Socket.IO server → Dashboard client
17
+ * 2. Dashboard requests → Socket.IO server → Backend services
18
+ * 3. Status updates → Socket.IO server → All connected clients
19
+ *
20
+ * Thread Safety:
21
+ * - Single-threaded JavaScript execution model ensures safety
22
+ * - Event callbacks are queued and executed sequentially
23
+ * - Connection state changes are atomic
24
+ *
25
+ * Performance Considerations:
26
+ * - Event queue limited to 100 items to prevent memory leaks
27
+ * - Health checks run every 45s to match server ping interval
28
+ * - Exponential backoff prevents connection spam
29
+ * - Lazy event validation reduces overhead
30
+ *
31
+ * Security:
32
+ * - Connects only to localhost to prevent external access
33
+ * - Event schema validation prevents malformed data processing
34
+ * - Connection timeout prevents hanging connections
35
+ *
36
+ * @author Claude MPM Team
37
+ * @version 1.0
38
+ * @since v4.0.25
4
39
  */
5
40
 
6
41
  // Access the global io from window object in ES6 module context
42
+ // WHY: Socket.IO is loaded via CDN in HTML, available as window.io
7
43
  const io = window.io;
8
44
 
45
+ /**
46
+ * Primary Socket.IO client for dashboard communication.
47
+ *
48
+ * Manages WebSocket connection lifecycle, event processing, and error handling.
49
+ * Implements connection resilience with automatic retry and health monitoring.
50
+ *
51
+ * Key Features:
52
+ * - Automatic connection retry with exponential backoff
53
+ * - Event queue management during disconnections
54
+ * - Schema validation for incoming events
55
+ * - Health monitoring with ping/pong
56
+ * - Session management and event history
57
+ *
58
+ * Connection States:
59
+ * - isConnected: Currently connected to server
60
+ * - isConnecting: Connection attempt in progress
61
+ * - disconnectTime: Timestamp of last disconnection
62
+ *
63
+ * Event Processing:
64
+ * - Validates against schema before processing
65
+ * - Queues events during disconnection (max 100)
66
+ * - Maintains event history and session tracking
67
+ *
68
+ * @class SocketClient
69
+ */
9
70
  class SocketClient {
71
+ /**
72
+ * Initialize Socket.IO client with default configuration.
73
+ *
74
+ * Sets up connection management, event processing, and health monitoring.
75
+ * Configures retry logic and event queue management.
76
+ *
77
+ * WHY this initialization approach:
78
+ * - Lazy socket creation allows for port specification
79
+ * - Event queue prevents data loss during reconnections
80
+ * - Health monitoring detects server issues early
81
+ * - Schema validation ensures data integrity
82
+ *
83
+ * @constructor
84
+ */
10
85
  constructor() {
86
+ /**
87
+ * Socket.IO connection instance.
88
+ * @type {Socket|null}
89
+ * @private
90
+ */
11
91
  this.socket = null;
92
+
93
+ /**
94
+ * Current connection port.
95
+ * @type {string|null}
96
+ * @private
97
+ */
12
98
  this.port = null; // Store the current port
99
+
100
+ /**
101
+ * Event callback registry for connection lifecycle events.
102
+ * WHY: Allows multiple components to register for connection events.
103
+ * @type {Object.<string, Function[]>}
104
+ * @private
105
+ */
13
106
  this.connectionCallbacks = {
14
- connect: [],
15
- disconnect: [],
16
- error: [],
17
- event: []
107
+ connect: [], // Called on successful connection
108
+ disconnect: [], // Called on disconnection
109
+ error: [], // Called on connection errors
110
+ event: [] // Called on incoming events
18
111
  };
19
112
 
20
- // Event schema validation
113
+ /**
114
+ * Event schema definition for validation.
115
+ * WHY: Ensures data integrity and prevents processing malformed events.
116
+ * @type {Object}
117
+ * @private
118
+ */
21
119
  this.eventSchema = {
22
120
  required: ['source', 'type', 'subtype', 'timestamp', 'data'],
23
121
  optional: ['event', 'session_id']
24
122
  };
25
123
 
26
- // Connection state
124
+ /**
125
+ * Current connection state.
126
+ * @type {boolean}
127
+ * @private
128
+ */
27
129
  this.isConnected = false;
130
+
131
+ /**
132
+ * Connection attempt in progress flag.
133
+ * WHY: Prevents multiple simultaneous connection attempts.
134
+ * @type {boolean}
135
+ * @private
136
+ */
28
137
  this.isConnecting = false;
138
+
139
+ /**
140
+ * Timestamp of last successful connection.
141
+ * @type {number|null}
142
+ * @private
143
+ */
29
144
  this.lastConnectTime = null;
145
+
146
+ /**
147
+ * Timestamp of last disconnection.
148
+ * WHY: Used to calculate downtime and trigger reconnection logic.
149
+ * @type {number|null}
150
+ * @private
151
+ */
30
152
  this.disconnectTime = null;
31
153
 
32
- // Event processing
154
+ /**
155
+ * Event history storage.
156
+ * WHY: Maintains event history for dashboard display and analysis.
157
+ * @type {Array.<Object>}
158
+ * @private
159
+ */
33
160
  this.events = [];
161
+
162
+ /**
163
+ * Session tracking map.
164
+ * WHY: Groups events by session for better organization.
165
+ * @type {Map<string, Object>}
166
+ * @private
167
+ */
34
168
  this.sessions = new Map();
169
+
170
+ /**
171
+ * Current active session identifier.
172
+ * @type {string|null}
173
+ * @private
174
+ */
35
175
  this.currentSessionId = null;
36
176
 
37
- // Event queue for disconnection periods
177
+ /**
178
+ * Event queue for disconnection periods.
179
+ * WHY: Prevents event loss during temporary disconnections.
180
+ * @type {Array.<Object>}
181
+ * @private
182
+ */
38
183
  this.eventQueue = [];
184
+
185
+ /**
186
+ * Maximum queue size to prevent memory leaks.
187
+ * WHY: Limits memory usage during extended disconnections.
188
+ * @type {number}
189
+ * @private
190
+ * @const
191
+ */
39
192
  this.maxQueueSize = 100;
40
193
 
41
- // Retry configuration
194
+ /**
195
+ * Current retry attempt counter.
196
+ * WHY: Tracks retry attempts for exponential backoff logic.
197
+ * @type {number}
198
+ * @private
199
+ */
42
200
  this.retryAttempts = 0;
43
- this.maxRetryAttempts = 3;
44
- this.retryDelays = [1000, 2000, 4000]; // Exponential backoff
201
+
202
+ /**
203
+ * Maximum retry attempts before giving up.
204
+ * WHY: Prevents infinite retry loops that could impact performance.
205
+ * @type {number}
206
+ * @private
207
+ * @const
208
+ */
209
+ this.maxRetryAttempts = 5; // Increased from 3 to 5 for better stability
210
+
211
+ /**
212
+ * Retry delay intervals in milliseconds (exponential backoff).
213
+ * WHY: Prevents server overload during connection issues.
214
+ * @type {number[]}
215
+ * @private
216
+ * @const
217
+ */
218
+ this.retryDelays = [1000, 2000, 3000, 4000, 5000]; // Exponential backoff with 5 attempts
219
+
220
+ /**
221
+ * Map of pending emissions for retry logic.
222
+ * WHY: Tracks failed emissions that need to be retried.
223
+ * @type {Map<string, Object>}
224
+ * @private
225
+ */
45
226
  this.pendingEmissions = new Map(); // Track pending emissions for retry
46
227
 
47
- // Health monitoring
228
+ /**
229
+ * Timestamp of last ping sent to server.
230
+ * WHY: Used for health monitoring and connection validation.
231
+ * @type {number|null}
232
+ * @private
233
+ */
48
234
  this.lastPingTime = null;
235
+
236
+ /**
237
+ * Timestamp of last pong received from server.
238
+ * WHY: Confirms server is responsive and connection is healthy.
239
+ * @type {number|null}
240
+ * @private
241
+ */
49
242
  this.lastPongTime = null;
50
- this.pingTimeout = 90000; // 90 seconds for health check (more lenient than Socket.IO timeout)
243
+
244
+ /**
245
+ * Health check timeout in milliseconds.
246
+ * WHY: More lenient than Socket.IO timeout to prevent false positives.
247
+ * @type {number}
248
+ * @private
249
+ * @const
250
+ */
251
+ this.pingTimeout = 120000; // 120 seconds for health check (more lenient for stability)
252
+
253
+ /**
254
+ * Health check interval timer.
255
+ * @type {number|null}
256
+ * @private
257
+ */
51
258
  this.healthCheckInterval = null;
52
259
 
53
- // Start periodic status check as fallback mechanism
260
+ // Initialize background monitoring
54
261
  this.startStatusCheckFallback();
55
262
  this.startHealthMonitoring();
56
263
  }
57
264
 
58
265
  /**
59
- * Connect to Socket.IO server
60
- * @param {string} port - Port number to connect to
266
+ * Connect to Socket.IO server on specified port.
267
+ *
268
+ * Initiates WebSocket connection to the Claude MPM Socket.IO server.
269
+ * Handles connection conflicts and ensures clean state transitions.
270
+ *
271
+ * Connection Process:
272
+ * 1. Validates port and constructs localhost URL
273
+ * 2. Checks for existing connections and cleans up if needed
274
+ * 3. Delegates to doConnect() for actual connection logic
275
+ *
276
+ * Thread Safety:
277
+ * - Uses setTimeout for async cleanup to prevent race conditions
278
+ * - Connection state flags prevent multiple simultaneous attempts
279
+ *
280
+ * @param {string} [port='8765'] - Port number to connect to (defaults to 8765)
281
+ *
282
+ * @throws {Error} If Socket.IO library is not loaded
283
+ *
284
+ * @example
285
+ * // Connect to default port
286
+ * socketClient.connect();
287
+ *
288
+ * // Connect to specific port
289
+ * socketClient.connect('8766');
61
290
  */
62
291
  connect(port = '8765') {
63
- // Store the port for later use
292
+ // Store the port for later use in reconnections
64
293
  this.port = port;
65
294
  const url = `http://localhost:${port}`;
66
295
 
67
- // Prevent multiple simultaneous connections
296
+ // WHY this check: Prevents connection conflicts that can cause memory leaks
68
297
  if (this.socket && (this.socket.connected || this.socket.connecting)) {
69
298
  console.log('Already connected or connecting, disconnecting first...');
70
299
  this.socket.disconnect();
71
- // Wait a moment for cleanup
300
+ // WHY 100ms delay: Allows cleanup to complete before new connection
72
301
  setTimeout(() => this.doConnect(url), 100);
73
302
  return;
74
303
  }
@@ -77,8 +306,28 @@ class SocketClient {
77
306
  }
78
307
 
79
308
  /**
80
- * Perform the actual connection
81
- * @param {string} url - Socket.IO server URL
309
+ * Execute the actual Socket.IO connection with full configuration.
310
+ *
311
+ * Creates and configures Socket.IO client with appropriate timeouts,
312
+ * retry logic, and transport settings. Sets up event handlers for
313
+ * connection lifecycle management.
314
+ *
315
+ * Configuration Details:
316
+ * - autoConnect: true - Immediate connection attempt
317
+ * - reconnection: true - Built-in reconnection enabled
318
+ * - pingInterval: 25000ms - Matches server configuration
319
+ * - pingTimeout: 20000ms - Health check timeout
320
+ * - transports: ['websocket', 'polling'] - Fallback options
321
+ *
322
+ * WHY these settings:
323
+ * - Ping intervals must match server to prevent timeouts
324
+ * - Limited reconnection attempts prevent infinite loops
325
+ * - forceNew prevents socket reuse issues
326
+ *
327
+ * @param {string} url - Complete Socket.IO server URL (http://localhost:port)
328
+ * @private
329
+ *
330
+ * @throws {Error} If Socket.IO library is not available
82
331
  */
83
332
  doConnect(url) {
84
333
  console.log(`Connecting to Socket.IO server at ${url}`);
@@ -97,13 +346,13 @@ class SocketClient {
97
346
  autoConnect: true,
98
347
  reconnection: true,
99
348
  reconnectionDelay: 1000,
100
- reconnectionDelayMax: 5000,
101
- reconnectionAttempts: Infinity, // Keep trying indefinitely
102
- timeout: 20000, // Increase connection timeout
349
+ reconnectionDelayMax: 10000, // Increased max delay for stability
350
+ reconnectionAttempts: 10, // Increased attempts for better resilience
351
+ timeout: 30000, // Increased connection timeout to 30 seconds
103
352
  forceNew: true,
104
353
  transports: ['websocket', 'polling'],
105
- pingInterval: 25000, // Match server setting
106
- pingTimeout: 60000 // Match server setting
354
+ // Remove client-side ping configuration - let server control this
355
+ // The server now properly configures: ping_interval=30s, ping_timeout=60s
107
356
  });
108
357
 
109
358
  this.setupSocketHandlers();
@@ -132,6 +381,10 @@ class SocketClient {
132
381
 
133
382
  this.notifyConnectionStatus('Connected', 'connected');
134
383
 
384
+ // Expose socket globally for components that need direct access
385
+ window.socket = this.socket;
386
+ console.log('SocketClient: Exposed socket globally as window.socket');
387
+
135
388
  // Emit connect callback
136
389
  this.connectionCallbacks.connect.forEach(callback =>
137
390
  callback(this.socket.id)
@@ -143,17 +396,22 @@ class SocketClient {
143
396
  });
144
397
 
145
398
  this.socket.on('disconnect', (reason) => {
146
- console.log('Disconnected from server:', reason);
399
+ // Enhanced logging for debugging disconnection issues
400
+ const disconnectInfo = {
401
+ reason: reason,
402
+ timestamp: new Date().toISOString(),
403
+ wasConnected: this.isConnected,
404
+ uptimeSeconds: this.lastConnectTime ? ((Date.now() - this.lastConnectTime) / 1000).toFixed(1) : 0,
405
+ lastPing: this.lastPingTime ? ((Date.now() - this.lastPingTime) / 1000).toFixed(1) + 's ago' : 'never',
406
+ lastPong: this.lastPongTime ? ((Date.now() - this.lastPongTime) / 1000).toFixed(1) + 's ago' : 'never'
407
+ };
408
+
409
+ console.log('Disconnected from server:', disconnectInfo);
410
+
147
411
  this.isConnected = false;
148
412
  this.isConnecting = false;
149
413
  this.disconnectTime = Date.now();
150
414
 
151
- // Calculate uptime
152
- if (this.lastConnectTime) {
153
- const uptime = (Date.now() - this.lastConnectTime) / 1000;
154
- console.log(`Connection uptime was ${uptime.toFixed(1)}s`);
155
- }
156
-
157
415
  this.notifyConnectionStatus(`Disconnected: ${reason}`, 'disconnected');
158
416
 
159
417
  // Emit disconnect callback
@@ -161,8 +419,21 @@ class SocketClient {
161
419
  callback(reason)
162
420
  );
163
421
 
164
- // Start auto-reconnect if it was an unexpected disconnect
165
- if (reason === 'transport close' || reason === 'ping timeout') {
422
+ // Detailed reason analysis for auto-reconnect decision
423
+ const reconnectReasons = [
424
+ 'transport close', // Network issue
425
+ 'ping timeout', // Server not responding
426
+ 'transport error', // Connection error
427
+ 'io server disconnect', // Server initiated disconnect (might be restart)
428
+ ];
429
+
430
+ if (reconnectReasons.includes(reason)) {
431
+ console.log(`Auto-reconnect triggered for reason: ${reason}`);
432
+ this.scheduleReconnect();
433
+ } else if (reason === 'io client disconnect') {
434
+ console.log('Client-initiated disconnect, not auto-reconnecting');
435
+ } else {
436
+ console.log(`Unknown disconnect reason: ${reason}, attempting reconnect anyway`);
166
437
  this.scheduleReconnect();
167
438
  }
168
439
  });
@@ -204,6 +475,12 @@ class SocketClient {
204
475
  return;
205
476
  }
206
477
 
478
+ // Code analysis events are now allowed to flow through to the events list for troubleshooting
479
+ // They will appear in both the Events tab and the Code tab
480
+ if (validatedEvent.type && validatedEvent.type.startsWith('code:')) {
481
+ console.log('Code analysis event received via claude_event, adding to events list for troubleshooting:', validatedEvent.type);
482
+ }
483
+
207
484
  // Transform event to match expected format (for backward compatibility)
208
485
  const transformedEvent = this.transformEvent(validatedEvent);
209
486
  console.log('Transformed event:', transformedEvent);
@@ -222,6 +499,30 @@ class SocketClient {
222
499
  });
223
500
  });
224
501
 
502
+ // Track pong responses from server
503
+ this.socket.on('pong', (data) => {
504
+ this.lastPongTime = Date.now();
505
+ // console.log('Received pong from server');
506
+ });
507
+
508
+ // Listen for heartbeat events from server (every 3 minutes)
509
+ this.socket.on('heartbeat', (data) => {
510
+ console.log('🫀 Received server heartbeat:', data);
511
+ // Add heartbeat to event list for visibility
512
+ this.addEvent({
513
+ type: 'system',
514
+ subtype: 'heartbeat',
515
+ timestamp: data.timestamp || new Date().toISOString(),
516
+ data: data
517
+ });
518
+
519
+ // Update last ping time to indicate server is alive
520
+ this.lastPingTime = Date.now();
521
+
522
+ // Log to console for debugging
523
+ console.log(`Server heartbeat #${data.heartbeat_number}: ${data.server_uptime_formatted} uptime, ${data.connected_clients} clients connected`);
524
+ });
525
+
225
526
  // Session and event handlers (legacy/fallback)
226
527
  this.socket.on('session.started', (data) => {
227
528
  this.addEvent({ type: 'session', subtype: 'started', timestamp: new Date().toISOString(), data });
@@ -247,13 +548,15 @@ class SocketClient {
247
548
  this.addEvent({ type: 'agent', subtype: 'executed', timestamp: new Date().toISOString(), data });
248
549
  });
249
550
 
250
- this.socket.on('hook.pre', (data) => {
251
- this.addEvent({ type: 'hook', subtype: 'pre', timestamp: new Date().toISOString(), data });
252
- });
551
+ // DISABLED: Legacy hook handlers - events now come through claude_event pathway
552
+ // to prevent duplication. Hook events are processed by the claude_event handler above.
553
+ // this.socket.on('hook.pre', (data) => {
554
+ // this.addEvent({ type: 'hook', subtype: 'pre', timestamp: new Date().toISOString(), data });
555
+ // });
253
556
 
254
- this.socket.on('hook.post', (data) => {
255
- this.addEvent({ type: 'hook', subtype: 'post', timestamp: new Date().toISOString(), data });
256
- });
557
+ // this.socket.on('hook.post', (data) => {
558
+ // this.addEvent({ type: 'hook', subtype: 'post', timestamp: new Date().toISOString(), data });
559
+ // });
257
560
 
258
561
  this.socket.on('todo.updated', (data) => {
259
562
  this.addEvent({ type: 'todo', subtype: 'updated', timestamp: new Date().toISOString(), data });
@@ -267,6 +570,57 @@ class SocketClient {
267
570
  this.addEvent({ type: 'log', subtype: 'entry', timestamp: new Date().toISOString(), data });
268
571
  });
269
572
 
573
+ // Code analysis events - now allowed to flow through for troubleshooting
574
+ // These are ALSO handled by the code-tree component and shown in the footer
575
+ // They will appear in both places: Events tab (for troubleshooting) and Code tab (for visualization)
576
+ this.socket.on('code:analysis:queued', (data) => {
577
+ // Add to events list for troubleshooting
578
+ console.log('Code analysis queued event received, adding to events list for troubleshooting');
579
+ this.addEvent({ type: 'code', subtype: 'analysis:queued', timestamp: new Date().toISOString(), data });
580
+ });
581
+
582
+ this.socket.on('code:analysis:accepted', (data) => {
583
+ // Add to events list for troubleshooting
584
+ console.log('Code analysis accepted event received, adding to events list for troubleshooting');
585
+ this.addEvent({ type: 'code', subtype: 'analysis:accepted', timestamp: new Date().toISOString(), data });
586
+ });
587
+
588
+ this.socket.on('code:analysis:start', (data) => {
589
+ // Add to events list for troubleshooting
590
+ console.log('Code analysis start event received, adding to events list for troubleshooting');
591
+ this.addEvent({ type: 'code', subtype: 'analysis:start', timestamp: new Date().toISOString(), data });
592
+ });
593
+
594
+ this.socket.on('code:analysis:complete', (data) => {
595
+ // Add to events list for troubleshooting
596
+ console.log('Code analysis complete event received, adding to events list for troubleshooting');
597
+ this.addEvent({ type: 'code', subtype: 'analysis:complete', timestamp: new Date().toISOString(), data });
598
+ });
599
+
600
+ this.socket.on('code:analysis:error', (data) => {
601
+ // Add to events list for troubleshooting
602
+ console.log('Code analysis error event received, adding to events list for troubleshooting');
603
+ this.addEvent({ type: 'code', subtype: 'analysis:error', timestamp: new Date().toISOString(), data });
604
+ });
605
+
606
+ this.socket.on('code:file:start', (data) => {
607
+ // Add to events list for troubleshooting
608
+ console.log('Code file start event received, adding to events list for troubleshooting');
609
+ this.addEvent({ type: 'code', subtype: 'file:start', timestamp: new Date().toISOString(), data });
610
+ });
611
+
612
+ this.socket.on('code:node:found', (data) => {
613
+ // Add to events list for troubleshooting
614
+ console.log('Code node found event received, adding to events list for troubleshooting');
615
+ this.addEvent({ type: 'code', subtype: 'node:found', timestamp: new Date().toISOString(), data });
616
+ });
617
+
618
+ this.socket.on('code:analysis:progress', (data) => {
619
+ // Add to events list for troubleshooting
620
+ console.log('Code analysis progress event received, adding to events list for troubleshooting');
621
+ this.addEvent({ type: 'code', subtype: 'analysis:progress', timestamp: new Date().toISOString(), data });
622
+ });
623
+
270
624
  this.socket.on('history', (data) => {
271
625
  console.log('Received event history:', data);
272
626
  if (data && Array.isArray(data.events)) {
@@ -504,12 +858,44 @@ class SocketClient {
504
858
  id: sessionId,
505
859
  startTime: eventData.timestamp,
506
860
  lastActivity: eventData.timestamp,
507
- eventCount: 0
861
+ eventCount: 0,
862
+ working_directory: null,
863
+ git_branch: null
508
864
  });
509
865
  }
510
866
  const session = this.sessions.get(sessionId);
511
867
  session.lastActivity = eventData.timestamp;
512
868
  session.eventCount++;
869
+
870
+ // Extract working directory from event data if available (prioritize newer data)
871
+ // Check multiple possible locations for working directory
872
+ const possiblePaths = [
873
+ eventData.data.cwd,
874
+ eventData.data.working_directory,
875
+ eventData.data.working_dir,
876
+ eventData.data.workingDirectory,
877
+ eventData.data.instance_info?.working_dir,
878
+ eventData.data.instance_info?.working_directory,
879
+ eventData.data.instance_info?.cwd,
880
+ eventData.cwd,
881
+ eventData.working_directory,
882
+ eventData.working_dir
883
+ ];
884
+
885
+ for (const path of possiblePaths) {
886
+ if (path && typeof path === 'string' && path.trim()) {
887
+ session.working_directory = path;
888
+ console.log(`[SOCKET-CLIENT] Found working directory for session ${sessionId}:`, path);
889
+ break;
890
+ }
891
+ }
892
+
893
+ // Extract git branch if available
894
+ if (eventData.data.git_branch) {
895
+ session.git_branch = eventData.data.git_branch;
896
+ } else if (eventData.data.instance_info && eventData.data.instance_info.git_branch) {
897
+ session.git_branch = eventData.data.instance_info.git_branch;
898
+ }
513
899
  }
514
900
 
515
901
  if (notify) {
@@ -580,6 +966,32 @@ class SocketClient {
580
966
  this.connectionCallbacks.event.push(callback);
581
967
  }
582
968
 
969
+ /**
970
+ * Subscribe to socket events (proxy to underlying socket)
971
+ * @param {string} event - Event name
972
+ * @param {Function} callback - Callback function
973
+ */
974
+ on(event, callback) {
975
+ if (this.socket) {
976
+ return this.socket.on(event, callback);
977
+ } else {
978
+ console.warn(`Cannot subscribe to '${event}': socket not initialized`);
979
+ }
980
+ }
981
+
982
+ /**
983
+ * Unsubscribe from socket events (proxy to underlying socket)
984
+ * @param {string} event - Event name
985
+ * @param {Function} callback - Callback function (optional)
986
+ */
987
+ off(event, callback) {
988
+ if (this.socket) {
989
+ return this.socket.off(event, callback);
990
+ } else {
991
+ console.warn(`Cannot unsubscribe from '${event}': socket not initialized`);
992
+ }
993
+ }
994
+
583
995
  /**
584
996
  * Notify connection status change
585
997
  * @param {string} status - Status message
@@ -698,6 +1110,7 @@ class SocketClient {
698
1110
  // 1. Hook events: { type: 'hook.pre_tool', timestamp: '...', data: {...} }
699
1111
  // 2. Legacy events: { event: 'TestStart', timestamp: '...', ... }
700
1112
  // 3. Standard events: { type: 'session', subtype: 'started', ... }
1113
+ // 4. Normalized events: { type: 'code', subtype: 'progress', ... } - already normalized, keep as-is
701
1114
 
702
1115
  if (!eventData) {
703
1116
  return eventData; // Return as-is if null/undefined
@@ -705,8 +1118,26 @@ class SocketClient {
705
1118
 
706
1119
  let transformedEvent = { ...eventData };
707
1120
 
1121
+ // Check if event is already normalized (has both type and subtype as separate fields)
1122
+ // This prevents double-transformation of events that were normalized on the backend
1123
+ const isAlreadyNormalized = eventData.type && eventData.subtype &&
1124
+ !eventData.type.includes('.') &&
1125
+ !eventData.type.includes(':');
1126
+
1127
+ if (isAlreadyNormalized) {
1128
+ // Event is already properly normalized from backend, just preserve it
1129
+ // Store a composite originalEventName for display if needed
1130
+ if (!transformedEvent.originalEventName) {
1131
+ if (eventData.subtype === 'generic' || eventData.type === eventData.subtype) {
1132
+ transformedEvent.originalEventName = eventData.type;
1133
+ } else {
1134
+ transformedEvent.originalEventName = `${eventData.type}.${eventData.subtype}`;
1135
+ }
1136
+ }
1137
+ // Return early to avoid further transformation
1138
+ }
708
1139
  // Handle legacy format with 'event' field but no 'type'
709
- if (!eventData.type && eventData.event) {
1140
+ else if (!eventData.type && eventData.event) {
710
1141
  // Map common event names to proper type/subtype
711
1142
  const eventName = eventData.event;
712
1143
 
@@ -737,8 +1168,10 @@ class SocketClient {
737
1168
 
738
1169
  // Remove the 'event' field to avoid confusion
739
1170
  delete transformedEvent.event;
1171
+ // Store original event name for display purposes
1172
+ transformedEvent.originalEventName = eventName;
740
1173
  }
741
- // Handle standard format with 'type' field
1174
+ // Handle standard format with 'type' field that needs transformation
742
1175
  else if (eventData.type) {
743
1176
  const type = eventData.type;
744
1177
 
@@ -747,25 +1180,43 @@ class SocketClient {
747
1180
  const subtype = type.substring(5); // Remove 'hook.' prefix
748
1181
  transformedEvent.type = 'hook';
749
1182
  transformedEvent.subtype = subtype;
1183
+ transformedEvent.originalEventName = type;
1184
+ }
1185
+ // Transform 'code:*' events to proper code type
1186
+ // Handle multi-level subtypes like 'code:analysis:queued'
1187
+ else if (type.startsWith('code:')) {
1188
+ transformedEvent.type = 'code';
1189
+ // Replace colons with underscores in subtype for consistency
1190
+ const subtypePart = type.substring(5); // Remove 'code:' prefix
1191
+ transformedEvent.subtype = subtypePart.replace(/:/g, '_');
1192
+ transformedEvent.originalEventName = type;
750
1193
  }
751
1194
  // Transform other dotted types like 'session.started' -> type: 'session', subtype: 'started'
752
1195
  else if (type.includes('.')) {
753
1196
  const [mainType, ...subtypeParts] = type.split('.');
754
1197
  transformedEvent.type = mainType;
755
1198
  transformedEvent.subtype = subtypeParts.join('.');
1199
+ transformedEvent.originalEventName = type;
1200
+ }
1201
+ // Transform any remaining colon-separated types generically
1202
+ else if (type.includes(':')) {
1203
+ const parts = type.split(':', 2); // Split into max 2 parts
1204
+ transformedEvent.type = parts[0];
1205
+ // Replace any remaining colons with underscores in subtype
1206
+ transformedEvent.subtype = parts.length > 1 ? parts[1].replace(/:/g, '_') : 'generic';
1207
+ transformedEvent.originalEventName = type;
1208
+ }
1209
+ // If type doesn't need transformation but has no subtype, set a default
1210
+ else if (!eventData.subtype) {
1211
+ transformedEvent.subtype = 'generic';
1212
+ transformedEvent.originalEventName = type;
756
1213
  }
757
1214
  }
758
1215
  // If no type and no event field, mark as unknown
759
1216
  else {
760
1217
  transformedEvent.type = 'unknown';
761
1218
  transformedEvent.subtype = '';
762
- }
763
-
764
- // Store original event name for display purposes (before any transformation)
765
- if (!eventData.type && eventData.event) {
766
- transformedEvent.originalEventName = eventData.event;
767
- } else if (eventData.type) {
768
- transformedEvent.originalEventName = eventData.type;
1219
+ transformedEvent.originalEventName = 'unknown';
769
1220
  }
770
1221
 
771
1222
  // Extract and flatten data fields to top level for dashboard compatibility
@@ -787,8 +1238,11 @@ class SocketClient {
787
1238
  transformedEvent[key] = eventData.data[key];
788
1239
  }
789
1240
  } else {
790
- // Log warning if data field would overwrite a protected field
791
- console.warn(`Protected field '${key}' in data object was not copied to top level to preserve event structure`);
1241
+ // Log debug info if data field would overwrite a protected field
1242
+ // Only log for non-timestamp fields to reduce noise
1243
+ if (key !== 'timestamp') {
1244
+ console.debug(`Protected field '${key}' in data object was not copied to top level to preserve event structure`);
1245
+ }
792
1246
  }
793
1247
  });
794
1248
 
@@ -796,11 +1250,40 @@ class SocketClient {
796
1250
  transformedEvent.data = eventData.data;
797
1251
  }
798
1252
 
1253
+ // Add hook_event_name for ActivityTree compatibility
1254
+ // Map the type/subtype structure to the expected hook_event_name format
1255
+ if (transformedEvent.type === 'hook') {
1256
+ if (transformedEvent.subtype === 'pre_tool') {
1257
+ transformedEvent.hook_event_name = 'PreToolUse';
1258
+ } else if (transformedEvent.subtype === 'post_tool') {
1259
+ transformedEvent.hook_event_name = 'PostToolUse';
1260
+ } else if (transformedEvent.subtype === 'subagent_start') {
1261
+ transformedEvent.hook_event_name = 'SubagentStart';
1262
+ } else if (transformedEvent.subtype === 'subagent_stop') {
1263
+ transformedEvent.hook_event_name = 'SubagentStop';
1264
+ } else if (transformedEvent.subtype === 'todo_write') {
1265
+ transformedEvent.hook_event_name = 'TodoWrite';
1266
+ } else if (transformedEvent.subtype === 'start') {
1267
+ transformedEvent.hook_event_name = 'Start';
1268
+ } else if (transformedEvent.subtype === 'stop') {
1269
+ transformedEvent.hook_event_name = 'Stop';
1270
+ }
1271
+ } else if (transformedEvent.type === 'subagent') {
1272
+ if (transformedEvent.subtype === 'start') {
1273
+ transformedEvent.hook_event_name = 'SubagentStart';
1274
+ } else if (transformedEvent.subtype === 'stop') {
1275
+ transformedEvent.hook_event_name = 'SubagentStop';
1276
+ }
1277
+ } else if (transformedEvent.type === 'todo' && transformedEvent.subtype === 'updated') {
1278
+ transformedEvent.hook_event_name = 'TodoWrite';
1279
+ }
1280
+
799
1281
  // Debug logging for tool events
800
1282
  if (transformedEvent.type === 'hook' && (transformedEvent.subtype === 'pre_tool' || transformedEvent.subtype === 'post_tool')) {
801
1283
  console.log('Transformed tool event:', {
802
1284
  type: transformedEvent.type,
803
1285
  subtype: transformedEvent.subtype,
1286
+ hook_event_name: transformedEvent.hook_event_name,
804
1287
  tool_name: transformedEvent.tool_name,
805
1288
  has_tool_parameters: !!transformedEvent.tool_parameters,
806
1289
  tool_parameters: transformedEvent.tool_parameters,
@@ -906,6 +1389,12 @@ class SocketClient {
906
1389
  actualType = 'connected';
907
1390
  this.isConnected = true;
908
1391
  this.isConnecting = false;
1392
+
1393
+ // Expose socket globally when connected
1394
+ if (!window.socket) {
1395
+ window.socket = this.socket;
1396
+ console.log('SocketClient: Exposed socket globally as window.socket');
1397
+ }
909
1398
  } else if (this.socket.connecting || this.isConnecting) {
910
1399
  actualStatus = 'Connecting...';
911
1400
  actualType = 'connecting';
@@ -918,17 +1407,15 @@ class SocketClient {
918
1407
  }
919
1408
  }
920
1409
 
921
- // Check if UI needs updating
1410
+ // Always update status to ensure consistency
1411
+ this.updateConnectionStatusDOM(actualStatus, actualType);
1412
+
1413
+ // Also ensure state is consistent
922
1414
  const statusElement = document.getElementById('connection-status');
923
1415
  if (statusElement) {
924
1416
  const currentText = statusElement.textContent.replace('●', '').trim();
925
- const currentClass = statusElement.className;
926
- const expectedClass = `status-badge status-${actualType}`;
927
-
928
- // Update if status text or class doesn't match
929
- if (currentText !== actualStatus || currentClass !== expectedClass) {
930
- console.log(`SocketClient: Fallback update - was '${currentText}' (${currentClass}), now '${actualStatus}' (${expectedClass})`);
931
- this.updateConnectionStatusDOM(actualStatus, actualType);
1417
+ if (currentText !== actualStatus) {
1418
+ console.log(`SocketClient: Status sync - updating from '${currentText}' to '${actualStatus}'`);
932
1419
  }
933
1420
  }
934
1421
  }