Skip to content

Commit e804ba5

Browse files
author
Codex
committed
Disable websocket transport by default
1 parent f8b3d82 commit e804ba5

6 files changed

Lines changed: 14 additions & 14 deletions

File tree

src/codex-catalog.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ function deriveEntry(template: RawEntry | null, slug: string, desc: string, prio
233233
* catalog sync and the proxy `/v1/models?client_version` branch.
234234
* Native gpt slugs stay bare; routed models are namespaced `<provider>/<model>`.
235235
*/
236-
export function buildCatalogEntries(template: RawEntry | null, gptSlugs: string[], goModels: CatalogModel[], featured?: string[], wsEnabled = true): RawEntry[] {
236+
export function buildCatalogEntries(template: RawEntry | null, gptSlugs: string[], goModels: CatalogModel[], featured?: string[], wsEnabled = false): RawEntry[] {
237237
// Codex's models-manager sorts by `priority` ASC and advertises the first 5 picker-visible
238238
// models to spawn_agent (sort_by_key(priority) + MAX_MODEL_OVERRIDES_IN_SPAWN_AGENT=5). Catalog
239239
// ARRAY order is discarded — so "featuring" a model = giving it the LOWEST priority (0..N-1) so

src/codex-inject.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const OCX_SECTION_MARKER = "# Auto-injected by opencodex";
1414
* whatever `[table]` happened to be open last (e.g. `[plugins."chrome@openai-bundled"]`), so Codex
1515
* never saw a global model_provider and silently fell back to the `openai` (ChatGPT) provider.
1616
*/
17-
export function buildProviderTableBlock(port: number, supportsWebsockets = true): string {
17+
export function buildProviderTableBlock(port: number, supportsWebsockets = false): string {
1818
const lines = [
1919
"",
2020
OCX_SECTION_MARKER,

src/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export function saveConfig(config: OcxConfig): void {
5858
}
5959

6060
export function websocketsEnabled(config: Pick<OcxConfig, "websockets">): boolean {
61-
return config.websockets !== false;
61+
return config.websockets === true;
6262
}
6363

6464
export function getDefaultConfig(): OcxConfig {
@@ -76,7 +76,7 @@ export function getDefaultConfig(): OcxConfig {
7676
},
7777
defaultProvider: "openai",
7878
subagentModels: [...DEFAULT_SUBAGENT_MODELS],
79-
websockets: true,
79+
websockets: false,
8080
};
8181
}
8282

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ export interface OcxConfig {
175175
subagentModels?: string[];
176176
/** Routed model ids ("<provider>/<model>") hidden from Codex (excluded from the catalog + /v1/models). */
177177
disabledModels?: string[];
178-
/** Advertise supports_websockets so Codex opens the WS endpoint. Default true; set false to force HTTPS/SSE. */
178+
/** Advertise supports_websockets so Codex opens the WS endpoint. Default false; set true to opt in. */
179179
websockets?: boolean;
180180
/** Freshness window (ms) for the per-provider live `/models` cache. Defaults to 5 min. */
181181
modelCacheTtlMs?: number;

tests/codex-catalog.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ describe("Codex catalog routed normalization", () => {
6262
expect(routed).not.toHaveProperty("tool_mode");
6363
expect(routed).not.toHaveProperty("multi_agent_version");
6464
expect(routed).not.toHaveProperty("use_responses_lite");
65-
expect(routed?.supports_websockets).toBe(true);
65+
expect(routed).not.toHaveProperty("supports_websockets");
6666
expect(routed).not.toHaveProperty("additional_speed_tiers");
6767
expect(routed).not.toHaveProperty("service_tier");
6868
expect(routed).not.toHaveProperty("service_tiers");
@@ -99,20 +99,20 @@ describe("Codex catalog routed normalization", () => {
9999
expect(native?.tool_mode).toBe("code");
100100
expect(native?.multi_agent_version).toBe("v2");
101101
expect(native?.use_responses_lite).toBe(true);
102-
// Phase 133: websocket advertisement is default-on after Phase 132 hardening.
103-
expect(native?.supports_websockets).toBe(true);
102+
// WebSocket advertisement is opt-in; templates must not leak it by default.
103+
expect(native).not.toHaveProperty("supports_websockets");
104104
expect(native?.web_search_tool_type).toBe("text_and_image");
105105
expect(native?.supports_search_tool).toBe(true);
106106
expect(native?.service_tier).toBe("priority");
107107
expect(native?.service_tiers).toEqual([{ id: "priority" }]);
108108
});
109109

110-
test("buildCatalogEntries advertises supports_websockets by default with explicit opt-out", () => {
110+
test("buildCatalogEntries advertises supports_websockets only on explicit opt-in", () => {
111111
const goModels = [{ provider: "anthropic", id: "claude-sonnet-4-6", owned_by: "anthropic" }];
112112

113-
const defaultOn = buildCatalogEntries(nativeTemplate(), ["gpt-5.5"], goModels);
114-
expect(defaultOn.find(e => e.slug === "gpt-5.5")?.supports_websockets).toBe(true);
115-
expect(defaultOn.find(e => e.slug === "anthropic/claude-sonnet-4-6")?.supports_websockets).toBe(true);
113+
const defaultOff = buildCatalogEntries(nativeTemplate(), ["gpt-5.5"], goModels);
114+
expect(defaultOff.find(e => e.slug === "gpt-5.5")).not.toHaveProperty("supports_websockets");
115+
expect(defaultOff.find(e => e.slug === "anthropic/claude-sonnet-4-6")).not.toHaveProperty("supports_websockets");
116116

117117
const on = buildCatalogEntries(nativeTemplate(), ["gpt-5.5"], goModels, undefined, true);
118118
expect(on.find(e => e.slug === "gpt-5.5")?.supports_websockets).toBe(true);

tests/codex-inject.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import { describe, expect, test } from "bun:test";
22
import { buildProviderTableBlock, stripOpencodexConfig } from "../src/codex-inject";
33

44
describe("Codex config injection", () => {
5-
test("advertises provider-level Responses WebSocket support by default", () => {
5+
test("omits provider-level Responses WebSocket support by default", () => {
66
const block = buildProviderTableBlock(10100);
77

88
expect(block).toContain("[model_providers.opencodex]");
99
expect(block).toContain('wire_api = "responses"');
1010
expect(block).toContain("requires_openai_auth = true");
11-
expect(block).toContain("supports_websockets = true");
11+
expect(block).not.toContain("supports_websockets");
1212
});
1313

1414
test("can suppress provider-level Responses WebSocket support for explicit opt-out", () => {

0 commit comments

Comments
 (0)