claude-mpm 5.1.9__py3-none-any.whl → 5.4.48__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 (248) 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/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +1 -1
  5. claude_mpm/agents/MEMORY.md +1 -1
  6. claude_mpm/agents/PM_INSTRUCTIONS.md +843 -900
  7. claude_mpm/agents/WORKFLOW.md +5 -254
  8. claude_mpm/agents/agent_loader.py +13 -44
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/frontmatter_validator.py +2 -2
  11. claude_mpm/agents/templates/circuit-breakers.md +138 -1
  12. claude_mpm/cli/__main__.py +4 -0
  13. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  14. claude_mpm/cli/commands/agent_state_manager.py +18 -27
  15. claude_mpm/cli/commands/agents.py +9 -40
  16. claude_mpm/cli/commands/auto_configure.py +210 -25
  17. claude_mpm/cli/commands/config.py +88 -2
  18. claude_mpm/cli/commands/configure.py +1098 -159
  19. claude_mpm/cli/commands/configure_agent_display.py +25 -6
  20. claude_mpm/cli/commands/mpm_init/core.py +225 -46
  21. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  22. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  23. claude_mpm/cli/commands/postmortem.py +1 -1
  24. claude_mpm/cli/commands/profile.py +277 -0
  25. claude_mpm/cli/commands/skills.py +218 -197
  26. claude_mpm/cli/commands/summarize.py +413 -0
  27. claude_mpm/cli/executor.py +21 -3
  28. claude_mpm/cli/interactive/agent_wizard.py +2 -2
  29. claude_mpm/cli/parsers/agents_parser.py +0 -9
  30. claude_mpm/cli/parsers/auto_configure_parser.py +0 -138
  31. claude_mpm/cli/parsers/base_parser.py +12 -0
  32. claude_mpm/cli/parsers/config_parser.py +153 -83
  33. claude_mpm/cli/parsers/profile_parser.py +148 -0
  34. claude_mpm/cli/parsers/skills_parser.py +0 -5
  35. claude_mpm/cli/startup.py +876 -149
  36. claude_mpm/commands/mpm-config.md +28 -0
  37. claude_mpm/commands/mpm-doctor.md +9 -22
  38. claude_mpm/commands/mpm-help.md +5 -287
  39. claude_mpm/commands/mpm-init.md +81 -507
  40. claude_mpm/commands/mpm-monitor.md +15 -402
  41. claude_mpm/commands/mpm-organize.md +120 -0
  42. claude_mpm/commands/mpm-postmortem.md +6 -108
  43. claude_mpm/commands/mpm-session-resume.md +12 -363
  44. claude_mpm/commands/mpm-status.md +5 -69
  45. claude_mpm/commands/mpm-ticket-view.md +52 -495
  46. claude_mpm/commands/mpm-version.md +5 -107
  47. claude_mpm/config/agent_sources.py +27 -0
  48. claude_mpm/core/config.py +2 -4
  49. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  50. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  51. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  52. claude_mpm/core/framework_loader.py +4 -2
  53. claude_mpm/core/logger.py +13 -0
  54. claude_mpm/core/optimized_startup.py +59 -0
  55. claude_mpm/core/shared/config_loader.py +1 -1
  56. claude_mpm/core/socketio_pool.py +3 -3
  57. claude_mpm/core/unified_agent_registry.py +5 -15
  58. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  59. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
  60. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
  61. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
  62. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
  63. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
  64. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
  65. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
  66. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
  67. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
  68. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
  69. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
  70. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
  71. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
  72. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
  73. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  74. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  75. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  76. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  77. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  78. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  79. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  80. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  85. claude_mpm/hooks/claude_hooks/event_handlers.py +211 -78
  86. claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
  87. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  88. claude_mpm/hooks/claude_hooks/memory_integration.py +26 -9
  89. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  90. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  91. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  92. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  93. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  94. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  95. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  96. claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
  97. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  98. claude_mpm/hooks/memory_integration_hook.py +46 -1
  99. claude_mpm/init.py +63 -19
  100. claude_mpm/models/git_repository.py +3 -3
  101. claude_mpm/scripts/claude-hook-handler.sh +58 -18
  102. claude_mpm/scripts/launch_monitor.py +93 -13
  103. claude_mpm/services/agents/agent_builder.py +3 -3
  104. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  105. claude_mpm/services/agents/agent_review_service.py +280 -0
  106. claude_mpm/services/agents/cache_git_manager.py +6 -6
  107. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  108. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -5
  109. claude_mpm/services/agents/deployment/agent_format_converter.py +23 -13
  110. claude_mpm/services/agents/deployment/agent_template_builder.py +32 -20
  111. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  112. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  113. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  114. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +247 -35
  115. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +392 -87
  116. claude_mpm/services/agents/git_source_manager.py +53 -4
  117. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  118. claude_mpm/services/agents/recommender.py +5 -3
  119. claude_mpm/services/agents/single_tier_deployment_service.py +2 -2
  120. claude_mpm/services/agents/sources/git_source_sync_service.py +120 -7
  121. claude_mpm/services/agents/startup_sync.py +22 -2
  122. claude_mpm/services/agents/toolchain_detector.py +10 -6
  123. claude_mpm/services/analysis/__init__.py +11 -1
  124. claude_mpm/services/analysis/clone_detector.py +1030 -0
  125. claude_mpm/services/command_deployment_service.py +81 -10
  126. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  127. claude_mpm/services/diagnostics/checks/agent_sources_check.py +1 -1
  128. claude_mpm/services/event_bus/config.py +3 -1
  129. claude_mpm/services/git/git_operations_service.py +101 -16
  130. claude_mpm/services/monitor/daemon.py +9 -2
  131. claude_mpm/services/monitor/daemon_manager.py +39 -3
  132. claude_mpm/services/monitor/management/lifecycle.py +8 -1
  133. claude_mpm/services/monitor/server.py +698 -22
  134. claude_mpm/services/pm_skills_deployer.py +711 -0
  135. claude_mpm/services/profile_manager.py +331 -0
  136. claude_mpm/services/self_upgrade_service.py +120 -12
  137. claude_mpm/services/skills/__init__.py +3 -0
  138. claude_mpm/services/skills/git_skill_source_manager.py +130 -2
  139. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  140. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  141. claude_mpm/services/skills_deployer.py +127 -9
  142. claude_mpm/services/socketio/dashboard_server.py +1 -0
  143. claude_mpm/services/socketio/event_normalizer.py +51 -6
  144. claude_mpm/services/socketio/server/core.py +386 -108
  145. claude_mpm/services/version_control/git_operations.py +103 -0
  146. claude_mpm/skills/skill_manager.py +92 -3
  147. claude_mpm/utils/agent_dependency_loader.py +14 -2
  148. claude_mpm/utils/agent_filters.py +17 -44
  149. claude_mpm/utils/migration.py +4 -4
  150. claude_mpm/utils/robust_installer.py +47 -3
  151. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/METADATA +53 -87
  152. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/RECORD +157 -197
  153. claude_mpm-5.4.48.dist-info/entry_points.txt +5 -0
  154. claude_mpm-5.4.48.dist-info/licenses/LICENSE +94 -0
  155. claude_mpm-5.4.48.dist-info/licenses/LICENSE-FAQ.md +153 -0
  156. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  157. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  158. claude_mpm/agents/BASE_OPS.md +0 -219
  159. claude_mpm/agents/BASE_PM.md +0 -480
  160. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  161. claude_mpm/agents/BASE_QA.md +0 -167
  162. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  163. claude_mpm/agents/base_agent_loader.py +0 -601
  164. claude_mpm/cli/commands/agents_detect.py +0 -380
  165. claude_mpm/cli/commands/agents_recommend.py +0 -309
  166. claude_mpm/cli/ticket_cli.py +0 -35
  167. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  168. claude_mpm/commands/mpm-agents-detect.md +0 -177
  169. claude_mpm/commands/mpm-agents-list.md +0 -131
  170. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  171. claude_mpm/commands/mpm-config-view.md +0 -150
  172. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  173. claude_mpm/dashboard/analysis_runner.py +0 -455
  174. claude_mpm/dashboard/index.html +0 -13
  175. claude_mpm/dashboard/open_dashboard.py +0 -66
  176. claude_mpm/dashboard/static/css/activity.css +0 -1958
  177. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  178. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  179. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  180. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  181. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  182. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  183. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  184. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  185. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  186. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  187. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  188. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  189. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  190. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  191. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  192. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  193. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  194. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  195. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  196. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  197. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  198. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  199. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  200. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  201. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  202. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  203. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  204. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  205. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  206. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  207. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  208. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  209. claude_mpm/dashboard/templates/code_simple.html +0 -153
  210. claude_mpm/dashboard/templates/index.html +0 -606
  211. claude_mpm/dashboard/test_dashboard.html +0 -372
  212. claude_mpm/scripts/mcp_server.py +0 -75
  213. claude_mpm/scripts/mcp_wrapper.py +0 -39
  214. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  215. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  216. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  217. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  218. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  219. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  220. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  221. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  222. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  223. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  224. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  225. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  226. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  227. claude_mpm/services/mcp_gateway/main.py +0 -589
  228. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  229. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  230. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  231. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  232. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  233. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  234. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  235. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  236. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  237. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  238. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  239. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  240. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  241. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  242. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  243. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  244. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  245. claude_mpm-5.1.9.dist-info/entry_points.txt +0 -10
  246. claude_mpm-5.1.9.dist-info/licenses/LICENSE +0 -21
  247. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/WHEEL +0 -0
  248. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/top_level.txt +0 -0
@@ -1,654 +0,0 @@
1
- /**
2
- * Connection Debug Panel
3
- *
4
- * Provides detailed connection metrics and debugging tools
5
- * for troubleshooting connection issues.
6
- */
7
-
8
- class ConnectionDebugPanel {
9
- constructor(connectionManager) {
10
- this.connectionManager = connectionManager;
11
- this.isVisible = false;
12
- this.updateInterval = null;
13
-
14
- this.init();
15
- }
16
-
17
- init() {
18
- // Create debug panel HTML
19
- this.createPanel();
20
-
21
- // Setup event listeners
22
- this.setupEventListeners();
23
-
24
- // Start metric updates when visible
25
- this.connectionManager.onStatusChange(() => {
26
- if (this.isVisible) {
27
- this.updateMetrics();
28
- }
29
- });
30
- }
31
-
32
- createPanel() {
33
- const panel = document.createElement('div');
34
- panel.id = 'connection-debug-panel';
35
- panel.className = 'connection-debug-panel';
36
- panel.style.display = 'none';
37
-
38
- panel.innerHTML = `
39
- <div class="debug-panel-header">
40
- <h3>🔧 Connection Debug</h3>
41
- <button id="close-debug-panel" class="btn-close">✕</button>
42
- </div>
43
-
44
- <div class="debug-panel-content">
45
- <!-- Connection Info -->
46
- <div class="debug-section">
47
- <h4>Connection Info</h4>
48
- <div class="debug-info">
49
- <div class="info-row">
50
- <span class="info-label">Client ID:</span>
51
- <span id="debug-client-id" class="info-value">--</span>
52
- </div>
53
- <div class="info-row">
54
- <span class="info-label">Socket ID:</span>
55
- <span id="debug-socket-id" class="info-value">--</span>
56
- </div>
57
- <div class="info-row">
58
- <span class="info-label">State:</span>
59
- <span id="debug-state" class="info-value">--</span>
60
- </div>
61
- <div class="info-row">
62
- <span class="info-label">Quality:</span>
63
- <span id="debug-quality" class="info-value">--</span>
64
- </div>
65
- <div class="info-row">
66
- <span class="info-label">Last Sequence:</span>
67
- <span id="debug-sequence" class="info-value">--</span>
68
- </div>
69
- </div>
70
- </div>
71
-
72
- <!-- Connection Metrics -->
73
- <div class="debug-section">
74
- <h4>Metrics</h4>
75
- <div class="metrics-grid">
76
- <div class="metric-item">
77
- <span class="metric-value" id="debug-total-events">0</span>
78
- <span class="metric-label">Total Events</span>
79
- </div>
80
- <div class="metric-item">
81
- <span class="metric-value" id="debug-events-acked">0</span>
82
- <span class="metric-label">Acknowledged</span>
83
- </div>
84
- <div class="metric-item">
85
- <span class="metric-value" id="debug-buffered">0</span>
86
- <span class="metric-label">Buffered</span>
87
- </div>
88
- <div class="metric-item">
89
- <span class="metric-value" id="debug-reconnects">0</span>
90
- <span class="metric-label">Reconnects</span>
91
- </div>
92
- </div>
93
- </div>
94
-
95
- <!-- Connection Timeline -->
96
- <div class="debug-section">
97
- <h4>Connection Timeline</h4>
98
- <div id="debug-timeline" class="debug-timeline">
99
- <!-- Timeline events will be added here -->
100
- </div>
101
- </div>
102
-
103
- <!-- Debug Actions -->
104
- <div class="debug-section">
105
- <h4>Debug Actions</h4>
106
- <div class="debug-actions">
107
- <button id="debug-force-reconnect" class="btn-action">Force Reconnect</button>
108
- <button id="debug-request-stats" class="btn-action">Request Stats</button>
109
- <button id="debug-clear-buffer" class="btn-action">Clear Buffer</button>
110
- <button id="debug-simulate-disconnect" class="btn-action">Simulate Disconnect</button>
111
- <button id="debug-export-logs" class="btn-action">Export Logs</button>
112
- </div>
113
- </div>
114
-
115
- <!-- Network Tests -->
116
- <div class="debug-section">
117
- <h4>Network Tests</h4>
118
- <div class="network-tests">
119
- <div class="test-row">
120
- <button id="test-latency" class="btn-test">Test Latency</button>
121
- <span id="latency-result" class="test-result">--</span>
122
- </div>
123
- <div class="test-row">
124
- <button id="test-throughput" class="btn-test">Test Throughput</button>
125
- <span id="throughput-result" class="test-result">--</span>
126
- </div>
127
- <div class="test-row">
128
- <button id="test-stability" class="btn-test">Test Stability</button>
129
- <span id="stability-result" class="test-result">--</span>
130
- </div>
131
- </div>
132
- </div>
133
-
134
- <!-- Event Log -->
135
- <div class="debug-section">
136
- <h4>Recent Events</h4>
137
- <div id="debug-event-log" class="event-log">
138
- <!-- Recent events will be shown here -->
139
- </div>
140
- </div>
141
- </div>
142
- `;
143
-
144
- document.body.appendChild(panel);
145
-
146
- // Add styles
147
- this.addStyles();
148
- }
149
-
150
- addStyles() {
151
- const style = document.createElement('style');
152
- style.textContent = `
153
- .connection-debug-panel {
154
- position: fixed;
155
- right: 20px;
156
- top: 80px;
157
- width: 400px;
158
- max-height: 80vh;
159
- background: white;
160
- border-radius: 12px;
161
- box-shadow: 0 8px 32px rgba(0,0,0,0.15);
162
- z-index: 1001;
163
- overflow: hidden;
164
- display: flex;
165
- flex-direction: column;
166
- }
167
-
168
- .debug-panel-header {
169
- display: flex;
170
- justify-content: space-between;
171
- align-items: center;
172
- padding: 16px;
173
- background: linear-gradient(135deg, #667eea 0%, #4299e1 100%);
174
- color: white;
175
- }
176
-
177
- .debug-panel-header h3 {
178
- margin: 0;
179
- font-size: 16px;
180
- }
181
-
182
- .btn-close {
183
- background: rgba(255,255,255,0.2);
184
- border: none;
185
- color: white;
186
- width: 28px;
187
- height: 28px;
188
- border-radius: 50%;
189
- cursor: pointer;
190
- font-size: 16px;
191
- transition: background 0.2s;
192
- }
193
-
194
- .btn-close:hover {
195
- background: rgba(255,255,255,0.3);
196
- }
197
-
198
- .debug-panel-content {
199
- overflow-y: auto;
200
- padding: 16px;
201
- max-height: calc(80vh - 60px);
202
- }
203
-
204
- .debug-section {
205
- margin-bottom: 20px;
206
- padding-bottom: 16px;
207
- border-bottom: 1px solid #e2e8f0;
208
- }
209
-
210
- .debug-section:last-child {
211
- border-bottom: none;
212
- }
213
-
214
- .debug-section h4 {
215
- margin: 0 0 12px 0;
216
- font-size: 14px;
217
- color: #2d3748;
218
- font-weight: 600;
219
- }
220
-
221
- .debug-info {
222
- background: #f7fafc;
223
- padding: 12px;
224
- border-radius: 8px;
225
- }
226
-
227
- .info-row {
228
- display: flex;
229
- justify-content: space-between;
230
- padding: 4px 0;
231
- font-size: 13px;
232
- }
233
-
234
- .info-label {
235
- color: #718096;
236
- }
237
-
238
- .info-value {
239
- font-family: 'SF Mono', Monaco, monospace;
240
- color: #2d3748;
241
- font-weight: 500;
242
- }
243
-
244
- .debug-actions {
245
- display: grid;
246
- grid-template-columns: repeat(2, 1fr);
247
- gap: 8px;
248
- }
249
-
250
- .btn-action {
251
- padding: 8px 12px;
252
- background: #4299e1;
253
- color: white;
254
- border: none;
255
- border-radius: 6px;
256
- font-size: 12px;
257
- cursor: pointer;
258
- transition: background 0.2s;
259
- }
260
-
261
- .btn-action:hover {
262
- background: #3182ce;
263
- }
264
-
265
- .network-tests {
266
- display: flex;
267
- flex-direction: column;
268
- gap: 8px;
269
- }
270
-
271
- .test-row {
272
- display: flex;
273
- align-items: center;
274
- gap: 12px;
275
- }
276
-
277
- .btn-test {
278
- flex: 0 0 120px;
279
- padding: 6px 12px;
280
- background: #805ad5;
281
- color: white;
282
- border: none;
283
- border-radius: 6px;
284
- font-size: 12px;
285
- cursor: pointer;
286
- }
287
-
288
- .test-result {
289
- flex: 1;
290
- padding: 6px 12px;
291
- background: #f7fafc;
292
- border-radius: 6px;
293
- font-size: 12px;
294
- font-family: 'SF Mono', Monaco, monospace;
295
- }
296
-
297
- .debug-timeline {
298
- max-height: 150px;
299
- overflow-y: auto;
300
- background: #f7fafc;
301
- padding: 8px;
302
- border-radius: 8px;
303
- font-size: 12px;
304
- }
305
-
306
- .timeline-event {
307
- padding: 4px 0;
308
- border-bottom: 1px solid #e2e8f0;
309
- }
310
-
311
- .timeline-event:last-child {
312
- border-bottom: none;
313
- }
314
-
315
- .timeline-time {
316
- color: #718096;
317
- font-size: 11px;
318
- }
319
-
320
- .timeline-desc {
321
- color: #2d3748;
322
- margin-top: 2px;
323
- }
324
-
325
- .event-log {
326
- max-height: 200px;
327
- overflow-y: auto;
328
- background: #1a202c;
329
- color: #e2e8f0;
330
- padding: 12px;
331
- border-radius: 8px;
332
- font-family: 'SF Mono', Monaco, monospace;
333
- font-size: 11px;
334
- }
335
-
336
- .log-entry {
337
- padding: 2px 0;
338
- }
339
-
340
- .log-time {
341
- color: #718096;
342
- }
343
-
344
- .log-type {
345
- color: #4299e1;
346
- font-weight: 600;
347
- }
348
-
349
- .log-data {
350
- color: #cbd5e0;
351
- }
352
-
353
- @media (max-width: 768px) {
354
- .connection-debug-panel {
355
- right: 10px;
356
- left: 10px;
357
- width: auto;
358
- }
359
- }
360
- `;
361
-
362
- document.head.appendChild(style);
363
- }
364
-
365
- setupEventListeners() {
366
- // Close button
367
- document.getElementById('close-debug-panel').addEventListener('click', () => {
368
- this.hide();
369
- });
370
-
371
- // Debug actions
372
- document.getElementById('debug-force-reconnect').addEventListener('click', () => {
373
- this.forceReconnect();
374
- });
375
-
376
- document.getElementById('debug-request-stats').addEventListener('click', () => {
377
- this.requestStats();
378
- });
379
-
380
- document.getElementById('debug-clear-buffer').addEventListener('click', () => {
381
- this.clearBuffer();
382
- });
383
-
384
- document.getElementById('debug-simulate-disconnect').addEventListener('click', () => {
385
- this.simulateDisconnect();
386
- });
387
-
388
- document.getElementById('debug-export-logs').addEventListener('click', () => {
389
- this.exportLogs();
390
- });
391
-
392
- // Network tests
393
- document.getElementById('test-latency').addEventListener('click', () => {
394
- this.testLatency();
395
- });
396
-
397
- document.getElementById('test-throughput').addEventListener('click', () => {
398
- this.testThroughput();
399
- });
400
-
401
- document.getElementById('test-stability').addEventListener('click', () => {
402
- this.testStability();
403
- });
404
- }
405
-
406
- show() {
407
- const panel = document.getElementById('connection-debug-panel');
408
- panel.style.display = 'flex';
409
- this.isVisible = true;
410
-
411
- // Start metric updates
412
- this.startMetricUpdates();
413
-
414
- // Initial update
415
- this.updateMetrics();
416
- }
417
-
418
- hide() {
419
- const panel = document.getElementById('connection-debug-panel');
420
- panel.style.display = 'none';
421
- this.isVisible = false;
422
-
423
- // Stop metric updates
424
- this.stopMetricUpdates();
425
- }
426
-
427
- toggle() {
428
- if (this.isVisible) {
429
- this.hide();
430
- } else {
431
- this.show();
432
- }
433
- }
434
-
435
- startMetricUpdates() {
436
- this.updateInterval = setInterval(() => {
437
- this.updateMetrics();
438
- }, 1000);
439
- }
440
-
441
- stopMetricUpdates() {
442
- if (this.updateInterval) {
443
- clearInterval(this.updateInterval);
444
- this.updateInterval = null;
445
- }
446
- }
447
-
448
- updateMetrics() {
449
- const metrics = this.connectionManager.getMetrics();
450
- const socket = this.connectionManager.socket;
451
-
452
- // Update connection info
453
- document.getElementById('debug-client-id').textContent = metrics.clientId || '--';
454
- document.getElementById('debug-socket-id').textContent = socket?.id || '--';
455
- document.getElementById('debug-state').textContent = metrics.connectionState || '--';
456
- document.getElementById('debug-quality').textContent =
457
- `${Math.round(metrics.connectionQuality * 100)}%`;
458
- document.getElementById('debug-sequence').textContent = metrics.lastSequence || '0';
459
-
460
- // Update metrics
461
- document.getElementById('debug-total-events').textContent = metrics.totalEvents || '0';
462
- document.getElementById('debug-events-acked').textContent = metrics.eventsAcked || '0';
463
- document.getElementById('debug-buffered').textContent = metrics.bufferedEvents || '0';
464
- document.getElementById('debug-reconnects').textContent = metrics.totalReconnections || '0';
465
- }
466
-
467
- addTimelineEvent(description) {
468
- const timeline = document.getElementById('debug-timeline');
469
- const event = document.createElement('div');
470
- event.className = 'timeline-event';
471
-
472
- const now = new Date();
473
- event.innerHTML = `
474
- <div class="timeline-time">${now.toLocaleTimeString()}</div>
475
- <div class="timeline-desc">${description}</div>
476
- `;
477
-
478
- timeline.insertBefore(event, timeline.firstChild);
479
-
480
- // Keep only last 20 events
481
- while (timeline.children.length > 20) {
482
- timeline.removeChild(timeline.lastChild);
483
- }
484
- }
485
-
486
- addLogEntry(type, data) {
487
- const log = document.getElementById('debug-event-log');
488
- const entry = document.createElement('div');
489
- entry.className = 'log-entry';
490
-
491
- const now = new Date();
492
- entry.innerHTML = `
493
- <span class="log-time">${now.toLocaleTimeString()}</span>
494
- <span class="log-type">${type}</span>
495
- <span class="log-data">${JSON.stringify(data)}</span>
496
- `;
497
-
498
- log.insertBefore(entry, log.firstChild);
499
-
500
- // Keep only last 50 entries
501
- while (log.children.length > 50) {
502
- log.removeChild(log.lastChild);
503
- }
504
- }
505
-
506
- // Debug actions
507
- forceReconnect() {
508
- this.addTimelineEvent('Force reconnect initiated');
509
- if (this.connectionManager.socket) {
510
- this.connectionManager.socket.disconnect();
511
- setTimeout(() => {
512
- this.connectionManager.socket.connect();
513
- }, 100);
514
- }
515
- }
516
-
517
- requestStats() {
518
- this.addTimelineEvent('Requesting connection stats');
519
- if (this.connectionManager.socket) {
520
- this.connectionManager.socket.emit('get_connection_stats');
521
- }
522
- }
523
-
524
- clearBuffer() {
525
- this.addTimelineEvent('Clearing event buffer');
526
- this.connectionManager.eventBuffer = [];
527
- localStorage.removeItem('claude_mpm_event_buffer');
528
- this.updateMetrics();
529
- }
530
-
531
- simulateDisconnect() {
532
- this.addTimelineEvent('Simulating disconnect');
533
- if (this.connectionManager.socket) {
534
- this.connectionManager.socket.disconnect();
535
- }
536
- }
537
-
538
- exportLogs() {
539
- const logs = {
540
- metrics: this.connectionManager.getMetrics(),
541
- timeline: [],
542
- events: []
543
- };
544
-
545
- // Collect timeline events
546
- const timeline = document.getElementById('debug-timeline');
547
- Array.from(timeline.children).forEach(child => {
548
- logs.timeline.push(child.textContent.trim());
549
- });
550
-
551
- // Collect event log
552
- const eventLog = document.getElementById('debug-event-log');
553
- Array.from(eventLog.children).forEach(child => {
554
- logs.events.push(child.textContent.trim());
555
- });
556
-
557
- // Download as JSON
558
- const blob = new Blob([JSON.stringify(logs, null, 2)], { type: 'application/json' });
559
- const url = URL.createObjectURL(blob);
560
- const a = document.createElement('a');
561
- a.href = url;
562
- a.download = `connection-debug-${Date.now()}.json`;
563
- a.click();
564
- URL.revokeObjectURL(url);
565
-
566
- this.addTimelineEvent('Logs exported');
567
- }
568
-
569
- // Network tests
570
- async testLatency() {
571
- const resultEl = document.getElementById('latency-result');
572
- resultEl.textContent = 'Testing...';
573
-
574
- const start = Date.now();
575
- this.connectionManager.socket.emit('ping');
576
-
577
- // Wait for pong
578
- const pongHandler = () => {
579
- const latency = Date.now() - start;
580
- resultEl.textContent = `${latency}ms`;
581
- this.connectionManager.socket.off('pong', pongHandler);
582
- this.addTimelineEvent(`Latency test: ${latency}ms`);
583
- };
584
-
585
- this.connectionManager.socket.on('pong', pongHandler);
586
-
587
- // Timeout after 5 seconds
588
- setTimeout(() => {
589
- this.connectionManager.socket.off('pong', pongHandler);
590
- if (resultEl.textContent === 'Testing...') {
591
- resultEl.textContent = 'Timeout';
592
- }
593
- }, 5000);
594
- }
595
-
596
- async testThroughput() {
597
- const resultEl = document.getElementById('throughput-result');
598
- resultEl.textContent = 'Testing...';
599
-
600
- // Send 100 events rapidly
601
- const start = Date.now();
602
- let received = 0;
603
-
604
- const handler = () => {
605
- received++;
606
- if (received === 100) {
607
- const duration = (Date.now() - start) / 1000;
608
- const throughput = Math.round(100 / duration);
609
- resultEl.textContent = `${throughput} evt/s`;
610
- this.addTimelineEvent(`Throughput test: ${throughput} events/sec`);
611
- }
612
- };
613
-
614
- this.connectionManager.socket.on('test_response', handler);
615
-
616
- for (let i = 0; i < 100; i++) {
617
- this.connectionManager.socket.emit('test_event', { index: i });
618
- }
619
-
620
- // Cleanup after 10 seconds
621
- setTimeout(() => {
622
- this.connectionManager.socket.off('test_response', handler);
623
- if (received < 100) {
624
- resultEl.textContent = `${received}/100 received`;
625
- }
626
- }, 10000);
627
- }
628
-
629
- async testStability() {
630
- const resultEl = document.getElementById('stability-result');
631
- resultEl.textContent = 'Testing (30s)...';
632
-
633
- let disconnects = 0;
634
- let reconnects = 0;
635
- const startMetrics = { ...this.connectionManager.metrics };
636
-
637
- // Monitor for 30 seconds
638
- setTimeout(() => {
639
- const endMetrics = this.connectionManager.metrics;
640
- disconnects = endMetrics.totalConnections - startMetrics.totalConnections;
641
-
642
- if (disconnects === 0) {
643
- resultEl.textContent = 'Stable ✓';
644
- } else {
645
- resultEl.textContent = `${disconnects} drops`;
646
- }
647
-
648
- this.addTimelineEvent(`Stability test: ${disconnects} disconnections`);
649
- }, 30000);
650
- }
651
- }
652
-
653
- // Export for use
654
- export { ConnectionDebugPanel };