hazo_logs 1.0.0

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 (102) hide show
  1. package/dist/index.d.ts +27 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +28 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/config_loader.d.ts +12 -0
  6. package/dist/lib/config_loader.d.ts.map +1 -0
  7. package/dist/lib/config_loader.js +81 -0
  8. package/dist/lib/config_loader.js.map +1 -0
  9. package/dist/lib/context/index.d.ts +5 -0
  10. package/dist/lib/context/index.d.ts.map +1 -0
  11. package/dist/lib/context/index.js +5 -0
  12. package/dist/lib/context/index.js.map +1 -0
  13. package/dist/lib/context/log-context.d.ts +83 -0
  14. package/dist/lib/context/log-context.d.ts.map +1 -0
  15. package/dist/lib/context/log-context.js +136 -0
  16. package/dist/lib/context/log-context.js.map +1 -0
  17. package/dist/lib/hazo_logger.d.ts +40 -0
  18. package/dist/lib/hazo_logger.d.ts.map +1 -0
  19. package/dist/lib/hazo_logger.js +82 -0
  20. package/dist/lib/hazo_logger.js.map +1 -0
  21. package/dist/lib/index.d.ts +7 -0
  22. package/dist/lib/index.d.ts.map +1 -0
  23. package/dist/lib/index.js +5 -0
  24. package/dist/lib/index.js.map +1 -0
  25. package/dist/lib/log-reader.d.ts +51 -0
  26. package/dist/lib/log-reader.d.ts.map +1 -0
  27. package/dist/lib/log-reader.js +248 -0
  28. package/dist/lib/log-reader.js.map +1 -0
  29. package/dist/lib/package_logger.d.ts +27 -0
  30. package/dist/lib/package_logger.d.ts.map +1 -0
  31. package/dist/lib/package_logger.js +57 -0
  32. package/dist/lib/package_logger.js.map +1 -0
  33. package/dist/lib/transports/console_transport.d.ts +10 -0
  34. package/dist/lib/transports/console_transport.d.ts.map +1 -0
  35. package/dist/lib/transports/console_transport.js +21 -0
  36. package/dist/lib/transports/console_transport.js.map +1 -0
  37. package/dist/lib/transports/file_transport.d.ts +10 -0
  38. package/dist/lib/transports/file_transport.d.ts.map +1 -0
  39. package/dist/lib/transports/file_transport.js +56 -0
  40. package/dist/lib/transports/file_transport.js.map +1 -0
  41. package/dist/lib/transports/index.d.ts +3 -0
  42. package/dist/lib/transports/index.d.ts.map +1 -0
  43. package/dist/lib/transports/index.js +3 -0
  44. package/dist/lib/transports/index.js.map +1 -0
  45. package/dist/lib/types.d.ts +66 -0
  46. package/dist/lib/types.d.ts.map +1 -0
  47. package/dist/lib/types.js +5 -0
  48. package/dist/lib/types.js.map +1 -0
  49. package/dist/lib/utils/caller_info.d.ts +13 -0
  50. package/dist/lib/utils/caller_info.d.ts.map +1 -0
  51. package/dist/lib/utils/caller_info.js +65 -0
  52. package/dist/lib/utils/caller_info.js.map +1 -0
  53. package/dist/lib/utils/constants.d.ts +16 -0
  54. package/dist/lib/utils/constants.d.ts.map +1 -0
  55. package/dist/lib/utils/constants.js +27 -0
  56. package/dist/lib/utils/constants.js.map +1 -0
  57. package/dist/lib/utils/index.d.ts +3 -0
  58. package/dist/lib/utils/index.d.ts.map +1 -0
  59. package/dist/lib/utils/index.js +3 -0
  60. package/dist/lib/utils/index.js.map +1 -0
  61. package/dist/ui/api/log-api-handler.d.ts +21 -0
  62. package/dist/ui/api/log-api-handler.d.ts.map +1 -0
  63. package/dist/ui/api/log-api-handler.js +151 -0
  64. package/dist/ui/api/log-api-handler.js.map +1 -0
  65. package/dist/ui/components/LogLevelBadge.d.ts +6 -0
  66. package/dist/ui/components/LogLevelBadge.d.ts.map +1 -0
  67. package/dist/ui/components/LogLevelBadge.js +16 -0
  68. package/dist/ui/components/LogLevelBadge.js.map +1 -0
  69. package/dist/ui/components/LogPagination.d.ts +6 -0
  70. package/dist/ui/components/LogPagination.d.ts.map +1 -0
  71. package/dist/ui/components/LogPagination.js +14 -0
  72. package/dist/ui/components/LogPagination.js.map +1 -0
  73. package/dist/ui/components/LogTable.d.ts +6 -0
  74. package/dist/ui/components/LogTable.d.ts.map +1 -0
  75. package/dist/ui/components/LogTable.js +33 -0
  76. package/dist/ui/components/LogTable.js.map +1 -0
  77. package/dist/ui/components/LogTimeline.d.ts +10 -0
  78. package/dist/ui/components/LogTimeline.d.ts.map +1 -0
  79. package/dist/ui/components/LogTimeline.js +95 -0
  80. package/dist/ui/components/LogTimeline.js.map +1 -0
  81. package/dist/ui/components/LogViewerPage.d.ts +6 -0
  82. package/dist/ui/components/LogViewerPage.d.ts.map +1 -0
  83. package/dist/ui/components/LogViewerPage.js +273 -0
  84. package/dist/ui/components/LogViewerPage.js.map +1 -0
  85. package/dist/ui/index.d.ts +12 -0
  86. package/dist/ui/index.d.ts.map +1 -0
  87. package/dist/ui/index.js +12 -0
  88. package/dist/ui/index.js.map +1 -0
  89. package/dist/ui/middleware/with-log-auth.d.ts +25 -0
  90. package/dist/ui/middleware/with-log-auth.d.ts.map +1 -0
  91. package/dist/ui/middleware/with-log-auth.js +49 -0
  92. package/dist/ui/middleware/with-log-auth.js.map +1 -0
  93. package/dist/ui/server.d.ts +9 -0
  94. package/dist/ui/server.d.ts.map +1 -0
  95. package/dist/ui/server.js +10 -0
  96. package/dist/ui/server.js.map +1 -0
  97. package/dist/ui/types.d.ts +135 -0
  98. package/dist/ui/types.d.ts.map +1 -0
  99. package/dist/ui/types.js +5 -0
  100. package/dist/ui/types.js.map +1 -0
  101. package/hazo_logs_config.example.ini +47 -0
  102. package/package.json +81 -0
@@ -0,0 +1,273 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState, useEffect, useCallback, useMemo } from 'react';
4
+ import { HazoUiMultiFilterDialog, HazoUiMultiSortDialog, } from 'hazo_ui';
5
+ import { LogTable } from './LogTable.js';
6
+ import { LogTimeline } from './LogTimeline.js';
7
+ import { LogPagination } from './LogPagination.js';
8
+ const LOG_LEVELS = ['error', 'warn', 'info', 'debug'];
9
+ /**
10
+ * Main Log Viewer Page Component
11
+ */
12
+ export function LogViewerPage({ apiBasePath = '/api/logs', title = 'Log Viewer', className = '', embedded = false, showHeader = true, }) {
13
+ // State
14
+ const [logs, setLogs] = useState([]);
15
+ const [isLoading, setIsLoading] = useState(true);
16
+ const [error, setError] = useState(null);
17
+ // Tab state
18
+ const [activeTab, setActiveTab] = useState('table');
19
+ // Pagination state
20
+ const [page, setPage] = useState(1);
21
+ const [pageSize, setPageSize] = useState(50);
22
+ const [total, setTotal] = useState(0);
23
+ const [totalPages, setTotalPages] = useState(0);
24
+ // Date filter state
25
+ const [selectedDate, setSelectedDate] = useState(() => {
26
+ const now = new Date();
27
+ return now.toISOString().split('T')[0];
28
+ });
29
+ const [availableDates, setAvailableDates] = useState([]);
30
+ const [availablePackages, setAvailablePackages] = useState([]);
31
+ const [availableExecutionIds, setAvailableExecutionIds] = useState([]);
32
+ const [availableSessionIds, setAvailableSessionIds] = useState([]);
33
+ const [availableReferences, setAvailableReferences] = useState([]);
34
+ // Filter state (hazo_ui format)
35
+ const [filters, setFilters] = useState([]);
36
+ // Sort state (hazo_ui format)
37
+ const [sorts, setSorts] = useState([
38
+ { field: 'timestamp', direction: 'desc' },
39
+ ]);
40
+ // Timeline-specific state
41
+ const [timelineSelectedSession, setTimelineSelectedSession] = useState(null);
42
+ // Fetch available dates
43
+ const fetchDates = useCallback(async () => {
44
+ try {
45
+ const response = await fetch(`${apiBasePath}?action=dates`);
46
+ if (response.ok) {
47
+ const data = (await response.json());
48
+ setAvailableDates(data.dates);
49
+ if (data.dates.length > 0 && !data.dates.includes(selectedDate)) {
50
+ setSelectedDate(data.dates[0]);
51
+ }
52
+ }
53
+ }
54
+ catch (err) {
55
+ console.error('Failed to fetch dates:', err);
56
+ }
57
+ }, [apiBasePath, selectedDate]);
58
+ // Fetch available packages
59
+ const fetchPackages = useCallback(async () => {
60
+ try {
61
+ const response = await fetch(`${apiBasePath}?action=packages&date=${selectedDate}`);
62
+ if (response.ok) {
63
+ const data = (await response.json());
64
+ setAvailablePackages(data.packages);
65
+ }
66
+ }
67
+ catch (err) {
68
+ console.error('Failed to fetch packages:', err);
69
+ }
70
+ }, [apiBasePath, selectedDate]);
71
+ // Fetch available execution IDs
72
+ const fetchExecutionIds = useCallback(async () => {
73
+ try {
74
+ const response = await fetch(`${apiBasePath}?action=executionIds&date=${selectedDate}`);
75
+ if (response.ok) {
76
+ const data = (await response.json());
77
+ setAvailableExecutionIds(data.executionIds);
78
+ }
79
+ }
80
+ catch (err) {
81
+ console.error('Failed to fetch execution IDs:', err);
82
+ }
83
+ }, [apiBasePath, selectedDate]);
84
+ // Fetch available session IDs
85
+ const fetchSessionIds = useCallback(async () => {
86
+ try {
87
+ const response = await fetch(`${apiBasePath}?action=sessionIds&date=${selectedDate}`);
88
+ if (response.ok) {
89
+ const data = (await response.json());
90
+ setAvailableSessionIds(data.sessionIds);
91
+ }
92
+ }
93
+ catch (err) {
94
+ console.error('Failed to fetch session IDs:', err);
95
+ }
96
+ }, [apiBasePath, selectedDate]);
97
+ // Fetch available references
98
+ const fetchReferences = useCallback(async () => {
99
+ try {
100
+ const response = await fetch(`${apiBasePath}?action=references&date=${selectedDate}`);
101
+ if (response.ok) {
102
+ const data = (await response.json());
103
+ setAvailableReferences(data.references);
104
+ }
105
+ }
106
+ catch (err) {
107
+ console.error('Failed to fetch references:', err);
108
+ }
109
+ }, [apiBasePath, selectedDate]);
110
+ // Fetch logs
111
+ const fetchLogs = useCallback(async () => {
112
+ setIsLoading(true);
113
+ setError(null);
114
+ try {
115
+ const params = new URLSearchParams();
116
+ params.set('date', selectedDate);
117
+ params.set('page', page.toString());
118
+ params.set('pageSize', pageSize.toString());
119
+ // Apply filters from hazo_ui format
120
+ const levelFilters = filters.filter(f => f.field === 'level').map(f => f.value);
121
+ if (levelFilters.length > 0) {
122
+ params.set('level', levelFilters.join(','));
123
+ }
124
+ const packageFilters = filters.filter(f => f.field === 'package').map(f => f.value);
125
+ if (packageFilters.length > 0) {
126
+ params.set('package', packageFilters.join(','));
127
+ }
128
+ const executionIdFilters = filters.filter(f => f.field === 'executionId').map(f => f.value);
129
+ if (executionIdFilters.length > 0) {
130
+ params.set('executionId', executionIdFilters.join(','));
131
+ }
132
+ const sessionIdFilters = filters.filter(f => f.field === 'sessionId').map(f => f.value);
133
+ if (sessionIdFilters.length > 0) {
134
+ params.set('sessionId', sessionIdFilters.join(','));
135
+ }
136
+ const referenceFilters = filters.filter(f => f.field === 'reference').map(f => f.value);
137
+ if (referenceFilters.length > 0) {
138
+ params.set('reference', referenceFilters.join(','));
139
+ }
140
+ const searchFilter = filters.find(f => f.field === 'search');
141
+ if (searchFilter?.value) {
142
+ params.set('search', searchFilter.value);
143
+ }
144
+ // Apply sorting from hazo_ui format
145
+ if (sorts.length > 0) {
146
+ params.set('sortBy', sorts[0].field);
147
+ params.set('sortOrder', sorts[0].direction);
148
+ }
149
+ const response = await fetch(`${apiBasePath}?${params.toString()}`);
150
+ if (!response.ok) {
151
+ const errorData = (await response.json());
152
+ throw new Error(errorData.message || 'Failed to fetch logs');
153
+ }
154
+ const data = (await response.json());
155
+ setLogs(data.logs);
156
+ setTotal(data.total);
157
+ setTotalPages(data.totalPages);
158
+ }
159
+ catch (err) {
160
+ setError(err instanceof Error ? err.message : 'Failed to fetch logs');
161
+ setLogs([]);
162
+ }
163
+ finally {
164
+ setIsLoading(false);
165
+ }
166
+ }, [apiBasePath, selectedDate, page, pageSize, filters, sorts]);
167
+ // Initial load
168
+ useEffect(() => {
169
+ fetchDates();
170
+ }, [fetchDates]);
171
+ // Fetch filter options when date changes
172
+ useEffect(() => {
173
+ fetchPackages();
174
+ fetchExecutionIds();
175
+ fetchSessionIds();
176
+ fetchReferences();
177
+ }, [fetchPackages, fetchExecutionIds, fetchSessionIds, fetchReferences]);
178
+ // Fetch logs when dependencies change
179
+ useEffect(() => {
180
+ fetchLogs();
181
+ }, [fetchLogs]);
182
+ // Handle filter changes from hazo_ui
183
+ const handleFilterChange = (newFilters) => {
184
+ setFilters(newFilters);
185
+ setPage(1);
186
+ };
187
+ // Handle sort changes from hazo_ui
188
+ const handleSortChange = (newSorts) => {
189
+ setSorts(newSorts);
190
+ setPage(1);
191
+ };
192
+ // Handle page size change
193
+ const handlePageSizeChange = (newSize) => {
194
+ setPageSize(newSize);
195
+ setPage(1);
196
+ };
197
+ // Handle refresh
198
+ const handleRefresh = () => {
199
+ fetchLogs();
200
+ };
201
+ // Filter fields configuration for hazo_ui
202
+ const filterFields = useMemo(() => [
203
+ {
204
+ value: 'level',
205
+ label: 'Log Level',
206
+ type: 'combobox',
207
+ comboboxOptions: LOG_LEVELS.map(level => ({
208
+ value: level,
209
+ label: level.toUpperCase(),
210
+ })),
211
+ },
212
+ {
213
+ value: 'package',
214
+ label: 'Package',
215
+ type: 'combobox',
216
+ comboboxOptions: availablePackages.map(pkg => ({ value: pkg, label: pkg })),
217
+ },
218
+ {
219
+ value: 'executionId',
220
+ label: 'Execution',
221
+ type: 'combobox',
222
+ comboboxOptions: availableExecutionIds.map(id => ({ value: id, label: id })),
223
+ },
224
+ {
225
+ value: 'sessionId',
226
+ label: 'Session',
227
+ type: 'combobox',
228
+ comboboxOptions: availableSessionIds.map(id => ({ value: id, label: id })),
229
+ },
230
+ {
231
+ value: 'reference',
232
+ label: 'Reference',
233
+ type: 'combobox',
234
+ comboboxOptions: availableReferences.map(ref => ({ value: ref, label: ref })),
235
+ },
236
+ {
237
+ value: 'search',
238
+ label: 'Search',
239
+ type: 'text',
240
+ },
241
+ ], [availablePackages, availableExecutionIds, availableSessionIds, availableReferences]);
242
+ // Sort fields configuration for hazo_ui
243
+ const sortFields = useMemo(() => [
244
+ { value: 'timestamp', label: 'Timestamp' },
245
+ { value: 'level', label: 'Level' },
246
+ { value: 'package', label: 'Package' },
247
+ { value: 'executionId', label: 'Execution' },
248
+ { value: 'sessionId', label: 'Session' },
249
+ { value: 'reference', label: 'Reference' },
250
+ ], []);
251
+ // Container classes based on embedded mode
252
+ const containerClass = embedded
253
+ ? `flex flex-col h-full ${className}`
254
+ : `min-h-screen bg-gray-50 ${className}`;
255
+ const headerClass = embedded
256
+ ? 'p-4 border-b bg-white'
257
+ : 'bg-white shadow';
258
+ const headerInnerClass = embedded
259
+ ? ''
260
+ : 'px-4 sm:px-6 lg:px-8 py-4';
261
+ const contentClass = embedded
262
+ ? 'flex-1 overflow-auto p-4'
263
+ : 'px-4 sm:px-6 lg:px-8 py-6';
264
+ return (_jsxs("div", { className: containerClass, children: [showHeader && (_jsx("div", { className: headerClass, children: _jsxs("div", { className: headerInnerClass, children: [_jsxs("div", { className: "flex items-center justify-between flex-wrap gap-4", children: [_jsx("h1", { className: embedded ? 'text-xl font-bold text-gray-900' : 'text-2xl font-bold text-gray-900', children: title }), _jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("label", { htmlFor: "date", className: "text-sm font-medium text-gray-700", children: "Date:" }), _jsx("select", { id: "date", value: selectedDate, onChange: (e) => {
265
+ setSelectedDate(e.target.value);
266
+ setPage(1);
267
+ }, className: "rounded-md border border-gray-300 bg-white px-3 py-1.5 text-sm shadow-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500", children: availableDates.map((date) => (_jsx("option", { value: date, children: date }, date))) })] }), _jsx(HazoUiMultiFilterDialog, { availableFields: filterFields, initialFilters: filters, onFilterChange: handleFilterChange }), _jsx(HazoUiMultiSortDialog, { availableFields: sortFields, initialSortFields: sorts, onSortChange: handleSortChange }), _jsx("button", { onClick: handleRefresh, disabled: isLoading, className: "px-4 py-1.5 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50", children: isLoading ? 'Loading...' : 'Refresh' })] })] }), filters.length > 0 && (_jsxs("div", { className: "mt-3 flex items-center gap-2 flex-wrap", children: [_jsx("span", { className: "text-sm text-gray-500", children: "Active filters:" }), filters.map((filter, index) => (_jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium bg-blue-100 text-blue-800", children: [filter.field, ": ", String(filter.value)] }, `${filter.field}-${index}`))), _jsx("button", { onClick: () => handleFilterChange([]), className: "text-xs text-gray-500 hover:text-gray-700 underline", children: "Clear all" })] }))] }) })), _jsx("div", { className: contentClass, children: error ? (_jsx("div", { className: "bg-red-50 border border-red-200 rounded-md p-4 text-red-700", children: error })) : (_jsxs("div", { className: embedded ? 'bg-white rounded-lg overflow-hidden border' : 'bg-white shadow rounded-lg overflow-hidden', children: [_jsx("div", { className: "border-b border-gray-200", children: _jsxs("nav", { className: "flex -mb-px", children: [_jsx("button", { onClick: () => setActiveTab('table'), className: `px-6 py-3 text-sm font-medium border-b-2 ${activeTab === 'table'
268
+ ? 'border-blue-500 text-blue-600'
269
+ : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}`, children: "Table View" }), _jsx("button", { onClick: () => setActiveTab('timeline'), className: `px-6 py-3 text-sm font-medium border-b-2 ${activeTab === 'timeline'
270
+ ? 'border-blue-500 text-blue-600'
271
+ : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}`, children: "Timeline View" })] }) }), activeTab === 'table' ? (_jsxs(_Fragment, { children: [_jsx(LogTable, { logs: logs, isLoading: isLoading }), !isLoading && logs.length > 0 && (_jsx(LogPagination, { currentPage: page, totalPages: totalPages, pageSize: pageSize, total: total, onPageChange: setPage, onPageSizeChange: handlePageSizeChange }))] })) : (_jsx(LogTimeline, { logs: logs, isLoading: isLoading, availableSessions: availableSessionIds, selectedSession: timelineSelectedSession ?? undefined, onSessionChange: setTimelineSelectedSession, groupByPackage: true, showDepthIndentation: true }))] })) })] }));
272
+ }
273
+ //# sourceMappingURL=LogViewerPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogViewerPage.js","sourceRoot":"","sources":["../../../src/ui/components/LogViewerPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * UI exports for hazo_logs
3
+ *
4
+ * Client-side components only. For server-side API handlers, use 'hazo_logs/ui/server'
5
+ */
6
+ export { LogViewerPage } from './components/LogViewerPage.js';
7
+ export { LogTable } from './components/LogTable.js';
8
+ export { LogTimeline } from './components/LogTimeline.js';
9
+ export { LogPagination } from './components/LogPagination.js';
10
+ export { LogLevelBadge } from './components/LogLevelBadge.js';
11
+ export type { LogViewerPageProps, LogTableProps, LogTimelineProps, LogPaginationProps, LogLevelBadgeProps, LogApiConfig, LogApiHandler, AuthCheckFn, LogEntryDisplay, LogQueryResponse, LogDatesResponse, LogPackagesResponse, } from './types.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,YAAY,EACV,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * UI exports for hazo_logs
3
+ *
4
+ * Client-side components only. For server-side API handlers, use 'hazo_logs/ui/server'
5
+ */
6
+ // Components (client-side only)
7
+ export { LogViewerPage } from './components/LogViewerPage.js';
8
+ export { LogTable } from './components/LogTable.js';
9
+ export { LogTimeline } from './components/LogTimeline.js';
10
+ export { LogPagination } from './components/LogPagination.js';
11
+ export { LogLevelBadge } from './components/LogLevelBadge.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gCAAgC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Auth middleware wrapper for log viewer API routes
3
+ */
4
+ import type { AuthCheckFn, LogApiHandler } from '../types.js';
5
+ /**
6
+ * Wrap a log API handler with authentication
7
+ *
8
+ * @param handler - The log API handler to wrap
9
+ * @param authCheck - Function to check if request is authorized
10
+ * @returns Wrapped handler that checks auth before processing
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { createLogApiHandler, withLogAuth } from 'hazo_logs';
15
+ *
16
+ * const handler = createLogApiHandler();
17
+ *
18
+ * export const { GET } = withLogAuth(handler, async (req) => {
19
+ * const session = await getSession(req);
20
+ * return session?.user?.role === 'admin';
21
+ * });
22
+ * ```
23
+ */
24
+ export declare function withLogAuth(handler: LogApiHandler, authCheck: AuthCheckFn): LogApiHandler;
25
+ //# sourceMappingURL=with-log-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-log-auth.d.ts","sourceRoot":"","sources":["../../../src/ui/middleware/with-log-auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAY9D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,WAAW,GACrB,aAAa,CAuBf"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Auth middleware wrapper for log viewer API routes
3
+ */
4
+ /**
5
+ * Helper to create JSON responses (compatible with Next.js Response)
6
+ */
7
+ function jsonResponse(data, status = 200) {
8
+ return new Response(JSON.stringify(data), {
9
+ status,
10
+ headers: { 'Content-Type': 'application/json' },
11
+ });
12
+ }
13
+ /**
14
+ * Wrap a log API handler with authentication
15
+ *
16
+ * @param handler - The log API handler to wrap
17
+ * @param authCheck - Function to check if request is authorized
18
+ * @returns Wrapped handler that checks auth before processing
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { createLogApiHandler, withLogAuth } from 'hazo_logs';
23
+ *
24
+ * const handler = createLogApiHandler();
25
+ *
26
+ * export const { GET } = withLogAuth(handler, async (req) => {
27
+ * const session = await getSession(req);
28
+ * return session?.user?.role === 'admin';
29
+ * });
30
+ * ```
31
+ */
32
+ export function withLogAuth(handler, authCheck) {
33
+ return {
34
+ GET: async (request) => {
35
+ try {
36
+ const isAuthorized = await authCheck(request);
37
+ if (!isAuthorized) {
38
+ return jsonResponse({ error: 'Unauthorized', message: 'Access to logs requires authentication' }, 401);
39
+ }
40
+ return handler.GET(request);
41
+ }
42
+ catch (error) {
43
+ console.error('[HazoLog] Auth check failed:', error);
44
+ return jsonResponse({ error: 'Internal Server Error', message: 'Authentication check failed' }, 500);
45
+ }
46
+ },
47
+ };
48
+ }
49
+ //# sourceMappingURL=with-log-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-log-auth.js","sourceRoot":"","sources":["../../../src/ui/middleware/with-log-auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,SAAS,YAAY,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IAC/C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CACzB,OAAsB,EACtB,SAAsB;IAEtB,OAAO;QACL,GAAG,EAAE,KAAK,EAAE,OAAgB,EAAqB,EAAE;YACjD,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBAE9C,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,OAAO,YAAY,CACjB,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,wCAAwC,EAAE,EAC5E,GAAG,CACJ,CAAC;gBACJ,CAAC;gBAED,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;gBACrD,OAAO,YAAY,CACjB,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,6BAA6B,EAAE,EAC1E,GAAG,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Server-side UI exports for hazo_logs
3
+ *
4
+ * Use these in API routes and server components only.
5
+ */
6
+ export { createLogApiHandler } from './api/log-api-handler.js';
7
+ export { withLogAuth } from './middleware/with-log-auth.js';
8
+ export type { LogApiConfig, LogApiHandler, AuthCheckFn, } from './types.js';
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAG5D,YAAY,EACV,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Server-side UI exports for hazo_logs
3
+ *
4
+ * Use these in API routes and server components only.
5
+ */
6
+ // API Handler
7
+ export { createLogApiHandler } from './api/log-api-handler.js';
8
+ // Middleware
9
+ export { withLogAuth } from './middleware/with-log-auth.js';
10
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc;AACd,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Type definitions for hazo_logs UI components
3
+ */
4
+ /**
5
+ * Generic request type compatible with Next.js NextRequest
6
+ * This allows the package to be built without requiring Next.js at compile time
7
+ */
8
+ export interface LogRequest {
9
+ url: string;
10
+ headers: Headers;
11
+ }
12
+ /**
13
+ * Auth check function type for protecting log viewer routes
14
+ */
15
+ export type AuthCheckFn = (request: Request) => Promise<boolean> | boolean;
16
+ /**
17
+ * Configuration for the log API handler
18
+ */
19
+ export interface LogApiConfig {
20
+ logDirectory?: string;
21
+ }
22
+ /**
23
+ * Next.js API route handler interface
24
+ * Uses Request for compatibility with Next.js 15+ route handlers
25
+ */
26
+ export interface LogApiHandler {
27
+ GET: (request: Request) => Promise<Response>;
28
+ }
29
+ /**
30
+ * Props for the LogViewerPage component
31
+ */
32
+ export interface LogViewerPageProps {
33
+ apiBasePath?: string;
34
+ title?: string;
35
+ className?: string;
36
+ /** If true, use a compact layout suitable for embedding in pages with existing navigation */
37
+ embedded?: boolean;
38
+ /** Control visibility of the header (default: true) */
39
+ showHeader?: boolean;
40
+ }
41
+ /**
42
+ * Props for the LogTable component
43
+ */
44
+ export interface LogTableProps {
45
+ logs: LogEntryDisplay[];
46
+ isLoading?: boolean;
47
+ onRowClick?: (log: LogEntryDisplay) => void;
48
+ }
49
+ /**
50
+ * Extended log entry with display-specific fields
51
+ */
52
+ export interface LogEntryDisplay {
53
+ timestamp: string;
54
+ level: 'error' | 'warn' | 'info' | 'debug';
55
+ package: string;
56
+ message: string;
57
+ filename: string;
58
+ line: number;
59
+ executionId: string;
60
+ sessionId?: string;
61
+ reference?: string;
62
+ depth?: number;
63
+ data?: Record<string, unknown>;
64
+ }
65
+ /**
66
+ * Props for LogTimeline component
67
+ */
68
+ export interface LogTimelineProps {
69
+ logs: LogEntryDisplay[];
70
+ isLoading: boolean;
71
+ availableSessions?: string[];
72
+ selectedSession?: string;
73
+ onSessionChange?: (sessionId: string | null) => void;
74
+ groupByPackage?: boolean;
75
+ showDepthIndentation?: boolean;
76
+ }
77
+ /**
78
+ * Props for LogPagination component
79
+ */
80
+ export interface LogPaginationProps {
81
+ currentPage: number;
82
+ totalPages: number;
83
+ pageSize: number;
84
+ total: number;
85
+ onPageChange: (page: number) => void;
86
+ onPageSizeChange?: (size: number) => void;
87
+ }
88
+ /**
89
+ * Props for LogLevelBadge component
90
+ */
91
+ export interface LogLevelBadgeProps {
92
+ level: 'error' | 'warn' | 'info' | 'debug';
93
+ className?: string;
94
+ }
95
+ /**
96
+ * API response for log queries
97
+ */
98
+ export interface LogQueryResponse {
99
+ logs: LogEntryDisplay[];
100
+ total: number;
101
+ page: number;
102
+ pageSize: number;
103
+ totalPages: number;
104
+ }
105
+ /**
106
+ * API response for available dates
107
+ */
108
+ export interface LogDatesResponse {
109
+ dates: string[];
110
+ }
111
+ /**
112
+ * API response for available packages
113
+ */
114
+ export interface LogPackagesResponse {
115
+ packages: string[];
116
+ }
117
+ /**
118
+ * API response for available execution IDs
119
+ */
120
+ export interface LogExecutionIdsResponse {
121
+ executionIds: string[];
122
+ }
123
+ /**
124
+ * API response for available session IDs
125
+ */
126
+ export interface LogSessionIdsResponse {
127
+ sessionIds: string[];
128
+ }
129
+ /**
130
+ * API response for available references
131
+ */
132
+ export interface LogReferencesResponse {
133
+ references: string[];
134
+ }
135
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ui/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Type definitions for hazo_logs UI components
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ui/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,47 @@
1
+ # hazo_logs configuration file
2
+ # Copy this file to your project root as hazo_logs_config.ini
3
+
4
+ [hazo_logs]
5
+ # Directory for log files (relative to process.cwd() or absolute)
6
+ # Default: ./logs
7
+ log_directory = ./logs
8
+
9
+ # Minimum log level (error, warn, info, debug)
10
+ # Default: info
11
+ log_level = info
12
+
13
+ # Enable console output with colors
14
+ # Default: true
15
+ enable_console = true
16
+
17
+ # Enable file output with daily rotation
18
+ # Default: true
19
+ enable_file = true
20
+
21
+ # Maximum size per log file before rotation
22
+ # Supports: k, m, g (e.g., 20m = 20 megabytes)
23
+ # Default: 20m
24
+ max_file_size = 20m
25
+
26
+ # Maximum retention for log files
27
+ # Supports: number of files or age (e.g., 14d = 14 days)
28
+ # Default: 14d
29
+ max_files = 14d
30
+
31
+ # Date pattern for log file names
32
+ # Default: YYYY-MM-DD (creates hazo-2024-01-15.log)
33
+ date_pattern = YYYY-MM-DD
34
+
35
+ # --- Log Viewer UI Settings ---
36
+
37
+ # Enable the log viewer UI feature
38
+ # Default: true
39
+ enable_log_viewer = true
40
+
41
+ # Number of log entries per page in the viewer
42
+ # Default: 50
43
+ log_viewer_page_size = 50
44
+
45
+ # Maximum number of log entries to load for filtering/sorting
46
+ # Default: 1000
47
+ log_viewer_max_results = 1000