claude-relay 2.4.2 → 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.
Files changed (75) hide show
  1. package/bin/cli.js +1 -2350
  2. package/package.json +7 -42
  3. package/LICENSE +0 -21
  4. package/README.md +0 -281
  5. package/lib/cli-sessions.js +0 -270
  6. package/lib/config.js +0 -222
  7. package/lib/daemon.js +0 -423
  8. package/lib/ipc.js +0 -112
  9. package/lib/pages.js +0 -714
  10. package/lib/project.js +0 -1224
  11. package/lib/public/app.js +0 -2157
  12. package/lib/public/apple-touch-icon.png +0 -0
  13. package/lib/public/css/base.css +0 -145
  14. package/lib/public/css/diff.css +0 -128
  15. package/lib/public/css/filebrowser.css +0 -1076
  16. package/lib/public/css/highlight.css +0 -144
  17. package/lib/public/css/input.css +0 -512
  18. package/lib/public/css/menus.css +0 -683
  19. package/lib/public/css/messages.css +0 -1159
  20. package/lib/public/css/overlays.css +0 -731
  21. package/lib/public/css/rewind.css +0 -529
  22. package/lib/public/css/sidebar.css +0 -794
  23. package/lib/public/favicon.svg +0 -26
  24. package/lib/public/icon-192.png +0 -0
  25. package/lib/public/icon-512.png +0 -0
  26. package/lib/public/icon-mono.svg +0 -19
  27. package/lib/public/index.html +0 -460
  28. package/lib/public/manifest.json +0 -27
  29. package/lib/public/modules/diff.js +0 -398
  30. package/lib/public/modules/events.js +0 -21
  31. package/lib/public/modules/filebrowser.js +0 -1375
  32. package/lib/public/modules/fileicons.js +0 -172
  33. package/lib/public/modules/icons.js +0 -54
  34. package/lib/public/modules/input.js +0 -578
  35. package/lib/public/modules/markdown.js +0 -149
  36. package/lib/public/modules/notifications.js +0 -643
  37. package/lib/public/modules/qrcode.js +0 -70
  38. package/lib/public/modules/rewind.js +0 -334
  39. package/lib/public/modules/sidebar.js +0 -628
  40. package/lib/public/modules/state.js +0 -3
  41. package/lib/public/modules/terminal.js +0 -658
  42. package/lib/public/modules/theme.js +0 -622
  43. package/lib/public/modules/tools.js +0 -1410
  44. package/lib/public/modules/utils.js +0 -56
  45. package/lib/public/style.css +0 -10
  46. package/lib/public/sw.js +0 -75
  47. package/lib/push.js +0 -125
  48. package/lib/sdk-bridge.js +0 -771
  49. package/lib/server.js +0 -577
  50. package/lib/sessions.js +0 -402
  51. package/lib/terminal-manager.js +0 -187
  52. package/lib/terminal.js +0 -24
  53. package/lib/themes/ayu-light.json +0 -9
  54. package/lib/themes/catppuccin-latte.json +0 -9
  55. package/lib/themes/catppuccin-mocha.json +0 -9
  56. package/lib/themes/claude-light.json +0 -9
  57. package/lib/themes/claude.json +0 -9
  58. package/lib/themes/dracula.json +0 -9
  59. package/lib/themes/everforest-light.json +0 -9
  60. package/lib/themes/everforest.json +0 -9
  61. package/lib/themes/github-light.json +0 -9
  62. package/lib/themes/gruvbox-dark.json +0 -9
  63. package/lib/themes/gruvbox-light.json +0 -9
  64. package/lib/themes/monokai.json +0 -9
  65. package/lib/themes/nord-light.json +0 -9
  66. package/lib/themes/nord.json +0 -9
  67. package/lib/themes/one-dark.json +0 -9
  68. package/lib/themes/one-light.json +0 -9
  69. package/lib/themes/rose-pine-dawn.json +0 -9
  70. package/lib/themes/rose-pine.json +0 -9
  71. package/lib/themes/solarized-dark.json +0 -9
  72. package/lib/themes/solarized-light.json +0 -9
  73. package/lib/themes/tokyo-night-light.json +0 -9
  74. package/lib/themes/tokyo-night.json +0 -9
  75. package/lib/updater.js +0 -96
@@ -1,26 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="128" height="128">
2
- <!-- background -->
3
- <rect x="0" y="0" width="12" height="12" rx="2" fill="#57AB5A"/>
4
- <!-- antenna -->
5
- <rect x="5" y="0" width="1" height="1" fill="#E8E5DE"/>
6
- <rect x="6" y="0" width="1" height="1" fill="#E8E5DE"/>
7
- <rect x="5" y="1" width="1" height="1" fill="#E8E5DE"/>
8
- <rect x="6" y="1" width="1" height="1" fill="#E8E5DE"/>
9
- <!-- head -->
10
- <rect x="2" y="2" width="8" height="2" fill="#DA7756"/>
11
- <!-- eyes row -->
12
- <rect x="2" y="4" width="1" height="2" fill="#DA7756"/>
13
- <rect x="3" y="4" width="1" height="2" fill="#2F2E2B"/>
14
- <rect x="4" y="4" width="4" height="2" fill="#DA7756"/>
15
- <rect x="8" y="4" width="1" height="2" fill="#2F2E2B"/>
16
- <rect x="9" y="4" width="1" height="2" fill="#DA7756"/>
17
- <!-- arms -->
18
- <rect x="0" y="6" width="12" height="2" fill="#DA7756"/>
19
- <!-- body -->
20
- <rect x="2" y="8" width="8" height="2" fill="#DA7756"/>
21
- <!-- feet -->
22
- <rect x="2" y="10" width="1" height="2" fill="#DA7756"/>
23
- <rect x="4" y="10" width="1" height="2" fill="#DA7756"/>
24
- <rect x="7" y="10" width="1" height="2" fill="#DA7756"/>
25
- <rect x="9" y="10" width="1" height="2" fill="#DA7756"/>
26
- </svg>
Binary file
Binary file
@@ -1,19 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="128" height="128">
2
- <rect x="0" y="0" width="12" height="12" rx="2" fill="#3E3C37"/>
3
- <rect x="5" y="0" width="1" height="1" fill="#6D6860"/>
4
- <rect x="6" y="0" width="1" height="1" fill="#6D6860"/>
5
- <rect x="5" y="1" width="1" height="1" fill="#6D6860"/>
6
- <rect x="6" y="1" width="1" height="1" fill="#6D6860"/>
7
- <rect x="2" y="2" width="8" height="2" fill="#908B81"/>
8
- <rect x="2" y="4" width="1" height="2" fill="#908B81"/>
9
- <rect x="3" y="4" width="1" height="2" fill="#262522"/>
10
- <rect x="4" y="4" width="4" height="2" fill="#908B81"/>
11
- <rect x="8" y="4" width="1" height="2" fill="#262522"/>
12
- <rect x="9" y="4" width="1" height="2" fill="#908B81"/>
13
- <rect x="0" y="6" width="12" height="2" fill="#908B81"/>
14
- <rect x="2" y="8" width="8" height="2" fill="#908B81"/>
15
- <rect x="2" y="10" width="1" height="2" fill="#908B81"/>
16
- <rect x="4" y="10" width="1" height="2" fill="#908B81"/>
17
- <rect x="7" y="10" width="1" height="2" fill="#908B81"/>
18
- <rect x="9" y="10" width="1" height="2" fill="#908B81"/>
19
- </svg>
@@ -1,460 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0, 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>Claude Relay</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=Inter:opsz,wght@14..32,400;14..32,500;14..32,600&family=Styrene+A+Web:wght@400;500&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="claude-relay-theme-vars",v=localStorage.getItem(k);if(!v)return;var o=JSON.parse(v),r=document.documentElement,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"])}catch(e){}})();
19
- </script>
20
- <link rel="stylesheet" href="style.css">
21
- </head>
22
- <body>
23
- <div id="layout">
24
- <div id="sidebar">
25
- <div id="sidebar-header">
26
- <a href="/" class="sidebar-logo">
27
- <svg class="footer-mascot" viewBox="0 0 12 12" width="16" height="16"><rect x="0" y="0" width="12" height="12" rx="2" fill="#3E3C37"/><rect x="5" y="0" width="1" height="1" fill="#6D6860"/><rect x="6" y="0" width="1" height="1" fill="#6D6860"/><rect x="5" y="1" width="1" height="1" fill="#6D6860"/><rect x="6" y="1" width="1" height="1" fill="#6D6860"/><rect x="2" y="2" width="8" height="2" fill="#908B81"/><rect x="2" y="4" width="1" height="2" fill="#908B81"/><rect x="3" y="4" width="1" height="2" fill="#262522"/><rect x="4" y="4" width="4" height="2" fill="#908B81"/><rect x="8" y="4" width="1" height="2" fill="#262522"/><rect x="9" y="4" width="1" height="2" fill="#908B81"/><rect x="0" y="6" width="12" height="2" fill="#908B81"/><rect x="2" y="8" width="8" height="2" fill="#908B81"/><rect x="2" y="10" width="1" height="2" fill="#908B81"/><rect x="4" y="10" width="1" height="2" fill="#908B81"/><rect x="7" y="10" width="1" height="2" fill="#908B81"/><rect x="9" y="10" width="1" height="2" fill="#908B81"/></svg>
28
- </a>
29
- <button id="sidebar-toggle-btn" title="Close sidebar"><i data-lucide="panel-left-close"></i></button>
30
- </div>
31
- <nav id="sidebar-nav">
32
- <div id="project-list-section">
33
- <div id="project-list-header">
34
- <span class="project-list-title">Projects</span>
35
- <button id="project-list-add" type="button" title="Add project"><i data-lucide="plus"></i></button>
36
- </div>
37
- <div id="project-list"></div>
38
- </div>
39
- <div id="project-hint" class="hidden">
40
- <span class="project-hint-text">Run <code>npx claude-relay</code> in other directories to add more projects.</span>
41
- <button id="project-hint-dismiss" type="button" aria-label="Dismiss"><i data-lucide="x"></i></button>
42
- </div>
43
- </nav>
44
- <div id="sidebar-tools">
45
- <div class="sidebar-section-header">
46
- <span class="sidebar-section-title">Tools</span>
47
- </div>
48
- <div id="session-actions">
49
- <button id="resume-session-btn" title="Resume a CLI session"><i data-lucide="terminal"></i> <span>Resume CLI</span></button>
50
- <button id="file-browser-btn"><i data-lucide="folder-tree"></i> <span>File browser</span></button>
51
- <button id="terminal-sidebar-btn"><i data-lucide="square-terminal"></i> <span>Terminal</span></button>
52
- </div>
53
- </div>
54
- <div id="sidebar-sessions-header">
55
- <div id="sessions-header-content">
56
- <div class="session-list-header">
57
- <span>Sessions</span>
58
- <div class="session-list-header-actions">
59
- <button id="new-session-btn" type="button" title="New session"><i data-lucide="plus"></i></button>
60
- <button id="search-session-btn" type="button" title="Search sessions"><i data-lucide="search"></i></button>
61
- </div>
62
- </div>
63
- <div id="session-search" class="hidden">
64
- <input id="session-search-input" type="text" placeholder="Search sessions..." autocomplete="off" spellcheck="false" />
65
- <button id="session-search-clear" type="button" aria-label="Clear search"><i data-lucide="x"></i></button>
66
- </div>
67
- </div>
68
- <div id="files-header-content" class="hidden">
69
- <div class="session-list-header">
70
- <span>File Browser</span>
71
- <div class="session-list-header-actions">
72
- <button id="file-panel-refresh" type="button" title="Refresh file tree"><i data-lucide="refresh-cw"></i></button>
73
- <button id="file-panel-close" type="button" title="Close file browser"><i data-lucide="x"></i></button>
74
- </div>
75
- </div>
76
- </div>
77
- </div>
78
- <div id="sidebar-panel-sessions" class="sidebar-panel">
79
- <div id="session-list"></div>
80
- </div>
81
- <div id="sidebar-panel-files" class="sidebar-panel hidden">
82
- <div id="file-tree"></div>
83
- </div>
84
- <div id="sidebar-footer">
85
- <button id="sidebar-footer-btn">
86
- <span class="footer-btn-label"><svg class="footer-mascot" viewBox="0 0 12 12" width="16" height="16"><rect x="0" y="0" width="12" height="12" rx="2" fill="#3E3C37"/><rect x="5" y="0" width="1" height="1" fill="#6D6860"/><rect x="6" y="0" width="1" height="1" fill="#6D6860"/><rect x="5" y="1" width="1" height="1" fill="#6D6860"/><rect x="6" y="1" width="1" height="1" fill="#6D6860"/><rect x="2" y="2" width="8" height="2" fill="#908B81"/><rect x="2" y="4" width="1" height="2" fill="#908B81"/><rect x="3" y="4" width="1" height="2" fill="#262522"/><rect x="4" y="4" width="4" height="2" fill="#908B81"/><rect x="8" y="4" width="1" height="2" fill="#262522"/><rect x="9" y="4" width="1" height="2" fill="#908B81"/><rect x="0" y="6" width="12" height="2" fill="#908B81"/><rect x="2" y="8" width="8" height="2" fill="#908B81"/><rect x="2" y="10" width="1" height="2" fill="#908B81"/><rect x="4" y="10" width="1" height="2" fill="#908B81"/><rect x="7" y="10" width="1" height="2" fill="#908B81"/><rect x="9" y="10" width="1" height="2" fill="#908B81"/></svg> Claude Relay <span id="footer-version" class="footer-version"></span></span>
87
- <i data-lucide="ellipsis" style="width:14px;height:14px"></i>
88
- </button>
89
- <div id="sidebar-footer-menu" class="hidden">
90
- <a class="sidebar-menu-item" href="https://github.com/chadbyte/claude-relay" target="_blank" rel="noopener">
91
- <i data-lucide="star"></i> <span>Star on GitHub</span>
92
- </a>
93
- <button class="sidebar-menu-item" id="footer-theme">
94
- <i data-lucide="palette"></i> <span>Theme</span>
95
- </button>
96
- <button class="sidebar-menu-item" id="footer-status">
97
- <i data-lucide="activity"></i> <span>Status</span>
98
- </button>
99
- <button class="sidebar-menu-item" id="footer-update-check">
100
- <i data-lucide="refresh-cw"></i> <span>Check for updates</span>
101
- </button>
102
- </div>
103
- </div>
104
- </div>
105
- <div id="sidebar-overlay"></div>
106
- <div id="app">
107
- <div id="update-banner" class="hidden">
108
- <span class="update-banner-text"><i data-lucide="arrow-up-circle"></i> A new version of Claude Relay is available: <strong id="update-version"></strong></span>
109
- <button id="update-now">Update now</button>
110
- <button id="update-how" title="Manual update instructions">?</button>
111
- <button id="update-banner-close" aria-label="Dismiss"><i data-lucide="x"></i></button>
112
- </div>
113
- <div id="onboarding-banner" class="hidden">
114
- <span class="onboarding-banner-text" id="onboarding-banner-text"></span>
115
- <button id="onboarding-banner-close" aria-label="Dismiss"><i data-lucide="x"></i></button>
116
- </div>
117
- <div id="skip-perms-banner" class="hidden">
118
- <i data-lucide="shield-off"></i>
119
- <span>Skip permissions mode is active. All tool executions are auto-approved.</span>
120
- </div>
121
- <div id="header">
122
- <div id="header-left">
123
- <button id="sidebar-expand-btn" title="Open sidebar"><i data-lucide="panel-left-open"></i></button>
124
- <button id="hamburger-btn" aria-label="Toggle sidebar"><i data-lucide="menu"></i></button>
125
- <span class="header-title" id="header-title">Connecting...</span>
126
- <button id="header-rename-btn" type="button" title="Rename session"><i data-lucide="pencil"></i></button>
127
- </div>
128
- <div class="status">
129
- <div id="debug-menu-wrap" class="hidden">
130
- <button id="debug-btn" title="Debug"><i data-lucide="bug"></i></button>
131
- <div id="debug-menu" class="hidden">
132
- <label class="notif-option">
133
- <span>Update banner</span>
134
- <input type="checkbox" id="debug-toggle-update">
135
- <span class="toggle-track"><span class="toggle-thumb"></span></span>
136
- </label>
137
- <label class="notif-option">
138
- <span>Onboarding banner</span>
139
- <input type="checkbox" id="debug-toggle-onboarding">
140
- <span class="toggle-track"><span class="toggle-thumb"></span></span>
141
- </label>
142
- </div>
143
- </div>
144
- <button id="terminal-toggle-btn" title="Terminal"><i data-lucide="square-terminal"></i><span id="terminal-count" class="hidden"></span></button>
145
- <button id="qr-btn" title="Share"><i data-lucide="share"></i></button>
146
- <div id="qr-overlay" class="hidden">
147
- <div id="qr-overlay-inner">
148
- <div id="qr-canvas"></div>
149
- <div id="qr-url"></div>
150
- </div>
151
- </div>
152
- <div id="notif-menu-wrap">
153
- <button id="notif-btn" title="Notifications"><i data-lucide="bell"></i></button>
154
- <div id="notif-menu" class="hidden">
155
- <label class="notif-option" id="notif-push-row">
156
- <span><i data-lucide="smartphone" style="width:14px;height:14px"></i> Push notifications</span>
157
- <input type="checkbox" id="notif-toggle-push">
158
- <span class="toggle-track"><span class="toggle-thumb"></span></span>
159
- </label>
160
- <label class="notif-option">
161
- <span><i data-lucide="bell" style="width:14px;height:14px"></i> Browser alerts</span>
162
- <input type="checkbox" id="notif-toggle-alert">
163
- <span class="toggle-track"><span class="toggle-thumb"></span></span>
164
- </label>
165
- <div id="notif-blocked-hint" class="hidden">Blocked by browser. <a href="#" id="notif-learn-more">Learn more</a></div>
166
- <label class="notif-option">
167
- <span><i data-lucide="volume-2" style="width:14px;height:14px"></i> Sound</span>
168
- <input type="checkbox" id="notif-toggle-sound">
169
- <span class="toggle-track"><span class="toggle-thumb"></span></span>
170
- </label>
171
- </div>
172
- </div>
173
- <span id="client-count" class="hidden"></span>
174
- <span class="status-dot" id="status-dot"></span>
175
- </div>
176
- </div>
177
-
178
- <div id="connect-overlay">
179
- <div id="pixel-canvas"></div>
180
- <div class="connect-verb" id="connect-verb"></div>
181
- <div class="connect-status" id="connect-status">Connecting...</div>
182
- </div>
183
- <div id="messages"></div>
184
-
185
- <div id="info-panels">
186
- <div id="usage-panel" class="hidden">
187
- <div class="usage-panel-header">
188
- <span>Usage</span>
189
- <button id="usage-panel-close" aria-label="Close"><i data-lucide="x"></i></button>
190
- </div>
191
- <div class="usage-panel-body">
192
- <a href="https://claude.ai/settings/usage" target="_blank" rel="noopener" class="usage-external-link">
193
- <span>Check plan usage on claude.ai</span>
194
- <i data-lucide="external-link"></i>
195
- </a>
196
- <div class="usage-divider"></div>
197
- <div class="usage-section-label">Session</div>
198
- <div class="usage-row"><span class="usage-label">Cost</span><span id="usage-cost" class="usage-value">$0.0000</span></div>
199
- <div class="usage-row"><span class="usage-label">Input tokens</span><span id="usage-input" class="usage-value">0</span></div>
200
- <div class="usage-row"><span class="usage-label">Output tokens</span><span id="usage-output" class="usage-value">0</span></div>
201
- <div class="usage-row"><span class="usage-label">Cache read</span><span id="usage-cache-read" class="usage-value">0</span></div>
202
- <div class="usage-row"><span class="usage-label">Cache write</span><span id="usage-cache-write" class="usage-value">0</span></div>
203
- <div class="usage-row"><span class="usage-label">Turns</span><span id="usage-turns" class="usage-value">0</span></div>
204
- </div>
205
- </div>
206
- <div id="status-panel" class="hidden">
207
- <div class="usage-panel-header">
208
- <span>Status</span>
209
- <button id="status-panel-close" aria-label="Close"><i data-lucide="x"></i></button>
210
- </div>
211
- <div class="usage-panel-body">
212
- <div class="usage-section-label">Process</div>
213
- <div class="usage-row"><span class="usage-label">PID</span><span id="status-pid" class="usage-value">-</span></div>
214
- <div class="usage-row"><span class="usage-label">Uptime</span><span id="status-uptime" class="usage-value">-</span></div>
215
- <div class="usage-row"><span class="usage-label">RSS Memory</span><span id="status-rss" class="usage-value">-</span></div>
216
- <div class="usage-row"><span class="usage-label">Heap Used</span><span id="status-heap-used" class="usage-value">-</span></div>
217
- <div class="usage-row"><span class="usage-label">Heap Total</span><span id="status-heap-total" class="usage-value">-</span></div>
218
- <div class="usage-row"><span class="usage-label">External</span><span id="status-external" class="usage-value">-</span></div>
219
- <div class="usage-divider"></div>
220
- <div class="usage-section-label">Sessions</div>
221
- <div class="usage-row"><span class="usage-label">Active</span><span id="status-sessions" class="usage-value">-</span></div>
222
- <div class="usage-row"><span class="usage-label">Processing</span><span id="status-processing" class="usage-value">-</span></div>
223
- <div class="usage-row"><span class="usage-label">Clients</span><span id="status-clients" class="usage-value">-</span></div>
224
- <div class="usage-row"><span class="usage-label">Terminals</span><span id="status-terminals" class="usage-value">-</span></div>
225
- </div>
226
- </div>
227
- <div id="context-panel" class="hidden">
228
- <div class="usage-panel-header">
229
- <span>Context</span>
230
- <div class="usage-panel-actions">
231
- <button id="context-panel-minimize" aria-label="Minimize" title="Minimize to input"><i data-lucide="minus"></i></button>
232
- <button id="context-panel-close" aria-label="Close"><i data-lucide="x"></i></button>
233
- </div>
234
- </div>
235
- <div class="usage-panel-body">
236
- <div class="usage-section-label">Context Window</div>
237
- <div class="context-bar-wrap">
238
- <div class="context-bar">
239
- <div class="context-bar-fill" id="context-bar-fill"></div>
240
- </div>
241
- <span class="context-bar-pct" id="context-bar-pct">0%</span>
242
- </div>
243
- <div class="usage-row"><span class="usage-label">Used</span><span id="context-used" class="usage-value">-</span></div>
244
- <div class="usage-row"><span class="usage-label">Window</span><span id="context-window" class="usage-value">-</span></div>
245
- <div class="usage-row"><span class="usage-label">Max output</span><span id="context-max-output" class="usage-value">-</span></div>
246
- <div class="usage-divider"></div>
247
- <div class="usage-section-label">Session Tokens</div>
248
- <div class="usage-row"><span class="usage-label">Input</span><span id="context-input" class="usage-value">0</span></div>
249
- <div class="usage-row"><span class="usage-label">Output</span><span id="context-output" class="usage-value">0</span></div>
250
- <div class="usage-row"><span class="usage-label">Cache read</span><span id="context-cache-read" class="usage-value">0</span></div>
251
- <div class="usage-row"><span class="usage-label">Cache write</span><span id="context-cache-write" class="usage-value">0</span></div>
252
- <div class="usage-divider"></div>
253
- <div class="usage-section-label">Model</div>
254
- <div class="usage-row"><span class="usage-label">Name</span><span id="context-model" class="usage-value">-</span></div>
255
- <div class="usage-row"><span class="usage-label">Cost</span><span id="context-cost" class="usage-value">$0.0000</span></div>
256
- <div class="usage-row"><span class="usage-label">Turns</span><span id="context-turns" class="usage-value">0</span></div>
257
- </div>
258
- </div>
259
- </div>
260
- <div id="todo-sticky" class="hidden"></div>
261
- <button id="new-msg-btn" class="hidden" aria-label="Scroll to bottom"></button>
262
- <div id="input-area">
263
- <div id="input-wrapper">
264
- <div id="slash-menu"></div>
265
- <div id="input-row">
266
- <div id="context-mini" class="hidden">
267
- <div class="context-mini-bar">
268
- <div class="context-mini-fill" id="context-mini-fill"></div>
269
- </div>
270
- <span class="context-mini-label" id="context-mini-label">0%</span>
271
- </div>
272
- <div id="image-preview-bar"></div>
273
- <textarea id="input" rows="1" placeholder="Message Claude Code..." enterkeyhint="send" dir="auto"></textarea>
274
- <div id="input-bottom">
275
- <div id="attach-wrap">
276
- <button id="attach-btn" type="button" aria-label="Attach"><i data-lucide="plus"></i></button>
277
- <div id="attach-menu" class="hidden">
278
- <button class="attach-menu-item" id="attach-camera"><i data-lucide="camera"></i> <span>Take Photo</span></button>
279
- <button class="attach-menu-item" id="attach-photos"><i data-lucide="image"></i> <span>Add Photos</span></button>
280
- </div>
281
- </div>
282
- <div id="input-bottom-right">
283
- <div id="model-menu-wrap" class="hidden">
284
- <button id="model-btn" title="Model"><span id="model-label"></span> <i data-lucide="chevron-down"></i></button>
285
- <div id="model-menu" class="hidden"></div>
286
- </div>
287
- <button id="send-btn" disabled aria-label="Send"><i data-lucide="arrow-up"></i></button>
288
- </div>
289
- </div>
290
- </div>
291
- </div>
292
- </div>
293
- </div>
294
- <div id="file-viewer" class="hidden">
295
- <div class="file-viewer-header">
296
- <span class="file-viewer-path" id="file-viewer-path"></span>
297
- <button class="file-viewer-btn hidden" id="file-viewer-render" title="Toggle rendered view"><i data-lucide="book-open"></i></button>
298
- <button class="file-viewer-btn hidden" id="file-viewer-history" title="Edit history"><i data-lucide="clock"></i></button>
299
- <button class="file-viewer-btn" id="file-viewer-copy" title="Copy contents"><i data-lucide="copy"></i></button>
300
- <button class="file-viewer-btn" id="file-viewer-close" title="Close"><i data-lucide="x"></i></button>
301
- </div>
302
- <div class="file-viewer-body" id="file-viewer-body"></div>
303
- </div>
304
- <div id="terminal-container" class="hidden">
305
- <div class="terminal-header">
306
- <div id="terminal-tabs" class="terminal-tabs"></div>
307
- <button class="terminal-new-tab-btn" id="terminal-new-tab" title="New tab"><i data-lucide="plus"></i></button>
308
- <div class="terminal-header-actions">
309
- <button class="file-viewer-btn" id="terminal-close" title="Hide panel"><i data-lucide="chevron-up"></i></button>
310
- </div>
311
- </div>
312
- <div id="terminal-toolbar" class="hidden">
313
- <button class="term-key" data-key="tab">Tab</button>
314
- <button class="term-key term-key-toggle" data-key="ctrl">Ctrl</button>
315
- <button class="term-key" data-key="esc">Esc</button>
316
- <span class="term-key-spacer"></span>
317
- <button class="term-key term-key-arrow" data-key="up">&#9650;</button>
318
- <button class="term-key term-key-arrow" data-key="down">&#9660;</button>
319
- <button class="term-key term-key-arrow" data-key="left">&#9664;</button>
320
- <button class="term-key term-key-arrow" data-key="right">&#9654;</button>
321
- </div>
322
- <div id="terminal-body"></div>
323
- </div>
324
- </div>
325
-
326
- <div id="paste-modal" class="hidden">
327
- <div class="confirm-backdrop"></div>
328
- <div class="confirm-dialog paste-modal-dialog">
329
- <div class="paste-modal-header">
330
- <span class="paste-modal-title">Pasted content</span>
331
- <button class="paste-modal-close"><i data-lucide="x" style="width:16px;height:16px"></i></button>
332
- </div>
333
- <pre class="paste-modal-body" id="paste-modal-body"></pre>
334
- </div>
335
- </div>
336
-
337
- <div id="image-modal" class="hidden">
338
- <div class="confirm-backdrop"></div>
339
- <div class="image-modal-dialog">
340
- <img id="image-modal-img" src="" alt="">
341
- <button class="image-modal-close"><i data-lucide="x" style="width:18px;height:18px"></i></button>
342
- </div>
343
- </div>
344
-
345
- <div id="mermaid-modal" class="hidden">
346
- <div class="confirm-backdrop"></div>
347
- <div class="mermaid-modal-dialog">
348
- <div class="mermaid-modal-header">
349
- <span class="mermaid-modal-title">Diagram</span>
350
- <div class="mermaid-modal-actions">
351
- <button class="mermaid-modal-btn" id="mermaid-download-btn" title="Download PNG"><i data-lucide="download" style="width:16px;height:16px"></i></button>
352
- <button class="mermaid-modal-btn" title="Close"><i data-lucide="x" style="width:16px;height:16px"></i></button>
353
- </div>
354
- </div>
355
- <div class="mermaid-modal-body" id="mermaid-modal-body"></div>
356
- </div>
357
- </div>
358
-
359
- <div id="notif-help-modal" class="hidden">
360
- <div class="confirm-backdrop"></div>
361
- <div class="confirm-dialog" style="max-width: 380px;">
362
- <div class="notif-help-title">Notifications blocked</div>
363
- <div class="notif-help-body">
364
- <p>Your browser has blocked notification permissions for this site. To re-enable:</p>
365
- <ol>
366
- <li>Open your browser's notification settings by pasting the address below</li>
367
- <li>Find this site and change the permission to <strong>Allow</strong></li>
368
- <li>Reload the page</li>
369
- </ol>
370
- <div class="notif-help-url">
371
- <code id="notif-settings-url">chrome://settings/content/notifications</code>
372
- <button id="notif-url-copy" class="popover-copy" title="Copy"><i data-lucide="copy"></i></button>
373
- </div>
374
- </div>
375
- <div class="confirm-actions">
376
- <button class="confirm-btn confirm-cancel" id="notif-help-close">Close</button>
377
- </div>
378
- </div>
379
- </div>
380
-
381
- <div id="resume-modal" class="hidden">
382
- <div class="confirm-backdrop"></div>
383
- <div class="confirm-dialog resume-picker-dialog">
384
- <div class="resume-modal-title">Resume CLI session</div>
385
- <div class="resume-picker-body">
386
- <div id="resume-picker-loading" class="resume-picker-loading">
387
- <div class="resume-picker-spinner"></div>
388
- <span>Loading sessions...</span>
389
- </div>
390
- <div id="resume-picker-empty" class="resume-picker-empty hidden">
391
- No CLI sessions found for this project.
392
- </div>
393
- <div id="resume-picker-list" class="resume-picker-list hidden"></div>
394
- </div>
395
- <div class="confirm-actions">
396
- <button class="confirm-btn confirm-cancel" id="resume-cancel">Cancel</button>
397
- </div>
398
- </div>
399
- </div>
400
-
401
- <div id="rewind-modal" class="hidden">
402
- <div class="confirm-backdrop"></div>
403
- <div class="confirm-dialog">
404
- <div class="rewind-modal-title">Rewind to this point?</div>
405
- <div class="rewind-modal-body">
406
- <p id="rewind-summary"></p>
407
- <div id="rewind-mode-options">
408
- <label><input type="radio" name="rewind-mode" value="both" checked> Conversation and files</label>
409
- <label><input type="radio" name="rewind-mode" value="chat"> Conversation only</label>
410
- <label><input type="radio" name="rewind-mode" value="files"> Files only</label>
411
- </div>
412
- <div id="rewind-files-list"></div>
413
- </div>
414
- <div class="confirm-actions">
415
- <button class="confirm-btn confirm-cancel" id="rewind-cancel">Cancel</button>
416
- <button class="confirm-btn confirm-ok" id="rewind-confirm">Rewind</button>
417
- </div>
418
- </div>
419
- </div>
420
-
421
- <div id="confirm-modal" class="hidden">
422
- <div class="confirm-backdrop"></div>
423
- <div class="confirm-dialog">
424
- <div class="confirm-text" id="confirm-text"></div>
425
- <div class="confirm-actions">
426
- <button class="confirm-btn confirm-cancel" id="confirm-cancel">Cancel</button>
427
- <button class="confirm-btn confirm-delete" id="confirm-ok">Delete</button>
428
- </div>
429
- </div>
430
- </div>
431
-
432
- <div id="add-project-modal" class="hidden">
433
- <div class="confirm-backdrop"></div>
434
- <div class="confirm-dialog add-project-dialog">
435
- <div class="add-project-title">Add project</div>
436
- <div class="add-project-body">
437
- <div class="add-project-input-wrap">
438
- <input type="text" id="add-project-input" placeholder="/" autocomplete="off" spellcheck="false">
439
- <div id="add-project-suggestions" class="hidden"></div>
440
- </div>
441
- <div id="add-project-error" class="hidden"></div>
442
- </div>
443
- <div class="confirm-actions">
444
- <button class="confirm-btn confirm-cancel" id="add-project-cancel">Cancel</button>
445
- <button class="confirm-btn confirm-ok" id="add-project-ok">Add</button>
446
- </div>
447
- </div>
448
- </div>
449
-
450
- <script src="https://cdn.jsdelivr.net/npm/marked@14/marked.min.js"></script>
451
- <script src="https://cdn.jsdelivr.net/npm/dompurify@3/dist/purify.min.js"></script>
452
- <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/highlight.min.js"></script>
453
- <script src="https://cdn.jsdelivr.net/npm/lucide@0.468.0/dist/umd/lucide.min.js"></script>
454
- <script src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"></script>
455
- <script src="https://cdn.jsdelivr.net/npm/qrcode-generator@1.4.4/qrcode.min.js"></script>
456
- <script src="https://cdn.jsdelivr.net/npm/@xterm/xterm@5/lib/xterm.min.js"></script>
457
- <script src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0/lib/addon-fit.min.js"></script>
458
- <script type="module" src="app.js"></script>
459
- </body>
460
- </html>
@@ -1,27 +0,0 @@
1
- {
2
- "name": "Claude Relay",
3
- "short_name": "Claude Relay",
4
- "id": "/",
5
- "start_url": "/",
6
- "scope": "/",
7
- "display": "standalone",
8
- "background_color": "#2F2E2B",
9
- "theme_color": "#2F2E2B",
10
- "icons": [
11
- {
12
- "src": "icon-192.png",
13
- "sizes": "192x192",
14
- "type": "image/png"
15
- },
16
- {
17
- "src": "icon-512.png",
18
- "sizes": "512x512",
19
- "type": "image/png"
20
- },
21
- {
22
- "src": "icon-mono.svg",
23
- "sizes": "any",
24
- "type": "image/svg+xml"
25
- }
26
- ]
27
- }