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.
Files changed (222) hide show
  1. package/CHANGELOG.md +72 -11
  2. package/README.md +2 -36
  3. package/dist/cli/args.d.ts +117 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +231 -64
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts +58 -2
  8. package/dist/cli/config-selector.d.ts.map +1 -1
  9. package/dist/cli/config-selector.js +130 -12
  10. package/dist/cli/config-selector.js.map +1 -1
  11. package/dist/cli/file-processor.d.ts +70 -2
  12. package/dist/cli/file-processor.d.ts.map +1 -1
  13. package/dist/cli/file-processor.js +240 -15
  14. package/dist/cli/file-processor.js.map +1 -1
  15. package/dist/cli/list-models.d.ts +63 -3
  16. package/dist/cli/list-models.d.ts.map +1 -1
  17. package/dist/cli/list-models.js +202 -27
  18. package/dist/cli/list-models.js.map +1 -1
  19. package/dist/cli/login-handler.d.ts +82 -8
  20. package/dist/cli/login-handler.d.ts.map +1 -1
  21. package/dist/cli/login-handler.js +410 -77
  22. package/dist/cli/login-handler.js.map +1 -1
  23. package/dist/cli/session-picker.d.ts +74 -2
  24. package/dist/cli/session-picker.d.ts.map +1 -1
  25. package/dist/cli/session-picker.js +236 -12
  26. package/dist/cli/session-picker.js.map +1 -1
  27. package/dist/core/agent-session.d.ts +214 -9
  28. package/dist/core/agent-session.d.ts.map +1 -1
  29. package/dist/core/agent-session.js +214 -9
  30. package/dist/core/agent-session.js.map +1 -1
  31. package/dist/core/bash-executor.d.ts +302 -12
  32. package/dist/core/bash-executor.d.ts.map +1 -1
  33. package/dist/core/bash-executor.js +302 -12
  34. package/dist/core/bash-executor.js.map +1 -1
  35. package/dist/core/diagnostics.d.ts +191 -0
  36. package/dist/core/diagnostics.d.ts.map +1 -1
  37. package/dist/core/diagnostics.js +142 -0
  38. package/dist/core/diagnostics.js.map +1 -1
  39. package/dist/core/event-bus.d.ts +146 -0
  40. package/dist/core/event-bus.d.ts.map +1 -1
  41. package/dist/core/event-bus.js +93 -0
  42. package/dist/core/event-bus.js.map +1 -1
  43. package/dist/core/export-html/ansi-to-html.d.ts +4 -0
  44. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  45. package/dist/core/export-html/ansi-to-html.js +4 -0
  46. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  47. package/dist/core/export-html/index.d.ts +128 -0
  48. package/dist/core/export-html/index.d.ts.map +1 -1
  49. package/dist/core/export-html/index.js +128 -0
  50. package/dist/core/export-html/index.js.map +1 -1
  51. package/dist/core/export-html/tool-renderer.d.ts +4 -0
  52. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  53. package/dist/core/export-html/tool-renderer.js +4 -0
  54. package/dist/core/export-html/tool-renderer.js.map +1 -1
  55. package/dist/core/keybindings.d.ts +142 -0
  56. package/dist/core/keybindings.d.ts.map +1 -1
  57. package/dist/core/keybindings.js +142 -0
  58. package/dist/core/keybindings.js.map +1 -1
  59. package/dist/core/model-registry.d.ts +98 -1
  60. package/dist/core/model-registry.d.ts.map +1 -1
  61. package/dist/core/model-registry.js +98 -1
  62. package/dist/core/model-registry.js.map +1 -1
  63. package/dist/core/model-resolver.d.ts +99 -1
  64. package/dist/core/model-resolver.d.ts.map +1 -1
  65. package/dist/core/model-resolver.js +99 -1
  66. package/dist/core/model-resolver.js.map +1 -1
  67. package/dist/core/prompt-templates.js.map +1 -1
  68. package/dist/core/sdk.d.ts +1 -1
  69. package/dist/core/sdk.d.ts.map +1 -1
  70. package/dist/core/sdk.js +0 -2
  71. package/dist/core/sdk.js.map +1 -1
  72. package/dist/core/session-manager.d.ts +127 -0
  73. package/dist/core/session-manager.d.ts.map +1 -1
  74. package/dist/core/session-manager.js +125 -0
  75. package/dist/core/session-manager.js.map +1 -1
  76. package/dist/core/skills.js.map +1 -1
  77. package/dist/core/subagents.js.map +1 -1
  78. package/dist/core/tools/bash.d.ts +391 -11
  79. package/dist/core/tools/bash.d.ts.map +1 -1
  80. package/dist/core/tools/bash.js +269 -2
  81. package/dist/core/tools/bash.js.map +1 -1
  82. package/dist/core/tools/edit.d.ts +284 -6
  83. package/dist/core/tools/edit.d.ts.map +1 -1
  84. package/dist/core/tools/edit.js +238 -0
  85. package/dist/core/tools/edit.js.map +1 -1
  86. package/dist/core/tools/find.d.ts +169 -5
  87. package/dist/core/tools/find.d.ts.map +1 -1
  88. package/dist/core/tools/find.js +136 -0
  89. package/dist/core/tools/find.js.map +1 -1
  90. package/dist/core/tools/grep.d.ts +285 -5
  91. package/dist/core/tools/grep.d.ts.map +1 -1
  92. package/dist/core/tools/grep.js +247 -0
  93. package/dist/core/tools/grep.js.map +1 -1
  94. package/dist/core/tools/index.d.ts +0 -18
  95. package/dist/core/tools/index.d.ts.map +1 -1
  96. package/dist/core/tools/index.js +1 -23
  97. package/dist/core/tools/index.js.map +1 -1
  98. package/dist/core/tools/ls.d.ts +6 -0
  99. package/dist/core/tools/ls.d.ts.map +1 -1
  100. package/dist/core/tools/ls.js +6 -0
  101. package/dist/core/tools/ls.js.map +1 -1
  102. package/dist/core/tools/read.d.ts +308 -7
  103. package/dist/core/tools/read.d.ts.map +1 -1
  104. package/dist/core/tools/read.js +231 -0
  105. package/dist/core/tools/read.js.map +1 -1
  106. package/dist/core/tools/webfetch.d.ts +118 -3
  107. package/dist/core/tools/webfetch.d.ts.map +1 -1
  108. package/dist/core/tools/webfetch.js +118 -3
  109. package/dist/core/tools/webfetch.js.map +1 -1
  110. package/dist/core/tools/websearch.d.ts +130 -3
  111. package/dist/core/tools/websearch.d.ts.map +1 -1
  112. package/dist/core/tools/websearch.js +130 -3
  113. package/dist/core/tools/websearch.js.map +1 -1
  114. package/dist/core/tools/write.d.ts +251 -5
  115. package/dist/core/tools/write.d.ts.map +1 -1
  116. package/dist/core/tools/write.js +210 -0
  117. package/dist/core/tools/write.js.map +1 -1
  118. package/dist/modes/interactive/components/assistant-message.d.ts +164 -1
  119. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  120. package/dist/modes/interactive/components/assistant-message.js +164 -1
  121. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  122. package/dist/modes/interactive/components/bash-execution.d.ts +297 -1
  123. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  124. package/dist/modes/interactive/components/bash-execution.js +297 -1
  125. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  126. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  127. package/dist/modes/interactive/components/tool-execution.js +251 -1
  128. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  129. package/dist/modes/interactive/components/user-message.d.ts +186 -1
  130. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  131. package/dist/modes/interactive/components/user-message.js +186 -1
  132. package/dist/modes/interactive/components/user-message.js.map +1 -1
  133. package/dist/modes/interactive/interactive-mode.d.ts +1567 -13
  134. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  135. package/dist/modes/interactive/interactive-mode.js +1567 -13
  136. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  137. package/dist/modes/interactive/theme/theme.d.ts +422 -0
  138. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  139. package/dist/modes/interactive/theme/theme.js +422 -0
  140. package/dist/modes/interactive/theme/theme.js.map +1 -1
  141. package/dist/modes/print-mode.d.ts +538 -5
  142. package/dist/modes/print-mode.d.ts.map +1 -1
  143. package/dist/modes/print-mode.js +538 -5
  144. package/dist/modes/print-mode.js.map +1 -1
  145. package/dist/modes/rpc/rpc-client.d.ts +921 -8
  146. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  147. package/dist/modes/rpc/rpc-client.js +921 -8
  148. package/dist/modes/rpc/rpc-client.js.map +1 -1
  149. package/dist/modes/rpc/rpc-mode.d.ts +802 -9
  150. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  151. package/dist/modes/rpc/rpc-mode.js +802 -9
  152. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  153. package/dist/modes/rpc/rpc-types.d.ts +356 -3
  154. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  155. package/dist/modes/rpc/rpc-types.js +356 -3
  156. package/dist/modes/rpc/rpc-types.js.map +1 -1
  157. package/dist/modes/shared.d.ts +386 -0
  158. package/dist/modes/shared.d.ts.map +1 -0
  159. package/dist/modes/shared.js +543 -0
  160. package/dist/modes/shared.js.map +1 -0
  161. package/dist/utils/array.d.ts +389 -0
  162. package/dist/utils/array.d.ts.map +1 -0
  163. package/dist/utils/array.js +585 -0
  164. package/dist/utils/array.js.map +1 -0
  165. package/dist/utils/color-formatter.d.ts +318 -0
  166. package/dist/utils/color-formatter.d.ts.map +1 -0
  167. package/dist/utils/color-formatter.js +442 -0
  168. package/dist/utils/color-formatter.js.map +1 -0
  169. package/dist/utils/data-transformer.d.ts +326 -0
  170. package/dist/utils/data-transformer.d.ts.map +1 -0
  171. package/dist/utils/data-transformer.js +512 -0
  172. package/dist/utils/data-transformer.js.map +1 -0
  173. package/dist/utils/date-formatter.d.ts +281 -0
  174. package/dist/utils/date-formatter.d.ts.map +1 -0
  175. package/dist/utils/date-formatter.js +503 -0
  176. package/dist/utils/date-formatter.js.map +1 -0
  177. package/dist/utils/error-handler.d.ts +541 -0
  178. package/dist/utils/error-handler.d.ts.map +1 -0
  179. package/dist/utils/error-handler.js +726 -0
  180. package/dist/utils/error-handler.js.map +1 -0
  181. package/dist/utils/file-operations.d.ts +297 -0
  182. package/dist/utils/file-operations.d.ts.map +1 -0
  183. package/dist/utils/file-operations.js +505 -0
  184. package/dist/utils/file-operations.js.map +1 -0
  185. package/dist/utils/frontmatter.d.ts +268 -6
  186. package/dist/utils/frontmatter.d.ts.map +1 -1
  187. package/dist/utils/frontmatter.js +500 -21
  188. package/dist/utils/frontmatter.js.map +1 -1
  189. package/dist/utils/json-formatter.d.ts +259 -0
  190. package/dist/utils/json-formatter.d.ts.map +1 -0
  191. package/dist/utils/json-formatter.js +517 -0
  192. package/dist/utils/json-formatter.js.map +1 -0
  193. package/dist/utils/logger.d.ts +176 -0
  194. package/dist/utils/logger.d.ts.map +1 -0
  195. package/dist/utils/logger.js +346 -0
  196. package/dist/utils/logger.js.map +1 -0
  197. package/dist/utils/markdown-formatter.d.ts +211 -0
  198. package/dist/utils/markdown-formatter.d.ts.map +1 -0
  199. package/dist/utils/markdown-formatter.js +482 -0
  200. package/dist/utils/markdown-formatter.js.map +1 -0
  201. package/dist/utils/path-validator.d.ts +603 -0
  202. package/dist/utils/path-validator.d.ts.map +1 -0
  203. package/dist/utils/path-validator.js +870 -0
  204. package/dist/utils/path-validator.js.map +1 -0
  205. package/dist/utils/string-formatter.d.ts +609 -0
  206. package/dist/utils/string-formatter.d.ts.map +1 -0
  207. package/dist/utils/string-formatter.js +806 -0
  208. package/dist/utils/string-formatter.js.map +1 -0
  209. package/dist/utils/type-guards.d.ts +629 -0
  210. package/dist/utils/type-guards.d.ts.map +1 -0
  211. package/dist/utils/type-guards.js +662 -0
  212. package/dist/utils/type-guards.js.map +1 -0
  213. package/docs/COMPLETE-GUIDE.md +300 -0
  214. package/docs/MODES-ARCHITECTURE.md +565 -0
  215. package/docs/PRINT-MODE-GUIDE.md +456 -0
  216. package/docs/README.md +1 -2
  217. package/docs/RPC-GUIDE.md +705 -0
  218. package/docs/UTILS-IMPLEMENTATION-SUMMARY.md +647 -0
  219. package/docs/UTILS-MODULE-OVERVIEW.md +1480 -0
  220. package/docs/UTILS-QA-CHECKLIST.md +1061 -0
  221. package/docs/UTILS-USAGE-GUIDE.md +1419 -0
  222. 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,4BAA4B;AAC5B,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;IACT,yCAAS,CAAA;AACX,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AAED,kCAAkC;AAClC,MAAM,eAAe,GAA6B;IAChD,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;IACzB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IACvB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IACvB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;IACzB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;CAC1B,CAAC;AAEF,0CAA0C;AAC1C,MAAM,gBAAgB,GAA6B;IACjD,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,OAAO;IACrC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ;IACrC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS;IACtC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,MAAM;IACpC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,UAAU;CACzC,CAAC;AAEF,MAAM,WAAW,GAAG,SAAS,CAAC;AAyC9B,0BAA0B;AAC1B,IAAI,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;AACrE,IAAI,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;AAE7C;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACjD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB;YACE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAAC,MAAe,EAAE,MAAqB;IACjE,MAAM,aAAa,GAAiB;QAClC,MAAM;QACN,gBAAgB,EAAE,IAAI;QACtB,eAAe,EAAE,KAAK;QACtB,GAAG,MAAM;KACV,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,aAAa,CAAC;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAW;QACrB,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC1B,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC;QAC7D,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CACzB,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC;QAC5D,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CACzB,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC;QAC5D,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC1B,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC;QAC7D,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC1B,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC;QAC7D,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC;QAClD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QACtC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE;KACnC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,KAAwB;IAClD,eAAe,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,OAAiC;IACtD,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,gCAAgC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACrD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACvC,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,KAAe,EACf,OAAe,EACf,OAAiC,EACjC,MAAqB;IAErB,uCAAuC;IACvC,IAAI,KAAK,GAAG,eAAe,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI,SAAS,KAAK,SAAS,GAAG,WAAW,IAAI,MAAM,IAAI,OAAO,GAAG,QAAQ,GAAG,UAAU,EAAE,CAAC;IAEjH,oBAAoB;IACpB,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,yCAAyC;IACzC,gDAAgD;AAClD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,WAAW,CAAC,KAAa,EAAE,MAAqB;IACvD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEpC,OAAO,GAAG,EAAE;QACV,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC/C,MAAM,WAAW,GACf,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACpF,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,KAAK,KAAK,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAa,EACb,EAA8B,EAC9B,MAAc;IAEd,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpB,EAAE,EAAE,CAAC;IACL,MAAM,CAAC,QAAQ,EAAE,CAAC;AACpB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,SAAiB,EACjB,cAAwC;IAExC,OAAO;QACL,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC1B,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAChF,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CACzB,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC/E,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CACzB,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC/E,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC1B,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAChF,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC1B,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAChF,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,KAAK,EAAE,CAAC;QACzD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;QACzC,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE;KACtC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAa,EACb,OAAiB,EACjB,MAAc;IAEd,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,QAAQ,EAAE,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAc,EACd,SAAS,GAAG,IAAI;IAEhB,OAAO,KAAK,EAAE,KAAa,EAAE,EAA0B,EAAoB,EAAE;QAC3E,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC/C,MAAM,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,CACX,GAAG,KAAK,YAAY,EACpB,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CACzC,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAChG,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC"}