diff --git a/frontend/packages/agent/src/Root.tsx b/frontend/packages/agent/src/Root.tsx index 7aabfc37..40b64fa6 100644 --- a/frontend/packages/agent/src/Root.tsx +++ b/frontend/packages/agent/src/Root.tsx @@ -192,6 +192,7 @@ export function Root() { stateTone={turnDef.tone} stateTooltip={STATE_TOOLTIPS[effectiveTurnState]} model={state.model} + resolvedModel={state.resolved_model ?? undefined} availableModels={state.available_models} onSelectModel={(name) => { postModel(name).then(() => refresh()); diff --git a/frontend/packages/agent/src/components/StatusChips.tsx b/frontend/packages/agent/src/components/StatusChips.tsx index 8c00f94e..096e0f52 100644 --- a/frontend/packages/agent/src/components/StatusChips.tsx +++ b/frontend/packages/agent/src/components/StatusChips.tsx @@ -21,6 +21,11 @@ export interface StatusChipsProps { stateTone: BadgeTone; stateTooltip?: string; model: string; + /** Concrete model id the last completed turn actually ran on, e.g. + * "claude-sonnet-4-5-20260805" — shown as the badge's tooltip so the + * operator can tell what an alias resolved to. `undefined` before any + * turn has completed. */ + resolvedModel?: string; availableModels: string[]; onSelectModel: (name: string) => void; effort: string; @@ -54,12 +59,14 @@ function Picker({ options, descriptions, onSelect, + title, }: { label: string; value: string; options: string[]; descriptions: Record; onSelect: (v: string) => void; + title?: string; }) { const [open, setOpen] = useState(false); const dropdownOptions: DropdownOption[] = options.map((name) => ({ @@ -69,7 +76,7 @@ function Picker({ })); return (
- setOpen((o) => !o)} expanded={open} /> + setOpen((o) => !o)} expanded={open} title={title} /> {availableEfforts.length ? ( ) -> axum::Json) -> axum::Json, /// Effective context-window token budget for the current model. /// Primary source: API-reported `modelUsage.*.contextWindow` from /// the last result event (authoritative per-inference active window).