@qiaolei81/copilot-session-viewer 0.3.9 → 0.4.0

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.
@@ -1,783 +0,0 @@
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>Analysis - Session <%= sessionId %></title>
7
- <script src="/public/vendor/marked.umd.min.js"></script>
8
-
9
- <style>
10
- * { margin: 0; padding: 0; box-sizing: border-box; }
11
- body {
12
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
13
- background: #0d1117;
14
- color: #c9d1d9;
15
- line-height: 1.5;
16
- }
17
- .container {
18
- margin: 0 auto;
19
- padding: 0 20px;
20
- }
21
-
22
- /* Focus indicators */
23
- button:focus-visible, a:focus-visible {
24
- outline: 2px solid #58a6ff;
25
- outline-offset: 2px;
26
- box-shadow: 0 0 0 4px rgba(88, 166, 255, 0.2);
27
- }
28
-
29
- /* Header */
30
- .header {
31
- padding: 16px 20px;
32
- border-bottom: 1px solid #30363d;
33
- display: flex;
34
- align-items: center;
35
- gap: 16px;
36
- position: sticky;
37
- top: 0;
38
- background: #0d1117;
39
- z-index: 10;
40
- }
41
- .nav-btn {
42
- padding: 6px 12px;
43
- background: #21262d;
44
- border: 1px solid #30363d;
45
- border-radius: 6px;
46
- color: #c9d1d9;
47
- text-decoration: none;
48
- font-size: 14px;
49
- transition: all 0.2s;
50
- }
51
- .nav-btn:hover {
52
- background: #30363d;
53
- border-color: #58a6ff;
54
- }
55
- h1 {
56
- color: #58a6ff;
57
- font-size: 20px;
58
- flex: 1;
59
- }
60
-
61
- /* Summary cards */
62
- .summary-grid {
63
- display: grid;
64
- grid-template-columns: repeat(6, 1fr);
65
- gap: 12px;
66
- margin: 20px auto;
67
- }
68
- .summary-card {
69
- background: #161b22;
70
- border: 1px solid #30363d;
71
- border-radius: 8px;
72
- padding: 16px;
73
- }
74
- .summary-card-label {
75
- font-size: 12px;
76
- color: #7d8590;
77
- text-transform: uppercase;
78
- letter-spacing: 0.5px;
79
- margin-bottom: 4px;
80
- }
81
- .summary-card-value {
82
- font-size: 24px;
83
- font-weight: 600;
84
- color: #e6edf3;
85
- }
86
- .summary-card-sub {
87
- font-size: 12px;
88
- color: #7d8590;
89
- margin-top: 2px;
90
- }
91
-
92
- /* Section */
93
- .section {
94
- margin: 24px 0;
95
- }
96
- .section-title {
97
- font-size: 16px;
98
- font-weight: 600;
99
- color: #e6edf3;
100
- margin-bottom: 12px;
101
- padding-bottom: 8px;
102
- border-bottom: 1px solid #30363d;
103
- }
104
-
105
- /* Tabs */
106
- .tabs {
107
- display: flex;
108
- gap: 4px;
109
- margin-bottom: 16px;
110
- border-bottom: 1px solid #30363d;
111
- padding-bottom: 0;
112
- }
113
- .tab {
114
- padding: 8px 16px;
115
- background: none;
116
- border: none;
117
- border-bottom: 2px solid transparent;
118
- color: #7d8590;
119
- font-size: 14px;
120
- cursor: pointer;
121
- transition: all 0.2s;
122
- font-family: inherit;
123
- }
124
- .tab:hover {
125
- color: #c9d1d9;
126
- }
127
- .tab.active {
128
- color: #58a6ff;
129
- border-bottom-color: #58a6ff;
130
- }
131
-
132
- /* Table */
133
- .data-table {
134
- width: 100%;
135
- border-collapse: collapse;
136
- font-size: 13px;
137
- }
138
- .data-table th {
139
- text-align: left;
140
- padding: 8px 12px;
141
- background: #161b22;
142
- color: #7d8590;
143
- font-weight: 600;
144
- font-size: 12px;
145
- text-transform: uppercase;
146
- letter-spacing: 0.5px;
147
- border-bottom: 1px solid #30363d;
148
- position: sticky;
149
- top: 57px;
150
- z-index: 5;
151
- }
152
- .data-table td {
153
- padding: 6px 12px;
154
- border-bottom: 1px solid #21262d;
155
- vertical-align: top;
156
- }
157
- .data-table tr:hover td {
158
- background: rgba(110, 118, 129, 0.05);
159
- }
160
- .data-table .mono {
161
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
162
- font-size: 12px;
163
- }
164
- .data-table .message-cell {
165
- max-width: 400px;
166
- overflow: hidden;
167
- text-overflow: ellipsis;
168
- display: -webkit-box;
169
- -webkit-line-clamp: 3;
170
- -webkit-box-orient: vertical;
171
- line-height: 1.4;
172
- word-break: break-word;
173
- }
174
- .data-table .sortable {
175
- cursor: pointer;
176
- user-select: none;
177
- }
178
- .data-table .sortable:hover {
179
- color: #58a6ff;
180
- }
181
-
182
- /* Grouped turns table */
183
- .group-header-row {
184
- background: rgba(110, 118, 129, 0.08);
185
- }
186
- .group-header-row:hover td {
187
- background: rgba(110, 118, 129, 0.12) !important;
188
- }
189
- .group-header-cell {
190
- padding: 10px 12px !important;
191
- border-bottom: 2px solid #30363d !important;
192
- font-weight: 500;
193
- }
194
- .group-header-content {
195
- display: flex;
196
- align-items: flex-start;
197
- gap: 12px;
198
- }
199
- .user-req-badge {
200
- display: inline-block;
201
- padding: 2px 8px;
202
- background: rgba(88, 166, 255, 0.15);
203
- color: #58a6ff;
204
- border-radius: 4px;
205
- font-size: 11px;
206
- font-weight: 600;
207
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
208
- flex-shrink: 0;
209
- margin-top: 2px;
210
- }
211
- .user-message-text {
212
- color: #e6edf3;
213
- flex: 1;
214
- line-height: 1.5;
215
- word-break: break-word;
216
- display: -webkit-box;
217
- -webkit-line-clamp: 3;
218
- -webkit-box-orient: vertical;
219
- overflow: hidden;
220
- }
221
- .turn-row td {
222
- border-bottom: 1px solid #21262d;
223
- }
224
- .turn-row:last-of-type td {
225
- border-bottom: 2px solid #30363d;
226
- }
227
- .turn-cell {
228
- color: #8b949e;
229
- }
230
- .turn-link {
231
- color: #58a6ff;
232
- text-decoration: none;
233
- transition: color 0.2s;
234
- }
235
- .turn-link:hover {
236
- color: #79c0ff;
237
- text-decoration: underline;
238
- }
239
- .subagent-link {
240
- color: #58a6ff;
241
- text-decoration: none;
242
- transition: color 0.2s;
243
- }
244
- .subagent-link:hover {
245
- color: #79c0ff;
246
- text-decoration: underline;
247
- }
248
-
249
- /* Timeline column in table */
250
- .timeline-cell {
251
- padding: 6px 12px !important;
252
- }
253
- .timeline-bar-container {
254
- position: relative;
255
- width: 100%;
256
- height: 20px;
257
- background: rgba(110, 118, 129, 0.05);
258
- border-radius: 3px;
259
- }
260
- .timeline-bar {
261
- position: absolute;
262
- height: 100%;
263
- background: rgba(35, 134, 54, 0.7);
264
- border-radius: 3px;
265
- min-width: 2px;
266
- transition: background 0.2s;
267
- }
268
- .timeline-bar:hover {
269
- background: rgba(35, 134, 54, 0.9);
270
- }
271
-
272
- /* Duration bar */
273
- .duration-bar-container {
274
- display: flex;
275
- align-items: center;
276
- gap: 8px;
277
- }
278
- .duration-bar {
279
- height: 6px;
280
- border-radius: 3px;
281
- background: #1f6feb;
282
- min-width: 2px;
283
- transition: width 0.3s;
284
- }
285
- .duration-bar.subagent { background: #3fb950; }
286
- .duration-bar.subagent-failed { background: #f85149; }
287
- .duration-bar.subagent-incomplete { background: #d29922; }
288
- .duration-bar.tool { background: #9e6a03; }
289
- .duration-bar.user { background: #1f6feb; }
290
- .duration-bar.turn { background: #238636; }
291
- .duration-bar.error { background: #da3633; }
292
-
293
- .duration-text {
294
- font-size: 12px;
295
- color: #c9d1d9;
296
- white-space: nowrap;
297
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
298
- }
299
-
300
- /* Badges */
301
- .badge {
302
- display: inline-block;
303
- padding: 2px 8px;
304
- border-radius: 3px;
305
- font-size: 11px;
306
- font-weight: 600;
307
- white-space: nowrap;
308
- }
309
- .badge-subagent { background: #8957e5; color: #fff; }
310
- .badge-tool { background: #9e6a03; color: #fff; }
311
- .badge-turn { background: #238636; color: #fff; }
312
- .badge-read { background: rgba(88, 166, 255, 0.15); color: #58a6ff; border: 1px solid rgba(88, 166, 255, 0.3); }
313
- .badge-write { background: rgba(63, 185, 80, 0.15); color: #3fb950; border: 1px solid rgba(63, 185, 80, 0.3); }
314
- .badge-edit { background: rgba(210, 153, 34, 0.15); color: #d29922; border: 1px solid rgba(210, 153, 34, 0.3); }
315
- .badge-create { background: rgba(63, 185, 80, 0.15); color: #3fb950; border: 1px solid rgba(63, 185, 80, 0.3); }
316
- .badge-bash { background: rgba(139, 148, 158, 0.15); color: #8b949e; border: 1px solid rgba(139, 148, 158, 0.3); }
317
- .badge-search { background: rgba(191, 57, 137, 0.15); color: #f778ba; border: 1px solid rgba(191, 57, 137, 0.3); }
318
- .badge-other { background: rgba(110, 118, 129, 0.15); color: #8b949e; border: 1px solid rgba(110, 118, 129, 0.3); }
319
-
320
- /* Timeline */
321
- .timeline {
322
- position: relative;
323
- padding: 0;
324
- }
325
- .timeline-item {
326
- display: flex;
327
- align-items: flex-start;
328
- gap: 12px;
329
- padding: 6px 0;
330
- border-bottom: 1px solid #21262d;
331
- }
332
- .timeline-item:last-child {
333
- border-bottom: none;
334
- }
335
- .timeline-time {
336
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
337
- font-size: 12px;
338
- color: #7d8590;
339
- min-width: 70px;
340
- flex-shrink: 0;
341
- }
342
- .timeline-content {
343
- flex: 1;
344
- min-width: 0;
345
- }
346
- .timeline-file {
347
- color: #58a6ff;
348
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
349
- font-size: 12px;
350
- word-break: break-all;
351
- }
352
- .timeline-detail {
353
- font-size: 12px;
354
- color: #7d8590;
355
- margin-top: 2px;
356
- }
357
-
358
- /* Gantt-like chart for subagents */
359
- .gantt-container {
360
- overflow-x: auto;
361
- overflow-y: visible;
362
- padding-bottom: 8px;
363
- padding-top: 22px;
364
- position: relative;
365
- }
366
- .gantt-crosshair {
367
- position: absolute;
368
- top: 0;
369
- bottom: 0;
370
- width: 1px;
371
- background: rgba(139, 148, 158, 0.5);
372
- pointer-events: none;
373
- z-index: 10;
374
- }
375
- .gantt-crosshair-label {
376
- position: absolute;
377
- top: 4px;
378
- left: 50%;
379
- transform: translateX(-50%);
380
- background: #30363d;
381
- color: #e6edf3;
382
- font-size: 10px;
383
- padding: 2px 6px;
384
- border-radius: 3px;
385
- white-space: nowrap;
386
- pointer-events: none;
387
- }
388
- .gantt-row {
389
- display: flex;
390
- align-items: center;
391
- gap: 12px;
392
- padding: 6px 0;
393
- border-bottom: 1px solid #21262d;
394
- }
395
- .gantt-row:last-child {
396
- border-bottom: none;
397
- }
398
- .gantt-label {
399
- min-width: 200px;
400
- max-width: 200px;
401
- font-size: 13px;
402
- overflow: hidden;
403
- text-overflow: ellipsis;
404
- white-space: nowrap;
405
- flex-shrink: 0;
406
- }
407
- .gantt-bar-area {
408
- flex: 1;
409
- min-width: 300px;
410
- height: 24px;
411
- position: relative;
412
- background: rgba(110, 118, 129, 0.05);
413
- border-radius: 4px;
414
- }
415
- .gantt-bar {
416
- position: absolute;
417
- height: 100%;
418
- border-radius: 4px;
419
- min-width: 3px;
420
- display: flex;
421
- align-items: center;
422
- padding: 0 6px;
423
- font-size: 11px;
424
- font-weight: 500;
425
- color: #fff;
426
- white-space: nowrap;
427
- overflow: hidden;
428
- }
429
- .gantt-bar.subagent { background: rgba(63, 185, 80, 0.8); }
430
- .gantt-bar.subagent-failed { background: rgba(248, 81, 73, 0.8); }
431
- .gantt-bar.subagent-incomplete { background: rgba(210, 153, 34, 0.8); }
432
- .gantt-bar.turn { background: rgba(35, 134, 54, 0.8); }
433
- .gantt-bar.tool { background: rgba(158, 106, 3, 0.6); }
434
- .gantt-bar.agent-op {
435
- background: rgba(139, 148, 158, 0.3);
436
- border: 1px dashed rgba(139, 148, 158, 0.5);
437
- }
438
-
439
- /* Sequence-estimated gantt bars for VS Code sessions */
440
- .gantt-bar.sequence-estimated {
441
- border: 2px dashed rgba(63, 185, 80, 0.6);
442
- opacity: 0.8;
443
- background:
444
- repeating-linear-gradient(
445
- 45deg,
446
- rgba(63, 185, 80, 0.7),
447
- rgba(63, 185, 80, 0.7) 10px,
448
- rgba(63, 185, 80, 0.5) 10px,
449
- rgba(63, 185, 80, 0.5) 20px
450
- );
451
- }
452
- .gantt-bar.sequence-estimated.subagent-failed {
453
- border: 2px dashed rgba(248, 81, 73, 0.6);
454
- background:
455
- repeating-linear-gradient(
456
- 45deg,
457
- rgba(248, 81, 73, 0.7),
458
- rgba(248, 81, 73, 0.7) 10px,
459
- rgba(248, 81, 73, 0.5) 10px,
460
- rgba(248, 81, 73, 0.5) 20px
461
- );
462
- }
463
- .gantt-bar.sequence-estimated.subagent-incomplete {
464
- border: 2px dashed rgba(210, 153, 34, 0.6);
465
- background:
466
- repeating-linear-gradient(
467
- 45deg,
468
- rgba(210, 153, 34, 0.7),
469
- rgba(210, 153, 34, 0.7) 10px,
470
- rgba(210, 153, 34, 0.5) 10px,
471
- rgba(210, 153, 34, 0.5) 20px
472
- );
473
- }
474
-
475
- /* Event markers on gantt bars */
476
- .gantt-bar { overflow: visible; }
477
- .event-marker {
478
- position: absolute;
479
- top: 50%;
480
- transform: translate(-50%, -50%);
481
- z-index: 2;
482
- cursor: pointer;
483
- transition: transform 0.15s;
484
- }
485
- .event-marker:hover {
486
- transform: translate(-50%, -50%) scale(1.8);
487
- z-index: 10;
488
- }
489
- .event-marker--circle {
490
- width: 6px;
491
- height: 6px;
492
- border-radius: 50%;
493
- }
494
- .event-marker--diamond {
495
- width: 6px;
496
- height: 6px;
497
- transform: translate(-50%, -50%) rotate(45deg);
498
- }
499
- .event-marker:hover .event-marker--diamond-inner {
500
- transform: scale(1.8);
501
- }
502
- .event-marker--square {
503
- width: 5px;
504
- height: 5px;
505
- border-radius: 1px;
506
- }
507
- .event-marker--triangle {
508
- width: 0;
509
- height: 0;
510
- border-left: 4px solid transparent;
511
- border-right: 4px solid transparent;
512
- border-bottom: 7px solid currentColor;
513
- }
514
- .event-marker--cluster {
515
- width: 14px;
516
- height: 14px;
517
- border-radius: 50%;
518
- display: flex;
519
- align-items: center;
520
- justify-content: center;
521
- font-size: 8px;
522
- font-weight: 700;
523
- color: #fff;
524
- border: 1px solid rgba(255,255,255,0.3);
525
- }
526
-
527
- /* Event marker tooltip */
528
- .event-marker-tooltip {
529
- display: none;
530
- position: absolute;
531
- bottom: calc(100% + 6px);
532
- left: 50%;
533
- transform: translateX(-50%);
534
- background: #1c2128;
535
- border: 1px solid #30363d;
536
- border-radius: 6px;
537
- padding: 6px 10px;
538
- font-size: 11px;
539
- color: #c9d1d9;
540
- white-space: nowrap;
541
- z-index: 100;
542
- pointer-events: none;
543
- box-shadow: 0 4px 12px rgba(0,0,0,0.4);
544
- }
545
- .event-marker:hover .event-marker-tooltip {
546
- display: block;
547
- }
548
-
549
- /* Gantt label for agent-op */
550
- .gantt-label.agent-op {
551
- color: #7d8590;
552
- font-style: italic;
553
- }
554
- .gantt-label.agent-op .agent-op-icon {
555
- color: #8b949e;
556
- margin-right: 4px;
557
- }
558
- .gantt-label.agent-op .agent-op-summary {
559
- font-size: 11px;
560
- color: #6e7681;
561
- display: block;
562
- overflow: hidden;
563
- text-overflow: ellipsis;
564
- }
565
-
566
- /* Event legend */
567
- .event-legend {
568
- display: flex;
569
- flex-wrap: wrap;
570
- gap: 10px;
571
- padding: 10px 14px;
572
- background: #161b22;
573
- border: 1px solid #30363d;
574
- border-radius: 6px;
575
- margin-bottom: 12px;
576
- }
577
- .event-legend-item {
578
- display: flex;
579
- align-items: center;
580
- gap: 5px;
581
- font-size: 11px;
582
- color: #8b949e;
583
- }
584
- .event-legend-swatch {
585
- width: 8px;
586
- height: 8px;
587
- border-radius: 2px;
588
- flex-shrink: 0;
589
- }
590
- .legend-toggle-btn {
591
- background: none;
592
- border: 1px solid #30363d;
593
- color: #8b949e;
594
- font-size: 11px;
595
- padding: 2px 8px;
596
- border-radius: 4px;
597
- cursor: pointer;
598
- margin-left: 8px;
599
- transition: all 0.2s;
600
- }
601
- .legend-toggle-btn:hover {
602
- border-color: #58a6ff;
603
- color: #58a6ff;
604
- }
605
-
606
- .gantt-time-axis {
607
- display: flex;
608
- justify-content: space-between;
609
- margin-left: 212px;
610
- padding: 4px 0;
611
- font-size: 11px;
612
- color: #7d8590;
613
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
614
- border-top: 1px solid #30363d;
615
- }
616
-
617
- /* Unified timeline: indented child rows */
618
- .gantt-row.indented .gantt-label {
619
- padding-left: 20px;
620
- }
621
-
622
- /* Unified timeline: user-req row */
623
- .gantt-bar.user-req {
624
- background: rgba(88, 166, 255, 0.35);
625
- border: 1px solid rgba(88, 166, 255, 0.6);
626
- }
627
- .gantt-label.user-req {
628
- font-weight: 600;
629
- color: #e6edf3;
630
- }
631
- .gantt-label.user-req .user-req-badge {
632
- margin-right: 6px;
633
- }
634
- .gantt-label.user-req .user-req-msg {
635
- font-weight: 400;
636
- font-size: 11px;
637
- color: #8b949e;
638
- overflow: hidden;
639
- text-overflow: ellipsis;
640
- }
641
-
642
- /* Unified timeline: tool-summary row */
643
- .gantt-bar.tool-summary {
644
- background: rgba(158, 106, 3, 0.6);
645
- }
646
- .gantt-label.tool-summary {
647
- color: #d29922;
648
- font-weight: 500;
649
- }
650
- .gantt-label.tool-summary .tool-cat-icon {
651
- margin-right: 4px;
652
- }
653
- .gantt-label.tool-summary .tool-cat-count {
654
- color: #7d8590;
655
- font-size: 11px;
656
- margin-left: 4px;
657
- }
658
-
659
- /* Unified timeline: divider row */
660
- .gantt-divider {
661
- border-bottom: 1px solid #30363d;
662
- padding: 4px 0;
663
- margin: 2px 0;
664
- display: flex;
665
- align-items: center;
666
- gap: 8px;
667
- color: #7d8590;
668
- font-size: 11px;
669
- text-transform: uppercase;
670
- letter-spacing: 0.5px;
671
- }
672
- .gantt-divider::before,
673
- .gantt-divider::after {
674
- content: '';
675
- flex: 1;
676
- height: 1px;
677
- background: #30363d;
678
- }
679
-
680
- /* Empty state */
681
- .empty-state {
682
- text-align: center;
683
- padding: 40px;
684
- color: #7d8590;
685
- font-size: 14px;
686
- }
687
-
688
- /* Markdown Styles */
689
- .section h1, .section h2, .section h3 {
690
- color: #c9d1d9;
691
- margin-top: 24px;
692
- margin-bottom: 16px;
693
- font-weight: 600;
694
- line-height: 1.25;
695
- }
696
- .section h1 { font-size: 2em; border-bottom: 1px solid #21262d; padding-bottom: 8px; }
697
- .section h2 { font-size: 1.5em; border-bottom: 1px solid #21262d; padding-bottom: 8px; }
698
- .section h3 { font-size: 1.25em; }
699
- .section p { margin-bottom: 16px; }
700
- .section ul, .section ol { margin-bottom: 16px; padding-left: 2em; }
701
- .section li { margin-bottom: 8px; }
702
- .section code {
703
- background: #161b22;
704
- padding: 2px 6px;
705
- border-radius: 3px;
706
- font-family: ui-monospace, 'Cascadia Code', monospace;
707
- font-size: 85%;
708
- }
709
- .section pre {
710
- background: #161b22;
711
- border: 1px solid #30363d;
712
- border-radius: 6px;
713
- padding: 16px;
714
- overflow-x: auto;
715
- margin-bottom: 16px;
716
- }
717
- .section pre code {
718
- background: transparent;
719
- padding: 0;
720
- }
721
- .section blockquote {
722
- border-left: 4px solid #30363d;
723
- padding-left: 16px;
724
- color: #7d8590;
725
- margin-bottom: 16px;
726
- }
727
- .section hr {
728
- border: none;
729
- border-top: 1px solid #21262d;
730
- margin: 24px 0;
731
- }
732
- .section table {
733
- border-collapse: collapse;
734
- width: 100%;
735
- margin-bottom: 16px;
736
- }
737
- .section table th,
738
- .section table td {
739
- border: 1px solid #30363d;
740
- padding: 8px 13px;
741
- text-align: left;
742
- }
743
- .section table th {
744
- background: #161b22;
745
- font-weight: 600;
746
- }
747
-
748
- /* Responsive */
749
- @media (max-width: 768px) {
750
- .summary-grid {
751
- grid-template-columns: repeat(2, 1fr);
752
- }
753
- .gantt-label {
754
- min-width: 120px;
755
- max-width: 120px;
756
- }
757
- }
758
- </style>
759
- </head>
760
- <body>
761
- <div class="header">
762
- <a href="/session/<%= sessionId %>" class="nav-btn">← Back to Session</a>
763
- <h1>⏱ Analysis: <%= sessionId %>
764
- <% if (metadata.sessionStatus === 'wip') { %>
765
- <span style="font-size: 12px; padding: 2px 8px; border-radius: 3px; background: rgba(210, 153, 34, 0.2); color: #d29922; border: 1px solid rgba(210, 153, 34, 0.4); vertical-align: middle; margin-left: 8px;">🔄 WIP</span>
766
- <% } %>
767
- </h1>
768
- </div>
769
-
770
- <div class="container" id="app"></div>
771
-
772
- <!-- Vue 3 -->
773
- <script src="/public/vendor/vue.global.prod.min.js"></script>
774
-
775
- <script>
776
- window.__PAGE_DATA = {
777
- sessionId: '<%= sessionId %>',
778
- metadata: <%- JSON.stringify(metadata).replace(/</g, '\\u003c').replace(/>/g, '\\u003e').replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029') %>
779
- };
780
- </script>
781
- <script src="/public/js/time-analyze.min.js"></script>
782
- </body>
783
- </html>