@gravito/zenith 1.1.3 → 1.1.6
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 +28 -10
- package/dist/bin.js +43235 -76691
- package/dist/client/index.html +13 -0
- package/dist/server/index.js +43235 -76691
- package/package.json +16 -7
- package/CHANGELOG.md +0 -62
- package/Dockerfile +0 -46
- package/Dockerfile.demo-worker +0 -29
- package/bin/flux-console.ts +0 -2
- package/doc/ECOSYSTEM_EXPANSION_RFC.md +0 -130
- package/docker-compose.yml +0 -40
- package/docs/ALERTING_GUIDE.md +0 -71
- package/docs/DEPLOYMENT.md +0 -157
- package/docs/DOCS_INTERNAL.md +0 -73
- package/docs/LARAVEL_ZENITH_ROADMAP.md +0 -109
- package/docs/QUASAR_MASTER_PLAN.md +0 -140
- package/docs/QUICK_TEST_GUIDE.md +0 -72
- package/docs/ROADMAP.md +0 -85
- package/docs/integrations/LARAVEL.md +0 -207
- package/postcss.config.js +0 -6
- package/scripts/debug_redis_keys.ts +0 -24
- package/scripts/flood-logs.ts +0 -21
- package/scripts/seed.ts +0 -213
- package/scripts/verify-throttle.ts +0 -49
- package/scripts/worker.ts +0 -124
- package/specs/PULSE_SPEC.md +0 -86
- package/src/bin.ts +0 -6
- package/src/client/App.tsx +0 -72
- package/src/client/Layout.tsx +0 -669
- package/src/client/Sidebar.tsx +0 -112
- package/src/client/ThroughputChart.tsx +0 -158
- package/src/client/WorkerStatus.tsx +0 -202
- package/src/client/components/BrandIcons.tsx +0 -168
- package/src/client/components/ConfirmDialog.tsx +0 -134
- package/src/client/components/JobInspector.tsx +0 -487
- package/src/client/components/LogArchiveModal.tsx +0 -432
- package/src/client/components/NotificationBell.tsx +0 -212
- package/src/client/components/PageHeader.tsx +0 -47
- package/src/client/components/Toaster.tsx +0 -90
- package/src/client/components/UserProfileDropdown.tsx +0 -186
- package/src/client/contexts/AuthContext.tsx +0 -105
- package/src/client/contexts/NotificationContext.tsx +0 -128
- package/src/client/index.css +0 -172
- package/src/client/main.tsx +0 -15
- package/src/client/pages/LoginPage.tsx +0 -164
- package/src/client/pages/MetricsPage.tsx +0 -445
- package/src/client/pages/OverviewPage.tsx +0 -519
- package/src/client/pages/PulsePage.tsx +0 -409
- package/src/client/pages/QueuesPage.tsx +0 -378
- package/src/client/pages/SchedulesPage.tsx +0 -535
- package/src/client/pages/SettingsPage.tsx +0 -1001
- package/src/client/pages/WorkersPage.tsx +0 -380
- package/src/client/pages/index.ts +0 -8
- package/src/client/utils.ts +0 -15
- package/src/server/config/ServerConfigManager.ts +0 -90
- package/src/server/index.ts +0 -860
- package/src/server/middleware/auth.ts +0 -127
- package/src/server/services/AlertService.ts +0 -321
- package/src/server/services/CommandService.ts +0 -136
- package/src/server/services/LogStreamProcessor.ts +0 -93
- package/src/server/services/MaintenanceScheduler.ts +0 -78
- package/src/server/services/PulseService.ts +0 -148
- package/src/server/services/QueueMetricsCollector.ts +0 -138
- package/src/server/services/QueueService.ts +0 -924
- package/src/shared/types.ts +0 -223
- package/tailwind.config.js +0 -80
- package/tests/placeholder.test.ts +0 -7
- package/tsconfig.json +0 -29
- package/tsconfig.node.json +0 -10
- package/vite.config.ts +0 -27
package/src/client/index.css
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
@tailwind base;
|
|
2
|
-
@tailwind components;
|
|
3
|
-
@tailwind utilities;
|
|
4
|
-
|
|
5
|
-
@import url("https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600;700&family=Poppins:wght@400;500;600;700;800;900&display=swap");
|
|
6
|
-
|
|
7
|
-
@layer base {
|
|
8
|
-
:root {
|
|
9
|
-
--background: 0 0% 100%;
|
|
10
|
-
--foreground: 224 71.4% 4.1%;
|
|
11
|
-
--card: 0 0% 100%;
|
|
12
|
-
--card-foreground: 224 71.4% 4.1%;
|
|
13
|
-
--popover: 0 0% 100%;
|
|
14
|
-
--popover-foreground: 224 71.4% 4.1%;
|
|
15
|
-
--primary: 238.7 83.5% 66.7%;
|
|
16
|
-
/* Indigo 500 */
|
|
17
|
-
--primary-foreground: 210 20% 98%;
|
|
18
|
-
--secondary: 220 14.3% 95.9%;
|
|
19
|
-
--secondary-foreground: 238.7 83.5% 66.7%;
|
|
20
|
-
--muted: 220 14.3% 95.9%;
|
|
21
|
-
--muted-foreground: 220 8.9% 46.1%;
|
|
22
|
-
--accent: 220 14.3% 95.9%;
|
|
23
|
-
--accent-foreground: 238.7 83.5% 66.7%;
|
|
24
|
-
--destructive: 0 84.2% 60.2%;
|
|
25
|
-
--destructive-foreground: 210 20% 98%;
|
|
26
|
-
--border: 220 13% 91%;
|
|
27
|
-
--input: 220 13% 91%;
|
|
28
|
-
--ring: 238.7 83.5% 66.7%;
|
|
29
|
-
--radius: 1.25rem;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.dark {
|
|
33
|
-
--background: 240 10% 3.9%;
|
|
34
|
-
--foreground: 0 0% 98%;
|
|
35
|
-
--card: 240 10% 3.9%;
|
|
36
|
-
--card-foreground: 0 0% 98%;
|
|
37
|
-
--popover: 240 10% 3.9%;
|
|
38
|
-
--popover-foreground: 0 0% 98%;
|
|
39
|
-
--primary: 180 100% 50%; /* Electric Cyan */
|
|
40
|
-
--primary-foreground: 240 5.9% 10%;
|
|
41
|
-
--secondary: 240 3.7% 15.9%;
|
|
42
|
-
--secondary-foreground: 0 0% 98%;
|
|
43
|
-
--muted: 240 3.7% 10%;
|
|
44
|
-
--muted-foreground: 240 5% 64.9%;
|
|
45
|
-
--accent: 240 3.7% 15.9%;
|
|
46
|
-
--accent-foreground: 0 0% 98%;
|
|
47
|
-
--destructive: 0 62.8% 30.6%;
|
|
48
|
-
--destructive-foreground: 0 0% 98%;
|
|
49
|
-
--border: 240 3.7% 15.9%;
|
|
50
|
-
--input: 240 3.7% 15.9%;
|
|
51
|
-
--ring: 180 100% 50%;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
@layer base {
|
|
56
|
-
* {
|
|
57
|
-
@apply border-border;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
body {
|
|
61
|
-
@apply bg-background text-foreground antialiased;
|
|
62
|
-
font-feature-settings: "ss01", "ss02", "cv01", "cv02", "cv03";
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.dark body {
|
|
66
|
-
background-image:
|
|
67
|
-
radial-gradient(at 50% 0%, hsla(238, 83%, 66%, 0.05) 0%, transparent 50%),
|
|
68
|
-
radial-gradient(at 100% 100%, hsla(238, 83%, 66%, 0.02) 0%, transparent 50%);
|
|
69
|
-
background-attachment: fixed;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
@layer utilities {
|
|
74
|
-
.scrollbar-thin::-webkit-scrollbar {
|
|
75
|
-
width: 6px;
|
|
76
|
-
height: 6px;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
.scrollbar-thin::-webkit-scrollbar-track {
|
|
80
|
-
background: transparent;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.scrollbar-thin::-webkit-scrollbar-thumb {
|
|
84
|
-
@apply bg-muted-foreground/20 rounded-full hover:bg-muted-foreground/40 transition-colors;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.glass {
|
|
88
|
-
@apply bg-card/60 backdrop-blur-xl border-white/10;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
.scanline {
|
|
92
|
-
position: relative;
|
|
93
|
-
overflow: hidden;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
.scanline::after {
|
|
97
|
-
content: " ";
|
|
98
|
-
display: block;
|
|
99
|
-
position: absolute;
|
|
100
|
-
top: 0;
|
|
101
|
-
left: 0;
|
|
102
|
-
right: 0;
|
|
103
|
-
bottom: 0;
|
|
104
|
-
background: linear-gradient(to bottom, transparent 50%, rgba(var(--primary), 0.02) 50%);
|
|
105
|
-
background-size: 100% 4px;
|
|
106
|
-
z-index: 2;
|
|
107
|
-
pointer-events: none;
|
|
108
|
-
animation: scanline-move 10s linear infinite;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
@keyframes scanline-move {
|
|
112
|
-
0% {
|
|
113
|
-
background-position: 0 0;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
100% {
|
|
117
|
-
background-position: 0 100%;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
.glow-pulse {
|
|
122
|
-
animation: glow-pulse 2.5s ease-in-out infinite;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
@keyframes glow-pulse {
|
|
126
|
-
0%,
|
|
127
|
-
100% {
|
|
128
|
-
opacity: 0.3;
|
|
129
|
-
transform: scale(1);
|
|
130
|
-
filter: blur(2px);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
50% {
|
|
134
|
-
opacity: 0.7;
|
|
135
|
-
transform: scale(1.5);
|
|
136
|
-
filter: blur(4px);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
.card-premium {
|
|
141
|
-
@apply bg-card border border-border/50 shadow-sm transition-all duration-300;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
.dark .card-premium {
|
|
145
|
-
@apply bg-zinc-900/40 backdrop-blur-xl border-white/5;
|
|
146
|
-
box-shadow: 0 4px 30px rgba(0, 0, 0, 0.8);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
.dark .card-premium:hover {
|
|
150
|
-
@apply border-primary/20 bg-zinc-900/60;
|
|
151
|
-
box-shadow: 0 8px 40px rgba(0, 240, 255, 0.05);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
.animate-in {
|
|
156
|
-
animation-duration: 400ms;
|
|
157
|
-
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
|
|
158
|
-
fill-mode: forwards;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
@keyframes toast-progress {
|
|
162
|
-
from {
|
|
163
|
-
transform: scaleX(1);
|
|
164
|
-
}
|
|
165
|
-
to {
|
|
166
|
-
transform: scaleX(0);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
.animate-toast-progress {
|
|
171
|
-
animation: toast-progress 5s linear forwards;
|
|
172
|
-
}
|
package/src/client/main.tsx
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
|
2
|
-
import React from 'react'
|
|
3
|
-
import ReactDOM from 'react-dom/client'
|
|
4
|
-
import App from './App'
|
|
5
|
-
import './index.css'
|
|
6
|
-
|
|
7
|
-
const queryClient = new QueryClient()
|
|
8
|
-
|
|
9
|
-
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
10
|
-
<React.StrictMode>
|
|
11
|
-
<QueryClientProvider client={queryClient}>
|
|
12
|
-
<App />
|
|
13
|
-
</QueryClientProvider>
|
|
14
|
-
</React.StrictMode>
|
|
15
|
-
)
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { motion } from 'framer-motion'
|
|
2
|
-
import { Activity, AlertCircle, ArrowRight, Eye, EyeOff, Lock } from 'lucide-react'
|
|
3
|
-
import { useState } from 'react'
|
|
4
|
-
import { useAuth } from '../contexts/AuthContext'
|
|
5
|
-
import { cn } from '../utils'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* The login page for the Zenith dashboard.
|
|
9
|
-
*
|
|
10
|
-
* Provides a secure, password-protected entry point to the administration
|
|
11
|
-
* console with modern UI effects and smooth animations.
|
|
12
|
-
*
|
|
13
|
-
* @public
|
|
14
|
-
* @since 3.0.0
|
|
15
|
-
*/
|
|
16
|
-
export function LoginPage() {
|
|
17
|
-
const { login } = useAuth()
|
|
18
|
-
const [password, setPassword] = useState('')
|
|
19
|
-
const [showPassword, setShowPassword] = useState(false)
|
|
20
|
-
const [error, setError] = useState('')
|
|
21
|
-
const [isLoading, setIsLoading] = useState(false)
|
|
22
|
-
|
|
23
|
-
const handleSubmit = async (e: React.FormEvent) => {
|
|
24
|
-
e.preventDefault()
|
|
25
|
-
setError('')
|
|
26
|
-
setIsLoading(true)
|
|
27
|
-
|
|
28
|
-
const result = await login(password)
|
|
29
|
-
|
|
30
|
-
if (!result.success) {
|
|
31
|
-
setError(result.error || 'Authentication failed')
|
|
32
|
-
setIsLoading(false)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return (
|
|
37
|
-
<div className="min-h-screen bg-background flex items-center justify-center p-4 relative overflow-hidden">
|
|
38
|
-
{/* Background Effects */}
|
|
39
|
-
<div className="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-indigo-500/5" />
|
|
40
|
-
<div className="absolute top-1/4 -left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse" />
|
|
41
|
-
<div
|
|
42
|
-
className="absolute bottom-1/4 -right-1/4 w-96 h-96 bg-indigo-500/10 rounded-full blur-3xl animate-pulse"
|
|
43
|
-
style={{ animationDelay: '1s' }}
|
|
44
|
-
/>
|
|
45
|
-
|
|
46
|
-
{/* Grid Pattern */}
|
|
47
|
-
<div className="absolute inset-0 bg-[linear-gradient(rgba(var(--primary-rgb),0.03)_1px,transparent_1px),linear-gradient(90deg,rgba(var(--primary-rgb),0.03)_1px,transparent_1px)] bg-[size:64px_64px]" />
|
|
48
|
-
|
|
49
|
-
<motion.div
|
|
50
|
-
initial={{ opacity: 0, y: 20 }}
|
|
51
|
-
animate={{ opacity: 1, y: 0 }}
|
|
52
|
-
transition={{ duration: 0.5 }}
|
|
53
|
-
className="relative z-10 w-full max-w-md"
|
|
54
|
-
>
|
|
55
|
-
{/* Logo & Title */}
|
|
56
|
-
<div className="text-center mb-8 font-heading">
|
|
57
|
-
<motion.div
|
|
58
|
-
initial={{ scale: 0 }}
|
|
59
|
-
animate={{ scale: 1 }}
|
|
60
|
-
transition={{ type: 'spring', delay: 0.2 }}
|
|
61
|
-
className="inline-flex items-center justify-center w-24 h-24 bg-primary rounded-3xl shadow-[0_0_40px_rgba(0,240,255,0.2)] mb-8"
|
|
62
|
-
>
|
|
63
|
-
<Activity size={48} className="text-black" />
|
|
64
|
-
</motion.div>
|
|
65
|
-
<h1 className="text-5xl font-black tracking-tighter mb-2 text-white italic uppercase">
|
|
66
|
-
ZENITH
|
|
67
|
-
</h1>
|
|
68
|
-
<p className="text-[10px] font-black text-primary uppercase tracking-[0.5em] ml-1">
|
|
69
|
-
Quantum Control Plane
|
|
70
|
-
</p>
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
{/* Login Card */}
|
|
74
|
-
<div className="card-premium p-10 backdrop-blur-2xl bg-zinc-900/40 border-white/5">
|
|
75
|
-
<div className="text-center mb-10">
|
|
76
|
-
<h2 className="text-xl font-black text-white uppercase tracking-tight font-heading">
|
|
77
|
-
Secure Access
|
|
78
|
-
</h2>
|
|
79
|
-
<p className="text-xs text-muted-foreground mt-2 font-bold uppercase tracking-widest opacity-60">
|
|
80
|
-
Biometric or Password verification required
|
|
81
|
-
</p>
|
|
82
|
-
</div>
|
|
83
|
-
|
|
84
|
-
<form onSubmit={handleSubmit} className="space-y-8 font-heading">
|
|
85
|
-
{/* Error Message */}
|
|
86
|
-
{error && (
|
|
87
|
-
<motion.div
|
|
88
|
-
initial={{ opacity: 0, y: -10 }}
|
|
89
|
-
animate={{ opacity: 1, y: 0 }}
|
|
90
|
-
className="flex items-center gap-3 p-4 bg-red-500/10 border border-red-500/20 rounded-xl text-red-500"
|
|
91
|
-
>
|
|
92
|
-
<AlertCircle size={18} />
|
|
93
|
-
<span className="text-[11px] font-black uppercase tracking-widest">{error}</span>
|
|
94
|
-
</motion.div>
|
|
95
|
-
)}
|
|
96
|
-
|
|
97
|
-
{/* Password Field */}
|
|
98
|
-
<div className="space-y-3">
|
|
99
|
-
<label
|
|
100
|
-
htmlFor="password"
|
|
101
|
-
className="text-[10px] font-black text-muted-foreground uppercase tracking-[0.2em] ml-1"
|
|
102
|
-
>
|
|
103
|
-
System Authentication
|
|
104
|
-
</label>
|
|
105
|
-
<div className="relative">
|
|
106
|
-
<Lock
|
|
107
|
-
className="absolute left-4 top-1/2 -translate-y-1/2 text-muted-foreground/40"
|
|
108
|
-
size={18}
|
|
109
|
-
/>
|
|
110
|
-
<input
|
|
111
|
-
id="password"
|
|
112
|
-
type={showPassword ? 'text' : 'password'}
|
|
113
|
-
value={password}
|
|
114
|
-
onChange={(e) => setPassword(e.target.value)}
|
|
115
|
-
placeholder="Enter access code..."
|
|
116
|
-
className={cn(
|
|
117
|
-
'w-full bg-black/40 border border-white/5 rounded-xl py-4 pl-12 pr-12 font-mono',
|
|
118
|
-
'text-sm font-bold placeholder:text-white/10 tracking-widest',
|
|
119
|
-
'focus:outline-none focus:ring-1 focus:ring-primary/40 focus:border-primary/40',
|
|
120
|
-
'transition-all'
|
|
121
|
-
)}
|
|
122
|
-
disabled={isLoading}
|
|
123
|
-
/>
|
|
124
|
-
<button
|
|
125
|
-
type="button"
|
|
126
|
-
onClick={() => setShowPassword(!showPassword)}
|
|
127
|
-
className="absolute right-4 top-1/2 -translate-y-1/2 text-muted-foreground/40 hover:text-primary transition-colors"
|
|
128
|
-
>
|
|
129
|
-
{showPassword ? <EyeOff size={18} /> : <Eye size={18} />}
|
|
130
|
-
</button>
|
|
131
|
-
</div>
|
|
132
|
-
</div>
|
|
133
|
-
|
|
134
|
-
{/* Submit Button */}
|
|
135
|
-
<button
|
|
136
|
-
type="submit"
|
|
137
|
-
disabled={isLoading || !password}
|
|
138
|
-
className={cn(
|
|
139
|
-
'w-full py-4 rounded-xl font-black text-xs uppercase tracking-[0.3em]',
|
|
140
|
-
'bg-primary text-black font-heading shadow-[0_0_30px_rgba(0,240,255,0.2)] hover:shadow-[0_0_40px_rgba(0,240,255,0.4)]',
|
|
141
|
-
'transition-all duration-500 hover:scale-[1.02] active:scale-95',
|
|
142
|
-
'disabled:opacity-20 disabled:cursor-not-allowed disabled:hover:scale-100',
|
|
143
|
-
'flex items-center justify-center gap-3'
|
|
144
|
-
)}
|
|
145
|
-
>
|
|
146
|
-
{isLoading ? (
|
|
147
|
-
<div className="w-5 h-5 border-2 border-black/30 border-t-black rounded-full animate-spin" />
|
|
148
|
-
) : (
|
|
149
|
-
<>
|
|
150
|
-
Connect <ArrowRight size={18} />
|
|
151
|
-
</>
|
|
152
|
-
)}
|
|
153
|
-
</button>
|
|
154
|
-
</form>
|
|
155
|
-
</div>
|
|
156
|
-
|
|
157
|
-
{/* Footer */}
|
|
158
|
-
<p className="text-center mt-6 text-xs text-muted-foreground/50">
|
|
159
|
-
Protected by Gravito Security Layer
|
|
160
|
-
</p>
|
|
161
|
-
</motion.div>
|
|
162
|
-
</div>
|
|
163
|
-
)
|
|
164
|
-
}
|