claude-mpm 3.4.13__py3-none-any.whl → 3.4.16__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.
- claude_mpm/dashboard/index.html +13 -0
- claude_mpm/dashboard/static/css/dashboard.css +2722 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +619 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +641 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +914 -0
- claude_mpm/dashboard/static/js/components/export-manager.js +362 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +611 -0
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +211 -0
- claude_mpm/dashboard/static/js/components/hud-manager.js +671 -0
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +1718 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +2701 -0
- claude_mpm/dashboard/static/js/components/session-manager.js +520 -0
- claude_mpm/dashboard/static/js/components/socket-manager.js +343 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +427 -0
- claude_mpm/dashboard/static/js/components/working-directory.js +866 -0
- claude_mpm/dashboard/static/js/dashboard-original.js +4134 -0
- claude_mpm/dashboard/static/js/dashboard.js +1978 -0
- claude_mpm/dashboard/static/js/socket-client.js +537 -0
- claude_mpm/dashboard/templates/index.html +346 -0
- claude_mpm/dashboard/test_dashboard.html +372 -0
- claude_mpm/services/socketio_server.py +111 -7
- {claude_mpm-3.4.13.dist-info → claude_mpm-3.4.16.dist-info}/METADATA +2 -1
- {claude_mpm-3.4.13.dist-info → claude_mpm-3.4.16.dist-info}/RECORD +27 -7
- {claude_mpm-3.4.13.dist-info → claude_mpm-3.4.16.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.13.dist-info → claude_mpm-3.4.16.dist-info}/entry_points.txt +0 -0
- {claude_mpm-3.4.13.dist-info → claude_mpm-3.4.16.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-3.4.13.dist-info → claude_mpm-3.4.16.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,671 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HUD Manager Module
|
|
3
|
+
*
|
|
4
|
+
* Manages HUD (Heads-Up Display) visualization mode, including toggling between
|
|
5
|
+
* normal and HUD views, processing events for visualization, and coordinating
|
|
6
|
+
* with the HUD visualizer component.
|
|
7
|
+
*
|
|
8
|
+
* WHY: Extracted from main dashboard to isolate HUD-specific functionality
|
|
9
|
+
* and provide better separation between standard event viewing and advanced
|
|
10
|
+
* HUD visualization modes. This improves maintainability of complex visualization logic.
|
|
11
|
+
*
|
|
12
|
+
* DESIGN DECISION: Acts as a coordinator between the dashboard state and the
|
|
13
|
+
* HUD visualizer component, managing mode switching and event processing
|
|
14
|
+
* while maintaining clean separation from core dashboard functionality.
|
|
15
|
+
*/
|
|
16
|
+
class HUDManager {
|
|
17
|
+
constructor(eventViewer, sessionManager) {
|
|
18
|
+
this.eventViewer = eventViewer;
|
|
19
|
+
this.sessionManager = sessionManager;
|
|
20
|
+
this.hudVisualizer = null;
|
|
21
|
+
this.hudMode = false;
|
|
22
|
+
this.isInitialized = false;
|
|
23
|
+
|
|
24
|
+
this.initializeHUDVisualizer();
|
|
25
|
+
this.setupEventHandlers();
|
|
26
|
+
|
|
27
|
+
// Initial button state update with a small delay to ensure all components are ready
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
this.updateHUDButtonState();
|
|
30
|
+
}, 100);
|
|
31
|
+
|
|
32
|
+
console.log('HUD manager initialized');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Initialize the HUD visualizer component
|
|
37
|
+
*/
|
|
38
|
+
initializeHUDVisualizer() {
|
|
39
|
+
try {
|
|
40
|
+
this.hudVisualizer = new HUDVisualizer();
|
|
41
|
+
window.hudVisualizer = this.hudVisualizer; // Backward compatibility
|
|
42
|
+
|
|
43
|
+
// Initialize HUD visualizer
|
|
44
|
+
this.hudVisualizer.initialize();
|
|
45
|
+
this.isInitialized = true;
|
|
46
|
+
|
|
47
|
+
console.log('HUD visualizer initialized successfully');
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error('Failed to initialize HUD visualizer:', error);
|
|
50
|
+
this.isInitialized = false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Set up event handlers for HUD functionality
|
|
56
|
+
*/
|
|
57
|
+
setupEventHandlers() {
|
|
58
|
+
console.log('[HUD-DEBUG] Setting up HUD event handlers');
|
|
59
|
+
|
|
60
|
+
// HUD toggle button
|
|
61
|
+
const hudToggleBtn = document.getElementById('hud-toggle-btn');
|
|
62
|
+
if (hudToggleBtn) {
|
|
63
|
+
console.log('[HUD-DEBUG] HUD toggle button found, adding click listener');
|
|
64
|
+
hudToggleBtn.addEventListener('click', () => {
|
|
65
|
+
console.log('[HUD-DEBUG] HUD toggle button clicked');
|
|
66
|
+
this.toggleHUD();
|
|
67
|
+
});
|
|
68
|
+
} else {
|
|
69
|
+
console.warn('[HUD-DEBUG] HUD toggle button not found during setup');
|
|
70
|
+
// Check if the DOM is ready
|
|
71
|
+
if (document.readyState === 'loading') {
|
|
72
|
+
console.log('[HUD-DEBUG] DOM still loading, will retry after DOMContentLoaded');
|
|
73
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
74
|
+
console.log('[HUD-DEBUG] DOM loaded, retrying HUD button setup');
|
|
75
|
+
this.setupEventHandlers();
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Listen for session changes to update HUD button state
|
|
82
|
+
console.log('[HUD-DEBUG] Adding sessionChanged event listener');
|
|
83
|
+
document.addEventListener('sessionChanged', (e) => {
|
|
84
|
+
console.log('[HUD-DEBUG] sessionChanged event received:', e.detail);
|
|
85
|
+
this.updateHUDButtonState();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Also listen for sessionFilterChanged for backward compatibility
|
|
89
|
+
console.log('[HUD-DEBUG] Adding sessionFilterChanged event listener');
|
|
90
|
+
document.addEventListener('sessionFilterChanged', (e) => {
|
|
91
|
+
console.log('[HUD-DEBUG] sessionFilterChanged event received:', e.detail);
|
|
92
|
+
this.updateHUDButtonState();
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Toggle HUD mode on/off
|
|
98
|
+
*/
|
|
99
|
+
toggleHUD() {
|
|
100
|
+
console.log('[HUD-DEBUG] toggleHUD called');
|
|
101
|
+
|
|
102
|
+
if (!this.isSessionSelected()) {
|
|
103
|
+
console.log('[HUD-DEBUG] Cannot toggle HUD: No session selected');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (!this.isInitialized) {
|
|
108
|
+
console.error('[HUD-DEBUG] Cannot toggle HUD: HUD visualizer not initialized');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const oldMode = this.hudMode;
|
|
113
|
+
this.hudMode = !this.hudMode;
|
|
114
|
+
console.log('[HUD-DEBUG] HUD mode changed from', oldMode, 'to', this.hudMode);
|
|
115
|
+
|
|
116
|
+
this.updateHUDDisplay();
|
|
117
|
+
|
|
118
|
+
console.log('[HUD-DEBUG] HUD mode toggled:', this.hudMode ? 'ON' : 'OFF');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Check if a session is currently selected
|
|
123
|
+
* @returns {boolean} - True if session is selected
|
|
124
|
+
*/
|
|
125
|
+
isSessionSelected() {
|
|
126
|
+
const hasManager = !!this.sessionManager;
|
|
127
|
+
const selectedId = this.sessionManager?.selectedSessionId;
|
|
128
|
+
const isValidSelection = selectedId && selectedId !== 'all' && selectedId !== '';
|
|
129
|
+
|
|
130
|
+
console.log('[HUD-DEBUG] isSessionSelected check:', {
|
|
131
|
+
hasManager: hasManager,
|
|
132
|
+
selectedId: selectedId,
|
|
133
|
+
isValidSelection: isValidSelection,
|
|
134
|
+
finalResult: hasManager && isValidSelection
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
return hasManager && isValidSelection;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Update HUD display based on current mode
|
|
142
|
+
*/
|
|
143
|
+
updateHUDDisplay() {
|
|
144
|
+
console.log('[HUD-DEBUG] updateHUDDisplay called, hudMode:', this.hudMode);
|
|
145
|
+
|
|
146
|
+
const eventsWrapper = document.querySelector('.events-wrapper');
|
|
147
|
+
const hudToggleBtn = document.getElementById('hud-toggle-btn');
|
|
148
|
+
|
|
149
|
+
console.log('[HUD-DEBUG] DOM elements found:', {
|
|
150
|
+
eventsWrapper: !!eventsWrapper,
|
|
151
|
+
hudToggleBtn: !!hudToggleBtn,
|
|
152
|
+
hudVisualizer: !!this.hudVisualizer
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
if (!eventsWrapper || !hudToggleBtn) {
|
|
156
|
+
console.error('[HUD-DEBUG] Missing DOM elements for HUD display update');
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (this.hudMode) {
|
|
161
|
+
console.log('[HUD-DEBUG] Switching to HUD mode...');
|
|
162
|
+
// Switch to HUD mode
|
|
163
|
+
eventsWrapper.classList.add('hud-mode');
|
|
164
|
+
hudToggleBtn.classList.add('btn-hud-active');
|
|
165
|
+
hudToggleBtn.textContent = 'Normal View';
|
|
166
|
+
|
|
167
|
+
// Activate HUD visualizer and process events
|
|
168
|
+
if (this.hudVisualizer) {
|
|
169
|
+
console.log('[HUD-DEBUG] Activating HUD visualizer...');
|
|
170
|
+
this.hudVisualizer.activate().then(() => {
|
|
171
|
+
console.log('[HUD-DEBUG] HUD visualizer activated successfully, processing existing events...');
|
|
172
|
+
|
|
173
|
+
// Additional resize attempts after DOM settles
|
|
174
|
+
setTimeout(() => {
|
|
175
|
+
console.log('[HUD-DEBUG] Post-activation resize check...');
|
|
176
|
+
if (this.hudVisualizer && this.hudVisualizer.ensureContainerResize) {
|
|
177
|
+
this.hudVisualizer.ensureContainerResize();
|
|
178
|
+
}
|
|
179
|
+
}, 100);
|
|
180
|
+
|
|
181
|
+
// Process existing events after libraries are loaded
|
|
182
|
+
this.processExistingEventsForHUD();
|
|
183
|
+
}).catch((error) => {
|
|
184
|
+
console.error('[HUD-DEBUG] Failed to activate HUD:', error);
|
|
185
|
+
console.error('[HUD-DEBUG] Error stack:', error.stack);
|
|
186
|
+
// Optionally revert HUD mode on failure
|
|
187
|
+
this.hudMode = false;
|
|
188
|
+
this.updateHUDDisplay();
|
|
189
|
+
});
|
|
190
|
+
} else {
|
|
191
|
+
console.error('[HUD-DEBUG] No HUD visualizer available');
|
|
192
|
+
}
|
|
193
|
+
} else {
|
|
194
|
+
console.log('[HUD-DEBUG] Switching to normal mode...');
|
|
195
|
+
// Switch to normal mode
|
|
196
|
+
eventsWrapper.classList.remove('hud-mode');
|
|
197
|
+
hudToggleBtn.classList.remove('btn-hud-active');
|
|
198
|
+
hudToggleBtn.textContent = 'HUD View';
|
|
199
|
+
|
|
200
|
+
// Deactivate HUD visualizer
|
|
201
|
+
if (this.hudVisualizer) {
|
|
202
|
+
console.log('[HUD-DEBUG] Deactivating HUD visualizer...');
|
|
203
|
+
this.hudVisualizer.deactivate();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Update HUD button state based on session selection
|
|
210
|
+
*/
|
|
211
|
+
updateHUDButtonState() {
|
|
212
|
+
console.log('[HUD-DEBUG] updateHUDButtonState called');
|
|
213
|
+
|
|
214
|
+
const hudToggleBtn = document.getElementById('hud-toggle-btn');
|
|
215
|
+
if (!hudToggleBtn) {
|
|
216
|
+
console.warn('[HUD-DEBUG] HUD toggle button not found in DOM');
|
|
217
|
+
// Let's check what buttons do exist
|
|
218
|
+
const allButtons = document.querySelectorAll('button');
|
|
219
|
+
console.log('[HUD-DEBUG] Available buttons:', Array.from(allButtons).map(btn => ({ id: btn.id, className: btn.className, text: btn.textContent })));
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
console.log('[HUD-DEBUG] HUD button found:', {
|
|
224
|
+
id: hudToggleBtn.id,
|
|
225
|
+
className: hudToggleBtn.className,
|
|
226
|
+
disabled: hudToggleBtn.disabled,
|
|
227
|
+
title: hudToggleBtn.title,
|
|
228
|
+
textContent: hudToggleBtn.textContent
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const sessionSelected = this.isSessionSelected();
|
|
232
|
+
const selectedSessionId = this.sessionManager?.selectedSessionId;
|
|
233
|
+
|
|
234
|
+
console.log('[HUD-DEBUG] HUD Button State Update:', {
|
|
235
|
+
sessionSelected,
|
|
236
|
+
selectedSessionId,
|
|
237
|
+
currentHudMode: this.hudMode,
|
|
238
|
+
sessionManagerExists: !!this.sessionManager
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
if (sessionSelected) {
|
|
242
|
+
hudToggleBtn.disabled = false;
|
|
243
|
+
hudToggleBtn.title = 'Toggle HUD visualization mode';
|
|
244
|
+
console.log('[HUD-DEBUG] HUD button enabled - session selected:', selectedSessionId);
|
|
245
|
+
} else {
|
|
246
|
+
hudToggleBtn.disabled = true;
|
|
247
|
+
hudToggleBtn.title = 'Select a session to enable HUD mode';
|
|
248
|
+
console.log('[HUD-DEBUG] HUD button disabled - no session selected');
|
|
249
|
+
|
|
250
|
+
// Disable HUD mode if currently active
|
|
251
|
+
if (this.hudMode) {
|
|
252
|
+
console.log('[HUD-DEBUG] Disabling HUD mode because no session selected');
|
|
253
|
+
this.hudMode = false;
|
|
254
|
+
this.updateHUDDisplay();
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
console.log('[HUD-DEBUG] Final HUD button state:', {
|
|
259
|
+
disabled: hudToggleBtn.disabled,
|
|
260
|
+
title: hudToggleBtn.title
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Process existing events for HUD visualization
|
|
266
|
+
* Called when HUD mode is activated
|
|
267
|
+
*/
|
|
268
|
+
processExistingEventsForHUD() {
|
|
269
|
+
console.log('[HUD-MANAGER-DEBUG] processExistingEventsForHUD called');
|
|
270
|
+
|
|
271
|
+
if (!this.hudVisualizer) {
|
|
272
|
+
console.error('[HUD-MANAGER-DEBUG] No HUD visualizer available');
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (!this.eventViewer) {
|
|
277
|
+
console.error('[HUD-MANAGER-DEBUG] No event viewer available');
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
console.log('[HUD-MANAGER-DEBUG] 🔄 Processing existing events for HUD visualization...');
|
|
282
|
+
|
|
283
|
+
// Clear existing visualization
|
|
284
|
+
this.hudVisualizer.clear();
|
|
285
|
+
|
|
286
|
+
// Get all events (not just filtered ones) to build complete tree structure
|
|
287
|
+
const allEvents = this.eventViewer.getAllEvents();
|
|
288
|
+
console.log(`[HUD-MANAGER-DEBUG] Retrieved ${allEvents ? allEvents.length : 0} events from event viewer`);
|
|
289
|
+
|
|
290
|
+
if (!allEvents) {
|
|
291
|
+
console.error('[HUD-MANAGER-DEBUG] Event viewer returned null/undefined events');
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (!Array.isArray(allEvents)) {
|
|
296
|
+
console.error('[HUD-MANAGER-DEBUG] Event viewer returned non-array:', typeof allEvents);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
if (allEvents.length === 0) {
|
|
301
|
+
console.log('⚠️ No events available for HUD processing');
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
console.log(`[HUD-MANAGER-DEBUG] 📊 Found ${allEvents.length} total events for HUD processing`);
|
|
306
|
+
|
|
307
|
+
// Check if we should filter by selected session
|
|
308
|
+
const selectedSessionId = this.sessionManager?.selectedSessionId;
|
|
309
|
+
console.log(`[HUD-MANAGER-DEBUG] Selected session ID: ${selectedSessionId}`);
|
|
310
|
+
|
|
311
|
+
let eventsToProcess = allEvents;
|
|
312
|
+
|
|
313
|
+
if (selectedSessionId && selectedSessionId !== '' && selectedSessionId !== 'all') {
|
|
314
|
+
console.log(`[HUD-MANAGER-DEBUG] Filtering events for session: ${selectedSessionId}`);
|
|
315
|
+
eventsToProcess = allEvents.filter(event => {
|
|
316
|
+
const eventSessionId = event.session_id || (event.data && event.data.session_id);
|
|
317
|
+
const matches = eventSessionId === selectedSessionId;
|
|
318
|
+
if (!matches) {
|
|
319
|
+
console.log(`[HUD-MANAGER-DEBUG] Event ${event.timestamp} session ${eventSessionId} does not match ${selectedSessionId}`);
|
|
320
|
+
}
|
|
321
|
+
return matches;
|
|
322
|
+
});
|
|
323
|
+
console.log(`[HUD-MANAGER-DEBUG] Filtered to ${eventsToProcess.length} events for session ${selectedSessionId}`);
|
|
324
|
+
} else {
|
|
325
|
+
console.log('[HUD-MANAGER-DEBUG] No session filtering - processing all events');
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Sort events by timestamp to ensure chronological processing
|
|
329
|
+
const sortedEvents = eventsToProcess.slice().sort((a, b) => {
|
|
330
|
+
const timeA = new Date(a.timestamp).getTime();
|
|
331
|
+
const timeB = new Date(b.timestamp).getTime();
|
|
332
|
+
return timeA - timeB;
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
console.log(`[HUD-MANAGER-DEBUG] Sorted ${sortedEvents.length} events chronologically`);
|
|
336
|
+
|
|
337
|
+
// Process events in chronological order
|
|
338
|
+
console.log(`[HUD-MANAGER-DEBUG] Calling hudVisualizer.processExistingEvents with ${sortedEvents.length} events`);
|
|
339
|
+
this.hudVisualizer.processExistingEvents(sortedEvents);
|
|
340
|
+
|
|
341
|
+
console.log(`[HUD-MANAGER-DEBUG] ✅ Processed ${sortedEvents.length} events for HUD visualization`);
|
|
342
|
+
|
|
343
|
+
// After processing, check if nodes were created
|
|
344
|
+
setTimeout(() => {
|
|
345
|
+
const nodeCount = this.hudVisualizer?.nodes?.size || 0;
|
|
346
|
+
console.log(`[HUD-MANAGER-DEBUG] HUD visualizer now has ${nodeCount} nodes`);
|
|
347
|
+
|
|
348
|
+
if (nodeCount === 0) {
|
|
349
|
+
console.warn(`[HUD-MANAGER-DEBUG] No nodes created! Check event processing logic`);
|
|
350
|
+
console.log(`[HUD-MANAGER-DEBUG] Sample processed events:`, sortedEvents.slice(0, 3));
|
|
351
|
+
} else {
|
|
352
|
+
console.log(`[HUD-MANAGER-DEBUG] Successfully created ${nodeCount} nodes`);
|
|
353
|
+
// List the nodes
|
|
354
|
+
if (this.hudVisualizer.nodes) {
|
|
355
|
+
this.hudVisualizer.nodes.forEach((nodeData, nodeId) => {
|
|
356
|
+
console.log(`[HUD-MANAGER-DEBUG] Node: ${nodeId} - ${nodeData.label} (${nodeData.type})`);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}, 100);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Handle a new event for HUD processing
|
|
365
|
+
* Called when new events arrive via socket
|
|
366
|
+
* @param {Object} event - Event to process
|
|
367
|
+
*/
|
|
368
|
+
handleHUDEvent(event) {
|
|
369
|
+
if (this.hudMode && this.hudVisualizer && this.isInitialized) {
|
|
370
|
+
this.hudVisualizer.processEvent(event);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Handle multiple new events for HUD processing
|
|
376
|
+
* @param {Array} events - Events to process
|
|
377
|
+
*/
|
|
378
|
+
handleHUDEvents(events) {
|
|
379
|
+
if (this.hudMode && this.hudVisualizer && this.isInitialized && events.length > 0) {
|
|
380
|
+
// Get the most recent event for HUD processing
|
|
381
|
+
const latestEvent = events[events.length - 1];
|
|
382
|
+
this.handleHUDEvent(latestEvent);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Clear HUD visualization
|
|
388
|
+
*/
|
|
389
|
+
clearHUD() {
|
|
390
|
+
if (this.hudVisualizer) {
|
|
391
|
+
this.hudVisualizer.clear();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Get current HUD mode state
|
|
397
|
+
* @returns {boolean} - True if HUD mode is active
|
|
398
|
+
*/
|
|
399
|
+
isHUDMode() {
|
|
400
|
+
return this.hudMode;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Get HUD visualizer instance
|
|
405
|
+
* @returns {HUDVisualizer|null} - HUD visualizer instance
|
|
406
|
+
*/
|
|
407
|
+
getHUDVisualizer() {
|
|
408
|
+
return this.hudVisualizer;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Check if HUD is initialized properly
|
|
413
|
+
* @returns {boolean} - True if initialized
|
|
414
|
+
*/
|
|
415
|
+
isHUDInitialized() {
|
|
416
|
+
return this.isInitialized;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Reinitialize HUD visualizer
|
|
421
|
+
* Useful for recovery from errors
|
|
422
|
+
*/
|
|
423
|
+
reinitialize() {
|
|
424
|
+
console.log('Reinitializing HUD manager...');
|
|
425
|
+
this.isInitialized = false;
|
|
426
|
+
this.hudMode = false;
|
|
427
|
+
|
|
428
|
+
this.initializeHUDVisualizer();
|
|
429
|
+
this.updateHUDDisplay();
|
|
430
|
+
this.updateHUDButtonState();
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Debug method to manually test HUD activation
|
|
435
|
+
* Can be called from browser console: window.dashboard.hudManager.debugActivateHUD()
|
|
436
|
+
*/
|
|
437
|
+
debugActivateHUD() {
|
|
438
|
+
console.log('[HUD-DEBUG] debugActivateHUD() called manually');
|
|
439
|
+
console.log('[HUD-DEBUG] Current state:', {
|
|
440
|
+
hudMode: this.hudMode,
|
|
441
|
+
isInitialized: this.isInitialized,
|
|
442
|
+
hasHudVisualizer: !!this.hudVisualizer,
|
|
443
|
+
hasEventViewer: !!this.eventViewer,
|
|
444
|
+
hasSessionManager: !!this.sessionManager,
|
|
445
|
+
selectedSessionId: this.sessionManager?.selectedSessionId,
|
|
446
|
+
isSessionSelected: this.isSessionSelected()
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
if (!this.isSessionSelected()) {
|
|
450
|
+
console.error('[HUD-DEBUG] Cannot debug HUD: No session selected');
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Force HUD mode and call updateHUDDisplay
|
|
455
|
+
this.hudMode = true;
|
|
456
|
+
this.updateHUDDisplay();
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Comprehensive HUD debugging that coordinates with HUD visualizer
|
|
461
|
+
* Can be called from browser console: window.dashboard.hudManager.debugHUDComprehensive()
|
|
462
|
+
*/
|
|
463
|
+
debugHUDComprehensive() {
|
|
464
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] ===============================');
|
|
465
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] COMPREHENSIVE HUD DEBUG START');
|
|
466
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] ===============================');
|
|
467
|
+
|
|
468
|
+
// 1. Check HUD Manager state
|
|
469
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] 1. HUD Manager State:');
|
|
470
|
+
const managerState = {
|
|
471
|
+
hudMode: this.hudMode,
|
|
472
|
+
isInitialized: this.isInitialized,
|
|
473
|
+
hasHudVisualizer: !!this.hudVisualizer,
|
|
474
|
+
hasEventViewer: !!this.eventViewer,
|
|
475
|
+
hasSessionManager: !!this.sessionManager,
|
|
476
|
+
selectedSessionId: this.sessionManager?.selectedSessionId,
|
|
477
|
+
isSessionSelected: this.isSessionSelected()
|
|
478
|
+
};
|
|
479
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG]', managerState);
|
|
480
|
+
|
|
481
|
+
// 2. Check DOM elements
|
|
482
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] 2. DOM Elements:');
|
|
483
|
+
const domElements = {
|
|
484
|
+
hudToggleBtn: !!document.getElementById('hud-toggle-btn'),
|
|
485
|
+
hudVisualizer: !!document.getElementById('hud-visualizer'),
|
|
486
|
+
hudCytoscape: !!document.getElementById('hud-cytoscape'),
|
|
487
|
+
eventsWrapper: !!document.querySelector('.events-wrapper'),
|
|
488
|
+
normalView: !!document.getElementById('normal-view')
|
|
489
|
+
};
|
|
490
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG]', domElements);
|
|
491
|
+
|
|
492
|
+
// 3. Force activate HUD if not active
|
|
493
|
+
if (!this.hudMode) {
|
|
494
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] 3. HUD not active, forcing activation...');
|
|
495
|
+
if (!this.isSessionSelected()) {
|
|
496
|
+
console.warn('[HUD-MANAGER-COMPREHENSIVE-DEBUG] No session selected, will use debug mode');
|
|
497
|
+
// Force set a session for debugging
|
|
498
|
+
if (this.sessionManager && this.sessionManager.sessionIds && this.sessionManager.sessionIds.length > 0) {
|
|
499
|
+
const firstSession = this.sessionManager.sessionIds[0];
|
|
500
|
+
console.log(`[HUD-MANAGER-COMPREHENSIVE-DEBUG] Setting first available session: ${firstSession}`);
|
|
501
|
+
this.sessionManager.selectedSessionId = firstSession;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
this.hudMode = true;
|
|
506
|
+
this.updateHUDDisplay();
|
|
507
|
+
} else {
|
|
508
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] 3. HUD already active');
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// 4. Wait for HUD activation, then run visualizer debug
|
|
512
|
+
setTimeout(() => {
|
|
513
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] 4. Running HUD Visualizer Debug...');
|
|
514
|
+
if (this.hudVisualizer && this.hudVisualizer.debugBlankScreen) {
|
|
515
|
+
this.hudVisualizer.debugBlankScreen();
|
|
516
|
+
} else {
|
|
517
|
+
console.error('[HUD-MANAGER-COMPREHENSIVE-DEBUG] HUD Visualizer debug method not available');
|
|
518
|
+
}
|
|
519
|
+
}, 1000);
|
|
520
|
+
|
|
521
|
+
// 5. Add test events if event viewer has no events
|
|
522
|
+
setTimeout(() => {
|
|
523
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] 5. Checking event data...');
|
|
524
|
+
const allEvents = this.eventViewer?.getAllEvents();
|
|
525
|
+
console.log(`[HUD-MANAGER-COMPREHENSIVE-DEBUG] Found ${allEvents ? allEvents.length : 0} events`);
|
|
526
|
+
|
|
527
|
+
if (!allEvents || allEvents.length === 0) {
|
|
528
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] No events found, adding test events...');
|
|
529
|
+
this.debugAddTestEvents();
|
|
530
|
+
} else {
|
|
531
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] Events exist, processing for HUD...');
|
|
532
|
+
this.processExistingEventsForHUD();
|
|
533
|
+
}
|
|
534
|
+
}, 1500);
|
|
535
|
+
|
|
536
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] Comprehensive debug initiated. Check logs above.');
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* Add test events for debugging when no real events exist
|
|
541
|
+
*/
|
|
542
|
+
debugAddTestEvents() {
|
|
543
|
+
if (!this.hudVisualizer) {
|
|
544
|
+
console.error('[HUD-MANAGER-COMPREHENSIVE-DEBUG] No HUD visualizer for test events');
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
console.log('[HUD-MANAGER-COMPREHENSIVE-DEBUG] Adding test events...');
|
|
549
|
+
|
|
550
|
+
const testEvents = [
|
|
551
|
+
{
|
|
552
|
+
timestamp: new Date().toISOString(),
|
|
553
|
+
hook_event_name: 'session',
|
|
554
|
+
subtype: 'started',
|
|
555
|
+
session_id: 'debug-session-001',
|
|
556
|
+
data: { session_id: 'debug-session-001' }
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
timestamp: new Date(Date.now() + 1000).toISOString(),
|
|
560
|
+
hook_event_name: 'hook',
|
|
561
|
+
subtype: 'user_prompt',
|
|
562
|
+
session_id: 'debug-session-001',
|
|
563
|
+
data: {
|
|
564
|
+
session_id: 'debug-session-001',
|
|
565
|
+
prompt_preview: 'Debug the HUD rendering issue'
|
|
566
|
+
}
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
timestamp: new Date(Date.now() + 2000).toISOString(),
|
|
570
|
+
hook_event_name: 'hook',
|
|
571
|
+
subtype: 'pre_tool',
|
|
572
|
+
session_id: 'debug-session-001',
|
|
573
|
+
data: {
|
|
574
|
+
session_id: 'debug-session-001',
|
|
575
|
+
tool_name: 'Read'
|
|
576
|
+
}
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
timestamp: new Date(Date.now() + 3000).toISOString(),
|
|
580
|
+
hook_event_name: 'agent',
|
|
581
|
+
subtype: 'activated',
|
|
582
|
+
session_id: 'debug-session-001',
|
|
583
|
+
data: {
|
|
584
|
+
session_id: 'debug-session-001',
|
|
585
|
+
agent_type: 'engineer',
|
|
586
|
+
agent_name: 'Debug Engineer'
|
|
587
|
+
}
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
timestamp: new Date(Date.now() + 4000).toISOString(),
|
|
591
|
+
hook_event_name: 'todo',
|
|
592
|
+
subtype: 'updated',
|
|
593
|
+
session_id: 'debug-session-001',
|
|
594
|
+
data: {
|
|
595
|
+
session_id: 'debug-session-001'
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
];
|
|
599
|
+
|
|
600
|
+
console.log(`[HUD-MANAGER-COMPREHENSIVE-DEBUG] Processing ${testEvents.length} test events...`);
|
|
601
|
+
this.hudVisualizer.processExistingEvents(testEvents);
|
|
602
|
+
|
|
603
|
+
// Also add to event viewer if it exists
|
|
604
|
+
if (this.eventViewer && this.eventViewer.addEvent) {
|
|
605
|
+
testEvents.forEach(event => {
|
|
606
|
+
this.eventViewer.addEvent(event);
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* Force HUD container visibility and test canvas rendering
|
|
613
|
+
*/
|
|
614
|
+
debugForceHUDVisibility() {
|
|
615
|
+
console.log('[HUD-MANAGER-VISIBILITY-DEBUG] Forcing HUD visibility...');
|
|
616
|
+
|
|
617
|
+
// Force HUD mode DOM changes
|
|
618
|
+
const eventsWrapper = document.querySelector('.events-wrapper');
|
|
619
|
+
const hudVisualizer = document.getElementById('hud-visualizer');
|
|
620
|
+
const hudCytoscape = document.getElementById('hud-cytoscape');
|
|
621
|
+
const normalView = document.getElementById('normal-view');
|
|
622
|
+
|
|
623
|
+
if (eventsWrapper) {
|
|
624
|
+
eventsWrapper.classList.add('hud-mode');
|
|
625
|
+
console.log('[HUD-MANAGER-VISIBILITY-DEBUG] Added hud-mode class to events-wrapper');
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
if (hudVisualizer) {
|
|
629
|
+
hudVisualizer.style.display = 'block';
|
|
630
|
+
hudVisualizer.style.visibility = 'visible';
|
|
631
|
+
hudVisualizer.style.opacity = '1';
|
|
632
|
+
console.log('[HUD-MANAGER-VISIBILITY-DEBUG] Forced HUD visualizer visibility');
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
if (hudCytoscape) {
|
|
636
|
+
hudCytoscape.style.width = '100%';
|
|
637
|
+
hudCytoscape.style.height = '500px';
|
|
638
|
+
hudCytoscape.style.backgroundColor = '#f0f0f0';
|
|
639
|
+
hudCytoscape.style.border = '2px solid #007bff';
|
|
640
|
+
console.log('[HUD-MANAGER-VISIBILITY-DEBUG] Forced HUD cytoscape container dimensions and visibility');
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
if (normalView) {
|
|
644
|
+
normalView.style.display = 'none';
|
|
645
|
+
console.log('[HUD-MANAGER-VISIBILITY-DEBUG] Hidden normal view');
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
// Wait then test canvas
|
|
649
|
+
setTimeout(() => {
|
|
650
|
+
if (this.hudVisualizer && this.hudVisualizer.debugDrawSimpleShape) {
|
|
651
|
+
console.log('[HUD-MANAGER-VISIBILITY-DEBUG] Testing canvas rendering...');
|
|
652
|
+
this.hudVisualizer.debugDrawSimpleShape();
|
|
653
|
+
}
|
|
654
|
+
}, 500);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
/**
|
|
658
|
+
* Cleanup HUD resources
|
|
659
|
+
*/
|
|
660
|
+
cleanup() {
|
|
661
|
+
if (this.hudVisualizer) {
|
|
662
|
+
this.hudVisualizer.deactivate();
|
|
663
|
+
this.hudVisualizer.clear();
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
this.hudMode = false;
|
|
667
|
+
this.isInitialized = false;
|
|
668
|
+
|
|
669
|
+
console.log('HUD manager cleaned up');
|
|
670
|
+
}
|
|
671
|
+
}
|