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} match
+ {filteredEntries.length} integration{filteredEntries.length !== 1 ? 's' : ''}
-
-
- {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) => (
+
setSelectedNoticeId(notice.id)}
+ className={cn(
+ 'w-full rounded-md border p-3 text-left transition-colors',
+ selectedNotice?.id === notice.id
+ ? 'border-primary/20 bg-primary/10'
+ : 'hover:bg-muted/70'
+ )}
+ >
+
- ))}
-
+
{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