Repository Public
1/** Entry point of the Agent OS worker: `node dist/main.js`. */2import { ConfigError, loadConfig, type WorkerConfig } from './config.js';3import { loadEnvFile } from './env-file.js';4import { createLogger, startWorker } from './worker.js';56let cfg: WorkerConfig;7try {8 loadEnvFile(); // the file named by AOS_ENV_FILE (provider keys in production); never overrides the environment9 cfg = loadConfig();10} catch (err) {11 // Plain text on stderr: this is read by a human (or PM2) before any structured log exists.12 process.stderr.write(`${err instanceof ConfigError ? err.message : `Agent OS worker cannot start: ${(err as Error).message}`}\n`);13 process.exit(1);14}1516const log = createLogger(cfg.logLevel);17let stopping = false;1819try {20 const worker = await startWorker(cfg, log);21 const shutdown = (signal: string): void => {22 if (stopping) {23 log.warn({ signal }, 'second signal: exiting immediately; leases will expire and another worker resumes the runs');24 process.exit(1);25 }26 stopping = true;27 log.info({ signal }, 'shutting down: no new claims, releasing in-flight runs');28 worker.stop().then(29 () => {30 log.info('worker stopped');31 process.exit(0);32 },33 (err: Error) => {34 log.error({ err: err.message }, 'shutdown failed');35 process.exit(1);36 },37 );38 };39 process.on('SIGTERM', () => shutdown('SIGTERM'));40 process.on('SIGINT', () => shutdown('SIGINT'));41 process.on('unhandledRejection', (reason) => {42 log.error({ err: reason instanceof Error ? reason.message : String(reason) }, 'unhandled rejection');43 });44 process.on('uncaughtException', (err) => {45 log.fatal({ err: err.message }, 'uncaught exception: exiting; leases will expire and another worker resumes the runs');46 process.exit(1);47 });48 await worker.done;49 if (!stopping) {50 log.error('worker loop ended unexpectedly');51 process.exit(1);52 }53} catch (err) {54 log.fatal({ err: (err as Error).message }, 'worker failed to start');55 process.exit(1);56}57