indusagi-coding-agent 0.1.22 → 0.1.24
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/CHANGELOG.md +72 -11
- package/README.md +2 -36
- package/dist/cli/args.d.ts +117 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +231 -64
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts +58 -2
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +130 -12
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts +70 -2
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +240 -15
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/list-models.d.ts +63 -3
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +202 -27
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/login-handler.d.ts +82 -8
- package/dist/cli/login-handler.d.ts.map +1 -1
- package/dist/cli/login-handler.js +410 -77
- package/dist/cli/login-handler.js.map +1 -1
- package/dist/cli/session-picker.d.ts +74 -2
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +236 -12
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/core/agent-session.d.ts +214 -9
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +214 -9
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts +302 -12
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +302 -12
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/diagnostics.d.ts +191 -0
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js +142 -0
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/event-bus.d.ts +146 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +93 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts +4 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js +4 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts +128 -0
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +128 -0
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts +4 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +4 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/keybindings.d.ts +142 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +142 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +98 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +98 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +99 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +99 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +0 -2
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +127 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +125 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/subagents.js.map +1 -1
- package/dist/core/tools/bash.d.ts +391 -11
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +269 -2
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +284 -6
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +238 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +169 -5
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +136 -0
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +285 -5
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +247 -0
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +0 -18
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -23
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +6 -0
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +6 -0
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +308 -7
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +231 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/webfetch.d.ts +118 -3
- package/dist/core/tools/webfetch.d.ts.map +1 -1
- package/dist/core/tools/webfetch.js +118 -3
- package/dist/core/tools/webfetch.js.map +1 -1
- package/dist/core/tools/websearch.d.ts +130 -3
- package/dist/core/tools/websearch.d.ts.map +1 -1
- package/dist/core/tools/websearch.js +130 -3
- package/dist/core/tools/websearch.js.map +1 -1
- package/dist/core/tools/write.d.ts +251 -5
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +210 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +164 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +164 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +297 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +297 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +251 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +186 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +186 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1567 -13
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1567 -13
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +422 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +422 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +538 -5
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +538 -5
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +921 -8
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +921 -8
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +802 -9
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +802 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +356 -3
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +356 -3
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/shared.d.ts +386 -0
- package/dist/modes/shared.d.ts.map +1 -0
- package/dist/modes/shared.js +543 -0
- package/dist/modes/shared.js.map +1 -0
- package/dist/utils/array.d.ts +389 -0
- package/dist/utils/array.d.ts.map +1 -0
- package/dist/utils/array.js +585 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/color-formatter.d.ts +318 -0
- package/dist/utils/color-formatter.d.ts.map +1 -0
- package/dist/utils/color-formatter.js +442 -0
- package/dist/utils/color-formatter.js.map +1 -0
- package/dist/utils/data-transformer.d.ts +326 -0
- package/dist/utils/data-transformer.d.ts.map +1 -0
- package/dist/utils/data-transformer.js +512 -0
- package/dist/utils/data-transformer.js.map +1 -0
- package/dist/utils/date-formatter.d.ts +281 -0
- package/dist/utils/date-formatter.d.ts.map +1 -0
- package/dist/utils/date-formatter.js +503 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/error-handler.d.ts +541 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +726 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/file-operations.d.ts +297 -0
- package/dist/utils/file-operations.d.ts.map +1 -0
- package/dist/utils/file-operations.js +505 -0
- package/dist/utils/file-operations.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +268 -6
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +500 -21
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/json-formatter.d.ts +259 -0
- package/dist/utils/json-formatter.d.ts.map +1 -0
- package/dist/utils/json-formatter.js +517 -0
- package/dist/utils/json-formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +176 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +346 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown-formatter.d.ts +211 -0
- package/dist/utils/markdown-formatter.d.ts.map +1 -0
- package/dist/utils/markdown-formatter.js +482 -0
- package/dist/utils/markdown-formatter.js.map +1 -0
- package/dist/utils/path-validator.d.ts +603 -0
- package/dist/utils/path-validator.d.ts.map +1 -0
- package/dist/utils/path-validator.js +870 -0
- package/dist/utils/path-validator.js.map +1 -0
- package/dist/utils/string-formatter.d.ts +609 -0
- package/dist/utils/string-formatter.d.ts.map +1 -0
- package/dist/utils/string-formatter.js +806 -0
- package/dist/utils/string-formatter.js.map +1 -0
- package/dist/utils/type-guards.d.ts +629 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +662 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/docs/COMPLETE-GUIDE.md +300 -0
- package/docs/MODES-ARCHITECTURE.md +565 -0
- package/docs/PRINT-MODE-GUIDE.md +456 -0
- package/docs/README.md +1 -2
- package/docs/RPC-GUIDE.md +705 -0
- package/docs/UTILS-IMPLEMENTATION-SUMMARY.md +647 -0
- package/docs/UTILS-MODULE-OVERVIEW.md +1480 -0
- package/docs/UTILS-QA-CHECKLIST.md +1061 -0
- package/docs/UTILS-USAGE-GUIDE.md +1419 -0
- package/package.json +3 -3
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Comprehensive logging utility with structured logging, log levels, and file output
|
|
3
|
+
*
|
|
4
|
+
* This module provides a complete logging system with:
|
|
5
|
+
* - Multiple log levels (debug, info, warn, error, fatal)
|
|
6
|
+
* - Structured logging with context objects
|
|
7
|
+
* - Environment-based log level filtering
|
|
8
|
+
* - Optional file logging with rotation
|
|
9
|
+
* - Performance and timing utilities
|
|
10
|
+
* - Colored console output
|
|
11
|
+
* - Prefix support for namespaced loggers
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* import { createLogger, setLogLevel, getLogLevel } from './logger';
|
|
15
|
+
*
|
|
16
|
+
* const log = createLogger('MyModule');
|
|
17
|
+
* setLogLevel('debug');
|
|
18
|
+
* log.info('Application started', { version: '1.0.0' });
|
|
19
|
+
* log.error('Database error', { code: 'DB_CONN_ERR' });
|
|
20
|
+
*
|
|
21
|
+
* @author indusagi
|
|
22
|
+
* @version 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
/** Log level enumeration */
|
|
25
|
+
export declare enum LogLevel {
|
|
26
|
+
DEBUG = 0,
|
|
27
|
+
INFO = 1,
|
|
28
|
+
WARN = 2,
|
|
29
|
+
ERROR = 3,
|
|
30
|
+
FATAL = 4
|
|
31
|
+
}
|
|
32
|
+
/** Logger configuration interface */
|
|
33
|
+
export interface LoggerConfig {
|
|
34
|
+
/** Prefix for all log messages */
|
|
35
|
+
prefix?: string;
|
|
36
|
+
/** Enable file logging */
|
|
37
|
+
fileLogging?: boolean;
|
|
38
|
+
/** Log file path */
|
|
39
|
+
logFilePath?: string;
|
|
40
|
+
/** Include timestamps */
|
|
41
|
+
includeTimestamp?: boolean;
|
|
42
|
+
/** Include caller location */
|
|
43
|
+
includeLocation?: boolean;
|
|
44
|
+
/** Maximum file size before rotation (bytes) */
|
|
45
|
+
maxFileSize?: number;
|
|
46
|
+
}
|
|
47
|
+
/** Log entry structure */
|
|
48
|
+
export interface LogEntry {
|
|
49
|
+
timestamp: string;
|
|
50
|
+
level: string;
|
|
51
|
+
prefix?: string;
|
|
52
|
+
message: string;
|
|
53
|
+
context?: Record<string, unknown>;
|
|
54
|
+
duration?: number;
|
|
55
|
+
location?: string;
|
|
56
|
+
}
|
|
57
|
+
/** Logger instance interface */
|
|
58
|
+
export interface Logger {
|
|
59
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
60
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
61
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
62
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
63
|
+
fatal(message: string, context?: Record<string, unknown>): void;
|
|
64
|
+
time(label: string): () => void;
|
|
65
|
+
group(label: string): void;
|
|
66
|
+
groupEnd(): void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a new logger instance with optional prefix
|
|
70
|
+
* @param prefix - Optional prefix for logger (e.g., module name)
|
|
71
|
+
* @param config - Optional logger configuration
|
|
72
|
+
* @returns Logger instance
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* const log = createLogger('Database');
|
|
76
|
+
* log.info('Connected to database');
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* const log = createLogger('API', { includeTimestamp: true });
|
|
80
|
+
* log.warn('High latency detected', { latency: 250 });
|
|
81
|
+
*/
|
|
82
|
+
export declare function createLogger(prefix?: string, config?: LoggerConfig): Logger;
|
|
83
|
+
/**
|
|
84
|
+
* Set the global log level
|
|
85
|
+
* @param level - Log level string or LogLevel enum
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* setLogLevel('debug');
|
|
89
|
+
* // Now all debug messages will be shown
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* setLogLevel(LogLevel.WARN);
|
|
93
|
+
* // Only warn, error, and fatal messages shown
|
|
94
|
+
*/
|
|
95
|
+
export declare function setLogLevel(level: string | LogLevel): void;
|
|
96
|
+
/**
|
|
97
|
+
* Get the current global log level
|
|
98
|
+
* @returns Current LogLevel enum value
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* const level = getLogLevel();
|
|
102
|
+
* if (level <= LogLevel.DEBUG) {
|
|
103
|
+
* performExpensiveDebugOperation();
|
|
104
|
+
* }
|
|
105
|
+
*/
|
|
106
|
+
export declare function getLogLevel(): LogLevel;
|
|
107
|
+
/**
|
|
108
|
+
* Create a grouped set of logs
|
|
109
|
+
* @param label - Group label
|
|
110
|
+
* @param fn - Function to execute within group
|
|
111
|
+
* @param logger - Logger instance
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* logGroup('User Login', async () => {
|
|
115
|
+
* log.info('Starting login process');
|
|
116
|
+
* await validateCredentials();
|
|
117
|
+
* log.info('Login successful');
|
|
118
|
+
* }, log);
|
|
119
|
+
*/
|
|
120
|
+
export declare function logGroup(label: string, fn: () => void | Promise<void>, logger: Logger): void;
|
|
121
|
+
/**
|
|
122
|
+
* Create a scoped logger with additional context
|
|
123
|
+
* @param baseLogger - Base logger instance
|
|
124
|
+
* @param scopeName - Scope identifier
|
|
125
|
+
* @param defaultContext - Default context to include in all logs
|
|
126
|
+
* @returns New scoped logger
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* const requestLog = createScopedLogger(log, 'request-123', { userId: 42 });
|
|
130
|
+
* requestLog.info('Processing request'); // Includes userId in context
|
|
131
|
+
*/
|
|
132
|
+
export declare function createScopedLogger(baseLogger: Logger, scopeName: string, defaultContext?: Record<string, unknown>): Logger;
|
|
133
|
+
/**
|
|
134
|
+
* Batch multiple log entries and output as a summary
|
|
135
|
+
* @param label - Summary label
|
|
136
|
+
* @param entries - Array of log messages
|
|
137
|
+
* @param logger - Logger instance
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* logBatch('Processing Results', [
|
|
141
|
+
* 'Processed file1.txt',
|
|
142
|
+
* 'Processed file2.txt',
|
|
143
|
+
* 'Processed file3.txt',
|
|
144
|
+
* ], log);
|
|
145
|
+
*/
|
|
146
|
+
export declare function logBatch(label: string, entries: string[], logger: Logger): void;
|
|
147
|
+
/**
|
|
148
|
+
* Clear all cached loggers
|
|
149
|
+
* @example
|
|
150
|
+
* clearLoggers();
|
|
151
|
+
*/
|
|
152
|
+
export declare function clearLoggers(): void;
|
|
153
|
+
/**
|
|
154
|
+
* Get all active logger instances
|
|
155
|
+
* @returns Array of logger prefixes
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* const activeLoggers = getActiveLoggers();
|
|
159
|
+
* expect(activeLoggers).toContain('Database');
|
|
160
|
+
*/
|
|
161
|
+
export declare function getActiveLoggers(): string[];
|
|
162
|
+
/**
|
|
163
|
+
* Create a performance monitor for tracking function execution
|
|
164
|
+
* @param logger - Logger instance
|
|
165
|
+
* @param threshold - Alert if duration exceeds threshold (ms)
|
|
166
|
+
* @returns Monitor function
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* const monitor = createPerformanceMonitor(log, 100);
|
|
170
|
+
* await monitor('database-query', async () => {
|
|
171
|
+
* return await db.query('SELECT * FROM users');
|
|
172
|
+
* });
|
|
173
|
+
*/
|
|
174
|
+
export declare function createPerformanceMonitor(logger: Logger, threshold?: number): (label: string, fn: () => Promise<unknown>) => Promise<unknown>;
|
|
175
|
+
export declare const defaultLogger: Logger;
|
|
176
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Comprehensive logging utility with structured logging, log levels, and file output
|
|
3
|
+
*
|
|
4
|
+
* This module provides a complete logging system with:
|
|
5
|
+
* - Multiple log levels (debug, info, warn, error, fatal)
|
|
6
|
+
* - Structured logging with context objects
|
|
7
|
+
* - Environment-based log level filtering
|
|
8
|
+
* - Optional file logging with rotation
|
|
9
|
+
* - Performance and timing utilities
|
|
10
|
+
* - Colored console output
|
|
11
|
+
* - Prefix support for namespaced loggers
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* import { createLogger, setLogLevel, getLogLevel } from './logger';
|
|
15
|
+
*
|
|
16
|
+
* const log = createLogger('MyModule');
|
|
17
|
+
* setLogLevel('debug');
|
|
18
|
+
* log.info('Application started', { version: '1.0.0' });
|
|
19
|
+
* log.error('Database error', { code: 'DB_CONN_ERR' });
|
|
20
|
+
*
|
|
21
|
+
* @author indusagi
|
|
22
|
+
* @version 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
/** Log level enumeration */
|
|
25
|
+
export var LogLevel;
|
|
26
|
+
(function (LogLevel) {
|
|
27
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
28
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
29
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
30
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
31
|
+
LogLevel[LogLevel["FATAL"] = 4] = "FATAL";
|
|
32
|
+
})(LogLevel || (LogLevel = {}));
|
|
33
|
+
/** Log level names for display */
|
|
34
|
+
const LOG_LEVEL_NAMES = {
|
|
35
|
+
[LogLevel.DEBUG]: 'DEBUG',
|
|
36
|
+
[LogLevel.INFO]: 'INFO',
|
|
37
|
+
[LogLevel.WARN]: 'WARN',
|
|
38
|
+
[LogLevel.ERROR]: 'ERROR',
|
|
39
|
+
[LogLevel.FATAL]: 'FATAL',
|
|
40
|
+
};
|
|
41
|
+
/** Log level colors for console output */
|
|
42
|
+
const LOG_LEVEL_COLORS = {
|
|
43
|
+
[LogLevel.DEBUG]: '\x1b[36m', // Cyan
|
|
44
|
+
[LogLevel.INFO]: '\x1b[32m', // Green
|
|
45
|
+
[LogLevel.WARN]: '\x1b[33m', // Yellow
|
|
46
|
+
[LogLevel.ERROR]: '\x1b[31m', // Red
|
|
47
|
+
[LogLevel.FATAL]: '\x1b[35m', // Magenta
|
|
48
|
+
};
|
|
49
|
+
const RESET_COLOR = '\x1b[0m';
|
|
50
|
+
/** Global logger state */
|
|
51
|
+
let currentLogLevel = parseLogLevel(process.env.LOG_LEVEL || 'info');
|
|
52
|
+
let loggers = new Map();
|
|
53
|
+
/**
|
|
54
|
+
* Parse log level from string
|
|
55
|
+
* @param levelStr - Log level string (debug, info, warn, error, fatal)
|
|
56
|
+
* @returns LogLevel enum value
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* const level = parseLogLevel('debug');
|
|
60
|
+
* expect(level).toBe(LogLevel.DEBUG);
|
|
61
|
+
*/
|
|
62
|
+
function parseLogLevel(levelStr) {
|
|
63
|
+
const normalized = levelStr.toLowerCase().trim();
|
|
64
|
+
switch (normalized) {
|
|
65
|
+
case 'debug':
|
|
66
|
+
return LogLevel.DEBUG;
|
|
67
|
+
case 'info':
|
|
68
|
+
return LogLevel.INFO;
|
|
69
|
+
case 'warn':
|
|
70
|
+
return LogLevel.WARN;
|
|
71
|
+
case 'error':
|
|
72
|
+
return LogLevel.ERROR;
|
|
73
|
+
case 'fatal':
|
|
74
|
+
return LogLevel.FATAL;
|
|
75
|
+
default:
|
|
76
|
+
return LogLevel.INFO;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create a new logger instance with optional prefix
|
|
81
|
+
* @param prefix - Optional prefix for logger (e.g., module name)
|
|
82
|
+
* @param config - Optional logger configuration
|
|
83
|
+
* @returns Logger instance
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* const log = createLogger('Database');
|
|
87
|
+
* log.info('Connected to database');
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* const log = createLogger('API', { includeTimestamp: true });
|
|
91
|
+
* log.warn('High latency detected', { latency: 250 });
|
|
92
|
+
*/
|
|
93
|
+
export function createLogger(prefix, config) {
|
|
94
|
+
const defaultConfig = {
|
|
95
|
+
prefix,
|
|
96
|
+
includeTimestamp: true,
|
|
97
|
+
includeLocation: false,
|
|
98
|
+
...config,
|
|
99
|
+
};
|
|
100
|
+
const cacheKey = prefix || '__default__';
|
|
101
|
+
if (loggers.has(cacheKey)) {
|
|
102
|
+
return loggers.get(cacheKey);
|
|
103
|
+
}
|
|
104
|
+
const logger = {
|
|
105
|
+
debug: (message, context) => logMessage(LogLevel.DEBUG, message, context, defaultConfig),
|
|
106
|
+
info: (message, context) => logMessage(LogLevel.INFO, message, context, defaultConfig),
|
|
107
|
+
warn: (message, context) => logMessage(LogLevel.WARN, message, context, defaultConfig),
|
|
108
|
+
error: (message, context) => logMessage(LogLevel.ERROR, message, context, defaultConfig),
|
|
109
|
+
fatal: (message, context) => logMessage(LogLevel.FATAL, message, context, defaultConfig),
|
|
110
|
+
time: (label) => createTimer(label, defaultConfig),
|
|
111
|
+
group: (label) => console.group(label),
|
|
112
|
+
groupEnd: () => console.groupEnd(),
|
|
113
|
+
};
|
|
114
|
+
loggers.set(cacheKey, logger);
|
|
115
|
+
return logger;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Set the global log level
|
|
119
|
+
* @param level - Log level string or LogLevel enum
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* setLogLevel('debug');
|
|
123
|
+
* // Now all debug messages will be shown
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* setLogLevel(LogLevel.WARN);
|
|
127
|
+
* // Only warn, error, and fatal messages shown
|
|
128
|
+
*/
|
|
129
|
+
export function setLogLevel(level) {
|
|
130
|
+
currentLogLevel = typeof level === 'string' ? parseLogLevel(level) : level;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get the current global log level
|
|
134
|
+
* @returns Current LogLevel enum value
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* const level = getLogLevel();
|
|
138
|
+
* if (level <= LogLevel.DEBUG) {
|
|
139
|
+
* performExpensiveDebugOperation();
|
|
140
|
+
* }
|
|
141
|
+
*/
|
|
142
|
+
export function getLogLevel() {
|
|
143
|
+
return currentLogLevel;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Format context object to JSON string
|
|
147
|
+
* @param context - Context object to format
|
|
148
|
+
* @returns Formatted JSON string
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* const formatted = formatContext({ user: 'john', age: 30 });
|
|
152
|
+
* expect(formatted).toContain('user');
|
|
153
|
+
*/
|
|
154
|
+
function formatContext(context) {
|
|
155
|
+
if (!context || Object.keys(context).length === 0) {
|
|
156
|
+
return '';
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
return ` ${JSON.stringify(context)}`;
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
return ' [Context serialization error]';
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get caller location information
|
|
167
|
+
* @returns Location string in format "file:line:column"
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* const location = getCallerLocation();
|
|
171
|
+
* // Returns something like "logger.ts:120:15"
|
|
172
|
+
*/
|
|
173
|
+
function getCallerLocation() {
|
|
174
|
+
const stack = new Error().stack?.split('\n')[4];
|
|
175
|
+
if (!stack)
|
|
176
|
+
return 'unknown';
|
|
177
|
+
const match = stack.match(/\(([^:]+):(\d+):(\d+)\)/);
|
|
178
|
+
if (match) {
|
|
179
|
+
const file = match[1].split('/').pop();
|
|
180
|
+
return `${file}:${match[2]}:${match[3]}`;
|
|
181
|
+
}
|
|
182
|
+
return 'unknown';
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Internal function to log a message at specified level
|
|
186
|
+
* @param level - Log level
|
|
187
|
+
* @param message - Message to log
|
|
188
|
+
* @param context - Optional context object
|
|
189
|
+
* @param config - Logger configuration
|
|
190
|
+
*/
|
|
191
|
+
function logMessage(level, message, context, config) {
|
|
192
|
+
// Check if this level should be logged
|
|
193
|
+
if (level < currentLogLevel) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const timestamp = new Date().toISOString();
|
|
197
|
+
const levelName = LOG_LEVEL_NAMES[level];
|
|
198
|
+
const color = LOG_LEVEL_COLORS[level];
|
|
199
|
+
const location = config?.includeLocation ? ` [${getCallerLocation()}]` : '';
|
|
200
|
+
const prefix = config?.prefix ? `[${config.prefix}]` : '';
|
|
201
|
+
const contextStr = formatContext(context);
|
|
202
|
+
const logLine = `${color}[${timestamp}] ${levelName}${RESET_COLOR} ${prefix} ${message}${location}${contextStr}`;
|
|
203
|
+
// Output to console
|
|
204
|
+
if (level >= LogLevel.ERROR) {
|
|
205
|
+
console.error(logLine);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
console.log(logLine);
|
|
209
|
+
}
|
|
210
|
+
// File logging could be implemented here
|
|
211
|
+
// writeToLogFile(logLine, config?.logFilePath);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Create a timer function for performance logging
|
|
215
|
+
* @param label - Timer label
|
|
216
|
+
* @param config - Logger configuration
|
|
217
|
+
* @returns Timer end function
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* const endTimer = logger.time('database-query');
|
|
221
|
+
* await performDatabaseQuery();
|
|
222
|
+
* endTimer(); // Logs: "database-query: 150ms"
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* const timer = logger.time('api-request');
|
|
226
|
+
* setTimeout(timer, 1000);
|
|
227
|
+
* // Logs: "api-request: 1000ms"
|
|
228
|
+
*/
|
|
229
|
+
function createTimer(label, config) {
|
|
230
|
+
const startTime = performance.now();
|
|
231
|
+
return () => {
|
|
232
|
+
const duration = performance.now() - startTime;
|
|
233
|
+
const durationStr = duration < 1000 ? `${duration.toFixed(2)}ms` : `${(duration / 1000).toFixed(2)}s`;
|
|
234
|
+
logMessage(LogLevel.DEBUG, `${label}: ${durationStr}`, undefined, config);
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Create a grouped set of logs
|
|
239
|
+
* @param label - Group label
|
|
240
|
+
* @param fn - Function to execute within group
|
|
241
|
+
* @param logger - Logger instance
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* logGroup('User Login', async () => {
|
|
245
|
+
* log.info('Starting login process');
|
|
246
|
+
* await validateCredentials();
|
|
247
|
+
* log.info('Login successful');
|
|
248
|
+
* }, log);
|
|
249
|
+
*/
|
|
250
|
+
export function logGroup(label, fn, logger) {
|
|
251
|
+
logger.group(label);
|
|
252
|
+
fn();
|
|
253
|
+
logger.groupEnd();
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Create a scoped logger with additional context
|
|
257
|
+
* @param baseLogger - Base logger instance
|
|
258
|
+
* @param scopeName - Scope identifier
|
|
259
|
+
* @param defaultContext - Default context to include in all logs
|
|
260
|
+
* @returns New scoped logger
|
|
261
|
+
*
|
|
262
|
+
* @example
|
|
263
|
+
* const requestLog = createScopedLogger(log, 'request-123', { userId: 42 });
|
|
264
|
+
* requestLog.info('Processing request'); // Includes userId in context
|
|
265
|
+
*/
|
|
266
|
+
export function createScopedLogger(baseLogger, scopeName, defaultContext) {
|
|
267
|
+
return {
|
|
268
|
+
debug: (message, context) => baseLogger.debug(message, { ...defaultContext, ...context, scope: scopeName }),
|
|
269
|
+
info: (message, context) => baseLogger.info(message, { ...defaultContext, ...context, scope: scopeName }),
|
|
270
|
+
warn: (message, context) => baseLogger.warn(message, { ...defaultContext, ...context, scope: scopeName }),
|
|
271
|
+
error: (message, context) => baseLogger.error(message, { ...defaultContext, ...context, scope: scopeName }),
|
|
272
|
+
fatal: (message, context) => baseLogger.fatal(message, { ...defaultContext, ...context, scope: scopeName }),
|
|
273
|
+
time: (label) => baseLogger.time(`${scopeName}:${label}`),
|
|
274
|
+
group: (label) => baseLogger.group(label),
|
|
275
|
+
groupEnd: () => baseLogger.groupEnd(),
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Batch multiple log entries and output as a summary
|
|
280
|
+
* @param label - Summary label
|
|
281
|
+
* @param entries - Array of log messages
|
|
282
|
+
* @param logger - Logger instance
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* logBatch('Processing Results', [
|
|
286
|
+
* 'Processed file1.txt',
|
|
287
|
+
* 'Processed file2.txt',
|
|
288
|
+
* 'Processed file3.txt',
|
|
289
|
+
* ], log);
|
|
290
|
+
*/
|
|
291
|
+
export function logBatch(label, entries, logger) {
|
|
292
|
+
logger.group(label);
|
|
293
|
+
entries.forEach((entry) => logger.info(entry));
|
|
294
|
+
logger.groupEnd();
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Clear all cached loggers
|
|
298
|
+
* @example
|
|
299
|
+
* clearLoggers();
|
|
300
|
+
*/
|
|
301
|
+
export function clearLoggers() {
|
|
302
|
+
loggers.clear();
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get all active logger instances
|
|
306
|
+
* @returns Array of logger prefixes
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* const activeLoggers = getActiveLoggers();
|
|
310
|
+
* expect(activeLoggers).toContain('Database');
|
|
311
|
+
*/
|
|
312
|
+
export function getActiveLoggers() {
|
|
313
|
+
return Array.from(loggers.keys()).filter((key) => key !== '__default__');
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Create a performance monitor for tracking function execution
|
|
317
|
+
* @param logger - Logger instance
|
|
318
|
+
* @param threshold - Alert if duration exceeds threshold (ms)
|
|
319
|
+
* @returns Monitor function
|
|
320
|
+
*
|
|
321
|
+
* @example
|
|
322
|
+
* const monitor = createPerformanceMonitor(log, 100);
|
|
323
|
+
* await monitor('database-query', async () => {
|
|
324
|
+
* return await db.query('SELECT * FROM users');
|
|
325
|
+
* });
|
|
326
|
+
*/
|
|
327
|
+
export function createPerformanceMonitor(logger, threshold = 1000) {
|
|
328
|
+
return async (label, fn) => {
|
|
329
|
+
const startTime = performance.now();
|
|
330
|
+
try {
|
|
331
|
+
const result = await fn();
|
|
332
|
+
const duration = performance.now() - startTime;
|
|
333
|
+
const level = duration > threshold ? 'warn' : 'debug';
|
|
334
|
+
logger[level](`${label} completed`, { duration: `${duration.toFixed(2)}ms` });
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
const duration = performance.now() - startTime;
|
|
339
|
+
logger.error(`${label} failed`, { error: String(error), duration: `${duration.toFixed(2)}ms` });
|
|
340
|
+
throw error;
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
// Default export
|
|
345
|
+
export const defaultLogger = createLogger('default');
|
|
346
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|