@loxia-labs/loxia-autopilot-one 1.0.1 → 1.0.3

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 (120) hide show
  1. package/README.md +44 -54
  2. package/bin/cli.js +1 -115
  3. package/bin/loxia-terminal-v2.js +3 -0
  4. package/bin/loxia-terminal.js +3 -0
  5. package/bin/start-with-terminal.js +3 -0
  6. package/package.json +14 -15
  7. package/scripts/install-scanners.js +1 -235
  8. package/src/analyzers/CSSAnalyzer.js +1 -297
  9. package/src/analyzers/ConfigValidator.js +1 -690
  10. package/src/analyzers/ESLintAnalyzer.js +1 -320
  11. package/src/analyzers/JavaScriptAnalyzer.js +1 -261
  12. package/src/analyzers/PrettierFormatter.js +1 -247
  13. package/src/analyzers/PythonAnalyzer.js +1 -266
  14. package/src/analyzers/SecurityAnalyzer.js +1 -729
  15. package/src/analyzers/TypeScriptAnalyzer.js +1 -247
  16. package/src/analyzers/codeCloneDetector/analyzer.js +1 -344
  17. package/src/analyzers/codeCloneDetector/detector.js +1 -203
  18. package/src/analyzers/codeCloneDetector/index.js +1 -160
  19. package/src/analyzers/codeCloneDetector/parser.js +1 -199
  20. package/src/analyzers/codeCloneDetector/reporter.js +1 -148
  21. package/src/analyzers/codeCloneDetector/scanner.js +1 -59
  22. package/src/core/agentPool.js +1 -1474
  23. package/src/core/agentScheduler.js +1 -2147
  24. package/src/core/contextManager.js +1 -709
  25. package/src/core/messageProcessor.js +1 -732
  26. package/src/core/orchestrator.js +1 -548
  27. package/src/core/stateManager.js +1 -877
  28. package/src/index.js +1 -631
  29. package/src/interfaces/cli.js +1 -549
  30. package/src/interfaces/terminal/__tests__/smoke/advancedFeatures.test.js +1 -0
  31. package/src/interfaces/terminal/__tests__/smoke/agentControl.test.js +1 -0
  32. package/src/interfaces/terminal/__tests__/smoke/agents.test.js +1 -0
  33. package/src/interfaces/terminal/__tests__/smoke/components.test.js +1 -0
  34. package/src/interfaces/terminal/__tests__/smoke/connection.test.js +1 -0
  35. package/src/interfaces/terminal/__tests__/smoke/enhancements.test.js +1 -0
  36. package/src/interfaces/terminal/__tests__/smoke/imports.test.js +1 -0
  37. package/src/interfaces/terminal/__tests__/smoke/messages.test.js +1 -0
  38. package/src/interfaces/terminal/__tests__/smoke/tools.test.js +1 -0
  39. package/src/interfaces/terminal/api/apiClient.js +1 -0
  40. package/src/interfaces/terminal/api/messageRouter.js +1 -0
  41. package/src/interfaces/terminal/api/session.js +1 -0
  42. package/src/interfaces/terminal/api/websocket.js +1 -0
  43. package/src/interfaces/terminal/components/AgentCreator.js +1 -0
  44. package/src/interfaces/terminal/components/AgentEditor.js +1 -0
  45. package/src/interfaces/terminal/components/AgentSwitcher.js +1 -0
  46. package/src/interfaces/terminal/components/ErrorBoundary.js +1 -0
  47. package/src/interfaces/terminal/components/ErrorPanel.js +1 -0
  48. package/src/interfaces/terminal/components/Header.js +1 -0
  49. package/src/interfaces/terminal/components/HelpPanel.js +1 -0
  50. package/src/interfaces/terminal/components/InputBox.js +1 -0
  51. package/src/interfaces/terminal/components/Layout.js +1 -0
  52. package/src/interfaces/terminal/components/LoadingSpinner.js +1 -0
  53. package/src/interfaces/terminal/components/MessageList.js +1 -0
  54. package/src/interfaces/terminal/components/MultilineTextInput.js +1 -0
  55. package/src/interfaces/terminal/components/SearchPanel.js +1 -0
  56. package/src/interfaces/terminal/components/SettingsPanel.js +1 -0
  57. package/src/interfaces/terminal/components/StatusBar.js +1 -0
  58. package/src/interfaces/terminal/components/TextInput.js +1 -0
  59. package/src/interfaces/terminal/config/agentEditorConstants.js +1 -0
  60. package/src/interfaces/terminal/config/constants.js +1 -0
  61. package/src/interfaces/terminal/index.js +1 -0
  62. package/src/interfaces/terminal/state/useAgentControl.js +1 -0
  63. package/src/interfaces/terminal/state/useAgents.js +1 -0
  64. package/src/interfaces/terminal/state/useConnection.js +1 -0
  65. package/src/interfaces/terminal/state/useMessages.js +1 -0
  66. package/src/interfaces/terminal/state/useTools.js +1 -0
  67. package/src/interfaces/terminal/utils/debugLogger.js +1 -0
  68. package/src/interfaces/terminal/utils/settingsStorage.js +1 -0
  69. package/src/interfaces/terminal/utils/theme.js +1 -0
  70. package/src/interfaces/webServer.js +1 -2162
  71. package/src/modules/fileExplorer/controller.js +1 -280
  72. package/src/modules/fileExplorer/index.js +1 -37
  73. package/src/modules/fileExplorer/middleware.js +1 -92
  74. package/src/modules/fileExplorer/routes.js +1 -125
  75. package/src/modules/fileExplorer/types.js +1 -44
  76. package/src/services/aiService.js +1 -1232
  77. package/src/services/apiKeyManager.js +1 -164
  78. package/src/services/benchmarkService.js +1 -366
  79. package/src/services/budgetService.js +1 -539
  80. package/src/services/contextInjectionService.js +1 -247
  81. package/src/services/conversationCompactionService.js +1 -637
  82. package/src/services/errorHandler.js +1 -810
  83. package/src/services/fileAttachmentService.js +1 -544
  84. package/src/services/modelRouterService.js +1 -366
  85. package/src/services/modelsService.js +1 -322
  86. package/src/services/qualityInspector.js +1 -796
  87. package/src/services/tokenCountingService.js +1 -536
  88. package/src/tools/agentCommunicationTool.js +1 -1344
  89. package/src/tools/agentDelayTool.js +1 -485
  90. package/src/tools/asyncToolManager.js +1 -604
  91. package/src/tools/baseTool.js +1 -800
  92. package/src/tools/browserTool.js +1 -920
  93. package/src/tools/cloneDetectionTool.js +1 -621
  94. package/src/tools/dependencyResolverTool.js +1 -1215
  95. package/src/tools/fileContentReplaceTool.js +1 -875
  96. package/src/tools/fileSystemTool.js +1 -1107
  97. package/src/tools/fileTreeTool.js +1 -853
  98. package/src/tools/imageTool.js +1 -901
  99. package/src/tools/importAnalyzerTool.js +1 -1060
  100. package/src/tools/jobDoneTool.js +1 -248
  101. package/src/tools/seekTool.js +1 -956
  102. package/src/tools/staticAnalysisTool.js +1 -1778
  103. package/src/tools/taskManagerTool.js +1 -2873
  104. package/src/tools/terminalTool.js +1 -2304
  105. package/src/tools/webTool.js +1 -1430
  106. package/src/types/agent.js +1 -519
  107. package/src/types/contextReference.js +1 -972
  108. package/src/types/conversation.js +1 -730
  109. package/src/types/toolCommand.js +1 -747
  110. package/src/utilities/attachmentValidator.js +1 -292
  111. package/src/utilities/configManager.js +1 -582
  112. package/src/utilities/constants.js +1 -722
  113. package/src/utilities/directoryAccessManager.js +1 -535
  114. package/src/utilities/fileProcessor.js +1 -307
  115. package/src/utilities/logger.js +1 -436
  116. package/src/utilities/tagParser.js +1 -1246
  117. package/src/utilities/toolConstants.js +1 -317
  118. package/web-ui/build/index.html +2 -2
  119. package/web-ui/build/static/{index-Dy2bYbOa.css → index-CClD1090.css} +1 -1
  120. package/web-ui/build/static/{index-CjkkcnFA.js → index-lCBai6dX.js} +66 -67
@@ -1,436 +1 @@
1
- /**
2
- * Logger - Centralized logging system for the Loxia AI Agents System
3
- *
4
- * Purpose:
5
- * - Structured logging with different levels
6
- * - Agent activity logging
7
- * - Tool execution logging
8
- * - System event logging
9
- * - Log output management (console, file)
10
- */
11
-
12
- import { promises as fs } from 'fs';
13
- import path from 'path';
14
-
15
- import {
16
- SYSTEM_VERSION
17
- } from './constants.js';
18
-
19
- class Logger {
20
- constructor(config = {}) {
21
- this.config = config;
22
-
23
- // Log levels in order of severity
24
- this.levels = {
25
- error: 0,
26
- warn: 1,
27
- info: 2,
28
- debug: 3
29
- };
30
-
31
- this.currentLevel = this.levels[config.level || 'info'];
32
- this.outputs = config.outputs || ['console'];
33
- this.logFile = config.logFile || null;
34
- this.maxFileSize = config.maxFileSize || 10 * 1024 * 1024; // 10MB
35
- this.maxFiles = config.maxFiles || 5;
36
-
37
- // Log formatting
38
- this.enableColors = config.colors !== false;
39
- this.includeTimestamp = config.timestamp !== false;
40
- this.includeLevel = config.includeLevel !== false;
41
-
42
- // Color codes for console output
43
- this.colors = {
44
- error: '\x1b[31m', // Red
45
- warn: '\x1b[33m', // Yellow
46
- info: '\x1b[36m', // Cyan
47
- debug: '\x1b[90m', // Gray
48
- reset: '\x1b[0m'
49
- };
50
-
51
- this.initialized = false;
52
- }
53
-
54
- /**
55
- * Initialize logger
56
- * @returns {Promise<void>}
57
- */
58
- async initialize() {
59
- if (this.initialized) return;
60
-
61
- try {
62
- // Create log directory if file output is enabled
63
- if (this.outputs.includes('file') && this.logFile) {
64
- const logDir = path.dirname(this.logFile);
65
- await fs.mkdir(logDir, { recursive: true });
66
- }
67
-
68
- this.initialized = true;
69
- this.info('Logger initialized', {
70
- level: Object.keys(this.levels)[this.currentLevel],
71
- outputs: this.outputs,
72
- logFile: this.logFile
73
- });
74
-
75
- } catch (error) {
76
- console.error('Logger initialization failed:', error.message);
77
- }
78
- }
79
-
80
- /**
81
- * Log error message
82
- * @param {string} message - Log message
83
- * @param {Object} meta - Additional metadata
84
- */
85
- error(message, meta = {}) {
86
- this.log('error', message, meta);
87
- }
88
-
89
- /**
90
- * Log warning message
91
- * @param {string} message - Log message
92
- * @param {Object} meta - Additional metadata
93
- */
94
- warn(message, meta = {}) {
95
- this.log('warn', message, meta);
96
- }
97
-
98
- /**
99
- * Log info message
100
- * @param {string} message - Log message
101
- * @param {Object} meta - Additional metadata
102
- */
103
- info(message, meta = {}) {
104
- this.log('info', message, meta);
105
- }
106
-
107
- /**
108
- * Log debug message
109
- * @param {string} message - Log message
110
- * @param {Object} meta - Additional metadata
111
- */
112
- debug(message, meta = {}) {
113
- this.log('debug', message, meta);
114
- }
115
-
116
- /**
117
- * Log agent activity
118
- * @param {string} agentId - Agent identifier
119
- * @param {string} action - Action performed
120
- * @param {Object} details - Action details
121
- */
122
- logAgentActivity(agentId, action, details = {}) {
123
- this.info(`[AGENT:${agentId}] ${action}`, {
124
- category: 'agent-activity',
125
- agentId,
126
- action,
127
- ...details
128
- });
129
- }
130
-
131
- /**
132
- * Log tool execution
133
- * @param {string} toolId - Tool identifier
134
- * @param {string} operationId - Operation identifier
135
- * @param {string} status - Execution status
136
- * @param {number} duration - Execution duration in ms
137
- * @param {Object} details - Additional details
138
- */
139
- logToolExecution(toolId, operationId, status, duration, details = {}) {
140
- const level = status === 'failed' ? 'error' : 'info';
141
- this[level](`[TOOL:${toolId}] Operation ${operationId} ${status} (${duration}ms)`, {
142
- category: 'tool-execution',
143
- toolId,
144
- operationId,
145
- status,
146
- duration,
147
- ...details
148
- });
149
- }
150
-
151
- /**
152
- * Log system event
153
- * @param {string} event - Event name
154
- * @param {Object} context - Event context
155
- */
156
- logSystemEvent(event, context = {}) {
157
- this.info(`[SYSTEM] ${event}`, {
158
- category: 'system-event',
159
- event,
160
- ...context
161
- });
162
- }
163
-
164
- /**
165
- * Log API request/response
166
- * @param {string} method - HTTP method
167
- * @param {string} url - Request URL
168
- * @param {number} status - Response status
169
- * @param {number} duration - Request duration in ms
170
- * @param {Object} details - Additional details
171
- */
172
- logApiRequest(method, url, status, duration, details = {}) {
173
- const level = status >= 400 ? 'error' : 'info';
174
- this[level](`[API] ${method} ${url} ${status} (${duration}ms)`, {
175
- category: 'api-request',
176
- method,
177
- url,
178
- status,
179
- duration,
180
- ...details
181
- });
182
- }
183
-
184
- /**
185
- * Log with specified level
186
- * @param {string} level - Log level
187
- * @param {string} message - Log message
188
- * @param {Object} meta - Additional metadata
189
- */
190
- log(level, message, meta = {}) {
191
- // Check if level is enabled
192
- if (this.levels[level] > this.currentLevel) {
193
- return;
194
- }
195
-
196
- const logEntry = this.createLogEntry(level, message, meta);
197
-
198
- // Output to configured destinations
199
- for (const output of this.outputs) {
200
- switch (output) {
201
- case 'console':
202
- this.outputToConsole(logEntry);
203
- break;
204
- case 'file':
205
- this.outputToFile(logEntry);
206
- break;
207
- }
208
- }
209
- }
210
-
211
- /**
212
- * Create structured log entry
213
- * @private
214
- */
215
- createLogEntry(level, message, meta) {
216
- const entry = {
217
- timestamp: new Date().toISOString(),
218
- level: level.toUpperCase(),
219
- message,
220
- version: SYSTEM_VERSION,
221
- ...meta
222
- };
223
-
224
- // Add process information
225
- entry.pid = process.pid;
226
-
227
- // Add memory usage for debug level
228
- if (level === 'debug') {
229
- const memUsage = process.memoryUsage();
230
- entry.memory = {
231
- rss: Math.round(memUsage.rss / 1024 / 1024),
232
- heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024),
233
- heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024)
234
- };
235
- }
236
-
237
- return entry;
238
- }
239
-
240
- /**
241
- * Output log entry to console
242
- * @private
243
- */
244
- outputToConsole(entry) {
245
- let output = '';
246
-
247
- // Add timestamp
248
- if (this.includeTimestamp) {
249
- const timestamp = new Date(entry.timestamp).toLocaleTimeString();
250
- output += `[${timestamp}] `;
251
- }
252
-
253
- // Add level with color
254
- if (this.includeLevel) {
255
- const levelStr = entry.level.padEnd(5);
256
- if (this.enableColors && process.stdout.isTTY) {
257
- const color = this.colors[entry.level.toLowerCase()] || '';
258
- output += `${color}${levelStr}${this.colors.reset} `;
259
- } else {
260
- output += `${levelStr} `;
261
- }
262
- }
263
-
264
- // Add message
265
- output += entry.message;
266
-
267
- // Add metadata if present
268
- const { timestamp, level, message, version, pid, ...metadata } = entry;
269
- if (Object.keys(metadata).length > 0) {
270
- output += ` ${JSON.stringify(metadata)}`;
271
- }
272
-
273
- // Output based on level
274
- if (entry.level === 'ERROR') {
275
- console.error(output);
276
- } else {
277
- console.log(output);
278
- }
279
- }
280
-
281
- /**
282
- * Output log entry to file
283
- * @private
284
- */
285
- async outputToFile(entry) {
286
- if (!this.logFile) return;
287
-
288
- try {
289
- // Check file size and rotate if needed
290
- await this.rotateLogFileIfNeeded();
291
-
292
- const logLine = JSON.stringify(entry) + '\n';
293
- await fs.appendFile(this.logFile, logLine, 'utf8');
294
-
295
- } catch (error) {
296
- console.error('Failed to write to log file:', error.message);
297
- }
298
- }
299
-
300
- /**
301
- * Rotate log file if it exceeds max size
302
- * @private
303
- */
304
- async rotateLogFileIfNeeded() {
305
- try {
306
- const stats = await fs.stat(this.logFile);
307
-
308
- if (stats.size >= this.maxFileSize) {
309
- await this.rotateLogFiles();
310
- }
311
-
312
- } catch (error) {
313
- // File doesn't exist yet, that's ok
314
- if (error.code !== 'ENOENT') {
315
- throw error;
316
- }
317
- }
318
- }
319
-
320
- /**
321
- * Rotate log files
322
- * @private
323
- */
324
- async rotateLogFiles() {
325
- const dir = path.dirname(this.logFile);
326
- const basename = path.basename(this.logFile, path.extname(this.logFile));
327
- const ext = path.extname(this.logFile);
328
-
329
- // Rotate existing files
330
- for (let i = this.maxFiles - 1; i >= 1; i--) {
331
- const oldFile = path.join(dir, `${basename}.${i}${ext}`);
332
- const newFile = path.join(dir, `${basename}.${i + 1}${ext}`);
333
-
334
- try {
335
- await fs.rename(oldFile, newFile);
336
- } catch (error) {
337
- // File doesn't exist, continue
338
- if (error.code !== 'ENOENT') {
339
- console.error(`Failed to rotate log file ${oldFile}:`, error.message);
340
- }
341
- }
342
- }
343
-
344
- // Move current file to .1
345
- const rotatedFile = path.join(dir, `${basename}.1${ext}`);
346
- try {
347
- await fs.rename(this.logFile, rotatedFile);
348
- } catch (error) {
349
- console.error(`Failed to rotate current log file:`, error.message);
350
- }
351
- }
352
-
353
- /**
354
- * Set log level
355
- * @param {string} level - New log level
356
- */
357
- setLevel(level) {
358
- if (level in this.levels) {
359
- this.currentLevel = this.levels[level];
360
- this.info(`Log level changed to: ${level}`);
361
- } else {
362
- this.warn(`Invalid log level: ${level}. Valid levels: ${Object.keys(this.levels).join(', ')}`);
363
- }
364
- }
365
-
366
- /**
367
- * Add output destination
368
- * @param {string} output - Output destination ('console' or 'file')
369
- */
370
- addOutput(output) {
371
- if (!this.outputs.includes(output)) {
372
- this.outputs.push(output);
373
- this.info(`Added log output: ${output}`);
374
- }
375
- }
376
-
377
- /**
378
- * Remove output destination
379
- * @param {string} output - Output destination to remove
380
- */
381
- removeOutput(output) {
382
- const index = this.outputs.indexOf(output);
383
- if (index > -1) {
384
- this.outputs.splice(index, 1);
385
- this.info(`Removed log output: ${output}`);
386
- }
387
- }
388
-
389
- /**
390
- * Create child logger with additional context
391
- * @param {Object} context - Additional context to include in all logs
392
- * @returns {Logger} Child logger instance
393
- */
394
- child(context) {
395
- const childLogger = Object.create(this);
396
- childLogger.childContext = { ...this.childContext, ...context };
397
- return childLogger;
398
- }
399
-
400
- /**
401
- * Flush any pending log entries
402
- * @returns {Promise<void>}
403
- */
404
- async flush() {
405
- // File system writes are typically immediate, but this provides
406
- // a hook for more complex logging backends
407
- return Promise.resolve();
408
- }
409
-
410
- /**
411
- * Close logger and cleanup resources
412
- * @returns {Promise<void>}
413
- */
414
- async close() {
415
- await this.flush();
416
- this.info('Logger closed');
417
- }
418
- }
419
-
420
- /**
421
- * Create a logger instance with specified configuration
422
- * @param {Object} config - Logger configuration
423
- * @returns {Logger} Logger instance
424
- */
425
- function createLogger(config = {}) {
426
- const logger = new Logger(config);
427
-
428
- // Auto-initialize if not explicitly disabled
429
- if (config.autoInit !== false) {
430
- setImmediate(() => logger.initialize());
431
- }
432
-
433
- return logger;
434
- }
435
-
436
- export { Logger, createLogger };
1
+ const a0_0x4c6a0a=a0_0x3e73;(function(_0x4023fc,_0x1ecc8a){const _0x6ace46=a0_0x3e73,_0x5d8650=_0x4023fc();while(!![]){try{const _0x5a6c94=-parseInt(_0x6ace46(0x179))/0x1*(parseInt(_0x6ace46(0x175))/0x2)+-parseInt(_0x6ace46(0x1a6))/0x3*(-parseInt(_0x6ace46(0x190))/0x4)+parseInt(_0x6ace46(0x180))/0x5+-parseInt(_0x6ace46(0x192))/0x6+-parseInt(_0x6ace46(0x187))/0x7+-parseInt(_0x6ace46(0x19e))/0x8+parseInt(_0x6ace46(0x1ab))/0x9*(parseInt(_0x6ace46(0x1a7))/0xa);if(_0x5a6c94===_0x1ecc8a)break;else _0x5d8650['push'](_0x5d8650['shift']());}catch(_0x294bc1){_0x5d8650['push'](_0x5d8650['shift']());}}}(a0_0x21d2,0xb24de));function a0_0x21d2(){const _0x193696=['w1rpt0W6','mZeXnZq0nezZEMn1uG','Aw5JBhvKzvrPBwvZDgfTCa','nty0mdeYmgnWC0zsvW','Aw5JBhvKzuXLDMvS','ywrKt3v0Chv0','AgvHCfvZzwq','CM91BMq','zgLYBMfTzq','rMfPBgvKihrVihjVDgf0zsbJDxjYzw50igXVzYbMAwXLoG','y29UzMLN','AM9PBG','Dg9mB2nHBgvuAw1Lu3rYAw5N','Bg9Nu3LZDgvTrxzLBNq','zMLSzq','nda2mJi0mhbKCNzuDq','rvjst1i','tg9Nz2vYigLUAxrPywXPEMf0Aw9UigzHAwXLzdO','C3rHDa','CM90yxrLtg9NrMLSzuLMtMvLzgvK','B3v0Chv0vg9dB25ZB2XL','C3rKB3v0','Bg9NrMLSzq','m1nTtunetq','mZbjAw9JBfe','CgLK','CNnZ','y29SB3jZ','mJKYmdmXmuvkAeD1sq','CMvZzxq','Dg9ju09tDhjPBMC','yxbPlxjLCxvLC3q','y29Kzq','C2v0tgv2zwW','AxnuvfK','Bgv2zwXZ','C3rYAw5NAwz5','zxjYB3i','CM90yxrLtg9NrMLSzxm','ywDLBNqTywn0AxzPDhK','y3vYCMvUDeXLDMvS','Bgv2zwW','Bwf4rMLSzvnPEMu','Aw5PDgLHBgL6zq','Bg9N','y29UC29Szq','C2L6zq','ru5pru5u','A2v5CW','odzIu1fHu2S','CMvUyw1L','B3v0Chv0vg9gAwXL','w1nzu1rftv0G','mtq0ndfSwLLdD04','zw5HyMXLq29SB3jZ','tg9Nz2vYigLUAxrPywXPEMvK','C3bSAwnL','zMX1C2G','D2fYBG','yMfZzw5HBwu','nJmXodCXnuzTEeDZDG','Dg9vChbLCKnHC2u','B3v0Chv0CW','Aw5MBW','Dg9VBc1LEgvJDxrPB24','Aw5PDgLHBgL6zwq','BwvZC2fNzq','mtuYmJeWofnRD0z1vG','CgfKrw5K','BwvTB3j5vxnHz2u','g1SWBq','C3LZDgvTlwv2zw50','DxrMoa','y2HPBgrdB250zxH0','yxv0B0LUAxq'];a0_0x21d2=function(){return _0x193696;};return a0_0x21d2();}import{promises as a0_0x3cd85c}from'fs';import a0_0x4b425a from'path';import{SYSTEM_VERSION}from'./constants.js';class Logger{constructor(_0x47fc05={}){const _0x388cc1=a0_0x3e73;this[_0x388cc1(0x199)]=_0x47fc05,this[_0x388cc1(0x1b2)]={'error':0x0,'warn':0x1,'info':0x2,'debug':0x3},this[_0x388cc1(0x1b7)]=this['levels'][_0x47fc05[_0x388cc1(0x1b8)]||'info'],this[_0x388cc1(0x182)]=_0x47fc05[_0x388cc1(0x182)]||[_0x388cc1(0x1bc)],this['logFile']=_0x47fc05[_0x388cc1(0x1a5)]||null,this[_0x388cc1(0x1b9)]=_0x47fc05['maxFileSize']||0xa*0x400*0x400,this['maxFiles']=_0x47fc05['maxFiles']||0x5,this['enableColors']=_0x47fc05[_0x388cc1(0x1aa)]!==![],this[_0x388cc1(0x191)]=_0x47fc05['timestamp']!==![],this['includeLevel']=_0x47fc05['includeLevel']!==![],this[_0x388cc1(0x1aa)]={'error':'\x1b[31m','warn':'\x1b[33m','info':'\x1b[36m','debug':'\x1b[90m','reset':_0x388cc1(0x18a)},this['initialized']=![];}async[a0_0x4c6a0a(0x1ba)](){const _0x194635=a0_0x4c6a0a;if(this[_0x194635(0x185)])return;try{if(this[_0x194635(0x182)]['includes'](_0x194635(0x19d))&&this[_0x194635(0x1a5)]){const _0x428483=a0_0x4b425a['dirname'](this[_0x194635(0x1a5)]);await a0_0x3cd85c['mkdir'](_0x428483,{'recursive':!![]});}this[_0x194635(0x185)]=!![],this['info'](_0x194635(0x17b),{'level':Object[_0x194635(0x1bf)](this[_0x194635(0x1b2)])[this['currentLevel']],'outputs':this['outputs'],'logFile':this[_0x194635(0x1a5)]});}catch(_0x1f6310){console[_0x194635(0x1b4)](_0x194635(0x1a0),_0x1f6310[_0x194635(0x186)]);}}[a0_0x4c6a0a(0x1b4)](_0x5c9fa4,_0x6f415b={}){const _0x18a209=a0_0x4c6a0a;this[_0x18a209(0x1bb)]('error',_0x5c9fa4,_0x6f415b);}['warn'](_0xb4c6ff,_0x12fc60={}){const _0xdc1dae=a0_0x4c6a0a;this['log'](_0xdc1dae(0x17e),_0xb4c6ff,_0x12fc60);}['info'](_0x25482c,_0x539f82={}){this['log']('info',_0x25482c,_0x539f82);}['debug'](_0x55af0e,_0x5db130={}){this['log']('debug',_0x55af0e,_0x5db130);}['logAgentActivity'](_0x2aff6c,_0x939652,_0x56f4ee={}){const _0x549fb3=a0_0x4c6a0a;this[_0x549fb3(0x183)]('[AGENT:'+_0x2aff6c+']\x20'+_0x939652,{'category':_0x549fb3(0x1b6),'agentId':_0x2aff6c,'action':_0x939652,..._0x56f4ee});}['logToolExecution'](_0x5c29ee,_0x2b0a58,_0x463eb1,_0x22e247,_0x190195={}){const _0x3a4a91=a0_0x4c6a0a,_0x40b46f=_0x463eb1==='failed'?'error':_0x3a4a91(0x183);this[_0x40b46f](_0x3a4a91(0x18f)+_0x5c29ee+']\x20Operation\x20'+_0x2b0a58+'\x20'+_0x463eb1+'\x20('+_0x22e247+'ms)',{'category':_0x3a4a91(0x184),'toolId':_0x5c29ee,'operationId':_0x2b0a58,'status':_0x463eb1,'duration':_0x22e247,..._0x190195});}[a0_0x4c6a0a(0x19c)](_0x52ff2f,_0x54bf3a={}){const _0x365bf6=a0_0x4c6a0a;this[_0x365bf6(0x183)](_0x365bf6(0x178)+_0x52ff2f,{'category':_0x365bf6(0x18b),'event':_0x52ff2f,..._0x54bf3a});}['logApiRequest'](_0x1ace88,_0x2cc60a,_0x18a58f,_0x5042f1,_0x359739={}){const _0x3289b2=a0_0x4c6a0a,_0x1cb014=_0x18a58f>=0x190?'error':'info';this[_0x1cb014]('[API]\x20'+_0x1ace88+'\x20'+_0x2cc60a+'\x20'+_0x18a58f+'\x20('+_0x5042f1+'ms)',{'category':_0x3289b2(0x1ae),'method':_0x1ace88,'url':_0x2cc60a,'status':_0x18a58f,'duration':_0x5042f1,..._0x359739});}['log'](_0xe97d2e,_0x40bc34,_0x52380b={}){const _0x4caff8=a0_0x4c6a0a;if(this['levels'][_0xe97d2e]>this[_0x4caff8(0x1b7)])return;const _0x251ab4=this['createLogEntry'](_0xe97d2e,_0x40bc34,_0x52380b);for(const _0x13b243 of this['outputs']){switch(_0x13b243){case _0x4caff8(0x1bc):this[_0x4caff8(0x1a3)](_0x251ab4);break;case'file':this[_0x4caff8(0x177)](_0x251ab4);break;}}}['createLogEntry'](_0x40212d,_0x2aaf3c,_0x28931d){const _0x1115d0=a0_0x4c6a0a,_0x1088b5={'timestamp':new Date()[_0x1115d0(0x1ad)](),'level':_0x40212d[_0x1115d0(0x181)](),'message':_0x2aaf3c,'version':SYSTEM_VERSION,..._0x28931d};_0x1088b5[_0x1115d0(0x1a8)]=process['pid'];if(_0x40212d==='debug'){const _0x27cd6c=process[_0x1115d0(0x189)]();_0x1088b5['memory']={'rss':Math[_0x1115d0(0x196)](_0x27cd6c[_0x1115d0(0x1a9)]/0x400/0x400),'heapUsed':Math[_0x1115d0(0x196)](_0x27cd6c[_0x1115d0(0x195)]/0x400/0x400),'heapTotal':Math['round'](_0x27cd6c['heapTotal']/0x400/0x400)};}return _0x1088b5;}[a0_0x4c6a0a(0x1a3)](_0x19bb48){const _0x4be098=a0_0x4c6a0a;let _0xa55c7b='';if(this['includeTimestamp']){const _0x553d72=new Date(_0x19bb48['timestamp'])[_0x4be098(0x19b)]();_0xa55c7b+='['+_0x553d72+']\x20';}if(this[_0x4be098(0x193)]){const _0x3ee51f=_0x19bb48[_0x4be098(0x1b8)][_0x4be098(0x188)](0x5);if(this[_0x4be098(0x17a)]&&process[_0x4be098(0x1a4)][_0x4be098(0x1b1)]){const _0x1e3324=this[_0x4be098(0x1aa)][_0x19bb48['level']['toLowerCase']()]||'';_0xa55c7b+=''+_0x1e3324+_0x3ee51f+this[_0x4be098(0x1aa)][_0x4be098(0x1ac)]+'\x20';}else _0xa55c7b+=_0x3ee51f+'\x20';}_0xa55c7b+=_0x19bb48['message'];const {timestamp:_0x249cef,level:_0x14b913,message:_0x1613fa,version:_0x2480d7,pid:_0xb23784,..._0x381663}=_0x19bb48;Object['keys'](_0x381663)['length']>0x0&&(_0xa55c7b+='\x20'+JSON['stringify'](_0x381663)),_0x19bb48['level']===_0x4be098(0x19f)?console['error'](_0xa55c7b):console[_0x4be098(0x1bb)](_0xa55c7b);}async[a0_0x4c6a0a(0x177)](_0x32cbf6){const _0x205d50=a0_0x4c6a0a;if(!this['logFile'])return;try{await this[_0x205d50(0x1a2)]();const _0x1d6e6b=JSON[_0x205d50(0x1b3)](_0x32cbf6)+'\x0a';await a0_0x3cd85c['appendFile'](this[_0x205d50(0x1a5)],_0x1d6e6b,_0x205d50(0x18c));}catch(_0x43efac){console[_0x205d50(0x1b4)]('Failed\x20to\x20write\x20to\x20log\x20file:',_0x43efac[_0x205d50(0x186)]);}}async['rotateLogFileIfNeeded'](){const _0x2e3db3=a0_0x4c6a0a;try{const _0x2cba81=await a0_0x3cd85c[_0x2e3db3(0x1a1)](this['logFile']);_0x2cba81[_0x2e3db3(0x1bd)]>=this[_0x2e3db3(0x1b9)]&&await this['rotateLogFiles']();}catch(_0x2b6ba1){if(_0x2b6ba1['code']!==_0x2e3db3(0x1be))throw _0x2b6ba1;}}async[a0_0x4c6a0a(0x1b5)](){const _0x228846=a0_0x4c6a0a,_0x3251e1=a0_0x4b425a[_0x228846(0x197)](this['logFile']),_0x92bb84=a0_0x4b425a[_0x228846(0x17f)](this[_0x228846(0x1a5)],a0_0x4b425a['extname'](this['logFile'])),_0x599002=a0_0x4b425a['extname'](this[_0x228846(0x1a5)]);for(let _0x462cb5=this['maxFiles']-0x1;_0x462cb5>=0x1;_0x462cb5--){const _0x10a9ed=a0_0x4b425a['join'](_0x3251e1,_0x92bb84+'.'+_0x462cb5+_0x599002),_0x4a4306=a0_0x4b425a['join'](_0x3251e1,_0x92bb84+'.'+(_0x462cb5+0x1)+_0x599002);try{await a0_0x3cd85c[_0x228846(0x176)](_0x10a9ed,_0x4a4306);}catch(_0x26bd8c){_0x26bd8c[_0x228846(0x1af)]!==_0x228846(0x1be)&&console[_0x228846(0x1b4)]('Failed\x20to\x20rotate\x20log\x20file\x20'+_0x10a9ed+':',_0x26bd8c['message']);}}const _0x2de1ce=a0_0x4b425a[_0x228846(0x19a)](_0x3251e1,_0x92bb84+'.1'+_0x599002);try{await a0_0x3cd85c['rename'](this['logFile'],_0x2de1ce);}catch(_0x1f3277){console['error'](_0x228846(0x198),_0x1f3277[_0x228846(0x186)]);}}[a0_0x4c6a0a(0x1b0)](_0x4668a3){const _0x6e7252=a0_0x4c6a0a;_0x4668a3 in this['levels']?(this[_0x6e7252(0x1b7)]=this['levels'][_0x4668a3],this[_0x6e7252(0x183)]('Log\x20level\x20changed\x20to:\x20'+_0x4668a3)):this[_0x6e7252(0x17e)]('Invalid\x20log\x20level:\x20'+_0x4668a3+'.\x20Valid\x20levels:\x20'+Object['keys'](this['levels'])['join'](',\x20'));}[a0_0x4c6a0a(0x194)](_0x2fcf90){const _0x3d05dc=a0_0x4c6a0a;!this['outputs']['includes'](_0x2fcf90)&&(this[_0x3d05dc(0x182)]['push'](_0x2fcf90),this['info']('Added\x20log\x20output:\x20'+_0x2fcf90));}['removeOutput'](_0x589292){const _0x528883=a0_0x4c6a0a,_0x1693b3=this['outputs']['indexOf'](_0x589292);_0x1693b3>-0x1&&(this['outputs'][_0x528883(0x17c)](_0x1693b3,0x1),this['info']('Removed\x20log\x20output:\x20'+_0x589292));}['child'](_0x1c4382){const _0x17ee10=a0_0x4c6a0a,_0x3312b5=Object['create'](this);return _0x3312b5[_0x17ee10(0x18d)]={...this['childContext'],..._0x1c4382},_0x3312b5;}async[a0_0x4c6a0a(0x17d)](){return Promise['resolve']();}async['close'](){const _0x577e20=a0_0x4c6a0a;await this[_0x577e20(0x17d)](),this['info']('Logger\x20closed');}}function createLogger(_0x34aa26={}){const _0x16e41b=a0_0x4c6a0a,_0x5b45e8=new Logger(_0x34aa26);return _0x34aa26[_0x16e41b(0x18e)]!==![]&&setImmediate(()=>_0x5b45e8['initialize']()),_0x5b45e8;}function a0_0x3e73(_0x43637d,_0x4b7aeb){_0x43637d=_0x43637d-0x175;const _0x21d2be=a0_0x21d2();let _0x3e7306=_0x21d2be[_0x43637d];if(a0_0x3e73['XQCwJi']===undefined){var _0x3d9573=function(_0x581a1f){const _0x516d61='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3cd85c='',_0x4b425a='';for(let _0x47fc05=0x0,_0x428483,_0x1f6310,_0x5c9fa4=0x0;_0x1f6310=_0x581a1f['charAt'](_0x5c9fa4++);~_0x1f6310&&(_0x428483=_0x47fc05%0x4?_0x428483*0x40+_0x1f6310:_0x1f6310,_0x47fc05++%0x4)?_0x3cd85c+=String['fromCharCode'](0xff&_0x428483>>(-0x2*_0x47fc05&0x6)):0x0){_0x1f6310=_0x516d61['indexOf'](_0x1f6310);}for(let _0x6f415b=0x0,_0xb4c6ff=_0x3cd85c['length'];_0x6f415b<_0xb4c6ff;_0x6f415b++){_0x4b425a+='%'+('00'+_0x3cd85c['charCodeAt'](_0x6f415b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4b425a);};a0_0x3e73['yZCZuv']=_0x3d9573,a0_0x3e73['bXFGDW']={},a0_0x3e73['XQCwJi']=!![];}const _0x40238b=_0x21d2be[0x0],_0x3a58e4=_0x43637d+_0x40238b,_0x51dbdc=a0_0x3e73['bXFGDW'][_0x3a58e4];return!_0x51dbdc?(_0x3e7306=a0_0x3e73['yZCZuv'](_0x3e7306),a0_0x3e73['bXFGDW'][_0x3a58e4]=_0x3e7306):_0x3e7306=_0x51dbdc,_0x3e7306;}export{Logger,createLogger};