diff --git a/messages/de.json b/messages/de.json index c7befd31d..0a41fd0b5 100644 --- a/messages/de.json +++ b/messages/de.json @@ -5283,17 +5283,9 @@ "title": "Integrationen", "subtitle": "Umami, GlitchTip, Web Push und Bug-Reports konfigurieren." }, - "ai-quality": { - "title": "Auswertungs-Qualität", - "subtitle": "Hilfreichkeit nach Schweregrad und Provider — Nutzer-Feedback der letzten 30 Tage." - }, - "assistant": { - "title": "Assistenz-Oberflächen", - "subtitle": "Jede modellgestützte Oberfläche separat ein- oder ausschalten, ohne die Provider-Konfiguration zu entfernen." - }, - "coach-feedback": { - "title": "Coach-Feedback", - "subtitle": "Hilfreich-Quote pro Coach-Prompt-Version, Tonfall und Ausführlichkeit der letzten 30 Tage." + "coach": { + "title": "Coach", + "subtitle": "Assistenz-Oberflächen, Server-Schlüssel sowie die Feedback-Qualitäts-Tabellen für Coach und Auswertungen an einem Ort." }, "feedback": { "title": "Feedback", diff --git a/messages/en.json b/messages/en.json index 32385a1a4..86057cefd 100644 --- a/messages/en.json +++ b/messages/en.json @@ -5283,17 +5283,9 @@ "title": "Integrations", "subtitle": "Configure Umami, GlitchTip, Web Push, and bug reports." }, - "ai-quality": { - "title": "Insights Quality", - "subtitle": "Helpfulness scores grouped by severity and provider, from the last 30 days of user feedback." - }, - "assistant": { - "title": "Assistant Surfaces", - "subtitle": "Toggle each model-driven surface on or off without removing the provider configuration." - }, - "coach-feedback": { - "title": "Coach Feedback", - "subtitle": "Helpful-rate per Coach prompt version, tone, and verbosity from the last 30 days." + "coach": { + "title": "Coach", + "subtitle": "Assistant surfaces, server key, and the Coach and Insights feedback-quality tables in one place." }, "feedback": { "title": "Feedback", diff --git a/messages/es.json b/messages/es.json index 3d0c9e8a5..1e965f03e 100644 --- a/messages/es.json +++ b/messages/es.json @@ -5283,17 +5283,9 @@ "title": "Integraciones", "subtitle": "Configura Umami, GlitchTip, Web Push e informes de errores." }, - "ai-quality": { - "title": "Calidad de los análisis", - "subtitle": "Puntuaciones de utilidad agrupadas por gravedad y proveedor, de los últimos 30 días de comentarios de usuarios." - }, - "assistant": { - "title": "Superficies del asistente", - "subtitle": "Activa o desactiva cada superficie impulsada por el modelo sin retirar la configuración del proveedor." - }, - "coach-feedback": { - "title": "Comentarios del Coach", - "subtitle": "Tasa de utilidad por versión de prompt, tono y nivel de detalle del Coach de los últimos 30 días." + "coach": { + "title": "Coach", + "subtitle": "Superficies del asistente, clave del servidor y las tablas de calidad de comentarios del Coach y de los análisis, en un solo lugar." }, "feedback": { "title": "Comentarios", diff --git a/messages/fr.json b/messages/fr.json index fa30711b1..7cba3c12c 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -5283,17 +5283,9 @@ "title": "Intégrations", "subtitle": "Configurez Umami, GlitchTip, Web Push et les rapports de bug." }, - "ai-quality": { - "title": "Qualité des analyses", - "subtitle": "Scores d'utilité regroupés par gravité et fournisseur, sur les 30 derniers jours de retours utilisateurs." - }, - "assistant": { - "title": "Surfaces d'assistance", - "subtitle": "Activer ou désactiver chaque surface pilotée par le modèle sans supprimer la configuration du fournisseur." - }, - "coach-feedback": { - "title": "Retours sur le Coach", - "subtitle": "Taux d'utilité par version de prompt, ton et niveau de détail du Coach sur les 30 derniers jours." + "coach": { + "title": "Coach", + "subtitle": "Surfaces d'assistance, clé du serveur et les tableaux de qualité des retours du Coach et des analyses, au même endroit." }, "feedback": { "title": "Retours", diff --git a/messages/it.json b/messages/it.json index 11959a6f4..2d45152a9 100644 --- a/messages/it.json +++ b/messages/it.json @@ -5283,17 +5283,9 @@ "title": "Integrazioni", "subtitle": "Configura Umami, GlitchTip, Web Push e le segnalazioni di bug." }, - "ai-quality": { - "title": "Qualità delle analisi", - "subtitle": "Punteggi di utilità raggruppati per gravità e provider, dagli ultimi 30 giorni di feedback degli utenti." - }, - "assistant": { - "title": "Superfici dell'assistente", - "subtitle": "Attiva o disattiva ciascuna superficie guidata dal modello senza rimuovere la configurazione del provider." - }, - "coach-feedback": { - "title": "Feedback del Coach", - "subtitle": "Tasso di utilità per versione del prompt, tono e livello di dettaglio del Coach degli ultimi 30 giorni." + "coach": { + "title": "Coach", + "subtitle": "Superfici dell'assistente, chiave del server e le tabelle di qualità del feedback di Coach e analisi, in un unico posto." }, "feedback": { "title": "Feedback", diff --git a/messages/pl.json b/messages/pl.json index ad476cd02..72bc30aa1 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -5283,17 +5283,9 @@ "title": "Integracje", "subtitle": "Skonfiguruj Umami, GlitchTip, Web Push i zgłoszenia błędów." }, - "ai-quality": { - "title": "Jakość analiz", - "subtitle": "Oceny przydatności pogrupowane według ważności i dostawcy, z ostatnich 30 dni opinii użytkowników." - }, - "assistant": { - "title": "Powierzchnie asystenta", - "subtitle": "Włącz lub wyłącz każdą powierzchnię opartą na modelu bez usuwania konfiguracji dostawcy." - }, - "coach-feedback": { - "title": "Opinie o Coachu", - "subtitle": "Wskaźnik przydatności według wersji promptu, tonu i szczegółowości Coacha z ostatnich 30 dni." + "coach": { + "title": "Coach", + "subtitle": "Powierzchnie asystenta, klucz serwera oraz tabele jakości opinii Coacha i analiz w jednym miejscu." }, "feedback": { "title": "Opinie", diff --git a/src/app/admin/[section]/renderer.tsx b/src/app/admin/[section]/renderer.tsx index d1e4db387..8bd9e34be 100644 --- a/src/app/admin/[section]/renderer.tsx +++ b/src/app/admin/[section]/renderer.tsx @@ -90,33 +90,20 @@ export function AdminSectionRenderer({ ); - case "ai-quality": + case "coach": + // v1.18.1 — the former ai-quality, assistant, and coach-feedback + // sections fold into one Coach area: surface toggles + operator + // config first, then the two feedback-quality tables. return ( - - - ); - case "assistant": - return ( - - - ); - case "coach-feedback": - return ( - + ); case "feedback": @@ -207,7 +194,9 @@ export function AdminSectionRenderer({ // v1.4.36 W4e — About section reused as-is from the settings // surface. The component owns its own heading + cards layout // so no SectionFrame wrapper. - return ; + // v1.18.1 E5 — hide the onboarding "Replay tour" card on the admin + // surface; it's a user-facing affordance with no admin-side use. + return ; default: slug satisfies never; return null; diff --git a/src/components/admin/__tests__/sections.test.tsx b/src/components/admin/__tests__/sections.test.tsx index 4127ed94c..c5b9ba1da 100644 --- a/src/components/admin/__tests__/sections.test.tsx +++ b/src/components/admin/__tests__/sections.test.tsx @@ -155,7 +155,10 @@ describe("admin sections — SSR smoke", () => { expect(html).toContain("No feedback yet"); }); - it("admin slug list contains ai-quality (renderer parity)", () => { - expect(ADMIN_SECTION_SLUGS).toContain("ai-quality"); + it("admin slug list contains coach (renderer parity)", () => { + // v1.18.1 — ai-quality / assistant / coach-feedback folded into one + // "coach" section. The standalone component still renders above; the + // slug parity assertion tracks the consolidated nav entry. + expect(ADMIN_SECTION_SLUGS).toContain("coach"); }); }); diff --git a/src/components/admin/admin-shell.tsx b/src/components/admin/admin-shell.tsx index c8ce68f90..70924d726 100644 --- a/src/components/admin/admin-shell.tsx +++ b/src/components/admin/admin-shell.tsx @@ -23,14 +23,12 @@ import { Info, KeyRound, Inbox, - MessageSquare, Plug, Radio, ScrollText, Server, Settings, ShieldAlert, - SlidersHorizontal, Sparkles, Ticket, Users, @@ -76,21 +74,14 @@ export const ADMIN_SECTIONS: readonly AdminSection[] = [ titleKey: "admin.section.integrations.title", icon: Plug, }, + // v1.18.1 — single "Coach" entry replacing the former ai-quality, + // assistant, and coach-feedback trio. The section body stacks all + // three surfaces so the coach-quality picture lives in one place. { - slug: "ai-quality", - titleKey: "admin.section.ai-quality.title", + slug: "coach", + titleKey: "admin.section.coach.title", icon: Sparkles, }, - { - slug: "assistant", - titleKey: "admin.section.assistant.title", - icon: SlidersHorizontal, - }, - { - slug: "coach-feedback", - titleKey: "admin.section.coach-feedback.title", - icon: MessageSquare, - }, { slug: "feedback", titleKey: "admin.section.feedback.title", diff --git a/src/components/admin/backups-section.tsx b/src/components/admin/backups-section.tsx index 138146e38..e927bc039 100644 --- a/src/components/admin/backups-section.tsx +++ b/src/components/admin/backups-section.tsx @@ -333,6 +333,13 @@ export function BackupsSection() { return (
+ {/* v1.18.1 E3 — the snapshot count leads (numbers first), the + "Run now" button follows, and the explainer + docs link move + into the header's description slot. Previously the description + sat in a separate `mt-1 pl-7` paragraph that crowded the button + directly above it; routing it through the header's `space-y-1` + stack restores breathing room and left-aligns it under the + title. */} } + description={ +

+ {t("admin.section.backups.description")}{" "} + {/* External docs link — `noopener noreferrer` because this + leaves the admin shell. */} + + +

+ } /> -

- {t("admin.section.backups.description")}{" "} - {/* External docs link — Phase E will publish the matching page on - the docs site. `noopener noreferrer` because this leaves the - admin shell. */} - - -

{/* Upload card — separate from the table so admins can ingest a backup file independently of any existing rows. The visible diff --git a/src/components/admin/danger-zone-section.tsx b/src/components/admin/danger-zone-section.tsx index 93cebfdd3..a9607cd90 100644 --- a/src/components/admin/danger-zone-section.tsx +++ b/src/components/admin/danger-zone-section.tsx @@ -15,6 +15,7 @@ import { AlertDialogTrigger, } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; +import { SettingsCardHeader } from "@/components/settings/_card-header"; import { useTranslations } from "@/lib/i18n/context"; import { apiDelete } from "@/lib/api/api-fetch"; @@ -59,24 +60,25 @@ export function DangerZoneSection() { }); return ( + // v1.18.1 E4 — adopt the shared card shape (rounded-xl border + the + // `SettingsCardHeader` icon/title/description/status layout) so the + // Danger Zone reads like every other admin section. The destructive + // tint + AlertTriangle icon keep it visually flagged as dangerous; + // the delete affordance now sits in the header status slot, properly + // aligned beside its label rather than floating below a lone icon.
- {/* v1.4.19 A8 / F-08: page header `admin.section.danger-zone.*` - already names the section, so the card-level title was a - duplicate of the page title. The destructive icon stays so - the card still flags itself as dangerous at a glance. */} -
); } diff --git a/src/components/admin/section-slugs.ts b/src/components/admin/section-slugs.ts index 8581cd072..9fa94f773 100644 --- a/src/components/admin/section-slugs.ts +++ b/src/components/admin/section-slugs.ts @@ -14,13 +14,13 @@ export const ADMIN_SECTION_SLUGS = [ "general", "services", "integrations", - "ai-quality", - // v1.4.31 — operator-side assistant feature-flag toggles. Sits - // between `ai-quality` (provider config) and `coach-feedback` - // (in-app feedback inbox) per - // `.planning/research/v15-assistant-optional.md` Part B. - "assistant", - "coach-feedback", + // v1.18.1 — the former `ai-quality`, `assistant`, and `coach-feedback` + // sections collapse into one "Coach" area. It holds the assistant + // surface toggles, the server-key + module-availability operator + // config, and both feedback-quality tables (Coach + Insights). Three + // navigation entries for one coherent coach-quality concern read as + // clutter; one card opens the full picture. + "coach", "feedback", "reminders", "users", diff --git a/src/components/settings/about-section.tsx b/src/components/settings/about-section.tsx index cfbaca8d0..95f921318 100644 --- a/src/components/settings/about-section.tsx +++ b/src/components/settings/about-section.tsx @@ -118,7 +118,18 @@ export function UpdateBadge({ ); } -export function AboutSection() { +export interface AboutSectionProps { + /** + * v1.18.1 E5 — suppress the "Replay tour" card. The admin → Über + * surface reuses this component but the onboarding tour is a + * user-facing affordance with no place in the admin console, so the + * admin renderer passes `hideTourReplay`. The Settings → About surface + * leaves it on. + */ + hideTourReplay?: boolean; +} + +export function AboutSection({ hideTourReplay = false }: AboutSectionProps = {}) { const { t } = useTranslations(); const fmt = useFormatters(); // Pull the auth user — only needed so the "Replay the tour" button @@ -364,49 +375,55 @@ export function AboutSection() { settings shell), so the button lives here next to version + links. Mirrors the stack-on-mobile / right-align-on-desktop contract used by the Account section's "Restart onboarding - tour" card so the two surfaces feel consistent. */} -
-
-
- -
-

- {t("settings.about.tourReplay")} -

-

- {t("settings.about.tourReplayHint")} -

+ tour" card so the two surfaces feel consistent. + + v1.18.1 E5 — hidden on the admin → Über surface (`hideTourReplay`): + the onboarding tour is a user-facing affordance with no place in + the admin console. */} + {!hideTourReplay && ( +
+
+
+ +
+

+ {t("settings.about.tourReplay")} +

+

+ {t("settings.about.tourReplayHint")} +

+
+
- + {tourFeedback && ( +

+ {tourFeedback.text} +

+ )}
- {tourFeedback && ( -

- {tourFeedback.text} -

- )} -
+ )} {/* v1.4.36 W4f — the dedicated "Updates" card with the manual "Check for updates" button is gone. The 24 h auto-