diff --git a/ui/src/pages/updates.tsx b/ui/src/pages/updates.tsx index 06d2597e..ffc85428 100644 --- a/ui/src/pages/updates.tsx +++ b/ui/src/pages/updates.tsx @@ -1,12 +1,12 @@ import { useMemo, useState } from 'react'; import { Link } from 'react-router-dom'; -import { BellRing, ChevronRight, Filter, Megaphone, Search } from 'lucide-react'; +import { CalendarClock, ChevronRight, Filter, Megaphone, Search, Sparkles } from 'lucide-react'; import { Button } from '@/components/ui/button'; +import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { ScrollArea } from '@/components/ui/scroll-area'; import { cn } from '@/lib/utils'; -import { SupportEntryCard } from '@/components/updates/support-entry-card'; import { SupportStatusBadge } from '@/components/updates/support-status-badge'; import { CLI_SUPPORT_ENTRIES, @@ -27,24 +27,6 @@ const SCOPE_FILTERS: { id: ScopeFilter; label: string }[] = [ { id: 'websearch', label: SUPPORT_SCOPE_LABELS.websearch }, ]; -const CORE_CONTRACT = [ - { - id: 'base-url', - title: 'Base URL', - detail: 'Source endpoint is explicit per target/provider/profile.', - }, - { - id: 'auth', - title: 'Auth', - detail: 'OAuth or token ownership is visible in one support matrix.', - }, - { - id: 'model', - title: 'Model', - detail: 'Default model behavior stays configurable and documented.', - }, -] as const; - function NoticeListItem({ notice, isSelected, @@ -59,29 +41,20 @@ function NoticeListItem({ type="button" onClick={onSelect} className={cn( - 'w-full rounded-lg border px-3 py-2.5 text-left transition-colors', + 'w-full rounded-lg border px-3 py-2 text-left transition-colors', isSelected ? 'border-primary/20 bg-primary/10' : 'border-transparent hover:border-border hover:bg-muted/70' )} >
-
+

{notice.title}

-

{notice.summary}

-
- - - {formatCatalogDate(notice.publishedAt)} - -
+

+ {formatCatalogDate(notice.publishedAt)} +

- +
); @@ -125,33 +98,23 @@ export function UpdatesPage() { }); }, [scope, query]); - const scopeStats = useMemo( - () => - SCOPE_FILTERS.filter((filter) => filter.id !== 'all').map((filter) => ({ - id: filter.id, - label: filter.label, - count: CLI_SUPPORT_ENTRIES.filter((entry) => entry.scope === filter.id).length, - })), - [] - ); - return ( -
-
+
+
-

Updates Center

+

Updates

- Release visibility for target, provider, and support rollouts. + Product announcements and release notes.

setQuery(event.target.value)} - placeholder="Search support matrix" + placeholder="Search updates or integrations" className="pl-8 h-9" />
@@ -176,67 +139,39 @@ export function UpdatesPage() { {SUPPORT_NOTICES.length} notice{SUPPORT_NOTICES.length !== 1 ? 's' : ''} - {CLI_SUPPORT_ENTRIES.length} support entr - {CLI_SUPPORT_ENTRIES.length !== 1 ? 'ies' : 'y'} + {filteredEntries.length} result{filteredEntries.length !== 1 ? 's' : ''}
-
+
{selectedNotice && ( -
+
-

{selectedNotice.title}

-

{selectedNotice.summary}

+

{selectedNotice.title}

+

{selectedNotice.summary}

- -
- - Published {formatCatalogDate(selectedNotice.publishedAt)} -
- -
    - {selectedNotice.highlights.map((highlight) => ( -
  • - {highlight}
  • - ))} -
- -
- {selectedNotice.routes.map((route) => ( - - {route.label} - - ))} -
- -
- {selectedNotice.commands.map((command) => ( - - {command} - - ))} +
+ + Published {formatCatalogDate(selectedNotice.publishedAt)}
)} -
-
- +
+
+ - Support Matrix +
+ + Release Details +
- Filter by support area. Internal scroll keeps the page frame stable. + Changelog-first view with impacted integrations and quick commands.
@@ -245,7 +180,7 @@ export function UpdatesPage() {
- Scope: + Filter: {SCOPE_FILTERS.map((filter) => (
-
- - {filteredEntries.length === 0 ? ( -
- No support entries match this filter. -
- ) : ( -
- {filteredEntries.map((entry) => ( - + +
+
+

+ What Changed +

+
    + {selectedNotice?.highlights.map((highlight) => ( +
  • - {highlight}
  • + ))} +
+
+ +
+

+ Dashboard Entry Points +

+
+ {selectedNotice?.routes.map((route) => ( + + {route.label} + ))}
- )} - -
+ + +
+

+ Quick Commands +

+
+ {selectedNotice?.commands.map((command) => ( + + {command} + + ))} +
+
+ +
+

+ Impacted Integrations +

+ {filteredEntries.length === 0 ? ( +
+ No integration entries match your current filter. +
+ ) : ( +
+ {filteredEntries.map((entry) => ( +
+
+
+

{entry.name}

+

{entry.summary}

+
+ +
+
+ + {SUPPORT_SCOPE_LABELS[entry.scope]} + + {entry.routes.map((route) => ( + + {route.label} + + ))} +
+ + {entry.commands[0]} + +
+ ))} +
+ )} +
+
+
- + - Config Contract - - Every new CLI integration follows the same three configuration pillars. - + Announcement Timeline + Recent notices in chronological order. - -
-
- {CORE_CONTRACT.map((item) => ( -
-

- {item.title} -

-

{item.detail}

+
+ {SUPPORT_NOTICES.map((notice) => ( +
+

{notice.summary}

+

+ {formatCatalogDate(notice.publishedAt)} +

+ + ))} -
-

- Coverage by Scope -

-
- {scopeStats.map((stat) => ( -
- {stat.label} - - {stat.count} - -
- ))} -
-
- -
+
Update source of truth:{' '} ui/src/lib/support-updates-catalog.ts