UNPKG

@vfarcic/dot-ai

Version:

AI-powered development productivity platform that enhances software development workflows through intelligent automation and AI-driven assistance

125 lines (124 loc) 6.45 kB
"use strict"; /** * Operate Execution Workflow * * Executes approved operational changes using shared command executor * and validates results using remediate tool */ Object.defineProperty(exports, "__esModule", { value: true }); exports.executeOperations = executeOperations; const error_handling_1 = require("../core/error-handling"); const command_executor_1 = require("../core/command-executor"); const remediate_1 = require("./remediate"); /** * Executes approved operational changes * PRD #359: Uses unified plugin registry for tool invocations * @param sessionId - Session ID with approved changes * @param logger - Logger instance * @param sessionManager - Session manager instance * @returns Operation output with execution results */ async function executeOperations(sessionId, logger, sessionManager) { logger.info('Starting operation execution', { sessionId }); try { // 1. Load session with approved commands const session = sessionManager.getSession(sessionId); if (!session) { throw error_handling_1.ErrorHandler.createError(error_handling_1.ErrorCategory.VALIDATION, error_handling_1.ErrorSeverity.HIGH, `Session not found: ${sessionId}. The session may have expired or been deleted.`, { operation: 'session_loading', component: 'OperateExecutionTool' }); } // Check if already executed if (session.data.status === 'executing' || session.data.status === 'executed_successfully' || session.data.status === 'executed_with_errors') { throw error_handling_1.ErrorHandler.createError(error_handling_1.ErrorCategory.VALIDATION, error_handling_1.ErrorSeverity.MEDIUM, `Session ${sessionId} has already been executed. Current status: ${session.data.status}`, { operation: 'execution_validation', component: 'OperateExecutionTool' }); } // Update session status to executing sessionManager.updateSession(sessionId, { status: 'executing' }); logger.info('Loaded session for execution', { sessionId, commandCount: session.data.commands.length, intent: session.data.intent }); // 2. Execute commands using shared executor (PRD #359: via unified plugin registry) const { results, overallSuccess } = await (0, command_executor_1.executeCommands)(session.data.commands, logger, { sessionId, context: 'operation', logMetadata: { intent: session.data.intent } }); // Convert CommandExecutionResult to ExecutionResult const executionResults = results.map(r => ({ command: r.command, success: r.success, output: r.output, error: r.error, timestamp: r.timestamp })); // 3. Run validation via remediate tool (only if commands succeeded) let validationSummary = 'Validation skipped due to command failures.'; if (overallSuccess && session.data.validationIntent) { logger.info('Running post-execution validation via remediate', { sessionId, validationIntent: session.data.validationIntent }); try { // Call remediate tool internally with validation intent // PRD #359: Uses unified plugin registry const validationResponse = await (0, remediate_1.handleRemediateTool)({ issue: session.data.validationIntent, executedCommands: session.data.commands, interaction_id: session.data.interaction_id }); // Extract validation result from remediate response const validationData = JSON.parse(validationResponse.content[0].text); if (validationData.status === 'resolved' || validationData.status === 'no_issue_found') { validationSummary = `Validation successful: ${validationData.message || 'Operations completed as expected.'}`; } else { validationSummary = `Validation completed with confidence ${Math.round((validationData.analysis?.confidence || 0) * 100)}%: ${validationData.analysis?.rootCause || 'See validation details'}`; } logger.info('Validation completed', { sessionId, validationSummary }); } catch (error) { logger.error('Validation failed', error, { sessionId }); validationSummary = `Validation encountered an error: ${error instanceof Error ? error.message : 'Unknown error'}. Manual verification recommended.`; } } // 4. Update session with execution results const finalStatus = overallSuccess ? 'executed_successfully' : 'executed_with_errors'; sessionManager.updateSession(sessionId, { status: finalStatus, executionResults }); logger.info('Execution completed', { sessionId, finalStatus, successCount: executionResults.filter(r => r.success).length, failureCount: executionResults.filter(r => !r.success).length }); // 5. Return execution results with validation return { status: overallSuccess ? 'success' : 'failed', sessionId, execution: { results: executionResults, validation: validationSummary }, message: overallSuccess ? `All ${executionResults.length} command(s) executed successfully. ${validationSummary}` : `${executionResults.filter(r => !r.success).length} of ${executionResults.length} command(s) failed. See execution results for details.` }; } catch (error) { logger.error('Execution failed', error, { sessionId }); // Mark session as failed if we can try { sessionManager.updateSession(sessionId, { status: 'failed' }); } catch { // Ignore - session might not exist } throw error_handling_1.ErrorHandler.createError(error_handling_1.ErrorCategory.OPERATION, error_handling_1.ErrorSeverity.HIGH, `Execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`, { operation: 'execute_operations', component: 'OperateExecutionTool', sessionId }); } }