diff --git a/packages/coding-agent/test/advisor-provider-options-parity.test.ts b/packages/coding-agent/test/advisor-provider-options-parity.test.ts index c350eed6e..ba1605a04 100644 --- a/packages/coding-agent/test/advisor-provider-options-parity.test.ts +++ b/packages/coding-agent/test/advisor-provider-options-parity.test.ts @@ -7,8 +7,8 @@ * with only `sessionId`/`getApiKey`/telemetry — it dropped the session's * `streamFn` wrapper (so `providers.openrouterVariant` and `loopGuard` never * landed on advisor requests), its `promptCacheKey` (so OpenAI Responses - * fell back to a different cache shard), and its shared `providerSessionState` - * (so Codex websocket / Anthropic fast-mode state was not reused). + * fell back to a different cache shard), its shared `providerSessionState`, + * and its explicit websocket preference. */ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test"; import * as path from "node:path"; @@ -68,7 +68,7 @@ describe("AgentSession advisor provider-options parity", () => { } catch {} }); - it("inherits streamFn, promptCacheKey and providerSessionState from the session", () => { + it("inherits streamFn, promptCacheKey, websocket preference, and providerSessionState from the session", () => { const advisorStreamFn: StreamFn = (m, ctx, opts) => streamSimple(m, ctx, opts); const mainAgent = new Agent({ initialState: { model, systemPrompt: ["Test"], tools: [], messages: [] }, @@ -80,6 +80,7 @@ describe("AgentSession advisor provider-options parity", () => { modelRegistry, advisorTools: [], advisorStreamFn, + preferWebsockets: true, }); session.settings.setModelRole("advisor", "anthropic/claude-sonnet-4-5"); expect(session.setAdvisorEnabled(true)).toBe(true); @@ -97,6 +98,7 @@ describe("AgentSession advisor provider-options parity", () => { // Shared transport / fast-mode state map keeps Codex websockets and // Anthropic fast-mode fallbacks consistent across the two agents. expect(advisor.providerSessionState).toBe(session.providerSessionState); + expect(session.preferWebsockets).toBe(true); // Stable cache key on the advisor session id pins consecutive advisor // turns to the same OpenAI Responses cache shard. @@ -131,6 +133,7 @@ describe("AgentSession advisor provider-options parity", () => { onResponse, onSseEvent, transformProviderContext, + preferWebsockets: true, }); session.settings.setModelRole("advisor", "anthropic/claude-sonnet-4-5"); expect(session.setAdvisorEnabled(true)).toBe(true); @@ -160,5 +163,6 @@ describe("AgentSession advisor provider-options parity", () => { expect(opts.sessionId).toBe(advisor.sessionId); expect(opts.promptCacheKey).toBe(advisor.sessionId); expect(opts.providerSessionState).toBe(session.providerSessionState); + expect(opts.preferWebsockets).toBe(true); }); }); diff --git a/packages/coding-agent/test/bench-auth-fallback.test.ts b/packages/coding-agent/test/bench-auth-fallback.test.ts index 4381bfab1..aab7b4da0 100644 --- a/packages/coding-agent/test/bench-auth-fallback.test.ts +++ b/packages/coding-agent/test/bench-auth-fallback.test.ts @@ -208,6 +208,39 @@ async function captureServiceTier(opts: { return { wire: captured?.serviceTier, summary: summary.serviceTier }; } +describe("bench provider session state and websocket preference", () => { + it("sends providerSessionState and preferWebsockets to the stream", async () => { + const registry = fakeRegistry({ + models: [fakeModel("openai-codex", "gpt-5.5")], + authedProviders: ["openai-codex"], + }); + let captured: SimpleStreamOptions | undefined; + await runBenchCommand( + { models: ["openai-codex/gpt-5.5"], flags: { runs: 1, maxTokens: 64, json: true } }, + { + createRuntime: async () => ({ + modelRegistry: registry, + settings: undefined, + close: () => {}, + }), + randomSessionId: () => "sess-1", + writeStdout: () => {}, + writeStderr: () => {}, + setExitCode: () => {}, + streamSimple: (_model, _context, options) => { + captured = options; + return fakeStream(); + }, + now: () => 0, + stdoutIsTTY: false, + }, + ); + expect(captured?.providerSessionState).toBeInstanceOf(Map); + expect(captured?.providerSessionState?.size).toBe(0); + expect(captured?.preferWebsockets).toBe(true); + }); +}); + describe("bench service tier", () => { it("sends the configured serviceTier setting when no flag is passed", async () => { const { wire, summary } = await captureServiceTier({ setting: "flex" });