| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- #!/usr/bin/env node
- import { VLCodeLite } from '../src/app.js';
- import fs from 'fs';
- import os from 'os';
- import path from 'path';
- import { fileURLToPath } from 'url';
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
- const crashLogPath = resolveCrashLogPath();
- const CRASH_LOG_MAX_BYTES = 10 * 1024 * 1024; // 10 MB
- function resolveCrashLogPath() {
- const packagedLogPath = process.env.VLCODE_LOG_DIR
- ? path.join(process.env.VLCODE_LOG_DIR, 'backend-crash.log')
- : path.join(os.homedir(), '.vl-code', 'logs', 'backend-crash.log');
- if (process.env.VLCODE_IS_PACKAGED === '1' || __dirname.includes('app.asar')) {
- return packagedLogPath;
- }
- return path.join(__dirname, '..', '.vlcode-lite', 'crash.log');
- }
- function safeConsoleError(...args) {
- try {
- console.error(...args);
- } catch {}
- }
- function appendCrashLog(level, msg) {
- const entry = `[${new Date().toISOString()}] ${level}: ${msg}\n`;
- try {
- const dir = path.dirname(crashLogPath);
- if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
- if (fs.existsSync(crashLogPath)) {
- const stat = fs.statSync(crashLogPath);
- if (stat.size > CRASH_LOG_MAX_BYTES) {
- const buf = fs.readFileSync(crashLogPath, 'utf-8');
- const keepFrom = buf.length - Math.floor(CRASH_LOG_MAX_BYTES / 2);
- const nextNewline = buf.indexOf('\n', keepFrom);
- fs.writeFileSync(crashLogPath, '[LOG ROTATED]\n' + buf.slice(nextNewline + 1));
- }
- }
- fs.appendFileSync(crashLogPath, entry);
- } catch (_) {}
- }
- process.on('uncaughtException', (err) => {
- const stack = err.stack || String(err);
- safeConsoleError('[FATAL] Uncaught exception:', stack);
- appendCrashLog('UNCAUGHT', stack);
- });
- process.on('unhandledRejection', (reason) => {
- const name = reason?.name || reason?.constructor?.name || '';
- const msg = reason?.message || '';
- if (name === 'APIUserAbortError' || name === 'AbortError' ||
- msg === 'Request was aborted.' || msg.includes('aborted')) return;
- safeConsoleError('[Server] Unhandled rejection:', msg || reason);
- appendCrashLog('REJECTION', msg || String(reason));
- });
- const app = new VLCodeLite();
- app.run(process.argv.slice(2)).catch(err => {
- safeConsoleError('Fatal error:', err.message);
- appendCrashLog('FATAL', err.stack || String(err));
- process.exit(1);
- });
|