fix: wave 1 quick wins — agent names, scroll bounce-back, chart empty states, model-pin preservation, UUID spawn normalization (#546)

* fix(panel): notifications show agent names, metrics charts get empty states

* fix(panel): stop expand/collapse scroll bounce-back; add floating scroll-jump buttons

* fix(llm): provider mode switches preserve per-agent model pins

* fix(api): normalize agent UUID to slug at the orchestrator route boundary

* fix(panel,docs): align routing-card copy and map docs with preserved-pin mode switches

* fix(panel): drop dead unfiltered scroll hook, re-observe on Suspense swap, name system sender

* docs(map): reflect preserved-pin mode switches, UUID-slug normalization, panel wave-1 deltas

---------

Co-authored-by: Renn F <rennf93@users.noreply.github.com>
This commit is contained in:
Renzo F
2026-07-18 00:42:13 +02:00
committed by GitHub
co-authored by Renn F
parent 4c8a9fc008
commit 9b4ce6b9c8
24 changed files with 415 additions and 160 deletions
@@ -223,11 +223,15 @@ export function AIRoutingCard() {
// --- Mode toggle handlers ---
const flipToAnthropic = async () => {
if (!confirm("Switch every agent to Anthropic? Clears any overrides."))
if (
!confirm(
"Switch every agent to Anthropic? Per-agent pins are kept; role/global assignments are replaced.",
)
)
return;
try {
await applyMode.mutateAsync({ mode: "anthropic" });
toast.success("All agents now on Anthropic");
toast.success("Role/global routing now on Anthropic — per-agent pins kept");
} catch (e) {
toast.error("Switch failed: " + errMsg(e));
}
@@ -238,10 +242,15 @@ export function AIRoutingCard() {
toast.error("Save the Grok (xAI) API key first");
return;
}
if (!confirm("Switch every agent to Grok? Clears any overrides.")) return;
if (
!confirm(
"Switch every agent to Grok? Per-agent pins are kept; role/global assignments are replaced.",
)
)
return;
try {
await applyMode.mutateAsync({ mode: "grok" });
toast.success("All agents now on Grok");
toast.success("Role/global routing now on Grok — per-agent pins kept");
} catch (e) {
toast.error("Switch failed: " + errMsg(e));
}
@@ -252,10 +261,15 @@ export function AIRoutingCard() {
toast.error("Save an Ollama API key first");
return;
}
if (!confirm("Switch every agent to Ollama? Clears any overrides.")) return;
if (
!confirm(
"Switch every agent to Ollama? Per-agent pins are kept; role/global assignments are replaced.",
)
)
return;
try {
await applyMode.mutateAsync({ mode: "ollama" });
toast.success("All agents now on Ollama");
toast.success("Role/global routing now on Ollama — per-agent pins kept");
} catch (e) {
toast.error("Switch failed: " + errMsg(e));
}
@@ -268,7 +282,7 @@ export function AIRoutingCard() {
}
if (
!confirm(
"Switch every agent to the self-hosted LLM? Clears any overrides.",
"Switch every agent to the self-hosted LLM? Per-agent pins are kept; role/global assignments are replaced.",
)
)
return;
@@ -277,7 +291,7 @@ export function AIRoutingCard() {
mode: "self_hosted",
...(selfHostedModel ? { default_model: selfHostedModel } : {}),
});
toast.success("All agents now on Self-Hosted LLM");
toast.success("Role/global routing now on Self-Hosted LLM — per-agent pins kept");
} catch (e) {
toast.error("Switch failed: " + errMsg(e));
}
@@ -480,7 +494,7 @@ export function AIRoutingCard() {
{/* -------- Mode toggle -------- */}
<section className="space-y-3">
<HelpTip label="Anthropic / Grok / Ollama / Self-Hosted route every agent to one provider and clear all per-agent overrides below. Mix keeps whatever's picked in the table.">
<HelpTip label="Anthropic / Grok / Ollama / Self-Hosted replace role/global routing with that provider; per-agent pins in the table below survive the switch. Mix keeps whatever's picked in the table.">
<Label className="text-sm font-medium">Routing mode</Label>
</HelpTip>
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-2">