claude-mpm 4.1.12__py3-none-any.whl → 4.1.13__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 (30) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/cli/commands/monitor.py +88 -627
  3. claude_mpm/cli/commands/mpm_init.py +7 -2
  4. claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
  5. claude_mpm/dashboard/static/built/components/code-tree.js +1 -1
  6. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  7. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  8. claude_mpm/dashboard/static/css/activity.css +1239 -267
  9. claude_mpm/dashboard/static/css/dashboard.css +511 -0
  10. claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
  11. claude_mpm/dashboard/static/dist/components/code-tree.js +2 -2593
  12. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  13. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  14. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  15. claude_mpm/dashboard/static/js/components/activity-tree.js +1193 -892
  16. claude_mpm/dashboard/static/js/components/code-tree.js +0 -17
  17. claude_mpm/dashboard/static/js/components/module-viewer.js +21 -7
  18. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1066 -0
  19. claude_mpm/dashboard/static/js/connection-manager.js +1 -1
  20. claude_mpm/dashboard/static/js/dashboard.js +196 -43
  21. claude_mpm/dashboard/static/js/socket-client.js +2 -2
  22. claude_mpm/dashboard/templates/index.html +95 -25
  23. claude_mpm/services/cli/socketio_manager.py +1 -1
  24. claude_mpm/services/infrastructure/monitoring.py +1 -1
  25. {claude_mpm-4.1.12.dist-info → claude_mpm-4.1.13.dist-info}/METADATA +1 -1
  26. {claude_mpm-4.1.12.dist-info → claude_mpm-4.1.13.dist-info}/RECORD +30 -29
  27. {claude_mpm-4.1.12.dist-info → claude_mpm-4.1.13.dist-info}/WHEEL +0 -0
  28. {claude_mpm-4.1.12.dist-info → claude_mpm-4.1.13.dist-info}/entry_points.txt +0 -0
  29. {claude_mpm-4.1.12.dist-info → claude_mpm-4.1.13.dist-info}/licenses/LICENSE +0 -0
  30. {claude_mpm-4.1.12.dist-info → claude_mpm-4.1.13.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- /* Activity Tab Styles for D3.js Tree Visualization */
1
+ /* Activity Tab Styles for Linear Tree View */
2
2
 
3
3
  /* Container and Layout */
4
4
  .activity-container {
@@ -87,406 +87,888 @@
87
87
  border-radius: 8px;
88
88
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
89
89
  position: relative;
90
- overflow: hidden;
90
+ overflow-y: auto;
91
+ overflow-x: hidden;
91
92
  min-height: 400px;
93
+ max-height: calc(100vh - 320px);
94
+ padding: 0;
95
+ scroll-behavior: smooth;
92
96
  }
93
97
 
94
- #activity-tree {
98
+ /* SVG Tree Styles */
99
+ #activity-tree-svg {
100
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', monospace;
95
101
  width: 100%;
96
102
  height: 100%;
97
103
  min-height: 400px;
98
104
  }
99
105
 
100
- /* Ensure SVG fills container */
101
- #activity-tree svg {
102
- display: block;
103
- width: 100%;
104
- height: 100%;
106
+ /* D3 Tree Group */
107
+ .tree-group {
108
+ cursor: move; /* Cursor for pan */
105
109
  }
106
110
 
107
- /* Tree Legend */
108
- .tree-legend {
109
- position: absolute;
110
- top: 15px;
111
- right: 15px;
112
- background: rgba(255, 255, 255, 0.95);
113
- border: 1px solid #e2e8f0;
114
- border-radius: 6px;
115
- padding: 10px;
116
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
111
+ /* D3 Node Styles */
112
+ .node {
113
+ cursor: pointer;
114
+ transition: all 0.3s ease;
117
115
  }
118
116
 
119
- .legend-item {
117
+ .node.selected .node-circle {
118
+ stroke: #4299e1 !important;
119
+ stroke-width: 3px !important;
120
+ filter: drop-shadow(0 0 6px rgba(66, 153, 225, 0.6));
121
+ }
122
+
123
+ .node-circle {
124
+ transition: all 0.3s ease;
125
+ }
126
+
127
+ .node:hover .node-circle {
128
+ stroke-width: 3px;
129
+ filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.3));
130
+ }
131
+
132
+ .node-icon {
133
+ font-size: 12px;
134
+ pointer-events: none;
135
+ font-weight: bold;
136
+ }
137
+
138
+ .node-label {
139
+ font-size: 14px;
140
+ font-weight: 500;
141
+ fill: #2d3748;
142
+ transition: all 0.3s ease;
143
+ }
144
+
145
+ .node:hover .node-label {
146
+ fill: #4299e1;
147
+ }
148
+
149
+ /* Node Type Colors */
150
+ .node-project .node-circle {
151
+ fill: #4299e1;
152
+ stroke: #2c5282;
153
+ }
154
+
155
+ .node-session .node-circle {
156
+ fill: #38a169;
157
+ stroke: #276749;
158
+ }
159
+
160
+ .node-todo .node-circle {
161
+ fill: #ed8936;
162
+ stroke: #c05621;
163
+ }
164
+
165
+ .node-agent .node-circle {
166
+ fill: #9f7aea;
167
+ stroke: #6b46c1;
168
+ }
169
+
170
+ .node-tool .node-circle {
171
+ fill: #e53e3e;
172
+ stroke: #c53030;
173
+ }
174
+
175
+ /* Status Badges */
176
+ .status-badge {
177
+ transition: all 0.3s ease;
178
+ }
179
+
180
+ .status-text {
181
+ font-size: 10px;
182
+ font-weight: 600;
183
+ text-transform: uppercase;
184
+ letter-spacing: 0.5px;
185
+ pointer-events: none;
186
+ }
187
+
188
+ /* Links */
189
+ .link {
190
+ transition: all 0.3s ease;
191
+ }
192
+
193
+ .node:hover .link {
194
+ stroke: #4299e1;
195
+ stroke-width: 3px;
196
+ }
197
+
198
+ /* D3 Tooltip */
199
+ .d3-tooltip {
200
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
201
+ line-height: 1.4;
202
+ max-width: 250px;
203
+ word-wrap: break-word;
204
+ }
205
+
206
+ /* Legacy Tree Styles - Keep for fallback */
207
+ .linear-tree {
208
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', monospace;
209
+ line-height: 1.6;
210
+ padding: 15px;
211
+ min-height: 100%;
212
+ }
213
+
214
+ /* Tree Node Base Styles */
215
+ .tree-node {
216
+ margin: 2px 0;
217
+ border-radius: 4px;
218
+ transition: background-color 0.2s ease;
219
+ }
220
+
221
+ .tree-node:hover {
222
+ background-color: #f7fafc;
223
+ }
224
+
225
+ .tree-node-content {
120
226
  display: flex;
121
227
  align-items: center;
228
+ padding: 6px 8px;
122
229
  gap: 8px;
123
- margin-bottom: 5px;
230
+ cursor: pointer;
231
+ border-radius: 4px;
232
+ transition: all 0.2s ease;
233
+ }
234
+
235
+ .tree-node-content:hover {
236
+ background-color: #edf2f7;
237
+ }
238
+
239
+ /* Tree Indentation */
240
+ .tree-node[data-level="1"] {
241
+ margin-left: 20px;
242
+ }
243
+
244
+ .tree-node[data-level="2"] {
245
+ margin-left: 40px;
246
+ }
247
+
248
+ .tree-node[data-level="3"] {
249
+ margin-left: 60px;
250
+ }
251
+
252
+ .tree-node[data-level="4"] {
253
+ margin-left: 80px;
254
+ }
255
+
256
+ /* Tree Icons */
257
+ .tree-icon {
258
+ font-size: 16px;
259
+ width: 20px;
260
+ text-align: center;
261
+ flex-shrink: 0;
262
+ }
263
+
264
+ .tree-expand-icon {
124
265
  font-size: 12px;
266
+ width: 16px;
267
+ text-align: center;
268
+ flex-shrink: 0;
269
+ cursor: pointer;
270
+ color: #718096;
271
+ transition: transform 0.2s ease;
272
+ }
273
+
274
+ .tree-expand-icon:hover {
125
275
  color: #4a5568;
276
+ transform: scale(1.2);
126
277
  }
127
278
 
128
- .legend-item:last-child {
129
- margin-bottom: 0;
279
+ /* Tree Labels and Text */
280
+ .tree-label {
281
+ flex-grow: 1;
282
+ font-size: 14px;
283
+ color: #2d3748;
284
+ font-weight: 500;
130
285
  }
131
286
 
132
- .legend-icon {
133
- width: 14px;
134
- height: 14px;
135
- display: inline-block;
136
- text-align: center;
287
+ .tree-label.clickable {
288
+ cursor: pointer;
289
+ transition: all 0.2s ease;
290
+ border-radius: 3px;
291
+ padding: 2px 4px;
137
292
  }
138
293
 
139
- .legend-icon.pm {
140
- color: #4A90E2;
294
+ .tree-label.clickable:hover {
295
+ background-color: #e2e8f0;
296
+ color: #2c5282;
141
297
  }
142
298
 
143
- .legend-icon.todowrite {
144
- color: #9B59B6;
299
+ .tree-meta {
300
+ font-size: 12px;
301
+ color: #718096;
302
+ font-style: italic;
303
+ margin-left: auto;
145
304
  }
146
305
 
147
- .legend-icon.agent {
148
- color: #27AE60;
306
+ .tree-params {
307
+ font-size: 11px;
308
+ color: #4a5568;
309
+ background: #edf2f7;
310
+ padding: 2px 6px;
311
+ border-radius: 3px;
312
+ max-width: 200px;
313
+ overflow: hidden;
314
+ text-overflow: ellipsis;
315
+ white-space: nowrap;
149
316
  }
150
317
 
151
- .legend-icon.tool {
152
- color: #E67E22;
318
+ .tree-status {
319
+ font-size: 11px;
320
+ padding: 2px 6px;
321
+ border-radius: 12px;
322
+ font-weight: 600;
323
+ text-transform: uppercase;
324
+ letter-spacing: 0.5px;
325
+ margin-left: 8px;
153
326
  }
154
327
 
155
- .legend-icon.file {
156
- color: #95A5A6;
328
+ /* Tree Children */
329
+ .tree-children {
330
+ margin-left: 0;
331
+ border-left: 1px solid #e2e8f0;
332
+ margin-left: 20px;
333
+ padding-left: 0;
334
+ }
335
+
336
+ /* Node Type Styles */
337
+
338
+ /* Project Root */
339
+ .tree-node.project-root {
340
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
341
+ color: white;
342
+ margin-bottom: 10px;
343
+ border-radius: 6px;
344
+ }
345
+
346
+ .tree-node.project-root .tree-node-content {
347
+ padding: 10px 12px;
348
+ }
349
+
350
+ .tree-node.project-root .tree-label {
351
+ color: white;
352
+ font-weight: 600;
353
+ font-size: 16px;
354
+ }
355
+
356
+ .tree-node.project-root .tree-meta {
357
+ color: rgba(255, 255, 255, 0.8);
157
358
  }
158
359
 
159
- /* Breadcrumb */
160
- .activity-breadcrumb {
161
- padding: 10px 15px;
360
+ /* Session Nodes */
361
+ .tree-node.session {
162
362
  background: #f8f9fa;
363
+ border: 1px solid #e9ecef;
364
+ margin-bottom: 8px;
163
365
  border-radius: 6px;
164
- margin-top: 15px;
165
- font-size: 13px;
166
- color: #4a5568;
167
- font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
168
366
  }
169
367
 
170
- /* D3 Tree Styles */
171
- .node {
172
- cursor: pointer;
368
+ .tree-node.session .tree-node-content {
369
+ padding: 8px 12px;
370
+ font-weight: 600;
173
371
  }
174
372
 
175
- .node circle,
176
- .node-circle {
177
- stroke-width: 2px;
178
- transition: all 0.3s;
373
+ .tree-node.session .tree-icon {
374
+ font-size: 18px;
179
375
  }
180
376
 
181
- .node rect {
182
- stroke-width: 2px;
183
- transition: all 0.3s;
377
+ .tree-node.session .tree-label {
378
+ font-size: 15px;
379
+ color: #495057;
184
380
  }
185
381
 
186
- .node.pm circle {
187
- fill: #4A90E2;
188
- stroke: #2E6BC0;
382
+ /* Todo Nodes */
383
+ .tree-node.todo {
384
+ border-left: 3px solid #cbd5e0;
385
+ margin: 4px 0;
189
386
  }
190
387
 
191
- .node.todowrite rect {
192
- fill: #9B59B6;
193
- stroke: #7E3E93;
194
- rx: 4;
388
+ .tree-node.todo.status-pending {
389
+ border-left-color: #cbd5e0;
390
+ background: #f8f9fa;
195
391
  }
196
392
 
197
- .node.agent circle {
198
- fill: #27AE60;
199
- stroke: #1A8847;
393
+ .tree-node.todo.status-in_progress {
394
+ border-left-color: #3182ce;
395
+ background: #ebf8ff;
200
396
  }
201
397
 
202
- .node.tool circle {
203
- fill: #E67E22;
204
- stroke: #C35D0B;
398
+ .tree-node.todo.status-completed {
399
+ border-left-color: #38a169;
400
+ background: #f0fff4;
205
401
  }
206
402
 
207
- .node.file circle,
208
- .node.command circle {
209
- fill: #95A5A6;
210
- stroke: #728384;
211
- r: 5;
403
+ /* Agent Nodes */
404
+ .tree-node.agent {
405
+ background: #fef5e7;
406
+ border-left: 2px solid #ed8936;
407
+ margin: 2px 0;
408
+ cursor: pointer;
409
+ transition: all 0.2s ease;
212
410
  }
213
411
 
214
- /* Collapsed node indicator */
215
- .node.collapsed circle {
216
- fill: white !important;
217
- stroke-width: 3px;
412
+ .tree-node.agent:hover {
413
+ background: #fed7aa;
414
+ transform: translateX(2px);
415
+ box-shadow: 0 2px 4px rgba(237, 137, 54, 0.2);
218
416
  }
219
417
 
220
- .node.collapsed rect {
221
- fill: white !important;
222
- stroke-width: 3px;
418
+ .tree-node.agent.selected {
419
+ background: #fed7aa;
420
+ border-left-color: #c05621;
421
+ border-left-width: 4px;
422
+ box-shadow: 0 4px 8px rgba(192, 86, 33, 0.3);
223
423
  }
224
424
 
225
- /* Active/In-progress animation */
226
- @keyframes pulse {
227
- 0% {
228
- opacity: 1;
229
- transform: scale(1);
230
- }
231
- 50% {
232
- opacity: 0.7;
233
- transform: scale(1.1);
234
- }
235
- 100% {
236
- opacity: 1;
237
- transform: scale(1);
238
- }
425
+ .tree-node.agent.status-active {
426
+ background: #fef5e7;
427
+ border-left-color: #ed8936;
239
428
  }
240
429
 
241
- .node.active circle,
242
- .node.active rect {
243
- animation: pulse 2s infinite;
430
+ .tree-node.agent.status-completed {
431
+ background: #f0fff4;
432
+ border-left-color: #38a169;
244
433
  }
245
434
 
246
- .node.in-progress circle,
247
- .node.in-progress rect {
248
- animation: pulse 1.5s infinite;
249
- stroke: #F39C12;
250
- stroke-width: 3px;
435
+ /* Tool Nodes - Maximum Specificity to Override Any Conflicting Styles */
436
+ body .activity-tree-container .linear-tree .tree-node.tool,
437
+ .tree-node.tool {
438
+ background: #faf5ff !important;
439
+ border-left: 2px solid #9f7aea !important;
440
+ margin: 1px 0 !important;
441
+ cursor: pointer !important;
442
+ transition: all 0.2s ease !important;
251
443
  }
252
444
 
253
- /* Failed/Error state */
254
- .node.failed circle,
255
- .node.failed rect {
256
- stroke: #E74C3C !important;
257
- stroke-width: 3px;
258
- fill: #FFE5E5 !important;
445
+ body .activity-tree-container .linear-tree .tree-node.tool:hover,
446
+ .tree-node.tool:hover {
447
+ background: #f3e8ff !important;
448
+ transform: translateX(2px) !important;
449
+ box-shadow: 0 2px 4px rgba(159, 122, 234, 0.2) !important;
259
450
  }
260
451
 
261
- /* Node type specific circle colors */
262
- .node-circle.pm {
263
- fill: #4A90E2;
264
- stroke: #2E6BC0;
452
+ body .activity-tree-container .linear-tree .tree-node.tool.selected,
453
+ .tree-node.tool.selected {
454
+ background: #e9d8fd !important;
455
+ border-left-color: #7c3aed !important;
456
+ border-left-width: 4px !important;
457
+ box-shadow: 0 4px 8px rgba(124, 58, 237, 0.3) !important;
265
458
  }
266
459
 
267
- .node-circle.todowrite {
268
- fill: #9B59B6;
269
- stroke: #7E3E93;
460
+ /* Tool Status Styles - Maximum Specificity to Override Any Other Rules */
461
+ body .activity-tree-container .linear-tree .tree-node.tool.status-pending,
462
+ .tree-node.tool.status-pending {
463
+ background: #faf5ff !important;
464
+ border-left-color: #9f7aea !important;
465
+ border-left-width: 2px !important;
270
466
  }
271
467
 
272
- .node-circle.agent {
273
- fill: #27AE60;
274
- stroke: #1A8847;
468
+ body .activity-tree-container .linear-tree .tree-node.tool.status-in_progress,
469
+ .tree-node.tool.status-in_progress {
470
+ background: #e6fffa !important;
471
+ border-left-color: #38b2ac !important;
472
+ border-left-width: 3px !important;
275
473
  }
276
474
 
277
- .node-circle.tool {
278
- fill: #E67E22;
279
- stroke: #C35D0B;
475
+ body .activity-tree-container .linear-tree .tree-node.tool.status-completed,
476
+ .tree-node.tool.status-completed {
477
+ background: #f0fff4 !important;
478
+ border-left-color: #38a169 !important;
479
+ border-left-width: 2px !important;
280
480
  }
281
481
 
282
- .node-circle.file,
283
- .node-circle.command,
284
- .node-circle.url {
285
- fill: #95A5A6;
286
- stroke: #728384;
482
+ body .activity-tree-container .linear-tree .tree-node.tool.status-failed,
483
+ .tree-node.tool.status-failed {
484
+ background: #fed7d7 !important;
485
+ border-left-color: #e53e3e !important;
486
+ border-left-width: 2px !important;
287
487
  }
288
488
 
289
- /* Pulsing animation for in-progress nodes */
290
- .node-circle.pulsing {
291
- animation: pulse 1.5s infinite;
489
+ /* Privileged Tool (TodoWrite) - High Specificity */
490
+ body .activity-tree-container .linear-tree .tree-node.tool.privileged-tool,
491
+ .tree-node.tool.privileged-tool {
492
+ background: #fff8e1 !important;
493
+ border-left: 3px solid #ff9800 !important;
494
+ border-radius: 6px !important;
495
+ margin: 4px 0 !important;
292
496
  }
293
497
 
294
- /* Failed state */
295
- .node-circle.failed {
296
- stroke: #E74C3C !important;
297
- stroke-width: 3px;
298
- fill: #FFE5E5 !important;
498
+ body .activity-tree-container .linear-tree .tree-node.tool.privileged-tool .tree-label,
499
+ .tree-node.tool.privileged-tool .tree-label {
500
+ font-weight: 600 !important;
501
+ color: #e65100 !important;
299
502
  }
300
503
 
301
- /* Node text */
302
- .node text {
303
- font: 12px 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
304
- pointer-events: none;
305
- user-select: none;
504
+ body .activity-tree-container .linear-tree .tree-node.tool.privileged-tool .tree-params,
505
+ .tree-node.tool.privileged-tool .tree-params {
506
+ background: #ffe0b2 !important;
507
+ color: #e65100 !important;
508
+ font-weight: 500 !important;
306
509
  }
307
510
 
308
- /* Node icons and labels */
309
- .node-icon {
310
- font-size: 14px;
311
- pointer-events: none;
511
+ /* Catch-all rule to prevent any other styles from overriding tool styling */
512
+ .tree-node.tool:not(.privileged-tool) {
513
+ background: #faf5ff !important;
514
+ border-left: 2px solid #9f7aea !important;
312
515
  }
313
516
 
314
- .node-label {
315
- fill: #2d3748;
316
- font-size: 12px;
517
+ .tree-node.tool:not(.privileged-tool).status-pending {
518
+ background: #faf5ff !important;
519
+ border-left-color: #9f7aea !important;
317
520
  }
318
521
 
319
- .node.pm text {
320
- font-weight: bold;
321
- font-size: 14px;
522
+ .tree-node.tool:not(.privileged-tool).status-in_progress {
523
+ background: #e6fffa !important;
524
+ border-left-color: #38b2ac !important;
525
+ border-left-width: 3px !important;
322
526
  }
323
527
 
324
- .node.todowrite text {
325
- font-size: 11px;
528
+ .tree-node.tool:not(.privileged-tool).status-completed {
529
+ background: #f0fff4 !important;
530
+ border-left-color: #38a169 !important;
326
531
  }
327
532
 
328
- /* Node hover effects */
329
- .node:hover circle,
330
- .node:hover rect {
331
- stroke-width: 3px;
332
- filter: brightness(1.1);
333
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
533
+ .tree-node.tool:not(.privileged-tool).status-failed {
534
+ background: #fed7d7 !important;
535
+ border-left-color: #e53e3e !important;
334
536
  }
335
537
 
336
- /* Links */
337
- .link {
338
- fill: none;
339
- stroke: #cbd5e0;
340
- stroke-width: 1.5px;
341
- stroke-dasharray: none;
538
+ /* Todo Items within TodoWrite tool */
539
+ .tree-node.todo-item {
540
+ background: #f8f9fa;
541
+ border-left: 2px solid #cbd5e0;
542
+ margin: 1px 0;
543
+ border-radius: 3px;
342
544
  }
343
545
 
344
- .link.delegation {
345
- stroke: #9B59B6;
346
- stroke-width: 2px;
347
- stroke-dasharray: 5, 3;
546
+ .tree-node.todo-item.status-pending {
547
+ border-left-color: #cbd5e0;
548
+ background: #f8f9fa;
348
549
  }
349
550
 
350
- /* Tooltip */
351
- .activity-tooltip {
352
- position: absolute;
353
- text-align: left;
354
- padding: 10px;
355
- font-size: 12px;
356
- background: rgba(0, 0, 0, 0.9);
357
- color: white;
358
- border-radius: 6px;
359
- pointer-events: none;
360
- max-width: 300px;
361
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
362
- z-index: 1000;
551
+ .tree-node.todo-item.status-in_progress {
552
+ border-left-color: #3182ce;
553
+ background: #ebf8ff;
554
+ animation: pulse-todo 2s infinite;
363
555
  }
364
556
 
365
- .activity-tooltip .tooltip-title {
366
- font-weight: bold;
367
- margin-bottom: 5px;
368
- padding-bottom: 5px;
369
- border-bottom: 1px solid rgba(255, 255, 255, 0.2);
557
+ .tree-node.todo-item.status-completed {
558
+ border-left-color: #38a169;
559
+ background: #f0fff4;
560
+ }
561
+
562
+ @keyframes pulse-todo {
563
+ 0% {
564
+ background: #ebf8ff;
565
+ }
566
+ 50% {
567
+ background: #bee3f8;
568
+ }
569
+ 100% {
570
+ background: #ebf8ff;
571
+ }
370
572
  }
371
573
 
372
- .activity-tooltip .tooltip-item {
373
- margin: 3px 0;
574
+ /* Status Badges */
575
+ .tree-status.status-pending {
576
+ background: #e2e8f0;
577
+ color: #4a5568;
374
578
  }
375
579
 
376
- .activity-tooltip .tooltip-label {
377
- color: #9ca3af;
378
- margin-right: 5px;
580
+ .tree-status.status-in_progress {
581
+ background: #bee3f8;
582
+ color: #2c5282;
583
+ animation: pulse-status 2s infinite;
379
584
  }
380
585
 
381
- .activity-tooltip .tooltip-value {
382
- color: #f3f4f6;
586
+ .tree-status.status-active {
587
+ background: #fbb6ce;
588
+ color: #97266d;
589
+ animation: pulse-status 2s infinite;
383
590
  }
384
591
 
385
- /* Count badges */
386
- .node-count {
387
- fill: #E74C3C;
388
- font-size: 10px;
389
- font-weight: bold;
390
- text-anchor: middle;
592
+ .tree-status.status-completed {
593
+ background: #c6f6d5;
594
+ color: #276749;
391
595
  }
392
596
 
393
- .node-badge {
394
- fill: #E74C3C;
395
- stroke: white;
396
- stroke-width: 2px;
597
+ .tree-status.status-failed {
598
+ background: #fed7d7;
599
+ color: #c53030;
397
600
  }
398
601
 
399
- /* Search highlighting */
400
- .node.search-match circle,
401
- .node.search-match rect {
402
- stroke: #F39C12 !important;
403
- stroke-width: 4px !important;
404
- filter: drop-shadow(0 0 8px rgba(243, 156, 18, 0.6));
602
+ /* Status Animation */
603
+ @keyframes pulse-status {
604
+ 0% {
605
+ opacity: 1;
606
+ }
607
+ 50% {
608
+ opacity: 0.7;
609
+ }
610
+ 100% {
611
+ opacity: 1;
612
+ }
405
613
  }
406
614
 
407
- /* Zoom controls */
408
- .zoom-controls {
615
+ /* Tree Legend */
616
+ .tree-legend {
409
617
  position: absolute;
410
- bottom: 15px;
618
+ top: 15px;
411
619
  right: 15px;
412
- display: flex;
413
- flex-direction: column;
414
- gap: 5px;
415
- }
416
-
417
- .zoom-btn {
418
- width: 36px;
419
- height: 36px;
420
- background: white;
620
+ background: rgba(255, 255, 255, 0.95);
421
621
  border: 1px solid #e2e8f0;
422
622
  border-radius: 6px;
423
- cursor: pointer;
623
+ padding: 10px;
624
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
625
+ }
626
+
627
+ .legend-item {
424
628
  display: flex;
425
629
  align-items: center;
426
- justify-content: center;
427
- font-size: 18px;
428
- transition: all 0.2s;
630
+ gap: 8px;
631
+ margin-bottom: 5px;
632
+ font-size: 12px;
633
+ color: #4a5568;
429
634
  }
430
635
 
431
- .zoom-btn:hover {
432
- background: #f8f9fa;
433
- transform: scale(1.1);
636
+ .legend-item:last-child {
637
+ margin-bottom: 0;
434
638
  }
435
639
 
436
- /* Expand/Collapse indicators */
437
- .expand-indicator {
438
- fill: #718096;
439
- font-size: 14px;
440
- font-weight: bold;
441
- text-anchor: middle;
442
- pointer-events: none;
640
+ .legend-icon {
641
+ width: 14px;
642
+ height: 14px;
643
+ display: inline-block;
644
+ text-align: center;
443
645
  }
444
646
 
445
- /* Performance optimization for large trees */
446
- .node.hidden {
447
- display: none;
647
+ .legend-icon.pm {
648
+ color: #4A90E2;
448
649
  }
449
650
 
450
- .link.hidden {
451
- display: none;
651
+ .legend-icon.todowrite {
652
+ color: #9B59B6;
452
653
  }
453
654
 
454
- /* Tree grid background (optional) */
455
- .tree-grid {
456
- stroke: #f0f0f0;
457
- stroke-width: 0.5px;
458
- fill: none;
655
+ .legend-icon.agent {
656
+ color: #27AE60;
459
657
  }
460
658
 
461
- /* Time indicators */
462
- .node-time {
463
- fill: #718096;
464
- font-size: 10px;
465
- font-style: italic;
659
+ .legend-icon.tool {
660
+ color: #E67E22;
466
661
  }
467
662
 
468
- /* Status indicators */
469
- .status-indicator {
470
- stroke-width: 0;
663
+ .legend-icon.file {
664
+ color: #95A5A6;
471
665
  }
472
666
 
473
- .status-indicator.pending {
474
- fill: #CBD5E0;
667
+ /* Search Highlighting - Ensure this doesn't affect tools */
668
+ .tree-node.search-match:not(.tool) {
669
+ background: #fff3cd !important;
670
+ border-left-color: #ffc107 !important;
475
671
  }
476
672
 
477
- .status-indicator.in-progress {
478
- fill: #F39C12;
673
+ .tree-node.search-match:not(.tool) .tree-label {
674
+ background: #ffecb5;
675
+ padding: 2px 4px;
676
+ border-radius: 3px;
479
677
  }
480
678
 
481
- .status-indicator.completed {
482
- fill: #27AE60;
679
+ /* Empty State */
680
+ .linear-tree:empty::after {
681
+ content: "No activity data available. Start using the PM to see the activity tree.";
682
+ display: block;
683
+ text-align: center;
684
+ color: #718096;
685
+ font-style: italic;
686
+ padding: 40px 20px;
483
687
  }
484
688
 
485
- .status-indicator.failed {
486
- fill: #E74C3C;
689
+ /* Scrollbar Styles */
690
+ .activity-tree-container::-webkit-scrollbar {
691
+ width: 8px;
487
692
  }
488
693
 
489
- /* Responsive adjustments */
694
+ .activity-tree-container::-webkit-scrollbar-track {
695
+ background: #f1f1f1;
696
+ border-radius: 4px;
697
+ }
698
+
699
+ .activity-tree-container::-webkit-scrollbar-thumb {
700
+ background: #c1c1c1;
701
+ border-radius: 4px;
702
+ }
703
+
704
+ .activity-tree-container::-webkit-scrollbar-thumb:hover {
705
+ background: #a8a8a8;
706
+ }
707
+
708
+ /* User instruction styles */
709
+ .tree-node.user-instruction {
710
+ background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);
711
+ border-left: 4px solid #2196f3;
712
+ cursor: pointer;
713
+ transition: all 0.2s ease;
714
+ }
715
+
716
+ .tree-node.user-instruction.selected {
717
+ background: linear-gradient(135deg, #bbdefb 0%, #90caf9 100%);
718
+ border-left-color: #1976d2;
719
+ box-shadow: 0 4px 8px rgba(25, 118, 210, 0.3);
720
+ }
721
+
722
+ .tree-node.user-instruction:hover {
723
+ background: linear-gradient(135deg, #bbdefb 0%, #90caf9 100%);
724
+ box-shadow: 0 4px 8px rgba(33, 150, 243, 0.2);
725
+ }
726
+
727
+ .tree-node.user-instruction .tree-label {
728
+ font-style: italic;
729
+ color: #1976d2;
730
+ }
731
+
732
+ /* TODO checklist styles */
733
+ .tree-node.todo-checklist {
734
+ background: linear-gradient(135deg, #f3e5f5 0%, #e1bee7 100%);
735
+ border-left: 4px solid #9c27b0;
736
+ font-weight: 600;
737
+ }
738
+
739
+ .tree-node.todo-checklist:hover {
740
+ background: linear-gradient(135deg, #e1bee7 0%, #ce93d8 100%);
741
+ box-shadow: 0 4px 8px rgba(156, 39, 176, 0.2);
742
+ }
743
+
744
+ .tree-node.todo-checklist .tree-label {
745
+ color: #7b1fa2;
746
+ font-weight: bold;
747
+ }
748
+
749
+ /* Enhanced TODO item styles */
750
+ .tree-node.todo-item {
751
+ margin: 2px 0;
752
+ border-radius: 4px;
753
+ transition: all 0.2s ease;
754
+ }
755
+
756
+ .tree-node.todo-item.status-pending {
757
+ background: linear-gradient(135deg, #f7fafc 0%, #e2e8f0 20%);
758
+ border-left: 3px solid #a0aec0;
759
+ }
760
+
761
+ .tree-node.todo-item.status-in_progress {
762
+ background: linear-gradient(135deg, #e8f5e8 0%, #a5d6a7 20%);
763
+ border-left: 3px solid #4caf50;
764
+ animation: pulse 2s infinite;
765
+ }
766
+
767
+ .tree-node.todo-item.status-completed {
768
+ background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 20%);
769
+ border-left: 3px solid #2e7d32;
770
+ opacity: 0.8;
771
+ }
772
+
773
+ .tree-node.todo-item.status-completed .tree-label {
774
+ text-decoration: line-through;
775
+ color: #666;
776
+ }
777
+
778
+ /* Instruction and todo item detail styles */
779
+ .instruction-details,
780
+ .generic-details,
781
+ .tool-details,
782
+ .agent-details {
783
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', monospace;
784
+ font-size: 12px;
785
+ }
786
+
787
+ .detail-row {
788
+ display: flex;
789
+ margin-bottom: 12px;
790
+ padding: 8px 0;
791
+ border-bottom: 1px solid #f0f0f0;
792
+ align-items: flex-start;
793
+ }
794
+
795
+ .detail-label {
796
+ font-weight: bold;
797
+ color: #4a5568;
798
+ width: 120px;
799
+ flex-shrink: 0;
800
+ line-height: 1.4;
801
+ }
802
+
803
+ .detail-value {
804
+ color: #2d3748;
805
+ word-break: break-word;
806
+ flex: 1;
807
+ line-height: 1.4;
808
+ }
809
+
810
+ .detail-section {
811
+ margin-top: 20px;
812
+ padding-top: 16px;
813
+ border-top: 2px solid #e2e8f0;
814
+ }
815
+
816
+ .detail-section-title {
817
+ font-weight: bold;
818
+ color: #2d3748;
819
+ margin-bottom: 12px;
820
+ display: block;
821
+ font-size: 14px;
822
+ }
823
+
824
+ .params-list {
825
+ background: #f7fafc;
826
+ border-radius: 6px;
827
+ padding: 12px;
828
+ border: 1px solid #e2e8f0;
829
+ }
830
+
831
+ .param-item {
832
+ margin-bottom: 16px;
833
+ padding-bottom: 12px;
834
+ border-bottom: 1px solid #e2e8f0;
835
+ }
836
+
837
+ .param-item:last-child {
838
+ margin-bottom: 0;
839
+ padding-bottom: 0;
840
+ border-bottom: none;
841
+ }
842
+
843
+ .param-key {
844
+ font-weight: bold;
845
+ color: #553c9a;
846
+ margin-bottom: 4px;
847
+ display: block;
848
+ font-size: 12px;
849
+ }
850
+
851
+ .param-value {
852
+ color: #2d3748;
853
+ }
854
+
855
+ .param-text-short {
856
+ background: #ffffff;
857
+ padding: 4px 8px;
858
+ border-radius: 3px;
859
+ border: 1px solid #cbd5e0;
860
+ display: inline-block;
861
+ font-family: inherit;
862
+ }
863
+
864
+ .param-text,
865
+ .param-text-long {
866
+ background: #ffffff;
867
+ border: 1px solid #cbd5e0;
868
+ border-radius: 4px;
869
+ padding: 8px;
870
+ margin: 4px 0;
871
+ white-space: pre-wrap;
872
+ word-wrap: break-word;
873
+ font-size: 11px;
874
+ line-height: 1.4;
875
+ max-height: 200px;
876
+ overflow-y: auto;
877
+ }
878
+
879
+ .param-json {
880
+ background: #f8f9fa;
881
+ border: 1px solid #d6d8db;
882
+ border-radius: 4px;
883
+ padding: 8px;
884
+ margin: 4px 0;
885
+ white-space: pre;
886
+ font-size: 11px;
887
+ line-height: 1.3;
888
+ max-height: 300px;
889
+ overflow: auto;
890
+ color: #24292e;
891
+ }
892
+
893
+ .param-primitive {
894
+ background: #edf2f7;
895
+ padding: 2px 6px;
896
+ border-radius: 3px;
897
+ font-weight: 500;
898
+ color: #2d3748;
899
+ }
900
+
901
+ .param-error {
902
+ background: #fed7d7;
903
+ padding: 4px 8px;
904
+ border-radius: 3px;
905
+ color: #c53030;
906
+ font-style: italic;
907
+ }
908
+
909
+ .status-badge {
910
+ display: inline-block;
911
+ padding: 3px 8px;
912
+ border-radius: 12px;
913
+ font-size: 11px;
914
+ font-weight: 600;
915
+ text-transform: capitalize;
916
+ letter-spacing: 0.5px;
917
+ }
918
+
919
+ .status-badge.status-pending {
920
+ background: #e2e8f0;
921
+ color: #4a5568;
922
+ }
923
+
924
+ .status-badge.status-in_progress {
925
+ background: #bee3f8;
926
+ color: #2c5282;
927
+ }
928
+
929
+ .status-badge.status-completed {
930
+ background: #c6f6d5;
931
+ color: #276749;
932
+ }
933
+
934
+ .status-badge.status-failed {
935
+ background: #fed7d7;
936
+ color: #c53030;
937
+ }
938
+
939
+ .status-badge.status-active {
940
+ background: #fbb6ce;
941
+ color: #97266d;
942
+ }
943
+
944
+ .tool-result {
945
+ background: #f8f9fa;
946
+ border: 1px solid #d6d8db;
947
+ border-radius: 4px;
948
+ padding: 12px;
949
+ margin: 8px 0;
950
+ white-space: pre-wrap;
951
+ font-size: 11px;
952
+ line-height: 1.4;
953
+ max-height: 400px;
954
+ overflow: auto;
955
+ color: #24292e;
956
+ }
957
+
958
+ /* Pulse animation for in-progress items */
959
+ @keyframes pulse {
960
+ 0% {
961
+ box-shadow: 0 0 0 0 rgba(76, 175, 80, 0.4);
962
+ }
963
+ 70% {
964
+ box-shadow: 0 0 0 4px rgba(76, 175, 80, 0);
965
+ }
966
+ 100% {
967
+ box-shadow: 0 0 0 0 rgba(76, 175, 80, 0);
968
+ }
969
+ }
970
+
971
+ /* Responsive adjustments */
490
972
  @media (max-width: 1024px) {
491
973
  .activity-header {
492
974
  flex-direction: column;
@@ -496,12 +978,61 @@
496
978
  .activity-controls {
497
979
  width: 100%;
498
980
  flex-wrap: wrap;
981
+ justify-content: center;
499
982
  }
500
983
 
501
984
  .tree-legend {
502
- top: auto;
503
- bottom: 15px;
504
- right: 15px;
985
+ position: static;
986
+ margin-top: 15px;
987
+ max-width: 300px;
988
+ }
989
+
990
+ .tree-params {
991
+ max-width: 150px;
992
+ }
993
+
994
+ .activity-controls input {
995
+ width: 150px;
996
+ }
997
+ }
998
+
999
+ @media (max-width: 768px) {
1000
+ .activity-container {
1001
+ padding: 10px;
1002
+ }
1003
+
1004
+ .activity-tree-container {
1005
+ padding: 0;
1006
+ }
1007
+
1008
+ .linear-tree {
1009
+ padding: 10px;
1010
+ }
1011
+
1012
+ .tree-node[data-level="1"] {
1013
+ margin-left: 15px;
1014
+ }
1015
+
1016
+ .tree-node[data-level="2"] {
1017
+ margin-left: 30px;
1018
+ }
1019
+
1020
+ .tree-node[data-level="3"] {
1021
+ margin-left: 45px;
1022
+ }
1023
+
1024
+ .tree-node[data-level="4"] {
1025
+ margin-left: 60px;
1026
+ }
1027
+
1028
+ .tree-params {
1029
+ max-width: 100px;
1030
+ }
1031
+
1032
+ .stat-item {
1033
+ flex-direction: column;
1034
+ gap: 2px;
1035
+ text-align: center;
505
1036
  }
506
1037
  }
507
1038
 
@@ -509,6 +1040,34 @@
509
1040
  @media (prefers-color-scheme: dark) {
510
1041
  .activity-tree-container {
511
1042
  background: #1a202c;
1043
+ color: #e2e8f0;
1044
+ }
1045
+
1046
+ /* D3 Dark Mode Styles */
1047
+ #activity-tree-svg {
1048
+ background: #1a202c;
1049
+ }
1050
+
1051
+ .node-label {
1052
+ fill: #e2e8f0;
1053
+ }
1054
+
1055
+ .node:hover .node-label {
1056
+ fill: #63b3ed;
1057
+ }
1058
+
1059
+ .link {
1060
+ stroke: #4a5568;
1061
+ }
1062
+
1063
+ .node:hover .link {
1064
+ stroke: #63b3ed;
1065
+ }
1066
+
1067
+ .d3-tooltip {
1068
+ background: rgba(45, 55, 72, 0.95) !important;
1069
+ color: #e2e8f0 !important;
1070
+ border: 1px solid #4a5568;
512
1071
  }
513
1072
 
514
1073
  .activity-header {
@@ -539,11 +1098,424 @@
539
1098
  color: #e2e8f0;
540
1099
  }
541
1100
 
542
- .node text {
543
- fill: #e2e8f0;
1101
+ .tree-node:hover {
1102
+ background-color: #2d3748;
544
1103
  }
545
1104
 
546
- .link {
547
- stroke: #4a5568;
1105
+ .tree-node-content:hover {
1106
+ background-color: #4a5568;
1107
+ }
1108
+
1109
+ .tree-label {
1110
+ color: #e2e8f0;
1111
+ }
1112
+
1113
+ .tree-meta {
1114
+ color: #a0aec0;
1115
+ }
1116
+
1117
+ .tree-node.project-root {
1118
+ background: linear-gradient(135deg, #4299e1 0%, #553c9a 100%);
1119
+ }
1120
+
1121
+ .tree-node.session {
1122
+ background: #2d3748;
1123
+ border-color: #4a5568;
1124
+ }
1125
+
1126
+ .tree-node.session .tree-label {
1127
+ color: #e2e8f0;
1128
+ }
1129
+
1130
+ .tree-children {
1131
+ border-left-color: #4a5568;
1132
+ }
1133
+
1134
+ .tree-label.clickable:hover {
1135
+ background-color: rgba(74, 85, 104, 0.5);
1136
+ color: #e2e8f0;
1137
+ }
1138
+
1139
+ .module-item-details {
1140
+ color: #e2e8f0;
1141
+ }
1142
+
1143
+ .module-item-header {
1144
+ border-bottom-color: #4a5568;
1145
+ }
1146
+
1147
+ .module-item-header h6 {
1148
+ color: #e2e8f0;
548
1149
  }
1150
+
1151
+ .detail-label {
1152
+ color: #a0aec0;
1153
+ }
1154
+
1155
+ .detail-value {
1156
+ color: #e2e8f0;
1157
+ }
1158
+
1159
+ .detail-section {
1160
+ border-top-color: #4a5568;
1161
+ }
1162
+
1163
+ .detail-section-title {
1164
+ color: #a0aec0;
1165
+ }
1166
+
1167
+ .tools-list, .params-list {
1168
+ background: #2d3748;
1169
+ border-color: #4a5568;
1170
+ }
1171
+
1172
+ .tool-summary {
1173
+ background: #4a5568;
1174
+ border-color: #718096;
1175
+ color: #e2e8f0;
1176
+ }
1177
+
1178
+ .tool-params-expanded {
1179
+ background: #2d3748;
1180
+ border-color: #4a5568;
1181
+ color: #e2e8f0;
1182
+ }
1183
+
1184
+ .param-line .param-key,
1185
+ .param-key {
1186
+ color: #9f7aea;
1187
+ }
1188
+
1189
+ .param-line .param-value,
1190
+ .param-value {
1191
+ color: #e2e8f0;
1192
+ }
1193
+
1194
+ .param-item {
1195
+ border-bottom-color: #4a5568;
1196
+ }
1197
+
1198
+ .param-text-short {
1199
+ background: #2d3748;
1200
+ border-color: #4a5568;
1201
+ color: #e2e8f0;
1202
+ }
1203
+
1204
+ .param-text,
1205
+ .param-text-long {
1206
+ background: #2d3748;
1207
+ border-color: #4a5568;
1208
+ color: #e2e8f0;
1209
+ }
1210
+
1211
+ .param-json {
1212
+ background: #1a202c;
1213
+ border-color: #4a5568;
1214
+ color: #e2e8f0;
1215
+ }
1216
+
1217
+ .param-primitive {
1218
+ background: #4a5568;
1219
+ color: #e2e8f0;
1220
+ }
1221
+
1222
+ .param-error {
1223
+ background: #742a2a;
1224
+ color: #feb2b2;
1225
+ }
1226
+
1227
+ .tool-result {
1228
+ background: #1a202c;
1229
+ border-color: #4a5568;
1230
+ color: #e2e8f0;
1231
+ }
1232
+ }
1233
+
1234
+ /* Enhanced TodoWrite Display Styles */
1235
+
1236
+ /* Todo Summary Items */
1237
+ .todo-summary {
1238
+ display: flex;
1239
+ gap: 15px;
1240
+ margin: 15px 0;
1241
+ flex-wrap: wrap;
1242
+ }
1243
+
1244
+ .summary-item {
1245
+ display: flex;
1246
+ align-items: center;
1247
+ gap: 8px;
1248
+ padding: 8px 12px;
1249
+ background: #f8fafc;
1250
+ border-radius: 6px;
1251
+ border-left: 3px solid #e2e8f0;
1252
+ min-width: 120px;
1253
+ flex: 1;
1254
+ }
1255
+
1256
+ .summary-item.completed {
1257
+ background: #f0fff4;
1258
+ border-left-color: #38a169;
1259
+ }
1260
+
1261
+ .summary-item.in_progress {
1262
+ background: #e6fffa;
1263
+ border-left-color: #38b2ac;
1264
+ }
1265
+
1266
+ .summary-item.pending {
1267
+ background: #f7fafc;
1268
+ border-left-color: #a0aec0;
1269
+ }
1270
+
1271
+ .summary-icon {
1272
+ font-size: 16px;
1273
+ flex-shrink: 0;
1274
+ }
1275
+
1276
+ .summary-count {
1277
+ font-size: 18px;
1278
+ font-weight: bold;
1279
+ color: #2d3748;
1280
+ flex-shrink: 0;
1281
+ }
1282
+
1283
+ .summary-label {
1284
+ font-size: 12px;
1285
+ color: #718096;
1286
+ font-weight: 500;
1287
+ text-transform: uppercase;
1288
+ letter-spacing: 0.5px;
1289
+ }
1290
+
1291
+ /* Todo Checklist Items */
1292
+ .todo-checklist {
1293
+ background: #f8fafc;
1294
+ border-radius: 6px;
1295
+ border: 1px solid #e2e8f0;
1296
+ padding: 8px;
1297
+ }
1298
+
1299
+ .todo-checklist-item {
1300
+ display: flex;
1301
+ align-items: flex-start;
1302
+ gap: 12px;
1303
+ padding: 8px;
1304
+ margin: 4px 0;
1305
+ border-radius: 4px;
1306
+ transition: background 0.2s ease;
1307
+ border-left: 3px solid transparent;
1308
+ }
1309
+
1310
+ .todo-checklist-item:hover {
1311
+ background: #edf2f7;
1312
+ }
1313
+
1314
+ .todo-checklist-item.completed {
1315
+ background: #f0fff4;
1316
+ border-left-color: #38a169;
1317
+ }
1318
+
1319
+ .todo-checklist-item.in_progress {
1320
+ background: #e6fffa;
1321
+ border-left-color: #38b2ac;
1322
+ animation: pulse-todo 2s infinite;
1323
+ }
1324
+
1325
+ .todo-checklist-item.pending {
1326
+ background: #f7fafc;
1327
+ border-left-color: #cbd5e0;
1328
+ }
1329
+
1330
+ .todo-checkbox {
1331
+ flex-shrink: 0;
1332
+ width: 24px;
1333
+ height: 24px;
1334
+ display: flex;
1335
+ align-items: center;
1336
+ justify-content: center;
1337
+ border-radius: 4px;
1338
+ background: white;
1339
+ border: 2px solid #e2e8f0;
1340
+ margin-top: 2px;
1341
+ }
1342
+
1343
+ .checkbox-icon {
1344
+ font-size: 14px;
1345
+ font-weight: bold;
1346
+ }
1347
+
1348
+ .checkbox-icon.status-completed {
1349
+ color: #38a169;
1350
+ }
1351
+
1352
+ .checkbox-icon.status-in_progress {
1353
+ color: #38b2ac;
1354
+ }
1355
+
1356
+ .checkbox-icon.status-pending {
1357
+ color: #a0aec0;
1358
+ }
1359
+
1360
+ .todo-text {
1361
+ flex: 1;
1362
+ min-width: 0;
1363
+ }
1364
+
1365
+ .todo-content {
1366
+ display: block;
1367
+ font-size: 14px;
1368
+ color: #2d3748;
1369
+ line-height: 1.4;
1370
+ margin-bottom: 4px;
1371
+ word-wrap: break-word;
1372
+ }
1373
+
1374
+ .todo-checklist-item.completed .todo-content {
1375
+ text-decoration: line-through;
1376
+ color: #718096;
1377
+ }
1378
+
1379
+ .todo-status-badge {
1380
+ display: inline-block;
1381
+ padding: 2px 6px;
1382
+ font-size: 10px;
1383
+ font-weight: 600;
1384
+ text-transform: uppercase;
1385
+ letter-spacing: 0.5px;
1386
+ border-radius: 10px;
1387
+ margin-top: 2px;
1388
+ }
1389
+
1390
+ .todo-status-badge.status-completed {
1391
+ background: #c6f6d5;
1392
+ color: #276749;
1393
+ }
1394
+
1395
+ .todo-status-badge.status-in_progress {
1396
+ background: #b2f5ea;
1397
+ color: #285e61;
1398
+ }
1399
+
1400
+ .todo-status-badge.status-pending {
1401
+ background: #e2e8f0;
1402
+ color: #4a5568;
1403
+ }
1404
+
1405
+ /* No todos message */
1406
+ .no-todos {
1407
+ text-align: center;
1408
+ color: #718096;
1409
+ font-style: italic;
1410
+ padding: 20px;
1411
+ background: #f7fafc;
1412
+ border-radius: 6px;
1413
+ border: 1px dashed #cbd5e0;
1414
+ }
1415
+
1416
+ /* Animation for in-progress items */
1417
+ @keyframes pulse-todo {
1418
+ 0% {
1419
+ background: #e6fffa;
1420
+ }
1421
+ 50% {
1422
+ background: #b2f5ea;
1423
+ }
1424
+ 100% {
1425
+ background: #e6fffa;
1426
+ }
1427
+ }
1428
+
1429
+ /* Unified viewer status and headers */
1430
+ .unified-viewer-header {
1431
+ display: flex;
1432
+ justify-content: space-between;
1433
+ align-items: center;
1434
+ padding: 12px 16px;
1435
+ background: #f8fafc;
1436
+ border-bottom: 1px solid #e2e8f0;
1437
+ border-radius: 6px 6px 0 0;
1438
+ }
1439
+
1440
+ .unified-viewer-header h6 {
1441
+ margin: 0;
1442
+ font-size: 16px;
1443
+ font-weight: 600;
1444
+ color: #2d3748;
1445
+ }
1446
+
1447
+ .unified-viewer-status {
1448
+ font-size: 12px;
1449
+ font-weight: 600;
1450
+ padding: 4px 8px;
1451
+ border-radius: 12px;
1452
+ text-transform: uppercase;
1453
+ letter-spacing: 0.5px;
1454
+ }
1455
+
1456
+ .unified-viewer-content {
1457
+ padding: 16px;
1458
+ }
1459
+
1460
+ /* Responsive adjustments for TodoWrite display */
1461
+ @media (max-width: 768px) {
1462
+ .todo-summary {
1463
+ flex-direction: column;
1464
+ gap: 8px;
1465
+ }
1466
+
1467
+ .summary-item {
1468
+ min-width: auto;
1469
+ }
1470
+
1471
+ .todo-checklist-item {
1472
+ padding: 6px;
1473
+ }
1474
+
1475
+ .todo-checkbox {
1476
+ width: 20px;
1477
+ height: 20px;
1478
+ }
1479
+
1480
+ .checkbox-icon {
1481
+ font-size: 12px;
1482
+ }
1483
+ }
1484
+
1485
+ /* Print Styles */
1486
+ @media print {
1487
+ .activity-header {
1488
+ display: none;
1489
+ }
1490
+
1491
+ .tree-legend {
1492
+ position: static;
1493
+ margin-bottom: 20px;
1494
+ }
1495
+
1496
+ .activity-tree-container {
1497
+ box-shadow: none;
1498
+ border: 1px solid #000;
1499
+ }
1500
+
1501
+ .tree-node {
1502
+ break-inside: avoid;
1503
+ }
1504
+
1505
+ .tree-status {
1506
+ border: 1px solid #000;
1507
+ background: transparent !important;
1508
+ color: #000 !important;
1509
+ }
1510
+ }
1511
+
1512
+ /* Focus and Accessibility */
1513
+ .tree-node-content:focus {
1514
+ outline: 2px solid #4299e1;
1515
+ outline-offset: 2px;
1516
+ }
1517
+
1518
+ .tree-expand-icon:focus {
1519
+ outline: 2px solid #4299e1;
1520
+ outline-offset: 2px;
549
1521
  }