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:
mindesbunister
2025-07-26 20:07:40 +02:00
parent 11aec95d47
commit d38511f580
4 changed files with 380 additions and 46 deletions

View 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'
})
}