* ui_kit: search_picker, a filtered dropdown with a custom entry
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: endpoints list their models with names, say when listing fails, and OpenClaw and OpenRouter presets (#2582)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: a typed model goes to endpoints and to agents that offer a model option
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: the header's model pickers search and take a custom model
The popup can't grow once it is open, so search_picker now fixes the height of what changes below
its box when it opens: the custom row or a late list could otherwise end up out of reach.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* AI preferences: pick an endpoint's model when adding it and on its card (#2582)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: model picker rows read from the left, and a refused typed model says which
From running it: list_picker centres its text, which reads badly for a long list of ids, and an
agent's own refusal can say no more than "Internal error". The search box also asks for a repaint
while it waits for the focus, so an idle window does not stop short of it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: docs for the model picker
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: an endpoint's answer that is no model list says so, an empty list too, and editing lists with the kept key
A 200 without a `data` array (a web page where the endpoint should be, as OpenClaw's gateway
serves until its chat endpoint is enabled) was cached as a successful, empty listing, so the
picker stayed blank with nothing to say and never asked again. Now it is an error with its own
note, an empty list says so, and both are asked for again the next time.
The Edit dialog lists its endpoint's models when it opens, with the kept key read from the
keychain on the listing's thread, as the card does; the key stays out of the field.
The method-not-found test expects the refusal notice that names the model, as every refused
model gets since this branch.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* Agent chat: models from several providers fold under their providers inside the picker
As Chemiseblanc does in #10187: with two or more groups, `search_picker` draws each group as a
header with a chevron, the name and how many of its choices are listed, and a click folds or opens
it. Before anything is typed only the current value's group (and the one the caller asks for) is
open; a group with a match opens once something is typed; a fold made by hand stays until the popup
closes. Enter takes the first row shown, so never one folded away. A lone group keeps its plain
heading.
The header's model picker feeds its providers in as groups, so the separate provider drop-down
goes; the control channel's `provider` now says which group opens first. A header click gives the
focus back to the search box, so typing goes on filtering.
The dialog's listing test checks what kind of listing it got rather than translated words, which
the listing thread may render in another language than the test's.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* Agent chat: rustfmt the provider groups
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* Agent chat: an endpoint's models named `Vendor: Model` fold under their vendors
OpenRouter lists `openai/gpt-6.1-terra` as "OpenAI: GPT-6.1 Terra". A listing whose ids read
`vendor/model` and whose names read `Vendor: Model` now names its providers, so the picker folds
it under its vendors like a multi-provider agent; the rows read the model's name, and the id stays
in the tooltip and in the search. An agent's own `Provider: …` word still comes first. One vendor
is one flat list, as before.
The Add dialog's picker has no current model to prefer, so with nothing to prefer every group
starts open; folding is a click away.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>