@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/shared/types.ts
DELETED
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Metrics representing CPU usage for a specific node/process.
|
|
3
|
-
*
|
|
4
|
-
* Used to visualize load distribution and identify CPU-bound workers.
|
|
5
|
-
*
|
|
6
|
-
* @public
|
|
7
|
-
* @since 3.0.0
|
|
8
|
-
*/
|
|
9
|
-
export interface PulseCpu {
|
|
10
|
-
/** System-wide CPU usage percentage (0-100). */
|
|
11
|
-
system: number
|
|
12
|
-
/** Process-specific CPU usage percentage (0-100). */
|
|
13
|
-
process: number
|
|
14
|
-
/** Number of CPU cores available on the host. */
|
|
15
|
-
cores: number
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Metrics representing memory usage for a specific node/process.
|
|
20
|
-
*
|
|
21
|
-
* Critical for detecting memory leaks and capacity planning.
|
|
22
|
-
*
|
|
23
|
-
* @public
|
|
24
|
-
* @since 3.0.0
|
|
25
|
-
*/
|
|
26
|
-
export interface PulseMemory {
|
|
27
|
-
/** System-wide memory statistics. */
|
|
28
|
-
system: {
|
|
29
|
-
/** Total system memory in bytes. */
|
|
30
|
-
total: number
|
|
31
|
-
/** Free system memory in bytes. */
|
|
32
|
-
free: number
|
|
33
|
-
/** Used system memory in bytes. */
|
|
34
|
-
used: number
|
|
35
|
-
}
|
|
36
|
-
/** Process-specific memory statistics. */
|
|
37
|
-
process: {
|
|
38
|
-
/** Resident Set Size (RSS) in bytes. */
|
|
39
|
-
rss: number
|
|
40
|
-
/** Total allocated heap size in bytes. */
|
|
41
|
-
heapTotal: number
|
|
42
|
-
/** Used heap size in bytes. */
|
|
43
|
-
heapUsed: number
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Runtime metadata for a monitored process.
|
|
49
|
-
*
|
|
50
|
-
* Provides context about the environment (Node.js version, platform)
|
|
51
|
-
* and current health status.
|
|
52
|
-
*
|
|
53
|
-
* @public
|
|
54
|
-
* @since 3.0.0
|
|
55
|
-
*/
|
|
56
|
-
export interface PulseRuntime {
|
|
57
|
-
/** Uptime in seconds. */
|
|
58
|
-
uptime: number
|
|
59
|
-
/** Framework or runtime identification (e.g., "Node 21.4"). */
|
|
60
|
-
framework: string
|
|
61
|
-
/** Current process status (e.g., 'online', 'maintenance'). */
|
|
62
|
-
status?: string
|
|
63
|
-
/** Last few error messages captured from the process stderr/logs. */
|
|
64
|
-
errors?: string[]
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Statistics snapshot for a specific queue.
|
|
69
|
-
*
|
|
70
|
-
* Represents the state of a queue at a specific point in time, including
|
|
71
|
-
* job counts and throughput metrics. Used for dashboard graphs.
|
|
72
|
-
*
|
|
73
|
-
* @public
|
|
74
|
-
* @since 3.0.0
|
|
75
|
-
*/
|
|
76
|
-
export interface QueueSnapshot {
|
|
77
|
-
/** The name of the queue. */
|
|
78
|
-
name: string
|
|
79
|
-
/** The driver used (redis, sqs, etc.). */
|
|
80
|
-
driver: 'redis' | 'sqs' | 'rabbitmq'
|
|
81
|
-
/** Current counts of jobs in different states. */
|
|
82
|
-
size: {
|
|
83
|
-
waiting: number
|
|
84
|
-
active: number
|
|
85
|
-
failed: number
|
|
86
|
-
delayed: number
|
|
87
|
-
}
|
|
88
|
-
/** Historical throughput data (jobs processed per minute). */
|
|
89
|
-
throughput?: {
|
|
90
|
-
in: number
|
|
91
|
-
out: number
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Represents a single application instance (node) monitored by Zenith.
|
|
97
|
-
*
|
|
98
|
-
* A PulseNode corresponds to a running process (e.g., a worker, API server)
|
|
99
|
-
* that emits heartbeats. These nodes form the cluster topology.
|
|
100
|
-
*
|
|
101
|
-
* @public
|
|
102
|
-
* @since 3.0.0
|
|
103
|
-
*/
|
|
104
|
-
export interface PulseNode {
|
|
105
|
-
/** Unique execution ID for the node (usually UUID). */
|
|
106
|
-
id: string
|
|
107
|
-
/** Service group name (e.g., "payment-worker", "api-gateway"). */
|
|
108
|
-
service: string
|
|
109
|
-
/** Programming language or runtime type. */
|
|
110
|
-
language: 'node' | 'bun' | 'deno' | 'php' | 'go' | 'python' | 'other'
|
|
111
|
-
/** Application version (from package.json). */
|
|
112
|
-
version: string
|
|
113
|
-
/** Process identifier (PID). */
|
|
114
|
-
pid: number
|
|
115
|
-
/** Hostname of the machine. */
|
|
116
|
-
hostname: string
|
|
117
|
-
/** Operating system platform (darwin, linux, win32). */
|
|
118
|
-
platform: string
|
|
119
|
-
/** CPU metrics. */
|
|
120
|
-
cpu: PulseCpu
|
|
121
|
-
/** Memory metrics. */
|
|
122
|
-
memory: PulseMemory
|
|
123
|
-
/** Optional list of queues managed by this node. */
|
|
124
|
-
queues?: QueueSnapshot[]
|
|
125
|
-
/** Runtime details. */
|
|
126
|
-
runtime: PulseRuntime
|
|
127
|
-
/** Unstructured metadata (e.g., framework-specific details). */
|
|
128
|
-
meta?: any
|
|
129
|
-
/** Epoch timestamp of the last heartbeat received. */
|
|
130
|
-
timestamp: number
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Definition of an alert rule for monitoring health.
|
|
135
|
-
*
|
|
136
|
-
* Alert rules define conditions that trigger notifications, such as
|
|
137
|
-
* high queue backlogs or worker failures.
|
|
138
|
-
*
|
|
139
|
-
* @public
|
|
140
|
-
* @since 3.0.0
|
|
141
|
-
*/
|
|
142
|
-
export interface AlertRule {
|
|
143
|
-
/** Unique rule ID. */
|
|
144
|
-
id: string
|
|
145
|
-
/** Human-readable name. */
|
|
146
|
-
name: string
|
|
147
|
-
/** The metric type to monitor. */
|
|
148
|
-
type: 'backlog' | 'failure' | 'worker_lost' | 'node_cpu' | 'node_ram'
|
|
149
|
-
/** The value that triggers the alert (e.g., > 100 jobs). */
|
|
150
|
-
threshold: number
|
|
151
|
-
/** Optional queue name to scope the rule to. */
|
|
152
|
-
queue?: string
|
|
153
|
-
/** Minutes to wait before re-triggering the alert (debounce). */
|
|
154
|
-
cooldownMinutes: number
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Configuration for alert notification channels.
|
|
159
|
-
*
|
|
160
|
-
* Defines where alerts should be sent when triggered.
|
|
161
|
-
*
|
|
162
|
-
* @public
|
|
163
|
-
* @since 3.0.0
|
|
164
|
-
*/
|
|
165
|
-
export interface AlertConfig {
|
|
166
|
-
/** Map of enabled notification channels. */
|
|
167
|
-
channels: {
|
|
168
|
-
slack?: {
|
|
169
|
-
enabled: boolean
|
|
170
|
-
webhookUrl: string
|
|
171
|
-
}
|
|
172
|
-
discord?: {
|
|
173
|
-
enabled: boolean
|
|
174
|
-
webhookUrl: string
|
|
175
|
-
}
|
|
176
|
-
email?: {
|
|
177
|
-
enabled: boolean
|
|
178
|
-
smtpHost: string
|
|
179
|
-
smtpPort: number
|
|
180
|
-
smtpUser: string
|
|
181
|
-
smtpPass: string
|
|
182
|
-
from: string
|
|
183
|
-
to: string
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Configuration for automated system maintenance.
|
|
190
|
-
*
|
|
191
|
-
* Controls data retention policies and auto-cleanup tasks.
|
|
192
|
-
*
|
|
193
|
-
* @public
|
|
194
|
-
* @since 3.0.0
|
|
195
|
-
*/
|
|
196
|
-
export interface MaintenanceConfig {
|
|
197
|
-
/** Whether to automatically delete old data. */
|
|
198
|
-
autoCleanup: boolean
|
|
199
|
-
/** Number of days to retain records (logs, metrics). */
|
|
200
|
-
retentionDays: number
|
|
201
|
-
/** Timestamp of the last maintenance run. */
|
|
202
|
-
lastRun?: number
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Represents a historical alert event.
|
|
207
|
-
*
|
|
208
|
-
* Stored in the database/log to track system health history.
|
|
209
|
-
*
|
|
210
|
-
* @public
|
|
211
|
-
* @since 3.0.0
|
|
212
|
-
*/
|
|
213
|
-
export interface AlertEvent {
|
|
214
|
-
id?: string
|
|
215
|
-
ruleId: string
|
|
216
|
-
ruleName?: string
|
|
217
|
-
type?: string
|
|
218
|
-
severity: 'critical' | 'warning' | 'info'
|
|
219
|
-
message: string
|
|
220
|
-
timestamp: number
|
|
221
|
-
resolved?: boolean
|
|
222
|
-
resolvedAt?: number
|
|
223
|
-
}
|
package/tailwind.config.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/** @type {import('tailwindcss').Config} */
|
|
2
|
-
export default {
|
|
3
|
-
content: ['./src/client/index.html', './src/client/**/*.{js,ts,jsx,tsx}'],
|
|
4
|
-
theme: {
|
|
5
|
-
extend: {
|
|
6
|
-
colors: {
|
|
7
|
-
background: 'hsl(var(--background))',
|
|
8
|
-
foreground: 'hsl(var(--foreground))',
|
|
9
|
-
oled: '#000000',
|
|
10
|
-
cyan: {
|
|
11
|
-
500: '#00F0FF',
|
|
12
|
-
accent: '#00F0FF',
|
|
13
|
-
},
|
|
14
|
-
card: {
|
|
15
|
-
DEFAULT: 'hsl(var(--card))',
|
|
16
|
-
foreground: 'hsl(var(--card-foreground))',
|
|
17
|
-
},
|
|
18
|
-
popover: {
|
|
19
|
-
DEFAULT: 'hsl(var(--popover))',
|
|
20
|
-
foreground: 'hsl(var(--popover-foreground))',
|
|
21
|
-
},
|
|
22
|
-
primary: {
|
|
23
|
-
DEFAULT: 'hsl(var(--primary))',
|
|
24
|
-
foreground: 'hsl(var(--primary-foreground))',
|
|
25
|
-
},
|
|
26
|
-
secondary: {
|
|
27
|
-
DEFAULT: 'hsl(var(--secondary))',
|
|
28
|
-
foreground: 'hsl(var(--secondary-foreground))',
|
|
29
|
-
},
|
|
30
|
-
muted: {
|
|
31
|
-
DEFAULT: 'hsl(var(--muted))',
|
|
32
|
-
foreground: 'hsl(var(--muted-foreground))',
|
|
33
|
-
},
|
|
34
|
-
accent: {
|
|
35
|
-
DEFAULT: 'hsl(var(--accent))',
|
|
36
|
-
foreground: 'hsl(var(--accent-foreground))',
|
|
37
|
-
},
|
|
38
|
-
destructive: {
|
|
39
|
-
DEFAULT: 'hsl(var(--destructive))',
|
|
40
|
-
foreground: 'hsl(var(--destructive-foreground))',
|
|
41
|
-
},
|
|
42
|
-
border: 'hsl(var(--border))',
|
|
43
|
-
input: 'hsl(var(--input))',
|
|
44
|
-
ring: 'hsl(var(--ring))',
|
|
45
|
-
chart: {
|
|
46
|
-
1: 'hsl(var(--chart-1))',
|
|
47
|
-
2: 'hsl(var(--chart-2))',
|
|
48
|
-
3: 'hsl(var(--chart-3))',
|
|
49
|
-
4: 'hsl(var(--chart-4))',
|
|
50
|
-
5: 'hsl(var(--chart-5))',
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
borderRadius: {
|
|
54
|
-
lg: 'var(--radius)',
|
|
55
|
-
md: 'calc(var(--radius) - 2px)',
|
|
56
|
-
sm: 'calc(var(--radius) - 4px)',
|
|
57
|
-
},
|
|
58
|
-
keyframes: {
|
|
59
|
-
'accordion-down': {
|
|
60
|
-
from: { height: '0' },
|
|
61
|
-
to: { height: 'var(--radix-accordion-content-height)' },
|
|
62
|
-
},
|
|
63
|
-
'accordion-up': {
|
|
64
|
-
from: { height: 'var(--radix-accordion-content-height)' },
|
|
65
|
-
to: { height: '0' },
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
animation: {
|
|
69
|
-
'accordion-down': 'accordion-down 0.2s ease-out',
|
|
70
|
-
'accordion-up': 'accordion-up 0.2s ease-out',
|
|
71
|
-
},
|
|
72
|
-
fontFamily: {
|
|
73
|
-
sans: ['Poppins', 'ui-sans-serif', 'system-ui', 'sans-serif'],
|
|
74
|
-
mono: ['Fira Code', 'ui-monospace', 'SFMono-Regular', 'monospace'],
|
|
75
|
-
heading: ['Poppins', 'sans-serif'],
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
plugins: [],
|
|
80
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"target": "ESNext",
|
|
5
|
-
"useDefineForClassFields": true,
|
|
6
|
-
"lib": ["ESNext", "DOM", "DOM.Iterable"],
|
|
7
|
-
"module": "ESNext",
|
|
8
|
-
"skipLibCheck": true,
|
|
9
|
-
/* Bundler mode */
|
|
10
|
-
"moduleResolution": "bundler",
|
|
11
|
-
"allowImportingTsExtensions": true,
|
|
12
|
-
"resolveJsonModule": true,
|
|
13
|
-
"isolatedModules": true,
|
|
14
|
-
"noEmit": true,
|
|
15
|
-
"jsx": "react-jsx",
|
|
16
|
-
/* Linting */
|
|
17
|
-
"strict": true,
|
|
18
|
-
"noUnusedLocals": true,
|
|
19
|
-
"noUnusedParameters": true,
|
|
20
|
-
"noFallthroughCasesInSwitch": true,
|
|
21
|
-
"types": ["bun-types", "vite/client"]
|
|
22
|
-
},
|
|
23
|
-
"include": ["src"],
|
|
24
|
-
"references": [
|
|
25
|
-
{
|
|
26
|
-
"path": "./tsconfig.node.json"
|
|
27
|
-
}
|
|
28
|
-
]
|
|
29
|
-
}
|
package/tsconfig.node.json
DELETED
package/vite.config.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { resolve } from 'node:path'
|
|
2
|
-
import react from '@vitejs/plugin-react'
|
|
3
|
-
import { defineConfig } from 'vite'
|
|
4
|
-
|
|
5
|
-
// https://vitejs.dev/config/
|
|
6
|
-
export default defineConfig({
|
|
7
|
-
plugins: [react()],
|
|
8
|
-
root: 'src/client',
|
|
9
|
-
publicDir: '../../public',
|
|
10
|
-
build: {
|
|
11
|
-
outDir: '../../dist/client',
|
|
12
|
-
emptyOutDir: true,
|
|
13
|
-
},
|
|
14
|
-
resolve: {
|
|
15
|
-
alias: {
|
|
16
|
-
'@': resolve(__dirname, './src/client'),
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
server: {
|
|
20
|
-
proxy: {
|
|
21
|
-
'/api': {
|
|
22
|
-
target: 'http://localhost:3000',
|
|
23
|
-
changeOrigin: true,
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
})
|