#!/usr/bin/env node
// NODE_OPTIONS="--max-old-space-size=8192" node dist/cli.js
// For large projects, increase heap: NODE_OPTIONS=--max-old-space-size=8192 hopcode
/**
 * @license
 * Copyright 2025 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import { initStartupProfiler } from './src/utils/startupProfiler.js';
// Must run before any other imports to capture the earliest possible T0.
initStartupProfiler();
import './src/interactive.js';
import { main } from './src/interactive.js';
import { FatalError } from '@hoptrendy/hopcode-core';
import { writeStderrLine } from './src/utils/stdioHelpers.js';
// --- Global Entry Point ---
// Suppress known race conditions in @lydell/node-pty.
//
// PTY errors that are expected due to timing races between process exit
// and I/O operations. These should not crash the app.
//
// References:
// - https://github.com/microsoft/node-pty/issues/178 (EIO on macOS/Linux)
// - https://github.com/microsoft/node-pty/issues/827 (resize on Windows)
const getErrnoCode = (error) => {
    if (!error || typeof error !== 'object') {
        return undefined;
    }
    const code = error.code;
    return typeof code === 'string' ? code : undefined;
};
const isExpectedPtyRaceError = (error) => {
    if (!(error instanceof Error)) {
        return false;
    }
    const message = error.message;
    const code = getErrnoCode(error);
    // EIO: PTY read race on macOS/Linux - code + PTY context required
    // https://github.com/microsoft/node-pty/issues/178
    if ((code === 'EIO' && message.includes('read')) ||
        message.includes('read EIO')) {
        return true;
    }
    // EAGAIN: transient non-blocking read error from PTY fd
    if ((code === 'EAGAIN' && message.includes('read')) ||
        message.includes('read EAGAIN')) {
        return true;
    }
    // PTY-specific resize/exit race errors - require PTY context in message
    if (message.includes('ioctl(2) failed, EBADF') ||
        message.includes('Cannot resize a pty that has already exited')) {
        return true;
    }
    return false;
};
process.on('uncaughtException', (error) => {
    if (isExpectedPtyRaceError(error)) {
        return;
    }
    if (error instanceof Error) {
        writeStderrLine(error.stack ?? error.message);
    }
    else {
        writeStderrLine(String(error));
    }
    process.exit(1);
});
main().catch((error) => {
    if (error instanceof FatalError) {
        let errorMessage = error.message;
        if (!process.env['NO_COLOR']) {
            errorMessage = `\x1b[31m${errorMessage}\x1b[0m`;
        }
        console.error(errorMessage);
        process.exit(error.exitCode);
    }
    console.error('An unexpected critical error occurred:');
    if (error instanceof Error) {
        console.error(error.stack);
    }
    else {
        console.error(String(error));
    }
    process.exit(1);
});
//# sourceMappingURL=index.js.map