claude-mpm 4.2.43__py3-none-any.whl → 4.2.51__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/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +117 -12
- claude_mpm/agents/INSTRUCTIONS.md +154 -10
- claude_mpm/agents/WORKFLOW.md +46 -1
- claude_mpm/agents/frontmatter_validator.py +20 -12
- claude_mpm/agents/templates/nextjs_engineer.json +277 -0
- claude_mpm/agents/templates/python_engineer.json +289 -0
- claude_mpm/agents/templates/react_engineer.json +11 -3
- claude_mpm/agents/templates/security.json +50 -9
- claude_mpm/cli/commands/agents.py +2 -2
- claude_mpm/cli/commands/uninstall.py +1 -2
- claude_mpm/cli/interactive/agent_wizard.py +3 -3
- claude_mpm/cli/parsers/agent_manager_parser.py +3 -3
- claude_mpm/cli/parsers/agents_parser.py +1 -1
- claude_mpm/constants.py +1 -1
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/error_handler.py +2 -4
- claude_mpm/core/file_utils.py +4 -12
- claude_mpm/core/framework_loader.py +22 -0
- claude_mpm/core/log_manager.py +8 -5
- claude_mpm/core/logger.py +1 -1
- claude_mpm/core/logging_utils.py +6 -6
- claude_mpm/core/unified_agent_registry.py +18 -4
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js +2 -1076
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -465
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +251 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/dashboard.css +28 -5
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +713 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
- claude_mpm/dashboard/static/js/components/code-viewer.js +387 -72
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +286 -108
- claude_mpm/dashboard/static/js/components/working-directory.js +3 -0
- claude_mpm/dashboard/static/js/dashboard.js +61 -49
- claude_mpm/dashboard/static/js/socket-client.js +12 -8
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors-index.html +218 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +715 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/templates/index.html +82 -38
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +1 -1
- claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +25 -8
- claude_mpm/services/agents/deployment/agent_validator.py +3 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +13 -4
- claude_mpm/services/agents/local_template_manager.py +2 -6
- claude_mpm/services/monitor/daemon.py +1 -2
- claude_mpm/services/monitor/daemon_manager.py +2 -5
- claude_mpm/services/monitor/event_emitter.py +2 -2
- claude_mpm/services/monitor/handlers/code_analysis.py +4 -6
- claude_mpm/services/monitor/handlers/hooks.py +2 -4
- claude_mpm/services/monitor/server.py +23 -226
- claude_mpm/tools/code_tree_analyzer.py +2 -2
- {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/METADATA +1 -1
- {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/RECORD +148 -87
- claude_mpm/commands/mpm-browser-monitor.md +0 -370
- claude_mpm/commands/mpm-monitor.md +0 -177
- claude_mpm/dashboard/static/js/browser-console-monitor.js +0 -495
- claude_mpm/dashboard/static/js/components/browser-log-viewer.js +0 -763
- claude_mpm/dashboard/static/test-browser-monitor.html +0 -470
- claude_mpm/dashboard/static/test-simple.html +0 -97
- claude_mpm/services/monitor/handlers/browser.py +0 -451
- /claude_mpm/dashboard/static/{test_debug.html → test-archive/test_debug.html} +0 -0
- {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/WHEEL +0 -0
- {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/top_level.txt +0 -0
@@ -13,20 +13,24 @@
|
|
13
13
|
* compatibility for existing code that depends on the dashboard interface.
|
14
14
|
*/
|
15
15
|
|
16
|
-
// ES6
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
import {
|
21
|
-
import {
|
22
|
-
import {
|
23
|
-
import {
|
24
|
-
import {
|
25
|
-
import {
|
26
|
-
import {
|
27
|
-
import {
|
28
|
-
import {
|
29
|
-
import {
|
16
|
+
// NOTE: Components are loaded as ES6 modules via index.html
|
17
|
+
// They expose their classes globally for backward compatibility
|
18
|
+
// Commenting out ES6 imports to avoid module resolution errors
|
19
|
+
|
20
|
+
// import { SocketManager } from './components/socket-manager.js';
|
21
|
+
// import { EventViewer } from './components/event-viewer.js';
|
22
|
+
// import { ModuleViewer } from './components/module-viewer.js';
|
23
|
+
// import { SessionManager } from './components/session-manager.js';
|
24
|
+
// import { AgentInference } from './components/agent-inference.js';
|
25
|
+
// import { AgentHierarchy } from './components/agent-hierarchy.js';
|
26
|
+
// import { UIStateManager } from './components/ui-state-manager.js';
|
27
|
+
// import { EventProcessor } from './components/event-processor.js';
|
28
|
+
// import { ExportManager } from './components/export-manager.js';
|
29
|
+
// import { WorkingDirectoryManager } from './components/working-directory.js';
|
30
|
+
// import { FileToolTracker } from './components/file-tool-tracker.js';
|
31
|
+
// import { BuildTracker } from './components/build-tracker.js';
|
32
|
+
// import { UnifiedDataViewer } from './components/unified-data-viewer.js';
|
33
|
+
|
30
34
|
class Dashboard {
|
31
35
|
constructor() {
|
32
36
|
// Core components (existing)
|
@@ -136,8 +140,6 @@ class Dashboard {
|
|
136
140
|
const missing = criticalComponents.filter(c => !c.component);
|
137
141
|
if (missing.length > 0) {
|
138
142
|
console.warn('Missing critical components:', missing.map(c => c.name));
|
139
|
-
} else {
|
140
|
-
console.log('All critical components initialized');
|
141
143
|
}
|
142
144
|
}
|
143
145
|
|
@@ -155,7 +157,6 @@ class Dashboard {
|
|
155
157
|
// Set global reference for agent hierarchy after dashboard is available
|
156
158
|
if (this.agentHierarchy) {
|
157
159
|
window.dashboard.agentHierarchy = this.agentHierarchy;
|
158
|
-
console.log('Agent hierarchy global reference set');
|
159
160
|
}
|
160
161
|
|
161
162
|
// Initialize any other components that need window.dashboard
|
@@ -242,7 +243,6 @@ class Dashboard {
|
|
242
243
|
try {
|
243
244
|
this.agentHierarchy = new AgentHierarchy(this.agentInference, this.eventViewer);
|
244
245
|
// Global reference will be set in postInit() after window.dashboard exists
|
245
|
-
console.log('Agent hierarchy component created');
|
246
246
|
} catch (error) {
|
247
247
|
console.error('Failed to initialize agent hierarchy:', error);
|
248
248
|
// Create a stub to prevent further errors
|
@@ -298,12 +298,37 @@ class Dashboard {
|
|
298
298
|
setupModuleInteractions() {
|
299
299
|
// Socket events to update file operations and tool calls
|
300
300
|
this.socketManager.onEventUpdate((events) => {
|
301
|
+
console.log('[Dashboard] Processing event update with', events.length, 'events');
|
302
|
+
|
303
|
+
// Debug: Log some sample events to see their structure
|
304
|
+
if (events.length > 0) {
|
305
|
+
console.log('[Dashboard] Sample event structure:', {
|
306
|
+
first_event: events[0],
|
307
|
+
has_tool_events: events.some(e => e.tool_name || (e.data && e.data.tool_name)),
|
308
|
+
hook_events: events.filter(e => e.type === 'hook').length,
|
309
|
+
tool_subtypes: events.filter(e => e.subtype === 'pre_tool' || e.subtype === 'post_tool').length
|
310
|
+
});
|
311
|
+
}
|
312
|
+
|
301
313
|
this.fileToolTracker.updateFileOperations(events);
|
302
314
|
this.fileToolTracker.updateToolCalls(events);
|
303
315
|
|
316
|
+
// Debug: Check what was tracked
|
317
|
+
const fileOps = this.fileToolTracker.getFileOperations();
|
318
|
+
const toolCalls = this.fileToolTracker.getToolCalls();
|
319
|
+
console.log('[Dashboard] After update - File operations:', fileOps.size, 'Tool calls:', toolCalls.size);
|
320
|
+
|
304
321
|
// Process agent inference for new events
|
305
322
|
this.agentInference.processAgentInference();
|
306
|
-
|
323
|
+
|
324
|
+
// Notify CodeViewer that file operations have been updated
|
325
|
+
// This ensures File Tree tab shows the same data as Files tab
|
326
|
+
if (window.CodeViewer && typeof window.CodeViewer.refreshFromFileToolTracker === 'function') {
|
327
|
+
setTimeout(() => {
|
328
|
+
window.CodeViewer.refreshFromFileToolTracker();
|
329
|
+
}, 50);
|
330
|
+
}
|
331
|
+
|
307
332
|
// Update agent hierarchy with new events
|
308
333
|
this.agentHierarchy.updateWithNewEvents(events);
|
309
334
|
|
@@ -345,7 +370,6 @@ class Dashboard {
|
|
345
370
|
|
346
371
|
// Session changes
|
347
372
|
document.addEventListener('sessionFilterChanged', (e) => {
|
348
|
-
console.log('Session filter changed, re-rendering current tab:', this.uiStateManager.getCurrentTab());
|
349
373
|
this.renderCurrentTab();
|
350
374
|
});
|
351
375
|
}
|
@@ -421,6 +445,12 @@ class Dashboard {
|
|
421
445
|
case 'events':
|
422
446
|
// Events tab is handled by EventViewer
|
423
447
|
break;
|
448
|
+
case 'claude-tree':
|
449
|
+
// File Tree tab - trigger CodeViewer rendering
|
450
|
+
if (window.CodeViewer && typeof window.CodeViewer.show === 'function') {
|
451
|
+
window.CodeViewer.show();
|
452
|
+
}
|
453
|
+
break;
|
424
454
|
case 'activity':
|
425
455
|
// Trigger Activity tab rendering through the component
|
426
456
|
// Check if ActivityTree class is available (from built module)
|
@@ -430,25 +460,21 @@ class Dashboard {
|
|
430
460
|
|
431
461
|
// Create or get instance
|
432
462
|
if (!window.activityTreeInstance) {
|
433
|
-
console.log('Creating new ActivityTree instance...');
|
434
463
|
window.activityTreeInstance = new window.ActivityTree();
|
435
464
|
}
|
436
465
|
|
437
466
|
// Initialize if needed and render
|
438
467
|
if (window.activityTreeInstance) {
|
439
468
|
if (!window.activityTreeInstance.initialized) {
|
440
|
-
console.log('Initializing ActivityTree...');
|
441
469
|
window.activityTreeInstance.initialize();
|
442
470
|
}
|
443
471
|
|
444
472
|
if (typeof window.activityTreeInstance.renderWhenVisible === 'function') {
|
445
|
-
console.log('Dashboard triggering activity tree render...');
|
446
473
|
window.activityTreeInstance.renderWhenVisible();
|
447
474
|
}
|
448
475
|
|
449
476
|
// Force show to ensure the tree is visible
|
450
477
|
if (typeof window.activityTreeInstance.forceShow === 'function') {
|
451
|
-
console.log('Dashboard forcing activity tree to show...');
|
452
478
|
window.activityTreeInstance.forceShow();
|
453
479
|
}
|
454
480
|
}
|
@@ -457,11 +483,9 @@ class Dashboard {
|
|
457
483
|
const activityTreeInstance = window.activityTree();
|
458
484
|
if (activityTreeInstance) {
|
459
485
|
if (typeof activityTreeInstance.renderWhenVisible === 'function') {
|
460
|
-
console.log('Dashboard triggering activity tree render (legacy)...');
|
461
486
|
activityTreeInstance.renderWhenVisible();
|
462
487
|
}
|
463
488
|
if (typeof activityTreeInstance.forceShow === 'function') {
|
464
|
-
console.log('Dashboard forcing activity tree to show (legacy)...');
|
465
489
|
activityTreeInstance.forceShow();
|
466
490
|
}
|
467
491
|
}
|
@@ -493,22 +517,6 @@ class Dashboard {
|
|
493
517
|
case 'files':
|
494
518
|
this.renderFiles();
|
495
519
|
break;
|
496
|
-
case 'browser-logs':
|
497
|
-
// Simple browser logs display - no events
|
498
|
-
const browserLogsContainer = document.getElementById('browser-logs-container');
|
499
|
-
if (browserLogsContainer) {
|
500
|
-
// Only set content if it's not already set
|
501
|
-
if (!browserLogsContainer.querySelector('.browser-logs-simple')) {
|
502
|
-
browserLogsContainer.innerHTML = `
|
503
|
-
<div class="browser-logs-simple" style="padding: 20px;">
|
504
|
-
<h2>Browser Logs</h2>
|
505
|
-
<p style="color: #666;">Browser console monitoring - no events shown here</p>
|
506
|
-
</div>
|
507
|
-
`;
|
508
|
-
}
|
509
|
-
}
|
510
|
-
console.log('[Dashboard] Browser Logs tab rendered (simple mode)');
|
511
|
-
break;
|
512
520
|
}
|
513
521
|
|
514
522
|
// Update selection UI if we have a selected card
|
@@ -771,10 +779,19 @@ class Dashboard {
|
|
771
779
|
|
772
780
|
const fileOperations = this.fileToolTracker.getFileOperations();
|
773
781
|
const filesArray = Array.from(fileOperations.entries());
|
782
|
+
|
783
|
+
console.log('[renderFiles] File operations map size:', fileOperations.size);
|
784
|
+
console.log('[renderFiles] Files array:', filesArray);
|
785
|
+
|
774
786
|
const uniqueFileInstances = this.eventProcessor.getUniqueFileInstances(filesArray);
|
775
787
|
const fileHTML = this.eventProcessor.generateFileHTML(uniqueFileInstances);
|
776
788
|
|
777
|
-
|
789
|
+
if (filesArray.length === 0) {
|
790
|
+
filesList.innerHTML = '<div class="empty-state">No file operations tracked yet. File operations will appear here when tools like Read, Write, Edit, or Grep are used.</div>';
|
791
|
+
} else {
|
792
|
+
filesList.innerHTML = fileHTML;
|
793
|
+
}
|
794
|
+
|
778
795
|
this.exportManager.scrollListToBottom('files-list');
|
779
796
|
|
780
797
|
// Update filter dropdowns
|
@@ -797,12 +814,7 @@ class Dashboard {
|
|
797
814
|
const sortedTypes = Array.from(agentTypes).filter(type => type && type.trim() !== '');
|
798
815
|
this.populateFilterDropdown('agents-type-filter', sortedTypes, 'All Agent Types');
|
799
816
|
|
800
|
-
//
|
801
|
-
if (sortedTypes.length > 0) {
|
802
|
-
console.log('Agent types found for filter:', sortedTypes);
|
803
|
-
} else {
|
804
|
-
console.log('No agent types found for filter. Instances:', uniqueInstances.length);
|
805
|
-
}
|
817
|
+
// Agent filter types populated
|
806
818
|
}
|
807
819
|
|
808
820
|
/**
|
@@ -1389,6 +1389,12 @@ class SocketClient {
|
|
1389
1389
|
actualType = 'connected';
|
1390
1390
|
this.isConnected = true;
|
1391
1391
|
this.isConnecting = false;
|
1392
|
+
|
1393
|
+
// Expose socket globally when connected
|
1394
|
+
if (!window.socket) {
|
1395
|
+
window.socket = this.socket;
|
1396
|
+
console.log('SocketClient: Exposed socket globally as window.socket');
|
1397
|
+
}
|
1392
1398
|
} else if (this.socket.connecting || this.isConnecting) {
|
1393
1399
|
actualStatus = 'Connecting...';
|
1394
1400
|
actualType = 'connecting';
|
@@ -1401,17 +1407,15 @@ class SocketClient {
|
|
1401
1407
|
}
|
1402
1408
|
}
|
1403
1409
|
|
1404
|
-
//
|
1410
|
+
// Always update status to ensure consistency
|
1411
|
+
this.updateConnectionStatusDOM(actualStatus, actualType);
|
1412
|
+
|
1413
|
+
// Also ensure state is consistent
|
1405
1414
|
const statusElement = document.getElementById('connection-status');
|
1406
1415
|
if (statusElement) {
|
1407
1416
|
const currentText = statusElement.textContent.replace('●', '').trim();
|
1408
|
-
|
1409
|
-
|
1410
|
-
|
1411
|
-
// Update if status text or class doesn't match
|
1412
|
-
if (currentText !== actualStatus || currentClass !== expectedClass) {
|
1413
|
-
console.log(`SocketClient: Fallback update - was '${currentText}' (${currentClass}), now '${actualStatus}' (${expectedClass})`);
|
1414
|
-
this.updateConnectionStatusDOM(actualStatus, actualType);
|
1417
|
+
if (currentText !== actualStatus) {
|
1418
|
+
console.log(`SocketClient: Status sync - updating from '${currentText}' to '${actualStatus}'`);
|
1415
1419
|
}
|
1416
1420
|
}
|
1417
1421
|
}
|