fix: Reset AbortController before starting generator to prevent infinite abort loop
When a generator exits with wasAborted=true, the AbortController remains in aborted state but generatorPromise is set to null. When a new observation arrives, ensureGeneratorRunning() sees generatorPromise=null and tries to start a new generator, but the new generator immediately sees signal.aborted=true and exits, causing an infinite "Generator aborted" loop. This fix resets the AbortController if it's already aborted before starting a new generator, allowing the session to recover from the stuck state. Bug reproduction: 1. Session receives observations 2. Something causes the generator to be aborted 3. generatorPromise = null, but abortController.signal.aborted = true 4. New observation arrives → starts generator → immediately aborted → loop Fix: Check if abortController.signal.aborted before starting generator, and create a new AbortController if needed.
This commit is contained in:
@@ -122,6 +122,16 @@ export class SessionRoutes extends BaseRouteHandler {
|
||||
): void {
|
||||
if (!session) return;
|
||||
|
||||
// Reset AbortController if it was previously aborted
|
||||
// This fixes the bug where a session gets stuck in an infinite "Generator aborted" loop
|
||||
// after its AbortController was aborted (e.g., from a previous generator exit)
|
||||
if (session.abortController.signal.aborted) {
|
||||
logger.debug('SESSION', 'Resetting aborted AbortController before starting generator', {
|
||||
sessionId: session.sessionDbId
|
||||
});
|
||||
session.abortController = new AbortController();
|
||||
}
|
||||
|
||||
const agent = provider === 'openrouter' ? this.openRouterAgent : (provider === 'gemini' ? this.geminiAgent : this.sdkAgent);
|
||||
const agentName = provider === 'openrouter' ? 'OpenRouter' : (provider === 'gemini' ? 'Gemini' : 'Claude SDK');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user