@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.
- package/README.md +44 -54
- package/bin/cli.js +1 -115
- package/bin/loxia-terminal-v2.js +3 -0
- package/bin/loxia-terminal.js +3 -0
- package/bin/start-with-terminal.js +3 -0
- package/package.json +14 -15
- package/scripts/install-scanners.js +1 -235
- package/src/analyzers/CSSAnalyzer.js +1 -297
- package/src/analyzers/ConfigValidator.js +1 -690
- package/src/analyzers/ESLintAnalyzer.js +1 -320
- package/src/analyzers/JavaScriptAnalyzer.js +1 -261
- package/src/analyzers/PrettierFormatter.js +1 -247
- package/src/analyzers/PythonAnalyzer.js +1 -266
- package/src/analyzers/SecurityAnalyzer.js +1 -729
- package/src/analyzers/TypeScriptAnalyzer.js +1 -247
- package/src/analyzers/codeCloneDetector/analyzer.js +1 -344
- package/src/analyzers/codeCloneDetector/detector.js +1 -203
- package/src/analyzers/codeCloneDetector/index.js +1 -160
- package/src/analyzers/codeCloneDetector/parser.js +1 -199
- package/src/analyzers/codeCloneDetector/reporter.js +1 -148
- package/src/analyzers/codeCloneDetector/scanner.js +1 -59
- package/src/core/agentPool.js +1 -1474
- package/src/core/agentScheduler.js +1 -2147
- package/src/core/contextManager.js +1 -709
- package/src/core/messageProcessor.js +1 -732
- package/src/core/orchestrator.js +1 -548
- package/src/core/stateManager.js +1 -877
- package/src/index.js +1 -631
- package/src/interfaces/cli.js +1 -549
- package/src/interfaces/terminal/__tests__/smoke/advancedFeatures.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/agentControl.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/agents.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/components.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/connection.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/enhancements.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/imports.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/messages.test.js +1 -0
- package/src/interfaces/terminal/__tests__/smoke/tools.test.js +1 -0
- package/src/interfaces/terminal/api/apiClient.js +1 -0
- package/src/interfaces/terminal/api/messageRouter.js +1 -0
- package/src/interfaces/terminal/api/session.js +1 -0
- package/src/interfaces/terminal/api/websocket.js +1 -0
- package/src/interfaces/terminal/components/AgentCreator.js +1 -0
- package/src/interfaces/terminal/components/AgentEditor.js +1 -0
- package/src/interfaces/terminal/components/AgentSwitcher.js +1 -0
- package/src/interfaces/terminal/components/ErrorBoundary.js +1 -0
- package/src/interfaces/terminal/components/ErrorPanel.js +1 -0
- package/src/interfaces/terminal/components/Header.js +1 -0
- package/src/interfaces/terminal/components/HelpPanel.js +1 -0
- package/src/interfaces/terminal/components/InputBox.js +1 -0
- package/src/interfaces/terminal/components/Layout.js +1 -0
- package/src/interfaces/terminal/components/LoadingSpinner.js +1 -0
- package/src/interfaces/terminal/components/MessageList.js +1 -0
- package/src/interfaces/terminal/components/MultilineTextInput.js +1 -0
- package/src/interfaces/terminal/components/SearchPanel.js +1 -0
- package/src/interfaces/terminal/components/SettingsPanel.js +1 -0
- package/src/interfaces/terminal/components/StatusBar.js +1 -0
- package/src/interfaces/terminal/components/TextInput.js +1 -0
- package/src/interfaces/terminal/config/agentEditorConstants.js +1 -0
- package/src/interfaces/terminal/config/constants.js +1 -0
- package/src/interfaces/terminal/index.js +1 -0
- package/src/interfaces/terminal/state/useAgentControl.js +1 -0
- package/src/interfaces/terminal/state/useAgents.js +1 -0
- package/src/interfaces/terminal/state/useConnection.js +1 -0
- package/src/interfaces/terminal/state/useMessages.js +1 -0
- package/src/interfaces/terminal/state/useTools.js +1 -0
- package/src/interfaces/terminal/utils/debugLogger.js +1 -0
- package/src/interfaces/terminal/utils/settingsStorage.js +1 -0
- package/src/interfaces/terminal/utils/theme.js +1 -0
- package/src/interfaces/webServer.js +1 -2162
- package/src/modules/fileExplorer/controller.js +1 -280
- package/src/modules/fileExplorer/index.js +1 -37
- package/src/modules/fileExplorer/middleware.js +1 -92
- package/src/modules/fileExplorer/routes.js +1 -125
- package/src/modules/fileExplorer/types.js +1 -44
- package/src/services/aiService.js +1 -1232
- package/src/services/apiKeyManager.js +1 -164
- package/src/services/benchmarkService.js +1 -366
- package/src/services/budgetService.js +1 -539
- package/src/services/contextInjectionService.js +1 -247
- package/src/services/conversationCompactionService.js +1 -637
- package/src/services/errorHandler.js +1 -810
- package/src/services/fileAttachmentService.js +1 -544
- package/src/services/modelRouterService.js +1 -366
- package/src/services/modelsService.js +1 -322
- package/src/services/qualityInspector.js +1 -796
- package/src/services/tokenCountingService.js +1 -536
- package/src/tools/agentCommunicationTool.js +1 -1344
- package/src/tools/agentDelayTool.js +1 -485
- package/src/tools/asyncToolManager.js +1 -604
- package/src/tools/baseTool.js +1 -800
- package/src/tools/browserTool.js +1 -920
- package/src/tools/cloneDetectionTool.js +1 -621
- package/src/tools/dependencyResolverTool.js +1 -1215
- package/src/tools/fileContentReplaceTool.js +1 -875
- package/src/tools/fileSystemTool.js +1 -1107
- package/src/tools/fileTreeTool.js +1 -853
- package/src/tools/imageTool.js +1 -901
- package/src/tools/importAnalyzerTool.js +1 -1060
- package/src/tools/jobDoneTool.js +1 -248
- package/src/tools/seekTool.js +1 -956
- package/src/tools/staticAnalysisTool.js +1 -1778
- package/src/tools/taskManagerTool.js +1 -2873
- package/src/tools/terminalTool.js +1 -2304
- package/src/tools/webTool.js +1 -1430
- package/src/types/agent.js +1 -519
- package/src/types/contextReference.js +1 -972
- package/src/types/conversation.js +1 -730
- package/src/types/toolCommand.js +1 -747
- package/src/utilities/attachmentValidator.js +1 -292
- package/src/utilities/configManager.js +1 -582
- package/src/utilities/constants.js +1 -722
- package/src/utilities/directoryAccessManager.js +1 -535
- package/src/utilities/fileProcessor.js +1 -307
- package/src/utilities/logger.js +1 -436
- package/src/utilities/tagParser.js +1 -1246
- package/src/utilities/toolConstants.js +1 -317
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/{index-Dy2bYbOa.css → index-CClD1090.css} +1 -1
- package/web-ui/build/static/{index-CjkkcnFA.js → index-lCBai6dX.js} +66 -67
|
@@ -1,307 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* File Processor
|
|
3
|
-
* Handles file reading, conversion, and processing operations
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import fs from 'fs/promises';
|
|
7
|
-
import path from 'path';
|
|
8
|
-
import crypto from 'crypto';
|
|
9
|
-
|
|
10
|
-
// PDF support disabled due to DOM API requirements in Node.js environment
|
|
11
|
-
// The pdf-parse library requires browser DOM APIs (DOMMatrix, ImageData, Path2D)
|
|
12
|
-
// which are not available in Node.js. PDF text extraction can be re-enabled
|
|
13
|
-
// by installing canvas-based polyfills or using an alternative PDF library.
|
|
14
|
-
|
|
15
|
-
class FileProcessor {
|
|
16
|
-
constructor(config = {}, logger = null) {
|
|
17
|
-
this.config = config;
|
|
18
|
-
this.logger = logger;
|
|
19
|
-
this.pdfSupported = false; // Disabled - requires DOM APIs
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Read file content
|
|
24
|
-
* @param {string} filePath - Path to file
|
|
25
|
-
* @param {string} encoding - File encoding (default: 'utf8')
|
|
26
|
-
* @returns {Promise<string|Buffer>}
|
|
27
|
-
*/
|
|
28
|
-
async readFile(filePath, encoding = 'utf8') {
|
|
29
|
-
try {
|
|
30
|
-
const content = await fs.readFile(filePath, encoding);
|
|
31
|
-
return content;
|
|
32
|
-
} catch (error) {
|
|
33
|
-
this.logger?.error('Error reading file', { filePath, error: error.message });
|
|
34
|
-
throw new Error(`Failed to read file: ${error.message}`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Convert image to base64
|
|
40
|
-
* @param {string} filePath - Path to image file
|
|
41
|
-
* @returns {Promise<string>} Base64 encoded string with data URI
|
|
42
|
-
*/
|
|
43
|
-
async imageToBase64(filePath) {
|
|
44
|
-
try {
|
|
45
|
-
const buffer = await fs.readFile(filePath);
|
|
46
|
-
const ext = path.extname(filePath).toLowerCase();
|
|
47
|
-
|
|
48
|
-
// Determine MIME type
|
|
49
|
-
const mimeTypes = {
|
|
50
|
-
'.jpg': 'image/jpeg',
|
|
51
|
-
'.jpeg': 'image/jpeg',
|
|
52
|
-
'.png': 'image/png',
|
|
53
|
-
'.gif': 'image/gif',
|
|
54
|
-
'.webp': 'image/webp',
|
|
55
|
-
'.bmp': 'image/bmp',
|
|
56
|
-
'.svg': 'image/svg+xml'
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
const mimeType = mimeTypes[ext] || 'image/jpeg';
|
|
60
|
-
const base64 = buffer.toString('base64');
|
|
61
|
-
|
|
62
|
-
return `data:${mimeType};base64,${base64}`;
|
|
63
|
-
} catch (error) {
|
|
64
|
-
this.logger?.error('Error converting image to base64', { filePath, error: error.message });
|
|
65
|
-
throw new Error(`Failed to convert image: ${error.message}`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Extract text from PDF
|
|
71
|
-
* @param {string} filePath - Path to PDF file
|
|
72
|
-
* @returns {Promise<Object>} { text: string, numPages: number }
|
|
73
|
-
*/
|
|
74
|
-
async extractPdfText(filePath) {
|
|
75
|
-
if (!this.pdfSupported) {
|
|
76
|
-
throw new Error('PDF text extraction is not supported - pdf-parse library not available');
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
const dataBuffer = await fs.readFile(filePath);
|
|
81
|
-
const data = await pdfParse(dataBuffer);
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
text: data.text,
|
|
85
|
-
numPages: data.numpages,
|
|
86
|
-
info: data.info || {},
|
|
87
|
-
metadata: data.metadata || {}
|
|
88
|
-
};
|
|
89
|
-
} catch (error) {
|
|
90
|
-
this.logger?.error('Error extracting PDF text', { filePath, error: error.message });
|
|
91
|
-
throw new Error(`Failed to extract PDF text: ${error.message}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Calculate file hash (SHA-256)
|
|
97
|
-
* @param {string} filePath - Path to file
|
|
98
|
-
* @returns {Promise<string>} Hash as hex string
|
|
99
|
-
*/
|
|
100
|
-
async calculateHash(filePath) {
|
|
101
|
-
try {
|
|
102
|
-
const buffer = await fs.readFile(filePath);
|
|
103
|
-
const hash = crypto.createHash('sha256');
|
|
104
|
-
hash.update(buffer);
|
|
105
|
-
return hash.digest('hex');
|
|
106
|
-
} catch (error) {
|
|
107
|
-
this.logger?.error('Error calculating file hash', { filePath, error: error.message });
|
|
108
|
-
throw new Error(`Failed to calculate hash: ${error.message}`);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Get file stats
|
|
114
|
-
* @param {string} filePath - Path to file
|
|
115
|
-
* @returns {Promise<Object>} File stats
|
|
116
|
-
*/
|
|
117
|
-
async getFileStats(filePath) {
|
|
118
|
-
try {
|
|
119
|
-
const stats = await fs.stat(filePath);
|
|
120
|
-
return {
|
|
121
|
-
size: stats.size,
|
|
122
|
-
created: stats.birthtime,
|
|
123
|
-
modified: stats.mtime,
|
|
124
|
-
isFile: stats.isFile(),
|
|
125
|
-
isDirectory: stats.isDirectory()
|
|
126
|
-
};
|
|
127
|
-
} catch (error) {
|
|
128
|
-
this.logger?.error('Error getting file stats', { filePath, error: error.message });
|
|
129
|
-
throw new Error(`Failed to get file stats: ${error.message}`);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Check if file exists
|
|
135
|
-
* @param {string} filePath - Path to file
|
|
136
|
-
* @returns {Promise<boolean>}
|
|
137
|
-
*/
|
|
138
|
-
async fileExists(filePath) {
|
|
139
|
-
try {
|
|
140
|
-
await fs.access(filePath);
|
|
141
|
-
return true;
|
|
142
|
-
} catch {
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Process file based on content type
|
|
149
|
-
* @param {string} filePath - Path to file
|
|
150
|
-
* @param {string} contentType - 'text' | 'image' | 'pdf'
|
|
151
|
-
* @returns {Promise<Object>} { content: string, metadata: Object }
|
|
152
|
-
*/
|
|
153
|
-
async processFile(filePath, contentType) {
|
|
154
|
-
const metadata = {};
|
|
155
|
-
|
|
156
|
-
try {
|
|
157
|
-
switch (contentType) {
|
|
158
|
-
case 'text': {
|
|
159
|
-
const content = await this.readFile(filePath, 'utf8');
|
|
160
|
-
metadata.lines = content.split('\n').length;
|
|
161
|
-
metadata.characters = content.length;
|
|
162
|
-
return { content, metadata };
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
case 'image': {
|
|
166
|
-
const content = await this.imageToBase64(filePath);
|
|
167
|
-
const stats = await this.getFileStats(filePath);
|
|
168
|
-
metadata.size = stats.size;
|
|
169
|
-
return { content, metadata };
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
case 'pdf': {
|
|
173
|
-
const pdfData = await this.extractPdfText(filePath);
|
|
174
|
-
metadata.numPages = pdfData.numPages;
|
|
175
|
-
metadata.info = pdfData.info;
|
|
176
|
-
return { content: pdfData.text, metadata };
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
default:
|
|
180
|
-
throw new Error(`Unsupported content type: ${contentType}`);
|
|
181
|
-
}
|
|
182
|
-
} catch (error) {
|
|
183
|
-
this.logger?.error('Error processing file', { filePath, contentType, error: error.message });
|
|
184
|
-
throw error;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Estimate token count for text
|
|
190
|
-
* @param {string} text - Text content
|
|
191
|
-
* @returns {number} Estimated token count
|
|
192
|
-
*/
|
|
193
|
-
estimateTokens(text) {
|
|
194
|
-
// Rough estimate: 1 token ≈ 4 characters for text
|
|
195
|
-
// For base64 images: 1 token ≈ 1.5 characters (overhead)
|
|
196
|
-
|
|
197
|
-
if (!text) return 0;
|
|
198
|
-
|
|
199
|
-
// Check if it's a base64 data URI
|
|
200
|
-
if (text.startsWith('data:image')) {
|
|
201
|
-
// Extract base64 part and estimate
|
|
202
|
-
const base64Part = text.split(',')[1] || '';
|
|
203
|
-
return Math.ceil(base64Part.length / 1.5);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// Regular text
|
|
207
|
-
return Math.ceil(text.length / 4);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Write content to file
|
|
212
|
-
* @param {string} filePath - Path to file
|
|
213
|
-
* @param {string|Buffer} content - Content to write
|
|
214
|
-
* @param {string} encoding - Encoding (default: 'utf8')
|
|
215
|
-
* @returns {Promise<void>}
|
|
216
|
-
*/
|
|
217
|
-
async writeFile(filePath, content, encoding = 'utf8') {
|
|
218
|
-
try {
|
|
219
|
-
// Ensure directory exists
|
|
220
|
-
const dir = path.dirname(filePath);
|
|
221
|
-
await fs.mkdir(dir, { recursive: true });
|
|
222
|
-
|
|
223
|
-
await fs.writeFile(filePath, content, encoding);
|
|
224
|
-
} catch (error) {
|
|
225
|
-
this.logger?.error('Error writing file', { filePath, error: error.message });
|
|
226
|
-
throw new Error(`Failed to write file: ${error.message}`);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Delete file
|
|
232
|
-
* @param {string} filePath - Path to file
|
|
233
|
-
* @returns {Promise<void>}
|
|
234
|
-
*/
|
|
235
|
-
async deleteFile(filePath) {
|
|
236
|
-
try {
|
|
237
|
-
await fs.unlink(filePath);
|
|
238
|
-
} catch (error) {
|
|
239
|
-
this.logger?.error('Error deleting file', { filePath, error: error.message });
|
|
240
|
-
throw new Error(`Failed to delete file: ${error.message}`);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Copy file
|
|
246
|
-
* @param {string} sourcePath - Source file path
|
|
247
|
-
* @param {string} destPath - Destination file path
|
|
248
|
-
* @returns {Promise<void>}
|
|
249
|
-
*/
|
|
250
|
-
async copyFile(sourcePath, destPath) {
|
|
251
|
-
try {
|
|
252
|
-
// Ensure destination directory exists
|
|
253
|
-
const dir = path.dirname(destPath);
|
|
254
|
-
await fs.mkdir(dir, { recursive: true });
|
|
255
|
-
|
|
256
|
-
await fs.copyFile(sourcePath, destPath);
|
|
257
|
-
} catch (error) {
|
|
258
|
-
this.logger?.error('Error copying file', { sourcePath, destPath, error: error.message });
|
|
259
|
-
throw new Error(`Failed to copy file: ${error.message}`);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Create directory
|
|
265
|
-
* @param {string} dirPath - Directory path
|
|
266
|
-
* @returns {Promise<void>}
|
|
267
|
-
*/
|
|
268
|
-
async createDirectory(dirPath) {
|
|
269
|
-
try {
|
|
270
|
-
await fs.mkdir(dirPath, { recursive: true });
|
|
271
|
-
} catch (error) {
|
|
272
|
-
this.logger?.error('Error creating directory', { dirPath, error: error.message });
|
|
273
|
-
throw new Error(`Failed to create directory: ${error.message}`);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Delete directory recursively
|
|
279
|
-
* @param {string} dirPath - Directory path
|
|
280
|
-
* @returns {Promise<void>}
|
|
281
|
-
*/
|
|
282
|
-
async deleteDirectory(dirPath) {
|
|
283
|
-
try {
|
|
284
|
-
await fs.rm(dirPath, { recursive: true, force: true });
|
|
285
|
-
} catch (error) {
|
|
286
|
-
this.logger?.error('Error deleting directory', { dirPath, error: error.message });
|
|
287
|
-
throw new Error(`Failed to delete directory: ${error.message}`);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* List files in directory
|
|
293
|
-
* @param {string} dirPath - Directory path
|
|
294
|
-
* @returns {Promise<string[]>} Array of file names
|
|
295
|
-
*/
|
|
296
|
-
async listFiles(dirPath) {
|
|
297
|
-
try {
|
|
298
|
-
const files = await fs.readdir(dirPath);
|
|
299
|
-
return files;
|
|
300
|
-
} catch (error) {
|
|
301
|
-
this.logger?.error('Error listing files', { dirPath, error: error.message });
|
|
302
|
-
throw new Error(`Failed to list files: ${error.message}`);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
export default FileProcessor;
|
|
1
|
+
const a0_0x4b87f1=a0_0x481e;(function(_0xaa08ce,_0x507315){const _0x2762d6=a0_0x481e,_0x28dbb2=_0xaa08ce();while(!![]){try{const _0xedd345=parseInt(_0x2762d6(0x147))/0x1*(parseInt(_0x2762d6(0x164))/0x2)+parseInt(_0x2762d6(0x162))/0x3*(parseInt(_0x2762d6(0x136))/0x4)+parseInt(_0x2762d6(0x146))/0x5+-parseInt(_0x2762d6(0x16f))/0x6+-parseInt(_0x2762d6(0x169))/0x7*(-parseInt(_0x2762d6(0x167))/0x8)+-parseInt(_0x2762d6(0x156))/0x9*(-parseInt(_0x2762d6(0x143))/0xa)+-parseInt(_0x2762d6(0x15d))/0xb;if(_0xedd345===_0x507315)break;else _0x28dbb2['push'](_0x28dbb2['shift']());}catch(_0x2f1a1e){_0x28dbb2['push'](_0x28dbb2['shift']());}}}(a0_0x12e2,0x9bc81));import a0_0x30b1e0 from'fs/promises';import a0_0x46e436 from'path';function a0_0x481e(_0x3d9206,_0x3ad1a9){_0x3d9206=_0x3d9206-0x133;const _0x12e2e4=a0_0x12e2();let _0x481e19=_0x12e2e4[_0x3d9206];if(a0_0x481e['xrKqrN']===undefined){var _0x23df0f=function(_0x4f35cf){const _0x46b9d2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x30b1e0='',_0x46e436='';for(let _0x37fe21=0x0,_0x3a75a3,_0x3c9992,_0x4d1e4b=0x0;_0x3c9992=_0x4f35cf['charAt'](_0x4d1e4b++);~_0x3c9992&&(_0x3a75a3=_0x37fe21%0x4?_0x3a75a3*0x40+_0x3c9992:_0x3c9992,_0x37fe21++%0x4)?_0x30b1e0+=String['fromCharCode'](0xff&_0x3a75a3>>(-0x2*_0x37fe21&0x6)):0x0){_0x3c9992=_0x46b9d2['indexOf'](_0x3c9992);}for(let _0x2815bf=0x0,_0x2bd5cf=_0x30b1e0['length'];_0x2815bf<_0x2bd5cf;_0x2815bf++){_0x46e436+='%'+('00'+_0x30b1e0['charCodeAt'](_0x2815bf)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x46e436);};a0_0x481e['lUTSEx']=_0x23df0f,a0_0x481e['nQhega']={},a0_0x481e['xrKqrN']=!![];}const _0x4a1a80=_0x12e2e4[0x0],_0x325568=_0x3d9206+_0x4a1a80,_0x45124b=a0_0x481e['nQhega'][_0x325568];return!_0x45124b?(_0x481e19=a0_0x481e['lUTSEx'](_0x481e19),a0_0x481e['nQhega'][_0x325568]=_0x481e19):_0x481e19=_0x45124b,_0x481e19;}function a0_0x12e2(){const _0x1e20cf=['yMLYDgH0Aw1L','C2L6zq','Agv4','zgLNzxn0','Aw1Hz2uVD2vICa','rxjYB3iGChjVy2vZC2LUzYbMAwXL','zxH0BMfTzq','Dgv4Da','BwTKAxi','C2HHmJu2','mJq5otb2q2vIrLe','Aw1Hz2uVANbLzW','rxjYB3iGD3jPDgLUzYbMAwXL','nJi5otqXmgXizKzlza','mZK0mtKZEKXQtw16','zgvSzxrLrMLSzq','zgvSzxrLrgLYzwn0B3j5','y2vPBa','CgrMu3vWCg9YDgvK','CMvHzezPBgu','zxjYB3i','zMLSzuv4Axn0CW','BwvZC2fNzq','vw5ZDxbWB3j0zwqGy29UDgvUDcb0ExbLoIa','y2fSy3vSyxrLsgfZAa','C3bSAxq','BxrPBwu','rMfPBgvKihrVihjLywqGzMLSztOG','rMfPBgvKihrVihDYAxrLigzPBgu6ia','odfLuenrzKK','Aw5MBW','y29WEuzPBgu','CgrM','rMfPBgvKihrVigv4DhjHy3qGuergihrLEhq6ia','rxjYB3iGzgvSzxrPBMCGzgLYzwn0B3j5','BgvUz3rO','mZaXnJyYntDor2P3uvO','ChjVy2vZC0zPBgu','Aw1Hz2vuB0jHC2u2na','rxjYB3iGz2v0DgLUzYbMAwXLihn0yxrZ','zgLYBMfTzq','ntC2mZyZAvLpreHn','rxjYB3iGBgLZDgLUzYbMAwXLCW','neXOu0rYvG','rxjYB3iGy29WEwLUzYbMAwXL','z2v0rMLSzvn0yxrZ','mZGYntzoyuPpzgK','Bg9Nz2vY','mJGWBhPftezP','DxrMoa','rMfPBgvKihrVigXPC3qGzMLSzxm6ia','CMvHzgrPCG','rMfPBgvKihrVignHBgn1Bgf0zsbOyxnOoIa','D3jPDgvgAwXL','mJa1nZGYDwfiEgHf','C3rHCNrZv2L0Aa','zxH0CMfJDfbKzLrLEhq','rxjYB3iGzxH0CMfJDgLUzYbqreyGDgv4Da','rMfPBgvKihrVigrLBgv0zsbKAxjLy3rVCNK6ia','DxbKyxrL','mJrsv2LUzgy','Aw1Hz2uVC3zNk3HTBa','Dw5SAw5R'];a0_0x12e2=function(){return _0x1e20cf;};return a0_0x12e2();}import a0_0x37fe21 from'crypto';class FileProcessor{constructor(_0x3a75a3={},_0x3c9992=null){const _0x235207=a0_0x481e;this['config']=_0x3a75a3,this[_0x235207(0x168)]=_0x3c9992,this[_0x235207(0x14b)]=![];}async[a0_0x4b87f1(0x14c)](_0x4d1e4b,_0x2815bf='utf8'){const _0x3bc8db=a0_0x4b87f1;try{const _0x2bd5cf=await a0_0x30b1e0[_0x3bc8db(0x14c)](_0x4d1e4b,_0x2815bf);return _0x2bd5cf;}catch(_0x2e53ca){this[_0x3bc8db(0x168)]?.['error']('Error\x20reading\x20file',{'filePath':_0x4d1e4b,'error':_0x2e53ca['message']});throw new Error(_0x3bc8db(0x154)+_0x2e53ca[_0x3bc8db(0x14f)]);}}async[a0_0x4b87f1(0x15f)](_0x47aad3){const _0x15615f=a0_0x4b87f1;try{const _0x9c1b9e=await a0_0x30b1e0[_0x15615f(0x14c)](_0x47aad3),_0x3af23f=a0_0x46e436[_0x15615f(0x13f)](_0x47aad3)['toLowerCase'](),_0x3f08e5={'.jpg':_0x15615f(0x144),'.jpeg':_0x15615f(0x144),'.png':'image/png','.gif':'image/gif','.webp':_0x15615f(0x13d),'.bmp':'image/bmp','.svg':_0x15615f(0x137)},_0x2c4689=_0x3f08e5[_0x3af23f]||'image/jpeg',_0x3de2f9=_0x9c1b9e['toString']('base64');return'data:'+_0x2c4689+';base64,'+_0x3de2f9;}catch(_0x2a3241){this['logger']?.['error']('Error\x20converting\x20image\x20to\x20base64',{'filePath':_0x47aad3,'error':_0x2a3241['message']});throw new Error('Failed\x20to\x20convert\x20image:\x20'+_0x2a3241[_0x15615f(0x14f)]);}}async['extractPdfText'](_0x48efc4){const _0x5a9adb=a0_0x4b87f1;if(!this[_0x5a9adb(0x14b)])throw new Error('PDF\x20text\x20extraction\x20is\x20not\x20supported\x20-\x20pdf-parse\x20library\x20not\x20available');try{const dataBuffer=await a0_0x30b1e0['readFile'](_0x48efc4),_0x3abc89=await pdfParse(dataBuffer);return{'text':_0x3abc89['text'],'numPages':_0x3abc89['numpages'],'info':_0x3abc89['info']||{},'metadata':_0x3abc89['metadata']||{}};}catch(_0x57b936){this['logger']?.['error'](_0x5a9adb(0x133),{'filePath':_0x48efc4,'error':_0x57b936['message']});throw new Error(_0x5a9adb(0x15a)+_0x57b936['message']);}}async[a0_0x4b87f1(0x151)](_0xafb221){const _0x5b87ce=a0_0x4b87f1;try{const _0x406355=await a0_0x30b1e0[_0x5b87ce(0x14c)](_0xafb221),_0x10dc14=a0_0x37fe21['createHash'](_0x5b87ce(0x142));return _0x10dc14[_0x5b87ce(0x135)](_0x406355),_0x10dc14[_0x5b87ce(0x13c)](_0x5b87ce(0x13b));}catch(_0x21cbb5){this[_0x5b87ce(0x168)]?.[_0x5b87ce(0x14d)]('Error\x20calculating\x20file\x20hash',{'filePath':_0xafb221,'error':_0x21cbb5[_0x5b87ce(0x14f)]});throw new Error(_0x5b87ce(0x16d)+_0x21cbb5['message']);}}async[a0_0x4b87f1(0x166)](_0x477f0e){const _0x253d8d=a0_0x4b87f1;try{const _0x23d114=await a0_0x30b1e0['stat'](_0x477f0e);return{'size':_0x23d114[_0x253d8d(0x13a)],'created':_0x23d114[_0x253d8d(0x139)],'modified':_0x23d114[_0x253d8d(0x153)],'isFile':_0x23d114['isFile'](),'isDirectory':_0x23d114['isDirectory']()};}catch(_0x4ab764){this['logger']?.[_0x253d8d(0x14d)](_0x253d8d(0x160),{'filePath':_0x477f0e,'error':_0x4ab764[_0x253d8d(0x14f)]});throw new Error('Failed\x20to\x20get\x20file\x20stats:\x20'+_0x4ab764['message']);}}async[a0_0x4b87f1(0x14e)](_0x3baa47){try{return await a0_0x30b1e0['access'](_0x3baa47),!![];}catch{return![];}}async[a0_0x4b87f1(0x15e)](_0x5d3b56,_0x25dd07){const _0x41c666=a0_0x4b87f1,_0x486ba1={};try{switch(_0x25dd07){case'text':{const _0x360ef3=await this['readFile'](_0x5d3b56,_0x41c666(0x16a));return _0x486ba1['lines']=_0x360ef3['split']('\x0a')['length'],_0x486ba1['characters']=_0x360ef3[_0x41c666(0x15c)],{'content':_0x360ef3,'metadata':_0x486ba1};}case'image':{const _0x18364f=await this['imageToBase64'](_0x5d3b56),_0xc33e25=await this['getFileStats'](_0x5d3b56);return _0x486ba1[_0x41c666(0x13a)]=_0xc33e25[_0x41c666(0x13a)],{'content':_0x18364f,'metadata':_0x486ba1};}case _0x41c666(0x159):{const _0x18c4bd=await this[_0x41c666(0x171)](_0x5d3b56);return _0x486ba1['numPages']=_0x18c4bd['numPages'],_0x486ba1[_0x41c666(0x157)]=_0x18c4bd[_0x41c666(0x157)],{'content':_0x18c4bd[_0x41c666(0x140)],'metadata':_0x486ba1};}default:throw new Error(_0x41c666(0x150)+_0x25dd07);}}catch(_0xa379d5){this[_0x41c666(0x168)]?.[_0x41c666(0x14d)](_0x41c666(0x13e),{'filePath':_0x5d3b56,'contentType':_0x25dd07,'error':_0xa379d5['message']});throw _0xa379d5;}}['estimateTokens'](_0x138809){const _0x216a5c=a0_0x4b87f1;if(!_0x138809)return 0x0;if(_0x138809[_0x216a5c(0x170)]('data:image')){const _0x566279=_0x138809[_0x216a5c(0x152)](',')[0x1]||'';return Math[_0x216a5c(0x14a)](_0x566279['length']/1.5);}return Math[_0x216a5c(0x14a)](_0x138809[_0x216a5c(0x15c)]/0x4);}async['writeFile'](_0x203290,_0x18c073,_0x5a564a=a0_0x4b87f1(0x16a)){const _0x54c7e0=a0_0x4b87f1;try{const _0x44a2d1=a0_0x46e436[_0x54c7e0(0x161)](_0x203290);await a0_0x30b1e0[_0x54c7e0(0x141)](_0x44a2d1,{'recursive':!![]}),await a0_0x30b1e0[_0x54c7e0(0x16e)](_0x203290,_0x18c073,_0x5a564a);}catch(_0x3b5f8c){this[_0x54c7e0(0x168)]?.['error'](_0x54c7e0(0x145),{'filePath':_0x203290,'error':_0x3b5f8c['message']});throw new Error(_0x54c7e0(0x155)+_0x3b5f8c[_0x54c7e0(0x14f)]);}}async[a0_0x4b87f1(0x148)](_0x45cf3b){const _0x444e7c=a0_0x4b87f1;try{await a0_0x30b1e0[_0x444e7c(0x138)](_0x45cf3b);}catch(_0x30ead5){this[_0x444e7c(0x168)]?.['error']('Error\x20deleting\x20file',{'filePath':_0x45cf3b,'error':_0x30ead5[_0x444e7c(0x14f)]});throw new Error('Failed\x20to\x20delete\x20file:\x20'+_0x30ead5[_0x444e7c(0x14f)]);}}async['copyFile'](_0x56a945,_0xcd6da5){const _0x3589c9=a0_0x4b87f1;try{const _0x2e19d9=a0_0x46e436['dirname'](_0xcd6da5);await a0_0x30b1e0['mkdir'](_0x2e19d9,{'recursive':!![]}),await a0_0x30b1e0[_0x3589c9(0x158)](_0x56a945,_0xcd6da5);}catch(_0x3bf357){this[_0x3589c9(0x168)]?.['error'](_0x3589c9(0x165),{'sourcePath':_0x56a945,'destPath':_0xcd6da5,'error':_0x3bf357['message']});throw new Error('Failed\x20to\x20copy\x20file:\x20'+_0x3bf357[_0x3589c9(0x14f)]);}}async['createDirectory'](_0x57d532){const _0x20725f=a0_0x4b87f1;try{await a0_0x30b1e0[_0x20725f(0x141)](_0x57d532,{'recursive':!![]});}catch(_0x4523c8){this['logger']?.['error']('Error\x20creating\x20directory',{'dirPath':_0x57d532,'error':_0x4523c8['message']});throw new Error('Failed\x20to\x20create\x20directory:\x20'+_0x4523c8['message']);}}async[a0_0x4b87f1(0x149)](_0xef117d){const _0x52b69e=a0_0x4b87f1;try{await a0_0x30b1e0['rm'](_0xef117d,{'recursive':!![],'force':!![]});}catch(_0x36653b){this[_0x52b69e(0x168)]?.[_0x52b69e(0x14d)](_0x52b69e(0x15b),{'dirPath':_0xef117d,'error':_0x36653b['message']});throw new Error(_0x52b69e(0x134)+_0x36653b['message']);}}async['listFiles'](_0x1b04c4){const _0x358808=a0_0x4b87f1;try{const _0x6f5cf8=await a0_0x30b1e0[_0x358808(0x16c)](_0x1b04c4);return _0x6f5cf8;}catch(_0x24a007){this['logger']?.['error'](_0x358808(0x163),{'dirPath':_0x1b04c4,'error':_0x24a007[_0x358808(0x14f)]});throw new Error(_0x358808(0x16b)+_0x24a007['message']);}}}export default FileProcessor;
|