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,372 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Claude MPM Dashboard Test</title>
|
|
7
|
+
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHJ4PSI2IiBmaWxsPSIjNDI5OWUxIi8+CiAgPHRleHQgeD0iMTYiIHk9IjIxIiBmb250LWZhbWlseT0iSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMCIgZm9udC13ZWlnaHQ9ImJvbGQiIGZpbGw9IndoaXRlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5NUE08L3RleHQ+Cjwvc3ZnPgo=">
|
|
8
|
+
|
|
9
|
+
<!-- Test version using relative paths for verification -->
|
|
10
|
+
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
|
|
11
|
+
<link rel="stylesheet" href="static/css/dashboard.css">
|
|
12
|
+
|
|
13
|
+
<!-- Additional styles for file operations -->
|
|
14
|
+
<style>
|
|
15
|
+
.file-item {
|
|
16
|
+
background: white;
|
|
17
|
+
border-radius: 6px;
|
|
18
|
+
padding: 12px;
|
|
19
|
+
margin-bottom: 8px;
|
|
20
|
+
border-left: 4px solid #4299e1;
|
|
21
|
+
cursor: pointer;
|
|
22
|
+
transition: all 0.2s;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.file-item:hover {
|
|
26
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
27
|
+
transform: translateX(2px);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.file-header {
|
|
31
|
+
display: flex;
|
|
32
|
+
align-items: center;
|
|
33
|
+
gap: 8px;
|
|
34
|
+
margin-bottom: 4px;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.file-icon {
|
|
38
|
+
font-size: 16px;
|
|
39
|
+
min-width: 20px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.file-path {
|
|
43
|
+
flex: 1;
|
|
44
|
+
font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
|
|
45
|
+
font-size: 13px;
|
|
46
|
+
color: #2d3748;
|
|
47
|
+
word-break: break-all;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.file-timestamp {
|
|
51
|
+
font-size: 12px;
|
|
52
|
+
color: #718096;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.file-summary {
|
|
56
|
+
font-size: 12px;
|
|
57
|
+
color: #4a5568;
|
|
58
|
+
margin-left: 28px;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.operation-item {
|
|
62
|
+
background: #f8fafc;
|
|
63
|
+
border: 1px solid #e2e8f0;
|
|
64
|
+
border-radius: 6px;
|
|
65
|
+
padding: 10px;
|
|
66
|
+
margin-bottom: 8px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.operation-header {
|
|
70
|
+
display: flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
gap: 8px;
|
|
73
|
+
margin-bottom: 6px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.operation-icon {
|
|
77
|
+
font-size: 14px;
|
|
78
|
+
min-width: 16px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.operation-type {
|
|
82
|
+
font-weight: 600;
|
|
83
|
+
color: #2d3748;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.operation-timestamp {
|
|
87
|
+
margin-left: auto;
|
|
88
|
+
font-size: 11px;
|
|
89
|
+
color: #718096;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.operation-details {
|
|
93
|
+
font-size: 12px;
|
|
94
|
+
color: #4a5568;
|
|
95
|
+
line-height: 1.4;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.file-details {
|
|
99
|
+
background: white;
|
|
100
|
+
border-radius: 6px;
|
|
101
|
+
padding: 15px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.file-path-display {
|
|
105
|
+
font-size: 14px;
|
|
106
|
+
margin-bottom: 15px;
|
|
107
|
+
padding-bottom: 10px;
|
|
108
|
+
border-bottom: 1px solid #e2e8f0;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.operations-list {
|
|
112
|
+
max-height: 400px;
|
|
113
|
+
overflow-y: auto;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.test-status {
|
|
117
|
+
position: fixed;
|
|
118
|
+
top: 20px;
|
|
119
|
+
right: 20px;
|
|
120
|
+
background: #f7fafc;
|
|
121
|
+
border: 1px solid #e2e8f0;
|
|
122
|
+
border-radius: 8px;
|
|
123
|
+
padding: 15px;
|
|
124
|
+
max-width: 300px;
|
|
125
|
+
z-index: 1001;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.test-item {
|
|
129
|
+
display: flex;
|
|
130
|
+
align-items: center;
|
|
131
|
+
gap: 8px;
|
|
132
|
+
margin-bottom: 5px;
|
|
133
|
+
font-size: 12px;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.test-pass { color: #38a169; }
|
|
137
|
+
.test-fail { color: #e53e3e; }
|
|
138
|
+
.test-pending { color: #d69e2e; }
|
|
139
|
+
</style>
|
|
140
|
+
</head>
|
|
141
|
+
<body>
|
|
142
|
+
<!-- Test Status Panel -->
|
|
143
|
+
<div class="test-status">
|
|
144
|
+
<h4>🧪 Module Test Status</h4>
|
|
145
|
+
<div id="test-results">
|
|
146
|
+
<div class="test-item test-pending">⏳ Loading modules...</div>
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
<div class="container">
|
|
151
|
+
<!-- Header Section -->
|
|
152
|
+
<div class="header">
|
|
153
|
+
<!-- Row 1: Title, Status, Metrics -->
|
|
154
|
+
<div class="header-row">
|
|
155
|
+
<div class="header-title">
|
|
156
|
+
<h1>🚀 Claude MPM Monitor (Modular Test)</h1>
|
|
157
|
+
<div id="connection-status" class="status-badge status-disconnected">
|
|
158
|
+
<span>●</span> Disconnected
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
<div class="metrics-widget">
|
|
162
|
+
<div class="metric-mini">
|
|
163
|
+
<div class="metric-mini-value" id="total-events">0</div>
|
|
164
|
+
<div class="metric-mini-label">Events</div>
|
|
165
|
+
</div>
|
|
166
|
+
<div class="metric-mini">
|
|
167
|
+
<div class="metric-mini-value" id="events-per-minute">0</div>
|
|
168
|
+
<div class="metric-mini-label">Per Min</div>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="metric-mini">
|
|
171
|
+
<div class="metric-mini-value" id="unique-types">0</div>
|
|
172
|
+
<div class="metric-mini-label">Types</div>
|
|
173
|
+
</div>
|
|
174
|
+
<div class="metric-mini">
|
|
175
|
+
<div class="metric-mini-value" id="error-count">0</div>
|
|
176
|
+
<div class="metric-mini-label">Errors</div>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
<!-- Row 2: Connection Controls and Session Selection -->
|
|
182
|
+
<div class="header-row">
|
|
183
|
+
<div class="connection-controls">
|
|
184
|
+
<button id="connect-btn">Connect</button>
|
|
185
|
+
<button id="disconnect-btn" class="btn-secondary">Disconnect</button>
|
|
186
|
+
<input type="text" id="port-input" value="8765" placeholder="Port">
|
|
187
|
+
</div>
|
|
188
|
+
<div class="session-group">
|
|
189
|
+
<label>Session:</label>
|
|
190
|
+
<select id="session-select" class="session-select">
|
|
191
|
+
<option value="">All Sessions</option>
|
|
192
|
+
</select>
|
|
193
|
+
<button class="btn-secondary">Refresh</button>
|
|
194
|
+
</div>
|
|
195
|
+
<div class="action-buttons">
|
|
196
|
+
<button class="btn-secondary">Clear</button>
|
|
197
|
+
<button class="btn-success">Export</button>
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<!-- Main Content Area -->
|
|
203
|
+
<div class="events-wrapper">
|
|
204
|
+
<!-- Split container for module viewer and tabbed content -->
|
|
205
|
+
<div class="split-container">
|
|
206
|
+
<!-- Left: Module Viewer -->
|
|
207
|
+
<div class="module-viewer">
|
|
208
|
+
<div class="module-header">
|
|
209
|
+
<h4>📁 Event Analysis</h4>
|
|
210
|
+
<button class="btn-secondary" style="font-size: 11px; padding: 4px 8px;">Clear</button>
|
|
211
|
+
</div>
|
|
212
|
+
<div class="module-content" id="module-content">
|
|
213
|
+
<div class="module-empty">
|
|
214
|
+
<p>Click on an event to view details</p>
|
|
215
|
+
<p class="module-hint">Events are organized by class</p>
|
|
216
|
+
</div>
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
|
|
220
|
+
<!-- Right: Tabbed Content -->
|
|
221
|
+
<div class="events-container">
|
|
222
|
+
<!-- Tab Navigation -->
|
|
223
|
+
<div class="tab-nav">
|
|
224
|
+
<button class="tab-button active">📊 Events</button>
|
|
225
|
+
<button class="tab-button">🤖 Agents</button>
|
|
226
|
+
<button class="tab-button">🔧 Tools</button>
|
|
227
|
+
<button class="tab-button">📁 Files</button>
|
|
228
|
+
</div>
|
|
229
|
+
|
|
230
|
+
<!-- Events Tab -->
|
|
231
|
+
<div class="tab-content active" id="events-tab">
|
|
232
|
+
<div class="tab-filters">
|
|
233
|
+
<input type="text" id="events-search-input" placeholder="Search events...">
|
|
234
|
+
<select id="events-type-filter">
|
|
235
|
+
<option value="">All Events</option>
|
|
236
|
+
<!-- Event types will be dynamically populated from actual event data -->
|
|
237
|
+
</select>
|
|
238
|
+
</div>
|
|
239
|
+
<div class="events-list" id="events-list">
|
|
240
|
+
<div class="no-events">
|
|
241
|
+
Connect to Socket.IO server to see events...
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
</div>
|
|
245
|
+
|
|
246
|
+
<!-- Agents Tab -->
|
|
247
|
+
<div class="tab-content" id="agents-tab">
|
|
248
|
+
<div class="tab-filters">
|
|
249
|
+
<input type="text" id="agents-search-input" placeholder="Search agents...">
|
|
250
|
+
<select id="agents-type-filter">
|
|
251
|
+
<option value="">All Agents</option>
|
|
252
|
+
<option value="research">Research</option>
|
|
253
|
+
<option value="engineer">Engineer</option>
|
|
254
|
+
<option value="pm">Project Manager</option>
|
|
255
|
+
<option value="ops">Operations</option>
|
|
256
|
+
</select>
|
|
257
|
+
</div>
|
|
258
|
+
<div class="events-list" id="agents-list">
|
|
259
|
+
<div class="no-events">
|
|
260
|
+
No agent events found...
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
|
|
265
|
+
<!-- Tools Tab -->
|
|
266
|
+
<div class="tab-content" id="tools-tab">
|
|
267
|
+
<div class="tab-filters">
|
|
268
|
+
<input type="text" id="tools-search-input" placeholder="Search tools...">
|
|
269
|
+
<select id="tools-type-filter">
|
|
270
|
+
<option value="">All Tools</option>
|
|
271
|
+
<option value="Read">Read</option>
|
|
272
|
+
<option value="Write">Write</option>
|
|
273
|
+
<option value="Edit">Edit</option>
|
|
274
|
+
<option value="Bash">Bash</option>
|
|
275
|
+
<option value="Grep">Grep</option>
|
|
276
|
+
<option value="Glob">Glob</option>
|
|
277
|
+
</select>
|
|
278
|
+
</div>
|
|
279
|
+
<div class="events-list" id="tools-list">
|
|
280
|
+
<div class="no-events">
|
|
281
|
+
No tool events found...
|
|
282
|
+
</div>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
|
|
286
|
+
<!-- Files Tab -->
|
|
287
|
+
<div class="tab-content" id="files-tab">
|
|
288
|
+
<div class="tab-filters">
|
|
289
|
+
<input type="text" id="files-search-input" placeholder="Search files...">
|
|
290
|
+
<select id="files-type-filter">
|
|
291
|
+
<option value="">All Operations</option>
|
|
292
|
+
<option value="read">Read</option>
|
|
293
|
+
<option value="write">Write</option>
|
|
294
|
+
<option value="edit">Edit</option>
|
|
295
|
+
<option value="search">Search</option>
|
|
296
|
+
</select>
|
|
297
|
+
</div>
|
|
298
|
+
<div class="events-list" id="files-list">
|
|
299
|
+
<div class="no-events">
|
|
300
|
+
No file operations found...
|
|
301
|
+
</div>
|
|
302
|
+
</div>
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
|
|
309
|
+
<!-- Footer -->
|
|
310
|
+
<div class="footer">
|
|
311
|
+
<div class="footer-content">
|
|
312
|
+
<div class="footer-item">
|
|
313
|
+
<span class="footer-label">Session:</span>
|
|
314
|
+
<span class="footer-value" id="footer-session">All Sessions</span>
|
|
315
|
+
</div>
|
|
316
|
+
<span class="footer-divider">|</span>
|
|
317
|
+
<div class="footer-item">
|
|
318
|
+
<span class="footer-label">Directory:</span>
|
|
319
|
+
<span class="footer-value" id="footer-working-dir">Unknown</span>
|
|
320
|
+
</div>
|
|
321
|
+
<span class="footer-divider">|</span>
|
|
322
|
+
<div class="footer-item">
|
|
323
|
+
<span class="footer-label">Branch:</span>
|
|
324
|
+
<span class="footer-value" id="footer-git-branch">Unknown</span>
|
|
325
|
+
</div>
|
|
326
|
+
</div>
|
|
327
|
+
</div>
|
|
328
|
+
|
|
329
|
+
<!-- JavaScript Modules -->
|
|
330
|
+
<script src="static/js/socket-client.js"></script>
|
|
331
|
+
<script src="static/js/components/event-viewer.js"></script>
|
|
332
|
+
<script src="static/js/components/module-viewer.js"></script>
|
|
333
|
+
<script src="static/js/components/session-manager.js"></script>
|
|
334
|
+
<script src="static/js/dashboard.js"></script>
|
|
335
|
+
|
|
336
|
+
<!-- Test Script -->
|
|
337
|
+
<script>
|
|
338
|
+
// Simple test to verify modules loaded correctly
|
|
339
|
+
setTimeout(() => {
|
|
340
|
+
const results = document.getElementById('test-results');
|
|
341
|
+
const tests = [
|
|
342
|
+
{ name: 'SocketClient', check: () => typeof SocketClient !== 'undefined' },
|
|
343
|
+
{ name: 'EventViewer', check: () => typeof EventViewer !== 'undefined' },
|
|
344
|
+
{ name: 'ModuleViewer', check: () => typeof ModuleViewer !== 'undefined' },
|
|
345
|
+
{ name: 'SessionManager', check: () => typeof SessionManager !== 'undefined' },
|
|
346
|
+
{ name: 'Dashboard', check: () => typeof Dashboard !== 'undefined' },
|
|
347
|
+
{ name: 'Dashboard Instance', check: () => typeof window.dashboard !== 'undefined' },
|
|
348
|
+
{ name: 'Global Functions', check: () => typeof connectSocket !== 'undefined' }
|
|
349
|
+
];
|
|
350
|
+
|
|
351
|
+
let html = '';
|
|
352
|
+
let allPass = true;
|
|
353
|
+
|
|
354
|
+
tests.forEach(test => {
|
|
355
|
+
const passed = test.check();
|
|
356
|
+
const status = passed ? 'test-pass' : 'test-fail';
|
|
357
|
+
const icon = passed ? '✅' : '❌';
|
|
358
|
+
html += `<div class="test-item ${status}">${icon} ${test.name}</div>`;
|
|
359
|
+
if (!passed) allPass = false;
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
if (allPass) {
|
|
363
|
+
html += '<div class="test-item test-pass">🎉 All modules loaded successfully!</div>';
|
|
364
|
+
} else {
|
|
365
|
+
html += '<div class="test-item test-fail">⚠️ Some modules failed to load</div>';
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
results.innerHTML = html;
|
|
369
|
+
}, 1000);
|
|
370
|
+
</script>
|
|
371
|
+
</body>
|
|
372
|
+
</html>
|
|
@@ -15,6 +15,7 @@ import time
|
|
|
15
15
|
from datetime import datetime
|
|
16
16
|
from typing import Set, Dict, Any, Optional, List
|
|
17
17
|
from collections import deque
|
|
18
|
+
from pathlib import Path
|
|
18
19
|
|
|
19
20
|
try:
|
|
20
21
|
import socketio
|
|
@@ -294,9 +295,12 @@ class SocketIOServer:
|
|
|
294
295
|
self.app.router.add_get('/dashboard', self._handle_dashboard)
|
|
295
296
|
|
|
296
297
|
# Add static file serving for web assets
|
|
297
|
-
static_path =
|
|
298
|
-
if static_path.exists():
|
|
298
|
+
static_path = self._find_static_path()
|
|
299
|
+
if static_path and static_path.exists():
|
|
299
300
|
self.app.router.add_static('/static/', path=str(static_path), name='static')
|
|
301
|
+
self.logger.info(f"Static files served from: {static_path}")
|
|
302
|
+
else:
|
|
303
|
+
self.logger.warning("Static files directory not found - CSS/JS files will not be available")
|
|
300
304
|
|
|
301
305
|
# Register event handlers
|
|
302
306
|
self._register_events()
|
|
@@ -346,15 +350,115 @@ class SocketIOServer:
|
|
|
346
350
|
'Access-Control-Allow-Headers': 'Content-Type, Accept'
|
|
347
351
|
})
|
|
348
352
|
|
|
353
|
+
def _find_static_path(self):
|
|
354
|
+
"""Find the static files directory using multiple approaches.
|
|
355
|
+
|
|
356
|
+
WHY: Static files need to be found in both development and installed environments.
|
|
357
|
+
This uses the same multi-approach pattern as dashboard HTML resolution.
|
|
358
|
+
"""
|
|
359
|
+
|
|
360
|
+
# Approach 1: Use module-relative path (works in installed environment)
|
|
361
|
+
try:
|
|
362
|
+
import claude_mpm.dashboard
|
|
363
|
+
|
|
364
|
+
# Try __file__ attribute first
|
|
365
|
+
if hasattr(claude_mpm.dashboard, '__file__') and claude_mpm.dashboard.__file__:
|
|
366
|
+
dashboard_module_path = Path(claude_mpm.dashboard.__file__).parent
|
|
367
|
+
candidate_path = dashboard_module_path / "static"
|
|
368
|
+
if candidate_path.exists():
|
|
369
|
+
self.logger.info(f"Found static files using module __file__ path: {candidate_path}")
|
|
370
|
+
return candidate_path
|
|
371
|
+
|
|
372
|
+
# Try __path__ attribute for namespace packages
|
|
373
|
+
elif hasattr(claude_mpm.dashboard, '__path__') and claude_mpm.dashboard.__path__:
|
|
374
|
+
# __path__ is a list, take the first entry
|
|
375
|
+
dashboard_module_path = Path(claude_mpm.dashboard.__path__[0])
|
|
376
|
+
candidate_path = dashboard_module_path / "static"
|
|
377
|
+
if candidate_path.exists():
|
|
378
|
+
self.logger.info(f"Found static files using module __path__: {candidate_path}")
|
|
379
|
+
return candidate_path
|
|
380
|
+
|
|
381
|
+
except Exception as e:
|
|
382
|
+
self.logger.debug(f"Module-relative static path failed: {e}")
|
|
383
|
+
|
|
384
|
+
# Approach 2: Use project root (works in development environment)
|
|
385
|
+
try:
|
|
386
|
+
candidate_path = get_project_root() / 'src' / 'claude_mpm' / 'dashboard' / 'static'
|
|
387
|
+
if candidate_path.exists():
|
|
388
|
+
self.logger.info(f"Found static files using project root: {candidate_path}")
|
|
389
|
+
return candidate_path
|
|
390
|
+
except Exception as e:
|
|
391
|
+
self.logger.debug(f"Project root static path failed: {e}")
|
|
392
|
+
|
|
393
|
+
# Approach 3: Search for static files in package installation
|
|
394
|
+
try:
|
|
395
|
+
candidate_path = get_project_root() / 'claude_mpm' / 'dashboard' / 'static'
|
|
396
|
+
if candidate_path.exists():
|
|
397
|
+
self.logger.info(f"Found static files using package path: {candidate_path}")
|
|
398
|
+
return candidate_path
|
|
399
|
+
except Exception as e:
|
|
400
|
+
self.logger.debug(f"Package static path failed: {e}")
|
|
401
|
+
|
|
402
|
+
return None
|
|
403
|
+
|
|
349
404
|
async def _handle_dashboard(self, request):
|
|
350
405
|
"""Serve the dashboard HTML file."""
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
406
|
+
# Try to find dashboard path using multiple approaches
|
|
407
|
+
dashboard_path = None
|
|
408
|
+
|
|
409
|
+
# Approach 1: Use module-relative path (works in installed environment)
|
|
410
|
+
try:
|
|
411
|
+
import claude_mpm.dashboard
|
|
412
|
+
|
|
413
|
+
# Try __file__ attribute first
|
|
414
|
+
if hasattr(claude_mpm.dashboard, '__file__') and claude_mpm.dashboard.__file__:
|
|
415
|
+
dashboard_module_path = Path(claude_mpm.dashboard.__file__).parent
|
|
416
|
+
candidate_path = dashboard_module_path / "templates" / "index.html"
|
|
417
|
+
if candidate_path.exists():
|
|
418
|
+
dashboard_path = candidate_path
|
|
419
|
+
self.logger.info(f"Found dashboard using module __file__ path: {dashboard_path}")
|
|
420
|
+
|
|
421
|
+
# Try __path__ attribute for namespace packages
|
|
422
|
+
elif hasattr(claude_mpm.dashboard, '__path__') and claude_mpm.dashboard.__path__:
|
|
423
|
+
# __path__ is a list, take the first entry
|
|
424
|
+
dashboard_module_path = Path(claude_mpm.dashboard.__path__[0])
|
|
425
|
+
candidate_path = dashboard_module_path / "templates" / "index.html"
|
|
426
|
+
if candidate_path.exists():
|
|
427
|
+
dashboard_path = candidate_path
|
|
428
|
+
self.logger.info(f"Found dashboard using module __path__: {dashboard_path}")
|
|
429
|
+
|
|
430
|
+
except Exception as e:
|
|
431
|
+
self.logger.debug(f"Module-relative path failed: {e}")
|
|
432
|
+
|
|
433
|
+
# Approach 2: Use project root (works in development environment)
|
|
434
|
+
if dashboard_path is None:
|
|
435
|
+
try:
|
|
436
|
+
candidate_path = get_project_root() / 'src' / 'claude_mpm' / 'dashboard' / 'templates' / 'index.html'
|
|
437
|
+
if candidate_path.exists():
|
|
438
|
+
dashboard_path = candidate_path
|
|
439
|
+
self.logger.info(f"Found dashboard using project root: {dashboard_path}")
|
|
440
|
+
except Exception as e:
|
|
441
|
+
self.logger.debug(f"Project root path failed: {e}")
|
|
442
|
+
|
|
443
|
+
# Approach 3: Search for dashboard in package installation
|
|
444
|
+
if dashboard_path is None:
|
|
445
|
+
try:
|
|
446
|
+
candidate_path = get_project_root() / 'claude_mpm' / 'dashboard' / 'templates' / 'index.html'
|
|
447
|
+
if candidate_path.exists():
|
|
448
|
+
dashboard_path = candidate_path
|
|
449
|
+
self.logger.info(f"Found dashboard using package path: {dashboard_path}")
|
|
450
|
+
except Exception as e:
|
|
451
|
+
self.logger.debug(f"Package path failed: {e}")
|
|
452
|
+
|
|
453
|
+
if dashboard_path and dashboard_path.exists():
|
|
355
454
|
return web.FileResponse(str(dashboard_path))
|
|
356
455
|
else:
|
|
357
|
-
|
|
456
|
+
error_msg = f"Dashboard not found. Searched paths:\n"
|
|
457
|
+
error_msg += f"1. Module-relative: {dashboard_module_path / 'templates' / 'index.html' if 'dashboard_module_path' in locals() else 'N/A'}\n"
|
|
458
|
+
error_msg += f"2. Development: {get_project_root() / 'src' / 'claude_mpm' / 'dashboard' / 'templates' / 'index.html'}\n"
|
|
459
|
+
error_msg += f"3. Package: {get_project_root() / 'claude_mpm' / 'dashboard' / 'templates' / 'index.html'}"
|
|
460
|
+
self.logger.error(error_msg)
|
|
461
|
+
return web.Response(text=error_msg, status=404)
|
|
358
462
|
|
|
359
463
|
async def _handle_cors_preflight(self, request):
|
|
360
464
|
"""Handle CORS preflight requests."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-mpm
|
|
3
|
-
Version: 3.4.
|
|
3
|
+
Version: 3.4.16
|
|
4
4
|
Summary: Claude Multi-agent Project Manager - Clean orchestration with ticket management
|
|
5
5
|
Home-page: https://github.com/bobmatnyc/claude-mpm
|
|
6
6
|
Author: Claude MPM Team
|
|
@@ -34,6 +34,7 @@ Requires-Dist: tree-sitter>=0.21.0
|
|
|
34
34
|
Requires-Dist: tree-sitter-language-pack>=0.8.0
|
|
35
35
|
Requires-Dist: python-socketio>=5.11.0
|
|
36
36
|
Requires-Dist: aiohttp>=3.9.0
|
|
37
|
+
Requires-Dist: aiohttp-cors>=0.8.0
|
|
37
38
|
Requires-Dist: python-engineio>=4.8.0
|
|
38
39
|
Provides-Extra: dev
|
|
39
40
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
@@ -75,7 +75,27 @@ claude_mpm/core/session_manager.py,sha256=D6ZA7bHAgfdkv0nLKjza0FKDng5iqi___IESrb
|
|
|
75
75
|
claude_mpm/core/simple_runner.py,sha256=qcbjmRSGD3R_Kt9OmHBexZMY8RpCRbtXRKZAJ31ZGUU,44076
|
|
76
76
|
claude_mpm/core/socketio_pool.py,sha256=B83uDsmqRF5S0QDwwatyKS-m2SdTvotCVfc3_2uQxd8,22438
|
|
77
77
|
claude_mpm/core/tool_access_control.py,sha256=htZbDhC8s7D7BVqfmk0BwRrYJnlnUAk8_NeJKOaeNlg,6632
|
|
78
|
+
claude_mpm/dashboard/index.html,sha256=lXd4WCDn46w9a6edUpGQIy5DtCmiTvDerd1vY97Ule8,451
|
|
78
79
|
claude_mpm/dashboard/open_dashboard.py,sha256=aXUc6LzUMwmTQMkl_h2jjvICimr-ED4FPMHP_9mnrgQ,1108
|
|
80
|
+
claude_mpm/dashboard/test_dashboard.html,sha256=Aakmm9O-pWld_CCXLuUBOJC81Ix9D1avytTN93u0zfc,15090
|
|
81
|
+
claude_mpm/dashboard/static/css/dashboard.css,sha256=z2Z9jLWoPsC71gdQQML9D9Dkr54XnpKhcz4jomCKfdY,49692
|
|
82
|
+
claude_mpm/dashboard/static/js/dashboard-original.js,sha256=MfrEvUbvB-sU67wslVBEYmk2q9d0s2a_u1NWodJNQrc,162374
|
|
83
|
+
claude_mpm/dashboard/static/js/dashboard.js,sha256=vCRjE6HfxQ4VGqe8sML2_8lX0w6qoaZF0AmWjKVldpM,72056
|
|
84
|
+
claude_mpm/dashboard/static/js/socket-client.js,sha256=hjh-HGAlTpaX0Cr6A7DG75TZjujPFcRQSdw7FrysCWQ,18912
|
|
85
|
+
claude_mpm/dashboard/static/js/components/agent-inference.js,sha256=vOSzIGrbGcjLwbQSs4NUIT-KMsAtsdHGcW2LI8W1YQk,24350
|
|
86
|
+
claude_mpm/dashboard/static/js/components/event-processor.js,sha256=nohjjqOqc6W1O0XHQDZ7vJ92t6sIsnoMSruCysT37SI,25268
|
|
87
|
+
claude_mpm/dashboard/static/js/components/event-viewer.js,sha256=kbRtHcsR3ZmMGK2jmTd3MJ1Ga6FkZJ0IQNrdmGoSrMY,32810
|
|
88
|
+
claude_mpm/dashboard/static/js/components/export-manager.js,sha256=vaBVwLnjzmS_euyeG5Kuq-LHbINcOAcMdibZtgvrUJk,12032
|
|
89
|
+
claude_mpm/dashboard/static/js/components/file-tool-tracker.js,sha256=yTshamd2bOVJFl2p6hCg0kpRZxpIpkX4hSrvMOyfIX4,23968
|
|
90
|
+
claude_mpm/dashboard/static/js/components/hud-library-loader.js,sha256=LDeHIgoSc_ucgWOWgKqXogeKwf9ClGJTBUErLG3SxzE,7289
|
|
91
|
+
claude_mpm/dashboard/static/js/components/hud-manager.js,sha256=W-mUqEAiR6zIQAoTT-Tz3_OpwnNRg3KjV_3Ujm6LG04,26538
|
|
92
|
+
claude_mpm/dashboard/static/js/components/hud-visualizer.js,sha256=C78tZ9if-qhxhfUX3-PMezCBSw9apb3Exp_R23ZmU7I,62850
|
|
93
|
+
claude_mpm/dashboard/static/js/components/module-viewer.js,sha256=ZUQpk6U-GmvrRl2N4nm6P7TkG-m4ZKH3rJbg2Ks0x0A,108693
|
|
94
|
+
claude_mpm/dashboard/static/js/components/session-manager.js,sha256=9BkA4NzM_4k9M7-swh4gaHL4Pfd_lxlcsRX13Wfc81A,19990
|
|
95
|
+
claude_mpm/dashboard/static/js/components/socket-manager.js,sha256=x0mKU7gIpIkfAPVyCY3i6Idy_QbxfW5Pc3vqv4zgSvg,12362
|
|
96
|
+
claude_mpm/dashboard/static/js/components/ui-state-manager.js,sha256=5Ligdos7L_UTWMtCW34Y7BNh7msdd9ArCr-7Yr9-VS8,12979
|
|
97
|
+
claude_mpm/dashboard/static/js/components/working-directory.js,sha256=YGyTP0vCaRc9qR7g2d1INShG0-0_X-xkqCW2IF82eXc,33213
|
|
98
|
+
claude_mpm/dashboard/templates/index.html,sha256=ONVRsfpsqmvQDuz9d3QTaF2zN08YoQM9kU-Bxri4660,14997
|
|
79
99
|
claude_mpm/experimental/cli_enhancements.py,sha256=-N5f2u9TaxUcOJegUd3lt1FRz5ErEyYUvvgrNmMRL7Q,11814
|
|
80
100
|
claude_mpm/generators/__init__.py,sha256=l53aBn6kBQSDz3b6bZkMCJBcEmYnV9hHEZq8LKzXgH8,152
|
|
81
101
|
claude_mpm/generators/agent_profile_generator.py,sha256=2HjOscogSyvrtQj8KwdgNPS6Ym_QvgX1BMeauQZewZA,5751
|
|
@@ -139,7 +159,7 @@ claude_mpm/services/project_analyzer.py,sha256=3Ub_Tpcxm0LnYgcAipebvWr6TfofVqZNM
|
|
|
139
159
|
claude_mpm/services/recovery_manager.py,sha256=K46vXbEWbxFUoS42s34OxN1rkddpisGG7E_ZdRyAZ-A,25792
|
|
140
160
|
claude_mpm/services/shared_prompt_cache.py,sha256=D04lrRWyg0lHyqGcAHy7IYvRHRKSg6EOpAJwBUPa2wk,29890
|
|
141
161
|
claude_mpm/services/socketio_client_manager.py,sha256=2Ly63iiGA_BUzf73UwQDu9Q75wA1C4O1CWFv8hi8bms,18074
|
|
142
|
-
claude_mpm/services/socketio_server.py,sha256=
|
|
162
|
+
claude_mpm/services/socketio_server.py,sha256=E1i_YrUFa7AKdxfKgNkC0daUzytA8qiHRJxD_JRcXPk,84929
|
|
143
163
|
claude_mpm/services/standalone_socketio_server.py,sha256=TfdtwdtlKA6cZyTon9O7zkSeu0H-1HpW0te7vu1r3o0,55214
|
|
144
164
|
claude_mpm/services/ticket_manager.py,sha256=Ki11YjBkDax8BFVSaDdOBk3K4VU5gvdbgq9AmCyyoZ0,7454
|
|
145
165
|
claude_mpm/services/ticket_manager_di.py,sha256=pIsIGncbboKzBYSRQTO7ZX5MuQzV6iFfIflvKe6u1jw,11123
|
|
@@ -193,9 +213,9 @@ claude_mpm/utils/path_operations.py,sha256=6pLMnAWBVzHkgp6JyQHmHbGD-dWn-nX21yV4E
|
|
|
193
213
|
claude_mpm/utils/paths.py,sha256=Xv0SZWdZRkRjN9e6clBcA165ya00GNQxt7SwMz51tfA,10153
|
|
194
214
|
claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
|
|
195
215
|
claude_mpm/validation/agent_validator.py,sha256=GCA2b2rKhKDeaNyUqWxTiWIs3sDdWjD9cgOFRp9K6ic,18227
|
|
196
|
-
claude_mpm-3.4.
|
|
197
|
-
claude_mpm-3.4.
|
|
198
|
-
claude_mpm-3.4.
|
|
199
|
-
claude_mpm-3.4.
|
|
200
|
-
claude_mpm-3.4.
|
|
201
|
-
claude_mpm-3.4.
|
|
216
|
+
claude_mpm-3.4.16.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
|
|
217
|
+
claude_mpm-3.4.16.dist-info/METADATA,sha256=yLlPpKYEh2CCxxk250Xuo7uSEBNX74LycyuBBHdhQ18,6499
|
|
218
|
+
claude_mpm-3.4.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
219
|
+
claude_mpm-3.4.16.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
|
|
220
|
+
claude_mpm-3.4.16.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
|
|
221
|
+
claude_mpm-3.4.16.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|