mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-26 22:11:57 -07:00
88 lines
2.5 KiB
JavaScript
88 lines
2.5 KiB
JavaScript
#!/usr/bin/env -S node --no-warnings=DEP0040
|
|
|
|
/**
|
|
* @license
|
|
* Copyright 2025 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
// --- Fast Path for Version ---
|
|
// We check for version flags at the very top to avoid loading any heavy dependencies.
|
|
// process.env.CLI_VERSION is defined during the build process by esbuild.
|
|
if (process.argv.includes('--version') || process.argv.includes('-v')) {
|
|
console.log(process.env['CLI_VERSION'] || 'unknown');
|
|
process.exit(0);
|
|
}
|
|
|
|
// --- Global Entry Point ---
|
|
|
|
let writeToStderrFn: (message: string) => void = (msg) =>
|
|
process.stderr.write(msg);
|
|
|
|
// Suppress known race condition error in node-pty on Windows
|
|
// Tracking bug: https://github.com/microsoft/node-pty/issues/827
|
|
process.on('uncaughtException', (error) => {
|
|
if (
|
|
process.platform === 'win32' &&
|
|
error instanceof Error &&
|
|
error.message === 'Cannot resize a pty that has already exited'
|
|
) {
|
|
// This error happens on Windows with node-pty when resizing a pty that has just exited.
|
|
// It is a race condition in node-pty that we cannot prevent, so we silence it.
|
|
return;
|
|
}
|
|
|
|
// For other errors, we rely on the default behavior, but since we attached a listener,
|
|
// we must manually replicate it.
|
|
if (error instanceof Error) {
|
|
writeToStderrFn(error.stack + '\n');
|
|
} else {
|
|
writeToStderrFn(String(error) + '\n');
|
|
}
|
|
process.exit(1);
|
|
});
|
|
|
|
const [{ main }, { FatalError, writeToStderr }, { runExitCleanup }] =
|
|
await Promise.all([
|
|
import('./src/gemini.js'),
|
|
import('@google/gemini-cli-core'),
|
|
import('./src/utils/cleanup.js'),
|
|
]);
|
|
|
|
writeToStderrFn = writeToStderr;
|
|
|
|
main().catch(async (error) => {
|
|
// Set a timeout to force exit if cleanup hangs
|
|
const cleanupTimeout = setTimeout(() => {
|
|
writeToStderr('Cleanup timed out, forcing exit...\n');
|
|
process.exit(1);
|
|
}, 5000);
|
|
|
|
try {
|
|
await runExitCleanup();
|
|
} catch (cleanupError) {
|
|
writeToStderr(
|
|
`Error during final cleanup: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}\n`,
|
|
);
|
|
} finally {
|
|
clearTimeout(cleanupTimeout);
|
|
}
|
|
|
|
if (error instanceof FatalError) {
|
|
let errorMessage = error.message;
|
|
if (!process.env['NO_COLOR']) {
|
|
errorMessage = `\x1b[31m${errorMessage}\x1b[0m`;
|
|
}
|
|
writeToStderr(errorMessage + '\n');
|
|
process.exit(error.exitCode);
|
|
}
|
|
|
|
writeToStderr('An unexpected critical error occurred:');
|
|
if (error instanceof Error) {
|
|
writeToStderr(error.stack + '\n');
|
|
} else {
|
|
writeToStderr(String(error) + '\n');
|
|
}
|
|
process.exit(1);
|
|
});
|