feat: fix orphaned order detection and enhance automation UI
- Fixed Drift orders API to handle new object-based status format
- Updated cleanup API to properly detect orphaned TAKE PROFIT orders
- Changed status filtering from order.status === 0 to order.status.hasOwnProperty('open')
- Restored automation-v2 page with emergency stop functionality
- Added position monitor integration with real-time cleanup status
- Enhanced UI with emoji indicators and better status display
- Added emergency stop API endpoint for immediate trading halt
- Enhanced orphaned order detection for lingering SL/TP orders
- Added comprehensive debug logging for order processing
- Improved error handling and status reporting
- Real-time cleanup reporting in position monitor
Verified working:
- Orders API correctly detects active orders with new Drift format
- Cleanup system successfully processes orphaned orders
- Position monitor shows accurate cleanup status
- Emergency stop functionality integrated
This commit is contained in:
112
app/api/automation/emergency-stop/route.js
Normal file
112
app/api/automation/emergency-stop/route.js
Normal file
@@ -0,0 +1,112 @@
|
||||
import { NextResponse } from 'next/server'
|
||||
|
||||
export async function POST() {
|
||||
try {
|
||||
console.log('🚨 EMERGENCY STOP INITIATED')
|
||||
|
||||
const results = {
|
||||
automationStopped: false,
|
||||
processesKilled: false,
|
||||
cleanupCompleted: false,
|
||||
errors: []
|
||||
}
|
||||
|
||||
// 1. Stop automation normally first
|
||||
try {
|
||||
const stopResponse = await fetch('http://localhost:3000/api/automation/stop', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
})
|
||||
|
||||
if (stopResponse.ok) {
|
||||
results.automationStopped = true
|
||||
console.log('✅ Automation stopped successfully')
|
||||
}
|
||||
} catch (error) {
|
||||
results.errors.push(`Automation stop failed: ${error.message}`)
|
||||
console.error('❌ Automation stop failed:', error)
|
||||
}
|
||||
|
||||
// 2. Kill background processes
|
||||
try {
|
||||
const { exec } = require('child_process')
|
||||
const util = require('util')
|
||||
const execAsync = util.promisify(exec)
|
||||
|
||||
// Kill Chromium/Chrome processes
|
||||
try {
|
||||
await execAsync('pkill -f "chrome|chromium" 2>/dev/null || true')
|
||||
console.log('🔫 Chrome/Chromium processes terminated')
|
||||
} catch (e) {
|
||||
console.log('ℹ️ No Chrome processes to kill')
|
||||
}
|
||||
|
||||
// Kill any screenshot services
|
||||
try {
|
||||
await execAsync('pkill -f "screenshot|puppeteer" 2>/dev/null || true')
|
||||
console.log('🔫 Screenshot processes terminated')
|
||||
} catch (e) {
|
||||
console.log('ℹ️ No screenshot processes to kill')
|
||||
}
|
||||
|
||||
results.processesKilled = true
|
||||
} catch (error) {
|
||||
results.errors.push(`Process cleanup failed: ${error.message}`)
|
||||
console.error('❌ Process cleanup failed:', error)
|
||||
}
|
||||
|
||||
// 3. Cleanup temporary files
|
||||
try {
|
||||
const fs = require('fs').promises
|
||||
const path = require('path')
|
||||
|
||||
// Clean up screenshot directories
|
||||
const tempDirs = [
|
||||
'/tmp/trading-screenshots',
|
||||
'/app/screenshots',
|
||||
'/app/temp'
|
||||
]
|
||||
|
||||
for (const dir of tempDirs) {
|
||||
try {
|
||||
await fs.rmdir(dir, { recursive: true })
|
||||
console.log(`🧹 Cleaned up ${dir}`)
|
||||
} catch (e) {
|
||||
// Directory doesn't exist or already clean
|
||||
}
|
||||
}
|
||||
|
||||
results.cleanupCompleted = true
|
||||
} catch (error) {
|
||||
results.errors.push(`Cleanup failed: ${error.message}`)
|
||||
console.error('❌ Cleanup failed:', error)
|
||||
}
|
||||
|
||||
console.log('🚨 EMERGENCY STOP COMPLETED')
|
||||
console.log('Results:', results)
|
||||
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
message: 'Emergency stop completed',
|
||||
results,
|
||||
timestamp: new Date().toISOString()
|
||||
})
|
||||
|
||||
} catch (error) {
|
||||
console.error('🚨 EMERGENCY STOP ERROR:', error)
|
||||
|
||||
return NextResponse.json({
|
||||
success: false,
|
||||
error: 'Emergency stop failed',
|
||||
message: error.message,
|
||||
timestamp: new Date().toISOString()
|
||||
}, { status: 500 })
|
||||
}
|
||||
}
|
||||
|
||||
export async function GET() {
|
||||
return NextResponse.json({
|
||||
message: 'Emergency Stop API - use POST method to trigger emergency stop',
|
||||
description: 'Immediately stops all automation processes and cleans up resources'
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user