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.
Files changed (155) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +117 -12
  3. claude_mpm/agents/INSTRUCTIONS.md +154 -10
  4. claude_mpm/agents/WORKFLOW.md +46 -1
  5. claude_mpm/agents/frontmatter_validator.py +20 -12
  6. claude_mpm/agents/templates/nextjs_engineer.json +277 -0
  7. claude_mpm/agents/templates/python_engineer.json +289 -0
  8. claude_mpm/agents/templates/react_engineer.json +11 -3
  9. claude_mpm/agents/templates/security.json +50 -9
  10. claude_mpm/cli/commands/agents.py +2 -2
  11. claude_mpm/cli/commands/uninstall.py +1 -2
  12. claude_mpm/cli/interactive/agent_wizard.py +3 -3
  13. claude_mpm/cli/parsers/agent_manager_parser.py +3 -3
  14. claude_mpm/cli/parsers/agents_parser.py +1 -1
  15. claude_mpm/constants.py +1 -1
  16. claude_mpm/core/api_validator.py +330 -0
  17. claude_mpm/core/error_handler.py +2 -4
  18. claude_mpm/core/file_utils.py +4 -12
  19. claude_mpm/core/framework_loader.py +22 -0
  20. claude_mpm/core/log_manager.py +8 -5
  21. claude_mpm/core/logger.py +1 -1
  22. claude_mpm/core/logging_utils.py +6 -6
  23. claude_mpm/core/unified_agent_registry.py +18 -4
  24. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  25. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  26. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  27. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  28. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  29. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  30. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  31. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  32. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  33. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  34. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  35. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  36. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  37. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  38. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  39. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  40. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  41. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  42. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  43. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  44. claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
  45. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  46. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  47. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  48. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  49. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  50. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  51. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  52. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  53. claude_mpm/dashboard/static/built/components/code-viewer.js +2 -1076
  54. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  55. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  56. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  57. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  58. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  59. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  60. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  61. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  62. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  63. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  64. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  65. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  66. claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -465
  67. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  68. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  69. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  70. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  71. claude_mpm/dashboard/static/built/react/events.js +30 -0
  72. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  73. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  74. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  75. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  76. claude_mpm/dashboard/static/built/shared/page-structure.js +251 -0
  77. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  78. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  79. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  80. claude_mpm/dashboard/static/css/dashboard.css +28 -5
  81. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  82. claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
  83. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  84. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  85. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  86. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  87. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  88. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  89. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  90. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  91. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  92. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  93. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  94. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  95. claude_mpm/dashboard/static/events.html +607 -0
  96. claude_mpm/dashboard/static/index.html +713 -0
  97. claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
  98. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  99. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  100. claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
  101. claude_mpm/dashboard/static/js/components/code-viewer.js +387 -72
  102. claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
  103. claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
  104. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  105. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  106. claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
  107. claude_mpm/dashboard/static/js/components/ui-state-manager.js +286 -108
  108. claude_mpm/dashboard/static/js/components/working-directory.js +3 -0
  109. claude_mpm/dashboard/static/js/dashboard.js +61 -49
  110. claude_mpm/dashboard/static/js/socket-client.js +12 -8
  111. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  112. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  113. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  114. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  115. claude_mpm/dashboard/static/legacy/files.html +747 -0
  116. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  117. claude_mpm/dashboard/static/monitors-index.html +218 -0
  118. claude_mpm/dashboard/static/monitors.html +431 -0
  119. claude_mpm/dashboard/static/production/events.html +659 -0
  120. claude_mpm/dashboard/static/production/main.html +715 -0
  121. claude_mpm/dashboard/static/production/monitors.html +483 -0
  122. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  123. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  124. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  125. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  126. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  127. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  128. claude_mpm/dashboard/templates/index.html +82 -38
  129. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +1 -1
  130. claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -0
  131. claude_mpm/services/agents/deployment/agent_template_builder.py +25 -8
  132. claude_mpm/services/agents/deployment/agent_validator.py +3 -0
  133. claude_mpm/services/agents/deployment/validation/template_validator.py +13 -4
  134. claude_mpm/services/agents/local_template_manager.py +2 -6
  135. claude_mpm/services/monitor/daemon.py +1 -2
  136. claude_mpm/services/monitor/daemon_manager.py +2 -5
  137. claude_mpm/services/monitor/event_emitter.py +2 -2
  138. claude_mpm/services/monitor/handlers/code_analysis.py +4 -6
  139. claude_mpm/services/monitor/handlers/hooks.py +2 -4
  140. claude_mpm/services/monitor/server.py +23 -226
  141. claude_mpm/tools/code_tree_analyzer.py +2 -2
  142. {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/METADATA +1 -1
  143. {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/RECORD +148 -87
  144. claude_mpm/commands/mpm-browser-monitor.md +0 -370
  145. claude_mpm/commands/mpm-monitor.md +0 -177
  146. claude_mpm/dashboard/static/js/browser-console-monitor.js +0 -495
  147. claude_mpm/dashboard/static/js/components/browser-log-viewer.js +0 -763
  148. claude_mpm/dashboard/static/test-browser-monitor.html +0 -470
  149. claude_mpm/dashboard/static/test-simple.html +0 -97
  150. claude_mpm/services/monitor/handlers/browser.py +0 -451
  151. /claude_mpm/dashboard/static/{test_debug.html → test-archive/test_debug.html} +0 -0
  152. {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/WHEEL +0 -0
  153. {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/entry_points.txt +0 -0
  154. {claude_mpm-4.2.43.dist-info → claude_mpm-4.2.51.dist-info}/licenses/LICENSE +0 -0
  155. {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 Module imports
17
- import { SocketManager } from '@components/socket-manager.js';
18
- import { EventViewer } from '@components/event-viewer.js';
19
- import { ModuleViewer } from '@components/module-viewer.js';
20
- import { SessionManager } from '@components/session-manager.js';
21
- import { AgentInference } from '@components/agent-inference.js';
22
- import { AgentHierarchy } from '@components/agent-hierarchy.js';
23
- import { UIStateManager } from '@components/ui-state-manager.js';
24
- import { EventProcessor } from '@components/event-processor.js';
25
- import { ExportManager } from '@components/export-manager.js';
26
- import { WorkingDirectoryManager } from '@components/working-directory.js';
27
- import { FileToolTracker } from '@components/file-tool-tracker.js';
28
- import { BuildTracker } from '@components/build-tracker.js';
29
- import { UnifiedDataViewer } from '@components/unified-data-viewer.js';
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
- filesList.innerHTML = fileHTML;
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
- // Debug log
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
- // Check if UI needs updating
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
- const currentClass = statusElement.className;
1409
- const expectedClass = `status-badge status-${actualType}`;
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
  }