claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (792) 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 +432 -158
  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/OUTPUT_STYLE.md +254 -29
  13. claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
  14. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  15. claude_mpm/agents/WORKFLOW.md +355 -191
  16. claude_mpm/agents/__init__.py +6 -0
  17. claude_mpm/agents/agent_loader.py +41 -14
  18. claude_mpm/agents/agent_loader_integration.py +3 -2
  19. claude_mpm/agents/async_agent_loader.py +3 -3
  20. claude_mpm/agents/base_agent.json +6 -3
  21. claude_mpm/agents/base_agent_loader.py +21 -44
  22. claude_mpm/agents/frontmatter_validator.py +292 -252
  23. claude_mpm/agents/system_agent_config.py +3 -2
  24. claude_mpm/agents/templates/README.md +465 -0
  25. claude_mpm/agents/templates/circuit-breakers.md +1005 -0
  26. claude_mpm/agents/templates/context-management-examples.md +544 -0
  27. claude_mpm/agents/templates/git-file-tracking.md +584 -0
  28. claude_mpm/agents/templates/pm-examples.md +474 -0
  29. claude_mpm/agents/templates/pm-red-flags.md +310 -0
  30. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  31. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  32. claude_mpm/agents/templates/response-format.md +583 -0
  33. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  34. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  35. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  36. claude_mpm/agents/templates/validation-templates.md +312 -0
  37. claude_mpm/cli/__init__.py +72 -376
  38. claude_mpm/cli/commands/__init__.py +4 -0
  39. claude_mpm/cli/commands/agent_manager.py +675 -20
  40. claude_mpm/cli/commands/agent_source.py +774 -0
  41. claude_mpm/cli/commands/agent_state_manager.py +344 -0
  42. claude_mpm/cli/commands/agents.py +1673 -178
  43. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  44. claude_mpm/cli/commands/agents_detect.py +380 -0
  45. claude_mpm/cli/commands/agents_discover.py +338 -0
  46. claude_mpm/cli/commands/agents_recommend.py +309 -0
  47. claude_mpm/cli/commands/aggregate.py +11 -7
  48. claude_mpm/cli/commands/analyze.py +18 -13
  49. claude_mpm/cli/commands/analyze_code.py +8 -4
  50. claude_mpm/cli/commands/auto_configure.py +566 -0
  51. claude_mpm/cli/commands/cleanup.py +12 -12
  52. claude_mpm/cli/commands/config.py +54 -17
  53. claude_mpm/cli/commands/configure.py +1184 -1055
  54. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  55. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  56. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  57. claude_mpm/cli/commands/configure_models.py +18 -0
  58. claude_mpm/cli/commands/configure_navigation.py +184 -0
  59. claude_mpm/cli/commands/configure_paths.py +104 -0
  60. claude_mpm/cli/commands/configure_persistence.py +254 -0
  61. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  62. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  63. claude_mpm/cli/commands/configure_validators.py +73 -0
  64. claude_mpm/cli/commands/dashboard.py +50 -52
  65. claude_mpm/cli/commands/debug.py +19 -19
  66. claude_mpm/cli/commands/doctor.py +51 -7
  67. claude_mpm/cli/commands/hook_errors.py +277 -0
  68. claude_mpm/cli/commands/info.py +3 -4
  69. claude_mpm/cli/commands/local_deploy.py +534 -0
  70. claude_mpm/cli/commands/mcp.py +17 -10
  71. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  72. claude_mpm/cli/commands/mcp_config.py +154 -0
  73. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  74. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  75. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  76. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  77. claude_mpm/cli/commands/memory.py +55 -21
  78. claude_mpm/cli/commands/monitor.py +160 -70
  79. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  80. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  81. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  82. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  83. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  84. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  85. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  86. claude_mpm/cli/commands/mpm_init_handler.py +114 -4
  87. claude_mpm/cli/commands/postmortem.py +401 -0
  88. claude_mpm/cli/commands/run.py +252 -167
  89. claude_mpm/cli/commands/search.py +458 -0
  90. claude_mpm/cli/commands/skill_source.py +694 -0
  91. claude_mpm/cli/commands/skills.py +1225 -0
  92. claude_mpm/cli/commands/uninstall.py +176 -0
  93. claude_mpm/cli/commands/upgrade.py +152 -0
  94. claude_mpm/cli/commands/verify.py +119 -0
  95. claude_mpm/cli/executor.py +279 -0
  96. claude_mpm/cli/helpers.py +105 -0
  97. claude_mpm/cli/interactive/__init__.py +21 -0
  98. claude_mpm/cli/interactive/agent_wizard.py +1872 -0
  99. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  100. claude_mpm/cli/parser.py +79 -2
  101. claude_mpm/cli/parsers/__init__.py +7 -1
  102. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  103. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  104. claude_mpm/cli/parsers/agents_parser.py +369 -1
  105. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  106. claude_mpm/cli/parsers/base_parser.py +196 -3
  107. claude_mpm/cli/parsers/config_parser.py +96 -43
  108. claude_mpm/cli/parsers/configure_parser.py +11 -15
  109. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  110. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  111. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  112. claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
  113. claude_mpm/cli/parsers/run_parser.py +5 -0
  114. claude_mpm/cli/parsers/search_parser.py +245 -0
  115. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  116. claude_mpm/cli/parsers/skills_parser.py +282 -0
  117. claude_mpm/cli/parsers/source_parser.py +138 -0
  118. claude_mpm/cli/shared/argument_patterns.py +20 -13
  119. claude_mpm/cli/shared/base_command.py +2 -2
  120. claude_mpm/cli/shared/output_formatters.py +28 -19
  121. claude_mpm/cli/startup.py +994 -0
  122. claude_mpm/cli/startup_display.py +480 -0
  123. claude_mpm/cli/startup_logging.py +179 -13
  124. claude_mpm/cli/utils.py +54 -3
  125. claude_mpm/cli_module/commands.py +1 -1
  126. claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
  127. claude_mpm/commands/mpm-agents-detect.md +177 -0
  128. claude_mpm/commands/mpm-agents-list.md +131 -0
  129. claude_mpm/commands/mpm-agents-recommend.md +223 -0
  130. claude_mpm/commands/mpm-config-view.md +150 -0
  131. claude_mpm/commands/mpm-doctor.md +9 -0
  132. claude_mpm/commands/mpm-help.md +297 -5
  133. claude_mpm/commands/mpm-init.md +401 -17
  134. claude_mpm/commands/mpm-monitor.md +418 -0
  135. claude_mpm/commands/mpm-postmortem.md +123 -0
  136. claude_mpm/commands/mpm-session-resume.md +381 -0
  137. claude_mpm/commands/mpm-status.md +79 -8
  138. claude_mpm/commands/mpm-ticket-organize.md +304 -0
  139. claude_mpm/commands/mpm-ticket-view.md +552 -0
  140. claude_mpm/commands/mpm-version.md +122 -0
  141. claude_mpm/commands/mpm.md +12 -0
  142. claude_mpm/config/agent_config.py +4 -4
  143. claude_mpm/config/agent_presets.py +488 -0
  144. claude_mpm/config/agent_sources.py +325 -0
  145. claude_mpm/config/experimental_features.py +7 -7
  146. claude_mpm/config/model_config.py +428 -0
  147. claude_mpm/config/paths.py +3 -2
  148. claude_mpm/config/skill_presets.py +392 -0
  149. claude_mpm/config/skill_sources.py +590 -0
  150. claude_mpm/config/socketio_config.py +3 -3
  151. claude_mpm/constants.py +28 -1
  152. claude_mpm/core/__init__.py +53 -17
  153. claude_mpm/core/agent_name_normalizer.py +3 -2
  154. claude_mpm/core/agent_registry.py +2 -2
  155. claude_mpm/core/agent_session_manager.py +10 -10
  156. claude_mpm/core/api_validator.py +330 -0
  157. claude_mpm/core/base_service.py +33 -23
  158. claude_mpm/core/cache.py +9 -9
  159. claude_mpm/core/claude_runner.py +24 -42
  160. claude_mpm/core/config.py +101 -8
  161. claude_mpm/core/config_aliases.py +7 -6
  162. claude_mpm/core/constants.py +66 -1
  163. claude_mpm/core/container.py +11 -5
  164. claude_mpm/core/enums.py +452 -0
  165. claude_mpm/core/error_handler.py +623 -0
  166. claude_mpm/core/factories.py +1 -1
  167. claude_mpm/core/file_utils.py +764 -0
  168. claude_mpm/core/framework/__init__.py +25 -0
  169. claude_mpm/core/framework/formatters/__init__.py +11 -0
  170. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  171. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  172. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  173. claude_mpm/core/framework/loaders/__init__.py +13 -0
  174. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  175. claude_mpm/core/framework/loaders/file_loader.py +176 -0
  176. claude_mpm/core/framework/loaders/instruction_loader.py +181 -0
  177. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  178. claude_mpm/core/framework/processors/__init__.py +11 -0
  179. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  180. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  181. claude_mpm/core/framework/processors/template_processor.py +244 -0
  182. claude_mpm/core/framework_loader.py +321 -1631
  183. claude_mpm/core/hook_error_memory.py +381 -0
  184. claude_mpm/core/hook_manager.py +49 -8
  185. claude_mpm/core/injectable_service.py +11 -8
  186. claude_mpm/core/instruction_reinforcement_hook.py +4 -3
  187. claude_mpm/core/interactive_session.py +146 -18
  188. claude_mpm/core/interfaces.py +56 -1
  189. claude_mpm/core/lazy.py +3 -3
  190. claude_mpm/core/log_manager.py +92 -23
  191. claude_mpm/core/logger.py +22 -15
  192. claude_mpm/core/logging_config.py +6 -2
  193. claude_mpm/core/logging_utils.py +520 -0
  194. claude_mpm/core/oneshot_session.py +122 -15
  195. claude_mpm/core/optimized_agent_loader.py +9 -9
  196. claude_mpm/core/optimized_startup.py +1 -1
  197. claude_mpm/core/output_style_manager.py +12 -192
  198. claude_mpm/core/pm_hook_interceptor.py +18 -12
  199. claude_mpm/core/protocols/__init__.py +23 -0
  200. claude_mpm/core/protocols/runner_protocol.py +103 -0
  201. claude_mpm/core/protocols/session_protocol.py +131 -0
  202. claude_mpm/core/service_registry.py +7 -3
  203. claude_mpm/core/session_manager.py +14 -12
  204. claude_mpm/core/shared/config_loader.py +1 -1
  205. claude_mpm/core/shared/singleton_manager.py +11 -4
  206. claude_mpm/core/socketio_pool.py +15 -15
  207. claude_mpm/core/system_context.py +38 -0
  208. claude_mpm/core/tool_access_control.py +3 -2
  209. claude_mpm/core/types.py +4 -11
  210. claude_mpm/core/typing_utils.py +7 -6
  211. claude_mpm/core/unified_agent_registry.py +115 -11
  212. claude_mpm/core/unified_config.py +6 -6
  213. claude_mpm/core/unified_paths.py +23 -20
  214. claude_mpm/dashboard/analysis_runner.py +4 -4
  215. claude_mpm/dashboard/api/simple_directory.py +261 -0
  216. claude_mpm/dashboard/static/css/activity.css +69 -69
  217. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  218. claude_mpm/dashboard/static/css/dashboard.css +600 -18
  219. claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
  220. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
  221. claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
  222. claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
  223. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  224. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  225. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  226. claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
  227. claude_mpm/dashboard/static/js/components/event-viewer.js +50 -13
  228. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  229. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  230. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  231. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +36 -16
  232. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  233. claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
  234. claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
  235. claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
  236. claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
  237. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
  238. claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
  239. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  240. claude_mpm/dashboard/static/js/dashboard.js +309 -178
  241. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  242. claude_mpm/dashboard/static/js/socket-client.js +183 -139
  243. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  244. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  245. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  246. claude_mpm/dashboard/templates/code_simple.html +153 -0
  247. claude_mpm/dashboard/templates/index.html +125 -122
  248. claude_mpm/experimental/cli_enhancements.py +5 -7
  249. claude_mpm/generators/agent_profile_generator.py +5 -3
  250. claude_mpm/hooks/__init__.py +37 -1
  251. claude_mpm/hooks/base_hook.py +5 -4
  252. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  253. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  254. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  255. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  256. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  257. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  258. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  259. claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
  260. claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
  261. claude_mpm/hooks/claude_hooks/installer.py +67 -22
  262. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  263. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  264. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  267. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  268. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  269. claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
  270. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  271. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  272. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  273. claude_mpm/hooks/failure_learning/__init__.py +54 -0
  274. claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
  275. claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
  276. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
  277. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  278. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  279. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  280. claude_mpm/hooks/kuzu_response_hook.py +179 -0
  281. claude_mpm/hooks/memory_integration_hook.py +1 -1
  282. claude_mpm/hooks/session_resume_hook.py +121 -0
  283. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  284. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  285. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  286. claude_mpm/hooks/validation_hooks.py +3 -3
  287. claude_mpm/init.py +23 -4
  288. claude_mpm/models/agent_session.py +8 -6
  289. claude_mpm/models/git_repository.py +198 -0
  290. claude_mpm/models/resume_log.py +340 -0
  291. claude_mpm/scripts/claude-hook-handler.sh +35 -9
  292. claude_mpm/scripts/launch_monitor.py +85 -0
  293. claude_mpm/scripts/mcp_server.py +3 -5
  294. claude_mpm/scripts/mpm_doctor.py +3 -2
  295. claude_mpm/scripts/socketio_daemon.py +159 -512
  296. claude_mpm/scripts/start_activity_logging.py +3 -1
  297. claude_mpm/services/__init__.py +144 -160
  298. claude_mpm/services/agents/__init__.py +18 -5
  299. claude_mpm/services/agents/agent_builder.py +56 -18
  300. claude_mpm/services/agents/agent_preset_service.py +238 -0
  301. claude_mpm/services/agents/agent_selection_service.py +484 -0
  302. claude_mpm/services/agents/auto_config_manager.py +796 -0
  303. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  304. claude_mpm/services/agents/cache_git_manager.py +621 -0
  305. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  306. claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
  307. claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
  308. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  309. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  310. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -7
  311. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  312. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  313. claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
  314. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  315. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  316. claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
  317. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  318. claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
  319. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  320. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  321. claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
  322. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  323. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  324. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  325. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  326. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  327. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  328. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +249 -53
  329. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  330. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  331. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  332. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  333. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  334. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  335. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +10 -10
  336. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  337. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  338. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -43
  339. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  340. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  341. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  342. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  343. claude_mpm/services/agents/git_source_manager.py +629 -0
  344. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  345. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  346. claude_mpm/services/agents/loading/framework_agent_loader.py +11 -14
  347. claude_mpm/services/agents/local_template_manager.py +784 -0
  348. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  349. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  350. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  351. claude_mpm/services/agents/memory/content_manager.py +17 -9
  352. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  353. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  354. claude_mpm/services/agents/memory/memory_format_service.py +6 -4
  355. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  356. claude_mpm/services/agents/memory/template_generator.py +3 -3
  357. claude_mpm/services/agents/observers.py +547 -0
  358. claude_mpm/services/agents/recommender.py +615 -0
  359. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  360. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  361. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  362. claude_mpm/services/agents/sources/__init__.py +13 -0
  363. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  364. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  365. claude_mpm/services/agents/startup_sync.py +239 -0
  366. claude_mpm/services/agents/toolchain_detector.py +474 -0
  367. claude_mpm/services/analysis/__init__.py +25 -0
  368. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  369. claude_mpm/services/analysis/postmortem_service.py +765 -0
  370. claude_mpm/services/async_session_logger.py +141 -98
  371. claude_mpm/services/claude_session_logger.py +82 -74
  372. claude_mpm/services/cli/agent_cleanup_service.py +5 -0
  373. claude_mpm/services/cli/agent_listing_service.py +5 -5
  374. claude_mpm/services/cli/agent_validation_service.py +3 -1
  375. claude_mpm/services/cli/memory_crud_service.py +12 -7
  376. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  377. claude_mpm/services/cli/resume_service.py +617 -0
  378. claude_mpm/services/cli/session_manager.py +104 -13
  379. claude_mpm/services/cli/session_pause_manager.py +504 -0
  380. claude_mpm/services/cli/session_resume_helper.py +372 -0
  381. claude_mpm/services/cli/startup_checker.py +13 -10
  382. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  383. claude_mpm/services/command_deployment_service.py +209 -13
  384. claude_mpm/services/command_handler_service.py +11 -5
  385. claude_mpm/services/core/__init__.py +33 -1
  386. claude_mpm/services/core/base.py +31 -11
  387. claude_mpm/services/core/interfaces/__init__.py +88 -3
  388. claude_mpm/services/core/interfaces/agent.py +184 -0
  389. claude_mpm/services/core/interfaces/health.py +169 -0
  390. claude_mpm/services/core/interfaces/model.py +281 -0
  391. claude_mpm/services/core/interfaces/process.py +372 -0
  392. claude_mpm/services/core/interfaces/project.py +121 -0
  393. claude_mpm/services/core/interfaces/restart.py +307 -0
  394. claude_mpm/services/core/interfaces/stability.py +260 -0
  395. claude_mpm/services/core/interfaces.py +56 -1
  396. claude_mpm/services/core/memory_manager.py +92 -47
  397. claude_mpm/services/core/models/__init__.py +70 -0
  398. claude_mpm/services/core/models/agent_config.py +384 -0
  399. claude_mpm/services/core/models/health.py +162 -0
  400. claude_mpm/services/core/models/process.py +239 -0
  401. claude_mpm/services/core/models/restart.py +302 -0
  402. claude_mpm/services/core/models/stability.py +264 -0
  403. claude_mpm/services/core/models/toolchain.py +306 -0
  404. claude_mpm/services/core/path_resolver.py +36 -14
  405. claude_mpm/services/diagnostics/__init__.py +2 -2
  406. claude_mpm/services/diagnostics/checks/__init__.py +8 -2
  407. claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
  408. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  409. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  410. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  411. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  412. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  413. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  414. claude_mpm/services/diagnostics/checks/instructions_check.py +21 -21
  415. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
  416. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
  417. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
  418. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  419. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  420. claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
  421. claude_mpm/services/diagnostics/doctor_reporter.py +305 -47
  422. claude_mpm/services/diagnostics/models.py +37 -21
  423. claude_mpm/services/event_aggregator.py +5 -3
  424. claude_mpm/services/event_bus/direct_relay.py +11 -7
  425. claude_mpm/services/event_bus/event_bus.py +51 -9
  426. claude_mpm/services/event_bus/relay.py +33 -14
  427. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  428. claude_mpm/services/events/consumers/logging.py +1 -2
  429. claude_mpm/services/events/core.py +5 -6
  430. claude_mpm/services/events/producers/hook.py +6 -6
  431. claude_mpm/services/events/producers/system.py +8 -8
  432. claude_mpm/services/exceptions.py +5 -5
  433. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  434. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  435. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  436. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  437. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  438. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  439. claude_mpm/services/git/__init__.py +21 -0
  440. claude_mpm/services/git/git_operations_service.py +494 -0
  441. claude_mpm/services/github/__init__.py +21 -0
  442. claude_mpm/services/github/github_cli_service.py +397 -0
  443. claude_mpm/services/hook_installer_service.py +506 -0
  444. claude_mpm/services/hook_service.py +5 -6
  445. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  446. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  447. claude_mpm/services/infrastructure/logging.py +2 -2
  448. claude_mpm/services/infrastructure/monitoring/__init__.py +2 -6
  449. claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
  450. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  451. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  452. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  453. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  454. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  455. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  456. claude_mpm/services/instructions/__init__.py +9 -0
  457. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  458. claude_mpm/services/local_ops/__init__.py +155 -0
  459. claude_mpm/services/local_ops/crash_detector.py +257 -0
  460. claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
  461. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  462. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  463. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  464. claude_mpm/services/local_ops/health_manager.py +427 -0
  465. claude_mpm/services/local_ops/log_monitor.py +396 -0
  466. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  467. claude_mpm/services/local_ops/process_manager.py +595 -0
  468. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  469. claude_mpm/services/local_ops/restart_manager.py +401 -0
  470. claude_mpm/services/local_ops/restart_policy.py +387 -0
  471. claude_mpm/services/local_ops/state_manager.py +372 -0
  472. claude_mpm/services/local_ops/unified_manager.py +600 -0
  473. claude_mpm/services/mcp_config_manager.py +1542 -0
  474. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  475. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  476. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  477. claude_mpm/services/mcp_gateway/config/configuration.py +24 -5
  478. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  479. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  480. claude_mpm/services/mcp_gateway/core/process_pool.py +591 -31
  481. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  482. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  483. claude_mpm/services/mcp_gateway/main.py +90 -15
  484. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  485. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  486. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +5 -10
  487. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
  488. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  489. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  490. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  491. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  492. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  493. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  494. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +555 -0
  495. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  496. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  497. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  498. claude_mpm/services/mcp_service_verifier.py +732 -0
  499. claude_mpm/services/memory/builder.py +9 -8
  500. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  501. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  502. claude_mpm/services/memory/failure_tracker.py +578 -0
  503. claude_mpm/services/memory/indexed_memory.py +8 -8
  504. claude_mpm/services/memory/optimizer.py +8 -9
  505. claude_mpm/services/memory/router.py +3 -3
  506. claude_mpm/services/memory_hook_service.py +165 -4
  507. claude_mpm/services/model/__init__.py +147 -0
  508. claude_mpm/services/model/base_provider.py +365 -0
  509. claude_mpm/services/model/claude_provider.py +412 -0
  510. claude_mpm/services/model/model_router.py +452 -0
  511. claude_mpm/services/model/ollama_provider.py +415 -0
  512. claude_mpm/services/monitor/__init__.py +20 -0
  513. claude_mpm/services/monitor/daemon.py +691 -0
  514. claude_mpm/services/monitor/daemon_manager.py +1040 -0
  515. claude_mpm/services/monitor/event_emitter.py +350 -0
  516. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  517. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  518. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  519. claude_mpm/services/monitor/handlers/file.py +264 -0
  520. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  521. claude_mpm/services/monitor/management/__init__.py +18 -0
  522. claude_mpm/services/monitor/management/health.py +124 -0
  523. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  524. claude_mpm/services/monitor/server.py +817 -0
  525. claude_mpm/services/monitor_build_service.py +2 -2
  526. claude_mpm/services/native_agent_converter.py +356 -0
  527. claude_mpm/services/orphan_detection.py +786 -0
  528. claude_mpm/services/port_manager.py +3 -3
  529. claude_mpm/services/pr/__init__.py +14 -0
  530. claude_mpm/services/pr/pr_template_service.py +329 -0
  531. claude_mpm/services/project/__init__.py +23 -0
  532. claude_mpm/services/project/analyzer.py +3 -3
  533. claude_mpm/services/project/architecture_analyzer.py +5 -5
  534. claude_mpm/services/project/archive_manager.py +1045 -0
  535. claude_mpm/services/project/dependency_analyzer.py +4 -4
  536. claude_mpm/services/project/detection_strategies.py +719 -0
  537. claude_mpm/services/project/documentation_manager.py +554 -0
  538. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  539. claude_mpm/services/project/metrics_collector.py +4 -4
  540. claude_mpm/services/project/project_organizer.py +1005 -0
  541. claude_mpm/services/project/registry.py +13 -7
  542. claude_mpm/services/project/toolchain_analyzer.py +583 -0
  543. claude_mpm/services/project_port_allocator.py +596 -0
  544. claude_mpm/services/response_tracker.py +21 -10
  545. claude_mpm/services/runner_configuration_service.py +17 -3
  546. claude_mpm/services/self_upgrade_service.py +500 -0
  547. claude_mpm/services/session_management_service.py +23 -9
  548. claude_mpm/services/session_manager.py +380 -0
  549. claude_mpm/services/shared/__init__.py +2 -1
  550. claude_mpm/services/shared/async_service_base.py +16 -27
  551. claude_mpm/services/shared/config_service_base.py +17 -14
  552. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  553. claude_mpm/services/shared/service_factory.py +8 -5
  554. claude_mpm/services/skills/__init__.py +18 -0
  555. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  556. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  557. claude_mpm/services/skills_config.py +547 -0
  558. claude_mpm/services/skills_deployer.py +955 -0
  559. claude_mpm/services/socketio/client_proxy.py +60 -5
  560. claude_mpm/services/socketio/dashboard_server.py +361 -0
  561. claude_mpm/services/socketio/event_normalizer.py +10 -6
  562. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  563. claude_mpm/services/socketio/handlers/base.py +2 -2
  564. claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
  565. claude_mpm/services/socketio/handlers/connection.py +22 -41
  566. claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
  567. claude_mpm/services/socketio/handlers/file.py +46 -10
  568. claude_mpm/services/socketio/handlers/git.py +9 -9
  569. claude_mpm/services/socketio/handlers/hook.py +29 -17
  570. claude_mpm/services/socketio/handlers/registry.py +4 -2
  571. claude_mpm/services/socketio/monitor_client.py +364 -0
  572. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  573. claude_mpm/services/socketio/server/connection_manager.py +2 -2
  574. claude_mpm/services/socketio/server/core.py +142 -8
  575. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  576. claude_mpm/services/socketio/server/main.py +24 -24
  577. claude_mpm/services/socketio_client_manager.py +4 -4
  578. claude_mpm/services/subprocess_launcher_service.py +19 -15
  579. claude_mpm/services/system_instructions_service.py +3 -5
  580. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  581. claude_mpm/services/ticket_services/validation_service.py +5 -5
  582. claude_mpm/services/unified/__init__.py +65 -0
  583. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  584. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  585. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  586. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
  587. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
  588. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  589. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  590. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  591. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  592. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  593. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  594. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  595. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  596. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  597. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  598. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  599. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  600. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  601. claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
  602. claude_mpm/services/unified/interfaces.py +475 -0
  603. claude_mpm/services/unified/migration.py +509 -0
  604. claude_mpm/services/unified/strategies.py +534 -0
  605. claude_mpm/services/unified/unified_analyzer.py +542 -0
  606. claude_mpm/services/unified/unified_config.py +691 -0
  607. claude_mpm/services/unified/unified_deployment.py +466 -0
  608. claude_mpm/services/utility_service.py +6 -3
  609. claude_mpm/services/version_control/branch_strategy.py +2 -2
  610. claude_mpm/services/version_control/conflict_resolution.py +14 -8
  611. claude_mpm/services/version_control/git_operations.py +26 -24
  612. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  613. claude_mpm/services/version_control/version_parser.py +14 -11
  614. claude_mpm/services/version_service.py +104 -1
  615. claude_mpm/services/visualization/__init__.py +1 -5
  616. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  617. claude_mpm/skills/__init__.py +42 -0
  618. claude_mpm/skills/agent_skills_injector.py +324 -0
  619. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  620. claude_mpm/skills/bundled/__init__.py +6 -0
  621. claude_mpm/skills/bundled/api-documentation.md +393 -0
  622. claude_mpm/skills/bundled/async-testing.md +571 -0
  623. claude_mpm/skills/bundled/code-review.md +143 -0
  624. claude_mpm/skills/bundled/database-migration.md +199 -0
  625. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  626. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  627. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  628. claude_mpm/skills/bundled/git-workflow.md +414 -0
  629. claude_mpm/skills/bundled/imagemagick.md +204 -0
  630. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  631. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  632. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  633. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  634. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  635. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  636. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  637. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  638. claude_mpm/skills/bundled/pdf.md +141 -0
  639. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  640. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  641. claude_mpm/skills/bundled/security-scanning.md +327 -0
  642. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  643. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  644. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  645. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  646. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  647. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  648. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  649. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  650. claude_mpm/skills/bundled/xlsx.md +157 -0
  651. claude_mpm/skills/registry.py +286 -0
  652. claude_mpm/skills/skill_manager.py +310 -0
  653. claude_mpm/skills/skills_registry.py +347 -0
  654. claude_mpm/skills/skills_service.py +739 -0
  655. claude_mpm/storage/state_storage.py +31 -31
  656. claude_mpm/templates/questions/__init__.py +38 -0
  657. claude_mpm/templates/questions/base.py +193 -0
  658. claude_mpm/templates/questions/pr_strategy.py +311 -0
  659. claude_mpm/templates/questions/project_init.py +385 -0
  660. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  661. claude_mpm/tools/__main__.py +9 -9
  662. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  663. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  664. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  665. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  666. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  667. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  668. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  669. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  670. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  671. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  672. claude_mpm/tools/code_tree_builder.py +6 -6
  673. claude_mpm/tools/code_tree_events.py +14 -10
  674. claude_mpm/tools/socketio_debug.py +11 -11
  675. claude_mpm/utils/agent_dependency_loader.py +184 -36
  676. claude_mpm/utils/agent_filters.py +288 -0
  677. claude_mpm/utils/common.py +544 -0
  678. claude_mpm/utils/config_manager.py +12 -6
  679. claude_mpm/utils/database_connector.py +298 -0
  680. claude_mpm/utils/dependency_cache.py +5 -3
  681. claude_mpm/utils/dependency_strategies.py +15 -10
  682. claude_mpm/utils/display_helper.py +260 -0
  683. claude_mpm/utils/environment_context.py +4 -3
  684. claude_mpm/utils/error_handler.py +5 -3
  685. claude_mpm/utils/file_utils.py +13 -14
  686. claude_mpm/utils/git_analyzer.py +407 -0
  687. claude_mpm/utils/gitignore.py +241 -0
  688. claude_mpm/utils/log_cleanup.py +627 -0
  689. claude_mpm/utils/migration.py +372 -0
  690. claude_mpm/utils/path_operations.py +7 -4
  691. claude_mpm/utils/progress.py +387 -0
  692. claude_mpm/utils/robust_installer.py +131 -24
  693. claude_mpm/utils/session_logging.py +2 -2
  694. claude_mpm/utils/structured_questions.py +619 -0
  695. claude_mpm/utils/subprocess_utils.py +9 -8
  696. claude_mpm/validation/agent_validator.py +6 -6
  697. claude_mpm/validation/frontmatter_validator.py +6 -6
  698. claude_mpm-5.0.9.dist-info/METADATA +1028 -0
  699. claude_mpm-5.0.9.dist-info/RECORD +864 -0
  700. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
  701. claude_mpm/agents/INSTRUCTIONS.md +0 -261
  702. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  703. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  704. claude_mpm/agents/templates/agent-manager.json +0 -270
  705. claude_mpm/agents/templates/agent-manager.md +0 -619
  706. claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
  707. claude_mpm/agents/templates/api_qa.json +0 -171
  708. claude_mpm/agents/templates/code_analyzer.json +0 -95
  709. claude_mpm/agents/templates/data_engineer.json +0 -152
  710. claude_mpm/agents/templates/documentation.json +0 -175
  711. claude_mpm/agents/templates/engineer.json +0 -176
  712. claude_mpm/agents/templates/imagemagick.json +0 -261
  713. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  714. claude_mpm/agents/templates/memory_manager.json +0 -155
  715. claude_mpm/agents/templates/ops.json +0 -175
  716. claude_mpm/agents/templates/project_organizer.json +0 -130
  717. claude_mpm/agents/templates/qa.json +0 -223
  718. claude_mpm/agents/templates/refactoring_engineer.json +0 -266
  719. claude_mpm/agents/templates/research.json +0 -163
  720. claude_mpm/agents/templates/security.json +0 -153
  721. claude_mpm/agents/templates/ticketing.json +0 -169
  722. claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
  723. claude_mpm/agents/templates/version_control.json +0 -147
  724. claude_mpm/agents/templates/web_qa.json +0 -254
  725. claude_mpm/agents/templates/web_ui.json +0 -176
  726. claude_mpm/cli/commands/configure_tui.py +0 -1927
  727. claude_mpm/cli/commands/mpm_init.py +0 -594
  728. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  729. claude_mpm/commands/mpm-agents.md +0 -12
  730. claude_mpm/commands/mpm-config.md +0 -18
  731. claude_mpm/commands/mpm-tickets.md +0 -102
  732. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  733. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  734. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  735. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  736. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  737. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  738. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  739. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  740. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  741. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  742. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  743. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  744. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  745. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  746. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  747. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  748. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  749. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  750. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  751. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  752. claude_mpm/dashboard/static/css/code-tree.css +0 -1408
  753. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  754. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  755. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  756. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  757. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  758. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  759. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  760. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  761. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  762. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  763. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  764. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  765. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  766. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  767. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  768. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  769. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  770. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  771. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  772. claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
  773. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
  774. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  775. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  776. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  777. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  778. claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
  779. claude_mpm/scripts/socketio_server_manager.py +0 -349
  780. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  781. claude_mpm/services/cli/dashboard_launcher.py +0 -423
  782. claude_mpm/services/cli/socketio_manager.py +0 -537
  783. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  784. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  785. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  786. claude_mpm/services/project/analyzer_refactored.py +0 -450
  787. claude_mpm/tools/code_tree_analyzer.py +0 -1693
  788. claude_mpm-4.1.26.dist-info/METADATA +0 -332
  789. claude_mpm-4.1.26.dist-info/RECORD +0 -606
  790. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  791. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  792. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
@@ -1,38 +1,38 @@
1
1
  /**
2
2
  * Socket.IO Client for Claude MPM Dashboard
3
- *
3
+ *
4
4
  * This module provides real-time WebSocket communication between the Claude MPM dashboard
5
5
  * and the backend Socket.IO server. It handles connection management, event processing,
6
6
  * retry logic, and health monitoring.
7
- *
7
+ *
8
8
  * Architecture:
9
9
  * - Maintains persistent WebSocket connection to Claude MPM backend
10
10
  * - Implements robust retry logic with exponential backoff
11
11
  * - Provides event queuing during disconnections
12
12
  * - Validates event schemas for data integrity
13
13
  * - Monitors connection health with ping/pong mechanisms
14
- *
14
+ *
15
15
  * Event Flow:
16
16
  * 1. Events from Claude Code hooks → Socket.IO server → Dashboard client
17
17
  * 2. Dashboard requests → Socket.IO server → Backend services
18
18
  * 3. Status updates → Socket.IO server → All connected clients
19
- *
19
+ *
20
20
  * Thread Safety:
21
21
  * - Single-threaded JavaScript execution model ensures safety
22
22
  * - Event callbacks are queued and executed sequentially
23
23
  * - Connection state changes are atomic
24
- *
24
+ *
25
25
  * Performance Considerations:
26
26
  * - Event queue limited to 100 items to prevent memory leaks
27
27
  * - Health checks run every 45s to match server ping interval
28
28
  * - Exponential backoff prevents connection spam
29
29
  * - Lazy event validation reduces overhead
30
- *
30
+ *
31
31
  * Security:
32
32
  * - Connects only to localhost to prevent external access
33
33
  * - Event schema validation prevents malformed data processing
34
34
  * - Connection timeout prevents hanging connections
35
- *
35
+ *
36
36
  * @author Claude MPM Team
37
37
  * @version 1.0
38
38
  * @since v4.0.25
@@ -44,42 +44,42 @@ const io = window.io;
44
44
 
45
45
  /**
46
46
  * Primary Socket.IO client for dashboard communication.
47
- *
47
+ *
48
48
  * Manages WebSocket connection lifecycle, event processing, and error handling.
49
49
  * Implements connection resilience with automatic retry and health monitoring.
50
- *
50
+ *
51
51
  * Key Features:
52
52
  * - Automatic connection retry with exponential backoff
53
- * - Event queue management during disconnections
53
+ * - Event queue management during disconnections
54
54
  * - Schema validation for incoming events
55
55
  * - Health monitoring with ping/pong
56
56
  * - Session management and event history
57
- *
57
+ *
58
58
  * Connection States:
59
59
  * - isConnected: Currently connected to server
60
60
  * - isConnecting: Connection attempt in progress
61
61
  * - disconnectTime: Timestamp of last disconnection
62
- *
62
+ *
63
63
  * Event Processing:
64
64
  * - Validates against schema before processing
65
65
  * - Queues events during disconnection (max 100)
66
66
  * - Maintains event history and session tracking
67
- *
67
+ *
68
68
  * @class SocketClient
69
69
  */
70
70
  class SocketClient {
71
71
  /**
72
72
  * Initialize Socket.IO client with default configuration.
73
- *
73
+ *
74
74
  * Sets up connection management, event processing, and health monitoring.
75
75
  * Configures retry logic and event queue management.
76
- *
76
+ *
77
77
  * WHY this initialization approach:
78
78
  * - Lazy socket creation allows for port specification
79
79
  * - Event queue prevents data loss during reconnections
80
80
  * - Health monitoring detects server issues early
81
81
  * - Schema validation ensures data integrity
82
- *
82
+ *
83
83
  * @constructor
84
84
  */
85
85
  constructor() {
@@ -89,14 +89,14 @@ class SocketClient {
89
89
  * @private
90
90
  */
91
91
  this.socket = null;
92
-
92
+
93
93
  /**
94
94
  * Current connection port.
95
95
  * @type {string|null}
96
96
  * @private
97
97
  */
98
98
  this.port = null; // Store the current port
99
-
99
+
100
100
  /**
101
101
  * Event callback registry for connection lifecycle events.
102
102
  * WHY: Allows multiple components to register for connection events.
@@ -105,11 +105,11 @@ class SocketClient {
105
105
  */
106
106
  this.connectionCallbacks = {
107
107
  connect: [], // Called on successful connection
108
- disconnect: [], // Called on disconnection
108
+ disconnect: [], // Called on disconnection
109
109
  error: [], // Called on connection errors
110
110
  event: [] // Called on incoming events
111
111
  };
112
-
112
+
113
113
  /**
114
114
  * Event schema definition for validation.
115
115
  * WHY: Ensures data integrity and prevents processing malformed events.
@@ -127,7 +127,7 @@ class SocketClient {
127
127
  * @private
128
128
  */
129
129
  this.isConnected = false;
130
-
130
+
131
131
  /**
132
132
  * Connection attempt in progress flag.
133
133
  * WHY: Prevents multiple simultaneous connection attempts.
@@ -135,14 +135,14 @@ class SocketClient {
135
135
  * @private
136
136
  */
137
137
  this.isConnecting = false;
138
-
138
+
139
139
  /**
140
140
  * Timestamp of last successful connection.
141
141
  * @type {number|null}
142
142
  * @private
143
143
  */
144
144
  this.lastConnectTime = null;
145
-
145
+
146
146
  /**
147
147
  * Timestamp of last disconnection.
148
148
  * WHY: Used to calculate downtime and trigger reconnection logic.
@@ -158,7 +158,7 @@ class SocketClient {
158
158
  * @private
159
159
  */
160
160
  this.events = [];
161
-
161
+
162
162
  /**
163
163
  * Session tracking map.
164
164
  * WHY: Groups events by session for better organization.
@@ -166,7 +166,7 @@ class SocketClient {
166
166
  * @private
167
167
  */
168
168
  this.sessions = new Map();
169
-
169
+
170
170
  /**
171
171
  * Current active session identifier.
172
172
  * @type {string|null}
@@ -181,7 +181,7 @@ class SocketClient {
181
181
  * @private
182
182
  */
183
183
  this.eventQueue = [];
184
-
184
+
185
185
  /**
186
186
  * Maximum queue size to prevent memory leaks.
187
187
  * WHY: Limits memory usage during extended disconnections.
@@ -190,7 +190,7 @@ class SocketClient {
190
190
  * @const
191
191
  */
192
192
  this.maxQueueSize = 100;
193
-
193
+
194
194
  /**
195
195
  * Current retry attempt counter.
196
196
  * WHY: Tracks retry attempts for exponential backoff logic.
@@ -198,7 +198,7 @@ class SocketClient {
198
198
  * @private
199
199
  */
200
200
  this.retryAttempts = 0;
201
-
201
+
202
202
  /**
203
203
  * Maximum retry attempts before giving up.
204
204
  * WHY: Prevents infinite retry loops that could impact performance.
@@ -207,7 +207,7 @@ class SocketClient {
207
207
  * @const
208
208
  */
209
209
  this.maxRetryAttempts = 5; // Increased from 3 to 5 for better stability
210
-
210
+
211
211
  /**
212
212
  * Retry delay intervals in milliseconds (exponential backoff).
213
213
  * WHY: Prevents server overload during connection issues.
@@ -216,7 +216,7 @@ class SocketClient {
216
216
  * @const
217
217
  */
218
218
  this.retryDelays = [1000, 2000, 3000, 4000, 5000]; // Exponential backoff with 5 attempts
219
-
219
+
220
220
  /**
221
221
  * Map of pending emissions for retry logic.
222
222
  * WHY: Tracks failed emissions that need to be retried.
@@ -224,7 +224,7 @@ class SocketClient {
224
224
  * @private
225
225
  */
226
226
  this.pendingEmissions = new Map(); // Track pending emissions for retry
227
-
227
+
228
228
  /**
229
229
  * Timestamp of last ping sent to server.
230
230
  * WHY: Used for health monitoring and connection validation.
@@ -232,7 +232,7 @@ class SocketClient {
232
232
  * @private
233
233
  */
234
234
  this.lastPingTime = null;
235
-
235
+
236
236
  /**
237
237
  * Timestamp of last pong received from server.
238
238
  * WHY: Confirms server is responsive and connection is healthy.
@@ -240,7 +240,7 @@ class SocketClient {
240
240
  * @private
241
241
  */
242
242
  this.lastPongTime = null;
243
-
243
+
244
244
  /**
245
245
  * Health check timeout in milliseconds.
246
246
  * WHY: More lenient than Socket.IO timeout to prevent false positives.
@@ -248,15 +248,15 @@ class SocketClient {
248
248
  * @private
249
249
  * @const
250
250
  */
251
- this.pingTimeout = 90000; // 90 seconds for health check (more lenient than Socket.IO timeout)
252
-
251
+ this.pingTimeout = 120000; // 120 seconds for health check (more lenient for stability)
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
 
@@ -346,13 +346,13 @@ class SocketClient {
346
346
  autoConnect: true,
347
347
  reconnection: true,
348
348
  reconnectionDelay: 1000,
349
- reconnectionDelayMax: 5000,
350
- reconnectionAttempts: 5, // Try 5 times then stop (was Infinity which can cause issues)
351
- timeout: 20000, // 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
352
352
  forceNew: true,
353
353
  transports: ['websocket', 'polling'],
354
- pingInterval: 25000, // CRITICAL: Must match server's 25 seconds
355
- pingTimeout: 20000 // CRITICAL: Must match server's 20 seconds
354
+ // Remove client-side ping configuration - let server control this
355
+ // The server now properly configures: ping_interval=30s, ping_timeout=60s
356
356
  });
357
357
 
358
358
  this.setupSocketHandlers();
@@ -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,38 @@ 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
+ // 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
+
508
526
  // Session and event handlers (legacy/fallback)
509
527
  this.socket.on('session.started', (data) => {
510
528
  this.addEvent({ type: 'session', subtype: 'started', timestamp: new Date().toISOString(), data });
@@ -530,13 +548,15 @@ class SocketClient {
530
548
  this.addEvent({ type: 'agent', subtype: 'executed', timestamp: new Date().toISOString(), data });
531
549
  });
532
550
 
533
- this.socket.on('hook.pre', (data) => {
534
- this.addEvent({ type: 'hook', subtype: 'pre', timestamp: new Date().toISOString(), data });
535
- });
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
+ // });
536
556
 
537
- this.socket.on('hook.post', (data) => {
538
- this.addEvent({ type: 'hook', subtype: 'post', timestamp: new Date().toISOString(), data });
539
- });
557
+ // this.socket.on('hook.post', (data) => {
558
+ // this.addEvent({ type: 'hook', subtype: 'post', timestamp: new Date().toISOString(), data });
559
+ // });
540
560
 
541
561
  this.socket.on('todo.updated', (data) => {
542
562
  this.addEvent({ type: 'todo', subtype: 'updated', timestamp: new Date().toISOString(), data });
@@ -558,43 +578,43 @@ class SocketClient {
558
578
  console.log('Code analysis queued event received, adding to events list for troubleshooting');
559
579
  this.addEvent({ type: 'code', subtype: 'analysis:queued', timestamp: new Date().toISOString(), data });
560
580
  });
561
-
581
+
562
582
  this.socket.on('code:analysis:accepted', (data) => {
563
583
  // Add to events list for troubleshooting
564
584
  console.log('Code analysis accepted event received, adding to events list for troubleshooting');
565
585
  this.addEvent({ type: 'code', subtype: 'analysis:accepted', timestamp: new Date().toISOString(), data });
566
586
  });
567
-
587
+
568
588
  this.socket.on('code:analysis:start', (data) => {
569
589
  // Add to events list for troubleshooting
570
590
  console.log('Code analysis start event received, adding to events list for troubleshooting');
571
591
  this.addEvent({ type: 'code', subtype: 'analysis:start', timestamp: new Date().toISOString(), data });
572
592
  });
573
-
593
+
574
594
  this.socket.on('code:analysis:complete', (data) => {
575
595
  // Add to events list for troubleshooting
576
596
  console.log('Code analysis complete event received, adding to events list for troubleshooting');
577
597
  this.addEvent({ type: 'code', subtype: 'analysis:complete', timestamp: new Date().toISOString(), data });
578
598
  });
579
-
599
+
580
600
  this.socket.on('code:analysis:error', (data) => {
581
601
  // Add to events list for troubleshooting
582
602
  console.log('Code analysis error event received, adding to events list for troubleshooting');
583
603
  this.addEvent({ type: 'code', subtype: 'analysis:error', timestamp: new Date().toISOString(), data });
584
604
  });
585
-
605
+
586
606
  this.socket.on('code:file:start', (data) => {
587
607
  // Add to events list for troubleshooting
588
608
  console.log('Code file start event received, adding to events list for troubleshooting');
589
609
  this.addEvent({ type: 'code', subtype: 'file:start', timestamp: new Date().toISOString(), data });
590
610
  });
591
-
611
+
592
612
  this.socket.on('code:node:found', (data) => {
593
613
  // Add to events list for troubleshooting
594
614
  console.log('Code node found event received, adding to events list for troubleshooting');
595
615
  this.addEvent({ type: 'code', subtype: 'node:found', timestamp: new Date().toISOString(), data });
596
616
  });
597
-
617
+
598
618
  this.socket.on('code:analysis:progress', (data) => {
599
619
  // Add to events list for troubleshooting
600
620
  console.log('Code analysis progress event received, adding to events list for troubleshooting');
@@ -613,6 +633,15 @@ class SocketClient {
613
633
  });
614
634
  this.notifyEventUpdate();
615
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
+ }));
616
645
  } else if (Array.isArray(data)) {
617
646
  // Handle legacy format for backward compatibility
618
647
  console.log('Received legacy event history format:', data.length, 'events');
@@ -621,6 +650,14 @@ class SocketClient {
621
650
  this.addEvent(transformedEvent, false);
622
651
  });
623
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
+ }));
624
661
  }
625
662
  });
626
663
 
@@ -655,15 +692,15 @@ class SocketClient {
655
692
  * @param {Object} options - Options for retry behavior
656
693
  */
657
694
  emitWithRetry(event, data = null, options = {}) {
658
- const {
695
+ const {
659
696
  maxRetries = 3,
660
697
  retryDelays = [1000, 2000, 4000],
661
698
  onSuccess = null,
662
699
  onFailure = null
663
700
  } = options;
664
-
701
+
665
702
  const emissionId = `${event}_${Date.now()}_${Math.random()}`;
666
-
703
+
667
704
  const attemptEmission = (attemptNum = 0) => {
668
705
  if (!this.socket || !this.socket.connected) {
669
706
  // Queue for later if disconnected
@@ -674,24 +711,24 @@ class SocketClient {
674
711
  }
675
712
  return;
676
713
  }
677
-
714
+
678
715
  try {
679
716
  // Attempt emission
680
717
  this.socket.emit(event, data);
681
718
  console.log(`Emitted ${event} successfully`);
682
-
719
+
683
720
  // Remove from pending
684
721
  this.pendingEmissions.delete(emissionId);
685
-
722
+
686
723
  if (onSuccess) onSuccess();
687
-
724
+
688
725
  } catch (error) {
689
726
  console.error(`Failed to emit ${event} (attempt ${attemptNum + 1}):`, error);
690
-
727
+
691
728
  if (attemptNum < maxRetries - 1) {
692
729
  const delay = retryDelays[attemptNum] || retryDelays[retryDelays.length - 1];
693
730
  console.log(`Retrying ${event} in ${delay}ms...`);
694
-
731
+
695
732
  // Store pending emission
696
733
  this.pendingEmissions.set(emissionId, {
697
734
  event,
@@ -699,7 +736,7 @@ class SocketClient {
699
736
  attemptNum: attemptNum + 1,
700
737
  scheduledTime: Date.now() + delay
701
738
  });
702
-
739
+
703
740
  setTimeout(() => attemptEmission(attemptNum + 1), delay);
704
741
  } else {
705
742
  console.error(`Failed to emit ${event} after ${maxRetries} attempts`);
@@ -708,10 +745,10 @@ class SocketClient {
708
745
  }
709
746
  }
710
747
  };
711
-
748
+
712
749
  attemptEmission();
713
750
  }
714
-
751
+
715
752
  /**
716
753
  * Queue an event for later emission
717
754
  * @param {string} event - Event name
@@ -723,24 +760,24 @@ class SocketClient {
723
760
  const removed = this.eventQueue.shift();
724
761
  console.warn(`Event queue full, dropped oldest event: ${removed.event}`);
725
762
  }
726
-
763
+
727
764
  this.eventQueue.push({
728
765
  event,
729
766
  data,
730
767
  timestamp: Date.now()
731
768
  });
732
769
  }
733
-
770
+
734
771
  /**
735
772
  * Flush queued events after reconnection
736
773
  */
737
774
  flushEventQueue() {
738
775
  if (this.eventQueue.length === 0) return;
739
-
776
+
740
777
  console.log(`Flushing ${this.eventQueue.length} queued events...`);
741
778
  const events = [...this.eventQueue];
742
779
  this.eventQueue = [];
743
-
780
+
744
781
  // Emit each queued event with a small delay between them
745
782
  events.forEach((item, index) => {
746
783
  setTimeout(() => {
@@ -751,7 +788,7 @@ class SocketClient {
751
788
  }, index * 100); // 100ms between each event
752
789
  });
753
790
  }
754
-
791
+
755
792
  /**
756
793
  * Schedule a reconnection attempt with exponential backoff
757
794
  */
@@ -761,13 +798,13 @@ class SocketClient {
761
798
  this.notifyConnectionStatus('Reconnection failed', 'disconnected');
762
799
  return;
763
800
  }
764
-
801
+
765
802
  const delay = this.retryDelays[this.retryAttempts] || this.retryDelays[this.retryDelays.length - 1];
766
803
  this.retryAttempts++;
767
-
804
+
768
805
  console.log(`Scheduling reconnect attempt ${this.retryAttempts}/${this.maxRetryAttempts} in ${delay}ms...`);
769
806
  this.notifyConnectionStatus(`Reconnecting in ${delay/1000}s...`, 'connecting');
770
-
807
+
771
808
  setTimeout(() => {
772
809
  if (!this.isConnected && this.port) {
773
810
  console.log(`Attempting reconnection ${this.retryAttempts}/${this.maxRetryAttempts}...`);
@@ -775,7 +812,7 @@ class SocketClient {
775
812
  }
776
813
  }, delay);
777
814
  }
778
-
815
+
779
816
  /**
780
817
  * Request server status
781
818
  */
@@ -846,7 +883,7 @@ class SocketClient {
846
883
  const session = this.sessions.get(sessionId);
847
884
  session.lastActivity = eventData.timestamp;
848
885
  session.eventCount++;
849
-
886
+
850
887
  // Extract working directory from event data if available (prioritize newer data)
851
888
  // Check multiple possible locations for working directory
852
889
  const possiblePaths = [
@@ -861,7 +898,7 @@ class SocketClient {
861
898
  eventData.working_directory,
862
899
  eventData.working_dir
863
900
  ];
864
-
901
+
865
902
  for (const path of possiblePaths) {
866
903
  if (path && typeof path === 'string' && path.trim()) {
867
904
  session.working_directory = path;
@@ -869,7 +906,7 @@ class SocketClient {
869
906
  break;
870
907
  }
871
908
  }
872
-
909
+
873
910
  // Extract git branch if available
874
911
  if (eventData.data.git_branch) {
875
912
  session.git_branch = eventData.data.git_branch;
@@ -1045,10 +1082,10 @@ class SocketClient {
1045
1082
  console.warn('Event data is not an object:', eventData);
1046
1083
  return null;
1047
1084
  }
1048
-
1085
+
1049
1086
  // Make a copy to avoid modifying the original
1050
1087
  const validated = { ...eventData };
1051
-
1088
+
1052
1089
  // Check and provide defaults for required fields
1053
1090
  if (!validated.source) {
1054
1091
  validated.source = 'system'; // Default source for backward compatibility
@@ -1070,16 +1107,16 @@ class SocketClient {
1070
1107
  if (!validated.data) {
1071
1108
  validated.data = {};
1072
1109
  }
1073
-
1110
+
1074
1111
  // Ensure data field is an object
1075
1112
  if (validated.data && typeof validated.data !== 'object') {
1076
1113
  validated.data = { value: validated.data };
1077
1114
  }
1078
-
1115
+
1079
1116
  console.log('Validated event:', validated);
1080
1117
  return validated;
1081
1118
  }
1082
-
1119
+
1083
1120
  /**
1084
1121
  * Transform received event to match expected dashboard format
1085
1122
  * @param {Object} eventData - Raw event data from server
@@ -1100,8 +1137,8 @@ class SocketClient {
1100
1137
 
1101
1138
  // Check if event is already normalized (has both type and subtype as separate fields)
1102
1139
  // This prevents double-transformation of events that were normalized on the backend
1103
- const isAlreadyNormalized = eventData.type && eventData.subtype &&
1104
- !eventData.type.includes('.') &&
1140
+ const isAlreadyNormalized = eventData.type && eventData.subtype &&
1141
+ !eventData.type.includes('.') &&
1105
1142
  !eventData.type.includes(':');
1106
1143
 
1107
1144
  if (isAlreadyNormalized) {
@@ -1120,7 +1157,7 @@ class SocketClient {
1120
1157
  else if (!eventData.type && eventData.event) {
1121
1158
  // Map common event names to proper type/subtype
1122
1159
  const eventName = eventData.event;
1123
-
1160
+
1124
1161
  // Check for known event patterns
1125
1162
  if (eventName === 'TestStart' || eventName === 'TestEnd') {
1126
1163
  transformedEvent.type = 'test';
@@ -1139,13 +1176,13 @@ class SocketClient {
1139
1176
  // Use 'unknown' for type and the actual eventName for subtype
1140
1177
  transformedEvent.type = 'unknown';
1141
1178
  transformedEvent.subtype = eventName.toLowerCase();
1142
-
1179
+
1143
1180
  // Prevent duplicate type/subtype values
1144
1181
  if (transformedEvent.type === transformedEvent.subtype) {
1145
1182
  transformedEvent.subtype = 'event';
1146
1183
  }
1147
1184
  }
1148
-
1185
+
1149
1186
  // Remove the 'event' field to avoid confusion
1150
1187
  delete transformedEvent.event;
1151
1188
  // Store original event name for display purposes
@@ -1154,7 +1191,7 @@ class SocketClient {
1154
1191
  // Handle standard format with 'type' field that needs transformation
1155
1192
  else if (eventData.type) {
1156
1193
  const type = eventData.type;
1157
-
1194
+
1158
1195
  // Transform 'hook.subtype' format to separate type and subtype
1159
1196
  if (type.startsWith('hook.')) {
1160
1197
  const subtype = type.substring(5); // Remove 'hook.' prefix
@@ -1204,7 +1241,7 @@ class SocketClient {
1204
1241
  if (eventData.data && typeof eventData.data === 'object') {
1205
1242
  // Protected fields that should never be overwritten by data fields
1206
1243
  const protectedFields = ['type', 'subtype', 'timestamp', 'id', 'event', 'event_type', 'originalEventName'];
1207
-
1244
+
1208
1245
  // Copy all data fields to the top level, except protected ones
1209
1246
  Object.keys(eventData.data).forEach(key => {
1210
1247
  // Only copy if not a protected field
@@ -1218,11 +1255,14 @@ class SocketClient {
1218
1255
  transformedEvent[key] = eventData.data[key];
1219
1256
  }
1220
1257
  } else {
1221
- // Log warning if data field would overwrite a protected field
1222
- console.warn(`Protected field '${key}' in data object was not copied to top level to preserve event structure`);
1258
+ // Log debug info if data field would overwrite a protected field
1259
+ // Only log for non-timestamp fields to reduce noise
1260
+ if (key !== 'timestamp') {
1261
+ console.debug(`Protected field '${key}' in data object was not copied to top level to preserve event structure`);
1262
+ }
1223
1263
  }
1224
1264
  });
1225
-
1265
+
1226
1266
  // Keep the original data object for backward compatibility
1227
1267
  transformedEvent.data = eventData.data;
1228
1268
  }
@@ -1267,7 +1307,7 @@ class SocketClient {
1267
1307
  has_data: !!transformedEvent.data,
1268
1308
  keys: Object.keys(transformedEvent).filter(k => k !== 'data')
1269
1309
  });
1270
-
1310
+
1271
1311
  // Extra debug logging for file-related tools
1272
1312
  const fileTools = ['Read', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit'];
1273
1313
  if (fileTools.includes(transformedEvent.tool_name)) {
@@ -1304,10 +1344,10 @@ class SocketClient {
1304
1344
  this.healthCheckInterval = setInterval(() => {
1305
1345
  if (this.isConnected && this.lastPingTime) {
1306
1346
  const timeSinceLastPing = Date.now() - this.lastPingTime;
1307
-
1347
+
1308
1348
  if (timeSinceLastPing > this.pingTimeout) {
1309
1349
  console.warn(`No ping from server for ${timeSinceLastPing/1000}s, connection may be stale`);
1310
-
1350
+
1311
1351
  // Force reconnection
1312
1352
  if (this.socket) {
1313
1353
  console.log('Forcing reconnection due to stale connection...');
@@ -1322,7 +1362,7 @@ class SocketClient {
1322
1362
  }
1323
1363
  }, 10000); // Check every 10 seconds
1324
1364
  }
1325
-
1365
+
1326
1366
  /**
1327
1367
  * Stop health monitoring
1328
1368
  */
@@ -1332,7 +1372,7 @@ class SocketClient {
1332
1372
  this.healthCheckInterval = null;
1333
1373
  }
1334
1374
  }
1335
-
1375
+
1336
1376
  /**
1337
1377
  * Start periodic status check as fallback mechanism
1338
1378
  * This ensures the UI stays in sync with actual socket state
@@ -1366,6 +1406,12 @@ class SocketClient {
1366
1406
  actualType = 'connected';
1367
1407
  this.isConnected = true;
1368
1408
  this.isConnecting = false;
1409
+
1410
+ // Expose socket globally when connected
1411
+ if (!window.socket) {
1412
+ window.socket = this.socket;
1413
+ console.log('SocketClient: Exposed socket globally as window.socket');
1414
+ }
1369
1415
  } else if (this.socket.connecting || this.isConnecting) {
1370
1416
  actualStatus = 'Connecting...';
1371
1417
  actualType = 'connecting';
@@ -1378,17 +1424,15 @@ class SocketClient {
1378
1424
  }
1379
1425
  }
1380
1426
 
1381
- // Check if UI needs updating
1427
+ // Always update status to ensure consistency
1428
+ this.updateConnectionStatusDOM(actualStatus, actualType);
1429
+
1430
+ // Also ensure state is consistent
1382
1431
  const statusElement = document.getElementById('connection-status');
1383
1432
  if (statusElement) {
1384
1433
  const currentText = statusElement.textContent.replace('●', '').trim();
1385
- const currentClass = statusElement.className;
1386
- const expectedClass = `status-badge status-${actualType}`;
1387
-
1388
- // Update if status text or class doesn't match
1389
- if (currentText !== actualStatus || currentClass !== expectedClass) {
1390
- console.log(`SocketClient: Fallback update - was '${currentText}' (${currentClass}), now '${actualStatus}' (${expectedClass})`);
1391
- this.updateConnectionStatusDOM(actualStatus, actualType);
1434
+ if (currentText !== actualStatus) {
1435
+ console.log(`SocketClient: Status sync - updating from '${currentText}' to '${actualStatus}'`);
1392
1436
  }
1393
1437
  }
1394
1438
  }
@@ -1405,7 +1449,7 @@ class SocketClient {
1405
1449
  this.eventQueue = [];
1406
1450
  this.pendingEmissions.clear();
1407
1451
  }
1408
-
1452
+
1409
1453
  /**
1410
1454
  * Get connection metrics
1411
1455
  * @returns {Object} Connection metrics