You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
More providers, and your own — local models included. The providers grid grows to eight: Mistral, DeepSeek, xAI (Grok) and OpenRouter join the original four, each a line of catalog data over the OpenAI chat-completions dialect rather than an integration. Under them, custom endpoints: anything speaking that same dialect — an Ollama or LM Studio on localhost (one-click presets carry their URLs), a gateway — with a name, a base URL, and an optional key, because connected stopped meaning "has a key": a local runtime has none to give, and reaching its /models is the connection. Every custom joins the grouped pickers like a catalog cloud, so a feature can run on deepseek-r1:14b at localhost while another stays on a cloud. A custom endpoint can also carry its auth quirks — the header its key rides in (empty = Authorization: Bearer; a name carries the raw key, the Azure api-key style) and extra headers a gateway may demand — behind a fold, because two gateways in a hundred need them. A provider speaking none of the three dialects is a catalog contribution, not a setting — configurable request formats are a footgun the OpenAI dialect exists to make unnecessary.
The AI Assistant page, laid out to be read. The providers are one list — the catalog and your own endpoints alike, a row each — the connected ones wearing their brand colour and their model count, a refused key saying so on its own row. The defaults and every feature share one two-column block: the model on the left, the instructions on the right, and the feature's temperament worn as a tag beside its heading in the badge colours, so a green fast model tag beside an iris reasoning badge reads as the mismatch it is. The ready-made fragments wait behind a Templates button at the right of each field, a pick writing the fragment in, a fragment already in the text reading as taken. The Save rides with the scroll and lights only against a real change — the page is a third shorter, and the key you just pasted no longer sits two screens above the button that keeps it.
A model and instructions per AI feature. One global model used to serve every AI call; there are seven now — commit messages, explain, conflict resolution, commit search, filter queries, pull request descriptions, issue drafting — and one size stopped fitting when they multiplied. Settings › AI is three zones now, and the active provider is gone: a Providers & keys zone where each of the four carries its own credential and reports its state (No key, or N models once the key answers), a Defaults zone — one default model chosen across every connected provider, grouped by provider, plus the standing instructions and their ready-made fragments — and a section per feature whose model select draws from the same grouped list, so the commit messages can run on one provider while the PR descriptions run on another. Every choice stores its (provider, model) pair — a bare model id is ambiguous across providers — a choice whose provider loses its key says so and falls back to the default rather than calling with an empty credential, and the old single-provider settings keep working as the fallback. The rules between sections take a tone of their own, distinct from the controls' borders. And each feature says which temperament it rewards — one line under its heading: a commit message runs often and answers in one line, so a fast model shines and a reasoning one spends its budget thinking first; a conflict or a branch summary earns a reasoning model its cost. The picker carries the knowledge too — as badges, in colour: reasoning in the AI ink (it is the model thinking), fast in the doing green, worn on the picker's face and on every row of its list (our own dropdown now: a native option cannot wear a badge). The typed features head their list with a Suggested group drawn from the connected providers' own live lists. Instructions are appended AFTER each prompt's format rules, so a wish cannot unsay a contract, and the outputs that are checked stay checked. Empty means the global setting, and a folded feature that carries an override says so.
Hold several commits at once. Shift-click takes the range from the last click, ctrl/cmd-click adds or removes a single row, and the selection reads as a grip on the graph — a plain click, the arrows or Escape let it go. Right-click inside the selection and the menu is about the lot: cherry-pick the N commits (applied oldest first, and stopping honestly where git stops — the first conflict hands over to the conflict flow, reported as far as it got), drop the N commits as one rebase — a loop of single drops would chase hashes its own first step rewrote, so the whole selection is one sequence with N lines marked drop — copy the N hashes or the N messages, or open them all on the remote.
Fixed
The splash wore a translucent halo on macOS 26. The system drew the window's shadow, glass rim included, for the whole window rectangle rather than the opaque card, so the transparent margin around the card lit up at every launch. The card draws its own shadow; the system's is off.
Every Gemini wore the fast badge — the heuristic read the mini inside gemini, so Gemini 2.5 Pro was labelled a small model. The word has to start where it starts (gpt-4o-mini, o3-mini); an id the heuristic cannot read stays unlabelled.
The signature shield leaves the graph.#146 narrowed it to signatures that could not be vouched for; one key rotation later the trouble codes did what the E code had been excused for — GitHub's expired signing key marked every merge in the graph, a fact about a keyring worn as a wound on the history. The graph draws no signature at all now; the data stays on the commit for a surface that can afford the nuance.
The stacked bullet centres on its cell. It sat one half-line high — centred on the message line, an old deliberate choice the two-line cell outgrew. The edges end where the nodes are, so they moved with it.
Two pixels of ground between stacked cells — one read as a scratch.