54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
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
|
|
}
|
|
},
|
|
}
|
|
}
|