Skip to content

Commit 214c00a

Browse files
fix(doctor): satisfy lint and test-types for codex context migration
Add braces to a guard clause and use const for a never-reassigned binding in the runtime models migration, and switch the migration tests to optional chaining / explicit casts so they pass both tsgo (no possibly-undefined access) and oxlint (no unnecessary type assertions).
1 parent 0a27734 commit 214c00a

3 files changed

Lines changed: 29 additions & 30 deletions

File tree

src/commands/doctor/shared/legacy-config-migrate.test.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,13 @@ describe("legacy memory search config migrate", () => {
132132
expect(openai).toBeDefined();
133133
expect(res.config?.models?.providers).not.toHaveProperty("openai-codex");
134134

135-
const model = openai!.models![0];
136-
expect(model.id).toBe("gpt-5.5");
137-
expect(model.name).toBe("GPT-5.5");
135+
const model = openai?.models?.[0];
136+
expect(model?.id).toBe("gpt-5.5");
137+
expect(model?.name).toBe("GPT-5.5");
138138
// Context metadata preserved
139-
expect(model.contextWindow).toBe(200_000);
140-
expect(model.contextTokens).toBe(100_000);
141-
expect(model.maxTokens).toBe(16_384);
139+
expect(model?.contextWindow).toBe(200_000);
140+
expect(model?.contextTokens).toBe(100_000);
141+
expect(model?.maxTokens).toBe(16_384);
142142
// Transport/runtime fields excluded
143143
expect(model).not.toHaveProperty("baseUrl");
144144
expect(model).not.toHaveProperty("api");
@@ -217,21 +217,21 @@ describe("legacy memory search config migrate", () => {
217217
expect(res.config?.models?.providers).not.toHaveProperty("openai-codex");
218218

219219
// Case 3: gpt-4.1 already has contextWindow and contextTokens explicitly set — should NOT be overwritten
220-
const gpt41 = openaiProvider!.models!.find((m: any) => m.id === "gpt-4.1");
221-
expect(gpt41.contextWindow).toBe(2_000_000);
222-
expect(gpt41.contextTokens).toBe(1_000_000);
220+
const gpt41 = openaiProvider?.models?.find((m: any) => m.id === "gpt-4.1");
221+
expect(gpt41?.contextWindow).toBe(2_000_000);
222+
expect(gpt41?.contextTokens).toBe(1_000_000);
223223

224224
// Case 2: gpt-5.5 exists without context metadata — should receive contextTokens and maxTokens from legacy
225-
const gpt55 = openaiProvider!.models!.find((m: any) => m.id === "gpt-5.5");
226-
expect(gpt55.contextTokens).toBe(200000);
227-
expect(gpt55.maxTokens).toBe(16384);
225+
const gpt55 = openaiProvider?.models?.find((m: any) => m.id === "gpt-5.5");
226+
expect(gpt55?.contextTokens).toBe(200000);
227+
expect(gpt55?.maxTokens).toBe(16384);
228228

229229
// Case 1: o3 does not exist in openai.models — entire entry should be copied verbatim
230-
const o3 = openaiProvider!.models!.find((m: any) => m.id === "o3");
230+
const o3 = openaiProvider?.models?.find((m: any) => m.id === "o3");
231231
expect(o3).toBeDefined();
232-
expect(o3.contextWindow).toBe(200_000);
233-
expect(o3.contextTokens).toBe(100000);
234-
expect(o3.maxTokens).toBe(100000);
232+
expect(o3?.contextWindow).toBe(200_000);
233+
expect(o3?.contextTokens).toBe(100000);
234+
expect(o3?.maxTokens).toBe(100000);
235235

236236
expect(res.changes).toContain(
237237
"Removed models.providers.openai-codex because models.providers.openai already exists.",

src/commands/doctor/shared/legacy-config-migrations.runtime.models.test.ts

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,9 @@ describe("legacy codex context metadata migration", () => {
253253

254254
migration!.apply(raw, changes);
255255

256-
const openaiProvider = (raw.models!.providers as Record<string, unknown>).openai as Record<
257-
string,
258-
unknown
259-
>;
256+
const openaiProvider = (
257+
(raw.models as Record<string, unknown>).providers as Record<string, unknown>
258+
).openai as Record<string, unknown>;
260259
const openaiModels = Array.isArray(openaiProvider.models) ? openaiProvider.models : [];
261260
expect(openaiModels).toHaveLength(1);
262261
expect(openaiModels[0]).toMatchObject({
@@ -285,10 +284,9 @@ describe("legacy codex context metadata migration", () => {
285284

286285
migration!.apply(raw, changes);
287286

288-
const openaiProvider = (raw.models!.providers as Record<string, unknown>).openai as Record<
289-
string,
290-
unknown
291-
>;
287+
const openaiProvider = (
288+
(raw.models as Record<string, unknown>).providers as Record<string, unknown>
289+
).openai as Record<string, unknown>;
292290
const openaiModels = openaiProvider.models as Record<string, unknown>[];
293291
expect(openaiModels).toHaveLength(1);
294292
expect(openaiModels[0].contextTokens).toBe(200_000);
@@ -316,10 +314,9 @@ describe("legacy codex context metadata migration", () => {
316314

317315
migration!.apply(raw, changes);
318316

319-
const openaiProvider = (raw.models!.providers as Record<string, unknown>).openai as Record<
320-
string,
321-
unknown
322-
>;
317+
const openaiProvider = (
318+
(raw.models as Record<string, unknown>).providers as Record<string, unknown>
319+
).openai as Record<string, unknown>;
323320
const openaiModels = openaiProvider.models as Record<string, unknown>[];
324321
expect(openaiModels[0].contextTokens).toBe(128_000);
325322
expect(openaiModels[0].contextWindow).toBe(128_000);

src/commands/doctor/shared/legacy-config-migrations.runtime.models.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,7 @@ function migrateLegacyContextMetadata(
976976
return;
977977
}
978978

979-
let openaiModels = Array.isArray(openaiProvider.models) ? openaiProvider.models : [];
979+
const openaiModels = Array.isArray(openaiProvider.models) ? openaiProvider.models : [];
980980
let changed = false;
981981
const modelIdLookup = new Map<string, number>();
982982
for (let i = 0; i < openaiModels.length; i++) {
@@ -1071,7 +1071,9 @@ function migrateLegacyOpenAICodexProvider(raw: Record<string, unknown>, changes:
10711071
if (Array.isArray(sanitized.models)) {
10721072
sanitized.models = sanitized.models.map((model) => {
10731073
const record = getRecord(model);
1074-
if (!record) return {};
1074+
if (!record) {
1075+
return {};
1076+
}
10751077
const safe: Record<string, unknown> = {};
10761078
for (const field of LEGACY_MODEL_SAFE_FIELDS) {
10771079
const val = record[field];

0 commit comments

Comments
 (0)