/**
 * 管理单个 SDK 会话的空闲自动命令。
 * 具体逻辑：poll_message 类命令立即进入 MCP 阻塞等待；普通命令保留原有延迟触发语义。
 */
export class IdlePollLoop {
    constructor(options) {
        this.options = options;
        this.running = false;
        this.pollDelayMs = options.pollDelayMs ?? 0;
        this.regularIdleDelayMs = options.regularIdleDelayMs ?? 1500;
    }
    /**
     * 启动或重臂空闲驱动。
     * 主流程：清理旧定时器 -> 校验会话仍在 waiting_input -> 根据命令类型选择 poll 驱动或普通 idle 命令。
     */
    start() {
        this.stop();
        const command = this.options.getCommand()?.trim();
        if (!command || this.options.getStatus() !== 'waiting_input') {
            return;
        }
        const delay = this.options.isPollingCommand(command) ? this.pollDelayMs : this.regularIdleDelayMs;
        if (delay <= 0) {
            void this.fire(command);
            return;
        }
        this.timer = setTimeout(() => {
            this.timer = undefined;
            void this.fire(command);
        }, delay);
    }
    /**
     * 停止当前空闲驱动。
     * 具体逻辑：只取消尚未触发的调度；已经进入模型 turn 的任务由 adapter 生命周期负责。
     */
    stop() {
        if (this.timer) {
            clearTimeout(this.timer);
            this.timer = undefined;
        }
    }
    async fire(command) {
        if (this.running || this.options.getStatus() !== 'waiting_input') {
            return;
        }
        this.running = true;
        try {
            if (this.options.isPollingCommand(command)) {
                await this.options.dispatchPollingPrompt(command);
            }
            else {
                await this.options.dispatchRegularIdleCommand(command);
            }
        }
        finally {
            this.running = false;
        }
    }
}
