claude-mpm 5.1.8__py3-none-any.whl → 5.4.22__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 (191) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/{PM_INSTRUCTIONS_TEACH.md → CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md} +721 -41
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +290 -34
  5. claude_mpm/agents/agent_loader.py +13 -44
  6. claude_mpm/agents/frontmatter_validator.py +68 -0
  7. claude_mpm/agents/templates/circuit-breakers.md +138 -1
  8. claude_mpm/cli/__main__.py +4 -0
  9. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  10. claude_mpm/cli/commands/agent_state_manager.py +8 -17
  11. claude_mpm/cli/commands/agents.py +169 -31
  12. claude_mpm/cli/commands/auto_configure.py +210 -25
  13. claude_mpm/cli/commands/config.py +88 -2
  14. claude_mpm/cli/commands/configure.py +1111 -161
  15. claude_mpm/cli/commands/configure_agent_display.py +15 -6
  16. claude_mpm/cli/commands/mpm_init/core.py +160 -46
  17. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  18. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  19. claude_mpm/cli/commands/skills.py +214 -189
  20. claude_mpm/cli/commands/summarize.py +413 -0
  21. claude_mpm/cli/executor.py +11 -3
  22. claude_mpm/cli/parsers/agents_parser.py +54 -9
  23. claude_mpm/cli/parsers/auto_configure_parser.py +0 -138
  24. claude_mpm/cli/parsers/base_parser.py +5 -0
  25. claude_mpm/cli/parsers/config_parser.py +153 -83
  26. claude_mpm/cli/parsers/skills_parser.py +3 -2
  27. claude_mpm/cli/startup.py +550 -94
  28. claude_mpm/commands/mpm-config.md +265 -0
  29. claude_mpm/commands/mpm-help.md +14 -95
  30. claude_mpm/commands/mpm-organize.md +500 -0
  31. claude_mpm/config/agent_sources.py +27 -0
  32. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  33. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  34. claude_mpm/core/framework_loader.py +4 -2
  35. claude_mpm/core/logger.py +13 -0
  36. claude_mpm/core/output_style_manager.py +173 -43
  37. claude_mpm/core/socketio_pool.py +3 -3
  38. claude_mpm/core/unified_agent_registry.py +134 -16
  39. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  40. claude_mpm/hooks/claude_hooks/event_handlers.py +211 -78
  41. claude_mpm/hooks/claude_hooks/hook_handler.py +6 -0
  42. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  43. claude_mpm/hooks/claude_hooks/memory_integration.py +26 -9
  44. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  45. claude_mpm/hooks/claude_hooks/services/connection_manager.py +4 -0
  46. claude_mpm/hooks/memory_integration_hook.py +46 -1
  47. claude_mpm/init.py +0 -19
  48. claude_mpm/models/agent_definition.py +7 -0
  49. claude_mpm/scripts/claude-hook-handler.sh +58 -18
  50. claude_mpm/scripts/launch_monitor.py +93 -13
  51. claude_mpm/scripts/start_activity_logging.py +0 -0
  52. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  53. claude_mpm/services/agents/agent_review_service.py +280 -0
  54. claude_mpm/services/agents/deployment/agent_discovery_service.py +2 -3
  55. claude_mpm/services/agents/deployment/agent_template_builder.py +4 -2
  56. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +188 -12
  57. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +531 -55
  58. claude_mpm/services/agents/git_source_manager.py +34 -0
  59. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  60. claude_mpm/services/agents/sources/git_source_sync_service.py +8 -1
  61. claude_mpm/services/agents/toolchain_detector.py +10 -6
  62. claude_mpm/services/analysis/__init__.py +11 -1
  63. claude_mpm/services/analysis/clone_detector.py +1030 -0
  64. claude_mpm/services/command_deployment_service.py +81 -10
  65. claude_mpm/services/event_bus/config.py +3 -1
  66. claude_mpm/services/git/git_operations_service.py +93 -8
  67. claude_mpm/services/monitor/daemon.py +9 -2
  68. claude_mpm/services/monitor/daemon_manager.py +39 -3
  69. claude_mpm/services/monitor/server.py +225 -19
  70. claude_mpm/services/self_upgrade_service.py +120 -12
  71. claude_mpm/services/skills/__init__.py +3 -0
  72. claude_mpm/services/skills/git_skill_source_manager.py +32 -2
  73. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  74. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  75. claude_mpm/services/skills_deployer.py +126 -9
  76. claude_mpm/services/socketio/event_normalizer.py +15 -1
  77. claude_mpm/services/socketio/server/core.py +160 -21
  78. claude_mpm/services/version_control/git_operations.py +103 -0
  79. claude_mpm/utils/agent_filters.py +17 -44
  80. {claude_mpm-5.1.8.dist-info → claude_mpm-5.4.22.dist-info}/METADATA +47 -84
  81. {claude_mpm-5.1.8.dist-info → claude_mpm-5.4.22.dist-info}/RECORD +86 -176
  82. claude_mpm-5.4.22.dist-info/entry_points.txt +5 -0
  83. claude_mpm-5.4.22.dist-info/licenses/LICENSE +94 -0
  84. claude_mpm-5.4.22.dist-info/licenses/LICENSE-FAQ.md +153 -0
  85. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  86. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  87. claude_mpm/agents/BASE_ENGINEER.md +0 -658
  88. claude_mpm/agents/BASE_OPS.md +0 -219
  89. claude_mpm/agents/BASE_PM.md +0 -480
  90. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  91. claude_mpm/agents/BASE_QA.md +0 -167
  92. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  93. claude_mpm/agents/base_agent.json +0 -31
  94. claude_mpm/agents/base_agent_loader.py +0 -601
  95. claude_mpm/cli/commands/agents_detect.py +0 -380
  96. claude_mpm/cli/commands/agents_recommend.py +0 -309
  97. claude_mpm/cli/ticket_cli.py +0 -35
  98. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  99. claude_mpm/commands/mpm-agents-detect.md +0 -177
  100. claude_mpm/commands/mpm-agents-list.md +0 -131
  101. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  102. claude_mpm/commands/mpm-config-view.md +0 -150
  103. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  104. claude_mpm/dashboard/analysis_runner.py +0 -455
  105. claude_mpm/dashboard/index.html +0 -13
  106. claude_mpm/dashboard/open_dashboard.py +0 -66
  107. claude_mpm/dashboard/static/css/activity.css +0 -1958
  108. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  109. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  110. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  111. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  112. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  113. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  114. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  115. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  116. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  117. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  118. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  119. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  120. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  121. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  122. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  123. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  124. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  125. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  126. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  127. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  128. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  129. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  130. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  131. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  132. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  133. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  134. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  135. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  136. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  137. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  138. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  139. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  140. claude_mpm/dashboard/templates/code_simple.html +0 -153
  141. claude_mpm/dashboard/templates/index.html +0 -606
  142. claude_mpm/dashboard/test_dashboard.html +0 -372
  143. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  144. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  145. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  146. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  151. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  152. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  153. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  154. claude_mpm/scripts/mcp_server.py +0 -75
  155. claude_mpm/scripts/mcp_wrapper.py +0 -39
  156. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  157. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  158. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  159. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  160. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  161. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  162. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  163. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  164. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  165. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  166. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  167. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  168. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  169. claude_mpm/services/mcp_gateway/main.py +0 -589
  170. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  171. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  172. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  173. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  174. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  175. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  176. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  177. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  178. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  179. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  180. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  181. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  182. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  183. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  184. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  185. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  186. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  187. claude_mpm-5.1.8.dist-info/entry_points.txt +0 -10
  188. claude_mpm-5.1.8.dist-info/licenses/LICENSE +0 -21
  189. /claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +0 -0
  190. {claude_mpm-5.1.8.dist-info → claude_mpm-5.4.22.dist-info}/WHEEL +0 -0
  191. {claude_mpm-5.1.8.dist-info → claude_mpm-5.4.22.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 };