claude-code-limiter-server 1.0.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/Caddyfile +12 -0
- package/Dockerfile +57 -0
- package/LICENSE +21 -0
- package/bin/server.js +51 -0
- package/docker-compose.yml +46 -0
- package/package.json +27 -0
- package/src/dashboard/css/style.css +1374 -0
- package/src/dashboard/index.html +118 -0
- package/src/dashboard/js/app.js +1650 -0
- package/src/dashboard/js/charts.js +388 -0
- package/src/dashboard/js/ws.js +172 -0
- package/src/server/db.js +484 -0
- package/src/server/index.js +100 -0
- package/src/server/routes/admin-api.js +386 -0
- package/src/server/routes/hook-api.js +312 -0
- package/src/server/services/auth.js +174 -0
- package/src/server/services/limiter.js +226 -0
- package/src/server/services/usage.js +87 -0
- package/src/server/ws.js +74 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Claude Code Limiter</title>
|
|
7
|
+
<link rel="stylesheet" href="css/style.css">
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
|
|
11
|
+
<!-- Login Screen -->
|
|
12
|
+
<div id="login-screen" class="login-screen hidden">
|
|
13
|
+
<div class="login-card">
|
|
14
|
+
<div class="login-logo">
|
|
15
|
+
<svg width="40" height="40" viewBox="0 0 40 40" fill="none">
|
|
16
|
+
<rect width="40" height="40" rx="10" fill="#58a6ff"/>
|
|
17
|
+
<path d="M12 20 L18 26 L28 14" stroke="#0d1117" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
|
18
|
+
</svg>
|
|
19
|
+
<h1>Claude Code Limiter</h1>
|
|
20
|
+
</div>
|
|
21
|
+
<p class="login-subtitle">Admin Dashboard</p>
|
|
22
|
+
<form id="login-form" autocomplete="off">
|
|
23
|
+
<div class="form-group">
|
|
24
|
+
<label for="login-password">Password</label>
|
|
25
|
+
<input type="password" id="login-password" placeholder="Enter admin password" required autofocus>
|
|
26
|
+
</div>
|
|
27
|
+
<button type="submit" class="btn btn-primary btn-block" id="login-btn">Sign In</button>
|
|
28
|
+
<p id="login-error" class="form-error hidden"></p>
|
|
29
|
+
</form>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<!-- App Shell -->
|
|
34
|
+
<div id="app-shell" class="app-shell hidden">
|
|
35
|
+
<!-- Mobile Header -->
|
|
36
|
+
<header class="mobile-header">
|
|
37
|
+
<button id="hamburger-btn" class="hamburger-btn" aria-label="Toggle navigation">
|
|
38
|
+
<span></span><span></span><span></span>
|
|
39
|
+
</button>
|
|
40
|
+
<h1 class="mobile-title">Claude Code Limiter</h1>
|
|
41
|
+
<div class="ws-indicator" id="ws-indicator-mobile" title="WebSocket disconnected">
|
|
42
|
+
<span class="ws-dot"></span>
|
|
43
|
+
</div>
|
|
44
|
+
</header>
|
|
45
|
+
|
|
46
|
+
<!-- Sidebar Overlay (mobile) -->
|
|
47
|
+
<div id="sidebar-overlay" class="sidebar-overlay hidden"></div>
|
|
48
|
+
|
|
49
|
+
<!-- Sidebar -->
|
|
50
|
+
<nav id="sidebar" class="sidebar">
|
|
51
|
+
<div class="sidebar-header">
|
|
52
|
+
<svg width="28" height="28" viewBox="0 0 40 40" fill="none">
|
|
53
|
+
<rect width="40" height="40" rx="10" fill="#58a6ff"/>
|
|
54
|
+
<path d="M12 20 L18 26 L28 14" stroke="#0d1117" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
|
55
|
+
</svg>
|
|
56
|
+
<div class="sidebar-brand">
|
|
57
|
+
<strong>Claude Limiter</strong>
|
|
58
|
+
<span class="sidebar-team" id="sidebar-team-name">Loading...</span>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<ul class="nav-list">
|
|
63
|
+
<li><a href="#overview" class="nav-link active" data-page="overview">
|
|
64
|
+
<svg class="nav-icon" viewBox="0 0 20 20" fill="currentColor"><path d="M3 4a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1V4zm9 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1V4zM3 13a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1v-3zm9 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-3z"/></svg>
|
|
65
|
+
Overview
|
|
66
|
+
</a></li>
|
|
67
|
+
<li><a href="#users" class="nav-link" data-page="users">
|
|
68
|
+
<svg class="nav-icon" viewBox="0 0 20 20" fill="currentColor"><path d="M9 6a3 3 0 11-6 0 3 3 0 016 0zm8 0a3 3 0 11-6 0 3 3 0 016 0zm-4.07 11c.046-.327.07-.66.07-1a6.97 6.97 0 00-1.5-4.33A5 5 0 0119 16v1h-6.07zM6 11a5 5 0 015 5v1H1v-1a5 5 0 015-5z"/></svg>
|
|
69
|
+
Users
|
|
70
|
+
</a></li>
|
|
71
|
+
<li><a href="#settings" class="nav-link" data-page="settings">
|
|
72
|
+
<svg class="nav-icon" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z" clip-rule="evenodd"/></svg>
|
|
73
|
+
Settings
|
|
74
|
+
</a></li>
|
|
75
|
+
</ul>
|
|
76
|
+
|
|
77
|
+
<div class="sidebar-footer">
|
|
78
|
+
<div class="ws-status" id="ws-status">
|
|
79
|
+
<span class="ws-dot" id="ws-dot"></span>
|
|
80
|
+
<span id="ws-label">Connecting...</span>
|
|
81
|
+
</div>
|
|
82
|
+
<button id="logout-btn" class="btn btn-ghost btn-sm">Sign Out</button>
|
|
83
|
+
</div>
|
|
84
|
+
</nav>
|
|
85
|
+
|
|
86
|
+
<!-- Main Content -->
|
|
87
|
+
<main id="content" class="content">
|
|
88
|
+
<!-- Pages are rendered here by app.js -->
|
|
89
|
+
</main>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<!-- Toast Container -->
|
|
93
|
+
<div id="toast-container" class="toast-container"></div>
|
|
94
|
+
|
|
95
|
+
<!-- Modal Overlay -->
|
|
96
|
+
<div id="modal-overlay" class="modal-overlay hidden">
|
|
97
|
+
<div id="modal-content" class="modal-content">
|
|
98
|
+
<!-- Modals rendered here by app.js -->
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<!-- Confirm Dialog -->
|
|
103
|
+
<div id="confirm-overlay" class="modal-overlay hidden">
|
|
104
|
+
<div class="modal-content modal-sm">
|
|
105
|
+
<h3 id="confirm-title">Confirm</h3>
|
|
106
|
+
<p id="confirm-message">Are you sure?</p>
|
|
107
|
+
<div class="modal-actions">
|
|
108
|
+
<button id="confirm-cancel" class="btn btn-ghost">Cancel</button>
|
|
109
|
+
<button id="confirm-ok" class="btn btn-danger">Confirm</button>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<script src="js/charts.js"></script>
|
|
115
|
+
<script src="js/ws.js"></script>
|
|
116
|
+
<script src="js/app.js"></script>
|
|
117
|
+
</body>
|
|
118
|
+
</html>
|