fix: address steer review feedback

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Harivansh Rathi 2026-03-09 17:07:05 -07:00
parent 4a29c13e0d
commit 89b705194b
2 changed files with 56 additions and 31 deletions

View file

@ -173,11 +173,19 @@ export class GatewayRuntime {
return this.enqueueManagedMessage({ request }); return this.enqueueManagedMessage({ request });
} }
private async enqueueManagedMessage(queuedMessage: { private async queueManagedMessage(queuedMessage: {
request: GatewayMessageRequest; request: GatewayMessageRequest;
onStart?: () => void; onStart?: () => void;
onFinish?: () => void; onFinish?: () => void;
}): Promise<GatewayMessageResult> { }):
Promise<
| { accepted: false; errorResult: GatewayMessageResult }
| {
accepted: true;
managedSession: ManagedGatewaySession;
completion: Promise<GatewayMessageResult>;
}
> {
const managedSession = await this.ensureSession( const managedSession = await this.ensureSession(
queuedMessage.request.sessionKey, queuedMessage.request.sessionKey,
); );
@ -186,22 +194,39 @@ export class GatewayRuntime {
`[queue] session=${queuedMessage.request.sessionKey} queue full (${this.config.session.maxQueuePerSession})`, `[queue] session=${queuedMessage.request.sessionKey} queue full (${this.config.session.maxQueuePerSession})`,
); );
return { return {
accepted: false,
errorResult: {
ok: false, ok: false,
response: "", response: "",
error: `Queue full (${this.config.session.maxQueuePerSession} pending).`, error: `Queue full (${this.config.session.maxQueuePerSession} pending).`,
sessionKey: queuedMessage.request.sessionKey, sessionKey: queuedMessage.request.sessionKey,
},
}; };
} }
return new Promise<GatewayMessageResult>((resolve) => { const completion = new Promise<GatewayMessageResult>((resolve) => {
managedSession.queue.push({ ...queuedMessage, resolve }); managedSession.queue.push({ ...queuedMessage, resolve });
});
this.logSession( this.logSession(
managedSession, managedSession,
`queued source=${queuedMessage.request.source ?? "extension"} depth=${managedSession.queue.length}`, `queued source=${queuedMessage.request.source ?? "extension"} depth=${managedSession.queue.length}`,
); );
this.emitState(managedSession); this.emitState(managedSession);
void this.processNext(managedSession); void this.processNext(managedSession);
});
return { accepted: true, managedSession, completion };
}
private async enqueueManagedMessage(queuedMessage: {
request: GatewayMessageRequest;
onStart?: () => void;
onFinish?: () => void;
}): Promise<GatewayMessageResult> {
const queued = await this.queueManagedMessage(queuedMessage);
if (!queued.accepted) {
return queued.errorResult;
}
return queued.completion;
} }
async addSubscriber( async addSubscriber(
@ -1124,24 +1149,24 @@ export class GatewayRuntime {
return { ok: true, mode: "steer", sessionKey }; return { ok: true, mode: "steer", sessionKey };
} }
if (managedSession.queue.length >= this.config.session.maxQueuePerSession) { const queued = await this.queueManagedMessage({
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({
request: { request: {
sessionKey, sessionKey,
text, text,
source: "extension", 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) { if (!result.ok) {
this.log( this.log(
`[steer] session=${sessionKey} queued fallback failed: ${result.error ?? "Unknown error"}`, `[steer] session=${sessionKey} queued fallback failed: ${result.error ?? "Unknown error"}`,

View file

@ -107,12 +107,12 @@ describe("GatewayRuntime steer handling", () => {
sessionKey: "chat", sessionKey: "chat",
}); });
await new Promise((resolve) => setTimeout(resolve, 0));
expect(session.steer).not.toHaveBeenCalled(); expect(session.steer).not.toHaveBeenCalled();
await vi.waitFor(() => {
expect(session.prompt).toHaveBeenCalledWith("pick this up next", { expect(session.prompt).toHaveBeenCalledWith("pick this up next", {
images: undefined, images: undefined,
source: "extension", source: "extension",
}); });
}); });
});
}); });