| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- import { logForDebugging } from './debug.js'
- import { gracefulShutdownSync } from './gracefulShutdown.js'
- /**
- * Creates an idle timeout manager for SDK mode.
- * Automatically exits the process after the specified idle duration.
- *
- * @param isIdle Function that returns true if the system is currently idle
- * @returns Object with start/stop methods to control the idle timer
- */
- export function createIdleTimeoutManager(isIdle: () => boolean): {
- start: () => void
- stop: () => void
- } {
- // Parse CLAUDE_CODE_EXIT_AFTER_STOP_DELAY environment variable
- const exitAfterStopDelay = process.env.CLAUDE_CODE_EXIT_AFTER_STOP_DELAY
- const delayMs = exitAfterStopDelay ? parseInt(exitAfterStopDelay, 10) : null
- const isValidDelay = delayMs && !isNaN(delayMs) && delayMs > 0
- let timer: NodeJS.Timeout | null = null
- let lastIdleTime = 0
- return {
- start() {
- // Clear any existing timer
- if (timer) {
- clearTimeout(timer)
- timer = null
- }
- // Only start timer if delay is configured and valid
- if (isValidDelay) {
- lastIdleTime = Date.now()
- timer = setTimeout(() => {
- // Check if we've been continuously idle for the full duration
- const idleDuration = Date.now() - lastIdleTime
- if (isIdle() && idleDuration >= delayMs) {
- logForDebugging(`Exiting after ${delayMs}ms of idle time`)
- gracefulShutdownSync()
- }
- }, delayMs)
- }
- },
- stop() {
- if (timer) {
- clearTimeout(timer)
- timer = null
- }
- },
- }
- }
|