fix: preserve full OpenCode provider cost shape in auth.loader

The normalizeProviderModelCosts function was only setting { input: 0, output: 0 }
which doesn't match the full OpenCode provider cost shape that includes cache fields.

This fix:
- Preserves existing cost fields (input, output, cache.read, cache.write) if valid
- Adds missing cache: { read: 0, write: 0 } structure when not present
- Validates provider and model objects before modification to avoid poisoning
  invalid provider metadata
- Updates ProviderModel type to include optional cache field

Fixes provider cost normalization to maintain cache field compatibility.
This commit is contained in:
Developer 2026-05-09 15:28:13 -04:00
parent 6fea0178eb
commit 47d6fc7382
7 changed files with 429 additions and 1 deletions

View file

@ -70,6 +70,23 @@ export type TuiRouteDefinition = {
render: (input: { params?: Record<string, unknown> }) => JSX.Element
}
/** @deprecated Use api.keymap.registerLayer({ commands, bindings }) instead. */
export type TuiCommand = {
title: string
value: string
description?: string
category?: string
keybind?: string
suggested?: boolean
hidden?: boolean
enabled?: boolean
slash?: {
name: string
aliases?: string[]
}
onSelect?: () => void
}
export type TuiKeys = {
formatSequence: (parts: readonly KeySequenceFormatPart[] | undefined) => string
formatBindings: (bindings: readonly SequenceBindingLike[] | undefined) => string | undefined
@ -463,6 +480,12 @@ export type TuiPluginApi = {
app: TuiApp
keys: TuiKeys
keymap: TuiKeymap
/** @deprecated Use api.keymap.registerLayer({ commands, bindings }) instead. */
command: {
register: (cb: () => TuiCommand[]) => () => void
trigger: (value: string) => void
show: () => void
}
route: {
register: (routes: TuiRouteDefinition[]) => () => void
navigate: (name: string, params?: Record<string, unknown>) => void