clay-server 2.5.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/LICENSE +21 -0
- package/README.md +281 -0
- package/bin/cli.js +2385 -0
- package/lib/cli-sessions.js +270 -0
- package/lib/config.js +237 -0
- package/lib/daemon.js +489 -0
- package/lib/ipc.js +112 -0
- package/lib/notes.js +120 -0
- package/lib/pages.js +664 -0
- package/lib/project.js +1433 -0
- package/lib/public/app.js +2795 -0
- package/lib/public/apple-touch-icon-dark.png +0 -0
- package/lib/public/apple-touch-icon.png +0 -0
- package/lib/public/css/base.css +264 -0
- package/lib/public/css/diff.css +128 -0
- package/lib/public/css/filebrowser.css +1114 -0
- package/lib/public/css/highlight.css +144 -0
- package/lib/public/css/icon-strip.css +296 -0
- package/lib/public/css/input.css +573 -0
- package/lib/public/css/menus.css +856 -0
- package/lib/public/css/messages.css +1445 -0
- package/lib/public/css/mobile-nav.css +354 -0
- package/lib/public/css/overlays.css +697 -0
- package/lib/public/css/rewind.css +505 -0
- package/lib/public/css/server-settings.css +761 -0
- package/lib/public/css/sidebar.css +936 -0
- package/lib/public/css/sticky-notes.css +358 -0
- package/lib/public/css/title-bar.css +314 -0
- package/lib/public/favicon-dark.svg +1 -0
- package/lib/public/favicon.svg +1 -0
- package/lib/public/icon-192-dark.png +0 -0
- package/lib/public/icon-192.png +0 -0
- package/lib/public/icon-512-dark.png +0 -0
- package/lib/public/icon-512.png +0 -0
- package/lib/public/icon-mono.svg +1 -0
- package/lib/public/index.html +762 -0
- package/lib/public/manifest.json +27 -0
- package/lib/public/modules/diff.js +398 -0
- package/lib/public/modules/events.js +21 -0
- package/lib/public/modules/filebrowser.js +1411 -0
- package/lib/public/modules/fileicons.js +172 -0
- package/lib/public/modules/icons.js +54 -0
- package/lib/public/modules/input.js +584 -0
- package/lib/public/modules/markdown.js +356 -0
- package/lib/public/modules/notifications.js +649 -0
- package/lib/public/modules/qrcode.js +70 -0
- package/lib/public/modules/rewind.js +345 -0
- package/lib/public/modules/server-settings.js +510 -0
- package/lib/public/modules/sidebar.js +1083 -0
- package/lib/public/modules/state.js +3 -0
- package/lib/public/modules/sticky-notes.js +688 -0
- package/lib/public/modules/terminal.js +697 -0
- package/lib/public/modules/theme.js +738 -0
- package/lib/public/modules/tools.js +1608 -0
- package/lib/public/modules/utils.js +56 -0
- package/lib/public/style.css +15 -0
- package/lib/public/sw.js +75 -0
- package/lib/push.js +124 -0
- package/lib/sdk-bridge.js +989 -0
- package/lib/server.js +582 -0
- package/lib/sessions.js +424 -0
- package/lib/terminal-manager.js +187 -0
- package/lib/terminal.js +24 -0
- package/lib/themes/ayu-light.json +9 -0
- package/lib/themes/catppuccin-latte.json +9 -0
- package/lib/themes/catppuccin-mocha.json +9 -0
- package/lib/themes/clay-light.json +10 -0
- package/lib/themes/clay.json +10 -0
- package/lib/themes/dracula.json +9 -0
- package/lib/themes/everforest-light.json +9 -0
- package/lib/themes/everforest.json +9 -0
- package/lib/themes/github-light.json +9 -0
- package/lib/themes/gruvbox-dark.json +9 -0
- package/lib/themes/gruvbox-light.json +9 -0
- package/lib/themes/monokai.json +9 -0
- package/lib/themes/nord-light.json +9 -0
- package/lib/themes/nord.json +9 -0
- package/lib/themes/one-dark.json +9 -0
- package/lib/themes/one-light.json +9 -0
- package/lib/themes/rose-pine-dawn.json +9 -0
- package/lib/themes/rose-pine.json +9 -0
- package/lib/themes/solarized-dark.json +9 -0
- package/lib/themes/solarized-light.json +9 -0
- package/lib/themes/tokyo-night-light.json +9 -0
- package/lib/themes/tokyo-night.json +9 -0
- package/lib/updater.js +97 -0
- package/package.json +47 -0
|
@@ -0,0 +1,762 @@
|
|
|
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, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
|
|
6
|
+
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
7
|
+
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
|
8
|
+
<link rel="manifest" href="manifest.json">
|
|
9
|
+
<meta name="theme-color" content="#2F2E2B">
|
|
10
|
+
<link rel="icon" type="image/svg+xml" href="favicon.svg">
|
|
11
|
+
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
|
12
|
+
<title>Clay</title>
|
|
13
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
14
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
15
|
+
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@400;500&family=Nunito:wght@700;800&display=swap" rel="stylesheet">
|
|
16
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@xterm/xterm@5/css/xterm.min.css">
|
|
17
|
+
<script>
|
|
18
|
+
(function(){try{var k="clay-theme-vars",v=localStorage.getItem(k),r=document.documentElement;if(v){var o=JSON.parse(v),p;for(p in o)r.style.setProperty(p,o[p]);var vt=localStorage.getItem(k.replace("-vars","-variant"));if(vt==="light"){r.classList.add("light-theme");r.classList.remove("dark-theme")}else{r.classList.add("dark-theme");r.classList.remove("light-theme")}var m=document.querySelector('meta[name="theme-color"]');if(m&&o["--bg"])m.setAttribute("content",o["--bg"])}else{var sl=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches;if(sl){r.classList.add("light-theme");r.classList.remove("dark-theme")}}}catch(e){}})();
|
|
19
|
+
</script>
|
|
20
|
+
<link rel="stylesheet" href="style.css">
|
|
21
|
+
</head>
|
|
22
|
+
<body>
|
|
23
|
+
<div id="layout">
|
|
24
|
+
<!-- === Top Bar (full width, forms reverse-ㄱ with icon strip) === -->
|
|
25
|
+
<div id="top-bar">
|
|
26
|
+
<a href="https://github.com/chadbyte/claude-relay" target="_blank" rel="noopener" class="top-bar-title"><img class="top-bar-icon" src="favicon.svg" width="16" height="16" alt="">Clay</a>
|
|
27
|
+
<div class="top-bar-actions">
|
|
28
|
+
<span id="client-count" class="hidden"></span>
|
|
29
|
+
<div id="debug-menu-wrap" class="hidden">
|
|
30
|
+
<button id="debug-btn" title="Debug"><i data-lucide="bug"></i></button>
|
|
31
|
+
<div id="debug-menu" class="hidden">
|
|
32
|
+
<label class="notif-option">
|
|
33
|
+
<span>Update banner</span>
|
|
34
|
+
<input type="checkbox" id="debug-toggle-update">
|
|
35
|
+
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
36
|
+
</label>
|
|
37
|
+
<label class="notif-option">
|
|
38
|
+
<span>Onboarding banner</span>
|
|
39
|
+
<input type="checkbox" id="debug-toggle-onboarding">
|
|
40
|
+
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
41
|
+
</label>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
<button id="theme-toggle-btn" title="Toggle dark/light mode"><i data-lucide="moon"></i></button>
|
|
45
|
+
<button id="qr-btn" title="Share"><i data-lucide="share"></i></button>
|
|
46
|
+
<button id="server-settings-btn" title="Server settings"><i data-lucide="settings"></i></button>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<!-- === Bottom row === -->
|
|
51
|
+
<div id="layout-body">
|
|
52
|
+
|
|
53
|
+
<!-- === Icon Strip === -->
|
|
54
|
+
<div id="icon-strip">
|
|
55
|
+
<div class="icon-strip-home" title="Clay">
|
|
56
|
+
<span class="icon-strip-pill"></span>
|
|
57
|
+
<img class="footer-mascot icon-strip-logo" src="favicon.svg" width="38" height="38" alt="Clay">
|
|
58
|
+
<span class="icon-strip-status"></span>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="icon-strip-separator"></div>
|
|
61
|
+
<div class="icon-strip-projects" id="icon-strip-projects"></div>
|
|
62
|
+
<button class="icon-strip-add" id="icon-strip-add" title="Add project"><i data-lucide="plus"></i></button>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<!-- === Main Area (sidebar + resize-handle + main-column) === -->
|
|
66
|
+
<div id="main-area">
|
|
67
|
+
<div id="sidebar-column">
|
|
68
|
+
<div class="title-bar-sidebar">
|
|
69
|
+
<span class="title-bar-project-name" id="title-bar-project-name"></span>
|
|
70
|
+
</div>
|
|
71
|
+
<div id="sidebar">
|
|
72
|
+
<div id="sidebar-tools">
|
|
73
|
+
<div id="session-actions">
|
|
74
|
+
<button id="file-browser-btn"><i data-lucide="folder-tree"></i> <span>File browser</span></button>
|
|
75
|
+
<button id="terminal-sidebar-btn"><i data-lucide="square-terminal"></i> <span>Terminal</span><span id="terminal-sidebar-count" class="sidebar-badge hidden"></span></button>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
<div id="sidebar-sessions-header">
|
|
79
|
+
<div id="sessions-header-content">
|
|
80
|
+
<div class="session-list-header">
|
|
81
|
+
<span>Sessions</span>
|
|
82
|
+
<div class="session-list-header-actions">
|
|
83
|
+
<button id="new-session-btn" type="button" data-tip="New session"><i data-lucide="plus"></i></button>
|
|
84
|
+
<button id="resume-session-btn" type="button" data-tip="Import CLI session"><i data-lucide="import"></i></button>
|
|
85
|
+
<button id="search-session-btn" type="button" data-tip="Search sessions"><i data-lucide="search"></i></button>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
<div id="session-search" class="hidden">
|
|
89
|
+
<input id="session-search-input" type="text" placeholder="Search sessions..." autocomplete="off" spellcheck="false" />
|
|
90
|
+
<button id="session-search-clear" type="button" aria-label="Clear search"><i data-lucide="x"></i></button>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
<div id="files-header-content" class="hidden">
|
|
94
|
+
<div class="session-list-header">
|
|
95
|
+
<span>File Browser</span>
|
|
96
|
+
<div class="session-list-header-actions">
|
|
97
|
+
<button id="file-panel-refresh" type="button" title="Refresh file tree"><i data-lucide="refresh-cw"></i></button>
|
|
98
|
+
<button id="file-panel-close" type="button" title="Close file browser"><i data-lucide="x"></i></button>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
<div id="sidebar-panel-projects" class="sidebar-panel hidden">
|
|
104
|
+
<div id="project-list"></div>
|
|
105
|
+
</div>
|
|
106
|
+
<div id="sidebar-panel-sessions" class="sidebar-panel">
|
|
107
|
+
<div id="session-list"></div>
|
|
108
|
+
</div>
|
|
109
|
+
<div id="sidebar-panel-files" class="sidebar-panel hidden">
|
|
110
|
+
<div id="file-tree"></div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
<div id="sidebar-resize-handle"></div>
|
|
115
|
+
<div id="sidebar-overlay"></div>
|
|
116
|
+
<div id="main-column">
|
|
117
|
+
<div class="title-bar-content">
|
|
118
|
+
<div id="header-left">
|
|
119
|
+
<button id="sidebar-expand-btn" title="Open sidebar"><i data-lucide="panel-left-open"></i></button>
|
|
120
|
+
<button id="hamburger-btn" aria-label="Toggle sidebar"><i data-lucide="menu"></i></button>
|
|
121
|
+
<span class="header-title" id="header-title">Connecting...</span>
|
|
122
|
+
<button id="header-info-btn" type="button" title="Session info"><i data-lucide="info"></i></button>
|
|
123
|
+
<button id="header-rename-btn" type="button" title="Rename session"><i data-lucide="pencil"></i></button>
|
|
124
|
+
</div>
|
|
125
|
+
<div id="todo-sticky" class="hidden"></div>
|
|
126
|
+
<div class="status">
|
|
127
|
+
<button id="sticky-notes-toggle-btn" title="Sticky notes"><i data-lucide="notepad-text"></i><span class="sticky-notes-count hidden"></span></button>
|
|
128
|
+
<button id="terminal-toggle-btn" title="Terminal"><i data-lucide="square-terminal"></i><span id="terminal-count" class="hidden"></span></button>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
<div id="main-panels">
|
|
132
|
+
<div id="app">
|
|
133
|
+
<div id="update-banner" class="hidden">
|
|
134
|
+
<span class="update-banner-text"><i data-lucide="arrow-up-circle"></i> A new version of Clay is available: <strong id="update-version"></strong></span>
|
|
135
|
+
<button id="update-now">Update now</button>
|
|
136
|
+
<button id="update-how" title="Manual update instructions">?</button>
|
|
137
|
+
<button id="update-banner-close" aria-label="Dismiss"><i data-lucide="x"></i></button>
|
|
138
|
+
</div>
|
|
139
|
+
<div id="onboarding-banner" class="hidden">
|
|
140
|
+
<span class="onboarding-banner-text" id="onboarding-banner-text"></span>
|
|
141
|
+
<button id="onboarding-banner-close" aria-label="Dismiss"><i data-lucide="x"></i></button>
|
|
142
|
+
</div>
|
|
143
|
+
<div id="skip-perms-banner" class="hidden">
|
|
144
|
+
<i data-lucide="shield-off"></i>
|
|
145
|
+
<span>Skip permissions mode is active. All tool executions are auto-approved.</span>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<div id="connect-overlay">
|
|
149
|
+
<img class="connect-logo" src="favicon.svg" width="48" height="48" alt="Clay">
|
|
150
|
+
<span class="connect-wordmark">Clay</span>
|
|
151
|
+
</div>
|
|
152
|
+
<div id="sticky-notes-container" class="hidden"></div>
|
|
153
|
+
<div id="messages"></div>
|
|
154
|
+
|
|
155
|
+
<div id="info-panels">
|
|
156
|
+
<div id="usage-panel" class="hidden">
|
|
157
|
+
<div class="usage-panel-header">
|
|
158
|
+
<span>Usage</span>
|
|
159
|
+
<button id="usage-panel-close" aria-label="Close"><i data-lucide="x"></i></button>
|
|
160
|
+
</div>
|
|
161
|
+
<div class="usage-panel-body">
|
|
162
|
+
<a href="https://claude.ai/settings/usage" target="_blank" rel="noopener" class="usage-external-link">
|
|
163
|
+
<span>Check plan usage on claude.ai</span>
|
|
164
|
+
<i data-lucide="external-link"></i>
|
|
165
|
+
</a>
|
|
166
|
+
<div class="usage-divider"></div>
|
|
167
|
+
<div class="usage-section-label">Session</div>
|
|
168
|
+
<div class="usage-row"><span class="usage-label">Cost</span><span id="usage-cost" class="usage-value">$0.0000</span></div>
|
|
169
|
+
<div class="usage-row"><span class="usage-label">Input tokens</span><span id="usage-input" class="usage-value">0</span></div>
|
|
170
|
+
<div class="usage-row"><span class="usage-label">Output tokens</span><span id="usage-output" class="usage-value">0</span></div>
|
|
171
|
+
<div class="usage-row"><span class="usage-label">Cache read</span><span id="usage-cache-read" class="usage-value">0</span></div>
|
|
172
|
+
<div class="usage-row"><span class="usage-label">Cache write</span><span id="usage-cache-write" class="usage-value">0</span></div>
|
|
173
|
+
<div class="usage-row"><span class="usage-label">Turns</span><span id="usage-turns" class="usage-value">0</span></div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
<div id="status-panel" class="hidden">
|
|
177
|
+
<div class="usage-panel-header">
|
|
178
|
+
<span>Status</span>
|
|
179
|
+
<button id="status-panel-close" aria-label="Close"><i data-lucide="x"></i></button>
|
|
180
|
+
</div>
|
|
181
|
+
<div class="usage-panel-body">
|
|
182
|
+
<div class="usage-section-label">Process</div>
|
|
183
|
+
<div class="usage-row"><span class="usage-label">PID</span><span id="status-pid" class="usage-value">-</span></div>
|
|
184
|
+
<div class="usage-row"><span class="usage-label">Uptime</span><span id="status-uptime" class="usage-value">-</span></div>
|
|
185
|
+
<div class="usage-row"><span class="usage-label">RSS Memory</span><span id="status-rss" class="usage-value">-</span></div>
|
|
186
|
+
<div class="usage-row"><span class="usage-label">Heap Used</span><span id="status-heap-used" class="usage-value">-</span></div>
|
|
187
|
+
<div class="usage-row"><span class="usage-label">Heap Total</span><span id="status-heap-total" class="usage-value">-</span></div>
|
|
188
|
+
<div class="usage-row"><span class="usage-label">External</span><span id="status-external" class="usage-value">-</span></div>
|
|
189
|
+
<div class="usage-divider"></div>
|
|
190
|
+
<div class="usage-section-label">Sessions</div>
|
|
191
|
+
<div class="usage-row"><span class="usage-label">Active</span><span id="status-sessions" class="usage-value">-</span></div>
|
|
192
|
+
<div class="usage-row"><span class="usage-label">Processing</span><span id="status-processing" class="usage-value">-</span></div>
|
|
193
|
+
<div class="usage-row"><span class="usage-label">Clients</span><span id="status-clients" class="usage-value">-</span></div>
|
|
194
|
+
<div class="usage-row"><span class="usage-label">Terminals</span><span id="status-terminals" class="usage-value">-</span></div>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
<div id="context-panel" class="hidden">
|
|
198
|
+
<div class="usage-panel-header">
|
|
199
|
+
<span>Context</span>
|
|
200
|
+
<div class="usage-panel-actions">
|
|
201
|
+
<button id="context-panel-minimize" aria-label="Minimize" title="Minimize to input"><i data-lucide="minus"></i></button>
|
|
202
|
+
<button id="context-panel-close" aria-label="Close"><i data-lucide="x"></i></button>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
<div class="usage-panel-body">
|
|
206
|
+
<div class="usage-section-label">Context Window</div>
|
|
207
|
+
<div class="context-bar-wrap">
|
|
208
|
+
<div class="context-bar">
|
|
209
|
+
<div class="context-bar-fill" id="context-bar-fill"></div>
|
|
210
|
+
</div>
|
|
211
|
+
<span class="context-bar-pct" id="context-bar-pct">0%</span>
|
|
212
|
+
</div>
|
|
213
|
+
<div class="usage-row"><span class="usage-label">Used</span><span id="context-used" class="usage-value">-</span></div>
|
|
214
|
+
<div class="usage-row"><span class="usage-label">Window</span><span id="context-window" class="usage-value">-</span></div>
|
|
215
|
+
<div class="usage-row"><span class="usage-label">Max output</span><span id="context-max-output" class="usage-value">-</span></div>
|
|
216
|
+
<div class="usage-divider"></div>
|
|
217
|
+
<div class="usage-section-label">Session Tokens</div>
|
|
218
|
+
<div class="usage-row"><span class="usage-label">Input</span><span id="context-input" class="usage-value">0</span></div>
|
|
219
|
+
<div class="usage-row"><span class="usage-label">Output</span><span id="context-output" class="usage-value">0</span></div>
|
|
220
|
+
<div class="usage-row"><span class="usage-label">Cache read</span><span id="context-cache-read" class="usage-value">0</span></div>
|
|
221
|
+
<div class="usage-row"><span class="usage-label">Cache write</span><span id="context-cache-write" class="usage-value">0</span></div>
|
|
222
|
+
<div class="usage-divider"></div>
|
|
223
|
+
<div class="usage-section-label">Model</div>
|
|
224
|
+
<div class="usage-row"><span class="usage-label">Name</span><span id="context-model" class="usage-value">-</span></div>
|
|
225
|
+
<div class="usage-row"><span class="usage-label">Cost</span><span id="context-cost" class="usage-value">$0.0000</span></div>
|
|
226
|
+
<div class="usage-row"><span class="usage-label">Turns</span><span id="context-turns" class="usage-value">0</span></div>
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
<button id="new-msg-btn" class="hidden" aria-label="Scroll to bottom"></button>
|
|
231
|
+
<div id="input-area">
|
|
232
|
+
<div id="input-wrapper">
|
|
233
|
+
<div id="slash-menu"></div>
|
|
234
|
+
<div id="suggestion-chips" class="hidden"></div>
|
|
235
|
+
<div id="input-row">
|
|
236
|
+
<div id="context-mini" class="hidden">
|
|
237
|
+
<div class="context-mini-bar">
|
|
238
|
+
<div class="context-mini-fill" id="context-mini-fill"></div>
|
|
239
|
+
</div>
|
|
240
|
+
<span class="context-mini-label" id="context-mini-label">0%</span>
|
|
241
|
+
</div>
|
|
242
|
+
<div id="image-preview-bar"></div>
|
|
243
|
+
<textarea id="input" rows="1" placeholder="Message Claude Code..." enterkeyhint="send" dir="auto"></textarea>
|
|
244
|
+
<div id="input-bottom">
|
|
245
|
+
<div id="attach-wrap">
|
|
246
|
+
<button id="attach-btn" type="button" aria-label="Attach"><i data-lucide="plus"></i></button>
|
|
247
|
+
<div id="attach-menu" class="hidden">
|
|
248
|
+
<button class="attach-menu-item" id="attach-camera"><i data-lucide="camera"></i> <span>Take Photo</span></button>
|
|
249
|
+
<button class="attach-menu-item" id="attach-photos"><i data-lucide="image"></i> <span>Add Photos</span></button>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
<div id="input-bottom-right">
|
|
253
|
+
<div id="config-chip-wrap" class="hidden">
|
|
254
|
+
<button id="config-chip" title="Model, mode, and effort settings">
|
|
255
|
+
<span id="config-chip-label"></span>
|
|
256
|
+
<i data-lucide="chevron-down"></i>
|
|
257
|
+
</button>
|
|
258
|
+
<div id="config-popover" class="hidden">
|
|
259
|
+
<div class="config-section">
|
|
260
|
+
<div class="config-section-label">MODEL</div>
|
|
261
|
+
<div id="config-model-list" class="config-radio-list"></div>
|
|
262
|
+
</div>
|
|
263
|
+
<div class="config-section">
|
|
264
|
+
<div class="config-section-label">MODE</div>
|
|
265
|
+
<div id="config-mode-list" class="config-radio-list"></div>
|
|
266
|
+
</div>
|
|
267
|
+
<div id="config-effort-section" class="config-section">
|
|
268
|
+
<div class="config-section-label">EFFORT</div>
|
|
269
|
+
<div id="config-effort-bar" class="config-segmented"></div>
|
|
270
|
+
</div>
|
|
271
|
+
<div id="config-beta-section" class="config-section" style="display:none">
|
|
272
|
+
<div class="config-section-label">BETA</div>
|
|
273
|
+
<div class="config-toggle-row">
|
|
274
|
+
<span class="config-toggle-label">1M Context</span>
|
|
275
|
+
<button id="config-beta-1m" class="config-toggle-btn" role="switch" aria-checked="false">
|
|
276
|
+
<span class="config-toggle-knob"></span>
|
|
277
|
+
</button>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
<button id="send-btn" disabled aria-label="Send"><i data-lucide="arrow-up"></i></button>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
<!-- Mobile fullscreen sheet overlay (Projects / Sessions) -->
|
|
290
|
+
<div id="mobile-sheet" class="hidden">
|
|
291
|
+
<div class="mobile-sheet-backdrop"></div>
|
|
292
|
+
<div class="mobile-sheet-content">
|
|
293
|
+
<div class="mobile-sheet-handle"></div>
|
|
294
|
+
<div class="mobile-sheet-header">
|
|
295
|
+
<span class="mobile-sheet-title"></span>
|
|
296
|
+
<button class="mobile-sheet-close"><i data-lucide="x"></i></button>
|
|
297
|
+
</div>
|
|
298
|
+
<div class="mobile-sheet-list"></div>
|
|
299
|
+
</div>
|
|
300
|
+
</div>
|
|
301
|
+
|
|
302
|
+
<!-- Mobile bottom tab bar -->
|
|
303
|
+
<div id="mobile-tab-bar">
|
|
304
|
+
<button class="mobile-tab" data-tab="projects"><i data-lucide="folder-kanban"></i><span class="mobile-tab-label">Projects</span></button>
|
|
305
|
+
<button class="mobile-tab" data-tab="sessions"><i data-lucide="messages-square"></i><span class="mobile-tab-label">Sessions</span></button>
|
|
306
|
+
<button class="mobile-tab-new" id="mobile-new-session-btn"><i data-lucide="plus"></i></button>
|
|
307
|
+
<button class="mobile-tab" data-tab="files"><i data-lucide="folder-tree"></i><span class="mobile-tab-label">Files</span></button>
|
|
308
|
+
<button class="mobile-tab" data-tab="terminal"><i data-lucide="square-terminal"></i><span id="mobile-terminal-count" class="mobile-tab-badge hidden"></span><span class="mobile-tab-label">Terminal</span></button>
|
|
309
|
+
</div>
|
|
310
|
+
|
|
311
|
+
<div id="file-viewer" class="hidden">
|
|
312
|
+
<div class="file-viewer-header">
|
|
313
|
+
<span class="file-viewer-path" id="file-viewer-path"></span>
|
|
314
|
+
<button class="file-viewer-btn hidden" id="file-viewer-render" title="Toggle rendered view"><i data-lucide="book-open"></i></button>
|
|
315
|
+
<button class="file-viewer-btn hidden" id="file-viewer-pdf" title="Export PDF"><i data-lucide="file-down"></i></button>
|
|
316
|
+
<button class="file-viewer-btn hidden" id="file-viewer-history" title="Edit history"><i data-lucide="clock"></i></button>
|
|
317
|
+
<button class="file-viewer-btn" id="file-viewer-copy" title="Copy contents"><i data-lucide="copy"></i></button>
|
|
318
|
+
<button class="file-viewer-btn" id="file-viewer-fullscreen" title="Toggle fullscreen"><i data-lucide="maximize-2"></i></button>
|
|
319
|
+
<button class="file-viewer-btn" id="file-viewer-close" title="Close"><i data-lucide="x"></i></button>
|
|
320
|
+
</div>
|
|
321
|
+
<div class="file-viewer-body" id="file-viewer-body"></div>
|
|
322
|
+
</div>
|
|
323
|
+
<div id="terminal-container" class="hidden">
|
|
324
|
+
<div class="terminal-header">
|
|
325
|
+
<div id="terminal-tabs" class="terminal-tabs"></div>
|
|
326
|
+
<button class="terminal-new-tab-btn" id="terminal-new-tab" title="New tab"><i data-lucide="plus"></i></button>
|
|
327
|
+
<div class="terminal-header-actions">
|
|
328
|
+
<button class="file-viewer-btn" id="terminal-fullscreen" title="Toggle fullscreen"><i data-lucide="maximize-2"></i></button>
|
|
329
|
+
<button class="file-viewer-btn" id="terminal-close" title="Hide panel"><i data-lucide="minus"></i></button>
|
|
330
|
+
</div>
|
|
331
|
+
</div>
|
|
332
|
+
<div id="terminal-toolbar" class="hidden">
|
|
333
|
+
<button class="term-key" data-key="tab">Tab</button>
|
|
334
|
+
<button class="term-key term-key-toggle" data-key="ctrl">Ctrl</button>
|
|
335
|
+
<button class="term-key" data-key="esc">Esc</button>
|
|
336
|
+
<span class="term-key-spacer"></span>
|
|
337
|
+
<button class="term-key term-key-arrow" data-key="up">▲</button>
|
|
338
|
+
<button class="term-key term-key-arrow" data-key="down">▼</button>
|
|
339
|
+
<button class="term-key term-key-arrow" data-key="left">◀</button>
|
|
340
|
+
<button class="term-key term-key-arrow" data-key="right">▶</button>
|
|
341
|
+
</div>
|
|
342
|
+
<div id="terminal-body"></div>
|
|
343
|
+
</div>
|
|
344
|
+
</div><!-- /main-panels -->
|
|
345
|
+
</div><!-- /main-column -->
|
|
346
|
+
</div><!-- /main-area -->
|
|
347
|
+
|
|
348
|
+
<!-- === User Island === -->
|
|
349
|
+
<div id="user-island">
|
|
350
|
+
<div class="user-island-avatar"><span class="user-island-avatar-letter">C</span></div>
|
|
351
|
+
<div class="user-island-info">
|
|
352
|
+
<span class="user-island-name">Clay <span id="footer-version" class="footer-version"></span></span>
|
|
353
|
+
</div>
|
|
354
|
+
<div class="user-island-actions">
|
|
355
|
+
<a href="https://github.com/chadbyte/claude-relay" target="_blank" rel="noopener" class="user-island-chip" title="Star on GitHub"><svg class="chip-octocat" viewBox="0 0 16 16" fill="white" width="13" height="13"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg><span class="chip-star">★</span><span class="chip-label">Star Clay</span></a>
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
|
|
359
|
+
</div><!-- /layout-body -->
|
|
360
|
+
</div><!-- /layout -->
|
|
361
|
+
|
|
362
|
+
<!-- QR / Share overlay -->
|
|
363
|
+
<div id="qr-overlay" class="hidden">
|
|
364
|
+
<div id="qr-overlay-inner">
|
|
365
|
+
<div id="qr-canvas"></div>
|
|
366
|
+
<div id="qr-url"></div>
|
|
367
|
+
</div>
|
|
368
|
+
</div>
|
|
369
|
+
|
|
370
|
+
<!-- Hidden notification toggles (synced by server-settings) -->
|
|
371
|
+
<div id="notif-menu-wrap" style="display:none">
|
|
372
|
+
<button id="notif-btn"></button>
|
|
373
|
+
<div id="notif-menu">
|
|
374
|
+
<label class="notif-option" id="notif-push-row">
|
|
375
|
+
<span>Push notifications</span>
|
|
376
|
+
<input type="checkbox" id="notif-toggle-push">
|
|
377
|
+
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
378
|
+
</label>
|
|
379
|
+
<label class="notif-option">
|
|
380
|
+
<span>Browser alerts</span>
|
|
381
|
+
<input type="checkbox" id="notif-toggle-alert">
|
|
382
|
+
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
383
|
+
</label>
|
|
384
|
+
<div id="notif-blocked-hint" class="hidden">Blocked by browser. <a href="#" id="notif-learn-more">Learn more</a></div>
|
|
385
|
+
<label class="notif-option">
|
|
386
|
+
<span>Sound</span>
|
|
387
|
+
<input type="checkbox" id="notif-toggle-sound">
|
|
388
|
+
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
389
|
+
</label>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
|
|
393
|
+
<!-- === Server Settings (full-screen overlay) === -->
|
|
394
|
+
<div id="server-settings" class="hidden">
|
|
395
|
+
<div class="server-settings-layout">
|
|
396
|
+
<div class="server-settings-nav">
|
|
397
|
+
<div class="server-settings-nav-inner">
|
|
398
|
+
<div class="server-settings-nav-header" id="settings-server-name"></div>
|
|
399
|
+
<div class="server-settings-nav-items">
|
|
400
|
+
<div class="settings-nav-category">General</div>
|
|
401
|
+
<button class="settings-nav-item active" data-section="overview"><span>Overview</span></button>
|
|
402
|
+
<button class="settings-nav-item" data-section="models"><span>Models</span></button>
|
|
403
|
+
<div class="settings-nav-separator"></div>
|
|
404
|
+
<div class="settings-nav-category">Configuration</div>
|
|
405
|
+
<button class="settings-nav-item" data-section="security"><span>Security</span></button>
|
|
406
|
+
<button class="settings-nav-item" data-section="notifications"><span>Notifications</span></button>
|
|
407
|
+
<button class="settings-nav-item" data-section="appearance"><span>Appearance</span></button>
|
|
408
|
+
<div class="settings-nav-separator"></div>
|
|
409
|
+
<div class="settings-nav-category">System</div>
|
|
410
|
+
<button class="settings-nav-item" data-section="advanced"><span>Advanced</span></button>
|
|
411
|
+
<div class="settings-nav-separator"></div>
|
|
412
|
+
<button class="settings-nav-item settings-nav-danger" data-section="shutdown"><span>Shutdown Server</span></button>
|
|
413
|
+
</div>
|
|
414
|
+
</div>
|
|
415
|
+
</div>
|
|
416
|
+
<div class="server-settings-content">
|
|
417
|
+
<div class="server-settings-content-inner">
|
|
418
|
+
<div class="server-settings-section active" data-section="overview">
|
|
419
|
+
<h2>Server Overview</h2>
|
|
420
|
+
<div class="settings-card">
|
|
421
|
+
<div class="settings-field">
|
|
422
|
+
<label class="settings-label">Project Name</label>
|
|
423
|
+
<div class="settings-value" id="settings-project-name">-</div>
|
|
424
|
+
</div>
|
|
425
|
+
<div class="settings-field">
|
|
426
|
+
<label class="settings-label">Working Directory</label>
|
|
427
|
+
<div class="settings-value settings-mono" id="settings-project-cwd">-</div>
|
|
428
|
+
</div>
|
|
429
|
+
<div class="settings-field">
|
|
430
|
+
<label class="settings-label">Server Version</label>
|
|
431
|
+
<div class="settings-value" id="settings-server-version">-</div>
|
|
432
|
+
<button class="settings-btn-sm settings-btn-update" id="settings-update-check"><i data-lucide="refresh-cw"></i> Check for updates</button>
|
|
433
|
+
</div>
|
|
434
|
+
<div class="settings-field-row">
|
|
435
|
+
<label class="settings-label">Port</label>
|
|
436
|
+
<span class="settings-value settings-mono" id="settings-port">-</span>
|
|
437
|
+
</div>
|
|
438
|
+
<div class="settings-field-row">
|
|
439
|
+
<label class="settings-label">HTTPS</label>
|
|
440
|
+
<span class="settings-value settings-badge" id="settings-tls">-</span>
|
|
441
|
+
</div>
|
|
442
|
+
<div class="settings-field-row">
|
|
443
|
+
<label class="settings-label">Debug Mode</label>
|
|
444
|
+
<span class="settings-value settings-badge" id="settings-debug">-</span>
|
|
445
|
+
</div>
|
|
446
|
+
</div>
|
|
447
|
+
<h3>Server Status</h3>
|
|
448
|
+
<div class="settings-card">
|
|
449
|
+
<div class="settings-field-row">
|
|
450
|
+
<label class="settings-label">PID</label>
|
|
451
|
+
<span class="settings-value settings-mono" id="settings-status-pid">-</span>
|
|
452
|
+
</div>
|
|
453
|
+
<div class="settings-field-row">
|
|
454
|
+
<label class="settings-label">Uptime</label>
|
|
455
|
+
<span class="settings-value" id="settings-status-uptime">-</span>
|
|
456
|
+
</div>
|
|
457
|
+
<div class="settings-field-row">
|
|
458
|
+
<label class="settings-label">Memory (RSS)</label>
|
|
459
|
+
<span class="settings-value" id="settings-status-rss">-</span>
|
|
460
|
+
</div>
|
|
461
|
+
<div class="settings-field-row">
|
|
462
|
+
<label class="settings-label">Active Sessions</label>
|
|
463
|
+
<span class="settings-value" id="settings-status-sessions">-</span>
|
|
464
|
+
</div>
|
|
465
|
+
<div class="settings-field-row">
|
|
466
|
+
<label class="settings-label">Connected Clients</label>
|
|
467
|
+
<span class="settings-value" id="settings-status-clients">-</span>
|
|
468
|
+
</div>
|
|
469
|
+
</div>
|
|
470
|
+
</div>
|
|
471
|
+
<div class="server-settings-section" data-section="models">
|
|
472
|
+
<h2>Models</h2>
|
|
473
|
+
<div class="settings-card">
|
|
474
|
+
<div class="settings-field">
|
|
475
|
+
<label class="settings-label">Current Model</label>
|
|
476
|
+
<div class="settings-value" id="settings-current-model">-</div>
|
|
477
|
+
</div>
|
|
478
|
+
<div class="settings-field">
|
|
479
|
+
<label class="settings-label">Available Models</label>
|
|
480
|
+
<div id="settings-model-list" class="settings-model-list"></div>
|
|
481
|
+
</div>
|
|
482
|
+
</div>
|
|
483
|
+
</div>
|
|
484
|
+
<div class="server-settings-section" data-section="security">
|
|
485
|
+
<h2>Security</h2>
|
|
486
|
+
<div class="settings-card">
|
|
487
|
+
<div class="settings-field-row">
|
|
488
|
+
<div>
|
|
489
|
+
<label class="settings-label">Skip Permissions</label>
|
|
490
|
+
<div class="settings-hint">When enabled, all tool executions are auto-approved without asking.</div>
|
|
491
|
+
</div>
|
|
492
|
+
<span class="settings-value settings-badge" id="settings-skip-perms">Disabled</span>
|
|
493
|
+
</div>
|
|
494
|
+
</div>
|
|
495
|
+
<h3>PIN Protection</h3>
|
|
496
|
+
<div class="settings-card">
|
|
497
|
+
<div class="settings-field-row">
|
|
498
|
+
<div>
|
|
499
|
+
<label class="settings-label">PIN Status</label>
|
|
500
|
+
<div class="settings-hint">Require a 6-digit PIN to access the web UI.</div>
|
|
501
|
+
</div>
|
|
502
|
+
<span class="settings-value settings-badge" id="settings-pin-status">-</span>
|
|
503
|
+
</div>
|
|
504
|
+
<div class="settings-field-row" id="settings-pin-actions">
|
|
505
|
+
<div>
|
|
506
|
+
<label class="settings-label" id="settings-pin-action-label">Set PIN</label>
|
|
507
|
+
<div class="settings-hint">Protect access to the web interface with a PIN code.</div>
|
|
508
|
+
</div>
|
|
509
|
+
<div class="settings-pin-btns">
|
|
510
|
+
<button class="settings-btn-sm" id="settings-pin-set-btn">Set PIN</button>
|
|
511
|
+
<button class="settings-btn-sm settings-btn-danger hidden" id="settings-pin-remove-btn">Remove</button>
|
|
512
|
+
</div>
|
|
513
|
+
</div>
|
|
514
|
+
<div class="settings-field hidden" id="settings-pin-form">
|
|
515
|
+
<label class="settings-label">Enter 6-digit PIN</label>
|
|
516
|
+
<div class="settings-pin-input-row">
|
|
517
|
+
<input type="text" id="settings-pin-input" maxlength="6" inputmode="numeric" pattern="[0-9]*" placeholder="000000" autocomplete="off" spellcheck="false">
|
|
518
|
+
<button class="settings-btn-sm" id="settings-pin-save-btn">Save</button>
|
|
519
|
+
<button class="settings-btn-sm settings-btn-ghost" id="settings-pin-cancel-btn">Cancel</button>
|
|
520
|
+
</div>
|
|
521
|
+
<div class="settings-hint settings-pin-error hidden" id="settings-pin-error">PIN must be exactly 6 digits.</div>
|
|
522
|
+
</div>
|
|
523
|
+
</div>
|
|
524
|
+
</div>
|
|
525
|
+
<div class="server-settings-section" data-section="notifications">
|
|
526
|
+
<h2>Notifications</h2>
|
|
527
|
+
<div class="settings-card">
|
|
528
|
+
<label class="settings-toggle-row">
|
|
529
|
+
<div>
|
|
530
|
+
<span class="settings-label">Push Notifications</span>
|
|
531
|
+
<div class="settings-hint">Receive push notifications when tasks complete.</div>
|
|
532
|
+
</div>
|
|
533
|
+
<input type="checkbox" id="settings-notif-push">
|
|
534
|
+
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
535
|
+
</label>
|
|
536
|
+
<label class="settings-toggle-row">
|
|
537
|
+
<div>
|
|
538
|
+
<span class="settings-label">Browser Alerts</span>
|
|
539
|
+
<div class="settings-hint">Show browser notification alerts when tasks finish.</div>
|
|
540
|
+
</div>
|
|
541
|
+
<input type="checkbox" id="settings-notif-alert">
|
|
542
|
+
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
543
|
+
</label>
|
|
544
|
+
<label class="settings-toggle-row">
|
|
545
|
+
<div>
|
|
546
|
+
<span class="settings-label">Sound</span>
|
|
547
|
+
<div class="settings-hint">Play a sound when tasks are completed.</div>
|
|
548
|
+
</div>
|
|
549
|
+
<input type="checkbox" id="settings-notif-sound">
|
|
550
|
+
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
551
|
+
</label>
|
|
552
|
+
</div>
|
|
553
|
+
</div>
|
|
554
|
+
<div class="server-settings-section" data-section="appearance">
|
|
555
|
+
<h2>Appearance</h2>
|
|
556
|
+
<div class="settings-card">
|
|
557
|
+
<div class="settings-field">
|
|
558
|
+
<label class="settings-label">Skin</label>
|
|
559
|
+
<div class="settings-hint">Choose a color theme. Use the toggle in the title bar to switch between light and dark mode.</div>
|
|
560
|
+
<div id="settings-theme-picker-container"></div>
|
|
561
|
+
</div>
|
|
562
|
+
<div class="settings-field">
|
|
563
|
+
<label class="settings-label">Context Display</label>
|
|
564
|
+
<div class="settings-hint">How context window usage is displayed.</div>
|
|
565
|
+
<div class="settings-btn-group" id="settings-context-view">
|
|
566
|
+
<button class="settings-btn-option" data-view="off">Off</button>
|
|
567
|
+
<button class="settings-btn-option" data-view="mini">Mini</button>
|
|
568
|
+
<button class="settings-btn-option" data-view="panel">Panel</button>
|
|
569
|
+
</div>
|
|
570
|
+
</div>
|
|
571
|
+
</div>
|
|
572
|
+
</div>
|
|
573
|
+
<div class="server-settings-section" data-section="advanced">
|
|
574
|
+
<h2>Advanced</h2>
|
|
575
|
+
<div class="settings-card">
|
|
576
|
+
<div class="settings-field">
|
|
577
|
+
<label class="settings-label">WebSocket Path</label>
|
|
578
|
+
<div class="settings-value settings-mono" id="settings-ws-path">-</div>
|
|
579
|
+
</div>
|
|
580
|
+
<div class="settings-field">
|
|
581
|
+
<label class="settings-label">Project Slug</label>
|
|
582
|
+
<div class="settings-value settings-mono" id="settings-project-slug">-</div>
|
|
583
|
+
</div>
|
|
584
|
+
</div>
|
|
585
|
+
<div class="settings-card hidden" id="settings-keep-awake-card">
|
|
586
|
+
<label class="settings-toggle-row">
|
|
587
|
+
<div>
|
|
588
|
+
<span class="settings-label">Keep Awake</span>
|
|
589
|
+
<div class="settings-hint">Prevent the system from sleeping while the server is running (macOS only).</div>
|
|
590
|
+
</div>
|
|
591
|
+
<input type="checkbox" id="settings-keep-awake">
|
|
592
|
+
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
593
|
+
</label>
|
|
594
|
+
</div>
|
|
595
|
+
</div>
|
|
596
|
+
<div class="server-settings-section" data-section="shutdown">
|
|
597
|
+
<h2>Shutdown Server</h2>
|
|
598
|
+
<div class="settings-danger-zone">
|
|
599
|
+
<div class="settings-danger-icon"><i data-lucide="alert-triangle"></i></div>
|
|
600
|
+
<div class="settings-danger-body">
|
|
601
|
+
<h3 class="settings-danger-title">Danger Zone</h3>
|
|
602
|
+
<p class="settings-danger-desc">Shutting down the server will terminate all active sessions, disconnect all clients, and stop the Clay daemon process. This action cannot be undone.</p>
|
|
603
|
+
</div>
|
|
604
|
+
</div>
|
|
605
|
+
<div class="settings-card settings-card-danger">
|
|
606
|
+
<div class="settings-field">
|
|
607
|
+
<label class="settings-label">Confirm Shutdown</label>
|
|
608
|
+
<div class="settings-hint">Type <strong>shutdown</strong> below to confirm.</div>
|
|
609
|
+
<div class="settings-shutdown-input-row">
|
|
610
|
+
<input type="text" id="settings-shutdown-input" placeholder="Type shutdown to confirm" autocomplete="off" spellcheck="false">
|
|
611
|
+
<button class="settings-btn-sm settings-btn-shutdown" id="settings-shutdown-btn" disabled>Shutdown</button>
|
|
612
|
+
</div>
|
|
613
|
+
<div class="settings-hint settings-shutdown-error hidden" id="settings-shutdown-error"></div>
|
|
614
|
+
</div>
|
|
615
|
+
</div>
|
|
616
|
+
</div>
|
|
617
|
+
</div>
|
|
618
|
+
</div>
|
|
619
|
+
<div class="server-settings-close-col">
|
|
620
|
+
<button id="server-settings-close" class="server-settings-close-btn">
|
|
621
|
+
<i data-lucide="x"></i>
|
|
622
|
+
<span>ESC</span>
|
|
623
|
+
</button>
|
|
624
|
+
</div>
|
|
625
|
+
</div>
|
|
626
|
+
</div>
|
|
627
|
+
|
|
628
|
+
<div id="paste-modal" class="hidden">
|
|
629
|
+
<div class="confirm-backdrop"></div>
|
|
630
|
+
<div class="confirm-dialog paste-modal-dialog">
|
|
631
|
+
<div class="paste-modal-header">
|
|
632
|
+
<span class="paste-modal-title">Pasted content</span>
|
|
633
|
+
<button class="paste-modal-close"><i data-lucide="x" style="width:16px;height:16px"></i></button>
|
|
634
|
+
</div>
|
|
635
|
+
<pre class="paste-modal-body" id="paste-modal-body"></pre>
|
|
636
|
+
</div>
|
|
637
|
+
</div>
|
|
638
|
+
|
|
639
|
+
<div id="image-modal" class="hidden">
|
|
640
|
+
<div class="confirm-backdrop"></div>
|
|
641
|
+
<div class="image-modal-dialog">
|
|
642
|
+
<img id="image-modal-img" src="" alt="">
|
|
643
|
+
<button class="image-modal-close"><i data-lucide="x" style="width:18px;height:18px"></i></button>
|
|
644
|
+
</div>
|
|
645
|
+
</div>
|
|
646
|
+
|
|
647
|
+
<div id="mermaid-modal" class="hidden">
|
|
648
|
+
<div class="confirm-backdrop"></div>
|
|
649
|
+
<div class="mermaid-modal-dialog">
|
|
650
|
+
<div class="mermaid-modal-header">
|
|
651
|
+
<span class="mermaid-modal-title">Diagram</span>
|
|
652
|
+
<div class="mermaid-modal-actions">
|
|
653
|
+
<button class="mermaid-modal-btn" id="mermaid-download-btn" title="Download PNG"><i data-lucide="download" style="width:16px;height:16px"></i></button>
|
|
654
|
+
<button class="mermaid-modal-btn" title="Close"><i data-lucide="x" style="width:16px;height:16px"></i></button>
|
|
655
|
+
</div>
|
|
656
|
+
</div>
|
|
657
|
+
<div class="mermaid-modal-body" id="mermaid-modal-body"></div>
|
|
658
|
+
</div>
|
|
659
|
+
</div>
|
|
660
|
+
|
|
661
|
+
<div id="notif-help-modal" class="hidden">
|
|
662
|
+
<div class="confirm-backdrop"></div>
|
|
663
|
+
<div class="confirm-dialog" style="max-width: 380px;">
|
|
664
|
+
<div class="notif-help-title">Notifications blocked</div>
|
|
665
|
+
<div class="notif-help-body">
|
|
666
|
+
<p>Your browser has blocked notification permissions for this site. To re-enable:</p>
|
|
667
|
+
<ol>
|
|
668
|
+
<li>Open your browser's notification settings by pasting the address below</li>
|
|
669
|
+
<li>Find this site and change the permission to <strong>Allow</strong></li>
|
|
670
|
+
<li>Reload the page</li>
|
|
671
|
+
</ol>
|
|
672
|
+
<div class="notif-help-url">
|
|
673
|
+
<code id="notif-settings-url">chrome://settings/content/notifications</code>
|
|
674
|
+
<button id="notif-url-copy" class="popover-copy" title="Copy"><i data-lucide="copy"></i></button>
|
|
675
|
+
</div>
|
|
676
|
+
</div>
|
|
677
|
+
<div class="confirm-actions">
|
|
678
|
+
<button class="confirm-btn confirm-cancel" id="notif-help-close">Close</button>
|
|
679
|
+
</div>
|
|
680
|
+
</div>
|
|
681
|
+
</div>
|
|
682
|
+
|
|
683
|
+
<div id="resume-modal" class="hidden">
|
|
684
|
+
<div class="confirm-backdrop"></div>
|
|
685
|
+
<div class="confirm-dialog resume-picker-dialog">
|
|
686
|
+
<div class="resume-modal-title">Resume CLI session</div>
|
|
687
|
+
<div class="resume-picker-body">
|
|
688
|
+
<div id="resume-picker-loading" class="resume-picker-loading">
|
|
689
|
+
<div class="resume-picker-spinner"></div>
|
|
690
|
+
<span>Loading sessions...</span>
|
|
691
|
+
</div>
|
|
692
|
+
<div id="resume-picker-empty" class="resume-picker-empty hidden">
|
|
693
|
+
No CLI sessions found for this project.
|
|
694
|
+
</div>
|
|
695
|
+
<div id="resume-picker-list" class="resume-picker-list hidden"></div>
|
|
696
|
+
</div>
|
|
697
|
+
<div class="confirm-actions">
|
|
698
|
+
<button class="confirm-btn confirm-cancel" id="resume-cancel">Cancel</button>
|
|
699
|
+
</div>
|
|
700
|
+
</div>
|
|
701
|
+
</div>
|
|
702
|
+
|
|
703
|
+
<div id="rewind-modal" class="hidden">
|
|
704
|
+
<div class="confirm-backdrop"></div>
|
|
705
|
+
<div class="confirm-dialog">
|
|
706
|
+
<div class="rewind-modal-title">Rewind to this point?</div>
|
|
707
|
+
<div class="rewind-modal-body">
|
|
708
|
+
<p id="rewind-summary"></p>
|
|
709
|
+
<div id="rewind-mode-options">
|
|
710
|
+
<label><input type="radio" name="rewind-mode" value="both" checked> Conversation and files</label>
|
|
711
|
+
<label><input type="radio" name="rewind-mode" value="chat"> Conversation only</label>
|
|
712
|
+
<label><input type="radio" name="rewind-mode" value="files"> Files only</label>
|
|
713
|
+
</div>
|
|
714
|
+
<div id="rewind-files-list"></div>
|
|
715
|
+
</div>
|
|
716
|
+
<div class="confirm-actions">
|
|
717
|
+
<button class="confirm-btn confirm-cancel" id="rewind-cancel">Cancel</button>
|
|
718
|
+
<button class="confirm-btn confirm-ok" id="rewind-confirm">Rewind</button>
|
|
719
|
+
</div>
|
|
720
|
+
</div>
|
|
721
|
+
</div>
|
|
722
|
+
|
|
723
|
+
<div id="confirm-modal" class="hidden">
|
|
724
|
+
<div class="confirm-backdrop"></div>
|
|
725
|
+
<div class="confirm-dialog">
|
|
726
|
+
<div class="confirm-text" id="confirm-text"></div>
|
|
727
|
+
<div class="confirm-actions">
|
|
728
|
+
<button class="confirm-btn confirm-cancel" id="confirm-cancel">Cancel</button>
|
|
729
|
+
<button class="confirm-btn confirm-delete" id="confirm-ok">Delete</button>
|
|
730
|
+
</div>
|
|
731
|
+
</div>
|
|
732
|
+
</div>
|
|
733
|
+
|
|
734
|
+
<div id="add-project-modal" class="hidden">
|
|
735
|
+
<div class="confirm-backdrop"></div>
|
|
736
|
+
<div class="confirm-dialog add-project-dialog">
|
|
737
|
+
<div class="add-project-title">Add project</div>
|
|
738
|
+
<div class="add-project-body">
|
|
739
|
+
<div class="add-project-input-wrap">
|
|
740
|
+
<input type="text" id="add-project-input" placeholder="/" autocomplete="off" spellcheck="false">
|
|
741
|
+
<div id="add-project-suggestions" class="hidden"></div>
|
|
742
|
+
</div>
|
|
743
|
+
<div id="add-project-error" class="hidden"></div>
|
|
744
|
+
</div>
|
|
745
|
+
<div class="confirm-actions">
|
|
746
|
+
<button class="confirm-btn confirm-cancel" id="add-project-cancel">Cancel</button>
|
|
747
|
+
<button class="confirm-btn confirm-ok" id="add-project-ok">Add</button>
|
|
748
|
+
</div>
|
|
749
|
+
</div>
|
|
750
|
+
</div>
|
|
751
|
+
|
|
752
|
+
<script src="https://cdn.jsdelivr.net/npm/marked@14/marked.min.js"></script>
|
|
753
|
+
<script src="https://cdn.jsdelivr.net/npm/dompurify@3/dist/purify.min.js"></script>
|
|
754
|
+
<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/highlight.min.js"></script>
|
|
755
|
+
<script src="https://cdn.jsdelivr.net/npm/lucide@0.468.0/dist/umd/lucide.min.js"></script>
|
|
756
|
+
<script src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"></script>
|
|
757
|
+
<script src="https://cdn.jsdelivr.net/npm/qrcode-generator@1.4.4/qrcode.min.js"></script>
|
|
758
|
+
<script src="https://cdn.jsdelivr.net/npm/@xterm/xterm@5/lib/xterm.min.js"></script>
|
|
759
|
+
<script src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0/lib/addon-fit.min.js"></script>
|
|
760
|
+
<script type="module" src="app.js"></script>
|
|
761
|
+
</body>
|
|
762
|
+
</html>
|