From 75e7ba62ef21a2e3e5abd96902ca2ed47c65d6c1 Mon Sep 17 00:00:00 2001 From: Julian Schoen Date: Wed, 1 Apr 2026 22:11:28 +0200 Subject: [PATCH] fix: eliminate `any` types from production source code Replace all `any` type assertions and annotations in non-test source files with proper types, improving compile-time safety without changing runtime behavior. --- packages/core/src/bridge/adapter.ts | 2 +- packages/core/src/commands/types.ts | 2 +- packages/core/src/config/types.ts | 2 +- packages/core/src/model/adapters/vercel.ts | 17 ++++++++++++----- packages/core/src/model/schema-optimizer.ts | 14 +++++++------- packages/core/src/viewport/viewport.ts | 4 ++-- 6 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/core/src/bridge/adapter.ts b/packages/core/src/bridge/adapter.ts index 550af75..33dceaa 100644 --- a/packages/core/src/bridge/adapter.ts +++ b/packages/core/src/bridge/adapter.ts @@ -83,7 +83,7 @@ export class BridgeAdapter { } if (schema instanceof z.ZodDefault) { const inner = this.fieldToJsonSchema(schema.removeDefault()); - (inner as any).default = schema._def.defaultValue(); + inner.default = schema._def.defaultValue(); return inner; } if (schema instanceof z.ZodLiteral) { diff --git a/packages/core/src/commands/types.ts b/packages/core/src/commands/types.ts index 12f99a2..75686bc 100644 --- a/packages/core/src/commands/types.ts +++ b/packages/core/src/commands/types.ts @@ -208,7 +208,7 @@ export interface InterpretedViewportError { export interface CustomCommandSpec { name: string; description: string; - schema: z.ZodObject; + schema: z.ZodObject; handler: (params: Record, context: ExecutionContext) => Promise; terminatesSequence?: boolean; } diff --git a/packages/core/src/config/types.ts b/packages/core/src/config/types.ts index 81aee73..1602aad 100644 --- a/packages/core/src/config/types.ts +++ b/packages/core/src/config/types.ts @@ -61,7 +61,7 @@ export const AgentConfigSchema = z.object({ traceOutputPath: z.string().optional(), replayOutputPath: z.string().optional(), strategyInterval: z.number().default(0), - plannerModel: z.any().optional(), + plannerModel: z.unknown().optional(), enableStrategy: z.boolean().default(false), enableEvaluation: z.boolean().default(false), stepTimeout: z.number().default(60000), diff --git a/packages/core/src/model/adapters/vercel.ts b/packages/core/src/model/adapters/vercel.ts index 31d8fbf..3db2e91 100644 --- a/packages/core/src/model/adapters/vercel.ts +++ b/packages/core/src/model/adapters/vercel.ts @@ -65,16 +65,23 @@ export class VercelModelAdapter implements LanguageModel { usage, finishReason: mapFinishReason(result.finishReason), }; - } catch (error: any) { - if (error?.statusCode === 429 || error?.message?.includes('rate limit')) { - const retryAfter = error?.headers?.['retry-after']; + } catch (error: unknown) { + const err = error as Record | undefined; + const message = err && typeof err === 'object' && 'message' in err ? String(err.message) : String(error); + const statusCode = err && typeof err === 'object' && 'statusCode' in err ? err.statusCode : undefined; + const headers = err && typeof err === 'object' && 'headers' in err + ? (err.headers as Record | undefined) + : undefined; + + if (statusCode === 429 || message.includes('rate limit')) { + const retryAfter = headers?.['retry-after']; throw new ModelThrottledError( - error.message ?? 'Rate limited', + message || 'Rate limited', retryAfter ? Number.parseInt(retryAfter) * 1000 : undefined, ); } throw new ModelError( - `LLM invocation failed: ${error?.message ?? String(error)}`, + `LLM invocation failed: ${message}`, { cause: error }, ); } diff --git a/packages/core/src/model/schema-optimizer.ts b/packages/core/src/model/schema-optimizer.ts index b866948..0c17857 100644 --- a/packages/core/src/model/schema-optimizer.ts +++ b/packages/core/src/model/schema-optimizer.ts @@ -79,7 +79,7 @@ export function optimizeSchemaForModel( const kept = variants.slice(0, maxVariants - 1); const catchAll = z.object({}).passthrough().describe('Other action (see documentation)'); const unionMembers = [...kept, catchAll] as unknown as [ZodTypeAny, ZodTypeAny, ...ZodTypeAny[]]; - return z.union(unionMembers) as any; + return z.union(unionMembers) as unknown as T; } } @@ -91,7 +91,7 @@ export function optimizeSchemaForModel( const kept = variants.slice(0, maxVariants - 1); const catchAll = z.object({}).passthrough().describe('Other variant'); const unionMembers = [...kept, catchAll] as unknown as [ZodTypeAny, ZodTypeAny, ...ZodTypeAny[]]; - return z.union(unionMembers) as any; + return z.union(unionMembers) as unknown as T; } } @@ -441,11 +441,11 @@ export function zodToJsonSchema(schema: ZodTypeAny): Record { jsonSchema.type = 'array'; jsonSchema.items = zodToJsonSchema(schema.element); } else if (schema instanceof z.ZodOptional) { - return zodToJsonSchema(schema.unwrap()) as any; + return zodToJsonSchema(schema.unwrap()); } else if (schema instanceof z.ZodDefault) { - const inner = zodToJsonSchema(schema.removeDefault()) as any; + const inner = zodToJsonSchema(schema.removeDefault()); inner.default = schema._def.defaultValue(); - return inner as any; + return inner; } else if (schema instanceof z.ZodEnum) { jsonSchema.type = 'string'; jsonSchema.enum = schema.options; @@ -459,7 +459,7 @@ export function zodToJsonSchema(schema: ZodTypeAny): Record { ); } else if (schema instanceof z.ZodNullable) { const inner = zodToJsonSchema(schema.unwrap()); - return { oneOf: [inner, { type: 'null' }] } as any; + return { oneOf: [inner, { type: 'null' }] }; } else if (schema instanceof z.ZodRecord) { jsonSchema.type = 'object'; jsonSchema.additionalProperties = zodToJsonSchema(schema.element); @@ -471,5 +471,5 @@ export function zodToJsonSchema(schema: ZodTypeAny): Record { jsonSchema.description = schema.description; } - return jsonSchema as any; + return jsonSchema; } diff --git a/packages/core/src/viewport/viewport.ts b/packages/core/src/viewport/viewport.ts index 2e3b9cb..77468d7 100644 --- a/packages/core/src/viewport/viewport.ts +++ b/packages/core/src/viewport/viewport.ts @@ -214,7 +214,7 @@ export class Viewport { const pageTitle = await this._currentPage.title(); // Emit initial lifecycle events - this.eventBus.emit('content-ready', undefined as any); + this.eventBus.emit('content-ready', undefined as void); if (!isNewTabPage(pageUrl)) { this.eventBus.emit('page-ready', { url: pageUrl }); @@ -993,7 +993,7 @@ export class Viewport { this.knownTargets.clear(); this.cachedViewport = null; - this.eventBus.emit('shutdown', undefined as any); + this.eventBus.emit('shutdown', undefined as void); this.eventBus.removeAllListeners(); logger.info('Browser session closed');