create-fluxstack 1.0.13 โ†’ 1.0.15

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 (214) hide show
  1. package/.env.example +29 -29
  2. package/app/client/README.md +69 -69
  3. package/app/client/index.html +14 -13
  4. package/app/client/src/App.tsx +157 -524
  5. package/app/client/src/components/ErrorBoundary.tsx +107 -0
  6. package/app/client/src/components/ErrorDisplay.css +365 -0
  7. package/app/client/src/components/ErrorDisplay.tsx +258 -0
  8. package/app/client/src/components/FluxStackConfig.tsx +1321 -0
  9. package/app/client/src/components/HybridLiveCounter.tsx +140 -0
  10. package/app/client/src/components/LiveClock.tsx +286 -0
  11. package/app/client/src/components/MainLayout.tsx +390 -0
  12. package/app/client/src/components/SidebarNavigation.tsx +391 -0
  13. package/app/client/src/components/StateDemo.tsx +178 -0
  14. package/app/client/src/components/SystemMonitor.tsx +1038 -0
  15. package/app/client/src/components/Teste.tsx +104 -0
  16. package/app/client/src/components/UserProfile.tsx +809 -0
  17. package/app/client/src/hooks/useAuth.ts +39 -0
  18. package/app/client/src/hooks/useNotifications.ts +56 -0
  19. package/app/client/src/lib/eden-api.ts +189 -53
  20. package/app/client/src/lib/errors.ts +340 -0
  21. package/app/client/src/lib/hooks/useErrorHandler.ts +258 -0
  22. package/app/client/src/lib/index.ts +45 -0
  23. package/app/client/src/main.tsx +3 -2
  24. package/app/client/src/pages/ApiDocs.tsx +182 -0
  25. package/app/client/src/pages/Demo.tsx +174 -0
  26. package/app/client/src/pages/HybridLive.tsx +263 -0
  27. package/app/client/src/pages/Overview.tsx +155 -0
  28. package/app/client/src/store/README.md +43 -0
  29. package/app/client/src/store/index.ts +16 -0
  30. package/app/client/src/store/slices/uiSlice.ts +151 -0
  31. package/app/client/src/store/slices/userSlice.ts +161 -0
  32. package/app/client/src/test/README.md +257 -0
  33. package/app/client/src/test/setup.ts +70 -0
  34. package/app/client/src/test/types.ts +12 -0
  35. package/app/client/src/vite-env.d.ts +1 -1
  36. package/app/client/tsconfig.app.json +44 -43
  37. package/app/client/tsconfig.json +7 -7
  38. package/app/client/tsconfig.node.json +25 -25
  39. package/app/client/zustand-setup.md +65 -0
  40. package/app/server/controllers/users.controller.ts +68 -68
  41. package/app/server/index.ts +9 -1
  42. package/app/server/live/CounterComponent.ts +191 -0
  43. package/app/server/live/FluxStackConfig.ts +529 -0
  44. package/app/server/live/LiveClockComponent.ts +214 -0
  45. package/app/server/live/SidebarNavigation.ts +156 -0
  46. package/app/server/live/SystemMonitor.ts +594 -0
  47. package/app/server/live/SystemMonitorIntegration.ts +151 -0
  48. package/app/server/live/TesteComponent.ts +87 -0
  49. package/app/server/live/UserProfileComponent.ts +135 -0
  50. package/app/server/live/register-components.ts +28 -0
  51. package/app/server/middleware/auth.ts +136 -0
  52. package/app/server/middleware/errorHandling.ts +250 -0
  53. package/app/server/middleware/index.ts +10 -0
  54. package/app/server/middleware/rateLimit.ts +193 -0
  55. package/app/server/middleware/requestLogging.ts +215 -0
  56. package/app/server/middleware/validation.ts +270 -0
  57. package/app/server/routes/index.ts +14 -2
  58. package/app/server/routes/upload.ts +92 -0
  59. package/app/server/routes/users.routes.ts +2 -9
  60. package/app/server/services/NotificationService.ts +302 -0
  61. package/app/server/services/UserService.ts +222 -0
  62. package/app/server/services/index.ts +46 -0
  63. package/core/cli/commands/plugin-deps.ts +263 -0
  64. package/core/cli/generators/README.md +339 -0
  65. package/core/cli/generators/component.ts +770 -0
  66. package/core/cli/generators/controller.ts +299 -0
  67. package/core/cli/generators/index.ts +144 -0
  68. package/core/cli/generators/interactive.ts +228 -0
  69. package/core/cli/generators/prompts.ts +83 -0
  70. package/core/cli/generators/route.ts +513 -0
  71. package/core/cli/generators/service.ts +465 -0
  72. package/core/cli/generators/template-engine.ts +154 -0
  73. package/core/cli/generators/types.ts +71 -0
  74. package/core/cli/generators/utils.ts +192 -0
  75. package/core/cli/index.ts +69 -0
  76. package/core/cli/plugin-discovery.ts +16 -85
  77. package/core/client/fluxstack.ts +17 -0
  78. package/core/client/hooks/index.ts +7 -0
  79. package/core/client/hooks/state-validator.ts +130 -0
  80. package/core/client/hooks/useAuth.ts +49 -0
  81. package/core/client/hooks/useChunkedUpload.ts +258 -0
  82. package/core/client/hooks/useHybridLiveComponent.ts +967 -0
  83. package/core/client/hooks/useWebSocket.ts +373 -0
  84. package/core/client/index.ts +47 -0
  85. package/core/client/state/createStore.ts +193 -0
  86. package/core/client/state/index.ts +15 -0
  87. package/core/config/env-dynamic.ts +1 -1
  88. package/core/config/env.ts +2 -1
  89. package/core/config/runtime-config.ts +3 -3
  90. package/core/config/schema.ts +84 -49
  91. package/core/framework/server.ts +30 -0
  92. package/core/index.ts +25 -0
  93. package/core/live/ComponentRegistry.ts +399 -0
  94. package/core/live/types.ts +164 -0
  95. package/core/plugins/built-in/live-components/commands/create-live-component.ts +1201 -0
  96. package/core/plugins/built-in/live-components/index.ts +27 -0
  97. package/core/plugins/built-in/logger/index.ts +1 -1
  98. package/core/plugins/built-in/monitoring/index.ts +1 -1
  99. package/core/plugins/built-in/static/index.ts +1 -1
  100. package/core/plugins/built-in/swagger/index.ts +1 -1
  101. package/core/plugins/built-in/vite/index.ts +1 -1
  102. package/core/plugins/dependency-manager.ts +384 -0
  103. package/core/plugins/index.ts +5 -1
  104. package/core/plugins/manager.ts +7 -3
  105. package/core/plugins/registry.ts +88 -10
  106. package/core/plugins/types.ts +11 -11
  107. package/core/server/framework.ts +43 -0
  108. package/core/server/index.ts +11 -1
  109. package/core/server/live/ComponentRegistry.ts +1017 -0
  110. package/core/server/live/FileUploadManager.ts +272 -0
  111. package/core/server/live/LiveComponentPerformanceMonitor.ts +930 -0
  112. package/core/server/live/SingleConnectionManager.ts +0 -0
  113. package/core/server/live/StateSignature.ts +644 -0
  114. package/core/server/live/WebSocketConnectionManager.ts +688 -0
  115. package/core/server/live/websocket-plugin.ts +435 -0
  116. package/core/server/middleware/errorHandling.ts +141 -0
  117. package/core/server/middleware/index.ts +16 -0
  118. package/core/server/plugins/static-files-plugin.ts +232 -0
  119. package/core/server/services/BaseService.ts +95 -0
  120. package/core/server/services/ServiceContainer.ts +144 -0
  121. package/core/server/services/index.ts +9 -0
  122. package/core/templates/create-project.ts +196 -33
  123. package/core/testing/index.ts +10 -0
  124. package/core/testing/setup.ts +74 -0
  125. package/core/types/build.ts +38 -14
  126. package/core/types/types.ts +319 -0
  127. package/core/utils/env-runtime.ts +7 -0
  128. package/core/utils/errors/handlers.ts +264 -39
  129. package/core/utils/errors/index.ts +528 -18
  130. package/core/utils/errors/middleware.ts +114 -0
  131. package/core/utils/logger/formatters.ts +222 -0
  132. package/core/utils/logger/index.ts +167 -48
  133. package/core/utils/logger/middleware.ts +253 -0
  134. package/core/utils/logger/performance.ts +384 -0
  135. package/core/utils/logger/transports.ts +365 -0
  136. package/create-fluxstack.ts +296 -296
  137. package/fluxstack.config.ts +17 -1
  138. package/package-template.json +66 -66
  139. package/package.json +31 -6
  140. package/public/README.md +16 -0
  141. package/vite.config.ts +29 -14
  142. package/.claude/settings.local.json +0 -74
  143. package/.github/workflows/ci-build-tests.yml +0 -480
  144. package/.github/workflows/dependency-management.yml +0 -324
  145. package/.github/workflows/release-validation.yml +0 -355
  146. package/.kiro/specs/fluxstack-architecture-optimization/design.md +0 -700
  147. package/.kiro/specs/fluxstack-architecture-optimization/requirements.md +0 -127
  148. package/.kiro/specs/fluxstack-architecture-optimization/tasks.md +0 -330
  149. package/CLAUDE.md +0 -200
  150. package/Dockerfile +0 -58
  151. package/Dockerfile.backend +0 -52
  152. package/Dockerfile.frontend +0 -54
  153. package/README-Docker.md +0 -85
  154. package/ai-context/00-QUICK-START.md +0 -86
  155. package/ai-context/README.md +0 -88
  156. package/ai-context/development/eden-treaty-guide.md +0 -362
  157. package/ai-context/development/patterns.md +0 -382
  158. package/ai-context/development/plugins-guide.md +0 -572
  159. package/ai-context/examples/crud-complete.md +0 -626
  160. package/ai-context/project/architecture.md +0 -399
  161. package/ai-context/project/overview.md +0 -213
  162. package/ai-context/recent-changes/eden-treaty-refactor.md +0 -281
  163. package/ai-context/recent-changes/type-inference-fix.md +0 -223
  164. package/ai-context/reference/environment-vars.md +0 -384
  165. package/ai-context/reference/troubleshooting.md +0 -407
  166. package/app/client/src/components/TestPage.tsx +0 -453
  167. package/bun.lock +0 -1063
  168. package/bunfig.toml +0 -16
  169. package/core/__tests__/integration.test.ts +0 -227
  170. package/core/build/index.ts +0 -186
  171. package/core/config/__tests__/config-loader.test.ts +0 -554
  172. package/core/config/__tests__/config-merger.test.ts +0 -657
  173. package/core/config/__tests__/env-converter.test.ts +0 -372
  174. package/core/config/__tests__/env-processor.test.ts +0 -431
  175. package/core/config/__tests__/env.test.ts +0 -452
  176. package/core/config/__tests__/integration.test.ts +0 -418
  177. package/core/config/__tests__/loader.test.ts +0 -331
  178. package/core/config/__tests__/schema.test.ts +0 -129
  179. package/core/config/__tests__/validator.test.ts +0 -318
  180. package/core/framework/__tests__/server.test.ts +0 -233
  181. package/core/plugins/__tests__/built-in.test.ts.disabled +0 -366
  182. package/core/plugins/__tests__/manager.test.ts +0 -398
  183. package/core/plugins/__tests__/monitoring.test.ts +0 -401
  184. package/core/plugins/__tests__/registry.test.ts +0 -335
  185. package/core/utils/__tests__/errors.test.ts +0 -139
  186. package/core/utils/__tests__/helpers.test.ts +0 -297
  187. package/core/utils/__tests__/logger.test.ts +0 -141
  188. package/create-test-app.ts +0 -156
  189. package/docker-compose.microservices.yml +0 -75
  190. package/docker-compose.simple.yml +0 -57
  191. package/docker-compose.yml +0 -71
  192. package/eslint.config.js +0 -23
  193. package/flux-cli.ts +0 -214
  194. package/nginx-lb.conf +0 -37
  195. package/publish.sh +0 -63
  196. package/run-clean.ts +0 -26
  197. package/run-env-tests.ts +0 -313
  198. package/tailwind.config.js +0 -34
  199. package/tests/__mocks__/api.ts +0 -56
  200. package/tests/fixtures/users.ts +0 -69
  201. package/tests/integration/api/users.routes.test.ts +0 -221
  202. package/tests/setup.ts +0 -29
  203. package/tests/unit/app/client/App-simple.test.tsx +0 -56
  204. package/tests/unit/app/client/App.test.tsx.skip +0 -237
  205. package/tests/unit/app/client/eden-api.test.ts +0 -186
  206. package/tests/unit/app/client/simple.test.tsx +0 -23
  207. package/tests/unit/app/controllers/users.controller.test.ts +0 -150
  208. package/tests/unit/core/create-project.test.ts.skip +0 -95
  209. package/tests/unit/core/framework.test.ts +0 -144
  210. package/tests/unit/core/plugins/logger.test.ts.skip +0 -268
  211. package/tests/unit/core/plugins/vite.test.ts.disabled +0 -188
  212. package/tests/utils/test-helpers.ts +0 -61
  213. package/vitest.config.ts +0 -50
  214. package/workspace.json +0 -6
@@ -0,0 +1,594 @@
1
+ // ๐Ÿ”ฅ System Monitor Live Component
2
+
3
+ import { LiveComponent } from '@/core/types/types'
4
+ import { componentRegistry } from '@/core/server/live/ComponentRegistry'
5
+
6
+ export interface SystemMonitorState {
7
+ // Real-time metrics
8
+ totalComponents: number
9
+ activeConnections: number
10
+ totalRooms: number
11
+ messagesPerSecond: number
12
+ averageResponseTime: number
13
+
14
+ // Component breakdown
15
+ componentsByType: Record<string, number>
16
+ roomDetails: Record<string, number>
17
+
18
+ // Performance metrics
19
+ memoryUsage: {
20
+ used: number
21
+ total: number
22
+ percentage: number
23
+ }
24
+
25
+ // Recent activity
26
+ recentConnections: Array<{
27
+ id: string
28
+ timestamp: number
29
+ componentType: string
30
+ status: 'connected' | 'disconnected' | 'rehydrated'
31
+ }>
32
+
33
+ recentMessages: Array<{
34
+ id: string
35
+ timestamp: number
36
+ type: string
37
+ componentId: string
38
+ success: boolean
39
+ responseTime?: number
40
+ }>
41
+
42
+ // System health
43
+ systemHealth: {
44
+ status: 'healthy' | 'warning' | 'critical'
45
+ uptime: number
46
+ lastRestart: number
47
+ errors: number
48
+ warnings: number
49
+ }
50
+
51
+ // Auto-refresh settings
52
+ autoRefresh: boolean
53
+ refreshInterval: number
54
+ lastUpdated: number
55
+ }
56
+
57
+ export class SystemMonitor extends LiveComponent<SystemMonitorState> {
58
+ private refreshTimer: NodeJS.Timeout | null = null
59
+ private pushTimer: NodeJS.Timeout | null = null
60
+ private messageCount = 0
61
+ private lastMessageTime = Date.now()
62
+ private responseTimes: number[] = []
63
+ private startTime = Date.now()
64
+ private pushInterval = 1000 // Push every 1 second
65
+ private isActive = true // Control flag for stopping all activities
66
+
67
+ constructor(initialState: SystemMonitorState, ws: any, options?: any) {
68
+ super(initialState, ws, options)
69
+
70
+ // Set default state
71
+ this.state = {
72
+ totalComponents: 0,
73
+ activeConnections: 0,
74
+ totalRooms: 0,
75
+ messagesPerSecond: 0,
76
+ averageResponseTime: 0,
77
+ componentsByType: {},
78
+ roomDetails: {},
79
+ memoryUsage: {
80
+ used: 0,
81
+ total: 0,
82
+ percentage: 0
83
+ },
84
+ recentConnections: [],
85
+ recentMessages: [],
86
+ systemHealth: {
87
+ status: 'healthy',
88
+ uptime: 0,
89
+ lastRestart: Date.now(),
90
+ errors: 0,
91
+ warnings: 0
92
+ },
93
+ autoRefresh: true,
94
+ refreshInterval: 2000, // 2 seconds
95
+ lastUpdated: Date.now(),
96
+ ...initialState
97
+ }
98
+
99
+ // Start auto-refresh if enabled
100
+ if (this.state.autoRefresh) {
101
+ this.startAutoRefresh()
102
+ }
103
+
104
+ // Start automatic push timer
105
+ this.startAutoPush()
106
+
107
+ // Initial data collection with push
108
+ this.collectMetricsWithPush()
109
+ }
110
+
111
+ // Start auto-refresh timer
112
+ async startAutoRefresh() {
113
+ if (this.refreshTimer) {
114
+ clearInterval(this.refreshTimer)
115
+ }
116
+
117
+ this.refreshTimer = setInterval(() => {
118
+ this.collectMetricsWithPush()
119
+ }, this.state.refreshInterval)
120
+
121
+ console.log(`๐Ÿ”„ SystemMonitor: Auto-refresh started (${this.state.refreshInterval}ms)`)
122
+ }
123
+
124
+ // Stop auto-refresh timer
125
+ async stopAutoRefresh() {
126
+ if (this.refreshTimer) {
127
+ clearInterval(this.refreshTimer)
128
+ this.refreshTimer = null
129
+ }
130
+
131
+ console.log('โน๏ธ SystemMonitor: Auto-refresh stopped')
132
+ }
133
+
134
+ // Start automatic push timer
135
+ async startAutoPush() {
136
+ if (this.pushTimer) {
137
+ clearInterval(this.pushTimer)
138
+ }
139
+
140
+ this.pushTimer = setInterval(() => {
141
+ this.sendLiveUpdate()
142
+ }, this.pushInterval)
143
+
144
+ console.log(`๐Ÿ“ก SystemMonitor: Auto-push started (${this.pushInterval}ms)`)
145
+ }
146
+
147
+ // Stop automatic push timer
148
+ async stopAutoPush() {
149
+ if (this.pushTimer) {
150
+ clearInterval(this.pushTimer)
151
+ this.pushTimer = null
152
+ }
153
+
154
+ console.log('โน๏ธ SystemMonitor: Auto-push stopped')
155
+ }
156
+
157
+ // Send live update to frontend
158
+ private sendLiveUpdate() {
159
+ if (!this.isActive) {
160
+ return // Stop sending updates if component is not active
161
+ }
162
+
163
+ try {
164
+ const quickMetrics = {
165
+ timestamp: Date.now(),
166
+ uptime: Math.round((Date.now() - this.startTime) / 1000),
167
+ connections: componentRegistry.getStats().connections,
168
+ components: componentRegistry.getStats().components,
169
+ memoryPercentage: this.state.memoryUsage.percentage,
170
+ healthStatus: this.state.systemHealth.status,
171
+ lastActivity: Math.max(
172
+ ...this.state.recentMessages.map(m => m.timestamp),
173
+ ...this.state.recentConnections.map(c => c.timestamp),
174
+ 0
175
+ )
176
+ }
177
+
178
+ this.pushUpdate({
179
+ type: 'LIVE_UPDATE',
180
+ ...quickMetrics
181
+ })
182
+
183
+ } catch (error: any) {
184
+ console.warn('โš ๏ธ SystemMonitor: Failed to send live update:', error.message)
185
+ }
186
+ }
187
+
188
+ // Toggle auto-refresh
189
+ async toggleAutoRefresh() {
190
+ const newAutoRefresh = !this.state.autoRefresh
191
+
192
+ this.setState({
193
+ autoRefresh: newAutoRefresh
194
+ })
195
+
196
+ if (newAutoRefresh) {
197
+ this.startAutoRefresh()
198
+ this.startAutoPush() // Also restart push when enabling
199
+ } else {
200
+ this.stopAutoRefresh()
201
+ this.stopAutoPush() // Also stop push when disabling
202
+ }
203
+
204
+ this.emit('AUTO_REFRESH_TOGGLED', {
205
+ enabled: newAutoRefresh,
206
+ timestamp: Date.now()
207
+ })
208
+ }
209
+
210
+ // Set refresh interval
211
+ async setRefreshInterval(data: { interval: number }) {
212
+ if (data.interval < 500 || data.interval > 60000) {
213
+ throw new Error('Refresh interval must be between 500ms and 60s')
214
+ }
215
+
216
+ this.setState({
217
+ refreshInterval: data.interval
218
+ })
219
+
220
+ // Restart auto-refresh with new interval
221
+ if (this.state.autoRefresh) {
222
+ this.startAutoRefresh()
223
+ }
224
+
225
+ this.emit('REFRESH_INTERVAL_CHANGED', {
226
+ interval: data.interval,
227
+ timestamp: Date.now()
228
+ })
229
+
230
+ console.log(`โฑ๏ธ SystemMonitor: Refresh interval set to ${data.interval}ms`)
231
+ }
232
+
233
+ // Set push interval for live updates
234
+ async setPushInterval(data: { interval: number }) {
235
+ if (data.interval < 100 || data.interval > 10000) {
236
+ throw new Error('Push interval must be between 100ms and 10s')
237
+ }
238
+
239
+ this.pushInterval = data.interval
240
+
241
+ // Restart push timer with new interval
242
+ this.startAutoPush()
243
+
244
+ this.emit('PUSH_INTERVAL_CHANGED', {
245
+ interval: data.interval,
246
+ timestamp: Date.now()
247
+ })
248
+
249
+ console.log(`๐Ÿ“ก SystemMonitor: Push interval set to ${data.interval}ms`)
250
+ }
251
+
252
+ // Collect all system metrics
253
+ async collectMetrics() {
254
+ try {
255
+ const registryStats = componentRegistry.getStats()
256
+ const memUsage = process.memoryUsage()
257
+ const uptime = Date.now() - this.startTime
258
+
259
+ // Calculate messages per second
260
+ const now = Date.now()
261
+ const timeDiff = (now - this.lastMessageTime) / 1000
262
+ const messagesPerSecond = timeDiff > 0 ? this.messageCount / timeDiff : 0
263
+
264
+ // Calculate average response time
265
+ const avgResponseTime = this.responseTimes.length > 0
266
+ ? this.responseTimes.reduce((a, b) => a + b, 0) / this.responseTimes.length
267
+ : 0
268
+
269
+ // Determine system health
270
+ const systemHealth = this.calculateSystemHealth(registryStats, memUsage)
271
+
272
+ // Update state with new metrics
273
+ this.setState({
274
+ totalComponents: registryStats.components,
275
+ activeConnections: registryStats.connections,
276
+ totalRooms: registryStats.rooms,
277
+ messagesPerSecond: Math.round(messagesPerSecond * 100) / 100,
278
+ averageResponseTime: Math.round(avgResponseTime * 100) / 100,
279
+ componentsByType: this.getComponentsByType(),
280
+ roomDetails: registryStats.roomDetails,
281
+ memoryUsage: {
282
+ used: Math.round(memUsage.heapUsed / 1024 / 1024 * 100) / 100, // MB
283
+ total: Math.round(memUsage.heapTotal / 1024 / 1024 * 100) / 100, // MB
284
+ percentage: Math.round((memUsage.heapUsed / memUsage.heapTotal) * 100)
285
+ },
286
+ systemHealth: {
287
+ ...this.state.systemHealth,
288
+ status: systemHealth.status,
289
+ uptime: Math.round(uptime / 1000), // seconds
290
+ },
291
+ lastUpdated: Date.now()
292
+ })
293
+
294
+ // Push automatic update to frontend
295
+ this.pushUpdate({
296
+ type: 'METRICS_UPDATED',
297
+ timestamp: Date.now(),
298
+ metrics: {
299
+ components: registryStats.components,
300
+ connections: registryStats.connections,
301
+ rooms: registryStats.rooms,
302
+ messagesPerSecond: Math.round(messagesPerSecond * 100) / 100,
303
+ memoryUsage: this.state.memoryUsage,
304
+ systemHealth: this.state.systemHealth
305
+ }
306
+ })
307
+
308
+ this.emit('METRICS_UPDATED', {
309
+ timestamp: Date.now(),
310
+ metrics: {
311
+ components: registryStats.components,
312
+ connections: registryStats.connections,
313
+ rooms: registryStats.rooms,
314
+ messagesPerSecond: Math.round(messagesPerSecond * 100) / 100
315
+ }
316
+ })
317
+
318
+ } catch (error: any) {
319
+ console.error('โŒ SystemMonitor: Error collecting metrics:', error.message)
320
+ this.incrementErrorCount()
321
+ }
322
+ }
323
+
324
+ // Calculate system health based on metrics
325
+ private calculateSystemHealth(stats: any, memUsage: any) {
326
+ let status: 'healthy' | 'warning' | 'critical' = 'healthy'
327
+
328
+ // Check memory usage
329
+ const memPercentage = (memUsage.heapUsed / memUsage.heapTotal) * 100
330
+ if (memPercentage > 90) {
331
+ status = 'critical'
332
+ } else if (memPercentage > 75) {
333
+ status = 'warning'
334
+ }
335
+
336
+ // Check connection count (arbitrary thresholds)
337
+ if (stats.connections > 100) {
338
+ status = status === 'critical' ? 'critical' : 'warning'
339
+ }
340
+
341
+ // Check error rate
342
+ if (this.state.systemHealth.errors > 10) {
343
+ status = 'critical'
344
+ } else if (this.state.systemHealth.errors > 5) {
345
+ status = status === 'critical' ? 'critical' : 'warning'
346
+ }
347
+
348
+ return { status }
349
+ }
350
+
351
+ // Get component breakdown by type
352
+ private getComponentsByType(): Record<string, number> {
353
+ // This would ideally be integrated with the registry
354
+ // For now, return mock data based on known components
355
+ return {
356
+ 'UserProfile': 1,
357
+ 'SidebarNavigation': 1,
358
+ 'SystemMonitor': 1,
359
+ 'Counter': 0,
360
+ 'TestComponent': 0
361
+ }
362
+ }
363
+
364
+ // Record a new connection event
365
+ async recordConnection(data: { componentType: string; status: 'connected' | 'disconnected' | 'rehydrated' }) {
366
+ const connectionEvent = {
367
+ id: `conn-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`,
368
+ timestamp: Date.now(),
369
+ componentType: data.componentType,
370
+ status: data.status
371
+ }
372
+
373
+ // Add to recent connections (keep last 50)
374
+ const recentConnections = [connectionEvent, ...this.state.recentConnections].slice(0, 50)
375
+
376
+ this.setState({ recentConnections })
377
+
378
+ this.emit('CONNECTION_RECORDED', connectionEvent)
379
+
380
+ console.log(`๐Ÿ“Š SystemMonitor: Recorded ${data.status} for ${data.componentType}`)
381
+ }
382
+
383
+ // Record a new message event
384
+ async recordMessage(data: { type: string; componentId: string; success: boolean; responseTime?: number }) {
385
+ const messageEvent = {
386
+ id: `msg-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`,
387
+ timestamp: Date.now(),
388
+ type: data.type,
389
+ componentId: data.componentId,
390
+ success: data.success,
391
+ responseTime: data.responseTime
392
+ }
393
+
394
+ // Add to recent messages (keep last 100)
395
+ const recentMessages = [messageEvent, ...this.state.recentMessages].slice(0, 100)
396
+
397
+ this.setState({ recentMessages })
398
+
399
+ // Update response time tracking
400
+ if (data.responseTime) {
401
+ this.responseTimes.push(data.responseTime)
402
+ if (this.responseTimes.length > 100) {
403
+ this.responseTimes = this.responseTimes.slice(-100)
404
+ }
405
+ }
406
+
407
+ // Update message count for rate calculation
408
+ this.messageCount++
409
+
410
+ this.emit('MESSAGE_RECORDED', messageEvent)
411
+ }
412
+
413
+ // Increment error count
414
+ private incrementErrorCount() {
415
+ this.setState({
416
+ systemHealth: {
417
+ ...this.state.systemHealth,
418
+ errors: this.state.systemHealth.errors + 1
419
+ }
420
+ })
421
+ }
422
+
423
+ // Clear all recent activity
424
+ async clearActivity() {
425
+ this.setState({
426
+ recentConnections: [],
427
+ recentMessages: [],
428
+ systemHealth: {
429
+ ...this.state.systemHealth,
430
+ errors: 0,
431
+ warnings: 0
432
+ }
433
+ })
434
+
435
+ // Reset counters
436
+ this.messageCount = 0
437
+ this.lastMessageTime = Date.now()
438
+ this.responseTimes = []
439
+
440
+ this.emit('ACTIVITY_CLEARED', {
441
+ timestamp: Date.now()
442
+ })
443
+
444
+ console.log('๐Ÿงน SystemMonitor: Activity cleared')
445
+ }
446
+
447
+ // Get detailed system info
448
+ async getSystemInfo() {
449
+ const info = {
450
+ nodeVersion: process.version,
451
+ platform: process.platform,
452
+ arch: process.arch,
453
+ uptime: process.uptime(),
454
+ pid: process.pid,
455
+ execPath: process.execPath,
456
+ cwd: process.cwd(),
457
+ timestamp: Date.now()
458
+ }
459
+
460
+ this.emit('SYSTEM_INFO_REQUESTED', info)
461
+
462
+ return info
463
+ }
464
+
465
+ // Force metrics refresh
466
+ async refreshMetrics() {
467
+ await this.collectMetrics()
468
+
469
+ this.emit('METRICS_REFRESHED', {
470
+ timestamp: Date.now()
471
+ })
472
+
473
+ console.log('๐Ÿ”„ SystemMonitor: Metrics refreshed manually')
474
+ }
475
+
476
+ // Emergency stop - stops everything immediately
477
+ async emergencyStop() {
478
+ console.log('๐Ÿšจ SystemMonitor: EMERGENCY STOP activated')
479
+
480
+ // Stop all timers
481
+ this.isActive = false
482
+
483
+ if (this.refreshTimer) {
484
+ clearInterval(this.refreshTimer)
485
+ this.refreshTimer = null
486
+ }
487
+ if (this.pushTimer) {
488
+ clearInterval(this.pushTimer)
489
+ this.pushTimer = null
490
+ }
491
+
492
+ // Update state
493
+ this.setState({
494
+ autoRefresh: false
495
+ })
496
+
497
+ this.emit('EMERGENCY_STOP', {
498
+ timestamp: Date.now(),
499
+ reason: 'Manual emergency stop'
500
+ })
501
+
502
+ console.log('๐Ÿ›‘ SystemMonitor: All activities stopped via emergency stop')
503
+ }
504
+
505
+ // Push automatic updates to frontend
506
+ private pushUpdate(data: any) {
507
+ if (!this.isActive) {
508
+ return // Stop all push updates if component is not active
509
+ }
510
+
511
+ try {
512
+ // Force state synchronization to frontend
513
+ this.emit('AUTO_UPDATE', data)
514
+
515
+ // Also trigger a state change notification
516
+ this.sendStateUpdate()
517
+
518
+ console.log('๐Ÿ“ก SystemMonitor: Pushed automatic update to frontend', {
519
+ type: data.type,
520
+ timestamp: data.timestamp,
521
+ connections: data.metrics?.connections || 0
522
+ })
523
+
524
+ } catch (error: any) {
525
+ console.warn('โš ๏ธ SystemMonitor: Failed to push update to frontend:', error.message)
526
+ }
527
+ }
528
+
529
+ // Send state update to all connected clients
530
+ private sendStateUpdate() {
531
+ try {
532
+ // This will trigger the useHybridLiveComponent hook to update
533
+ const stateUpdate = {
534
+ componentId: this.id,
535
+ state: this.state,
536
+ timestamp: Date.now(),
537
+ version: this.version || 1
538
+ }
539
+
540
+ // Emit state change to trigger frontend update
541
+ this.emit('STATE_CHANGED', stateUpdate)
542
+
543
+ } catch (error: any) {
544
+ console.warn('โš ๏ธ SystemMonitor: Failed to send state update:', error.message)
545
+ }
546
+ }
547
+
548
+ // Enhanced metrics collection with automatic frontend push
549
+ async collectMetricsWithPush() {
550
+ await this.collectMetrics()
551
+
552
+ // Additional push with real-time data
553
+ this.pushUpdate({
554
+ type: 'REAL_TIME_METRICS',
555
+ timestamp: Date.now(),
556
+ realTimeData: {
557
+ uptime: Math.round((Date.now() - this.startTime) / 1000),
558
+ lastUpdated: this.state.lastUpdated,
559
+ autoRefreshActive: this.state.autoRefresh,
560
+ recentActivityCount: this.state.recentMessages.length + this.state.recentConnections.length
561
+ }
562
+ })
563
+ }
564
+
565
+ // Stop all activities (method to be called externally)
566
+ async stopAllActivities() {
567
+ this.isActive = false
568
+
569
+ if (this.refreshTimer) {
570
+ clearInterval(this.refreshTimer)
571
+ this.refreshTimer = null
572
+ }
573
+ if (this.pushTimer) {
574
+ clearInterval(this.pushTimer)
575
+ this.pushTimer = null
576
+ }
577
+
578
+ console.log('๐Ÿ›‘ SystemMonitor: All activities stopped')
579
+ }
580
+
581
+ // Cleanup on destroy
582
+ destroy() {
583
+ this.isActive = false
584
+
585
+ if (this.refreshTimer) {
586
+ clearInterval(this.refreshTimer)
587
+ }
588
+ if (this.pushTimer) {
589
+ clearInterval(this.pushTimer)
590
+ }
591
+ super.destroy()
592
+ console.log('๐Ÿ’ฅ SystemMonitor: Destroyed and cleanup completed')
593
+ }
594
+ }