claude-relay 2.2.4 → 2.3.1
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.
- package/README.md +13 -0
- package/bin/cli.js +144 -6
- package/lib/config.js +34 -2
- package/lib/daemon.js +54 -2
- package/lib/pages.js +22 -1
- package/lib/project.js +312 -26
- package/lib/public/app.js +339 -18
- package/lib/public/css/base.css +5 -0
- package/lib/public/css/diff.css +128 -0
- package/lib/public/css/filebrowser.css +571 -0
- package/lib/public/css/input.css +3 -0
- package/lib/public/css/menus.css +89 -5
- package/lib/public/css/messages.css +89 -50
- package/lib/public/css/overlays.css +40 -0
- package/lib/public/index.html +102 -19
- package/lib/public/modules/diff.js +398 -0
- package/lib/public/modules/filebrowser.js +1023 -11
- package/lib/public/modules/input.js +96 -2
- package/lib/public/modules/notifications.js +29 -3
- package/lib/public/modules/qrcode.js +11 -2
- package/lib/public/modules/rewind.js +51 -2
- package/lib/public/modules/terminal.js +73 -0
- package/lib/public/modules/tools.js +45 -104
- package/lib/public/modules/utils.js +10 -2
- package/lib/public/style.css +1 -0
- package/lib/public/sw.js +21 -7
- package/lib/push.js +5 -1
- package/lib/sdk-bridge.js +38 -5
- package/lib/server.js +41 -7
- package/lib/sessions.js +14 -5
- package/package.json +1 -1
package/lib/public/css/menus.css
CHANGED
|
@@ -419,23 +419,34 @@
|
|
|
419
419
|
.model-menu-item:hover { background: rgba(255,255,255,0.05); color: var(--text); }
|
|
420
420
|
.model-menu-item.active { color: var(--accent); font-weight: 600; }
|
|
421
421
|
|
|
422
|
-
/* ---
|
|
423
|
-
#
|
|
422
|
+
/* --- Info panels container --- */
|
|
423
|
+
#info-panels {
|
|
424
424
|
position: fixed;
|
|
425
425
|
top: 80px;
|
|
426
426
|
right: 16px;
|
|
427
427
|
width: 280px;
|
|
428
428
|
max-height: calc(100vh - 160px);
|
|
429
429
|
overflow-y: auto;
|
|
430
|
+
z-index: 50;
|
|
431
|
+
display: flex;
|
|
432
|
+
flex-direction: column;
|
|
433
|
+
gap: 8px;
|
|
434
|
+
pointer-events: none;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
#info-panels:empty { display: none; }
|
|
438
|
+
|
|
439
|
+
/* --- Usage panel --- */
|
|
440
|
+
#usage-panel, #status-panel, #context-panel {
|
|
430
441
|
background: var(--bg-alt);
|
|
431
442
|
border: 1px solid var(--border);
|
|
432
443
|
border-radius: 12px;
|
|
433
444
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
|
|
434
|
-
z-index: 50;
|
|
435
445
|
font-size: 12px;
|
|
446
|
+
pointer-events: auto;
|
|
436
447
|
}
|
|
437
448
|
|
|
438
|
-
#usage-panel.hidden { display: none; }
|
|
449
|
+
#usage-panel.hidden, #status-panel.hidden, #context-panel.hidden { display: none; }
|
|
439
450
|
|
|
440
451
|
.usage-panel-header {
|
|
441
452
|
display: flex;
|
|
@@ -448,6 +459,11 @@
|
|
|
448
459
|
color: var(--text);
|
|
449
460
|
}
|
|
450
461
|
|
|
462
|
+
.usage-panel-actions {
|
|
463
|
+
display: flex;
|
|
464
|
+
gap: 2px;
|
|
465
|
+
}
|
|
466
|
+
|
|
451
467
|
.usage-panel-header button {
|
|
452
468
|
display: flex;
|
|
453
469
|
align-items: center;
|
|
@@ -523,8 +539,76 @@
|
|
|
523
539
|
font-weight: 500;
|
|
524
540
|
}
|
|
525
541
|
|
|
542
|
+
/* --- Context bar --- */
|
|
543
|
+
.context-bar-wrap {
|
|
544
|
+
display: flex;
|
|
545
|
+
align-items: center;
|
|
546
|
+
gap: 8px;
|
|
547
|
+
margin: 6px 0 8px;
|
|
548
|
+
}
|
|
549
|
+
.context-bar {
|
|
550
|
+
flex: 1;
|
|
551
|
+
height: 6px;
|
|
552
|
+
background: var(--border);
|
|
553
|
+
border-radius: 3px;
|
|
554
|
+
overflow: hidden;
|
|
555
|
+
}
|
|
556
|
+
.context-bar-fill {
|
|
557
|
+
height: 100%;
|
|
558
|
+
width: 0%;
|
|
559
|
+
background: var(--success);
|
|
560
|
+
border-radius: 3px;
|
|
561
|
+
transition: width 0.3s ease, background 0.3s ease;
|
|
562
|
+
}
|
|
563
|
+
.context-bar-fill.warn { background: #E5A84B; }
|
|
564
|
+
.context-bar-fill.danger { background: var(--error); }
|
|
565
|
+
.context-bar-pct {
|
|
566
|
+
font-family: "SF Mono", Menlo, Monaco, monospace;
|
|
567
|
+
font-size: 11px;
|
|
568
|
+
font-weight: 600;
|
|
569
|
+
color: var(--text-secondary);
|
|
570
|
+
min-width: 32px;
|
|
571
|
+
text-align: right;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/* --- Context mini bar (in input area) --- */
|
|
575
|
+
#context-mini {
|
|
576
|
+
display: flex;
|
|
577
|
+
align-items: center;
|
|
578
|
+
gap: 8px;
|
|
579
|
+
padding: 6px 14px 2px;
|
|
580
|
+
cursor: pointer;
|
|
581
|
+
transition: opacity 0.15s;
|
|
582
|
+
}
|
|
583
|
+
#context-mini:hover { opacity: 0.8; }
|
|
584
|
+
#context-mini.hidden { display: none; }
|
|
585
|
+
.context-mini-bar {
|
|
586
|
+
flex: 1;
|
|
587
|
+
height: 4px;
|
|
588
|
+
background: var(--border);
|
|
589
|
+
border-radius: 2px;
|
|
590
|
+
overflow: hidden;
|
|
591
|
+
}
|
|
592
|
+
.context-mini-fill {
|
|
593
|
+
height: 100%;
|
|
594
|
+
width: 0%;
|
|
595
|
+
border-radius: 2px;
|
|
596
|
+
background: var(--success);
|
|
597
|
+
transition: width 0.3s ease, background 0.3s ease;
|
|
598
|
+
}
|
|
599
|
+
.context-mini-fill.warn { background: #E5A84B; }
|
|
600
|
+
.context-mini-fill.danger { background: var(--error); }
|
|
601
|
+
.context-mini-label {
|
|
602
|
+
font-family: "SF Mono", Menlo, Monaco, monospace;
|
|
603
|
+
font-size: 10px;
|
|
604
|
+
font-weight: 600;
|
|
605
|
+
color: var(--text-dimmer);
|
|
606
|
+
min-width: 24px;
|
|
607
|
+
text-align: right;
|
|
608
|
+
}
|
|
609
|
+
|
|
526
610
|
@media (max-width: 768px) {
|
|
527
|
-
#
|
|
611
|
+
#info-panels {
|
|
528
612
|
top: auto;
|
|
529
613
|
bottom: calc(var(--safe-bottom, 0px) + 64px);
|
|
530
614
|
right: 12px;
|
|
@@ -130,6 +130,8 @@
|
|
|
130
130
|
word-break: break-word;
|
|
131
131
|
white-space: pre-wrap;
|
|
132
132
|
color: var(--text);
|
|
133
|
+
unicode-bidi: plaintext;
|
|
134
|
+
text-align: start;
|
|
133
135
|
}
|
|
134
136
|
|
|
135
137
|
/* --- Assistant message --- */
|
|
@@ -176,6 +178,8 @@
|
|
|
176
178
|
line-height: 1.7;
|
|
177
179
|
word-break: break-word;
|
|
178
180
|
color: var(--text);
|
|
181
|
+
unicode-bidi: plaintext;
|
|
182
|
+
text-align: start;
|
|
179
183
|
}
|
|
180
184
|
|
|
181
185
|
.md-content p { margin-bottom: 14px; }
|
|
@@ -282,7 +286,7 @@ pre:hover .code-copy-btn { opacity: 1; }
|
|
|
282
286
|
.md-content th, .md-content td {
|
|
283
287
|
border: 1px solid var(--border);
|
|
284
288
|
padding: 8px 12px;
|
|
285
|
-
text-align:
|
|
289
|
+
text-align: start;
|
|
286
290
|
}
|
|
287
291
|
.md-content th {
|
|
288
292
|
background: rgba(255, 255, 255, 0.04);
|
|
@@ -407,6 +411,45 @@ pre.mermaid-error {
|
|
|
407
411
|
max-height: 75vh;
|
|
408
412
|
}
|
|
409
413
|
|
|
414
|
+
/* --- Image lightbox modal --- */
|
|
415
|
+
#image-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
|
|
416
|
+
#image-modal.hidden { display: none; }
|
|
417
|
+
#image-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(0, 0, 0, 0.8); }
|
|
418
|
+
|
|
419
|
+
.image-modal-dialog {
|
|
420
|
+
position: relative;
|
|
421
|
+
z-index: 1;
|
|
422
|
+
display: flex;
|
|
423
|
+
align-items: center;
|
|
424
|
+
justify-content: center;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
#image-modal-img {
|
|
428
|
+
max-width: 92vw;
|
|
429
|
+
max-height: 90vh;
|
|
430
|
+
border-radius: 12px;
|
|
431
|
+
object-fit: contain;
|
|
432
|
+
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
.image-modal-close {
|
|
436
|
+
position: fixed;
|
|
437
|
+
top: 16px;
|
|
438
|
+
right: 16px;
|
|
439
|
+
z-index: 2;
|
|
440
|
+
display: flex;
|
|
441
|
+
align-items: center;
|
|
442
|
+
justify-content: center;
|
|
443
|
+
background: rgba(0, 0, 0, 0.5);
|
|
444
|
+
border: none;
|
|
445
|
+
color: #fff;
|
|
446
|
+
cursor: pointer;
|
|
447
|
+
padding: 8px;
|
|
448
|
+
border-radius: 50%;
|
|
449
|
+
transition: background 0.15s;
|
|
450
|
+
}
|
|
451
|
+
.image-modal-close:hover { background: rgba(255, 255, 255, 0.2); }
|
|
452
|
+
|
|
410
453
|
/* ==========================================================================
|
|
411
454
|
Thinking
|
|
412
455
|
========================================================================== */
|
|
@@ -566,6 +609,37 @@ pre.mermaid-error {
|
|
|
566
609
|
white-space: nowrap;
|
|
567
610
|
}
|
|
568
611
|
|
|
612
|
+
.tool-desc.tool-desc-link {
|
|
613
|
+
cursor: pointer;
|
|
614
|
+
text-decoration: underline;
|
|
615
|
+
text-decoration-color: transparent;
|
|
616
|
+
text-underline-offset: 2px;
|
|
617
|
+
transition: color 0.15s, text-decoration-color 0.15s;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
.tool-desc.tool-desc-link:hover {
|
|
621
|
+
color: var(--accent);
|
|
622
|
+
text-decoration-color: var(--accent);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
.tool-desc-link-icon {
|
|
626
|
+
display: inline-flex;
|
|
627
|
+
align-items: center;
|
|
628
|
+
margin-left: 4px;
|
|
629
|
+
opacity: 0.3;
|
|
630
|
+
vertical-align: middle;
|
|
631
|
+
transition: opacity 0.15s;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
.tool-desc-link-icon .lucide {
|
|
635
|
+
width: 11px;
|
|
636
|
+
height: 11px;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
.tool-desc.tool-desc-link:hover .tool-desc-link-icon {
|
|
640
|
+
opacity: 0.8;
|
|
641
|
+
}
|
|
642
|
+
|
|
569
643
|
.tool-status-icon {
|
|
570
644
|
flex-shrink: 0;
|
|
571
645
|
width: 16px;
|
|
@@ -670,6 +744,13 @@ pre.mermaid-error {
|
|
|
670
744
|
}
|
|
671
745
|
|
|
672
746
|
.edit-diff-path { flex: 1; }
|
|
747
|
+
.edit-diff-path-link {
|
|
748
|
+
cursor: pointer;
|
|
749
|
+
}
|
|
750
|
+
.edit-diff-path-link:hover {
|
|
751
|
+
color: var(--accent);
|
|
752
|
+
text-decoration: underline;
|
|
753
|
+
}
|
|
673
754
|
|
|
674
755
|
.edit-diff-toggles {
|
|
675
756
|
display: inline-flex;
|
|
@@ -695,61 +776,19 @@ pre.mermaid-error {
|
|
|
695
776
|
.edit-diff-toggle.active { color: var(--text); background: var(--sidebar-active); }
|
|
696
777
|
.edit-diff-toggle + .edit-diff-toggle { border-left: 1px solid var(--border); }
|
|
697
778
|
|
|
698
|
-
|
|
699
|
-
|
|
779
|
+
/* Constrain diff module tables inside tool results */
|
|
780
|
+
.edit-diff .diff-unified,
|
|
781
|
+
.edit-diff .diff-split-view,
|
|
782
|
+
.tool-result-block > .diff-unified {
|
|
700
783
|
max-height: 300px;
|
|
701
|
-
overflow
|
|
702
|
-
overflow-x: hidden;
|
|
784
|
+
overflow: auto;
|
|
703
785
|
}
|
|
704
786
|
|
|
705
|
-
.edit-diff-
|
|
706
|
-
|
|
707
|
-
max-height: none;
|
|
708
|
-
overflow-y: visible;
|
|
709
|
-
font-family: "SF Mono", Menlo, Monaco, monospace;
|
|
787
|
+
.edit-diff .diff-table,
|
|
788
|
+
.tool-result-block > .diff-unified .diff-table {
|
|
710
789
|
font-size: 12px;
|
|
711
|
-
line-height: 1.55;
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
.edit-diff-gutter {
|
|
715
|
-
flex-shrink: 0;
|
|
716
|
-
padding: 12px 12px 12px 14px;
|
|
717
|
-
text-align: right;
|
|
718
|
-
color: var(--text-dimmer);
|
|
719
|
-
user-select: none;
|
|
720
|
-
-webkit-user-select: none;
|
|
721
|
-
min-width: 36px;
|
|
722
|
-
border-right: 1px solid var(--border-subtle);
|
|
723
790
|
}
|
|
724
791
|
|
|
725
|
-
.edit-diff-content {
|
|
726
|
-
flex: 1;
|
|
727
|
-
padding: 12px 14px;
|
|
728
|
-
white-space: pre-wrap;
|
|
729
|
-
word-break: break-all;
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
.edit-diff-content .diff-add {
|
|
733
|
-
color: #3FB950;
|
|
734
|
-
background: rgba(63, 185, 80, 0.08);
|
|
735
|
-
display: inline-block;
|
|
736
|
-
width: 100%;
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
.edit-diff-content .diff-del {
|
|
740
|
-
color: #F85149;
|
|
741
|
-
background: rgba(248, 81, 73, 0.08);
|
|
742
|
-
display: inline-block;
|
|
743
|
-
width: 100%;
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
/* Split view */
|
|
747
|
-
.edit-diff-split { overflow-x: auto; }
|
|
748
|
-
.edit-diff-split .edit-diff-side-old { border-right: 1px solid var(--border); }
|
|
749
|
-
.edit-diff-split .edit-diff-side-old,
|
|
750
|
-
.edit-diff-split .edit-diff-side-new { min-width: 0; flex: 1; }
|
|
751
|
-
.edit-diff-split .edit-diff-gutter { min-width: 30px; padding: 12px 8px 12px 10px; }
|
|
752
|
-
|
|
753
792
|
/* --- Code viewer (Read tool) --- */
|
|
754
793
|
.code-viewer {
|
|
755
794
|
display: flex;
|
|
@@ -178,6 +178,24 @@
|
|
|
178
178
|
#update-banner-close .lucide { width: 14px; height: 14px; }
|
|
179
179
|
#update-banner-close:hover { color: var(--text-secondary); }
|
|
180
180
|
|
|
181
|
+
/* --- Skip permissions banner --- */
|
|
182
|
+
#skip-perms-banner {
|
|
183
|
+
flex-shrink: 0;
|
|
184
|
+
display: flex;
|
|
185
|
+
align-items: center;
|
|
186
|
+
justify-content: center;
|
|
187
|
+
gap: 8px;
|
|
188
|
+
padding: 7px 16px;
|
|
189
|
+
background: rgba(229, 83, 75, 0.12);
|
|
190
|
+
border-bottom: 1px solid rgba(229, 83, 75, 0.25);
|
|
191
|
+
font-size: 12px;
|
|
192
|
+
font-weight: 500;
|
|
193
|
+
color: #E5534B;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
#skip-perms-banner.hidden { display: none; }
|
|
197
|
+
#skip-perms-banner .lucide { width: 14px; height: 14px; flex-shrink: 0; }
|
|
198
|
+
|
|
181
199
|
/* --- Confirm modal --- */
|
|
182
200
|
#confirm-modal {
|
|
183
201
|
position: fixed;
|
|
@@ -287,6 +305,28 @@
|
|
|
287
305
|
|
|
288
306
|
.rewind-modal-body p { margin: 0 0 10px; }
|
|
289
307
|
|
|
308
|
+
#rewind-mode-options {
|
|
309
|
+
display: flex;
|
|
310
|
+
flex-direction: column;
|
|
311
|
+
gap: 6px;
|
|
312
|
+
margin-bottom: 12px;
|
|
313
|
+
font-size: 13px;
|
|
314
|
+
color: var(--text-secondary);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
#rewind-mode-options label {
|
|
318
|
+
display: flex;
|
|
319
|
+
align-items: center;
|
|
320
|
+
gap: 8px;
|
|
321
|
+
cursor: pointer;
|
|
322
|
+
padding: 4px 0;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
#rewind-mode-options input[type="radio"] {
|
|
326
|
+
accent-color: var(--accent);
|
|
327
|
+
margin: 0;
|
|
328
|
+
}
|
|
329
|
+
|
|
290
330
|
.rewind-file-section {
|
|
291
331
|
margin-top: 10px;
|
|
292
332
|
border: 1px solid var(--border-subtle);
|
package/lib/public/index.html
CHANGED
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
<div id="sidebar-panel-files" class="sidebar-panel hidden">
|
|
72
72
|
<div id="file-panel-header">
|
|
73
73
|
<button id="file-panel-back" type="button"><i data-lucide="arrow-left"></i> <span>Sessions</span></button>
|
|
74
|
+
<button id="file-panel-refresh" type="button" title="Refresh file tree"><i data-lucide="refresh-cw"></i></button>
|
|
74
75
|
</div>
|
|
75
76
|
<div id="file-tree"></div>
|
|
76
77
|
</div>
|
|
@@ -83,6 +84,9 @@
|
|
|
83
84
|
<a class="sidebar-menu-item" href="https://github.com/chadbyte/claude-relay" target="_blank" rel="noopener">
|
|
84
85
|
<i data-lucide="github"></i> <span>GitHub</span>
|
|
85
86
|
</a>
|
|
87
|
+
<button class="sidebar-menu-item" id="footer-status">
|
|
88
|
+
<i data-lucide="activity"></i> <span>Status</span>
|
|
89
|
+
</button>
|
|
86
90
|
<button class="sidebar-menu-item" id="footer-update-check">
|
|
87
91
|
<i data-lucide="refresh-cw"></i> <span>Check for updates</span>
|
|
88
92
|
</button>
|
|
@@ -100,6 +104,10 @@
|
|
|
100
104
|
<span class="onboarding-banner-text" id="onboarding-banner-text"></span>
|
|
101
105
|
<button id="onboarding-banner-close" aria-label="Dismiss"><i data-lucide="x"></i></button>
|
|
102
106
|
</div>
|
|
107
|
+
<div id="skip-perms-banner" class="hidden">
|
|
108
|
+
<i data-lucide="shield-off"></i>
|
|
109
|
+
<span>Skip permissions mode is active. All tool executions are auto-approved.</span>
|
|
110
|
+
</div>
|
|
103
111
|
<div id="header">
|
|
104
112
|
<div id="header-left">
|
|
105
113
|
<button id="sidebar-expand-btn" title="Open sidebar"><i data-lucide="panel-left-open"></i></button>
|
|
@@ -131,7 +139,7 @@
|
|
|
131
139
|
</div>
|
|
132
140
|
</div>
|
|
133
141
|
<div id="notif-menu-wrap">
|
|
134
|
-
<button id="notif-btn" title="Notifications"><i data-lucide="
|
|
142
|
+
<button id="notif-btn" title="Notifications"><i data-lucide="bell"></i></button>
|
|
135
143
|
<div id="notif-menu" class="hidden">
|
|
136
144
|
<label class="notif-option" id="notif-push-row">
|
|
137
145
|
<span><i data-lucide="smartphone" style="width:14px;height:14px"></i> Push notifications</span>
|
|
@@ -163,24 +171,79 @@
|
|
|
163
171
|
</div>
|
|
164
172
|
<div id="messages"></div>
|
|
165
173
|
|
|
166
|
-
<div id="
|
|
167
|
-
<div
|
|
168
|
-
<
|
|
169
|
-
|
|
174
|
+
<div id="info-panels">
|
|
175
|
+
<div id="usage-panel" class="hidden">
|
|
176
|
+
<div class="usage-panel-header">
|
|
177
|
+
<span>Usage</span>
|
|
178
|
+
<button id="usage-panel-close" aria-label="Close"><i data-lucide="x"></i></button>
|
|
179
|
+
</div>
|
|
180
|
+
<div class="usage-panel-body">
|
|
181
|
+
<a href="https://claude.ai/settings/usage" target="_blank" rel="noopener" class="usage-external-link">
|
|
182
|
+
<span>Check plan usage on claude.ai</span>
|
|
183
|
+
<i data-lucide="external-link"></i>
|
|
184
|
+
</a>
|
|
185
|
+
<div class="usage-divider"></div>
|
|
186
|
+
<div class="usage-section-label">Session</div>
|
|
187
|
+
<div class="usage-row"><span class="usage-label">Cost</span><span id="usage-cost" class="usage-value">$0.0000</span></div>
|
|
188
|
+
<div class="usage-row"><span class="usage-label">Input tokens</span><span id="usage-input" class="usage-value">0</span></div>
|
|
189
|
+
<div class="usage-row"><span class="usage-label">Output tokens</span><span id="usage-output" class="usage-value">0</span></div>
|
|
190
|
+
<div class="usage-row"><span class="usage-label">Cache read</span><span id="usage-cache-read" class="usage-value">0</span></div>
|
|
191
|
+
<div class="usage-row"><span class="usage-label">Cache write</span><span id="usage-cache-write" class="usage-value">0</span></div>
|
|
192
|
+
<div class="usage-row"><span class="usage-label">Turns</span><span id="usage-turns" class="usage-value">0</span></div>
|
|
193
|
+
</div>
|
|
170
194
|
</div>
|
|
171
|
-
<div
|
|
172
|
-
<
|
|
173
|
-
<span>
|
|
174
|
-
<i data-lucide="
|
|
175
|
-
</
|
|
176
|
-
<div class="usage-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
195
|
+
<div id="status-panel" class="hidden">
|
|
196
|
+
<div class="usage-panel-header">
|
|
197
|
+
<span>Status</span>
|
|
198
|
+
<button id="status-panel-close" aria-label="Close"><i data-lucide="x"></i></button>
|
|
199
|
+
</div>
|
|
200
|
+
<div class="usage-panel-body">
|
|
201
|
+
<div class="usage-section-label">Process</div>
|
|
202
|
+
<div class="usage-row"><span class="usage-label">PID</span><span id="status-pid" class="usage-value">-</span></div>
|
|
203
|
+
<div class="usage-row"><span class="usage-label">Uptime</span><span id="status-uptime" class="usage-value">-</span></div>
|
|
204
|
+
<div class="usage-row"><span class="usage-label">RSS Memory</span><span id="status-rss" class="usage-value">-</span></div>
|
|
205
|
+
<div class="usage-row"><span class="usage-label">Heap Used</span><span id="status-heap-used" class="usage-value">-</span></div>
|
|
206
|
+
<div class="usage-row"><span class="usage-label">Heap Total</span><span id="status-heap-total" class="usage-value">-</span></div>
|
|
207
|
+
<div class="usage-row"><span class="usage-label">External</span><span id="status-external" class="usage-value">-</span></div>
|
|
208
|
+
<div class="usage-divider"></div>
|
|
209
|
+
<div class="usage-section-label">Sessions</div>
|
|
210
|
+
<div class="usage-row"><span class="usage-label">Active</span><span id="status-sessions" class="usage-value">-</span></div>
|
|
211
|
+
<div class="usage-row"><span class="usage-label">Processing</span><span id="status-processing" class="usage-value">-</span></div>
|
|
212
|
+
<div class="usage-row"><span class="usage-label">Clients</span><span id="status-clients" class="usage-value">-</span></div>
|
|
213
|
+
<div class="usage-row"><span class="usage-label">Terminals</span><span id="status-terminals" class="usage-value">-</span></div>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
<div id="context-panel" class="hidden">
|
|
217
|
+
<div class="usage-panel-header">
|
|
218
|
+
<span>Context</span>
|
|
219
|
+
<div class="usage-panel-actions">
|
|
220
|
+
<button id="context-panel-minimize" aria-label="Minimize" title="Minimize to input"><i data-lucide="minus"></i></button>
|
|
221
|
+
<button id="context-panel-close" aria-label="Close"><i data-lucide="x"></i></button>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
<div class="usage-panel-body">
|
|
225
|
+
<div class="usage-section-label">Context Window</div>
|
|
226
|
+
<div class="context-bar-wrap">
|
|
227
|
+
<div class="context-bar">
|
|
228
|
+
<div class="context-bar-fill" id="context-bar-fill"></div>
|
|
229
|
+
</div>
|
|
230
|
+
<span class="context-bar-pct" id="context-bar-pct">0%</span>
|
|
231
|
+
</div>
|
|
232
|
+
<div class="usage-row"><span class="usage-label">Used</span><span id="context-used" class="usage-value">-</span></div>
|
|
233
|
+
<div class="usage-row"><span class="usage-label">Window</span><span id="context-window" class="usage-value">-</span></div>
|
|
234
|
+
<div class="usage-row"><span class="usage-label">Max output</span><span id="context-max-output" class="usage-value">-</span></div>
|
|
235
|
+
<div class="usage-divider"></div>
|
|
236
|
+
<div class="usage-section-label">Session Tokens</div>
|
|
237
|
+
<div class="usage-row"><span class="usage-label">Input</span><span id="context-input" class="usage-value">0</span></div>
|
|
238
|
+
<div class="usage-row"><span class="usage-label">Output</span><span id="context-output" class="usage-value">0</span></div>
|
|
239
|
+
<div class="usage-row"><span class="usage-label">Cache read</span><span id="context-cache-read" class="usage-value">0</span></div>
|
|
240
|
+
<div class="usage-row"><span class="usage-label">Cache write</span><span id="context-cache-write" class="usage-value">0</span></div>
|
|
241
|
+
<div class="usage-divider"></div>
|
|
242
|
+
<div class="usage-section-label">Model</div>
|
|
243
|
+
<div class="usage-row"><span class="usage-label">Name</span><span id="context-model" class="usage-value">-</span></div>
|
|
244
|
+
<div class="usage-row"><span class="usage-label">Cost</span><span id="context-cost" class="usage-value">$0.0000</span></div>
|
|
245
|
+
<div class="usage-row"><span class="usage-label">Turns</span><span id="context-turns" class="usage-value">0</span></div>
|
|
246
|
+
</div>
|
|
184
247
|
</div>
|
|
185
248
|
</div>
|
|
186
249
|
<div id="todo-sticky" class="hidden"></div>
|
|
@@ -189,8 +252,14 @@
|
|
|
189
252
|
<div id="input-wrapper">
|
|
190
253
|
<div id="slash-menu"></div>
|
|
191
254
|
<div id="input-row">
|
|
255
|
+
<div id="context-mini" class="hidden">
|
|
256
|
+
<div class="context-mini-bar">
|
|
257
|
+
<div class="context-mini-fill" id="context-mini-fill"></div>
|
|
258
|
+
</div>
|
|
259
|
+
<span class="context-mini-label" id="context-mini-label">0%</span>
|
|
260
|
+
</div>
|
|
192
261
|
<div id="image-preview-bar"></div>
|
|
193
|
-
<textarea id="input" rows="1" placeholder="Message Claude Code..." enterkeyhint="send"></textarea>
|
|
262
|
+
<textarea id="input" rows="1" placeholder="Message Claude Code..." enterkeyhint="send" dir="auto"></textarea>
|
|
194
263
|
<div id="input-bottom">
|
|
195
264
|
<div id="attach-wrap">
|
|
196
265
|
<button id="attach-btn" type="button" aria-label="Attach"><i data-lucide="plus"></i></button>
|
|
@@ -215,6 +284,7 @@
|
|
|
215
284
|
<div class="file-viewer-header">
|
|
216
285
|
<span class="file-viewer-path" id="file-viewer-path"></span>
|
|
217
286
|
<button class="file-viewer-btn hidden" id="file-viewer-render" title="Toggle rendered view"><i data-lucide="book-open"></i></button>
|
|
287
|
+
<button class="file-viewer-btn hidden" id="file-viewer-history" title="Edit history"><i data-lucide="clock"></i></button>
|
|
218
288
|
<button class="file-viewer-btn" id="file-viewer-copy" title="Copy contents"><i data-lucide="copy"></i></button>
|
|
219
289
|
<button class="file-viewer-btn" id="file-viewer-close" title="Close"><i data-lucide="x"></i></button>
|
|
220
290
|
</div>
|
|
@@ -253,6 +323,14 @@
|
|
|
253
323
|
</div>
|
|
254
324
|
</div>
|
|
255
325
|
|
|
326
|
+
<div id="image-modal" class="hidden">
|
|
327
|
+
<div class="confirm-backdrop"></div>
|
|
328
|
+
<div class="image-modal-dialog">
|
|
329
|
+
<img id="image-modal-img" src="" alt="">
|
|
330
|
+
<button class="image-modal-close"><i data-lucide="x" style="width:18px;height:18px"></i></button>
|
|
331
|
+
</div>
|
|
332
|
+
</div>
|
|
333
|
+
|
|
256
334
|
<div id="mermaid-modal" class="hidden">
|
|
257
335
|
<div class="confirm-backdrop"></div>
|
|
258
336
|
<div class="mermaid-modal-dialog">
|
|
@@ -311,6 +389,11 @@
|
|
|
311
389
|
<div class="rewind-modal-title">Rewind to this point?</div>
|
|
312
390
|
<div class="rewind-modal-body">
|
|
313
391
|
<p id="rewind-summary"></p>
|
|
392
|
+
<div id="rewind-mode-options">
|
|
393
|
+
<label><input type="radio" name="rewind-mode" value="both" checked> Conversation and files</label>
|
|
394
|
+
<label><input type="radio" name="rewind-mode" value="chat"> Conversation only</label>
|
|
395
|
+
<label><input type="radio" name="rewind-mode" value="files"> Files only</label>
|
|
396
|
+
</div>
|
|
314
397
|
<div id="rewind-files-list"></div>
|
|
315
398
|
</div>
|
|
316
399
|
<div class="confirm-actions">
|