claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__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 (623) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/BASE_AGENT.md +164 -0
  4. claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
  5. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  6. claude_mpm/agents/MEMORY.md +1 -1
  7. claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
  8. claude_mpm/agents/WORKFLOW.md +5 -254
  9. claude_mpm/agents/__init__.py +6 -0
  10. claude_mpm/agents/agent_loader.py +14 -48
  11. claude_mpm/agents/base_agent.json +7 -4
  12. claude_mpm/agents/frontmatter_validator.py +71 -3
  13. claude_mpm/agents/templates/circuit-breakers.md +1391 -0
  14. claude_mpm/agents/templates/context-management-examples.md +544 -0
  15. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  16. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  17. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  18. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  19. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  20. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  21. claude_mpm/cli/__init__.py +37 -2
  22. claude_mpm/cli/__main__.py +4 -0
  23. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  24. claude_mpm/cli/commands/__init__.py +2 -0
  25. claude_mpm/cli/commands/agent_source.py +774 -0
  26. claude_mpm/cli/commands/agent_state_manager.py +180 -31
  27. claude_mpm/cli/commands/agents.py +1116 -55
  28. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  29. claude_mpm/cli/commands/agents_discover.py +338 -0
  30. claude_mpm/cli/commands/aggregate.py +1 -1
  31. claude_mpm/cli/commands/analyze.py +3 -3
  32. claude_mpm/cli/commands/auto_configure.py +725 -242
  33. claude_mpm/cli/commands/config.py +95 -6
  34. claude_mpm/cli/commands/configure.py +1875 -46
  35. claude_mpm/cli/commands/configure_agent_display.py +29 -10
  36. claude_mpm/cli/commands/configure_navigation.py +63 -46
  37. claude_mpm/cli/commands/debug.py +12 -12
  38. claude_mpm/cli/commands/doctor.py +10 -2
  39. claude_mpm/cli/commands/hook_errors.py +277 -0
  40. claude_mpm/cli/commands/local_deploy.py +1 -4
  41. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  42. claude_mpm/cli/commands/mpm_init/core.py +229 -2
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  44. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
  46. claude_mpm/cli/commands/postmortem.py +401 -0
  47. claude_mpm/cli/commands/profile.py +277 -0
  48. claude_mpm/cli/commands/run.py +123 -165
  49. claude_mpm/cli/commands/skill_source.py +694 -0
  50. claude_mpm/cli/commands/skills.py +782 -20
  51. claude_mpm/cli/commands/summarize.py +413 -0
  52. claude_mpm/cli/executor.py +96 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1030 -45
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +307 -10
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
  57. claude_mpm/cli/parsers/base_parser.py +65 -0
  58. claude_mpm/cli/parsers/config_parser.py +162 -39
  59. claude_mpm/cli/parsers/profile_parser.py +148 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +146 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +1280 -118
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/mpm-config.md +21 -134
  68. claude_mpm/commands/mpm-doctor.md +16 -20
  69. claude_mpm/commands/mpm-help.md +13 -283
  70. claude_mpm/commands/mpm-init.md +88 -489
  71. claude_mpm/commands/mpm-monitor.md +23 -401
  72. claude_mpm/commands/mpm-organize.md +72 -247
  73. claude_mpm/commands/mpm-postmortem.md +21 -0
  74. claude_mpm/commands/mpm-session-resume.md +30 -0
  75. claude_mpm/commands/mpm-status.md +13 -68
  76. claude_mpm/commands/mpm-ticket-view.md +109 -0
  77. claude_mpm/commands/mpm-version.md +13 -106
  78. claude_mpm/commands/mpm.md +10 -0
  79. claude_mpm/config/agent_presets.py +488 -0
  80. claude_mpm/config/agent_sources.py +352 -0
  81. claude_mpm/config/skill_presets.py +392 -0
  82. claude_mpm/config/skill_sources.py +590 -0
  83. claude_mpm/constants.py +13 -0
  84. claude_mpm/core/claude_runner.py +5 -34
  85. claude_mpm/core/config.py +15 -1
  86. claude_mpm/core/constants.py +1 -1
  87. claude_mpm/core/framework/__init__.py +3 -16
  88. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  89. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  90. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  91. claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
  92. claude_mpm/core/framework_loader.py +4 -2
  93. claude_mpm/core/hook_error_memory.py +381 -0
  94. claude_mpm/core/hook_manager.py +41 -2
  95. claude_mpm/core/interactive_session.py +91 -10
  96. claude_mpm/core/logger.py +16 -1
  97. claude_mpm/core/oneshot_session.py +71 -8
  98. claude_mpm/core/optimized_startup.py +59 -0
  99. claude_mpm/core/output_style_manager.py +173 -43
  100. claude_mpm/core/protocols/__init__.py +23 -0
  101. claude_mpm/core/protocols/runner_protocol.py +103 -0
  102. claude_mpm/core/protocols/session_protocol.py +131 -0
  103. claude_mpm/core/shared/config_loader.py +1 -1
  104. claude_mpm/core/shared/singleton_manager.py +11 -4
  105. claude_mpm/core/socketio_pool.py +3 -3
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_agent_registry.py +134 -16
  108. claude_mpm/core/unified_config.py +22 -0
  109. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  110. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
  111. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
  112. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
  113. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
  114. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
  115. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
  116. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
  117. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
  118. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
  119. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
  120. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
  121. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
  122. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
  123. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
  124. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  125. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  126. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  127. claude_mpm/experimental/cli_enhancements.py +1 -5
  128. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  131. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  136. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  137. claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
  138. claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
  139. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  140. claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
  141. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  142. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  143. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  144. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  145. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
  149. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  150. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  151. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  152. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  153. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  154. claude_mpm/hooks/memory_integration_hook.py +46 -1
  155. claude_mpm/init.py +63 -19
  156. claude_mpm/models/agent_definition.py +7 -0
  157. claude_mpm/models/git_repository.py +198 -0
  158. claude_mpm/scripts/claude-hook-handler.sh +60 -20
  159. claude_mpm/scripts/launch_monitor.py +93 -13
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +48 -12
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  164. claude_mpm/services/agents/agent_review_service.py +280 -0
  165. claude_mpm/services/agents/agent_selection_service.py +484 -0
  166. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  167. claude_mpm/services/agents/cache_git_manager.py +621 -0
  168. claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
  169. claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
  170. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  171. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  172. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  173. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  174. claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
  175. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  176. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  177. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  178. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
  179. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  180. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  181. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
  182. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  183. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  184. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  185. claude_mpm/services/agents/git_source_manager.py +663 -0
  186. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  187. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  188. claude_mpm/services/agents/local_template_manager.py +50 -10
  189. claude_mpm/services/agents/recommender.py +5 -3
  190. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  191. claude_mpm/services/agents/sources/__init__.py +13 -0
  192. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  193. claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
  194. claude_mpm/services/agents/startup_sync.py +259 -0
  195. claude_mpm/services/agents/toolchain_detector.py +478 -0
  196. claude_mpm/services/analysis/__init__.py +35 -0
  197. claude_mpm/services/analysis/clone_detector.py +1030 -0
  198. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  199. claude_mpm/services/analysis/postmortem_service.py +765 -0
  200. claude_mpm/services/cli/session_pause_manager.py +1 -1
  201. claude_mpm/services/command_deployment_service.py +271 -6
  202. claude_mpm/services/core/base.py +7 -2
  203. claude_mpm/services/core/interfaces/__init__.py +1 -3
  204. claude_mpm/services/core/interfaces/health.py +1 -4
  205. claude_mpm/services/core/models/__init__.py +2 -11
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/event_bus/config.py +3 -1
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/events/consumers/logging.py +1 -2
  219. claude_mpm/services/git/__init__.py +21 -0
  220. claude_mpm/services/git/git_operations_service.py +579 -0
  221. claude_mpm/services/github/__init__.py +21 -0
  222. claude_mpm/services/github/github_cli_service.py +397 -0
  223. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  224. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  225. claude_mpm/services/instructions/__init__.py +9 -0
  226. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  227. claude_mpm/services/local_ops/__init__.py +3 -13
  228. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  229. claude_mpm/services/local_ops/health_manager.py +1 -4
  230. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  231. claude_mpm/services/mcp_config_manager.py +75 -145
  232. claude_mpm/services/mcp_service_verifier.py +6 -3
  233. claude_mpm/services/model/model_router.py +1 -2
  234. claude_mpm/services/monitor/daemon.py +38 -11
  235. claude_mpm/services/monitor/daemon_manager.py +134 -21
  236. claude_mpm/services/monitor/management/lifecycle.py +8 -1
  237. claude_mpm/services/monitor/server.py +700 -24
  238. claude_mpm/services/pm_skills_deployer.py +676 -0
  239. claude_mpm/services/port_manager.py +1 -1
  240. claude_mpm/services/pr/__init__.py +14 -0
  241. claude_mpm/services/pr/pr_template_service.py +329 -0
  242. claude_mpm/services/profile_manager.py +331 -0
  243. claude_mpm/services/project/documentation_manager.py +2 -1
  244. claude_mpm/services/project/project_organizer.py +4 -0
  245. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  246. claude_mpm/services/runner_configuration_service.py +16 -3
  247. claude_mpm/services/self_upgrade_service.py +120 -12
  248. claude_mpm/services/session_management_service.py +16 -4
  249. claude_mpm/services/skills/__init__.py +21 -0
  250. claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
  251. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  252. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  253. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  254. claude_mpm/services/skills_config.py +547 -0
  255. claude_mpm/services/skills_deployer.py +1072 -0
  256. claude_mpm/services/socketio/dashboard_server.py +1 -0
  257. claude_mpm/services/socketio/event_normalizer.py +51 -6
  258. claude_mpm/services/socketio/handlers/connection.py +1 -1
  259. claude_mpm/services/socketio/handlers/git.py +1 -1
  260. claude_mpm/services/socketio/server/core.py +387 -112
  261. claude_mpm/services/socketio/server/main.py +1 -3
  262. claude_mpm/services/system_instructions_service.py +1 -3
  263. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  264. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  265. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  266. claude_mpm/services/unified/unified_deployment.py +1 -5
  267. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  268. claude_mpm/services/version_control/git_operations.py +103 -0
  269. claude_mpm/services/visualization/__init__.py +1 -5
  270. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  271. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  272. claude_mpm/skills/skill_manager.py +92 -3
  273. claude_mpm/skills/skills_registry.py +0 -1
  274. claude_mpm/templates/questions/__init__.py +38 -0
  275. claude_mpm/templates/questions/base.py +193 -0
  276. claude_mpm/templates/questions/pr_strategy.py +311 -0
  277. claude_mpm/templates/questions/project_init.py +385 -0
  278. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  279. claude_mpm/tools/__main__.py +8 -8
  280. claude_mpm/utils/agent_dependency_loader.py +91 -12
  281. claude_mpm/utils/agent_filters.py +261 -0
  282. claude_mpm/utils/dependency_cache.py +3 -1
  283. claude_mpm/utils/gitignore.py +244 -0
  284. claude_mpm/utils/migration.py +372 -0
  285. claude_mpm/utils/progress.py +387 -0
  286. claude_mpm/utils/robust_installer.py +49 -7
  287. claude_mpm/utils/structured_questions.py +619 -0
  288. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
  289. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
  290. claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
  291. claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
  292. claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
  293. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  294. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  295. claude_mpm/agents/BASE_OPS.md +0 -219
  296. claude_mpm/agents/BASE_PM.md +0 -468
  297. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  298. claude_mpm/agents/BASE_QA.md +0 -167
  299. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  300. claude_mpm/agents/base_agent_loader.py +0 -626
  301. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  302. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  303. claude_mpm/agents/templates/agent-manager.json +0 -273
  304. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  305. claude_mpm/agents/templates/api_qa.json +0 -183
  306. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  307. claude_mpm/agents/templates/clerk-ops.json +0 -235
  308. claude_mpm/agents/templates/code_analyzer.json +0 -101
  309. claude_mpm/agents/templates/content-agent.json +0 -358
  310. claude_mpm/agents/templates/dart_engineer.json +0 -307
  311. claude_mpm/agents/templates/data_engineer.json +0 -225
  312. claude_mpm/agents/templates/documentation.json +0 -238
  313. claude_mpm/agents/templates/engineer.json +0 -210
  314. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  315. claude_mpm/agents/templates/golang_engineer.json +0 -270
  316. claude_mpm/agents/templates/imagemagick.json +0 -264
  317. claude_mpm/agents/templates/java_engineer.json +0 -346
  318. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  319. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  320. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  321. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  322. claude_mpm/agents/templates/memory_manager.json +0 -158
  323. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  324. claude_mpm/agents/templates/ops.json +0 -185
  325. claude_mpm/agents/templates/php-engineer.json +0 -287
  326. claude_mpm/agents/templates/product_owner.json +0 -338
  327. claude_mpm/agents/templates/project_organizer.json +0 -144
  328. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  329. claude_mpm/agents/templates/python_engineer.json +0 -387
  330. claude_mpm/agents/templates/qa.json +0 -243
  331. claude_mpm/agents/templates/react_engineer.json +0 -239
  332. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  333. claude_mpm/agents/templates/research.json +0 -188
  334. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  335. claude_mpm/agents/templates/rust_engineer.json +0 -275
  336. claude_mpm/agents/templates/security.json +0 -202
  337. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  338. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  339. claude_mpm/agents/templates/ticketing.json +0 -178
  340. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  341. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  342. claude_mpm/agents/templates/version_control.json +0 -159
  343. claude_mpm/agents/templates/web_qa.json +0 -400
  344. claude_mpm/agents/templates/web_ui.json +0 -189
  345. claude_mpm/cli/commands/agents_detect.py +0 -380
  346. claude_mpm/cli/commands/agents_recommend.py +0 -309
  347. claude_mpm/cli/ticket_cli.py +0 -35
  348. claude_mpm/commands/mpm-agents-detect.md +0 -168
  349. claude_mpm/commands/mpm-agents-recommend.md +0 -214
  350. claude_mpm/commands/mpm-agents.md +0 -122
  351. claude_mpm/commands/mpm-auto-configure.md +0 -269
  352. claude_mpm/commands/mpm-resume.md +0 -372
  353. claude_mpm/commands/mpm-tickets.md +0 -151
  354. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  355. claude_mpm/dashboard/analysis_runner.py +0 -455
  356. claude_mpm/dashboard/index.html +0 -13
  357. claude_mpm/dashboard/open_dashboard.py +0 -66
  358. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  359. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  360. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  361. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  362. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  363. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  364. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  365. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  366. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  367. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  368. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  369. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  370. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  371. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  372. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  373. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  374. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  375. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  376. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  377. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  378. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  379. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  380. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  381. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  382. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  383. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  384. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  385. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  386. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  387. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  388. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  389. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  390. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  391. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  392. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  393. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  394. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  395. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  396. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  397. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  398. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  399. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  400. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  402. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  403. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  404. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  405. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  406. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  407. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  408. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  409. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  410. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  411. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  412. claude_mpm/dashboard/static/built/react/events.js +0 -30
  413. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  414. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  415. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  416. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  417. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  418. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  419. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  420. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  421. claude_mpm/dashboard/static/css/activity.css +0 -1958
  422. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  423. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  424. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  425. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  426. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  427. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  428. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  429. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  430. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  443. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  444. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  445. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  446. claude_mpm/dashboard/static/events.html +0 -607
  447. claude_mpm/dashboard/static/index.html +0 -635
  448. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  449. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  450. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  451. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  452. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  453. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  454. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  455. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  456. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  457. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  458. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  459. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  460. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  461. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  462. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  463. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  464. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  465. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  466. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  467. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  468. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  469. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  470. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  471. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  472. claude_mpm/dashboard/static/js/dashboard.js +0 -1896
  473. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  474. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  475. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  476. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  477. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  478. claude_mpm/dashboard/static/js/socket-client.js +0 -1457
  479. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  480. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  481. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  482. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  483. claude_mpm/dashboard/static/legacy/files.html +0 -747
  484. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  485. claude_mpm/dashboard/static/monitors.html +0 -431
  486. claude_mpm/dashboard/static/production/events.html +0 -659
  487. claude_mpm/dashboard/static/production/main.html +0 -698
  488. claude_mpm/dashboard/static/production/monitors.html +0 -483
  489. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  490. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  491. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  492. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  493. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  494. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  495. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  496. claude_mpm/dashboard/templates/code_simple.html +0 -153
  497. claude_mpm/dashboard/templates/index.html +0 -606
  498. claude_mpm/dashboard/test_dashboard.html +0 -372
  499. claude_mpm/scripts/mcp_server.py +0 -75
  500. claude_mpm/scripts/mcp_wrapper.py +0 -39
  501. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  502. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  503. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  504. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  505. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  506. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  507. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  508. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  509. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  510. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  511. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
  512. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  513. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  514. claude_mpm/services/mcp_gateway/main.py +0 -589
  515. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  516. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  517. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  518. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  519. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
  520. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  521. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
  522. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  523. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  524. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  525. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  526. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  527. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  528. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
  529. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  530. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  531. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  532. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  533. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  534. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  535. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  536. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  537. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  538. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  539. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  540. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  541. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  542. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  543. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  544. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  545. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  546. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  547. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  548. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  549. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  550. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  551. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  552. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  553. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  554. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  555. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  556. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  557. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  558. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  559. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  560. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  561. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  562. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  563. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  564. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  565. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  566. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  567. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  568. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  569. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  570. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  571. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  572. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  573. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  574. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  575. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  576. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  577. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  578. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  579. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  580. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  581. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  582. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  583. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  584. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  585. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  586. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  587. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  588. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  589. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  590. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  591. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  592. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  593. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  594. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  595. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  596. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  597. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  598. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  599. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  600. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  601. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  602. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  603. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  604. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  605. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  606. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  607. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  608. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  609. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  610. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  611. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  612. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  613. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  614. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  615. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  616. claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
  617. claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
  618. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  619. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  620. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  621. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  622. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
  623. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
@@ -1,1457 +0,0 @@
1
- /**
2
- * Socket.IO Client for Claude MPM Dashboard
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
39
- */
40
-
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
43
- const io = window.io;
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
- */
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
- */
85
- constructor() {
86
- /**
87
- * Socket.IO connection instance.
88
- * @type {Socket|null}
89
- * @private
90
- */
91
- this.socket = null;
92
-
93
- /**
94
- * Current connection port.
95
- * @type {string|null}
96
- * @private
97
- */
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
- */
106
- this.connectionCallbacks = {
107
- connect: [], // Called on successful connection
108
- disconnect: [], // Called on disconnection
109
- error: [], // Called on connection errors
110
- event: [] // Called on incoming events
111
- };
112
-
113
- /**
114
- * Event schema definition for validation.
115
- * WHY: Ensures data integrity and prevents processing malformed events.
116
- * @type {Object}
117
- * @private
118
- */
119
- this.eventSchema = {
120
- required: ['source', 'type', 'subtype', 'timestamp', 'data'],
121
- optional: ['event', 'session_id']
122
- };
123
-
124
- /**
125
- * Current connection state.
126
- * @type {boolean}
127
- * @private
128
- */
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
- */
137
- this.isConnecting = false;
138
-
139
- /**
140
- * Timestamp of last successful connection.
141
- * @type {number|null}
142
- * @private
143
- */
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
- */
152
- this.disconnectTime = null;
153
-
154
- /**
155
- * Event history storage.
156
- * WHY: Maintains event history for dashboard display and analysis.
157
- * @type {Array.<Object>}
158
- * @private
159
- */
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
- */
168
- this.sessions = new Map();
169
-
170
- /**
171
- * Current active session identifier.
172
- * @type {string|null}
173
- * @private
174
- */
175
- this.currentSessionId = null;
176
-
177
- /**
178
- * Event queue for disconnection periods.
179
- * WHY: Prevents event loss during temporary disconnections.
180
- * @type {Array.<Object>}
181
- * @private
182
- */
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
- */
192
- this.maxQueueSize = 100;
193
-
194
- /**
195
- * Current retry attempt counter.
196
- * WHY: Tracks retry attempts for exponential backoff logic.
197
- * @type {number}
198
- * @private
199
- */
200
- this.retryAttempts = 0;
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
- */
226
- this.pendingEmissions = new Map(); // Track pending emissions for retry
227
-
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
- */
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
- */
242
- this.lastPongTime = null;
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
- */
258
- this.healthCheckInterval = null;
259
-
260
- // Initialize background monitoring
261
- this.startStatusCheckFallback();
262
- this.startHealthMonitoring();
263
- }
264
-
265
- /**
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');
290
- */
291
- connect(port = '8765') {
292
- // Store the port for later use in reconnections
293
- this.port = port;
294
- const url = `http://localhost:${port}`;
295
-
296
- // WHY this check: Prevents connection conflicts that can cause memory leaks
297
- if (this.socket && (this.socket.connected || this.socket.connecting)) {
298
- console.log('Already connected or connecting, disconnecting first...');
299
- this.socket.disconnect();
300
- // WHY 100ms delay: Allows cleanup to complete before new connection
301
- setTimeout(() => this.doConnect(url), 100);
302
- return;
303
- }
304
-
305
- this.doConnect(url);
306
- }
307
-
308
- /**
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
331
- */
332
- doConnect(url) {
333
- console.log(`Connecting to Socket.IO server at ${url}`);
334
-
335
- // Check if io is available
336
- if (typeof io === 'undefined') {
337
- console.error('Socket.IO library not loaded! Make sure socket.io.min.js is loaded before this script.');
338
- this.notifyConnectionStatus('Socket.IO library not loaded', 'error');
339
- return;
340
- }
341
-
342
- this.isConnecting = true;
343
- this.notifyConnectionStatus('Connecting...', 'connecting');
344
-
345
- this.socket = io(url, {
346
- autoConnect: true,
347
- reconnection: true,
348
- reconnectionDelay: 1000,
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
- forceNew: true,
353
- transports: ['websocket', 'polling'],
354
- // Remove client-side ping configuration - let server control this
355
- // The server now properly configures: ping_interval=30s, ping_timeout=60s
356
- });
357
-
358
- this.setupSocketHandlers();
359
- }
360
-
361
- /**
362
- * Setup Socket.IO event handlers
363
- */
364
- setupSocketHandlers() {
365
- this.socket.on('connect', () => {
366
- console.log('Connected to Socket.IO server');
367
- const previouslyConnected = this.isConnected;
368
- this.isConnected = true;
369
- this.isConnecting = false;
370
- this.lastConnectTime = Date.now();
371
- this.retryAttempts = 0; // Reset retry counter on successful connect
372
-
373
- // Calculate downtime if this is a reconnection
374
- if (this.disconnectTime && previouslyConnected === false) {
375
- const downtime = (Date.now() - this.disconnectTime) / 1000;
376
- console.log(`Reconnected after ${downtime.toFixed(1)}s downtime`);
377
-
378
- // Flush queued events after reconnection
379
- this.flushEventQueue();
380
- }
381
-
382
- this.notifyConnectionStatus('Connected', 'connected');
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
-
388
- // Emit connect callback
389
- this.connectionCallbacks.connect.forEach(callback =>
390
- callback(this.socket.id)
391
- );
392
-
393
- this.requestStatus();
394
- // History is now automatically sent by server on connection
395
- // No need to explicitly request it
396
- });
397
-
398
- this.socket.on('disconnect', (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
-
411
- this.isConnected = false;
412
- this.isConnecting = false;
413
- this.disconnectTime = Date.now();
414
-
415
- this.notifyConnectionStatus(`Disconnected: ${reason}`, 'disconnected');
416
-
417
- // Emit disconnect callback
418
- this.connectionCallbacks.disconnect.forEach(callback =>
419
- callback(reason)
420
- );
421
-
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`);
437
- this.scheduleReconnect();
438
- }
439
- });
440
-
441
- this.socket.on('connect_error', (error) => {
442
- console.error('Connection error:', error);
443
- this.isConnecting = false;
444
- const errorMsg = error.message || error.description || 'Unknown error';
445
- this.notifyConnectionStatus(`Connection Error: ${errorMsg}`, 'disconnected');
446
-
447
- // Add error event
448
- this.addEvent({
449
- type: 'connection.error',
450
- timestamp: new Date().toISOString(),
451
- data: {
452
- error: errorMsg,
453
- url: this.socket.io.uri,
454
- retry_attempt: this.retryAttempts
455
- }
456
- });
457
-
458
- // Emit error callback
459
- this.connectionCallbacks.error.forEach(callback =>
460
- callback(errorMsg)
461
- );
462
-
463
- // Schedule reconnect with backoff
464
- this.scheduleReconnect();
465
- });
466
-
467
- // Primary event handler - this is what the server actually emits
468
- this.socket.on('claude_event', (data) => {
469
- console.log('Received claude_event:', data);
470
-
471
- // Validate event schema
472
- const validatedEvent = this.validateEventSchema(data);
473
- if (!validatedEvent) {
474
- console.warn('Invalid event schema received:', data);
475
- return;
476
- }
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
-
484
- // Transform event to match expected format (for backward compatibility)
485
- const transformedEvent = this.transformEvent(validatedEvent);
486
- console.log('Transformed event:', transformedEvent);
487
- this.addEvent(transformedEvent);
488
- });
489
-
490
- // Add ping/pong handlers for health monitoring
491
- this.socket.on('ping', (data) => {
492
- // console.log('Received ping from server');
493
- this.lastPingTime = Date.now();
494
-
495
- // Send pong response immediately
496
- this.socket.emit('pong', {
497
- timestamp: data.timestamp,
498
- client_time: Date.now()
499
- });
500
- });
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
-
526
- // Session and event handlers (legacy/fallback)
527
- this.socket.on('session.started', (data) => {
528
- this.addEvent({ type: 'session', subtype: 'started', timestamp: new Date().toISOString(), data });
529
- });
530
-
531
- this.socket.on('session.ended', (data) => {
532
- this.addEvent({ type: 'session', subtype: 'ended', timestamp: new Date().toISOString(), data });
533
- });
534
-
535
- this.socket.on('claude.request', (data) => {
536
- this.addEvent({ type: 'claude', subtype: 'request', timestamp: new Date().toISOString(), data });
537
- });
538
-
539
- this.socket.on('claude.response', (data) => {
540
- this.addEvent({ type: 'claude', subtype: 'response', timestamp: new Date().toISOString(), data });
541
- });
542
-
543
- this.socket.on('agent.loaded', (data) => {
544
- this.addEvent({ type: 'agent', subtype: 'loaded', timestamp: new Date().toISOString(), data });
545
- });
546
-
547
- this.socket.on('agent.executed', (data) => {
548
- this.addEvent({ type: 'agent', subtype: 'executed', timestamp: new Date().toISOString(), data });
549
- });
550
-
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
- // });
556
-
557
- // this.socket.on('hook.post', (data) => {
558
- // this.addEvent({ type: 'hook', subtype: 'post', timestamp: new Date().toISOString(), data });
559
- // });
560
-
561
- this.socket.on('todo.updated', (data) => {
562
- this.addEvent({ type: 'todo', subtype: 'updated', timestamp: new Date().toISOString(), data });
563
- });
564
-
565
- this.socket.on('memory.operation', (data) => {
566
- this.addEvent({ type: 'memory', subtype: 'operation', timestamp: new Date().toISOString(), data });
567
- });
568
-
569
- this.socket.on('log.entry', (data) => {
570
- this.addEvent({ type: 'log', subtype: 'entry', timestamp: new Date().toISOString(), data });
571
- });
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
-
624
- this.socket.on('history', (data) => {
625
- console.log('Received event history:', data);
626
- if (data && Array.isArray(data.events)) {
627
- console.log(`Processing ${data.events.length} historical events (${data.count} sent, ${data.total_available} total available)`);
628
- // Add events in the order received (should already be chronological - oldest first)
629
- // Transform each historical event to match expected format
630
- data.events.forEach(event => {
631
- const transformedEvent = this.transformEvent(event);
632
- this.addEvent(transformedEvent, false);
633
- });
634
- this.notifyEventUpdate();
635
- console.log(`Event history loaded: ${data.events.length} events added to dashboard`);
636
- } else if (Array.isArray(data)) {
637
- // Handle legacy format for backward compatibility
638
- console.log('Received legacy event history format:', data.length, 'events');
639
- data.forEach(event => {
640
- const transformedEvent = this.transformEvent(event);
641
- this.addEvent(transformedEvent, false);
642
- });
643
- this.notifyEventUpdate();
644
- }
645
- });
646
-
647
- this.socket.on('system.status', (data) => {
648
- console.log('Received system status:', data);
649
- if (data.sessions) {
650
- this.updateSessions(data.sessions);
651
- }
652
- if (data.current_session) {
653
- this.currentSessionId = data.current_session;
654
- }
655
- });
656
- }
657
-
658
- /**
659
- * Disconnect from Socket.IO server
660
- */
661
- disconnect() {
662
- if (this.socket) {
663
- this.socket.disconnect();
664
- this.socket = null;
665
- }
666
- this.port = null; // Clear the stored port
667
- this.isConnected = false;
668
- this.isConnecting = false;
669
- }
670
-
671
- /**
672
- * Emit an event with retry support
673
- * @param {string} event - Event name
674
- * @param {any} data - Event data
675
- * @param {Object} options - Options for retry behavior
676
- */
677
- emitWithRetry(event, data = null, options = {}) {
678
- const {
679
- maxRetries = 3,
680
- retryDelays = [1000, 2000, 4000],
681
- onSuccess = null,
682
- onFailure = null
683
- } = options;
684
-
685
- const emissionId = `${event}_${Date.now()}_${Math.random()}`;
686
-
687
- const attemptEmission = (attemptNum = 0) => {
688
- if (!this.socket || !this.socket.connected) {
689
- // Queue for later if disconnected
690
- if (attemptNum === 0) {
691
- this.queueEvent(event, data);
692
- console.log(`Queued ${event} for later emission (disconnected)`);
693
- if (onFailure) onFailure('disconnected');
694
- }
695
- return;
696
- }
697
-
698
- try {
699
- // Attempt emission
700
- this.socket.emit(event, data);
701
- console.log(`Emitted ${event} successfully`);
702
-
703
- // Remove from pending
704
- this.pendingEmissions.delete(emissionId);
705
-
706
- if (onSuccess) onSuccess();
707
-
708
- } catch (error) {
709
- console.error(`Failed to emit ${event} (attempt ${attemptNum + 1}):`, error);
710
-
711
- if (attemptNum < maxRetries - 1) {
712
- const delay = retryDelays[attemptNum] || retryDelays[retryDelays.length - 1];
713
- console.log(`Retrying ${event} in ${delay}ms...`);
714
-
715
- // Store pending emission
716
- this.pendingEmissions.set(emissionId, {
717
- event,
718
- data,
719
- attemptNum: attemptNum + 1,
720
- scheduledTime: Date.now() + delay
721
- });
722
-
723
- setTimeout(() => attemptEmission(attemptNum + 1), delay);
724
- } else {
725
- console.error(`Failed to emit ${event} after ${maxRetries} attempts`);
726
- this.pendingEmissions.delete(emissionId);
727
- if (onFailure) onFailure('max_retries_exceeded');
728
- }
729
- }
730
- };
731
-
732
- attemptEmission();
733
- }
734
-
735
- /**
736
- * Queue an event for later emission
737
- * @param {string} event - Event name
738
- * @param {any} data - Event data
739
- */
740
- queueEvent(event, data) {
741
- if (this.eventQueue.length >= this.maxQueueSize) {
742
- // Remove oldest event if queue is full
743
- const removed = this.eventQueue.shift();
744
- console.warn(`Event queue full, dropped oldest event: ${removed.event}`);
745
- }
746
-
747
- this.eventQueue.push({
748
- event,
749
- data,
750
- timestamp: Date.now()
751
- });
752
- }
753
-
754
- /**
755
- * Flush queued events after reconnection
756
- */
757
- flushEventQueue() {
758
- if (this.eventQueue.length === 0) return;
759
-
760
- console.log(`Flushing ${this.eventQueue.length} queued events...`);
761
- const events = [...this.eventQueue];
762
- this.eventQueue = [];
763
-
764
- // Emit each queued event with a small delay between them
765
- events.forEach((item, index) => {
766
- setTimeout(() => {
767
- if (this.socket && this.socket.connected) {
768
- this.socket.emit(item.event, item.data);
769
- console.log(`Flushed queued event: ${item.event}`);
770
- }
771
- }, index * 100); // 100ms between each event
772
- });
773
- }
774
-
775
- /**
776
- * Schedule a reconnection attempt with exponential backoff
777
- */
778
- scheduleReconnect() {
779
- if (this.retryAttempts >= this.maxRetryAttempts) {
780
- console.log('Max reconnection attempts reached, stopping auto-reconnect');
781
- this.notifyConnectionStatus('Reconnection failed', 'disconnected');
782
- return;
783
- }
784
-
785
- const delay = this.retryDelays[this.retryAttempts] || this.retryDelays[this.retryDelays.length - 1];
786
- this.retryAttempts++;
787
-
788
- console.log(`Scheduling reconnect attempt ${this.retryAttempts}/${this.maxRetryAttempts} in ${delay}ms...`);
789
- this.notifyConnectionStatus(`Reconnecting in ${delay/1000}s...`, 'connecting');
790
-
791
- setTimeout(() => {
792
- if (!this.isConnected && this.port) {
793
- console.log(`Attempting reconnection ${this.retryAttempts}/${this.maxRetryAttempts}...`);
794
- this.connect(this.port);
795
- }
796
- }, delay);
797
- }
798
-
799
- /**
800
- * Request server status
801
- */
802
- requestStatus() {
803
- if (this.socket && this.socket.connected) {
804
- console.log('Requesting server status...');
805
- this.emitWithRetry('request.status', null, {
806
- maxRetries: 2,
807
- retryDelays: [500, 1000]
808
- });
809
- }
810
- }
811
-
812
- /**
813
- * Request event history from server
814
- * @param {Object} options - History request options
815
- * @param {number} options.limit - Maximum number of events to retrieve (default: 50)
816
- * @param {Array<string>} options.event_types - Optional filter by event types
817
- */
818
- requestHistory(options = {}) {
819
- if (this.socket && this.socket.connected) {
820
- const params = {
821
- limit: options.limit || 50,
822
- event_types: options.event_types || []
823
- };
824
- console.log('Requesting event history...', params);
825
- this.emitWithRetry('get_history', params, {
826
- maxRetries: 3,
827
- retryDelays: [1000, 2000, 3000],
828
- onFailure: (reason) => {
829
- console.error(`Failed to request history: ${reason}`);
830
- }
831
- });
832
- } else {
833
- console.warn('Cannot request history: not connected to server');
834
- }
835
- }
836
-
837
- /**
838
- * Add event to local storage and notify listeners
839
- * @param {Object} eventData - Event data
840
- * @param {boolean} notify - Whether to notify listeners (default: true)
841
- */
842
- addEvent(eventData, notify = true) {
843
- // Ensure event has required fields
844
- if (!eventData.timestamp) {
845
- eventData.timestamp = new Date().toISOString();
846
- }
847
- if (!eventData.id) {
848
- eventData.id = Date.now() + Math.random();
849
- }
850
-
851
- this.events.push(eventData);
852
-
853
- // Update session tracking
854
- if (eventData.data && eventData.data.session_id) {
855
- const sessionId = eventData.data.session_id;
856
- if (!this.sessions.has(sessionId)) {
857
- this.sessions.set(sessionId, {
858
- id: sessionId,
859
- startTime: eventData.timestamp,
860
- lastActivity: eventData.timestamp,
861
- eventCount: 0,
862
- working_directory: null,
863
- git_branch: null
864
- });
865
- }
866
- const session = this.sessions.get(sessionId);
867
- session.lastActivity = eventData.timestamp;
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
- }
899
- }
900
-
901
- if (notify) {
902
- this.notifyEventUpdate();
903
- }
904
- }
905
-
906
- /**
907
- * Update sessions from server data
908
- * @param {Array} sessionsData - Sessions data from server
909
- */
910
- updateSessions(sessionsData) {
911
- if (Array.isArray(sessionsData)) {
912
- sessionsData.forEach(session => {
913
- this.sessions.set(session.id, session);
914
- });
915
- }
916
- }
917
-
918
- /**
919
- * Clear all events
920
- */
921
- clearEvents() {
922
- this.events = [];
923
- this.sessions.clear();
924
- this.notifyEventUpdate();
925
- }
926
-
927
- /**
928
- * Clear events and request fresh history from server
929
- * @param {Object} options - History request options (same as requestHistory)
930
- */
931
- refreshHistory(options = {}) {
932
- this.clearEvents();
933
- this.requestHistory(options);
934
- }
935
-
936
- /**
937
- * Get filtered events by session
938
- * @param {string} sessionId - Session ID to filter by (null for all)
939
- * @returns {Array} Filtered events
940
- */
941
- getEventsBySession(sessionId = null) {
942
- if (!sessionId) {
943
- return this.events;
944
- }
945
- return this.events.filter(event =>
946
- event.data && event.data.session_id === sessionId
947
- );
948
- }
949
-
950
- /**
951
- * Register callback for connection events
952
- * @param {string} eventType - Type of event (connect, disconnect, error)
953
- * @param {Function} callback - Callback function
954
- */
955
- onConnection(eventType, callback) {
956
- if (this.connectionCallbacks[eventType]) {
957
- this.connectionCallbacks[eventType].push(callback);
958
- }
959
- }
960
-
961
- /**
962
- * Register callback for event updates
963
- * @param {Function} callback - Callback function
964
- */
965
- onEventUpdate(callback) {
966
- this.connectionCallbacks.event.push(callback);
967
- }
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
-
995
- /**
996
- * Notify connection status change
997
- * @param {string} status - Status message
998
- * @param {string} type - Status type (connected, disconnected, connecting)
999
- */
1000
- notifyConnectionStatus(status, type) {
1001
- console.log(`SocketClient: Connection status changed to '${status}' (${type})`);
1002
-
1003
- // Direct DOM update - immediate and reliable
1004
- this.updateConnectionStatusDOM(status, type);
1005
-
1006
- // Also dispatch custom event for other modules
1007
- document.dispatchEvent(new CustomEvent('socketConnectionStatus', {
1008
- detail: { status, type }
1009
- }));
1010
- }
1011
-
1012
- /**
1013
- * Directly update the connection status DOM element
1014
- * @param {string} status - Status message
1015
- * @param {string} type - Status type (connected, disconnected, connecting)
1016
- */
1017
- updateConnectionStatusDOM(status, type) {
1018
- const statusElement = document.getElementById('connection-status');
1019
- if (statusElement) {
1020
- // Update the text content while preserving the indicator span
1021
- statusElement.innerHTML = `<span>●</span> ${status}`;
1022
-
1023
- // Update the CSS class for styling
1024
- statusElement.className = `status-badge status-${type}`;
1025
-
1026
- console.log(`SocketClient: Direct DOM update - status: '${status}' (${type})`);
1027
- } else {
1028
- console.warn('SocketClient: Could not find connection-status element in DOM');
1029
- }
1030
- }
1031
-
1032
- /**
1033
- * Notify event update
1034
- */
1035
- notifyEventUpdate() {
1036
- this.connectionCallbacks.event.forEach(callback =>
1037
- callback(this.events, this.sessions)
1038
- );
1039
-
1040
- // Also dispatch custom event
1041
- document.dispatchEvent(new CustomEvent('socketEventUpdate', {
1042
- detail: { events: this.events, sessions: this.sessions }
1043
- }));
1044
- }
1045
-
1046
- /**
1047
- * Get connection state
1048
- * @returns {Object} Connection state
1049
- */
1050
- getConnectionState() {
1051
- return {
1052
- isConnected: this.isConnected,
1053
- isConnecting: this.isConnecting,
1054
- socketId: this.socket ? this.socket.id : null
1055
- };
1056
- }
1057
-
1058
- /**
1059
- * Validate event against expected schema
1060
- * @param {Object} eventData - Raw event data
1061
- * @returns {Object|null} Validated event or null if invalid
1062
- */
1063
- validateEventSchema(eventData) {
1064
- if (!eventData || typeof eventData !== 'object') {
1065
- console.warn('Event data is not an object:', eventData);
1066
- return null;
1067
- }
1068
-
1069
- // Make a copy to avoid modifying the original
1070
- const validated = { ...eventData };
1071
-
1072
- // Check and provide defaults for required fields
1073
- if (!validated.source) {
1074
- validated.source = 'system'; // Default source for backward compatibility
1075
- }
1076
- if (!validated.type) {
1077
- // If there's an event field, use it as the type
1078
- if (validated.event) {
1079
- validated.type = validated.event;
1080
- } else {
1081
- validated.type = 'unknown';
1082
- }
1083
- }
1084
- if (!validated.subtype) {
1085
- validated.subtype = 'generic';
1086
- }
1087
- if (!validated.timestamp) {
1088
- validated.timestamp = new Date().toISOString();
1089
- }
1090
- if (!validated.data) {
1091
- validated.data = {};
1092
- }
1093
-
1094
- // Ensure data field is an object
1095
- if (validated.data && typeof validated.data !== 'object') {
1096
- validated.data = { value: validated.data };
1097
- }
1098
-
1099
- console.log('Validated event:', validated);
1100
- return validated;
1101
- }
1102
-
1103
- /**
1104
- * Transform received event to match expected dashboard format
1105
- * @param {Object} eventData - Raw event data from server
1106
- * @returns {Object} Transformed event
1107
- */
1108
- transformEvent(eventData) {
1109
- // Handle multiple event structures:
1110
- // 1. Hook events: { type: 'hook.pre_tool', timestamp: '...', data: {...} }
1111
- // 2. Legacy events: { event: 'TestStart', timestamp: '...', ... }
1112
- // 3. Standard events: { type: 'session', subtype: 'started', ... }
1113
- // 4. Normalized events: { type: 'code', subtype: 'progress', ... } - already normalized, keep as-is
1114
-
1115
- if (!eventData) {
1116
- return eventData; // Return as-is if null/undefined
1117
- }
1118
-
1119
- let transformedEvent = { ...eventData };
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
- }
1139
- // Handle legacy format with 'event' field but no 'type'
1140
- else if (!eventData.type && eventData.event) {
1141
- // Map common event names to proper type/subtype
1142
- const eventName = eventData.event;
1143
-
1144
- // Check for known event patterns
1145
- if (eventName === 'TestStart' || eventName === 'TestEnd') {
1146
- transformedEvent.type = 'test';
1147
- transformedEvent.subtype = eventName.toLowerCase().replace('test', '');
1148
- } else if (eventName === 'SubagentStart' || eventName === 'SubagentStop') {
1149
- transformedEvent.type = 'subagent';
1150
- transformedEvent.subtype = eventName.toLowerCase().replace('subagent', '');
1151
- } else if (eventName === 'ToolCall') {
1152
- transformedEvent.type = 'tool';
1153
- transformedEvent.subtype = 'call';
1154
- } else if (eventName === 'UserPrompt') {
1155
- transformedEvent.type = 'hook';
1156
- transformedEvent.subtype = 'user_prompt';
1157
- } else {
1158
- // Generic fallback for unknown event names
1159
- // Use 'unknown' for type and the actual eventName for subtype
1160
- transformedEvent.type = 'unknown';
1161
- transformedEvent.subtype = eventName.toLowerCase();
1162
-
1163
- // Prevent duplicate type/subtype values
1164
- if (transformedEvent.type === transformedEvent.subtype) {
1165
- transformedEvent.subtype = 'event';
1166
- }
1167
- }
1168
-
1169
- // Remove the 'event' field to avoid confusion
1170
- delete transformedEvent.event;
1171
- // Store original event name for display purposes
1172
- transformedEvent.originalEventName = eventName;
1173
- }
1174
- // Handle standard format with 'type' field that needs transformation
1175
- else if (eventData.type) {
1176
- const type = eventData.type;
1177
-
1178
- // Transform 'hook.subtype' format to separate type and subtype
1179
- if (type.startsWith('hook.')) {
1180
- const subtype = type.substring(5); // Remove 'hook.' prefix
1181
- transformedEvent.type = 'hook';
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;
1193
- }
1194
- // Transform other dotted types like 'session.started' -> type: 'session', subtype: 'started'
1195
- else if (type.includes('.')) {
1196
- const [mainType, ...subtypeParts] = type.split('.');
1197
- transformedEvent.type = mainType;
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;
1213
- }
1214
- }
1215
- // If no type and no event field, mark as unknown
1216
- else {
1217
- transformedEvent.type = 'unknown';
1218
- transformedEvent.subtype = '';
1219
- transformedEvent.originalEventName = 'unknown';
1220
- }
1221
-
1222
- // Extract and flatten data fields to top level for dashboard compatibility
1223
- // The dashboard expects fields like tool_name, agent_type, etc. at the top level
1224
- if (eventData.data && typeof eventData.data === 'object') {
1225
- // Protected fields that should never be overwritten by data fields
1226
- const protectedFields = ['type', 'subtype', 'timestamp', 'id', 'event', 'event_type', 'originalEventName'];
1227
-
1228
- // Copy all data fields to the top level, except protected ones
1229
- Object.keys(eventData.data).forEach(key => {
1230
- // Only copy if not a protected field
1231
- if (!protectedFields.includes(key)) {
1232
- // Special handling for tool_parameters to ensure it's properly preserved
1233
- // This is critical for file path extraction in file-tool-tracker
1234
- if (key === 'tool_parameters' && typeof eventData.data[key] === 'object') {
1235
- // Deep copy the tool_parameters object to preserve all nested fields
1236
- transformedEvent[key] = JSON.parse(JSON.stringify(eventData.data[key]));
1237
- } else {
1238
- transformedEvent[key] = eventData.data[key];
1239
- }
1240
- } else {
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
- }
1246
- }
1247
- });
1248
-
1249
- // Keep the original data object for backward compatibility
1250
- transformedEvent.data = eventData.data;
1251
- }
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
-
1281
- // Debug logging for tool events
1282
- if (transformedEvent.type === 'hook' && (transformedEvent.subtype === 'pre_tool' || transformedEvent.subtype === 'post_tool')) {
1283
- console.log('Transformed tool event:', {
1284
- type: transformedEvent.type,
1285
- subtype: transformedEvent.subtype,
1286
- hook_event_name: transformedEvent.hook_event_name,
1287
- tool_name: transformedEvent.tool_name,
1288
- has_tool_parameters: !!transformedEvent.tool_parameters,
1289
- tool_parameters: transformedEvent.tool_parameters,
1290
- has_data: !!transformedEvent.data,
1291
- keys: Object.keys(transformedEvent).filter(k => k !== 'data')
1292
- });
1293
-
1294
- // Extra debug logging for file-related tools
1295
- const fileTools = ['Read', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit'];
1296
- if (fileTools.includes(transformedEvent.tool_name)) {
1297
- console.log('File tool event details:', {
1298
- tool_name: transformedEvent.tool_name,
1299
- file_path: transformedEvent.tool_parameters?.file_path,
1300
- path: transformedEvent.tool_parameters?.path,
1301
- notebook_path: transformedEvent.tool_parameters?.notebook_path,
1302
- full_parameters: transformedEvent.tool_parameters
1303
- });
1304
- }
1305
- }
1306
-
1307
- return transformedEvent;
1308
- }
1309
-
1310
- /**
1311
- * Get current events and sessions
1312
- * @returns {Object} Current state
1313
- */
1314
- getState() {
1315
- return {
1316
- events: this.events,
1317
- sessions: this.sessions,
1318
- currentSessionId: this.currentSessionId
1319
- };
1320
- }
1321
-
1322
- /**
1323
- * Start health monitoring
1324
- * Detects stale connections and triggers reconnection
1325
- */
1326
- startHealthMonitoring() {
1327
- this.healthCheckInterval = setInterval(() => {
1328
- if (this.isConnected && this.lastPingTime) {
1329
- const timeSinceLastPing = Date.now() - this.lastPingTime;
1330
-
1331
- if (timeSinceLastPing > this.pingTimeout) {
1332
- console.warn(`No ping from server for ${timeSinceLastPing/1000}s, connection may be stale`);
1333
-
1334
- // Force reconnection
1335
- if (this.socket) {
1336
- console.log('Forcing reconnection due to stale connection...');
1337
- this.socket.disconnect();
1338
- setTimeout(() => {
1339
- if (this.port) {
1340
- this.connect(this.port);
1341
- }
1342
- }, 1000);
1343
- }
1344
- }
1345
- }
1346
- }, 10000); // Check every 10 seconds
1347
- }
1348
-
1349
- /**
1350
- * Stop health monitoring
1351
- */
1352
- stopHealthMonitoring() {
1353
- if (this.healthCheckInterval) {
1354
- clearInterval(this.healthCheckInterval);
1355
- this.healthCheckInterval = null;
1356
- }
1357
- }
1358
-
1359
- /**
1360
- * Start periodic status check as fallback mechanism
1361
- * This ensures the UI stays in sync with actual socket state
1362
- */
1363
- startStatusCheckFallback() {
1364
- // Check status every 2 seconds
1365
- setInterval(() => {
1366
- this.checkAndUpdateStatus();
1367
- }, 2000);
1368
-
1369
- // Initial check after DOM is ready
1370
- if (document.readyState === 'loading') {
1371
- document.addEventListener('DOMContentLoaded', () => {
1372
- setTimeout(() => this.checkAndUpdateStatus(), 100);
1373
- });
1374
- } else {
1375
- setTimeout(() => this.checkAndUpdateStatus(), 100);
1376
- }
1377
- }
1378
-
1379
- /**
1380
- * Check actual socket state and update UI if necessary
1381
- */
1382
- checkAndUpdateStatus() {
1383
- let actualStatus = 'Disconnected';
1384
- let actualType = 'disconnected';
1385
-
1386
- if (this.socket) {
1387
- if (this.socket.connected) {
1388
- actualStatus = 'Connected';
1389
- actualType = 'connected';
1390
- this.isConnected = true;
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
- }
1398
- } else if (this.socket.connecting || this.isConnecting) {
1399
- actualStatus = 'Connecting...';
1400
- actualType = 'connecting';
1401
- this.isConnected = false;
1402
- } else {
1403
- actualStatus = 'Disconnected';
1404
- actualType = 'disconnected';
1405
- this.isConnected = false;
1406
- this.isConnecting = false;
1407
- }
1408
- }
1409
-
1410
- // Always update status to ensure consistency
1411
- this.updateConnectionStatusDOM(actualStatus, actualType);
1412
-
1413
- // Also ensure state is consistent
1414
- const statusElement = document.getElementById('connection-status');
1415
- if (statusElement) {
1416
- const currentText = statusElement.textContent.replace('●', '').trim();
1417
- if (currentText !== actualStatus) {
1418
- console.log(`SocketClient: Status sync - updating from '${currentText}' to '${actualStatus}'`);
1419
- }
1420
- }
1421
- }
1422
-
1423
- /**
1424
- * Clean up resources
1425
- */
1426
- destroy() {
1427
- this.stopHealthMonitoring();
1428
- if (this.socket) {
1429
- this.socket.disconnect();
1430
- this.socket = null;
1431
- }
1432
- this.eventQueue = [];
1433
- this.pendingEmissions.clear();
1434
- }
1435
-
1436
- /**
1437
- * Get connection metrics
1438
- * @returns {Object} Connection metrics
1439
- */
1440
- getConnectionMetrics() {
1441
- return {
1442
- isConnected: this.isConnected,
1443
- uptime: this.lastConnectTime ? (Date.now() - this.lastConnectTime) / 1000 : 0,
1444
- lastPing: this.lastPingTime ? (Date.now() - this.lastPingTime) / 1000 : null,
1445
- queuedEvents: this.eventQueue.length,
1446
- pendingEmissions: this.pendingEmissions.size,
1447
- retryAttempts: this.retryAttempts
1448
- };
1449
- }
1450
- }
1451
-
1452
- // ES6 Module export
1453
- export { SocketClient };
1454
- export default SocketClient;
1455
-
1456
- // Backward compatibility - keep window export for non-module usage
1457
- window.SocketClient = SocketClient;