hazo_logs 1.0.0 → 1.0.2
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 +498 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/config_loader.d.ts.map +1 -1
- package/dist/lib/config_loader.js +13 -4
- package/dist/lib/config_loader.js.map +1 -1
- package/dist/lib/hazo_logger.d.ts +5 -0
- package/dist/lib/hazo_logger.d.ts.map +1 -1
- package/dist/lib/hazo_logger.js +15 -0
- package/dist/lib/hazo_logger.js.map +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/types.d.ts +6 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/tailwind.d.ts +61 -0
- package/dist/tailwind.d.ts.map +1 -0
- package/dist/tailwind.js +106 -0
- package/dist/tailwind.js.map +1 -0
- package/dist/ui/api/log-api-handler.d.ts +2 -2
- package/dist/ui/api/log-api-handler.d.ts.map +1 -1
- package/dist/ui/api/log-api-handler.js +49 -2
- package/dist/ui/api/log-api-handler.js.map +1 -1
- package/dist/ui/client-logger.d.ts +54 -0
- package/dist/ui/client-logger.d.ts.map +1 -0
- package/dist/ui/client-logger.js +126 -0
- package/dist/ui/client-logger.js.map +1 -0
- package/dist/ui/components/LogTable.d.ts.map +1 -1
- package/dist/ui/components/LogTable.js +1 -1
- package/dist/ui/components/LogTable.js.map +1 -1
- package/dist/ui/components/LogTimeline.d.ts.map +1 -1
- package/dist/ui/components/LogTimeline.js +9 -1
- package/dist/ui/components/LogTimeline.js.map +1 -1
- package/dist/ui/index.d.ts +3 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +2 -0
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/middleware/with-log-auth.d.ts.map +1 -1
- package/dist/ui/middleware/with-log-auth.js +15 -13
- package/dist/ui/middleware/with-log-auth.js.map +1 -1
- package/dist/ui/types.d.ts +7 -0
- package/dist/ui/types.d.ts.map +1 -1
- package/package.json +6 -2
package/dist/lib/types.d.ts
CHANGED
|
@@ -9,6 +9,10 @@ export type LogLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
|
9
9
|
* Additional data that can be attached to log entries
|
|
10
10
|
*/
|
|
11
11
|
export type LogData = Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Log source - where the log originated from
|
|
14
|
+
*/
|
|
15
|
+
export type LogSource = 'server' | 'client';
|
|
12
16
|
/**
|
|
13
17
|
* Log entry structure written to JSON files
|
|
14
18
|
*/
|
|
@@ -24,6 +28,8 @@ export interface LogEntry {
|
|
|
24
28
|
reference?: string;
|
|
25
29
|
depth?: number;
|
|
26
30
|
data?: LogData;
|
|
31
|
+
/** Source of the log entry (server or client) */
|
|
32
|
+
source?: LogSource;
|
|
27
33
|
}
|
|
28
34
|
/**
|
|
29
35
|
* Logger interface - the public API for logging
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iDAAiD;IACjD,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,QAAQ,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IAErB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailwind CSS configuration helpers for hazo_logs
|
|
3
|
+
*
|
|
4
|
+
* Consumers using the hazo_logs UI components need to:
|
|
5
|
+
* 1. Add the content path to their tailwind.config.ts
|
|
6
|
+
* 2. Add the safelist classes to prevent purging of dynamic classes
|
|
7
|
+
*
|
|
8
|
+
* Usage in consumer's tailwind.config.ts:
|
|
9
|
+
*
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { tailwindSafelist, tailwindContentPath } from 'hazo_logs/tailwind';
|
|
12
|
+
*
|
|
13
|
+
* export default {
|
|
14
|
+
* content: [
|
|
15
|
+
* './src/**\/*.{js,ts,jsx,tsx}',
|
|
16
|
+
* tailwindContentPath,
|
|
17
|
+
* ],
|
|
18
|
+
* safelist: tailwindSafelist,
|
|
19
|
+
* // ... rest of config
|
|
20
|
+
* };
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Content path for Tailwind to scan hazo_logs UI components
|
|
25
|
+
* Add this to your tailwind.config.ts content array
|
|
26
|
+
*/
|
|
27
|
+
export declare const tailwindContentPath = "./node_modules/hazo_logs/dist/**/*.{js,jsx}";
|
|
28
|
+
/**
|
|
29
|
+
* Safelist of dynamic Tailwind classes used by hazo_logs UI components
|
|
30
|
+
* These classes are constructed dynamically and would otherwise be purged
|
|
31
|
+
*/
|
|
32
|
+
export declare const tailwindSafelist: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Tailwind preset for hazo_logs
|
|
35
|
+
* Alternative to manually adding safelist - use as a preset
|
|
36
|
+
*
|
|
37
|
+
* Usage:
|
|
38
|
+
* ```typescript
|
|
39
|
+
* import { hazoLogsPreset } from 'hazo_logs/tailwind';
|
|
40
|
+
*
|
|
41
|
+
* export default {
|
|
42
|
+
* presets: [hazoLogsPreset],
|
|
43
|
+
* content: [
|
|
44
|
+
* './src/**\/*.{js,ts,jsx,tsx}',
|
|
45
|
+
* './node_modules/hazo_logs/dist/**\/*.{js,jsx}',
|
|
46
|
+
* ],
|
|
47
|
+
* };
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare const hazoLogsPreset: {
|
|
51
|
+
safelist: string[];
|
|
52
|
+
};
|
|
53
|
+
declare const _default: {
|
|
54
|
+
tailwindSafelist: string[];
|
|
55
|
+
tailwindContentPath: string;
|
|
56
|
+
hazoLogsPreset: {
|
|
57
|
+
safelist: string[];
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
export default _default;
|
|
61
|
+
//# sourceMappingURL=tailwind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind.d.ts","sourceRoot":"","sources":["../src/tailwind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,gDAAgD,CAAC;AAEjF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAuDpC,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc;;CAE1B,CAAC;;;;;;;;AAEF,wBAIE"}
|
package/dist/tailwind.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailwind CSS configuration helpers for hazo_logs
|
|
3
|
+
*
|
|
4
|
+
* Consumers using the hazo_logs UI components need to:
|
|
5
|
+
* 1. Add the content path to their tailwind.config.ts
|
|
6
|
+
* 2. Add the safelist classes to prevent purging of dynamic classes
|
|
7
|
+
*
|
|
8
|
+
* Usage in consumer's tailwind.config.ts:
|
|
9
|
+
*
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { tailwindSafelist, tailwindContentPath } from 'hazo_logs/tailwind';
|
|
12
|
+
*
|
|
13
|
+
* export default {
|
|
14
|
+
* content: [
|
|
15
|
+
* './src/**\/*.{js,ts,jsx,tsx}',
|
|
16
|
+
* tailwindContentPath,
|
|
17
|
+
* ],
|
|
18
|
+
* safelist: tailwindSafelist,
|
|
19
|
+
* // ... rest of config
|
|
20
|
+
* };
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Content path for Tailwind to scan hazo_logs UI components
|
|
25
|
+
* Add this to your tailwind.config.ts content array
|
|
26
|
+
*/
|
|
27
|
+
export const tailwindContentPath = './node_modules/hazo_logs/dist/**/*.{js,jsx}';
|
|
28
|
+
/**
|
|
29
|
+
* Safelist of dynamic Tailwind classes used by hazo_logs UI components
|
|
30
|
+
* These classes are constructed dynamically and would otherwise be purged
|
|
31
|
+
*/
|
|
32
|
+
export const tailwindSafelist = [
|
|
33
|
+
// LogLevelBadge - level-specific colors
|
|
34
|
+
'bg-red-100',
|
|
35
|
+
'text-red-700',
|
|
36
|
+
'border-red-200',
|
|
37
|
+
'bg-yellow-100',
|
|
38
|
+
'text-yellow-700',
|
|
39
|
+
'border-yellow-200',
|
|
40
|
+
'bg-blue-100',
|
|
41
|
+
'text-blue-700',
|
|
42
|
+
'border-blue-200',
|
|
43
|
+
'bg-gray-100',
|
|
44
|
+
'text-gray-600',
|
|
45
|
+
'border-gray-200',
|
|
46
|
+
// LogTimeline - dot colors for log levels
|
|
47
|
+
'bg-red-500',
|
|
48
|
+
'bg-yellow-500',
|
|
49
|
+
'bg-blue-500',
|
|
50
|
+
'bg-gray-400',
|
|
51
|
+
// LogTimeline - client log ring indicator
|
|
52
|
+
'ring-2',
|
|
53
|
+
'ring-purple-400',
|
|
54
|
+
'ring-offset-1',
|
|
55
|
+
// LogTable & LogTimeline - source badges (client/server)
|
|
56
|
+
'bg-purple-100',
|
|
57
|
+
'text-purple-800',
|
|
58
|
+
'bg-purple-50',
|
|
59
|
+
'bg-purple-50/50',
|
|
60
|
+
'text-purple-700',
|
|
61
|
+
'border-purple-200',
|
|
62
|
+
// LogTimeline - package grouping
|
|
63
|
+
'bg-purple-500',
|
|
64
|
+
'text-purple-600',
|
|
65
|
+
'bg-purple-200',
|
|
66
|
+
// Context badges
|
|
67
|
+
'bg-blue-50',
|
|
68
|
+
'bg-green-50',
|
|
69
|
+
'text-green-700',
|
|
70
|
+
'border-green-200',
|
|
71
|
+
'text-green-600',
|
|
72
|
+
'text-blue-600',
|
|
73
|
+
// LogViewerPage - active filter badges
|
|
74
|
+
'bg-blue-100',
|
|
75
|
+
'text-blue-800',
|
|
76
|
+
// Tab navigation states
|
|
77
|
+
'border-blue-500',
|
|
78
|
+
'text-blue-600',
|
|
79
|
+
'border-transparent',
|
|
80
|
+
];
|
|
81
|
+
/**
|
|
82
|
+
* Tailwind preset for hazo_logs
|
|
83
|
+
* Alternative to manually adding safelist - use as a preset
|
|
84
|
+
*
|
|
85
|
+
* Usage:
|
|
86
|
+
* ```typescript
|
|
87
|
+
* import { hazoLogsPreset } from 'hazo_logs/tailwind';
|
|
88
|
+
*
|
|
89
|
+
* export default {
|
|
90
|
+
* presets: [hazoLogsPreset],
|
|
91
|
+
* content: [
|
|
92
|
+
* './src/**\/*.{js,ts,jsx,tsx}',
|
|
93
|
+
* './node_modules/hazo_logs/dist/**\/*.{js,jsx}',
|
|
94
|
+
* ],
|
|
95
|
+
* };
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export const hazoLogsPreset = {
|
|
99
|
+
safelist: tailwindSafelist,
|
|
100
|
+
};
|
|
101
|
+
export default {
|
|
102
|
+
tailwindSafelist,
|
|
103
|
+
tailwindContentPath,
|
|
104
|
+
hazoLogsPreset,
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=tailwind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind.js","sourceRoot":"","sources":["../src/tailwind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,6CAA6C,CAAC;AAEjF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAa;IACxC,wCAAwC;IACxC,YAAY;IACZ,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,iBAAiB;IACjB,mBAAmB;IACnB,aAAa;IACb,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,eAAe;IACf,iBAAiB;IAEjB,0CAA0C;IAC1C,YAAY;IACZ,eAAe;IACf,aAAa;IACb,aAAa;IAEb,0CAA0C;IAC1C,QAAQ;IACR,iBAAiB;IACjB,eAAe;IAEf,yDAAyD;IACzD,eAAe;IACf,iBAAiB;IACjB,cAAc;IACd,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;IAEnB,iCAAiC;IACjC,eAAe;IACf,iBAAiB;IACjB,eAAe;IAEf,iBAAiB;IACjB,YAAY;IACZ,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;IAEf,uCAAuC;IACvC,aAAa;IACb,eAAe;IAEf,wBAAwB;IACxB,iBAAiB;IACjB,eAAe;IACf,oBAAoB;CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,gBAAgB;CAC3B,CAAC;AAEF,eAAe;IACb,gBAAgB;IAChB,mBAAmB;IACnB,cAAc;CACf,CAAC"}
|
|
@@ -6,7 +6,7 @@ import type { LogApiConfig, LogApiHandler } from '../types.js';
|
|
|
6
6
|
* Create a Next.js API route handler for log queries
|
|
7
7
|
*
|
|
8
8
|
* @param config - Optional configuration
|
|
9
|
-
* @returns Handler object with GET
|
|
9
|
+
* @returns Handler object with GET and POST methods
|
|
10
10
|
*
|
|
11
11
|
* @example
|
|
12
12
|
* ```typescript
|
|
@@ -14,7 +14,7 @@ import type { LogApiConfig, LogApiHandler } from '../types.js';
|
|
|
14
14
|
* import { createLogApiHandler } from 'hazo_logs';
|
|
15
15
|
*
|
|
16
16
|
* const handler = createLogApiHandler();
|
|
17
|
-
* export const { GET } = handler;
|
|
17
|
+
* export const { GET, POST } = handler;
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
20
|
export declare function createLogApiHandler(config?: LogApiConfig): LogApiHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-api-handler.d.ts","sourceRoot":"","sources":["../../../src/ui/api/log-api-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"log-api-handler.d.ts","sourceRoot":"","sources":["../../../src/ui/api/log-api-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA4B/D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,aAAa,CA2FxE"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { readLogs, getAvailableLogDates, getUniquePackages, getUniqueExecutionIds, getUniqueSessionIds, getUniqueReferences, } from '../../lib/log-reader.js';
|
|
5
5
|
import { loadConfig } from '../../lib/config_loader.js';
|
|
6
|
+
import { HazoLogger } from '../../lib/hazo_logger.js';
|
|
6
7
|
/**
|
|
7
8
|
* Helper to create JSON responses (compatible with Next.js Response)
|
|
8
9
|
*/
|
|
@@ -16,7 +17,7 @@ function jsonResponse(data, status = 200) {
|
|
|
16
17
|
* Create a Next.js API route handler for log queries
|
|
17
18
|
*
|
|
18
19
|
* @param config - Optional configuration
|
|
19
|
-
* @returns Handler object with GET
|
|
20
|
+
* @returns Handler object with GET and POST methods
|
|
20
21
|
*
|
|
21
22
|
* @example
|
|
22
23
|
* ```typescript
|
|
@@ -24,7 +25,7 @@ function jsonResponse(data, status = 200) {
|
|
|
24
25
|
* import { createLogApiHandler } from 'hazo_logs';
|
|
25
26
|
*
|
|
26
27
|
* const handler = createLogApiHandler();
|
|
27
|
-
* export const { GET } = handler;
|
|
28
|
+
* export const { GET, POST } = handler;
|
|
28
29
|
* ```
|
|
29
30
|
*/
|
|
30
31
|
export function createLogApiHandler(config) {
|
|
@@ -60,6 +61,52 @@ export function createLogApiHandler(config) {
|
|
|
60
61
|
return jsonResponse({ error: 'Internal Server Error', message: String(error) }, 500);
|
|
61
62
|
}
|
|
62
63
|
},
|
|
64
|
+
POST: async (request) => {
|
|
65
|
+
const hazoConfig = loadConfig();
|
|
66
|
+
// Check if log viewer is enabled (also controls client logging)
|
|
67
|
+
if (!hazoConfig.enable_log_viewer) {
|
|
68
|
+
return jsonResponse({ error: 'Log viewer is disabled' }, 403);
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const body = await request.json();
|
|
72
|
+
if (!body.logs || !Array.isArray(body.logs)) {
|
|
73
|
+
return jsonResponse({ error: 'Invalid request: logs array required' }, 400);
|
|
74
|
+
}
|
|
75
|
+
const logger = HazoLogger.getInstance();
|
|
76
|
+
let loggedCount = 0;
|
|
77
|
+
for (const log of body.logs) {
|
|
78
|
+
// Validate required fields
|
|
79
|
+
if (!log.level || !log.message || !log.package) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Validate log level
|
|
83
|
+
if (!['error', 'warn', 'info', 'debug'].includes(log.level)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
// Log the client entry
|
|
87
|
+
logger.logClient({
|
|
88
|
+
timestamp: log.timestamp || new Date().toISOString(),
|
|
89
|
+
level: log.level,
|
|
90
|
+
package: log.package,
|
|
91
|
+
message: log.message,
|
|
92
|
+
sessionId: log.sessionId,
|
|
93
|
+
reference: log.reference,
|
|
94
|
+
data: {
|
|
95
|
+
...log.data,
|
|
96
|
+
userAgent: log.userAgent,
|
|
97
|
+
url: log.url,
|
|
98
|
+
},
|
|
99
|
+
source: 'client',
|
|
100
|
+
});
|
|
101
|
+
loggedCount++;
|
|
102
|
+
}
|
|
103
|
+
return jsonResponse({ success: true, logged: loggedCount });
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error('[HazoLog] API error:', error);
|
|
107
|
+
return jsonResponse({ error: 'Internal Server Error', message: String(error) }, 500);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
63
110
|
};
|
|
64
111
|
}
|
|
65
112
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-api-handler.js","sourceRoot":"","sources":["../../../src/ui/api/log-api-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"log-api-handler.js","sourceRoot":"","sources":["../../../src/ui/api/log-api-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side logger for hazo_logs
|
|
3
|
+
*
|
|
4
|
+
* Sends logs from the browser to the server API to be stored
|
|
5
|
+
* alongside server-side logs. All entries are marked with source: 'client'.
|
|
6
|
+
*/
|
|
7
|
+
export type ClientLogLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
8
|
+
export interface ClientLoggerConfig {
|
|
9
|
+
/** API endpoint to post logs to (default: '/api/logs') */
|
|
10
|
+
apiBasePath?: string;
|
|
11
|
+
/** Package name to tag logs with */
|
|
12
|
+
packageName?: string;
|
|
13
|
+
/** Session ID for tracking user sessions */
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
/** Reference ID for tracking specific flows */
|
|
16
|
+
reference?: string;
|
|
17
|
+
/** Minimum log level to send (default: 'debug') */
|
|
18
|
+
minLevel?: ClientLogLevel;
|
|
19
|
+
/** Whether to also log to browser console (default: true) */
|
|
20
|
+
consoleOutput?: boolean;
|
|
21
|
+
/** Batch logs and send periodically (default: false) */
|
|
22
|
+
batchMode?: boolean;
|
|
23
|
+
/** Batch interval in ms (default: 5000) */
|
|
24
|
+
batchInterval?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a client-side logger instance
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* 'use client';
|
|
32
|
+
* import { createClientLogger } from 'hazo_logs/ui';
|
|
33
|
+
*
|
|
34
|
+
* const logger = createClientLogger({
|
|
35
|
+
* packageName: 'my-app',
|
|
36
|
+
* apiBasePath: '/api/hazo_logs/logs',
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* logger.info('User clicked button', { buttonId: 'submit' });
|
|
40
|
+
* logger.error('Failed to load data', { error: err.message });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function createClientLogger(config?: ClientLoggerConfig): {
|
|
44
|
+
error: (message: string, data?: Record<string, unknown>) => Promise<void>;
|
|
45
|
+
warn: (message: string, data?: Record<string, unknown>) => Promise<void>;
|
|
46
|
+
info: (message: string, data?: Record<string, unknown>) => Promise<void>;
|
|
47
|
+
debug: (message: string, data?: Record<string, unknown>) => Promise<void>;
|
|
48
|
+
/** Manually flush batched logs */
|
|
49
|
+
flush: () => Promise<void>;
|
|
50
|
+
/** Create a child logger with additional context */
|
|
51
|
+
child: (childConfig: Partial<ClientLoggerConfig>) => /*elided*/ any;
|
|
52
|
+
};
|
|
53
|
+
export type ClientLogger = ReturnType<typeof createClientLogger>;
|
|
54
|
+
//# sourceMappingURL=client-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-logger.d.ts","sourceRoot":"","sources":["../../src/ui/client-logger.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,6DAA6D;IAC7D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAsBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,kBAAuB;qBAsG7C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBACvC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBACtC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qBACrC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEvD,kCAAkC;iBAvEP,OAAO,CAAC,IAAI,CAAC;IA0ExC,oDAAoD;yBAC/B,OAAO,CAAC,kBAAkB,CAAC;EAanD;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
const LOG_LEVEL_PRIORITY = {
|
|
3
|
+
error: 0,
|
|
4
|
+
warn: 1,
|
|
5
|
+
info: 2,
|
|
6
|
+
debug: 3,
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Create a client-side logger instance
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* 'use client';
|
|
14
|
+
* import { createClientLogger } from 'hazo_logs/ui';
|
|
15
|
+
*
|
|
16
|
+
* const logger = createClientLogger({
|
|
17
|
+
* packageName: 'my-app',
|
|
18
|
+
* apiBasePath: '/api/hazo_logs/logs',
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* logger.info('User clicked button', { buttonId: 'submit' });
|
|
22
|
+
* logger.error('Failed to load data', { error: err.message });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function createClientLogger(config = {}) {
|
|
26
|
+
const { apiBasePath = '/api/logs', packageName = 'client', sessionId, reference, minLevel = 'debug', consoleOutput = true, batchMode = false, batchInterval = 5000, } = config;
|
|
27
|
+
let logBatch = [];
|
|
28
|
+
let batchTimer = null;
|
|
29
|
+
const shouldLog = (level) => {
|
|
30
|
+
return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[minLevel];
|
|
31
|
+
};
|
|
32
|
+
const sendLogs = async (entries) => {
|
|
33
|
+
if (entries.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
try {
|
|
36
|
+
await fetch(apiBasePath, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: { 'Content-Type': 'application/json' },
|
|
39
|
+
body: JSON.stringify({ logs: entries }),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
// Silently fail - don't want logging errors to break the app
|
|
44
|
+
if (consoleOutput) {
|
|
45
|
+
console.error('[HazoLog Client] Failed to send logs:', err);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const flushBatch = async () => {
|
|
50
|
+
if (logBatch.length > 0) {
|
|
51
|
+
const toSend = [...logBatch];
|
|
52
|
+
logBatch = [];
|
|
53
|
+
await sendLogs(toSend);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const startBatchTimer = () => {
|
|
57
|
+
if (batchMode && !batchTimer) {
|
|
58
|
+
batchTimer = setTimeout(async () => {
|
|
59
|
+
await flushBatch();
|
|
60
|
+
batchTimer = null;
|
|
61
|
+
if (logBatch.length > 0) {
|
|
62
|
+
startBatchTimer();
|
|
63
|
+
}
|
|
64
|
+
}, batchInterval);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const log = async (level, message, data) => {
|
|
68
|
+
if (!shouldLog(level))
|
|
69
|
+
return;
|
|
70
|
+
// Console output
|
|
71
|
+
if (consoleOutput) {
|
|
72
|
+
const consoleMethod = level === 'error' ? 'error' : level === 'warn' ? 'warn' : 'log';
|
|
73
|
+
console[consoleMethod](`[${packageName}] ${message}`, data || '');
|
|
74
|
+
}
|
|
75
|
+
const entry = {
|
|
76
|
+
level,
|
|
77
|
+
message,
|
|
78
|
+
package: packageName,
|
|
79
|
+
timestamp: new Date().toISOString(),
|
|
80
|
+
source: 'client',
|
|
81
|
+
sessionId,
|
|
82
|
+
reference,
|
|
83
|
+
data,
|
|
84
|
+
userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,
|
|
85
|
+
url: typeof window !== 'undefined' ? window.location.href : undefined,
|
|
86
|
+
};
|
|
87
|
+
if (batchMode) {
|
|
88
|
+
logBatch.push(entry);
|
|
89
|
+
startBatchTimer();
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
await sendLogs([entry]);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
// Setup flush on page unload for batched logs
|
|
96
|
+
if (typeof window !== 'undefined' && batchMode) {
|
|
97
|
+
window.addEventListener('beforeunload', () => {
|
|
98
|
+
if (logBatch.length > 0) {
|
|
99
|
+
// Use sendBeacon for reliable delivery on page unload
|
|
100
|
+
const data = JSON.stringify({ logs: logBatch });
|
|
101
|
+
navigator.sendBeacon(apiBasePath, data);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
error: (message, data) => log('error', message, data),
|
|
107
|
+
warn: (message, data) => log('warn', message, data),
|
|
108
|
+
info: (message, data) => log('info', message, data),
|
|
109
|
+
debug: (message, data) => log('debug', message, data),
|
|
110
|
+
/** Manually flush batched logs */
|
|
111
|
+
flush: flushBatch,
|
|
112
|
+
/** Create a child logger with additional context */
|
|
113
|
+
child: (childConfig) => createClientLogger({
|
|
114
|
+
apiBasePath,
|
|
115
|
+
packageName,
|
|
116
|
+
sessionId,
|
|
117
|
+
reference,
|
|
118
|
+
minLevel,
|
|
119
|
+
consoleOutput,
|
|
120
|
+
batchMode,
|
|
121
|
+
batchInterval,
|
|
122
|
+
...childConfig,
|
|
123
|
+
}),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=client-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-logger.js","sourceRoot":"","sources":["../../src/ui/client-logger.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AA2Cb,MAAM,kBAAkB,GAAmC;IACzD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAA6B,EAAE;IAChE,MAAM,EACJ,WAAW,GAAG,WAAW,EACzB,WAAW,GAAG,QAAQ,EACtB,SAAS,EACT,SAAS,EACT,QAAQ,GAAG,OAAO,EAClB,aAAa,GAAG,IAAI,EACpB,SAAS,GAAG,KAAK,EACjB,aAAa,GAAG,IAAI,GACrB,GAAG,MAAM,CAAC;IAEX,IAAI,QAAQ,GAAqB,EAAE,CAAC;IACpC,IAAI,UAAU,GAAyC,IAAI,CAAC;IAE5D,MAAM,SAAS,GAAG,CAAC,KAAqB,EAAW,EAAE;QACnD,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,OAAyB,EAAiB,EAAE;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,WAAW,EAAE;gBACvB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;aACxC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6DAA6D;YAC7D,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;QAC3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC7B,QAAQ,GAAG,EAAE,CAAC;YACd,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,GAAS,EAAE;QACjC,IAAI,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,UAAU,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;gBACjC,MAAM,UAAU,EAAE,CAAC;gBACnB,UAAU,GAAG,IAAI,CAAC;gBAClB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,eAAe,EAAE,CAAC;gBACpB,CAAC;YACH,CAAC,EAAE,aAAa,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,KAAK,EACf,KAAqB,EACrB,OAAe,EACf,IAA8B,EACf,EAAE;QACjB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO;QAE9B,iBAAiB;QACjB,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YACtF,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,WAAW,KAAK,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,KAAK,GAAmB;YAC5B,KAAK;YACL,OAAO;YACP,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,QAAQ;YAChB,SAAS;YACT,SAAS;YACT,IAAI;YACJ,SAAS,EAAE,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC7E,GAAG,EAAE,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SACtE,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,eAAe,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,8CAA8C;IAC9C,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,SAAS,EAAE,CAAC;QAC/C,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE;YAC3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,sDAAsD;gBACtD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChD,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;QACvF,IAAI,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;QACrF,IAAI,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;QACrF,KAAK,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;QAEvF,kCAAkC;QAClC,KAAK,EAAE,UAAU;QAEjB,oDAAoD;QACpD,KAAK,EAAE,CAAC,WAAwC,EAAE,EAAE,CAClD,kBAAkB,CAAC;YACjB,WAAW;YACX,WAAW;YACX,SAAS;YACT,SAAS;YACT,QAAQ;YACR,aAAa;YACb,SAAS;YACT,aAAa;YACb,GAAG,WAAW;SACf,CAAC;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogTable.d.ts","sourceRoot":"","sources":["../../../src/ui/components/LogTable.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAElE;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAiB,EAAE,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"LogTable.d.ts","sourceRoot":"","sources":["../../../src/ui/components/LogTable.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAElE;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAiB,EAAE,EAAE,aAAa,2CAwLlE"}
|
|
@@ -28,6 +28,6 @@ export function LogTable({ logs, isLoading = false }) {
|
|
|
28
28
|
if (logs.length === 0) {
|
|
29
29
|
return (_jsx("div", { className: "text-center py-12 text-gray-500", children: "No logs found for the selected filters." }));
|
|
30
30
|
}
|
|
31
|
-
return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "min-w-full divide-y divide-gray-200", children: [_jsx("thead", { className: "bg-gray-50", children: _jsxs("tr", { children: [_jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Context" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Timestamp" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Level" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Package" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Message" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Location" })] }) }), _jsx("tbody", { className: "bg-white divide-y divide-gray-200", children: logs.map((log, index) => (_jsxs(React.Fragment, { children: [_jsxs("tr", { className: `hover:bg-gray-50 ${hasExpandableContent(log) ? 'cursor-pointer' : ''} ${expandedRow === index ? 'bg-gray-50' : ''}`, onClick: () => hasExpandableContent(log) && toggleRow(index), children: [_jsxs("td", { className: "px-4 py-3 whitespace-nowrap text-sm text-gray-500 font-mono", children: [_jsx("span", { title: log.executionId, children: shortenId(log.executionId) }), log.sessionId && (_jsxs("span", { className: "ml-2 text-blue-600", title: log.sessionId, children: ["S:", shortenId(log.sessionId)] })), log.reference && (_jsxs("span", { className: "ml-2 text-green-600", title: log.reference, children: ["R:", log.reference] }))] }), _jsx("td", { className: "px-4 py-3 whitespace-nowrap text-sm text-gray-600", children: formatTimestamp(log.timestamp) }), _jsx("td", { className: "px-4 py-3 whitespace-nowrap", children: _jsx(LogLevelBadge, { level: log.level }) }), _jsx("td", { className: "px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900", children: log.package }), _jsxs("td", { className: "px-4 py-3 text-sm text-gray-700 max-w-md truncate", children: [log.message, hasExpandableContent(log) && (_jsx("span", { className: "ml-2 text-gray-400 text-xs", children: expandedRow === index ? '▼' : '▶' }))] }), _jsxs("td", { className: "px-4 py-3 whitespace-nowrap text-sm text-gray-500 font-mono", children: [log.filename, ":", log.line] })] }), expandedRow === index && hasExpandableContent(log) && (_jsx("tr", { children: _jsx("td", { colSpan:
|
|
31
|
+
return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "min-w-full divide-y divide-gray-200", children: [_jsx("thead", { className: "bg-gray-50", children: _jsxs("tr", { children: [_jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Source" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Context" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Timestamp" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Level" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Package" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Message" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: "Location" })] }) }), _jsx("tbody", { className: "bg-white divide-y divide-gray-200", children: logs.map((log, index) => (_jsxs(React.Fragment, { children: [_jsxs("tr", { className: `hover:bg-gray-50 ${hasExpandableContent(log) ? 'cursor-pointer' : ''} ${expandedRow === index ? 'bg-gray-50' : ''} ${log.source === 'client' ? 'bg-purple-50/50' : ''}`, onClick: () => hasExpandableContent(log) && toggleRow(index), children: [_jsx("td", { className: "px-4 py-3 whitespace-nowrap", children: log.source === 'client' ? (_jsx("span", { className: "inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-purple-100 text-purple-800", children: "Client" })) : (_jsx("span", { className: "inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-gray-100 text-gray-700", children: "Server" })) }), _jsxs("td", { className: "px-4 py-3 whitespace-nowrap text-sm text-gray-500 font-mono", children: [_jsx("span", { title: log.executionId, children: shortenId(log.executionId) }), log.sessionId && (_jsxs("span", { className: "ml-2 text-blue-600", title: log.sessionId, children: ["S:", shortenId(log.sessionId)] })), log.reference && (_jsxs("span", { className: "ml-2 text-green-600", title: log.reference, children: ["R:", log.reference] }))] }), _jsx("td", { className: "px-4 py-3 whitespace-nowrap text-sm text-gray-600", children: formatTimestamp(log.timestamp) }), _jsx("td", { className: "px-4 py-3 whitespace-nowrap", children: _jsx(LogLevelBadge, { level: log.level }) }), _jsx("td", { className: "px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900", children: log.package }), _jsxs("td", { className: "px-4 py-3 text-sm text-gray-700 max-w-md truncate", children: [log.message, hasExpandableContent(log) && (_jsx("span", { className: "ml-2 text-gray-400 text-xs", children: expandedRow === index ? '▼' : '▶' }))] }), _jsxs("td", { className: "px-4 py-3 whitespace-nowrap text-sm text-gray-500 font-mono", children: [log.filename, ":", log.line] })] }), expandedRow === index && hasExpandableContent(log) && (_jsx("tr", { children: _jsx("td", { colSpan: 7, className: "px-4 py-3 bg-gray-50", children: _jsxs("div", { className: "space-y-2", children: [log.source === 'client' && (_jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx("span", { className: "inline-flex items-center px-2 py-0.5 rounded font-medium bg-purple-100 text-purple-800", children: "Client-side Log" }), typeof log.data?.url === 'string' && (_jsxs("span", { className: "text-gray-500", children: ["from: ", _jsx("span", { className: "font-mono text-purple-700", children: log.data.url })] }))] })), _jsxs("div", { className: "flex flex-wrap gap-4 text-xs", children: [_jsxs("div", { children: [_jsx("span", { className: "text-gray-500", children: "Execution ID:" }), ' ', _jsx("span", { className: "font-mono text-gray-700", children: log.executionId })] }), log.sessionId && (_jsxs("div", { children: [_jsx("span", { className: "text-gray-500", children: "Session ID:" }), ' ', _jsx("span", { className: "font-mono text-blue-700", children: log.sessionId })] })), log.reference && (_jsxs("div", { children: [_jsx("span", { className: "text-gray-500", children: "Reference:" }), ' ', _jsx("span", { className: "font-mono text-green-700", children: log.reference })] }))] }), log.source === 'client' && typeof log.data?.userAgent === 'string' && (_jsxs("div", { className: "text-xs", children: [_jsx("span", { className: "text-gray-500", children: "User Agent:" }), ' ', _jsx("span", { className: "font-mono text-gray-600", children: log.data.userAgent })] })), log.data && (_jsxs("div", { children: [_jsx("div", { className: "text-xs text-gray-500 mb-1", children: "Data:" }), _jsx("pre", { className: "text-xs text-gray-700 bg-gray-100 p-3 rounded overflow-x-auto", children: JSON.stringify(log.data, null, 2) })] }))] }) }) }))] }, index))) })] }) }));
|
|
32
32
|
}
|
|
33
33
|
//# sourceMappingURL=LogTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogTable.js","sourceRoot":"","sources":["../../../src/ui/components/LogTable.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,EAAiB;IACjE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEpE,MAAM,eAAe,GAAG,CAAC,SAAiB,EAAE,EAAE;QAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,EAAsB,EAAE,EAAE;QAC3C,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE;QAClC,cAAc,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,CAAC,GAAoB,EAAE,EAAE;QACpD,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;IACpD,CAAC,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,eAAK,SAAS,EAAC,wCAAwC,aACrD,cAAK,SAAS,EAAC,8DAA8D,GAAO,EACpF,eAAM,SAAS,EAAC,oBAAoB,gCAAuB,IACvD,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CACL,cAAK,SAAS,EAAC,iCAAiC,wDAE1C,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,iBAAiB,YAC9B,iBAAO,SAAS,EAAC,qCAAqC,aACpD,gBAAO,SAAS,EAAC,YAAY,YAC3B,yBACE,aAAI,SAAS,EAAC,gFAAgF,wBAEzF,EACL,aAAI,SAAS,EAAC,gFAAgF,0BAEzF,EACL,aAAI,SAAS,EAAC,gFAAgF,sBAEzF,EACL,aAAI,SAAS,EAAC,gFAAgF,wBAEzF,EACL,aAAI,SAAS,EAAC,gFAAgF,wBAEzF,EACL,aAAI,SAAS,EAAC,gFAAgF,yBAEzF,IACF,GACC,EACR,gBAAO,SAAS,EAAC,mCAAmC,YACjD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,MAAC,KAAK,CAAC,QAAQ,eACb,cACE,SAAS,EAAE,oBACT,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EACjD,IAAI,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"LogTable.js","sourceRoot":"","sources":["../../../src/ui/components/LogTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogTimeline.d.ts","sourceRoot":"","sources":["../../../src/ui/components/LogTimeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQrE;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,iBAAsB,EACtB,eAAe,EACf,eAAe,EACf,cAAqB,EACrB,oBAA2B,GAC5B,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"LogTimeline.d.ts","sourceRoot":"","sources":["../../../src/ui/components/LogTimeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQrE;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,iBAAsB,EACtB,eAAe,EACf,eAAe,EACf,cAAqB,EACrB,oBAA2B,GAC5B,EAAE,gBAAgB,2CAqRlB"}
|
|
@@ -79,6 +79,14 @@ export function LogTimeline({ logs, isLoading, availableSessions = [], selectedS
|
|
|
79
79
|
return 'bg-gray-400';
|
|
80
80
|
}
|
|
81
81
|
};
|
|
82
|
+
const getDotStyle = (log) => {
|
|
83
|
+
const baseColor = getDotColor(log.level);
|
|
84
|
+
// Client logs get a ring to distinguish them
|
|
85
|
+
if (log.source === 'client') {
|
|
86
|
+
return `${baseColor} ring-2 ring-purple-400 ring-offset-1`;
|
|
87
|
+
}
|
|
88
|
+
return baseColor;
|
|
89
|
+
};
|
|
82
90
|
if (isLoading) {
|
|
83
91
|
return (_jsxs("div", { className: "flex items-center justify-center py-12", children: [_jsx("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600" }), _jsx("span", { className: "ml-3 text-gray-600", children: "Loading logs..." })] }));
|
|
84
92
|
}
|
|
@@ -88,7 +96,7 @@ export function LogTimeline({ logs, isLoading, availableSessions = [], selectedS
|
|
|
88
96
|
const isCollapsed = collapsedPackages.has(group.packageName);
|
|
89
97
|
return (_jsxs("div", { className: "mb-4", children: [groupByPackage && group.packageName && (_jsxs("div", { className: "relative flex items-center mb-4 ml-8 cursor-pointer group", onClick: () => togglePackageCollapse(group.packageName), children: [_jsx("div", { className: "absolute -left-8 w-4 h-4 rounded-sm bg-purple-500 border-2 border-white shadow" }), _jsxs("div", { className: "flex items-center gap-2 ml-4 px-3 py-2 bg-purple-50 rounded-lg border border-purple-200 hover:bg-purple-100 transition-colors", children: [_jsx("svg", { className: `w-4 h-4 text-purple-600 transition-transform ${isCollapsed ? '' : 'rotate-90'}`, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) }), _jsx("span", { className: "text-sm font-semibold text-purple-800", children: group.packageName }), _jsxs("span", { className: "text-xs text-purple-600 bg-purple-200 px-2 py-0.5 rounded-full", children: [group.logs.length, " log", group.logs.length !== 1 ? 's' : ''] })] })] })), !isCollapsed && group.logs.map((log, logIndex) => {
|
|
90
98
|
const indentation = getDepthIndentation(log.depth);
|
|
91
|
-
return (_jsxs("div", { className: "relative flex items-start mb-4 ml-8", style: { paddingLeft: indentation }, children: [_jsx("div", { className: `absolute w-4 h-4 rounded-full border-2 border-white shadow ${
|
|
99
|
+
return (_jsxs("div", { className: "relative flex items-start mb-4 ml-8", style: { paddingLeft: indentation }, children: [_jsx("div", { className: `absolute w-4 h-4 rounded-full border-2 border-white shadow ${getDotStyle(log)}`, style: { left: indentation - 32 } }), showDepthIndentation && log.depth && log.depth > 1 && (_jsx("div", { className: "absolute top-0 h-full w-0.5 bg-gray-300", style: { left: indentation - 16 } })), _jsxs("div", { className: "flex-1 bg-white rounded-lg border p-4 ml-4 shadow-sm hover:shadow-md transition-shadow", children: [_jsxs("div", { className: "flex items-center justify-between mb-2 flex-wrap gap-2", children: [_jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [log.source === 'client' ? (_jsx("span", { className: "inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-purple-100 text-purple-800", children: "Client" })) : (_jsx("span", { className: "inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-gray-100 text-gray-700", children: "Server" })), _jsx(LogLevelBadge, { level: log.level }), !groupByPackage && (_jsx("span", { className: "text-sm font-medium text-gray-900", children: log.package })), showDepthIndentation && log.depth && log.depth > 1 && (_jsxs("span", { className: "text-xs bg-gray-100 text-gray-600 px-1.5 py-0.5 rounded", children: ["depth: ", log.depth] }))] }), _jsxs("div", { className: "text-right", children: [_jsx("span", { className: "text-xs text-gray-500", children: formatTime(log.timestamp) }), _jsx("span", { className: "text-xs text-gray-400 ml-2", children: formatDate(log.timestamp) })] })] }), _jsx("p", { className: "text-sm text-gray-700 mb-2", children: log.message }), _jsxs("div", { className: "flex flex-wrap gap-2 text-xs", children: [log.sessionId && !selectedSession && (_jsxs("span", { className: "bg-blue-50 text-blue-700 px-2 py-0.5 rounded border border-blue-200", children: ["Session: ", log.sessionId] })), log.reference && (_jsxs("span", { className: "bg-green-50 text-green-700 px-2 py-0.5 rounded border border-green-200", children: ["Ref: ", log.reference] })), log.source === 'client' && typeof log.data?.url === 'string' && (_jsxs("span", { className: "bg-purple-50 text-purple-700 px-2 py-0.5 rounded border border-purple-200 max-w-xs truncate", children: ["URL: ", log.data.url] })), _jsxs("span", { className: "bg-gray-50 text-gray-600 px-2 py-0.5 rounded border border-gray-200", children: [log.filename, ":", log.line] })] }), log.data && (_jsxs("details", { className: "mt-3", children: [_jsx("summary", { className: "text-xs text-blue-600 cursor-pointer hover:text-blue-800", children: "View data" }), _jsx("pre", { className: "mt-2 text-xs bg-gray-50 p-3 rounded overflow-x-auto border", children: JSON.stringify(log.data, null, 2) })] }))] })] }, `${group.packageName}-${logIndex}`));
|
|
92
100
|
})] }, group.packageName || groupIndex));
|
|
93
101
|
})] }))] }));
|
|
94
102
|
}
|