@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
JavaScript
;
/**
* 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
});
}
}