@spfn/monitor 0.1.0-beta.1

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.
@@ -0,0 +1,620 @@
1
+ import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
2
+ import * as _spfn_core_route from '@spfn/core/route';
3
+ import * as _sinclair_typebox from '@sinclair/typebox';
4
+
5
+ /**
6
+ * @spfn/monitor - Error Groups Entity
7
+ *
8
+ * Groups errors by fingerprint (name + message + path) to avoid
9
+ * duplicate tracking. Tracks count, status, and first/last seen times.
10
+ */
11
+ /**
12
+ * Error group status types
13
+ */
14
+ declare const ERROR_GROUP_STATUSES: readonly ["active", "resolved", "ignored"];
15
+ type ErrorGroupStatus = typeof ERROR_GROUP_STATUSES[number];
16
+ /**
17
+ * Error groups table — groups errors by fingerprint
18
+ */
19
+ declare const errorGroups: drizzle_orm_pg_core.PgTableWithColumns<{
20
+ name: "error_groups";
21
+ schema: string;
22
+ columns: {
23
+ createdAt: drizzle_orm_pg_core.PgColumn<{
24
+ name: "created_at";
25
+ tableName: "error_groups";
26
+ dataType: "date";
27
+ columnType: "PgTimestamp";
28
+ data: Date;
29
+ driverParam: string;
30
+ notNull: true;
31
+ hasDefault: true;
32
+ isPrimaryKey: false;
33
+ isAutoincrement: false;
34
+ hasRuntimeDefault: false;
35
+ enumValues: undefined;
36
+ baseColumn: never;
37
+ identity: undefined;
38
+ generated: undefined;
39
+ }, {}, {}>;
40
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
41
+ name: "updated_at";
42
+ tableName: "error_groups";
43
+ dataType: "date";
44
+ columnType: "PgTimestamp";
45
+ data: Date;
46
+ driverParam: string;
47
+ notNull: true;
48
+ hasDefault: true;
49
+ isPrimaryKey: false;
50
+ isAutoincrement: false;
51
+ hasRuntimeDefault: false;
52
+ enumValues: undefined;
53
+ baseColumn: never;
54
+ identity: undefined;
55
+ generated: undefined;
56
+ }, {}, {}>;
57
+ id: drizzle_orm_pg_core.PgColumn<{
58
+ name: "id";
59
+ tableName: "error_groups";
60
+ dataType: "number";
61
+ columnType: "PgBigSerial53";
62
+ data: number;
63
+ driverParam: number;
64
+ notNull: true;
65
+ hasDefault: true;
66
+ isPrimaryKey: true;
67
+ isAutoincrement: false;
68
+ hasRuntimeDefault: false;
69
+ enumValues: undefined;
70
+ baseColumn: never;
71
+ identity: undefined;
72
+ generated: undefined;
73
+ }, {}, {}>;
74
+ fingerprint: drizzle_orm_pg_core.PgColumn<{
75
+ name: "fingerprint";
76
+ tableName: "error_groups";
77
+ dataType: "string";
78
+ columnType: "PgText";
79
+ data: string;
80
+ driverParam: string;
81
+ notNull: true;
82
+ hasDefault: false;
83
+ isPrimaryKey: false;
84
+ isAutoincrement: false;
85
+ hasRuntimeDefault: false;
86
+ enumValues: [string, ...string[]];
87
+ baseColumn: never;
88
+ identity: undefined;
89
+ generated: undefined;
90
+ }, {}, {}>;
91
+ name: drizzle_orm_pg_core.PgColumn<{
92
+ name: "name";
93
+ tableName: "error_groups";
94
+ dataType: "string";
95
+ columnType: "PgText";
96
+ data: string;
97
+ driverParam: string;
98
+ notNull: true;
99
+ hasDefault: false;
100
+ isPrimaryKey: false;
101
+ isAutoincrement: false;
102
+ hasRuntimeDefault: false;
103
+ enumValues: [string, ...string[]];
104
+ baseColumn: never;
105
+ identity: undefined;
106
+ generated: undefined;
107
+ }, {}, {}>;
108
+ message: drizzle_orm_pg_core.PgColumn<{
109
+ name: "message";
110
+ tableName: "error_groups";
111
+ dataType: "string";
112
+ columnType: "PgText";
113
+ data: string;
114
+ driverParam: string;
115
+ notNull: true;
116
+ hasDefault: false;
117
+ isPrimaryKey: false;
118
+ isAutoincrement: false;
119
+ hasRuntimeDefault: false;
120
+ enumValues: [string, ...string[]];
121
+ baseColumn: never;
122
+ identity: undefined;
123
+ generated: undefined;
124
+ }, {}, {}>;
125
+ path: drizzle_orm_pg_core.PgColumn<{
126
+ name: "path";
127
+ tableName: "error_groups";
128
+ dataType: "string";
129
+ columnType: "PgText";
130
+ data: string;
131
+ driverParam: string;
132
+ notNull: true;
133
+ hasDefault: false;
134
+ isPrimaryKey: false;
135
+ isAutoincrement: false;
136
+ hasRuntimeDefault: false;
137
+ enumValues: [string, ...string[]];
138
+ baseColumn: never;
139
+ identity: undefined;
140
+ generated: undefined;
141
+ }, {}, {}>;
142
+ method: drizzle_orm_pg_core.PgColumn<{
143
+ name: "method";
144
+ tableName: "error_groups";
145
+ dataType: "string";
146
+ columnType: "PgText";
147
+ data: string;
148
+ driverParam: string;
149
+ notNull: true;
150
+ hasDefault: false;
151
+ isPrimaryKey: false;
152
+ isAutoincrement: false;
153
+ hasRuntimeDefault: false;
154
+ enumValues: [string, ...string[]];
155
+ baseColumn: never;
156
+ identity: undefined;
157
+ generated: undefined;
158
+ }, {}, {}>;
159
+ statusCode: drizzle_orm_pg_core.PgColumn<{
160
+ name: "status_code";
161
+ tableName: "error_groups";
162
+ dataType: "number";
163
+ columnType: "PgInteger";
164
+ data: number;
165
+ driverParam: string | number;
166
+ notNull: true;
167
+ hasDefault: false;
168
+ isPrimaryKey: false;
169
+ isAutoincrement: false;
170
+ hasRuntimeDefault: false;
171
+ enumValues: undefined;
172
+ baseColumn: never;
173
+ identity: undefined;
174
+ generated: undefined;
175
+ }, {}, {}>;
176
+ status: drizzle_orm_pg_core.PgColumn<{
177
+ name: string;
178
+ tableName: "error_groups";
179
+ dataType: "string";
180
+ columnType: "PgText";
181
+ data: "active" | "resolved" | "ignored";
182
+ driverParam: string;
183
+ notNull: true;
184
+ hasDefault: true;
185
+ isPrimaryKey: false;
186
+ isAutoincrement: false;
187
+ hasRuntimeDefault: false;
188
+ enumValues: ["active", "resolved", "ignored"] & [string, ...string[]];
189
+ baseColumn: never;
190
+ identity: undefined;
191
+ generated: undefined;
192
+ }, {}, {}>;
193
+ count: drizzle_orm_pg_core.PgColumn<{
194
+ name: "count";
195
+ tableName: "error_groups";
196
+ dataType: "number";
197
+ columnType: "PgInteger";
198
+ data: number;
199
+ driverParam: string | number;
200
+ notNull: true;
201
+ hasDefault: true;
202
+ isPrimaryKey: false;
203
+ isAutoincrement: false;
204
+ hasRuntimeDefault: false;
205
+ enumValues: undefined;
206
+ baseColumn: never;
207
+ identity: undefined;
208
+ generated: undefined;
209
+ }, {}, {}>;
210
+ firstSeenAt: drizzle_orm_pg_core.PgColumn<{
211
+ name: string;
212
+ tableName: "error_groups";
213
+ dataType: "date";
214
+ columnType: "PgTimestamp";
215
+ data: Date;
216
+ driverParam: string;
217
+ notNull: true;
218
+ hasDefault: false;
219
+ isPrimaryKey: false;
220
+ isAutoincrement: false;
221
+ hasRuntimeDefault: false;
222
+ enumValues: undefined;
223
+ baseColumn: never;
224
+ identity: undefined;
225
+ generated: undefined;
226
+ }, {}, {}>;
227
+ lastSeenAt: drizzle_orm_pg_core.PgColumn<{
228
+ name: string;
229
+ tableName: "error_groups";
230
+ dataType: "date";
231
+ columnType: "PgTimestamp";
232
+ data: Date;
233
+ driverParam: string;
234
+ notNull: true;
235
+ hasDefault: false;
236
+ isPrimaryKey: false;
237
+ isAutoincrement: false;
238
+ hasRuntimeDefault: false;
239
+ enumValues: undefined;
240
+ baseColumn: never;
241
+ identity: undefined;
242
+ generated: undefined;
243
+ }, {}, {}>;
244
+ resolvedAt: drizzle_orm_pg_core.PgColumn<{
245
+ name: string;
246
+ tableName: "error_groups";
247
+ dataType: "date";
248
+ columnType: "PgTimestamp";
249
+ data: Date;
250
+ driverParam: string;
251
+ notNull: false;
252
+ hasDefault: false;
253
+ isPrimaryKey: false;
254
+ isAutoincrement: false;
255
+ hasRuntimeDefault: false;
256
+ enumValues: undefined;
257
+ baseColumn: never;
258
+ identity: undefined;
259
+ generated: undefined;
260
+ }, {}, {}>;
261
+ };
262
+ dialect: "pg";
263
+ }>;
264
+ type ErrorGroup = typeof errorGroups.$inferSelect;
265
+ type NewErrorGroup = typeof errorGroups.$inferInsert;
266
+
267
+ /**
268
+ * @spfn/monitor - Logs Entity
269
+ *
270
+ * Developer logs stored in DB for retrieval via admin dashboard.
271
+ * Supports level-based filtering, source tracking, and metadata.
272
+ */
273
+ /**
274
+ * Log level types
275
+ */
276
+ declare const LOG_LEVELS: readonly ["debug", "info", "warn", "error", "fatal"];
277
+ type LogLevel = typeof LOG_LEVELS[number];
278
+ /**
279
+ * Logs table — developer log entries
280
+ */
281
+ declare const logs: drizzle_orm_pg_core.PgTableWithColumns<{
282
+ name: "logs";
283
+ schema: string;
284
+ columns: {
285
+ createdAt: drizzle_orm_pg_core.PgColumn<{
286
+ name: "created_at";
287
+ tableName: "logs";
288
+ dataType: "date";
289
+ columnType: "PgTimestamp";
290
+ data: Date;
291
+ driverParam: string;
292
+ notNull: true;
293
+ hasDefault: true;
294
+ isPrimaryKey: false;
295
+ isAutoincrement: false;
296
+ hasRuntimeDefault: false;
297
+ enumValues: undefined;
298
+ baseColumn: never;
299
+ identity: undefined;
300
+ generated: undefined;
301
+ }, {}, {}>;
302
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
303
+ name: "updated_at";
304
+ tableName: "logs";
305
+ dataType: "date";
306
+ columnType: "PgTimestamp";
307
+ data: Date;
308
+ driverParam: string;
309
+ notNull: true;
310
+ hasDefault: true;
311
+ isPrimaryKey: false;
312
+ isAutoincrement: false;
313
+ hasRuntimeDefault: false;
314
+ enumValues: undefined;
315
+ baseColumn: never;
316
+ identity: undefined;
317
+ generated: undefined;
318
+ }, {}, {}>;
319
+ id: drizzle_orm_pg_core.PgColumn<{
320
+ name: "id";
321
+ tableName: "logs";
322
+ dataType: "number";
323
+ columnType: "PgBigSerial53";
324
+ data: number;
325
+ driverParam: number;
326
+ notNull: true;
327
+ hasDefault: true;
328
+ isPrimaryKey: true;
329
+ isAutoincrement: false;
330
+ hasRuntimeDefault: false;
331
+ enumValues: undefined;
332
+ baseColumn: never;
333
+ identity: undefined;
334
+ generated: undefined;
335
+ }, {}, {}>;
336
+ level: drizzle_orm_pg_core.PgColumn<{
337
+ name: string;
338
+ tableName: "logs";
339
+ dataType: "string";
340
+ columnType: "PgText";
341
+ data: "debug" | "info" | "warn" | "error" | "fatal";
342
+ driverParam: string;
343
+ notNull: true;
344
+ hasDefault: false;
345
+ isPrimaryKey: false;
346
+ isAutoincrement: false;
347
+ hasRuntimeDefault: false;
348
+ enumValues: ["debug", "info", "warn", "error", "fatal"] & [string, ...string[]];
349
+ baseColumn: never;
350
+ identity: undefined;
351
+ generated: undefined;
352
+ }, {}, {}>;
353
+ message: drizzle_orm_pg_core.PgColumn<{
354
+ name: "message";
355
+ tableName: "logs";
356
+ dataType: "string";
357
+ columnType: "PgText";
358
+ data: string;
359
+ driverParam: string;
360
+ notNull: true;
361
+ hasDefault: false;
362
+ isPrimaryKey: false;
363
+ isAutoincrement: false;
364
+ hasRuntimeDefault: false;
365
+ enumValues: [string, ...string[]];
366
+ baseColumn: never;
367
+ identity: undefined;
368
+ generated: undefined;
369
+ }, {}, {}>;
370
+ source: drizzle_orm_pg_core.PgColumn<{
371
+ name: "source";
372
+ tableName: "logs";
373
+ dataType: "string";
374
+ columnType: "PgText";
375
+ data: string;
376
+ driverParam: string;
377
+ notNull: false;
378
+ hasDefault: false;
379
+ isPrimaryKey: false;
380
+ isAutoincrement: false;
381
+ hasRuntimeDefault: false;
382
+ enumValues: [string, ...string[]];
383
+ baseColumn: never;
384
+ identity: undefined;
385
+ generated: undefined;
386
+ }, {}, {}>;
387
+ requestId: drizzle_orm_pg_core.PgColumn<{
388
+ name: "request_id";
389
+ tableName: "logs";
390
+ dataType: "string";
391
+ columnType: "PgText";
392
+ data: string;
393
+ driverParam: string;
394
+ notNull: false;
395
+ hasDefault: false;
396
+ isPrimaryKey: false;
397
+ isAutoincrement: false;
398
+ hasRuntimeDefault: false;
399
+ enumValues: [string, ...string[]];
400
+ baseColumn: never;
401
+ identity: undefined;
402
+ generated: undefined;
403
+ }, {}, {}>;
404
+ userId: drizzle_orm_pg_core.PgColumn<{
405
+ name: "user_id";
406
+ tableName: "logs";
407
+ dataType: "string";
408
+ columnType: "PgText";
409
+ data: string;
410
+ driverParam: string;
411
+ notNull: false;
412
+ hasDefault: false;
413
+ isPrimaryKey: false;
414
+ isAutoincrement: false;
415
+ hasRuntimeDefault: false;
416
+ enumValues: [string, ...string[]];
417
+ baseColumn: never;
418
+ identity: undefined;
419
+ generated: undefined;
420
+ }, {}, {}>;
421
+ metadata: drizzle_orm_pg_core.PgColumn<{
422
+ name: "metadata";
423
+ tableName: "logs";
424
+ dataType: "json";
425
+ columnType: "PgJsonb";
426
+ data: Record<string, unknown>;
427
+ driverParam: unknown;
428
+ notNull: false;
429
+ hasDefault: false;
430
+ isPrimaryKey: false;
431
+ isAutoincrement: false;
432
+ hasRuntimeDefault: false;
433
+ enumValues: undefined;
434
+ baseColumn: never;
435
+ identity: undefined;
436
+ generated: undefined;
437
+ }, {}, {
438
+ $type: Record<string, unknown>;
439
+ }>;
440
+ };
441
+ dialect: "pg";
442
+ }>;
443
+ type Log = typeof logs.$inferSelect;
444
+ type NewLog = typeof logs.$inferInsert;
445
+
446
+ /**
447
+ * @spfn/monitor - Stats Service
448
+ *
449
+ * Dashboard statistics aggregation
450
+ */
451
+
452
+ interface MonitorStats {
453
+ errors: {
454
+ total: number;
455
+ active: number;
456
+ resolved: number;
457
+ ignored: number;
458
+ };
459
+ recentErrors: ErrorGroup[];
460
+ logs: {
461
+ total: number;
462
+ byLevel: Record<LogLevel, number>;
463
+ };
464
+ trends: {
465
+ errorsLast24h: number;
466
+ errorsLast7d: number;
467
+ logsLast24h: number;
468
+ };
469
+ }
470
+ /**
471
+ * Get aggregated monitor statistics for dashboard
472
+ */
473
+ declare function getMonitorStats(): Promise<MonitorStats>;
474
+
475
+ /**
476
+ * @spfn/monitor - Main Router
477
+ *
478
+ * Combines all monitor-related routes into a single router
479
+ */
480
+ /**
481
+ * Monitor router
482
+ *
483
+ * Routes:
484
+ * - Errors: /_monitor/admin/errors (list, detail, status update, events)
485
+ * - Logs: /_monitor/admin/logs
486
+ * - Stats: /_monitor/admin/stats
487
+ */
488
+ declare const monitorRouter: _spfn_core_route.Router<{
489
+ listErrors: _spfn_core_route.RouteDef<{
490
+ query: _sinclair_typebox.TObject<{
491
+ status: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
492
+ path: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
493
+ search: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
494
+ dateFrom: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
495
+ dateTo: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
496
+ limit: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
497
+ offset: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
498
+ }>;
499
+ }, {}, {
500
+ status: "active" | "resolved" | "ignored";
501
+ path: string;
502
+ id: number;
503
+ fingerprint: string;
504
+ name: string;
505
+ message: string;
506
+ method: string;
507
+ statusCode: number;
508
+ count: number;
509
+ firstSeenAt: Date;
510
+ lastSeenAt: Date;
511
+ resolvedAt: Date | null;
512
+ createdAt: Date;
513
+ updatedAt: Date;
514
+ }[]>;
515
+ getErrorDetail: _spfn_core_route.RouteDef<{
516
+ params: _sinclair_typebox.TObject<{
517
+ id: _sinclair_typebox.TNumber;
518
+ }>;
519
+ }, {}, {
520
+ group: {
521
+ status: "active" | "resolved" | "ignored";
522
+ path: string;
523
+ id: number;
524
+ fingerprint: string;
525
+ name: string;
526
+ message: string;
527
+ method: string;
528
+ statusCode: number;
529
+ count: number;
530
+ firstSeenAt: Date;
531
+ lastSeenAt: Date;
532
+ resolvedAt: Date | null;
533
+ createdAt: Date;
534
+ updatedAt: Date;
535
+ };
536
+ events: {
537
+ query: Record<string, string> | null;
538
+ id: number;
539
+ statusCode: number;
540
+ createdAt: Date;
541
+ updatedAt: Date;
542
+ headers: Record<string, string> | null;
543
+ groupId: number;
544
+ requestId: string | null;
545
+ userId: string | null;
546
+ stackTrace: string | null;
547
+ metadata: Record<string, unknown> | null;
548
+ }[];
549
+ }>;
550
+ updateErrorStatus: _spfn_core_route.RouteDef<{
551
+ params: _sinclair_typebox.TObject<{
552
+ id: _sinclair_typebox.TNumber;
553
+ }>;
554
+ body: _sinclair_typebox.TObject<{
555
+ status: _sinclair_typebox.TString;
556
+ }>;
557
+ }, {}, {
558
+ status: "active" | "resolved" | "ignored";
559
+ path: string;
560
+ id: number;
561
+ fingerprint: string;
562
+ name: string;
563
+ message: string;
564
+ method: string;
565
+ statusCode: number;
566
+ count: number;
567
+ firstSeenAt: Date;
568
+ lastSeenAt: Date;
569
+ resolvedAt: Date | null;
570
+ createdAt: Date;
571
+ updatedAt: Date;
572
+ }>;
573
+ listErrorEvents: _spfn_core_route.RouteDef<{
574
+ params: _sinclair_typebox.TObject<{
575
+ id: _sinclair_typebox.TNumber;
576
+ }>;
577
+ query: _sinclair_typebox.TObject<{
578
+ limit: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
579
+ offset: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
580
+ }>;
581
+ }, {}, {
582
+ query: Record<string, string> | null;
583
+ id: number;
584
+ statusCode: number;
585
+ createdAt: Date;
586
+ updatedAt: Date;
587
+ headers: Record<string, string> | null;
588
+ groupId: number;
589
+ requestId: string | null;
590
+ userId: string | null;
591
+ stackTrace: string | null;
592
+ metadata: Record<string, unknown> | null;
593
+ }[]>;
594
+ listLogs: _spfn_core_route.RouteDef<{
595
+ query: _sinclair_typebox.TObject<{
596
+ level: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
597
+ source: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
598
+ search: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
599
+ requestId: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
600
+ userId: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
601
+ dateFrom: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
602
+ dateTo: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
603
+ limit: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
604
+ offset: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
605
+ }>;
606
+ }, {}, {
607
+ id: number;
608
+ message: string;
609
+ createdAt: Date;
610
+ updatedAt: Date;
611
+ requestId: string | null;
612
+ userId: string | null;
613
+ metadata: Record<string, unknown> | null;
614
+ level: "debug" | "info" | "warn" | "error" | "fatal";
615
+ source: string | null;
616
+ }[]>;
617
+ getStats: _spfn_core_route.RouteDef<{}, {}, MonitorStats>;
618
+ }>;
619
+
620
+ export { type ErrorGroupStatus as E, type LogLevel as L, type MonitorStats as M, type NewErrorGroup as N, ERROR_GROUP_STATUSES as a, LOG_LEVELS as b, type ErrorGroup as c, type NewLog as d, type Log as e, errorGroups as f, getMonitorStats as g, logs as l, monitorRouter as m };