From 89b705194b60ce8d5e7ab8e8fde7d42e82949739 Mon Sep 17 00:00:00 2001 From: Harivansh Rathi Date: Mon, 9 Mar 2026 17:07:05 -0700 Subject: [PATCH] fix: address steer review feedback Co-authored-by: Codex --- .../coding-agent/src/core/gateway/runtime.ts | 77 ++++++++++++------- .../coding-agent/test/gateway-steer.test.ts | 10 +-- 2 files changed, 56 insertions(+), 31 deletions(-) diff --git a/packages/coding-agent/src/core/gateway/runtime.ts b/packages/coding-agent/src/core/gateway/runtime.ts index 136a32c..8527190 100644 --- a/packages/coding-agent/src/core/gateway/runtime.ts +++ b/packages/coding-agent/src/core/gateway/runtime.ts @@ -173,11 +173,19 @@ export class GatewayRuntime { return this.enqueueManagedMessage({ request }); } - private async enqueueManagedMessage(queuedMessage: { + private async queueManagedMessage(queuedMessage: { request: GatewayMessageRequest; onStart?: () => void; onFinish?: () => void; - }): Promise { + }): + Promise< + | { accepted: false; errorResult: GatewayMessageResult } + | { + accepted: true; + managedSession: ManagedGatewaySession; + completion: Promise; + } + > { const managedSession = await this.ensureSession( queuedMessage.request.sessionKey, ); @@ -186,22 +194,39 @@ export class GatewayRuntime { `[queue] session=${queuedMessage.request.sessionKey} queue full (${this.config.session.maxQueuePerSession})`, ); return { - ok: false, - response: "", - error: `Queue full (${this.config.session.maxQueuePerSession} pending).`, - sessionKey: queuedMessage.request.sessionKey, + accepted: false, + errorResult: { + ok: false, + response: "", + error: `Queue full (${this.config.session.maxQueuePerSession} pending).`, + sessionKey: queuedMessage.request.sessionKey, + }, }; } - return new Promise((resolve) => { + const completion = new Promise((resolve) => { managedSession.queue.push({ ...queuedMessage, resolve }); - this.logSession( - managedSession, - `queued source=${queuedMessage.request.source ?? "extension"} depth=${managedSession.queue.length}`, - ); - this.emitState(managedSession); - void this.processNext(managedSession); }); + this.logSession( + managedSession, + `queued source=${queuedMessage.request.source ?? "extension"} depth=${managedSession.queue.length}`, + ); + this.emitState(managedSession); + void this.processNext(managedSession); + + return { accepted: true, managedSession, completion }; + } + + private async enqueueManagedMessage(queuedMessage: { + request: GatewayMessageRequest; + onStart?: () => void; + onFinish?: () => void; + }): Promise { + const queued = await this.queueManagedMessage(queuedMessage); + if (!queued.accepted) { + return queued.errorResult; + } + return queued.completion; } async addSubscriber( @@ -1124,24 +1149,24 @@ export class GatewayRuntime { return { ok: true, mode: "steer", sessionKey }; } - if (managedSession.queue.length >= this.config.session.maxQueuePerSession) { - throw new HttpError( - 409, - `Queue full (${this.config.session.maxQueuePerSession} pending).`, - ); - } - - this.logSession( - managedSession, - `steer-fallback queue text="${preview}" depth=${managedSession.queue.length + 1}`, - ); - void this.enqueueManagedMessage({ + const queued = await this.queueManagedMessage({ request: { sessionKey, text, source: "extension", }, - }).then((result) => { + }); + if (!queued.accepted) { + throw new HttpError( + 409, + queued.errorResult.error ?? "Failed to queue message.", + ); + } + this.logSession( + queued.managedSession, + `steer-fallback queued text="${preview}"`, + ); + void queued.completion.then((result) => { if (!result.ok) { this.log( `[steer] session=${sessionKey} queued fallback failed: ${result.error ?? "Unknown error"}`, diff --git a/packages/coding-agent/test/gateway-steer.test.ts b/packages/coding-agent/test/gateway-steer.test.ts index 8327cb9..851f25a 100644 --- a/packages/coding-agent/test/gateway-steer.test.ts +++ b/packages/coding-agent/test/gateway-steer.test.ts @@ -107,12 +107,12 @@ describe("GatewayRuntime steer handling", () => { sessionKey: "chat", }); - await new Promise((resolve) => setTimeout(resolve, 0)); - expect(session.steer).not.toHaveBeenCalled(); - expect(session.prompt).toHaveBeenCalledWith("pick this up next", { - images: undefined, - source: "extension", + await vi.waitFor(() => { + expect(session.prompt).toHaveBeenCalledWith("pick this up next", { + images: undefined, + source: "extension", + }); }); }); });