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

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 +15 -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,747 +1 @@
1
- /**
2
- * Tool Command Data Model - Type definitions and validation for tool executions
3
- *
4
- * Purpose:
5
- * - Define the structure and properties of tool commands and executions
6
- * - Provide validation functions for tool command data
7
- * - Handle tool execution lifecycle and state management
8
- */
9
-
10
- import { TOOL_STATUS, TOOL_NAMES, OPERATION_STATUS } from '../utilities/constants.js';
11
-
12
- /**
13
- * Tool Command data model
14
- * @typedef {Object} ToolCommand
15
- * @property {string} id - Unique command identifier
16
- * @property {string} toolId - Tool identifier (e.g., 'terminal', 'filesys')
17
- * @property {string} command - Command to execute
18
- * @property {Object} parameters - Command parameters
19
- * @property {string} status - Execution status (pending, executing, completed, failed)
20
- * @property {string} agentId - ID of agent executing the command
21
- * @property {string} conversationId - ID of parent conversation
22
- * @property {string} messageId - ID of parent message
23
- * @property {ToolExecution} execution - Execution details
24
- * @property {ToolMetadata} metadata - Command metadata
25
- * @property {string} createdAt - ISO timestamp of creation
26
- * @property {string} [startedAt] - ISO timestamp when execution started
27
- * @property {string} [completedAt] - ISO timestamp when execution completed
28
- * @property {number} priority - Command priority (1-5)
29
- * @property {number} timeout - Timeout in milliseconds
30
- * @property {number} retryCount - Number of retry attempts
31
- * @property {number} maxRetries - Maximum retry attempts allowed
32
- */
33
-
34
- /**
35
- * Tool Execution details
36
- * @typedef {Object} ToolExecution
37
- * @property {string} executionId - Unique execution identifier
38
- * @property {Object} input - Input parameters provided to tool
39
- * @property {Object} [output] - Tool execution output
40
- * @property {string} [error] - Error message if execution failed
41
- * @property {string} [errorCode] - Error code for programmatic handling
42
- * @property {number} executionTime - Time taken for execution (ms)
43
- * @property {number} memoryUsage - Memory usage during execution (bytes)
44
- * @property {number} cpuUsage - CPU usage percentage
45
- * @property {Object} metrics - Execution metrics and performance data
46
- * @property {ExecutionLog[]} logs - Execution logs and output
47
- * @property {Object} environment - Execution environment information
48
- * @property {string} [workingDirectory] - Working directory for execution
49
- * @property {Object} [environmentVariables] - Environment variables used
50
- */
51
-
52
- /**
53
- * Tool Metadata
54
- * @typedef {Object} ToolMetadata
55
- * @property {string} toolVersion - Version of the tool used
56
- * @property {string[]} capabilities - Tool capabilities used
57
- * @property {Object} configuration - Tool-specific configuration
58
- * @property {boolean} requiresAuth - Whether tool requires authentication
59
- * @property {string[]} dependencies - Tool dependencies
60
- * @property {Object} constraints - Execution constraints
61
- * @property {string[]} tags - Metadata tags
62
- * @property {Object} customFields - Custom metadata fields
63
- */
64
-
65
- /**
66
- * Execution Log entry
67
- * @typedef {Object} ExecutionLog
68
- * @property {string} id - Log entry identifier
69
- * @property {string} level - Log level (debug, info, warn, error)
70
- * @property {string} message - Log message
71
- * @property {string} timestamp - ISO timestamp
72
- * @property {Object} [data] - Additional log data
73
- * @property {string} [source] - Log source component
74
- */
75
-
76
- /**
77
- * Tool Definition
78
- * @typedef {Object} ToolDefinition
79
- * @property {string} id - Tool identifier
80
- * @property {string} name - Human-readable tool name
81
- * @property {string} description - Tool description
82
- * @property {string} version - Tool version
83
- * @property {ToolCapability[]} capabilities - Tool capabilities
84
- * @property {ParameterSchema} parameterSchema - Parameter validation schema
85
- * @property {Object} configuration - Default configuration
86
- * @property {string[]} requiredPermissions - Required permissions
87
- * @property {Object} constraints - Tool constraints and limits
88
- * @property {boolean} isAsync - Whether tool executes asynchronously
89
- * @property {number} defaultTimeout - Default timeout in milliseconds
90
- */
91
-
92
- /**
93
- * Tool Capability
94
- * @typedef {Object} ToolCapability
95
- * @property {string} id - Capability identifier
96
- * @property {string} name - Capability name
97
- * @property {string} description - Capability description
98
- * @property {string[]} commands - Supported commands
99
- * @property {Object} parameters - Capability-specific parameters
100
- * @property {Object} constraints - Capability constraints
101
- */
102
-
103
- /**
104
- * Parameter Schema
105
- * @typedef {Object} ParameterSchema
106
- * @property {Object} properties - Parameter definitions
107
- * @property {string[]} required - Required parameter names
108
- * @property {Object} additionalProperties - Additional property settings
109
- * @property {Object} examples - Example parameter sets
110
- */
111
-
112
- /**
113
- * Tool Command validation functions
114
- */
115
- export class ToolCommandValidator {
116
- /**
117
- * Validate tool command data structure
118
- * @param {Object} command - Tool command to validate
119
- * @returns {Object} Validation result
120
- */
121
- static validate(command) {
122
- const errors = [];
123
- const warnings = [];
124
-
125
- // Required fields
126
- if (!command.id || typeof command.id !== 'string') {
127
- errors.push('Command ID is required and must be a string');
128
- }
129
-
130
- if (!command.toolId || typeof command.toolId !== 'string') {
131
- errors.push('Tool ID is required and must be a string');
132
- }
133
-
134
- if (!command.command || typeof command.command !== 'string') {
135
- errors.push('Command is required and must be a string');
136
- }
137
-
138
- if (!command.agentId || typeof command.agentId !== 'string') {
139
- errors.push('Agent ID is required and must be a string');
140
- }
141
-
142
- // Tool ID validation
143
- if (command.toolId && !Object.values(TOOL_NAMES).includes(command.toolId) && !command.toolId.startsWith('custom_')) {
144
- warnings.push(`Unknown tool ID: ${command.toolId}`);
145
- }
146
-
147
- // Status validation
148
- if (command.status && !Object.values(TOOL_STATUS).includes(command.status)) {
149
- errors.push(`Invalid tool status: ${command.status}`);
150
- }
151
-
152
- // Parameters validation
153
- if (command.parameters && typeof command.parameters !== 'object') {
154
- errors.push('Parameters must be an object');
155
- }
156
-
157
- // Priority validation
158
- if (command.priority !== undefined) {
159
- if (typeof command.priority !== 'number' || command.priority < 1 || command.priority > 5) {
160
- errors.push('Priority must be a number between 1 and 5');
161
- }
162
- }
163
-
164
- // Timeout validation
165
- if (command.timeout !== undefined) {
166
- if (typeof command.timeout !== 'number' || command.timeout < 0) {
167
- errors.push('Timeout must be a non-negative number');
168
- }
169
-
170
- if (command.timeout > 3600000) { // 1 hour
171
- warnings.push('Timeout is very long (>1 hour)');
172
- }
173
- }
174
-
175
- // Retry validation
176
- if (command.retryCount !== undefined && typeof command.retryCount !== 'number') {
177
- errors.push('Retry count must be a number');
178
- }
179
-
180
- if (command.maxRetries !== undefined && typeof command.maxRetries !== 'number') {
181
- errors.push('Max retries must be a number');
182
- }
183
-
184
- if (command.retryCount && command.maxRetries && command.retryCount > command.maxRetries) {
185
- warnings.push('Retry count exceeds max retries');
186
- }
187
-
188
- // Execution validation
189
- if (command.execution) {
190
- const executionValidation = this.validateExecution(command.execution);
191
- errors.push(...executionValidation.errors);
192
- warnings.push(...executionValidation.warnings);
193
- }
194
-
195
- // Timestamp validation
196
- const timestampFields = ['createdAt', 'startedAt', 'completedAt'];
197
- timestampFields.forEach(field => {
198
- if (command[field] && !this.isValidTimestamp(command[field])) {
199
- errors.push(`Invalid timestamp for ${field}: ${command[field]}`);
200
- }
201
- });
202
-
203
- return {
204
- isValid: errors.length === 0,
205
- errors,
206
- warnings
207
- };
208
- }
209
-
210
- /**
211
- * Validate tool execution data
212
- * @param {Object} execution - Execution data to validate
213
- * @returns {Object} Validation result
214
- */
215
- static validateExecution(execution) {
216
- const errors = [];
217
- const warnings = [];
218
-
219
- if (!execution.executionId || typeof execution.executionId !== 'string') {
220
- errors.push('Execution ID is required and must be a string');
221
- }
222
-
223
- if (!execution.input || typeof execution.input !== 'object') {
224
- errors.push('Execution input is required and must be an object');
225
- }
226
-
227
- if (execution.executionTime !== undefined) {
228
- if (typeof execution.executionTime !== 'number' || execution.executionTime < 0) {
229
- errors.push('Execution time must be a non-negative number');
230
- }
231
- }
232
-
233
- if (execution.memoryUsage !== undefined) {
234
- if (typeof execution.memoryUsage !== 'number' || execution.memoryUsage < 0) {
235
- errors.push('Memory usage must be a non-negative number');
236
- }
237
- }
238
-
239
- if (execution.cpuUsage !== undefined) {
240
- if (typeof execution.cpuUsage !== 'number' || execution.cpuUsage < 0 || execution.cpuUsage > 100) {
241
- errors.push('CPU usage must be a number between 0 and 100');
242
- }
243
- }
244
-
245
- if (execution.logs && !Array.isArray(execution.logs)) {
246
- errors.push('Execution logs must be an array');
247
- }
248
-
249
- if (execution.logs) {
250
- execution.logs.forEach((log, index) => {
251
- if (!log.level || !log.message || !log.timestamp) {
252
- errors.push(`Log entry ${index} missing required fields`);
253
- }
254
- });
255
- }
256
-
257
- return { errors, warnings };
258
- }
259
-
260
- /**
261
- * Validate tool definition
262
- * @param {Object} toolDef - Tool definition to validate
263
- * @returns {Object} Validation result
264
- */
265
- static validateToolDefinition(toolDef) {
266
- const errors = [];
267
- const warnings = [];
268
-
269
- // Required fields
270
- if (!toolDef.id || typeof toolDef.id !== 'string') {
271
- errors.push('Tool ID is required and must be a string');
272
- }
273
-
274
- if (!toolDef.name || typeof toolDef.name !== 'string') {
275
- errors.push('Tool name is required and must be a string');
276
- }
277
-
278
- if (!toolDef.description || typeof toolDef.description !== 'string') {
279
- errors.push('Tool description is required and must be a string');
280
- }
281
-
282
- if (!toolDef.version || typeof toolDef.version !== 'string') {
283
- errors.push('Tool version is required and must be a string');
284
- }
285
-
286
- // Capabilities validation
287
- if (!toolDef.capabilities || !Array.isArray(toolDef.capabilities)) {
288
- errors.push('Tool capabilities are required and must be an array');
289
- }
290
-
291
- if (toolDef.capabilities && toolDef.capabilities.length === 0) {
292
- warnings.push('Tool has no capabilities defined');
293
- }
294
-
295
- // Parameter schema validation
296
- if (toolDef.parameterSchema && typeof toolDef.parameterSchema !== 'object') {
297
- errors.push('Parameter schema must be an object');
298
- }
299
-
300
- // Timeout validation
301
- if (toolDef.defaultTimeout !== undefined) {
302
- if (typeof toolDef.defaultTimeout !== 'number' || toolDef.defaultTimeout <= 0) {
303
- errors.push('Default timeout must be a positive number');
304
- }
305
- }
306
-
307
- return { errors, warnings };
308
- }
309
-
310
- /**
311
- * Validate command parameters against tool definition
312
- * @param {Object} parameters - Parameters to validate
313
- * @param {ParameterSchema} schema - Parameter schema
314
- * @returns {Object} Validation result
315
- */
316
- static validateParameters(parameters, schema) {
317
- const errors = [];
318
- const warnings = [];
319
-
320
- if (!schema || !schema.properties) {
321
- return { errors: [], warnings: ['No parameter schema provided'] };
322
- }
323
-
324
- // Check required parameters
325
- if (schema.required) {
326
- schema.required.forEach(paramName => {
327
- if (!(paramName in parameters)) {
328
- errors.push(`Required parameter missing: ${paramName}`);
329
- }
330
- });
331
- }
332
-
333
- // Validate parameter types and constraints
334
- Object.entries(parameters).forEach(([paramName, paramValue]) => {
335
- const paramDef = schema.properties[paramName];
336
-
337
- if (!paramDef) {
338
- if (!schema.additionalProperties) {
339
- warnings.push(`Unknown parameter: ${paramName}`);
340
- }
341
- return;
342
- }
343
-
344
- // Type validation
345
- if (paramDef.type) {
346
- const actualType = Array.isArray(paramValue) ? 'array' : typeof paramValue;
347
- if (actualType !== paramDef.type) {
348
- errors.push(`Parameter ${paramName} must be of type ${paramDef.type}, got ${actualType}`);
349
- }
350
- }
351
-
352
- // Range validation for numbers
353
- if (paramDef.type === 'number') {
354
- if (paramDef.minimum !== undefined && paramValue < paramDef.minimum) {
355
- errors.push(`Parameter ${paramName} must be >= ${paramDef.minimum}`);
356
- }
357
- if (paramDef.maximum !== undefined && paramValue > paramDef.maximum) {
358
- errors.push(`Parameter ${paramName} must be <= ${paramDef.maximum}`);
359
- }
360
- }
361
-
362
- // Length validation for strings
363
- if (paramDef.type === 'string') {
364
- if (paramDef.minLength !== undefined && paramValue.length < paramDef.minLength) {
365
- errors.push(`Parameter ${paramName} must be at least ${paramDef.minLength} characters`);
366
- }
367
- if (paramDef.maxLength !== undefined && paramValue.length > paramDef.maxLength) {
368
- errors.push(`Parameter ${paramName} must be at most ${paramDef.maxLength} characters`);
369
- }
370
- }
371
-
372
- // Enum validation
373
- if (paramDef.enum && !paramDef.enum.includes(paramValue)) {
374
- errors.push(`Parameter ${paramName} must be one of: ${paramDef.enum.join(', ')}`);
375
- }
376
- });
377
-
378
- return { errors, warnings };
379
- }
380
-
381
- /**
382
- * Check if a timestamp is valid ISO string
383
- * @param {string} timestamp - Timestamp to validate
384
- * @returns {boolean} True if valid
385
- */
386
- static isValidTimestamp(timestamp) {
387
- if (typeof timestamp !== 'string') return false;
388
- const date = new Date(timestamp);
389
- return date instanceof Date && !isNaN(date.getTime());
390
- }
391
- }
392
-
393
- /**
394
- * Tool Command factory functions
395
- */
396
- export class ToolCommandFactory {
397
- /**
398
- * Create a new tool command
399
- * @param {string} toolId - Tool identifier
400
- * @param {string} command - Command to execute
401
- * @param {Object} parameters - Command parameters
402
- * @param {Object} options - Additional options
403
- * @returns {ToolCommand} New tool command object
404
- */
405
- static create(toolId, command, parameters, options = {}) {
406
- const now = new Date().toISOString();
407
- const commandId = this.generateCommandId();
408
- const executionId = this.generateExecutionId();
409
-
410
- return {
411
- id: commandId,
412
- toolId,
413
- command,
414
- parameters: parameters || {},
415
- status: TOOL_STATUS.PENDING,
416
- agentId: options.agentId || '',
417
- conversationId: options.conversationId || '',
418
- messageId: options.messageId || '',
419
- execution: {
420
- executionId,
421
- input: { command, parameters },
422
- output: null,
423
- error: null,
424
- errorCode: null,
425
- executionTime: 0,
426
- memoryUsage: 0,
427
- cpuUsage: 0,
428
- metrics: {},
429
- logs: [],
430
- environment: options.environment || {},
431
- workingDirectory: options.workingDirectory || null,
432
- environmentVariables: options.environmentVariables || {}
433
- },
434
- metadata: this.createDefaultMetadata(options.metadata),
435
- createdAt: now,
436
- startedAt: null,
437
- completedAt: null,
438
- priority: options.priority || 3,
439
- timeout: options.timeout || 30000,
440
- retryCount: 0,
441
- maxRetries: options.maxRetries || 3
442
- };
443
- }
444
-
445
- /**
446
- * Create execution log entry
447
- * @param {string} level - Log level
448
- * @param {string} message - Log message
449
- * @param {Object} data - Additional log data
450
- * @returns {ExecutionLog} Log entry
451
- */
452
- static createLogEntry(level, message, data = null) {
453
- return {
454
- id: this.generateLogId(),
455
- level,
456
- message,
457
- timestamp: new Date().toISOString(),
458
- data,
459
- source: 'tool-execution'
460
- };
461
- }
462
-
463
- /**
464
- * Create default tool metadata
465
- * @param {Object} overrides - Metadata overrides
466
- * @returns {ToolMetadata} Default metadata
467
- */
468
- static createDefaultMetadata(overrides = {}) {
469
- return {
470
- toolVersion: '1.0.0',
471
- capabilities: [],
472
- configuration: {},
473
- requiresAuth: false,
474
- dependencies: [],
475
- constraints: {},
476
- tags: [],
477
- customFields: {},
478
- ...overrides
479
- };
480
- }
481
-
482
- /**
483
- * Generate unique command ID
484
- * @returns {string} Unique command ID
485
- */
486
- static generateCommandId() {
487
- const timestamp = Date.now().toString(36);
488
- const random = Math.random().toString(36).substr(2, 9);
489
- return `cmd_${timestamp}_${random}`;
490
- }
491
-
492
- /**
493
- * Generate unique execution ID
494
- * @returns {string} Unique execution ID
495
- */
496
- static generateExecutionId() {
497
- const timestamp = Date.now().toString(36);
498
- const random = Math.random().toString(36).substr(2, 9);
499
- return `exec_${timestamp}_${random}`;
500
- }
501
-
502
- /**
503
- * Generate unique log ID
504
- * @returns {string} Unique log ID
505
- */
506
- static generateLogId() {
507
- const timestamp = Date.now().toString(36);
508
- const random = Math.random().toString(36).substr(2, 6);
509
- return `log_${timestamp}_${random}`;
510
- }
511
- }
512
-
513
- /**
514
- * Tool Command utility functions
515
- */
516
- export class ToolCommandUtils {
517
- /**
518
- * Check if command is still pending
519
- * @param {ToolCommand} command - Command to check
520
- * @returns {boolean} True if pending
521
- */
522
- static isPending(command) {
523
- return command.status === TOOL_STATUS.PENDING;
524
- }
525
-
526
- /**
527
- * Check if command is currently executing
528
- * @param {ToolCommand} command - Command to check
529
- * @returns {boolean} True if executing
530
- */
531
- static isExecuting(command) {
532
- return command.status === TOOL_STATUS.EXECUTING;
533
- }
534
-
535
- /**
536
- * Check if command has completed successfully
537
- * @param {ToolCommand} command - Command to check
538
- * @returns {boolean} True if completed
539
- */
540
- static isCompleted(command) {
541
- return command.status === TOOL_STATUS.COMPLETED;
542
- }
543
-
544
- /**
545
- * Check if command has failed
546
- * @param {ToolCommand} command - Command to check
547
- * @returns {boolean} True if failed
548
- */
549
- static isFailed(command) {
550
- return command.status === TOOL_STATUS.FAILED;
551
- }
552
-
553
- /**
554
- * Check if command has timed out
555
- * @param {ToolCommand} command - Command to check
556
- * @returns {boolean} True if timed out
557
- */
558
- static isTimedOut(command) {
559
- if (!command.startedAt || command.status !== TOOL_STATUS.EXECUTING) {
560
- return false;
561
- }
562
-
563
- const startTime = new Date(command.startedAt);
564
- const now = new Date();
565
- const elapsed = now.getTime() - startTime.getTime();
566
-
567
- return elapsed > command.timeout;
568
- }
569
-
570
- /**
571
- * Calculate command execution time
572
- * @param {ToolCommand} command - Command to analyze
573
- * @returns {number|null} Execution time in milliseconds, null if not applicable
574
- */
575
- static getExecutionTime(command) {
576
- if (!command.startedAt) return null;
577
-
578
- const endTime = command.completedAt ? new Date(command.completedAt) : new Date();
579
- const startTime = new Date(command.startedAt);
580
-
581
- return endTime.getTime() - startTime.getTime();
582
- }
583
-
584
- /**
585
- * Get command progress information
586
- * @param {ToolCommand} command - Command to analyze
587
- * @returns {Object} Progress information
588
- */
589
- static getProgress(command) {
590
- const executionTime = this.getExecutionTime(command);
591
- const isTimedOut = this.isTimedOut(command);
592
-
593
- let progressPercentage = 0;
594
- if (command.status === TOOL_STATUS.COMPLETED) {
595
- progressPercentage = 100;
596
- } else if (command.status === TOOL_STATUS.EXECUTING && executionTime) {
597
- // Estimate progress based on execution time vs timeout
598
- progressPercentage = Math.min(95, (executionTime / command.timeout) * 100);
599
- }
600
-
601
- return {
602
- status: command.status,
603
- percentage: Math.round(progressPercentage),
604
- executionTime,
605
- isTimedOut,
606
- remainingTime: command.status === TOOL_STATUS.EXECUTING && executionTime
607
- ? Math.max(0, command.timeout - executionTime)
608
- : null
609
- };
610
- }
611
-
612
- /**
613
- * Extract key metrics from command execution
614
- * @param {ToolCommand} command - Command to analyze
615
- * @returns {Object} Execution metrics
616
- */
617
- static getMetrics(command) {
618
- const execution = command.execution || {};
619
- const progress = this.getProgress(command);
620
-
621
- return {
622
- executionTime: execution.executionTime || progress.executionTime || 0,
623
- memoryUsage: execution.memoryUsage || 0,
624
- cpuUsage: execution.cpuUsage || 0,
625
- status: command.status,
626
- retryCount: command.retryCount,
627
- priority: command.priority,
628
- logEntries: execution.logs ? execution.logs.length : 0,
629
- hasError: !!execution.error,
630
- errorCode: execution.errorCode || null
631
- };
632
- }
633
-
634
- /**
635
- * Format command for display
636
- * @param {ToolCommand} command - Command to format
637
- * @returns {Object} Formatted command data
638
- */
639
- static formatForDisplay(command) {
640
- const progress = this.getProgress(command);
641
- const metrics = this.getMetrics(command);
642
-
643
- return {
644
- id: command.id,
645
- toolId: command.toolId,
646
- command: command.command,
647
- status: command.status,
648
- progress: progress.percentage,
649
- executionTime: metrics.executionTime,
650
- createdAt: command.createdAt,
651
- startedAt: command.startedAt,
652
- completedAt: command.completedAt,
653
- hasError: metrics.hasError,
654
- retryCount: command.retryCount
655
- };
656
- }
657
-
658
- /**
659
- * Sanitize command for API responses
660
- * @param {ToolCommand} command - Command to sanitize
661
- * @returns {Object} Sanitized command data
662
- */
663
- static sanitize(command) {
664
- const sanitized = { ...command };
665
-
666
- // Remove sensitive execution data
667
- if (sanitized.execution) {
668
- delete sanitized.execution.environmentVariables;
669
- delete sanitized.execution.environment;
670
-
671
- // Truncate long logs
672
- if (sanitized.execution.logs && sanitized.execution.logs.length > 10) {
673
- sanitized.execution.logs = sanitized.execution.logs.slice(-10);
674
- }
675
- }
676
-
677
- // Remove sensitive parameters
678
- if (sanitized.parameters) {
679
- const sensitiveKeys = ['password', 'token', 'secret', 'key', 'auth'];
680
- Object.keys(sanitized.parameters).forEach(key => {
681
- if (sensitiveKeys.some(sensitive => key.toLowerCase().includes(sensitive))) {
682
- sanitized.parameters[key] = '[REDACTED]';
683
- }
684
- });
685
- }
686
-
687
- return sanitized;
688
- }
689
-
690
- /**
691
- * Create command summary for reporting
692
- * @param {ToolCommand[]} commands - Commands to summarize
693
- * @returns {Object} Command summary
694
- */
695
- static summarizeCommands(commands) {
696
- const summary = {
697
- total: commands.length,
698
- byStatus: {},
699
- byTool: {},
700
- totalExecutionTime: 0,
701
- averageExecutionTime: 0,
702
- successRate: 0,
703
- mostUsedTools: [],
704
- recentCommands: []
705
- };
706
-
707
- // Count by status
708
- Object.values(TOOL_STATUS).forEach(status => {
709
- summary.byStatus[status] = commands.filter(cmd => cmd.status === status).length;
710
- });
711
-
712
- // Count by tool
713
- commands.forEach(command => {
714
- summary.byTool[command.toolId] = (summary.byTool[command.toolId] || 0) + 1;
715
-
716
- const executionTime = this.getExecutionTime(command) || 0;
717
- summary.totalExecutionTime += executionTime;
718
- });
719
-
720
- // Calculate averages and rates
721
- if (commands.length > 0) {
722
- summary.averageExecutionTime = summary.totalExecutionTime / commands.length;
723
- const successfulCommands = summary.byStatus[TOOL_STATUS.COMPLETED] || 0;
724
- summary.successRate = (successfulCommands / commands.length) * 100;
725
- }
726
-
727
- // Most used tools
728
- summary.mostUsedTools = Object.entries(summary.byTool)
729
- .sort((a, b) => b[1] - a[1])
730
- .slice(0, 5)
731
- .map(([toolId, count]) => ({ toolId, count }));
732
-
733
- // Recent commands
734
- summary.recentCommands = commands
735
- .sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
736
- .slice(0, 10)
737
- .map(cmd => this.formatForDisplay(cmd));
738
-
739
- return summary;
740
- }
741
- }
742
-
743
- export default {
744
- ToolCommandValidator,
745
- ToolCommandFactory,
746
- ToolCommandUtils
747
- };
1
+ const a0_0x5ed4f7=a0_0xb879;(function(_0xb93ac5,_0x224a8b){const _0x3837e0=a0_0xb879,_0x2bd8b2=_0xb93ac5();while(!![]){try{const _0x1bd5ff=-parseInt(_0x3837e0(0xd9))/0x1*(-parseInt(_0x3837e0(0xa7))/0x2)+parseInt(_0x3837e0(0x96))/0x3*(parseInt(_0x3837e0(0xc0))/0x4)+parseInt(_0x3837e0(0xdc))/0x5*(-parseInt(_0x3837e0(0xf1))/0x6)+parseInt(_0x3837e0(0xc3))/0x7+parseInt(_0x3837e0(0xea))/0x8+-parseInt(_0x3837e0(0xd0))/0x9*(parseInt(_0x3837e0(0xb0))/0xa)+parseInt(_0x3837e0(0xf9))/0xb*(-parseInt(_0x3837e0(0xbe))/0xc);if(_0x1bd5ff===_0x224a8b)break;else _0x2bd8b2['push'](_0x2bd8b2['shift']());}catch(_0x470fc4){_0x2bd8b2['push'](_0x2bd8b2['shift']());}}}(a0_0x4757,0xf1eca));function a0_0x4757(){const _0x17c4c6=['mZGWotiYr3LfzNDo','AxnuAw1Lze91Da','qwDLBNqGsuqGAxmGCMvXDwLYzwqGyw5Kig11C3qGyMuGysbZDhjPBMC','Bwf4tgvUz3rO','zw52AxjVBM1LBNrwyxjPywjSzxm','zM9YBwf0rM9YrgLZCgXHEq','Aw5WDxq','BM93','ndK3mKXMD1HmtW','vw5RBM93BIb0B29SieLeoIa','y3vZDg9TxW','vg9VBcbjrcbPCYbYzxf1AxjLzcbHBMqGBxvZDcbIzsbHihn0CMLUzW','ChvZAa','Bgv2zwW','uMv0CNKGy291BNqGBxvZDcbIzsbHig51BwjLCG','ugfYyw1LDgvYia','CMfUzg9T','DMfSAwrHDgvqyxjHBwv0zxjZ','zgvZy3jPChrPB24','BMfTzq','BwvZC2fNzuLK','rxHLy3v0Aw9UieLeigLZihjLCxvPCMvKigfUzcbTDxn0igjLigeGC3rYAw5N','Dg9mB3DLCKnHC2u','rxHLy3v0Aw9UigLUChv0igLZihjLCxvPCMvKigfUzcbTDxn0igjLigfUig9IAMvJDa','otiWmwTTCxrtBG','CgfYyw1LDgvYu2nOzw1H','ig11C3qGyMuGpJ0G','zxjYB3i','zxHLy3v0Aw9Uswq','DgLTzw91Da','ig11C3qGyMuGpd0G','ywDLBNrjza','yxzLCMfNzuv4zwn1DgLVBLrPBwu','twf4ihjLDhjPzxmGBxvZDcbIzsbHig51BwjLCG','CMv0CNLdB3vUDa','z2v0twv0CMLJCW','y3b1vxnHz2u','ignOyxjHy3rLCNm','DhLWzq','zM9YrwfJAa','z2v0vgLTzq','mJuYmKrMB2n0AW','ig11C3qGyMuGyxqGBw9ZDca','tg9NigvUDhj5ia','y2fWywjPBgL0AwvZ','C2fUAxrPEMu','C3rYAw5N','q09nueXfveve','yNLuB29S','y3jLyxrLtg9Nrw50CNK','mtbKDxf5shq','Bg9NxW','Bwf4uMv0CMLLCW','C3rHCNrLzef0','y29TCgXLDgvKqxq','z2v0uhjVz3jLC3m','ChjPB3jPDhK','AgfZrxjYB3i','BwLUAw11Bq','uMvXDwLYzwqGCgfYyw1LDgvYig1PC3nPBMC6ia','zw50CMLLCW','Bg9NCW','ywrKAxrPB25HBfbYB3bLCNrPzxm','ig11C3qGyMuGB2yGDhLWzsa','nda2mJbYr2jirMq','zw52AxjVBM1LBNq','mJa0zvHABMnW','z2vUzxjHDgvfEgvJDxrPB25jza','BwLU','ode3mdCWmxLsy3LOAW','BwvTB3j5vxnHz2u','C2XPy2u','ugfYyw1LDgvYihnJAgvTysbTDxn0igjLigfUig9IAMvJDa','Dg9tDhjPBMC','CgfYyw1LDgvYCW','Dg9Rzw4','z2v0rxHLy3v0Aw9UvgLTzq','z2vUzxjHDgvdB21Tyw5Kswq','C3vJy2vZC1jHDgu','BNvTyMvY','zxHLy3v0Aw9U','uevoreLorW','mtm2mdCZn1jNrKXUEq','DMvYC2LVBG','BwfW','vg9VBcbUyw1LigLZihjLCxvPCMvKigfUzcbTDxn0igjLigeGC3rYAw5N','zgvMyxvSDfrPBwvVDxq','yNLtDgf0Dxm','C3rHDhvZ','vg9VBcbJyxbHyMLSAxrPzxmGyxjLihjLCxvPCMvKigfUzcbTDxn0igjLigfUigfYCMf5','rvHfq1vusu5h','ndu0su1JtNDX','vw5RBM93BIbWyxjHBwv0zxi6ia','Bwf4Aw11Bq','odvyBerAuwS','AxndB21WBgv0zwq','y3jLyxrLzef0','C3vIC3rY','Dg9ju09tDhjPBMC','rxHLy3v0Aw9UihrPBwuGBxvZDcbIzsbHig5VBI1UzwDHDgL2zsbUDw1Izxi','zxHLy3v0Aw9UvgLTzq','sw52ywXPzcb0B29Sihn0yxr1CZOG','w1jfrefdvevexq','vg9VBcbOyxmGBM8Gy2fWywjPBgL0AwvZigrLzMLUzwq','BwLUtgvUz3rO','BgvUz3rO','AxnwywXPzfrPBwvZDgfTCa','uMv0CNKGy291BNqGzxHJzwvKCYbTyxGGCMv0CMLLCW','mtq4ndiWodbiCureDNa','uhjPB3jPDhKGBxvZDcbIzsbHig51BwjLCIbIzxr3zwvUideGyw5Kidu','z2vUzxjHDgvmB2Djza','zw51Bq','DMfSAwrHDgvfEgvJDxrPB24','Dg9VBeLK','C29Tzq'];a0_0x4757=function(){return _0x17c4c6;};return a0_0x4757();}import{TOOL_STATUS,TOOL_NAMES,OPERATION_STATUS}from'../utilities/constants.js';export class ToolCommandValidator{static['validate'](_0xb14e7){const _0x27bcb6=a0_0xb879,_0x1df37f=[],_0x1e08c7=[];(!_0xb14e7['id']||typeof _0xb14e7['id']!=='string')&&_0x1df37f['push']('Command\x20ID\x20is\x20required\x20and\x20must\x20be\x20a\x20string');(!_0xb14e7[_0x27bcb6(0xef)]||typeof _0xb14e7[_0x27bcb6(0xef)]!=='string')&&_0x1df37f['push']('Tool\x20ID\x20is\x20required\x20and\x20must\x20be\x20a\x20string');(!_0xb14e7['command']||typeof _0xb14e7['command']!=='string')&&_0x1df37f['push']('Command\x20is\x20required\x20and\x20must\x20be\x20a\x20string');(!_0xb14e7[_0x27bcb6(0x9d)]||typeof _0xb14e7['agentId']!==_0x27bcb6(0xac))&&_0x1df37f['push'](_0x27bcb6(0xf3));_0xb14e7[_0x27bcb6(0xef)]&&!Object['values'](TOOL_NAMES)['includes'](_0xb14e7['toolId'])&&!_0xb14e7['toolId']['startsWith'](_0x27bcb6(0x88))&&_0x1e08c7[_0x27bcb6(0x8a)](_0x27bcb6(0xfa)+_0xb14e7['toolId']);_0xb14e7['status']&&!Object['values'](TOOL_STATUS)['includes'](_0xb14e7['status'])&&_0x1df37f[_0x27bcb6(0x8a)](_0x27bcb6(0xe3)+_0xb14e7[_0x27bcb6(0xd6)]);_0xb14e7[_0x27bcb6(0xc8)]&&typeof _0xb14e7[_0x27bcb6(0xc8)]!=='object'&&_0x1df37f[_0x27bcb6(0x8a)]('Parameters\x20must\x20be\x20an\x20object');_0xb14e7[_0x27bcb6(0xb6)]!==undefined&&((typeof _0xb14e7[_0x27bcb6(0xb6)]!==_0x27bcb6(0xcd)||_0xb14e7['priority']<0x1||_0xb14e7[_0x27bcb6(0xb6)]>0x5)&&_0x1df37f['push'](_0x27bcb6(0xeb)));_0xb14e7[_0x27bcb6(0x9b)]!==undefined&&((typeof _0xb14e7['timeout']!=='number'||_0xb14e7[_0x27bcb6(0x9b)]<0x0)&&_0x1df37f[_0x27bcb6(0x8a)]('Timeout\x20must\x20be\x20a\x20non-negative\x20number'),_0xb14e7['timeout']>0x36ee80&&_0x1e08c7[_0x27bcb6(0x8a)]('Timeout\x20is\x20very\x20long\x20(>1\x20hour)'));_0xb14e7['retryCount']!==undefined&&typeof _0xb14e7['retryCount']!=='number'&&_0x1df37f[_0x27bcb6(0x8a)](_0x27bcb6(0x8c));_0xb14e7[_0x27bcb6(0xb2)]!==undefined&&typeof _0xb14e7[_0x27bcb6(0xb2)]!=='number'&&_0x1df37f['push'](_0x27bcb6(0x9f));_0xb14e7[_0x27bcb6(0xa0)]&&_0xb14e7['maxRetries']&&_0xb14e7[_0x27bcb6(0xa0)]>_0xb14e7['maxRetries']&&_0x1e08c7[_0x27bcb6(0x8a)](_0x27bcb6(0xe9));if(_0xb14e7[_0x27bcb6(0xce)]){const _0x1e59a7=this[_0x27bcb6(0xee)](_0xb14e7['execution']);_0x1df37f[_0x27bcb6(0x8a)](..._0x1e59a7['errors']),_0x1e08c7[_0x27bcb6(0x8a)](..._0x1e59a7['warnings']);}const _0x2e4a35=[_0x27bcb6(0xde),_0x27bcb6(0xb3),'completedAt'];return _0x2e4a35[_0x27bcb6(0xa5)](_0x317bd8=>{const _0x33cbbd=_0x27bcb6;_0xb14e7[_0x317bd8]&&!this[_0x33cbbd(0xe8)](_0xb14e7[_0x317bd8])&&_0x1df37f['push']('Invalid\x20timestamp\x20for\x20'+_0x317bd8+':\x20'+_0xb14e7[_0x317bd8]);}),{'isValid':_0x1df37f['length']===0x0,'errors':_0x1df37f,'warnings':_0x1e08c7};}static[a0_0x5ed4f7(0xee)](_0x2fd54f){const _0x3abc40=a0_0x5ed4f7,_0x43f3f6=[],_0x53c6ab=[];return(!_0x2fd54f[_0x3abc40(0x9a)]||typeof _0x2fd54f[_0x3abc40(0x9a)]!=='string')&&_0x43f3f6['push'](_0x3abc40(0x93)),(!_0x2fd54f[_0x3abc40(0xf7)]||typeof _0x2fd54f[_0x3abc40(0xf7)]!=='object')&&_0x43f3f6['push'](_0x3abc40(0x95)),_0x2fd54f['executionTime']!==undefined&&((typeof _0x2fd54f['executionTime']!==_0x3abc40(0xcd)||_0x2fd54f['executionTime']<0x0)&&_0x43f3f6['push'](_0x3abc40(0xe1))),_0x2fd54f['memoryUsage']!==undefined&&((typeof _0x2fd54f['memoryUsage']!=='number'||_0x2fd54f['memoryUsage']<0x0)&&_0x43f3f6[_0x3abc40(0x8a)]('Memory\x20usage\x20must\x20be\x20a\x20non-negative\x20number')),_0x2fd54f['cpuUsage']!==undefined&&((typeof _0x2fd54f[_0x3abc40(0xa2)]!==_0x3abc40(0xcd)||_0x2fd54f['cpuUsage']<0x0||_0x2fd54f[_0x3abc40(0xa2)]>0x64)&&_0x43f3f6[_0x3abc40(0x8a)]('CPU\x20usage\x20must\x20be\x20a\x20number\x20between\x200\x20and\x20100')),_0x2fd54f['logs']&&!Array['isArray'](_0x2fd54f[_0x3abc40(0xbb)])&&_0x43f3f6[_0x3abc40(0x8a)]('Execution\x20logs\x20must\x20be\x20an\x20array'),_0x2fd54f['logs']&&_0x2fd54f[_0x3abc40(0xbb)][_0x3abc40(0xa5)]((_0x43a41b,_0x3ded12)=>{const _0x4c72a4=_0x3abc40;(!_0x43a41b[_0x4c72a4(0x8b)]||!_0x43a41b['message']||!_0x43a41b['timestamp'])&&_0x43f3f6['push'](_0x4c72a4(0xa9)+_0x3ded12+'\x20missing\x20required\x20fields');}),{'errors':_0x43f3f6,'warnings':_0x53c6ab};}static['validateToolDefinition'](_0x2ded81){const _0x6671ed=a0_0x5ed4f7,_0x18f176=[],_0x58989e=[];return(!_0x2ded81['id']||typeof _0x2ded81['id']!==_0x6671ed(0xac))&&_0x18f176['push'](_0x6671ed(0x89)),(!_0x2ded81[_0x6671ed(0x91)]||typeof _0x2ded81['name']!==_0x6671ed(0xac))&&_0x18f176['push'](_0x6671ed(0xd3)),(!_0x2ded81[_0x6671ed(0x90)]||typeof _0x2ded81['description']!=='string')&&_0x18f176['push']('Tool\x20description\x20is\x20required\x20and\x20must\x20be\x20a\x20string'),(!_0x2ded81['version']||typeof _0x2ded81[_0x6671ed(0xd1)]!=='string')&&_0x18f176[_0x6671ed(0x8a)]('Tool\x20version\x20is\x20required\x20and\x20must\x20be\x20a\x20string'),(!_0x2ded81[_0x6671ed(0xaa)]||!Array['isArray'](_0x2ded81['capabilities']))&&_0x18f176[_0x6671ed(0x8a)](_0x6671ed(0xd7)),_0x2ded81[_0x6671ed(0xaa)]&&_0x2ded81['capabilities'][_0x6671ed(0xe7)]===0x0&&_0x58989e['push'](_0x6671ed(0xe5)),_0x2ded81[_0x6671ed(0x97)]&&typeof _0x2ded81['parameterSchema']!=='object'&&_0x18f176[_0x6671ed(0x8a)](_0x6671ed(0xc6)),_0x2ded81[_0x6671ed(0xd4)]!==undefined&&((typeof _0x2ded81['defaultTimeout']!==_0x6671ed(0xcd)||_0x2ded81[_0x6671ed(0xd4)]<=0x0)&&_0x18f176[_0x6671ed(0x8a)]('Default\x20timeout\x20must\x20be\x20a\x20positive\x20number')),{'errors':_0x18f176,'warnings':_0x58989e};}static[a0_0x5ed4f7(0x8f)](_0x33e2cd,_0x54f6e6){const _0xc6f714=a0_0x5ed4f7,_0x5274c0=[],_0x5c0a11=[];if(!_0x54f6e6||!_0x54f6e6['properties'])return{'errors':[],'warnings':['No\x20parameter\x20schema\x20provided']};return _0x54f6e6['required']&&_0x54f6e6['required'][_0xc6f714(0xa5)](_0x30249a=>{const _0xf6e097=_0xc6f714;!(_0x30249a in _0x33e2cd)&&_0x5274c0['push'](_0xf6e097(0xb9)+_0x30249a);}),Object[_0xc6f714(0xba)](_0x33e2cd)['forEach'](([_0x4e627b,_0xd98cda])=>{const _0x3b5fbd=_0xc6f714,_0x23f405=_0x54f6e6['properties'][_0x4e627b];if(!_0x23f405){!_0x54f6e6[_0x3b5fbd(0xbc)]&&_0x5c0a11['push'](_0x3b5fbd(0xda)+_0x4e627b);return;}if(_0x23f405['type']){const _0x4aed08=Array['isArray'](_0xd98cda)?'array':typeof _0xd98cda;_0x4aed08!==_0x23f405['type']&&_0x5274c0['push'](_0x3b5fbd(0x8d)+_0x4e627b+_0x3b5fbd(0xbd)+_0x23f405[_0x3b5fbd(0xa4)]+',\x20got\x20'+_0x4aed08);}_0x23f405[_0x3b5fbd(0xa4)]===_0x3b5fbd(0xcd)&&(_0x23f405[_0x3b5fbd(0xb8)]!==undefined&&_0xd98cda<_0x23f405[_0x3b5fbd(0xb8)]&&_0x5274c0[_0x3b5fbd(0x8a)]('Parameter\x20'+_0x4e627b+_0x3b5fbd(0x98)+_0x23f405['minimum']),_0x23f405[_0x3b5fbd(0xdb)]!==undefined&&_0xd98cda>_0x23f405[_0x3b5fbd(0xdb)]&&_0x5274c0['push']('Parameter\x20'+_0x4e627b+_0x3b5fbd(0x9c)+_0x23f405[_0x3b5fbd(0xdb)])),_0x23f405[_0x3b5fbd(0xa4)]==='string'&&(_0x23f405[_0x3b5fbd(0xe6)]!==undefined&&_0xd98cda[_0x3b5fbd(0xe7)]<_0x23f405['minLength']&&_0x5274c0[_0x3b5fbd(0x8a)]('Parameter\x20'+_0x4e627b+'\x20must\x20be\x20at\x20least\x20'+_0x23f405[_0x3b5fbd(0xe6)]+_0x3b5fbd(0xa3)),_0x23f405['maxLength']!==undefined&&_0xd98cda[_0x3b5fbd(0xe7)]>_0x23f405['maxLength']&&_0x5274c0['push'](_0x3b5fbd(0x8d)+_0x4e627b+_0x3b5fbd(0xa8)+_0x23f405[_0x3b5fbd(0xf4)]+'\x20characters')),_0x23f405['enum']&&!_0x23f405[_0x3b5fbd(0xed)]['includes'](_0xd98cda)&&_0x5274c0['push']('Parameter\x20'+_0x4e627b+'\x20must\x20be\x20one\x20of:\x20'+_0x23f405['enum']['join'](',\x20'));}),{'errors':_0x5274c0,'warnings':_0x5c0a11};}static[a0_0x5ed4f7(0xe8)](_0x184a20){if(typeof _0x184a20!=='string')return![];const _0x2c70d8=new Date(_0x184a20);return _0x2c70d8 instanceof Date&&!isNaN(_0x2c70d8['getTime']());}}export class ToolCommandFactory{static['create'](_0x228f38,_0x3ee80f,_0x849a9e,_0x404db9={}){const _0x3308f5=a0_0x5ed4f7,_0x55c28c=new Date()['toISOString'](),_0x5cce0c=this['generateCommandId'](),_0x5c9ed3=this[_0x3308f5(0xc1)]();return{'id':_0x5cce0c,'toolId':_0x228f38,'command':_0x3ee80f,'parameters':_0x849a9e||{},'status':TOOL_STATUS[_0x3308f5(0xcf)],'agentId':_0x404db9[_0x3308f5(0x9d)]||'','conversationId':_0x404db9['conversationId']||'','messageId':_0x404db9[_0x3308f5(0x92)]||'','execution':{'executionId':_0x5c9ed3,'input':{'command':_0x3ee80f,'parameters':_0x849a9e},'output':null,'error':null,'errorCode':null,'executionTime':0x0,'memoryUsage':0x0,'cpuUsage':0x0,'metrics':{},'logs':[],'environment':_0x404db9['environment']||{},'workingDirectory':_0x404db9['workingDirectory']||null,'environmentVariables':_0x404db9[_0x3308f5(0xf5)]||{}},'metadata':this['createDefaultMetadata'](_0x404db9['metadata']),'createdAt':_0x55c28c,'startedAt':null,'completedAt':null,'priority':_0x404db9['priority']||0x3,'timeout':_0x404db9[_0x3308f5(0x9b)]||0x7530,'retryCount':0x0,'maxRetries':_0x404db9['maxRetries']||0x3};}static[a0_0x5ed4f7(0xaf)](_0x25d228,_0x5b7d42,_0x35f9be=null){const _0x393a4c=a0_0x5ed4f7;return{'id':this[_0x393a4c(0xec)](),'level':_0x25d228,'message':_0x5b7d42,'timestamp':new Date()[_0x393a4c(0xe0)](),'data':_0x35f9be,'source':'tool-execution'};}static['createDefaultMetadata'](_0x40d877={}){return{'toolVersion':'1.0.0','capabilities':[],'configuration':{},'requiresAuth':![],'dependencies':[],'constraints':{},'tags':[],'customFields':{},..._0x40d877};}static[a0_0x5ed4f7(0xcb)](){const _0x5d6b92=a0_0x5ed4f7,_0x5b6068=Date['now']()[_0x5d6b92(0xc7)](0x24),_0x4e04f4=Math[_0x5d6b92(0x8e)]()['toString'](0x24)[_0x5d6b92(0xdf)](0x2,0x9);return'cmd_'+_0x5b6068+'_'+_0x4e04f4;}static['generateExecutionId'](){const _0x33f928=a0_0x5ed4f7,_0x17166c=Date['now']()[_0x33f928(0xc7)](0x24),_0x2ec155=Math['random']()[_0x33f928(0xc7)](0x24)[_0x33f928(0xdf)](0x2,0x9);return'exec_'+_0x17166c+'_'+_0x2ec155;}static[a0_0x5ed4f7(0xec)](){const _0x317bd7=a0_0x5ed4f7,_0x351bc1=Date[_0x317bd7(0xf8)]()['toString'](0x24),_0x1f93f6=Math[_0x317bd7(0x8e)]()['toString'](0x24)['substr'](0x2,0x6);return _0x317bd7(0xb1)+_0x351bc1+'_'+_0x1f93f6;}}export class ToolCommandUtils{static['isPending'](_0x5273c9){return _0x5273c9['status']===TOOL_STATUS['PENDING'];}static['isExecuting'](_0x512e98){const _0x19b757=a0_0x5ed4f7;return _0x512e98[_0x19b757(0xd6)]===TOOL_STATUS[_0x19b757(0xd8)];}static[a0_0x5ed4f7(0xdd)](_0x55f833){return _0x55f833['status']===TOOL_STATUS['COMPLETED'];}static['isFailed'](_0x3fcc3e){return _0x3fcc3e['status']===TOOL_STATUS['FAILED'];}static[a0_0x5ed4f7(0xf2)](_0x370977){const _0x39fa8f=a0_0x5ed4f7;if(!_0x370977['startedAt']||_0x370977['status']!==TOOL_STATUS['EXECUTING'])return![];const _0x4a2df9=new Date(_0x370977['startedAt']),_0xa495b5=new Date(),_0x588ba2=_0xa495b5[_0x39fa8f(0xa6)]()-_0x4a2df9['getTime']();return _0x588ba2>_0x370977[_0x39fa8f(0x9b)];}static[a0_0x5ed4f7(0xca)](_0x31b102){const _0x3ab771=a0_0x5ed4f7;if(!_0x31b102['startedAt'])return null;const _0xa59aba=_0x31b102['completedAt']?new Date(_0x31b102[_0x3ab771(0xb4)]):new Date(),_0x28c14d=new Date(_0x31b102[_0x3ab771(0xb3)]);return _0xa59aba['getTime']()-_0x28c14d['getTime']();}static[a0_0x5ed4f7(0xb5)](_0x1df324){const _0x4efb6a=a0_0x5ed4f7,_0x379885=this[_0x4efb6a(0xca)](_0x1df324),_0x1def12=this[_0x4efb6a(0xf2)](_0x1df324);let _0x3f1f1d=0x0;if(_0x1df324[_0x4efb6a(0xd6)]===TOOL_STATUS['COMPLETED'])_0x3f1f1d=0x64;else _0x1df324['status']===TOOL_STATUS[_0x4efb6a(0xd8)]&&_0x379885&&(_0x3f1f1d=Math[_0x4efb6a(0xc2)](0x5f,_0x379885/_0x1df324[_0x4efb6a(0x9b)]*0x64));return{'status':_0x1df324[_0x4efb6a(0xd6)],'percentage':Math['round'](_0x3f1f1d),'executionTime':_0x379885,'isTimedOut':_0x1def12,'remainingTime':_0x1df324['status']===TOOL_STATUS['EXECUTING']&&_0x379885?Math['max'](0x0,_0x1df324[_0x4efb6a(0x9b)]-_0x379885):null};}static[a0_0x5ed4f7(0xa1)](_0x2bf0be){const _0x382e94=a0_0x5ed4f7,_0x573110=_0x2bf0be['execution']||{},_0x4c2469=this['getProgress'](_0x2bf0be);return{'executionTime':_0x573110[_0x382e94(0xe2)]||_0x4c2469['executionTime']||0x0,'memoryUsage':_0x573110[_0x382e94(0xc4)]||0x0,'cpuUsage':_0x573110['cpuUsage']||0x0,'status':_0x2bf0be['status'],'retryCount':_0x2bf0be['retryCount'],'priority':_0x2bf0be[_0x382e94(0xb6)],'logEntries':_0x573110['logs']?_0x573110[_0x382e94(0xbb)][_0x382e94(0xe7)]:0x0,'hasError':!!_0x573110[_0x382e94(0x99)],'errorCode':_0x573110['errorCode']||null};}static[a0_0x5ed4f7(0xf6)](_0x43705b){const _0x596790=a0_0x5ed4f7,_0x21f6d3=this[_0x596790(0xb5)](_0x43705b),_0x5cc865=this[_0x596790(0xa1)](_0x43705b);return{'id':_0x43705b['id'],'toolId':_0x43705b[_0x596790(0xef)],'command':_0x43705b['command'],'status':_0x43705b[_0x596790(0xd6)],'progress':_0x21f6d3['percentage'],'executionTime':_0x5cc865[_0x596790(0xe2)],'createdAt':_0x43705b[_0x596790(0xde)],'startedAt':_0x43705b['startedAt'],'completedAt':_0x43705b[_0x596790(0xb4)],'hasError':_0x5cc865[_0x596790(0xb7)],'retryCount':_0x43705b['retryCount']};}static[a0_0x5ed4f7(0xab)](_0x55ef68){const _0x458659=a0_0x5ed4f7,_0x28f84d={..._0x55ef68};_0x28f84d[_0x458659(0xce)]&&(delete _0x28f84d[_0x458659(0xce)]['environmentVariables'],delete _0x28f84d['execution'][_0x458659(0xbf)],_0x28f84d[_0x458659(0xce)][_0x458659(0xbb)]&&_0x28f84d['execution'][_0x458659(0xbb)][_0x458659(0xe7)]>0xa&&(_0x28f84d['execution']['logs']=_0x28f84d[_0x458659(0xce)]['logs'][_0x458659(0xc5)](-0xa)));if(_0x28f84d[_0x458659(0xc8)]){const _0x4c83b6=['password',_0x458659(0xc9),'secret','key','auth'];Object['keys'](_0x28f84d[_0x458659(0xc8)])['forEach'](_0x254b99=>{const _0x596651=_0x458659;_0x4c83b6[_0x596651(0xf0)](_0x244081=>_0x254b99[_0x596651(0x94)]()['includes'](_0x244081))&&(_0x28f84d[_0x596651(0xc8)][_0x254b99]=_0x596651(0xe4));});}return _0x28f84d;}static['summarizeCommands'](_0x267b4e){const _0x49f6ca=a0_0x5ed4f7,_0x3e6aab={'total':_0x267b4e[_0x49f6ca(0xe7)],'byStatus':{},'byTool':{},'totalExecutionTime':0x0,'averageExecutionTime':0x0,'successRate':0x0,'mostUsedTools':[],'recentCommands':[]};Object['values'](TOOL_STATUS)['forEach'](_0x3d0158=>{const _0x436956=_0x49f6ca;_0x3e6aab['byStatus'][_0x3d0158]=_0x267b4e['filter'](_0x92d044=>_0x92d044[_0x436956(0xd6)]===_0x3d0158)[_0x436956(0xe7)];}),_0x267b4e[_0x49f6ca(0xa5)](_0x248172=>{const _0x5b8539=_0x49f6ca;_0x3e6aab[_0x5b8539(0xae)][_0x248172[_0x5b8539(0xef)]]=(_0x3e6aab[_0x5b8539(0xae)][_0x248172['toolId']]||0x0)+0x1;const _0x38fd81=this['getExecutionTime'](_0x248172)||0x0;_0x3e6aab['totalExecutionTime']+=_0x38fd81;});if(_0x267b4e[_0x49f6ca(0xe7)]>0x0){_0x3e6aab[_0x49f6ca(0x9e)]=_0x3e6aab['totalExecutionTime']/_0x267b4e['length'];const _0x3dde8d=_0x3e6aab[_0x49f6ca(0xd5)][TOOL_STATUS[_0x49f6ca(0xad)]]||0x0;_0x3e6aab[_0x49f6ca(0xcc)]=_0x3dde8d/_0x267b4e['length']*0x64;}return _0x3e6aab['mostUsedTools']=Object['entries'](_0x3e6aab[_0x49f6ca(0xae)])['sort']((_0x3000ba,_0x2d6f60)=>_0x2d6f60[0x1]-_0x3000ba[0x1])[_0x49f6ca(0xc5)](0x0,0x5)[_0x49f6ca(0xd2)](([_0x76cd72,_0xf53731])=>({'toolId':_0x76cd72,'count':_0xf53731})),_0x3e6aab['recentCommands']=_0x267b4e['sort']((_0x4c5d2b,_0x5450f7)=>new Date(_0x5450f7['createdAt'])-new Date(_0x4c5d2b[_0x49f6ca(0xde)]))['slice'](0x0,0xa)[_0x49f6ca(0xd2)](_0x1fe77b=>this[_0x49f6ca(0xf6)](_0x1fe77b)),_0x3e6aab;}}function a0_0xb879(_0x5b5c62,_0x3a90b9){_0x5b5c62=_0x5b5c62-0x88;const _0x47570b=a0_0x4757();let _0xb87935=_0x47570b[_0x5b5c62];if(a0_0xb879['zhFWcW']===undefined){var _0x5be49e=function(_0x5e9733){const _0x40e3d3='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xb14e7='',_0x1df37f='';for(let _0x1e08c7=0x0,_0x2e4a35,_0x1e59a7,_0x317bd8=0x0;_0x1e59a7=_0x5e9733['charAt'](_0x317bd8++);~_0x1e59a7&&(_0x2e4a35=_0x1e08c7%0x4?_0x2e4a35*0x40+_0x1e59a7:_0x1e59a7,_0x1e08c7++%0x4)?_0xb14e7+=String['fromCharCode'](0xff&_0x2e4a35>>(-0x2*_0x1e08c7&0x6)):0x0){_0x1e59a7=_0x40e3d3['indexOf'](_0x1e59a7);}for(let _0x2fd54f=0x0,_0x43f3f6=_0xb14e7['length'];_0x2fd54f<_0x43f3f6;_0x2fd54f++){_0x1df37f+='%'+('00'+_0xb14e7['charCodeAt'](_0x2fd54f)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1df37f);};a0_0xb879['fgeHxT']=_0x5be49e,a0_0xb879['ijVUXe']={},a0_0xb879['zhFWcW']=!![];}const _0x3c4b71=_0x47570b[0x0],_0x4dbb9b=_0x5b5c62+_0x3c4b71,_0x3dc8f5=a0_0xb879['ijVUXe'][_0x4dbb9b];return!_0x3dc8f5?(_0xb87935=a0_0xb879['fgeHxT'](_0xb87935),a0_0xb879['ijVUXe'][_0x4dbb9b]=_0xb87935):_0xb87935=_0x3dc8f5,_0xb87935;}export default{'ToolCommandValidator':ToolCommandValidator,'ToolCommandFactory':ToolCommandFactory,'ToolCommandUtils':ToolCommandUtils};