claude-relay 2.2.3 → 2.3.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.
- package/README.md +12 -0
- package/bin/cli.js +271 -22
- package/lib/config.js +39 -2
- package/lib/daemon.js +53 -1
- package/lib/ipc.js +7 -3
- package/lib/pages.js +15 -1
- package/lib/project.js +324 -27
- package/lib/public/app.js +313 -7
- package/lib/public/css/base.css +5 -0
- package/lib/public/css/diff.css +128 -0
- package/lib/public/css/filebrowser.css +541 -0
- package/lib/public/css/input.css +1 -0
- package/lib/public/css/menus.css +89 -5
- package/lib/public/css/messages.css +84 -49
- package/lib/public/css/overlays.css +40 -0
- package/lib/public/index.html +100 -17
- 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/tools.js +43 -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 +40 -7
- package/lib/server.js +37 -4
- package/lib/sessions.js +14 -5
- package/lib/terminal.js +2 -1
- package/package.json +1 -1
|
@@ -407,6 +407,45 @@ pre.mermaid-error {
|
|
|
407
407
|
max-height: 75vh;
|
|
408
408
|
}
|
|
409
409
|
|
|
410
|
+
/* --- Image lightbox modal --- */
|
|
411
|
+
#image-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
|
|
412
|
+
#image-modal.hidden { display: none; }
|
|
413
|
+
#image-modal .confirm-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(0, 0, 0, 0.8); }
|
|
414
|
+
|
|
415
|
+
.image-modal-dialog {
|
|
416
|
+
position: relative;
|
|
417
|
+
z-index: 1;
|
|
418
|
+
display: flex;
|
|
419
|
+
align-items: center;
|
|
420
|
+
justify-content: center;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
#image-modal-img {
|
|
424
|
+
max-width: 92vw;
|
|
425
|
+
max-height: 90vh;
|
|
426
|
+
border-radius: 12px;
|
|
427
|
+
object-fit: contain;
|
|
428
|
+
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
.image-modal-close {
|
|
432
|
+
position: fixed;
|
|
433
|
+
top: 16px;
|
|
434
|
+
right: 16px;
|
|
435
|
+
z-index: 2;
|
|
436
|
+
display: flex;
|
|
437
|
+
align-items: center;
|
|
438
|
+
justify-content: center;
|
|
439
|
+
background: rgba(0, 0, 0, 0.5);
|
|
440
|
+
border: none;
|
|
441
|
+
color: #fff;
|
|
442
|
+
cursor: pointer;
|
|
443
|
+
padding: 8px;
|
|
444
|
+
border-radius: 50%;
|
|
445
|
+
transition: background 0.15s;
|
|
446
|
+
}
|
|
447
|
+
.image-modal-close:hover { background: rgba(255, 255, 255, 0.2); }
|
|
448
|
+
|
|
410
449
|
/* ==========================================================================
|
|
411
450
|
Thinking
|
|
412
451
|
========================================================================== */
|
|
@@ -566,6 +605,37 @@ pre.mermaid-error {
|
|
|
566
605
|
white-space: nowrap;
|
|
567
606
|
}
|
|
568
607
|
|
|
608
|
+
.tool-desc.tool-desc-link {
|
|
609
|
+
cursor: pointer;
|
|
610
|
+
text-decoration: underline;
|
|
611
|
+
text-decoration-color: transparent;
|
|
612
|
+
text-underline-offset: 2px;
|
|
613
|
+
transition: color 0.15s, text-decoration-color 0.15s;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
.tool-desc.tool-desc-link:hover {
|
|
617
|
+
color: var(--accent);
|
|
618
|
+
text-decoration-color: var(--accent);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
.tool-desc-link-icon {
|
|
622
|
+
display: inline-flex;
|
|
623
|
+
align-items: center;
|
|
624
|
+
margin-left: 4px;
|
|
625
|
+
opacity: 0.3;
|
|
626
|
+
vertical-align: middle;
|
|
627
|
+
transition: opacity 0.15s;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
.tool-desc-link-icon .lucide {
|
|
631
|
+
width: 11px;
|
|
632
|
+
height: 11px;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
.tool-desc.tool-desc-link:hover .tool-desc-link-icon {
|
|
636
|
+
opacity: 0.8;
|
|
637
|
+
}
|
|
638
|
+
|
|
569
639
|
.tool-status-icon {
|
|
570
640
|
flex-shrink: 0;
|
|
571
641
|
width: 16px;
|
|
@@ -670,6 +740,13 @@ pre.mermaid-error {
|
|
|
670
740
|
}
|
|
671
741
|
|
|
672
742
|
.edit-diff-path { flex: 1; }
|
|
743
|
+
.edit-diff-path-link {
|
|
744
|
+
cursor: pointer;
|
|
745
|
+
}
|
|
746
|
+
.edit-diff-path-link:hover {
|
|
747
|
+
color: var(--accent);
|
|
748
|
+
text-decoration: underline;
|
|
749
|
+
}
|
|
673
750
|
|
|
674
751
|
.edit-diff-toggles {
|
|
675
752
|
display: inline-flex;
|
|
@@ -695,61 +772,19 @@ pre.mermaid-error {
|
|
|
695
772
|
.edit-diff-toggle.active { color: var(--text); background: var(--sidebar-active); }
|
|
696
773
|
.edit-diff-toggle + .edit-diff-toggle { border-left: 1px solid var(--border); }
|
|
697
774
|
|
|
698
|
-
|
|
699
|
-
|
|
775
|
+
/* Constrain diff module tables inside tool results */
|
|
776
|
+
.edit-diff .diff-unified,
|
|
777
|
+
.edit-diff .diff-split-view,
|
|
778
|
+
.tool-result-block > .diff-unified {
|
|
700
779
|
max-height: 300px;
|
|
701
|
-
overflow
|
|
702
|
-
overflow-x: hidden;
|
|
780
|
+
overflow: auto;
|
|
703
781
|
}
|
|
704
782
|
|
|
705
|
-
.edit-diff-
|
|
706
|
-
|
|
707
|
-
max-height: none;
|
|
708
|
-
overflow-y: visible;
|
|
709
|
-
font-family: "SF Mono", Menlo, Monaco, monospace;
|
|
783
|
+
.edit-diff .diff-table,
|
|
784
|
+
.tool-result-block > .diff-unified .diff-table {
|
|
710
785
|
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
786
|
}
|
|
724
787
|
|
|
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
788
|
/* --- Code viewer (Read tool) --- */
|
|
754
789
|
.code-viewer {
|
|
755
790
|
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>
|
|
@@ -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,6 +252,12 @@
|
|
|
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
262
|
<textarea id="input" rows="1" placeholder="Message Claude Code..." enterkeyhint="send"></textarea>
|
|
194
263
|
<div id="input-bottom">
|
|
@@ -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">
|