claude-mpm 4.2.44__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 +43 -1
- claude_mpm/agents/INSTRUCTIONS.md +75 -1
- 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/error_handler.py +2 -4
- claude_mpm/core/file_utils.py +4 -12
- 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 +306 -66
- 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 +285 -85
- claude_mpm/dashboard/static/js/components/working-directory.js +3 -0
- claude_mpm/dashboard/static/js/dashboard.js +61 -33
- 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 +79 -9
- 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 +27 -4
- claude_mpm/tools/code_tree_analyzer.py +2 -2
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/METADATA +1 -1
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/RECORD +146 -81
- claude_mpm/dashboard/static/test-browser-monitor.html +0 -470
- claude_mpm/dashboard/static/test-simple.html +0 -97
- /claude_mpm/dashboard/static/{test_debug.html → test-archive/test_debug.html} +0 -0
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/WHEEL +0 -0
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/top_level.txt +0 -0
claude_mpm/constants.py
CHANGED
@@ -229,7 +229,7 @@ class Paths(str, Enum):
|
|
229
229
|
|
230
230
|
CLAUDE_AGENTS_DIR = ".claude/agents"
|
231
231
|
CLAUDE_CONFIG_DIR = ".claude"
|
232
|
-
MPM_LOG_DIR = "logs/mpm"
|
232
|
+
MPM_LOG_DIR = ".claude-mpm/logs/mpm"
|
233
233
|
MPM_SESSION_DIR = ".claude-mpm/session"
|
234
234
|
MPM_PROMPTS_DIR = ".claude-mpm/prompts"
|
235
235
|
|
claude_mpm/core/error_handler.py
CHANGED
@@ -145,6 +145,7 @@ class ErrorHandler:
|
|
145
145
|
if strategy == ErrorStrategy.TERMINATE:
|
146
146
|
self.logger.critical(f"Terminating due to critical error: {error}")
|
147
147
|
sys.exit(1)
|
148
|
+
return None
|
148
149
|
|
149
150
|
def _log_error(
|
150
151
|
self,
|
@@ -307,10 +308,7 @@ def handle_error(
|
|
307
308
|
Returns:
|
308
309
|
Result based on strategy
|
309
310
|
"""
|
310
|
-
if logger
|
311
|
-
handler = ErrorHandler(logger=logger)
|
312
|
-
else:
|
313
|
-
handler = _global_handler
|
311
|
+
handler = ErrorHandler(logger=logger) if logger else _global_handler
|
314
312
|
|
315
313
|
return handler.handle(
|
316
314
|
error=error,
|
claude_mpm/core/file_utils.py
CHANGED
@@ -11,7 +11,7 @@ import json
|
|
11
11
|
import os
|
12
12
|
import shutil
|
13
13
|
import tempfile
|
14
|
-
from contextlib import contextmanager
|
14
|
+
from contextlib import contextmanager, suppress
|
15
15
|
from pathlib import Path
|
16
16
|
from typing import Any, List, Optional, Union
|
17
17
|
|
@@ -374,10 +374,8 @@ def atomic_write(
|
|
374
374
|
except OSError as e:
|
375
375
|
logger.error(f"Error in atomic write to {filepath}: {e}")
|
376
376
|
# Clean up temporary file
|
377
|
-
|
377
|
+
with suppress(Exception):
|
378
378
|
os.unlink(temp_path)
|
379
|
-
except:
|
380
|
-
pass
|
381
379
|
return False
|
382
380
|
|
383
381
|
|
@@ -703,10 +701,7 @@ def validate_file(
|
|
703
701
|
return False
|
704
702
|
|
705
703
|
# Check extension
|
706
|
-
|
707
|
-
return False
|
708
|
-
|
709
|
-
return True
|
704
|
+
return not (extensions and filepath.suffix not in extensions)
|
710
705
|
|
711
706
|
|
712
707
|
def get_file_hash(
|
@@ -760,10 +755,7 @@ def find_files(
|
|
760
755
|
if not directory.exists():
|
761
756
|
return []
|
762
757
|
|
763
|
-
if recursive
|
764
|
-
paths = directory.rglob(pattern)
|
765
|
-
else:
|
766
|
-
paths = directory.glob(pattern)
|
758
|
+
paths = directory.rglob(pattern) if recursive else directory.glob(pattern)
|
767
759
|
|
768
760
|
if file_only:
|
769
761
|
return [p for p in paths if p.is_file()]
|
claude_mpm/core/log_manager.py
CHANGED
@@ -101,7 +101,9 @@ class LogManager:
|
|
101
101
|
}
|
102
102
|
|
103
103
|
# Base directories
|
104
|
-
self.base_log_dir = Path(
|
104
|
+
self.base_log_dir = Path(
|
105
|
+
logging_config.get("base_directory", ".claude-mpm/logs")
|
106
|
+
)
|
105
107
|
if not self.base_log_dir.is_absolute():
|
106
108
|
self.base_log_dir = Path.cwd() / self.base_log_dir
|
107
109
|
|
@@ -350,13 +352,14 @@ class LogManager:
|
|
350
352
|
"""
|
351
353
|
One-time migration to move existing MPM logs to new subdirectory.
|
352
354
|
|
353
|
-
Moves mpm_*.log files from .claude-mpm/logs/
|
355
|
+
Moves mpm_*.log files from old locations to .claude-mpm/logs/mpm/
|
354
356
|
"""
|
355
357
|
try:
|
356
|
-
# Check
|
358
|
+
# Check old possible locations (including incorrectly created ones)
|
357
359
|
old_locations = [
|
358
|
-
Path.cwd() / "
|
359
|
-
|
360
|
+
Path.cwd() / "logs", # Incorrectly created in project root
|
361
|
+
Path.cwd() / ".claude-mpm" / "logs", # Correct base location
|
362
|
+
self.base_log_dir, # Current base location (.claude-mpm/logs/)
|
360
363
|
]
|
361
364
|
new_location = self.base_log_dir / "mpm"
|
362
365
|
|
claude_mpm/core/logger.py
CHANGED
@@ -232,7 +232,7 @@ def setup_logging(
|
|
232
232
|
if log_dir is None:
|
233
233
|
# Use deployment root for logs to keep everything centralized
|
234
234
|
deployment_root = get_project_root()
|
235
|
-
log_dir = deployment_root / "logs" / "mpm"
|
235
|
+
log_dir = deployment_root / ".claude-mpm" / "logs" / "mpm"
|
236
236
|
|
237
237
|
log_dir.mkdir(parents=True, exist_ok=True)
|
238
238
|
|
claude_mpm/core/logging_utils.py
CHANGED
@@ -76,11 +76,11 @@ class LoggerFactory:
|
|
76
76
|
@classmethod
|
77
77
|
def initialize(
|
78
78
|
cls,
|
79
|
-
log_level: str = None,
|
79
|
+
log_level: Optional[str] = None,
|
80
80
|
log_dir: Optional[Path] = None,
|
81
81
|
log_to_file: bool = False,
|
82
|
-
log_format: str = None,
|
83
|
-
date_format: str = None,
|
82
|
+
log_format: Optional[str] = None,
|
83
|
+
date_format: Optional[str] = None,
|
84
84
|
) -> None:
|
85
85
|
"""Initialize the logging system globally.
|
86
86
|
|
@@ -268,10 +268,10 @@ def get_logger(
|
|
268
268
|
|
269
269
|
|
270
270
|
def initialize_logging(
|
271
|
-
log_level: str = None,
|
271
|
+
log_level: Optional[str] = None,
|
272
272
|
log_dir: Optional[Path] = None,
|
273
273
|
log_to_file: bool = False,
|
274
|
-
log_format: str = None,
|
274
|
+
log_format: Optional[str] = None,
|
275
275
|
) -> None:
|
276
276
|
"""Initialize the logging system with standard configuration.
|
277
277
|
|
@@ -300,7 +300,7 @@ def set_log_level(level: str) -> None:
|
|
300
300
|
LoggerFactory.set_level(level)
|
301
301
|
|
302
302
|
|
303
|
-
def get_component_logger(component: str, name: str = None) -> logging.Logger:
|
303
|
+
def get_component_logger(component: str, name: Optional[str] = None) -> logging.Logger:
|
304
304
|
"""Get a logger for a specific component.
|
305
305
|
|
306
306
|
Args:
|
@@ -367,9 +367,17 @@ class UnifiedAgentRegistry:
|
|
367
367
|
break
|
368
368
|
project_root = project_root.parent
|
369
369
|
|
370
|
-
# Extract tags
|
370
|
+
# Extract tags (handle both list and comma-separated string formats)
|
371
371
|
if "metadata" in data:
|
372
|
-
|
372
|
+
tags_raw = data["metadata"].get("tags", [])
|
373
|
+
if isinstance(tags_raw, str):
|
374
|
+
tags = [
|
375
|
+
tag.strip()
|
376
|
+
for tag in tags_raw.split(",")
|
377
|
+
if tag.strip()
|
378
|
+
]
|
379
|
+
else:
|
380
|
+
tags = tags_raw if isinstance(tags_raw, list) else []
|
373
381
|
|
374
382
|
except Exception as e:
|
375
383
|
logger.debug(
|
@@ -462,8 +470,14 @@ class UnifiedAgentRegistry:
|
|
462
470
|
"specializations", data.get("specializations", [])
|
463
471
|
)
|
464
472
|
|
465
|
-
# Extract tags as specializations if present
|
466
|
-
|
473
|
+
# Extract tags as specializations if present (handle both formats)
|
474
|
+
tags_raw = metadata.get("tags", [])
|
475
|
+
if isinstance(tags_raw, str):
|
476
|
+
tags = [
|
477
|
+
tag.strip() for tag in tags_raw.split(",") if tag.strip()
|
478
|
+
]
|
479
|
+
else:
|
480
|
+
tags = tags_raw if isinstance(tags_raw, list) else []
|
467
481
|
if tags and not specializations:
|
468
482
|
specializations = tags
|
469
483
|
else:
|
@@ -0,0 +1,188 @@
|
|
1
|
+
.dataInspector {
|
2
|
+
background: rgba(0, 0, 0, 0.3);
|
3
|
+
border-radius: 6px;
|
4
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
5
|
+
overflow: hidden;
|
6
|
+
}
|
7
|
+
|
8
|
+
.inspectorHeader {
|
9
|
+
display: flex;
|
10
|
+
gap: 10px;
|
11
|
+
padding: 10px;
|
12
|
+
background: rgba(255, 255, 255, 0.05);
|
13
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
14
|
+
align-items: center;
|
15
|
+
}
|
16
|
+
|
17
|
+
.searchInput {
|
18
|
+
flex: 1;
|
19
|
+
padding: 8px 12px;
|
20
|
+
background: rgba(255, 255, 255, 0.05);
|
21
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
22
|
+
border-radius: 4px;
|
23
|
+
color: white;
|
24
|
+
font-size: 12px;
|
25
|
+
}
|
26
|
+
|
27
|
+
.searchInput::placeholder {
|
28
|
+
color: rgba(255, 255, 255, 0.5);
|
29
|
+
}
|
30
|
+
|
31
|
+
.actions {
|
32
|
+
display: flex;
|
33
|
+
gap: 8px;
|
34
|
+
}
|
35
|
+
|
36
|
+
.actionButton {
|
37
|
+
padding: 6px 12px;
|
38
|
+
background: rgba(255, 255, 255, 0.1);
|
39
|
+
border: none;
|
40
|
+
border-radius: 4px;
|
41
|
+
color: white;
|
42
|
+
font-size: 11px;
|
43
|
+
cursor: pointer;
|
44
|
+
transition: background 0.2s;
|
45
|
+
}
|
46
|
+
|
47
|
+
.actionButton:hover {
|
48
|
+
background: rgba(255, 255, 255, 0.2);
|
49
|
+
}
|
50
|
+
|
51
|
+
.treeContainer {
|
52
|
+
overflow-y: auto;
|
53
|
+
padding: 10px;
|
54
|
+
font-family: 'Courier New', monospace;
|
55
|
+
font-size: 13px;
|
56
|
+
line-height: 1.4;
|
57
|
+
}
|
58
|
+
|
59
|
+
.treeNode {
|
60
|
+
margin-bottom: 2px;
|
61
|
+
}
|
62
|
+
|
63
|
+
.nodeHeader {
|
64
|
+
display: flex;
|
65
|
+
align-items: center;
|
66
|
+
gap: 6px;
|
67
|
+
padding: 2px 4px;
|
68
|
+
cursor: pointer;
|
69
|
+
border-radius: 3px;
|
70
|
+
transition: background 0.2s;
|
71
|
+
}
|
72
|
+
|
73
|
+
.nodeHeader:hover {
|
74
|
+
background: rgba(255, 255, 255, 0.05);
|
75
|
+
}
|
76
|
+
|
77
|
+
.expandIcon {
|
78
|
+
color: #94a3b8;
|
79
|
+
font-size: 10px;
|
80
|
+
transition: transform 0.2s;
|
81
|
+
cursor: pointer;
|
82
|
+
user-select: none;
|
83
|
+
width: 12px;
|
84
|
+
display: inline-block;
|
85
|
+
}
|
86
|
+
|
87
|
+
.expandIcon.expanded {
|
88
|
+
transform: rotate(90deg);
|
89
|
+
}
|
90
|
+
|
91
|
+
.leafIcon {
|
92
|
+
color: #94a3b8;
|
93
|
+
font-size: 8px;
|
94
|
+
width: 12px;
|
95
|
+
display: inline-block;
|
96
|
+
text-align: center;
|
97
|
+
}
|
98
|
+
|
99
|
+
.nodeKey {
|
100
|
+
color: #60a5fa;
|
101
|
+
font-weight: 500;
|
102
|
+
}
|
103
|
+
|
104
|
+
.nodeValue {
|
105
|
+
margin-left: 6px;
|
106
|
+
word-break: break-all;
|
107
|
+
}
|
108
|
+
|
109
|
+
.nodeValue.string {
|
110
|
+
color: #86efac;
|
111
|
+
}
|
112
|
+
|
113
|
+
.nodeValue.number {
|
114
|
+
color: #fbbf24;
|
115
|
+
}
|
116
|
+
|
117
|
+
.nodeValue.boolean {
|
118
|
+
color: #a78bfa;
|
119
|
+
}
|
120
|
+
|
121
|
+
.nodeValue.null,
|
122
|
+
.nodeValue.undefined {
|
123
|
+
color: #f87171;
|
124
|
+
font-style: italic;
|
125
|
+
}
|
126
|
+
|
127
|
+
.nodeValue.object,
|
128
|
+
.nodeValue.array {
|
129
|
+
color: #94a3b8;
|
130
|
+
font-style: italic;
|
131
|
+
}
|
132
|
+
|
133
|
+
.copyButton {
|
134
|
+
margin-left: auto;
|
135
|
+
background: none;
|
136
|
+
border: none;
|
137
|
+
color: rgba(255, 255, 255, 0.5);
|
138
|
+
cursor: pointer;
|
139
|
+
padding: 2px;
|
140
|
+
font-size: 10px;
|
141
|
+
opacity: 0;
|
142
|
+
transition: opacity 0.2s;
|
143
|
+
}
|
144
|
+
|
145
|
+
.nodeHeader:hover .copyButton {
|
146
|
+
opacity: 1;
|
147
|
+
}
|
148
|
+
|
149
|
+
.copyButton:hover {
|
150
|
+
color: rgba(255, 255, 255, 0.8);
|
151
|
+
}
|
152
|
+
|
153
|
+
.nodeChildren {
|
154
|
+
border-left: 1px solid rgba(255, 255, 255, 0.1);
|
155
|
+
margin-left: 6px;
|
156
|
+
}
|
157
|
+
|
158
|
+
.highlight {
|
159
|
+
background: rgba(251, 191, 36, 0.3);
|
160
|
+
color: #fbbf24;
|
161
|
+
padding: 1px 2px;
|
162
|
+
border-radius: 2px;
|
163
|
+
}
|
164
|
+
|
165
|
+
.noData {
|
166
|
+
text-align: center;
|
167
|
+
color: rgba(255, 255, 255, 0.5);
|
168
|
+
padding: 20px;
|
169
|
+
font-style: italic;
|
170
|
+
}
|
171
|
+
|
172
|
+
/* Scrollbar styling */
|
173
|
+
.treeContainer::-webkit-scrollbar {
|
174
|
+
width: 6px;
|
175
|
+
}
|
176
|
+
|
177
|
+
.treeContainer::-webkit-scrollbar-track {
|
178
|
+
background: rgba(255, 255, 255, 0.05);
|
179
|
+
}
|
180
|
+
|
181
|
+
.treeContainer::-webkit-scrollbar-thumb {
|
182
|
+
background: rgba(255, 255, 255, 0.2);
|
183
|
+
border-radius: 3px;
|
184
|
+
}
|
185
|
+
|
186
|
+
.treeContainer::-webkit-scrollbar-thumb:hover {
|
187
|
+
background: rgba(255, 255, 255, 0.3);
|
188
|
+
}
|
@@ -0,0 +1,156 @@
|
|
1
|
+
.eventsContainer {
|
2
|
+
background: rgba(255, 255, 255, 0.05);
|
3
|
+
backdrop-filter: blur(10px);
|
4
|
+
border-radius: 12px;
|
5
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
6
|
+
overflow: hidden;
|
7
|
+
flex: 1;
|
8
|
+
display: flex;
|
9
|
+
flex-direction: column;
|
10
|
+
min-height: 0;
|
11
|
+
}
|
12
|
+
|
13
|
+
.eventsHeader {
|
14
|
+
padding: 15px 20px;
|
15
|
+
background: rgba(255, 255, 255, 0.05);
|
16
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
17
|
+
display: flex;
|
18
|
+
justify-content: space-between;
|
19
|
+
align-items: center;
|
20
|
+
}
|
21
|
+
|
22
|
+
.eventsTitle {
|
23
|
+
font-weight: 600;
|
24
|
+
font-size: 16px;
|
25
|
+
}
|
26
|
+
|
27
|
+
.eventsInfo {
|
28
|
+
font-size: 12px;
|
29
|
+
color: rgba(255, 255, 255, 0.6);
|
30
|
+
}
|
31
|
+
|
32
|
+
.eventsList {
|
33
|
+
flex: 1;
|
34
|
+
position: relative;
|
35
|
+
min-height: 300px;
|
36
|
+
}
|
37
|
+
|
38
|
+
.eventItem {
|
39
|
+
padding: 12px 20px;
|
40
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
|
41
|
+
transition: background 0.2s;
|
42
|
+
cursor: pointer;
|
43
|
+
font-family: 'Courier New', monospace;
|
44
|
+
font-size: 13px;
|
45
|
+
position: relative;
|
46
|
+
animation: slideIn 0.3s ease;
|
47
|
+
}
|
48
|
+
|
49
|
+
@keyframes slideIn {
|
50
|
+
from {
|
51
|
+
opacity: 0;
|
52
|
+
transform: translateX(-20px);
|
53
|
+
}
|
54
|
+
to {
|
55
|
+
opacity: 1;
|
56
|
+
transform: translateX(0);
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
.eventItem:hover {
|
61
|
+
background: rgba(255, 255, 255, 0.05);
|
62
|
+
}
|
63
|
+
|
64
|
+
.eventItem.expanded {
|
65
|
+
background: rgba(255, 255, 255, 0.08);
|
66
|
+
}
|
67
|
+
|
68
|
+
.eventHeader {
|
69
|
+
width: 100%;
|
70
|
+
}
|
71
|
+
|
72
|
+
.eventHeaderRow {
|
73
|
+
display: flex;
|
74
|
+
gap: 10px;
|
75
|
+
align-items: center;
|
76
|
+
margin-bottom: 5px;
|
77
|
+
}
|
78
|
+
|
79
|
+
.eventType {
|
80
|
+
padding: 3px 8px;
|
81
|
+
border-radius: 10px;
|
82
|
+
font-size: 11px;
|
83
|
+
font-weight: 600;
|
84
|
+
text-transform: uppercase;
|
85
|
+
}
|
86
|
+
|
87
|
+
.eventType.agent {
|
88
|
+
background: rgba(167, 139, 250, 0.2);
|
89
|
+
color: #a78bfa;
|
90
|
+
}
|
91
|
+
|
92
|
+
.eventType.tool {
|
93
|
+
background: rgba(96, 165, 250, 0.2);
|
94
|
+
color: #60a5fa;
|
95
|
+
}
|
96
|
+
|
97
|
+
.eventType.file {
|
98
|
+
background: rgba(251, 191, 36, 0.2);
|
99
|
+
color: #fbbf24;
|
100
|
+
}
|
101
|
+
|
102
|
+
.eventType.session {
|
103
|
+
background: rgba(74, 222, 128, 0.2);
|
104
|
+
color: #4ade80;
|
105
|
+
}
|
106
|
+
|
107
|
+
.eventType.error {
|
108
|
+
background: rgba(248, 113, 113, 0.2);
|
109
|
+
color: #f87171;
|
110
|
+
}
|
111
|
+
|
112
|
+
.eventType.info {
|
113
|
+
background: rgba(134, 239, 172, 0.2);
|
114
|
+
color: #86efac;
|
115
|
+
}
|
116
|
+
|
117
|
+
.eventTime {
|
118
|
+
font-size: 11px;
|
119
|
+
color: rgba(255, 255, 255, 0.5);
|
120
|
+
}
|
121
|
+
|
122
|
+
.sourceIndicator {
|
123
|
+
font-size: 10px;
|
124
|
+
color: rgba(255, 255, 255, 0.4);
|
125
|
+
font-style: italic;
|
126
|
+
}
|
127
|
+
|
128
|
+
.eventPreview {
|
129
|
+
color: rgba(255, 255, 255, 0.7);
|
130
|
+
white-space: nowrap;
|
131
|
+
overflow: hidden;
|
132
|
+
text-overflow: ellipsis;
|
133
|
+
max-width: 100%;
|
134
|
+
}
|
135
|
+
|
136
|
+
.eventDetails {
|
137
|
+
margin-top: 10px;
|
138
|
+
padding: 10px;
|
139
|
+
background: rgba(0, 0, 0, 0.2);
|
140
|
+
border-radius: 6px;
|
141
|
+
}
|
142
|
+
|
143
|
+
.noEvents {
|
144
|
+
text-align: center;
|
145
|
+
padding: 60px 20px;
|
146
|
+
color: rgba(255, 255, 255, 0.5);
|
147
|
+
}
|
148
|
+
|
149
|
+
.noEvents h3 {
|
150
|
+
margin-bottom: 10px;
|
151
|
+
font-size: 18px;
|
152
|
+
}
|
153
|
+
|
154
|
+
.noEvents p {
|
155
|
+
font-size: 14px;
|
156
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
.statusBar {
|
2
|
+
display: flex;
|
3
|
+
gap: 20px;
|
4
|
+
align-items: center;
|
5
|
+
flex-wrap: wrap;
|
6
|
+
}
|
7
|
+
|
8
|
+
.statusIndicator {
|
9
|
+
display: flex;
|
10
|
+
align-items: center;
|
11
|
+
gap: 8px;
|
12
|
+
padding: 8px 16px;
|
13
|
+
background: rgba(255, 255, 255, 0.05);
|
14
|
+
border-radius: 20px;
|
15
|
+
font-size: 14px;
|
16
|
+
}
|
17
|
+
|
18
|
+
.statusDot {
|
19
|
+
width: 10px;
|
20
|
+
height: 10px;
|
21
|
+
border-radius: 50%;
|
22
|
+
animation: pulse 2s infinite;
|
23
|
+
}
|
24
|
+
|
25
|
+
.statusDot.connected {
|
26
|
+
background: #4ade80;
|
27
|
+
box-shadow: 0 0 10px #4ade80;
|
28
|
+
}
|
29
|
+
|
30
|
+
.statusDot.disconnected {
|
31
|
+
background: #f87171;
|
32
|
+
box-shadow: 0 0 10px #f87171;
|
33
|
+
}
|
34
|
+
|
35
|
+
@keyframes pulse {
|
36
|
+
0%, 100% { opacity: 1; }
|
37
|
+
50% { opacity: 0.5; }
|
38
|
+
}
|
@@ -0,0 +1,92 @@
|
|
1
|
+
.controlsPanel {
|
2
|
+
background: rgba(255, 255, 255, 0.05);
|
3
|
+
backdrop-filter: blur(10px);
|
4
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
5
|
+
border-radius: 10px;
|
6
|
+
padding: 15px;
|
7
|
+
margin-bottom: 20px;
|
8
|
+
display: flex;
|
9
|
+
gap: 15px;
|
10
|
+
align-items: center;
|
11
|
+
flex-wrap: wrap;
|
12
|
+
}
|
13
|
+
|
14
|
+
.controlGroup {
|
15
|
+
display: flex;
|
16
|
+
align-items: center;
|
17
|
+
gap: 10px;
|
18
|
+
}
|
19
|
+
|
20
|
+
.controlLabel {
|
21
|
+
font-size: 14px;
|
22
|
+
color: #94a3b8;
|
23
|
+
}
|
24
|
+
|
25
|
+
.btn {
|
26
|
+
padding: 10px 20px;
|
27
|
+
background: linear-gradient(135deg, #10b981 0%, #06b6d4 100%);
|
28
|
+
border: none;
|
29
|
+
border-radius: 8px;
|
30
|
+
color: white;
|
31
|
+
cursor: pointer;
|
32
|
+
font-size: 14px;
|
33
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
34
|
+
}
|
35
|
+
|
36
|
+
.btn:hover {
|
37
|
+
transform: translateY(-2px);
|
38
|
+
box-shadow: 0 5px 15px rgba(16, 185, 129, 0.4);
|
39
|
+
}
|
40
|
+
|
41
|
+
.btn.secondary {
|
42
|
+
background: rgba(255, 255, 255, 0.1);
|
43
|
+
}
|
44
|
+
|
45
|
+
.btn.danger {
|
46
|
+
background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
|
47
|
+
}
|
48
|
+
|
49
|
+
.searchBox {
|
50
|
+
flex: 1;
|
51
|
+
min-width: 200px;
|
52
|
+
padding: 10px 15px;
|
53
|
+
background: rgba(255, 255, 255, 0.05);
|
54
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
55
|
+
border-radius: 8px;
|
56
|
+
color: white;
|
57
|
+
font-size: 14px;
|
58
|
+
}
|
59
|
+
|
60
|
+
.searchBox::placeholder {
|
61
|
+
color: rgba(255, 255, 255, 0.5);
|
62
|
+
}
|
63
|
+
|
64
|
+
.filterSelect {
|
65
|
+
padding: 10px 15px;
|
66
|
+
background: rgba(255, 255, 255, 0.05);
|
67
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
68
|
+
border-radius: 8px;
|
69
|
+
color: white;
|
70
|
+
font-size: 14px;
|
71
|
+
cursor: pointer;
|
72
|
+
}
|
73
|
+
|
74
|
+
.filterSelect option {
|
75
|
+
background: #0f172a;
|
76
|
+
}
|
77
|
+
|
78
|
+
.checkboxLabel {
|
79
|
+
display: flex;
|
80
|
+
align-items: center;
|
81
|
+
gap: 8px;
|
82
|
+
padding: 10px 15px;
|
83
|
+
background: rgba(255, 255, 255, 0.05);
|
84
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
85
|
+
border-radius: 8px;
|
86
|
+
cursor: pointer;
|
87
|
+
font-size: 14px;
|
88
|
+
}
|
89
|
+
|
90
|
+
.checkboxLabel input {
|
91
|
+
cursor: pointer;
|
92
|
+
}
|