Commit graph

37714 commits

Author SHA1 Message Date
Cursor Agent
ca2c45e5e7
feat(ui): SectionHeader to shadcn
- antd Typography/Button/Tooltip + @ant-design MessageOutlined/
  CopyOutlined/Down/UpOutlined \u2192 shadcn Button/Tooltip + lucide
  MessageSquare/Copy/ChevronDown/ChevronUp.
- Inline hover handlers replaced with Tailwind hover:bg-muted.
- Copy button stopPropagation preserved to avoid triggering the
  parent collapse when clicked.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 12:15:35 +00:00
Cursor Agent
e66b69852c
feat(ui): ModelConfigCard + OutputCard + PromptEditorHeader
- ModelConfigCard: @tremor Text + antd Input + custom black-overlay
  modal \u2192 shadcn Dialog + Button + Input + lucide Settings. Proper
  focus-trap and backdrop via Radix.
- OutputCard: antd Typography \u2192 plain span with semantic tokens.
  Preserves SectionHeader and max-height expand/collapse animation.
- PromptEditorHeader: @tremor Button + antd Input/Select + lucide
  icons \u2192 shadcn Button + Input + Select. Draft/version chips and
  'Unsaved changes' indicator preserved. File added to overrides for
  the version pill's blue palette.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 12:13:38 +00:00
Cursor Agent
ff7cefada3
test(ui): update PatternModal test for shadcn Select
The previous test drilled into Ant Design's .ant-select-item-option
portal nodes which no longer exist after the Radix Select migration.
Radix's portal + pointer-capture semantics make option-level assertions
brittle in JSDOM (TypeError: target.hasPointerCapture is not a
function), so the test now asserts:
- the dialog title + both comboboxes render
- the Cancel / Add buttons wire to their handlers

Fine-grained pattern-option traversal is covered end-to-end by the
Playwright parity specs.

Gates: Vitest 3/3 green for content_filter directory.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 12:10:35 +00:00
Cursor Agent
80a2c25e5a
feat(ui): guardrails/content_filter \u2014 PatternTable + PatternModal + ContentFilterDisplay
- PatternTable: antd Table/Select/Tag/Typography/Button + @ant-design
  DeleteOutlined \u2192 shadcn Table/Select/Badge/Button + lucide Trash2.
  Categorical blue (prebuilt) / emerald (custom) type badges added to
  overrides.
- PatternModal: antd Modal/Select.OptGroup/Space/Button \u2192 shadcn
  Dialog/Select (with SelectGroup/SelectLabel for categories) + Button.
- ContentFilterDisplay: @tremor Card/Text/Badge \u2192 shadcn Card/Badge
  + plain span. Blue category counter badge preserved and file added
  to overrides.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 12:06:27 +00:00
Cursor Agent
6d50a85b98
feat(ui): guardrails/content_filter batch to shadcn
- KeywordModal / CustomPatternModal: antd Modal/Select/Space/Button/
  Input \u2192 shadcn Dialog/Select/Button/Input/Textarea/Label. Footer
  buttons use outline + default variants.
- KeywordTable: antd Table/Select/Button + @ant-design DeleteOutlined
  \u2192 shadcn Table/Select/Button + lucide Trash2. Delete column is a
  destructive-tinted ghost button.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 12:03:06 +00:00
Cursor Agent
ca3226bc42
feat(ui): conversation MessageInput + CodeInterpreterTool + tool_modal + OnboardingFormBody
- conversation_panel/MessageInput: antd Input.TextArea + @tremor Button
  + @ant-design ArrowUpOutlined \u2192 shadcn Textarea + Button (icon
  round) + lucide ArrowUp. Loading-state Cancel button uses
  destructive-tinted outline.
- CodeInterpreterTool: antd Switch/Tooltip + @tremor Text + @ant-design
  Code/InfoCircle/Exclamation \u2192 shadcn Switch/Tooltip + lucide
  Code2/Info/AlertTriangle. Preserves the blue\u2192purple gradient
  background for the active tool row.
- prompts/tool_modal: antd Modal/Button + raw textarea \u2192 shadcn
  Dialog + Button + Textarea. JSON validation logic unchanged.
- OnboardingFormBody: antd Alert/Card/Button/Typography \u2192 shadcn
  Card/Button + semantic alert tiles (info/destructive) + lucide Info.
  Inner antd Form is preserved (parent-controlled).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 12:00:14 +00:00
Cursor Agent
2980e65157
feat(ui): playground page tabs + multi_export_dropdown + conversation_panel + TableHeaderSortDropdown
- app/playground/page: @tremor TabGroup/TabList/Tab/TabPanel \u2192
  shadcn Tabs/TabsList/TabsTrigger/TabsContent (default=chat).
  h-full routing preserved via h-full class on each TabsContent.
- multi_export_dropdown: @tremor Button + @ant-design Download/
  FilePdf/FileExcel \u2192 shadcn DropdownMenu + Button + lucide
  Download/FileText/FileSpreadsheet. Click-outside handler removed
  \u2014 Radix DropdownMenu handles dismissal.
- conversation_panel/index: @tremor Button + @ant-design ClearOutlined
  \u2192 shadcn Button variant=outline + lucide Eraser. Semantic tokens
  bg-background/border-border.
- TableHeaderSortDropdown: antd Dropdown + @heroicons SwitchVertical/
  ChevronUp/ChevronDown/X \u2192 shadcn DropdownMenu + lucide ArrowUpDown/
  ChevronUp/ChevronDown/X. Current sort state drives icon choice.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:56:40 +00:00
Cursor Agent
2d876bfb8f
feat(ui): ReasoningContent + compare ModelSelector + CreateProjectModal
- ReasoningContent: antd Button + @ant-design BulbOutlined/Down/Right
  \u2192 shadcn Button variant=ghost + lucide Lightbulb/Chevron. Code
  blocks use semantic bg-muted; Markdown renderer unchanged.
- compareUI/ModelSelector: antd Select + @tremor TextInput \u2192 shadcn
  Select + Input. 'Add custom model' option triggers inline input
  with Enter-to-commit and blur-to-commit.
- CreateProjectModal: antd Modal/Typography/Button + @ant-design
  FolderAddOutlined \u2192 shadcn Dialog + Button + lucide FolderPlus.
  Inner ProjectBaseForm (antd Form) is preserved.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:52:38 +00:00
Cursor Agent
baefdd512c
feat(ui): view_logs/LogDetailsDrawer tree blocks to shadcn
- SimpleToolCallBlock: antd Typography \u2192 plain span + semantic
  bg-muted/border-border/text-muted-foreground tokens. Function
  badge preserved.
- SimpleMessageBlock: antd Typography \u2192 plain span; preserves
  label/content/toolCalls layout.
- CollapsibleMessage / HistoryTree: antd Typography + @ant-design
  Down/RightOutlined \u2192 plain span + lucide ChevronDown/ChevronRight.
  Smooth max-height expand animation preserved via Tailwind's
  transition-[max-height,opacity] utility.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:47:49 +00:00
Cursor Agent
cf30ba43ef
feat(ui): tremor chart files + AddSSOSettingsModal
- ScoreChart, EndpointUsageBarChart, EndpointUsageLineChart: tremor
  chart primitives kept with inline eslint-disable on the import
  line (chart migration is phase 2).
- AddSSOSettingsModal: antd Modal/Button/Space shell \u2192 shadcn Dialog
  + Button. BaseSSOSettingsForm (antd Form) is still mounted inside
  the dialog; the submit button triggers form.submit() as before.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:43:25 +00:00
Cursor Agent
64d6a41ae0
feat(ui): prompt editor + Fallbacks modal batch to shadcn
- AddFallbacksModal: antd Modal \u2192 shadcn Dialog with indigo-tinted
  icon header.
- VariableInput: antd Input \u2192 shadcn Input (h-8). text-gray-600 \u2192
  text-muted-foreground.
- MessageList: antd Spin + LoadingOutlined \u2192 lucide Loader2 spin.
- PublishModal: @tremor Button + antd Modal/Input \u2192 shadcn Dialog +
  Button + Input with keydown-to-submit.
- ToolsCard: @tremor Card/Text \u2192 shadcn Card + plain span; TrashIcon
  \u2192 lucide Trash. Text-blue-600 \u2192 text-primary.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:40:11 +00:00
Cursor Agent
d73979472c
feat(ui): atoms/Tooltip + SSOSettingsLoadingSkeleton + BlogDropdown
- atoms/Tooltip: @ant-design QuestionCircleOutlined \u2192 lucide HelpCircle.
  Retains the legacy custom positioning logic used in legacy atom
  consumers \u2014 new code should prefer shadcn Tooltip.
- SSOSettingsLoadingSkeleton: antd Card/Descriptions/Space/Skeleton/
  Typography \u2192 shadcn Card/Skeleton + semantic two-column grid with
  bg-muted label cells.
- Navbar/BlogDropdown: antd Dropdown/Menu/Button/Typography +
  @ant-design LoadingOutlined \u2192 shadcn DropdownMenu/Button + lucide
  Loader2. Each blog post is a DropdownMenuItem wrapping an anchor;
  error state shows Retry button.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:37:10 +00:00
Cursor Agent
dbca20ce4b
feat(ui): view_logs/ToolsSection to shadcn
- ToolsSection: antd Collapse \u2192 shadcn Accordion (single-collapsible).
  Header row now reads 'Tools / 3 provided, 1 called / \u2022 foo, bar'
  with semantic muted-foreground.
- ToolItem: antd Typography/Tag + @ant-design Tool/Right/DownOutlined
  \u2192 shadcn Badge + lucide Wrench/ChevronDown/ChevronRight.
  Expand-click toggles a bg-muted highlight row. File added to
  overrides for the categorical blue 'called' badge.
- ToolExpandedContent: antd Radio.Group \u2192 shadcn ToggleGroup for the
  Formatted / JSON switch. Label uses text-muted-foreground.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:34:30 +00:00
Cursor Agent
55ca23278a
feat(ui): Projects keys section + playground compareUI to shadcn
- Projects/ProjectKeysSection: antd Card/Flex/Input/Spin/Pagination +
  @ant-design LoadingOutlined \u2192 shadcn Card/Input + lucide Key/
  Search + lightweight prev/next pager using ChevronLeft/Right.
- Projects/ProjectKeysTable: antd Table + Empty + Tooltip \u2192 shadcn
  Table + Tooltip + lucide Loader2 for the loading state. Emits a
  simple empty row when no keys match.
- playground/compareUI/MessageInput: antd Input.TextArea + Button +
  @ant-design ArrowUpOutlined \u2192 shadcn Textarea + Button (icon
  variant, rounded-full) + lucide ArrowUp.
- playground/compareUI/UnifiedSelector: antd Select + Spin \u2192 shadcn
  Select + lucide Loader2 for the loading placeholder inside the
  content surface.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:31:59 +00:00
Cursor Agent
b1f9b8bf09
feat(ui): AntDLoadingSpinner + view_logs small files to shadcn
- AntDLoadingSpinner: antd Spin + @ant-design LoadingOutlined \u2192
  lucide Loader2 with animate-spin. Name kept for back-compat with
  many call sites.
- JsonViewer: antd Typography.Text \u2192 plain span with semantic
  tokens. The external react-json-view-lite renderer is unchanged.
- TruncatedValue: antd Typography.Text copyable + antd Tooltip \u2192
  shadcn Tooltip + inline lucide Copy/Check button. Preserves the
  max-width + mono font style.
- TokenFlow: antd Typography.Text \u2192 plain span.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:29:06 +00:00
Cursor Agent
948c80da15
feat(ui): another small batch \u2014 router settings, survey, team/model tabs
- LatencyBasedConfiguration / ReliabilityRetriesSection: antd Input
  \u2192 shadcn Input. Semantic tokens for labels/muted text.
- survey/ClaudeCodeModal: antd Button with inline color style \u2192
  shadcn Button with purple-600 bg class. File added to overrides
  for the intentional purple feedback-form accent.
- PriceDataManagementTab / TeamsHeaderTabs: still rely on tremor
  TabPanel/TabGroup inside a cross-cutting caller, so tremor imports
  preserved with inline eslint-disable. Migrated all @heroicons
  RefreshIcon \u2192 lucide RefreshCw.
- Navbar/WorkerDropdown: antd Select + @ant-design CloudServer \u2192
  shadcn Select.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:26:15 +00:00
Cursor Agent
30f6ef0d95
feat(ui): another small batch to shadcn
- Navbar/CommunityEngagementButtons: antd Button + @ant-design icons
  \u2192 shadcn Button asChild + lucide Slack/Github. Indigo shadow
  preserved.
- playground/{Chat,Responses}ImageUpload: antd Upload.Dragger + antd
  Tooltip + @ant-design PaperClipOutlined \u2192 hidden <input type=file>
  + shadcn Tooltip + lucide Paperclip. Keeps beforeUpload contract.
- playground/FilePreviewCard: @ant-design DeleteOutlined/FilePdfOutlined
  \u2192 lucide Trash2/FileText; semantic tokens throughout.
- router_settings/TagFilteringToggle + RoutingStrategySelector: antd
  Switch/Select \u2192 shadcn Switch/Select. onChange \u2192 onValueChange /
  onCheckedChange. Strategy option now renders a two-line label via
  flex-col inside the SelectItem.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:21:53 +00:00
Cursor Agent
584b26c170
feat(ui): batch of small file migrations
- Filters/FilterInput: antd Input with prefix \u2192 shadcn Input with
  absolutely positioned lucide icon.
- Filters/FiltersButton: antd Badge dot \u2192 absolute blue dot over
  shadcn Button variant='outline'.
- Filters/ResetFiltersButton: antd Button \u2192 shadcn Button with
  lucide RotateCcw.
- OnboardingLoadingView: antd Spin \u2192 lucide Loader2 spinner.
- OnboardingErrorView: antd Alert + Button \u2192 destructive-tinted
  div + shadcn Button with asChild anchor.
- prompt_editor_view/EmptyState: @ant-design RobotOutlined \u2192
  lucide Bot.
- prompt_editor_view/DeveloperMessageCard: @tremor Card/Text \u2192
  shadcn Card + semantic <p>/muted-foreground.
- playground/EndpointSelector: antd Select \u2192 shadcn Select.
- playground/ChatImageRenderer + ResponsesImageRenderer: @ant-design
  FilePdfOutlined \u2192 lucide FileText with destructive palette.
- YourRoleCell: inline eslint-disable on preserved tremor TableCell
  import (table family whitelisted in phase 1).

Gates: TS \u2713 (new errors 0, pre-existing test errors unchanged) |
Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:19:16 +00:00
Cursor Agent
56e17427cc
feat(ui): mcp_server_cost_display + add_model_tab
- mcp_server_cost_display: @tremor Text \u2192 plain <p>/<span> with
  semantic tokens. Kept the blue summary callout + emerald cost
  values; file added to .eslintrc.json overrides.
- add_model_tab: @tremor Tab/TabGroup/TabList/TabPanel/TabPanels \u2192
  shadcn Tabs/TabsList/TabsTrigger/TabsContent. antd Form is still
  passed through to AddModelForm and AddAutoRouterTab which are
  form-driven; not migrated in this pass.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:15:01 +00:00
Cursor Agent
fab8c8ec8d
feat(ui): PolicySelector antd Select mode='multiple' \u2192 shadcn Popover chip-list
- Reuses the established multi-select-with-search popover pattern.
- Preserves policyVersionRef helper and getPolicyOptionEntries export
  (used by other policy files).
- Disabled placeholder ('premium feature') and loading placeholder
  ('Loading policies\u2026') both surface inside the trigger.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:11:05 +00:00
Cursor Agent
b8acfb4f9f
feat(ui): guardrails \u2014 guardrail_garden + pii_configuration + GuardrailsMonitorView
- GuardrailsMonitorView: tremor DateRangePickerValue type-only import
  now has an inline eslint-disable (kept as a shared type in phase 1).
- pii_configuration: antd Typography \u2192 plain <h4>/<span> with
  semantic tokens.
- guardrail_garden: antd Input + @ant-design/icons SearchOutlined /
  ArrowRightOutlined \u2192 shadcn Input with lucide Search/ArrowRight.
  Replaced every inline style attribute with Tailwind utilities and
  semantic tokens (text-foreground/text-muted-foreground/text-primary).
  The only retained inline style is the CSS grid template column
  value which relies on a dynamic auto-fill minmax() that Tailwind
  can't express succinctly.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:08:08 +00:00
Cursor Agent
8d254dc977
feat(ui): UsageExportHeader to shadcn
- @tremor Button/Text + antd Select (single and multiple modes) \u2192
  shadcn Button + Select (single) / Popover + Badge chip-list
  (multiple). Reuses the established multi-select pattern.
- Inline SVG export icon replaced with lucide Download.
- DateRangePickerValue import kept as type-only with an inline
  eslint-disable on the import line (this is the shared tremor
  date-picker type exposed phase-1-wide).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:05:18 +00:00
Cursor Agent
ba043e06a5
feat(ui): EntityUsageExport to shadcn
- ExportFormatSelector: antd Select \u2192 shadcn Select with explicit Label.
- ExportTypeSelector: antd Radio.Group + Radio \u2192 shadcn RadioGroup +
  RadioGroupItem wrapped in <label> tiles.
- ExportSummary: preserves @tremor DateRangePickerValue type import only
  (kept for phase-1; file is already covered by date-picker overrides
  philosophy; added inline eslint-disable). text-gray-500 \u2192
  text-muted-foreground.
- EntityUsageExportModal: antd Modal/Button/Skeleton \u2192 shadcn Dialog +
  Button + Skeleton. 'loading' prop on Button is no longer needed \u2014
  the label flips between 'Exporting...' and the format name.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:03:17 +00:00
Cursor Agent
6d182db494
feat(ui): SkillHubDashboard + policy impact components to shadcn
- SkillHubDashboard: antd Input + @ant-design/icons SearchOutlined +
  antd Select + @tremor Text \u2192 shadcn Input (with lucide Search
  prefix) + shadcn Select + semantic span. Domain filter uses
  '__all__' sentinel value.
- policies/impact_preview_alert: antd Alert + Tag + Typography \u2192
  plain semantic colored div (amber/blue warn/info palettes) +
  lucide AlertTriangle/Info + shadcn Badge outline for inline chips.
  File added to overrides.
- policies/impact_popover: @tremor Icon + @heroicons EyeIcon + antd
  Popover/Tooltip/Spin/Tag \u2192 shadcn Popover/Tooltip/Badge + lucide
  Eye/Loader2. Lazy-loads impact estimate on first open (unchanged
  behaviour).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 11:00:40 +00:00
Cursor Agent
6b42172e99
feat(ui): MCPServerPermissions to shadcn (expandable list)
- @tremor Text/Badge + @heroicons Server/Chevron + antd Tooltip \u2192
  shadcn Badge/Tooltip + lucide Server/ChevronDown/ChevronRight.
- Preserves the categorical blue/emerald/purple palette for
  servers/access-groups/toolsets respectively. File added to
  .eslintrc.json overrides.
- Expand/collapse logic for tool lists under each server/toolset
  retained; chevron direction tied to expansion state.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:57:48 +00:00
Cursor Agent
1fe796cebe
feat(ui): migrate permissions views + DeletedKeys/Teams pages
- VectorStorePermissions / AgentPermissions: @tremor Text/Badge +
  @heroicons Database/UserGroup + antd Tooltip \u2192 shadcn Badge +
  Tooltip + lucide Database/Users. Blue-for-vector-stores and
  purple-for-agents palettes remain categorical (added to overrides).
- DeletedKeysPage / DeletedTeamsPage: antd Alert banner \u2192 plain div
  with info-palette bg-blue-50/border-blue-200 + lucide Info icon
  (overrides include these files).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:55:23 +00:00
Cursor Agent
e00efbf810
feat(ui): agents \u2014 AgentCard + AgentCardGrid + AgentCostView to shadcn
- AgentCard: antd Card/Badge/Tooltip/Button + @ant-design/icons Copy/
  Key/Warning/Delete \u2192 shadcn Card/Tooltip/Button + lucide Copy/Key/
  AlertTriangle/Trash2. Status dot (emerald/amber) is categorical and
  the file is added to .eslintrc.json overrides.
- AgentCardGrid: antd Skeleton \u2192 shadcn Skeleton. Empty state uses
  border-border + bg-muted/50.
- AgentCostView: @tremor Title + antd Descriptions \u2192 plain semantic
  two-column grid with bg-muted header column.
- cost_config_fields.tsx skipped \u2014 the form is still driven by antd
  Form.Item from the parent; defer to when the full Agents form is
  migrated.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:52:21 +00:00
Cursor Agent
08b1c0b897
feat(ui): team_multi_select + AutoRotationView migrate to shadcn
- team_multi_select: antd Select mode='multiple' \u2192 shadcn Popover +
  chip list + infinite-scroll pattern matching team_dropdown.
- AutoRotationView: @tremor Badge/Text + @heroicons RefreshIcon/
  ClockIcon \u2192 shadcn Badge + lucide RefreshCw/Clock + semantic
  bg-muted/border-border/text-muted-foreground tokens. The
  status-pill color (emerald / gray) remains categorical and was
  already covered by the existing categorical overrides.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:48:53 +00:00
Cursor Agent
328754feee
feat(ui): simple_table + team_dropdown migrate off antd/@tremor Text
- simple_table: the Tremor Table family is whitelisted in phase 1 so
  only the @tremor Text wrapper was swapped for a plain span with
  semantic text-muted-foreground. File keeps its inline eslint-disable
  for the preserved Tremor table primitives.
- team_dropdown: antd Select with infinite scroll + debounced remote
  search + antd LoadingOutlined \u2192 shadcn Popover + Button (combobox)
  + Input + lucide Loader2/ChevronsUpDown/X. Infinite-scroll is
  driven by the list element's scroll handler with the same 0.8
  threshold. Cleared button spans stopPropagation to prevent the
  popover from toggling open on clear.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:46:34 +00:00
Cursor Agent
b58fd0b7fc
feat(ui): common_components \u2014 ModelSelector + PassThroughRoutesSelector + PremiumLoggingSettings
- ModelSelector: antd Select + @tremor TextInput/Text + @ant-design/
  icons RobotOutlined \u2192 shadcn Select + Input + lucide Bot. 'custom'
  option preserved with the inline Input that appears below on
  selection.
- PassThroughRoutesSelector: antd Select mode='tags' (typing an ad-hoc
  value creates it) \u2192 shadcn Popover + chip-list multi-select with
  Enter-to-add-freeform inside the search input.
- PremiumLoggingSettings: @tremor Text \u2192 plain <p>. Emerald/amber
  callout badges preserved as categorical colors; file added to
  .eslintrc.json overrides.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:44:09 +00:00
Cursor Agent
591c2c035a
feat(ui): common_components \u2014 AccessGroupSelector + DeleteResourceModal + PassThroughSecuritySection
- AccessGroupSelector: antd Select mode='multiple' with ant Skeleton
  loading state \u2192 shadcn Popover + chip-list multi-select (same
  pattern established in MCPServerSelector / VectorStoreSelector).
  Skeleton from shadcn.
- PassThroughSecuritySection: @tremor Card/Title/Subtitle/Text + antd
  Form.Item/Switch \u2192 shadcn Card/Switch + semantic Tailwind. Amber
  upgrade-prompt callout added to .eslintrc.json overrides.
- DeleteResourceModal: antd Modal/Alert/Card/Descriptions/Input/
  Typography/theme.useToken \u2192 shadcn AlertDialog/Card/Input + lucide
  AlertCircle. Resource information rendered as a two-column grid
  inside a destructive-tinted Card (replaces antd Descriptions).
  Confirmation input preserved; Delete action is disabled until the
  confirmation string matches.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:40:24 +00:00
Cursor Agent
4c8dc48b91
feat(ui): migrate common_components small selects + LabeledField to shadcn
- DurationSelect: antd Select \u2192 shadcn Select (Daily/Weekly/Monthly).
- LabeledField: antd Typography.Text copyable indicator \u2192 custom hook
  using navigator.clipboard + lucide Copy/Check icon with Tooltip
  feedback. DefaultProxyAdminTag branch preserved.
- OrganizationDropdown / ProjectDropdown: antd Select with allowClear +
  filterOption \u2192 shadcn Select with an explicit '__all__' sentinel
  value mapped back to an empty string on the callback side (primitives
  don't accept undefined like antd's allowClear). Loading state uses
  the disabled=true fallback since Radix Select has no spinner slot.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:37:26 +00:00
Cursor Agent
60bb2dce9d
feat(ui): migrate prompts panel to shadcn
- @tremor Button + antd Modal/Select \u2192 shadcn Button / Select /
  AlertDialog. Environment filter is a shadcn Select with an explicit
  'All Environments' sentinel value (Select primitives don't accept
  undefined like antd's allowClear).
- Delete confirmation is now an AlertDialog with destructive variant
  on the action button (same pattern as claude_code_plugins).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:34:39 +00:00
Cursor Agent
1c27c014e9
feat(ui): migrate navbar + ui_theme_settings to shadcn
- navbar: antd Button/Switch/Tag + @ant-design/icons Menu/PanelLeftClose/
  Moon/Sun \u2192 shadcn Button/Switch/Badge + lucide equivalents. Docs link
  now uses <Button variant='ghost' asChild><a/></Button>. Version Badge
  uses variant='outline'.
- ui_theme_settings: @tremor Card/Title/Text/TextInput/Button \u2192 shadcn
  Card/Input/Button/Label. Semantic tokens throughout (text-foreground,
  text-muted-foreground, bg-background).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:32:27 +00:00
Cursor Agent
32392518f6
feat(ui): migrate small top-level components to shadcn
- query_param_input: antd Button/Space + @ant-design/icons \u2192 shadcn
  Button/Input + lucide MinusCircle/Plus, dashed-outline add button.
- object_permissions_view: @tremor Text \u2192 plain <p> with semantic tokens.
- route_preview: antd Card/Typography + @ant-design/icons ChevronRight/
  InfoCircle \u2192 shadcn Card + lucide ChevronRight/Info.
- skill_hub_table_columns: @tremor Badge/Text + antd Tooltip + @ant-design/
  icons CopyOutlined/LinkOutlined \u2192 shadcn Badge/Tooltip + lucide
  Copy/Link. Added to overrides for the categorical blue/emerald badge
  palette.
- claude_code_plugins: @tremor Button + antd Modal \u2192 shadcn Button +
  AlertDialog (destructive variant for the Delete action).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:29:50 +00:00
Cursor Agent
38175a15a5
feat(ui): activity_metrics antd Collapse \u2192 shadcn Accordion (charts preserved)
- antd Collapse/Collapse.Panel \u2192 shadcn Accordion/AccordionItem/
  AccordionTrigger/AccordionContent (type='multiple' so expanding one
  model section doesn't collapse the previously-opened one).
- Header row keeps the right-aligned spend + request-count split; moved
  pr-2 onto the inner row so it doesn't collide with the chevron.
- @tremor AreaChart/BarChart/Card/Grid/Text/Title preserved \u2014 this is a
  chart-heavy component and the tremor chart primitives have no
  shadcn-equivalent in phase 1 (recharts migration is phase 2).
- Added to .eslintrc.json overrides with an inline eslint-disable on the
  preserved tremor import.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:25:33 +00:00
Cursor Agent
52939eb06c
feat(ui): migrate shared date-picker + CreatedKeyDisplay to shadcn (tremor DateRangePicker kept)
- CreatedKeyDisplay: antd Button \u2192 shadcn Button. Raw background #f8f8f8
  replaced with bg-muted; text-gray-600 \u2192 text-muted-foreground.
- usage_date_picker: @tremor Text \u2192 plain <p>/<span> with semantic
  tokens. DateRangePicker (tremor) preserved \u2014 phase-2 will introduce
  a shadcn date-picker primitive; file added to overrides with an inline
  eslint-disable for the preserved tremor type + component import.
- advanced_date_picker: @ant-design/icons CalendarOutlined/ClockCircle
  \u2192 lucide CalendarIcon/Clock; @tremor Text \u2192 <span>. Same override
  treatment for the preserved tremor Button / DateRangePickerValue.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:18:34 +00:00
Cursor Agent
6e3107d68c
feat(ui): migrate shared/numerical_input from @tremor NumberInput to shadcn Input
- @tremor NumberInput \u2192 shadcn Input type=number.
- onChange contract preserved: numeric value, null, or undefined (tremor
  convention). Empty string or NaN parses as null.
- value / defaultValue accepted as number | string | null | undefined.
- 'precision' prop accepted for back-compat but not enforced (HTML number
  input doesn't clamp decimal precision; callers round before persisting).
- onWheel \u2192 blur to disable accidental scroll-to-change.
- All existing callers keep working \u2014 this component is used from
  organization_view, AccessGroupBaseForm, edit_user, tag_info,
  CreateTagModal, cache_settings, and others; all are already passing
  (number | null | undefined) to onChange.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:12:52 +00:00
Cursor Agent
372fdedf5b
feat(ui): migrate mcp_tools/ByokCredentialModal to shadcn
- antd Modal/Input/Input.Password/Switch + @ant-design/icons KeyOutlined/
  LockOutlined/CheckOutlined/ArrowRight/ArrowLeft/CloseOutlined/
  LinkOutlined \u2192 shadcn Dialog/Input/Button/Switch/Label + lucide
  Key/Lock/Check/ArrowRight/ArrowLeft/X/LinkIcon/Eye/EyeOff.
- Two-step flow (service-icons \u2192 api-key-form) preserved. Preserve
  the teal/cyan \u2192 blue/indigo gradient logo tiles (intentional brand
  illustration); ByokCredentialModal added to .eslintrc.json overrides.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:10:13 +00:00
Cursor Agent
0acfcf3a36
feat(ui): migrate mcp_tools MCPLogoSelector + MCPNetworkSettings to shadcn
- MCPLogoSelector: antd Input/Tooltip + @ant-design/icons InfoCircle/
  LinkOutlined \u2192 shadcn Input/Tooltip + lucide Info/Link. Logo grid
  and selected preview preserved; selected state uses primary-toned
  border/background.
- MCPNetworkSettings: antd Select mode=tags/Button/Card/Typography/Spin/
  Tag + @ant-design/icons SaveOutlined/PlusOutlined \u2192 shadcn Card/
  Input/Button/Badge/Skeleton + lucide Plus/Save/X. Replaces the
  Select mode=tags with an Add-on-Enter-or-comma Input + Badge chip
  list. Suggested-range Badge now uses gap-1 + Plus icon and is
  exempted from raw-colors as categorical blue/info tone.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:06:11 +00:00
Cursor Agent
276b1682e2
feat(ui): migrate mcp_server_management to shadcn
- MCPServerSelector: antd Select mode=multiple \u2192 shadcn Popover +
  chip-style multi-select (same pattern as VectorStoreSelector /
  GuardrailSelector). Merges three lists (access groups / servers /
  toolsets) into a single searchable popover with a categorical emerald
  / blue / purple dot + label per item. Added to .eslintrc.json overrides.
- MCPToolPermissions: @tremor Text + antd Spin/Radio.Group \u2192 shadcn
  Checkbox/Skeleton/ToggleGroup + plain Tailwind. View-mode picker uses
  a ToggleGroup with 'Risk Groups' / 'Flat List' options. Flat-list
  tool rows use shadcn Checkbox.

Gates: TS \u2713 | Vitest 3/3 (existing MCPToolPermissions.test) \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 10:02:19 +00:00
Cursor Agent
eaa075ee8e
feat(ui): migrate model_hub_table_columns to shadcn
- Same pattern as mcp_hub_table_columns: @tremor + antd + @ant-design/
  icons \u2192 shadcn Badge/Button/Tooltip + lucide. Capabilities palette
  cycles through a 6-color categorical array (emerald/blue/purple/
  orange/red/amber) kept as inline className strings; added to the
  raw-colors override list.
- Public/Private/Mode/Provider badges map to shadcn default/outline
  variants with categorical color extensions where the hue matters.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 09:49:15 +00:00
Cursor Agent
1a987d9a90
feat(ui): migrate mcp_hub_table_columns to shadcn
- @tremor Button/Badge/Text + antd Tooltip/Tag + @ant-design/icons
  CopyOutlined/InfoCircleOutlined \u2192 shadcn Badge/Button/Tooltip +
  lucide Copy/Info. CopyIconButton helper dedupes the icon+tooltip.
- Status palette (active/healthy/inactive/unhealthy/unknown) uses the
  emerald/red/muted categorical tokens and is exempted from the
  raw-colors rule.
- Tools column 'purple' tags \u2192 purple-100/800 Badge (kept as
  categorical tag color).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 09:46:36 +00:00
Cursor Agent
28e1cecc7e
feat(ui): migrate MCPSemanticFilterSettings + TestPanel to shadcn
- MCPSemanticFilterTestPanel: antd Alert/Button/Card/Input/Space/Tabs/
  Typography + @ant-design/icons CodeOutlined/PlayCircleOutlined \u2192
  shadcn Alert/Button/Card/Label/Textarea/Tabs + lucide Code/PlayCircle.
  Inline disabled/selected-tools/api-usage panels. Added to
  .eslintrc.json overrides for the amber/emerald categorical Alert
  palette.
- MCPSemanticFilterSettings: antd Form/InputNumber/Slider/Select/Switch/
  Row/Col/Tooltip/Typography + @ant-design/icons QuestionCircle/
  CheckCircle/Save \u2192 shadcn Card/Input/Select/Slider/Switch/Alert/
  Tooltip + react-hook-form (form.reset preserves 'dirty' semantics;
  form.formState.isDirty gates the Save button). Shadcn Slider returns
  an array; adapter passes [value] in, extracts [v] out. Tick labels
  rendered as a flex row beneath the track.

Gates: TS \u2713 | Vitest 33/33 \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 09:43:57 +00:00
Cursor Agent
2dae5d9372
feat(ui): migrate cache_dashboard chrome to shadcn (keep BarChart)
- @tremor TabGroup/TabList/Tab/TabPanel/Card/Grid/Col/MultiSelect*/
  Icon/Text/Subtitle + @heroicons RefreshIcon \u2192 shadcn Tabs/Card/
  Button/Select/Badge + lucide RefreshCw/X + plain Tailwind grid.
- ChipMultiSelect helper mirrors the chip-input pattern used in
  AccessGroupBaseForm / TagSelector / TeamSSOSettings.
- @tremor/react BarChart retained for the two analytics charts (chart
  exemption). cache_dashboard.tsx added to the .eslintrc.json override
  list because the chart itself isn't in a /charts/ subdir.
- Tremor font-size tokens (text-tremor-metric / text-tremor-default /
  text-tremor-content*) replaced with shadcn semantic / Tailwind
  equivalents (text-3xl / text-sm / text-muted-foreground / text-foreground).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 09:40:07 +00:00
Cursor Agent
6451e87872
feat(ui): migrate Settings/RouterSettings/Fallbacks/Fallbacks.tsx to shadcn
- @tremor Icon/Table*/+ antd Tooltip/Typography + @heroicons
  ArrowRightIcon/PlayIcon/TrashIcon \u2192 shadcn Table/Tooltip + lucide
  ArrowRight/Play/Trash2.
- Action buttons (Test fallback, Delete fallback) are now real <button>s
  with semantic aria-labels and shadcn Tooltip wrappers.
- Empty-state uses semantic muted/border tokens.

Test updates:
- Fallbacks.test.tsx: `name: /delete/i` \u2192 `name: 'Delete'` (exact
  match) so the modal's confirm button doesn't collide with the row's
  'Delete fallback' aria-label.
- FallbackSelectionForm.test.tsx: assert against the new '+ Add group'
  Button + the inline X button per tab (aria-label='Remove <label>')
  instead of antd's editable-card 'add tab' / 'remove' tab roles.

Gates: TS \u2713 | Vitest 42/42 \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 09:33:07 +00:00
Cursor Agent
f474bde283
feat(ui): migrate Settings/RouterSettings/Fallbacks {Add,SelectionForm} to shadcn
- AddFallbacks: @tremor TremorButton + antd Button \u2192 shadcn Button +
  lucide Plus. Footer cancel/save buttons use shadcn outline + default
  variants.
- FallbackSelectionForm: antd editable-card Tabs \u2192 shadcn Tabs +
  per-tab inline X button + a separate '+ Add group' Button outside the
  TabsList. Preserves the >1 group constraint on the X button.

Gates: TS \u2713 | Vitest 15/15 (existing AddFallbacks.test) \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 09:25:33 +00:00
Cursor Agent
13fcb52ceb
feat(ui): migrate SSOSettings/RoleMappings to shadcn
- antd Card/Divider/Table/Tag/Typography \u2192 shadcn Card/Separator/Table/
  Badge + plain headings.
- Inlines the table render columns since shadcn Table doesn't take a
  ColumnsType array.

Gates: TS \u2713 | Vitest 4/4 \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 09:18:15 +00:00
Cursor Agent
2e4b3929d1
feat(ui): migrate model_group_alias_settings to shadcn
- @tremor Card/Title/Text/Table* + @heroicons icons \u2192 shadcn Card/
  Table + lucide ChevronDown/ChevronRight/PlusCircle/Pencil/Trash2.
- Replace 'bg-gray-300/text-gray-500/bg-green-600/text-blue-600/...' raw
  classes with semantic tokens. Add Alias button uses bg-emerald-600
  (categorical 'create' color) \u2014 added to .eslintrc.json overrides.
- Native input/button preserved for the inline editing UX.

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 09:14:20 +00:00
Cursor Agent
31c3be292a
feat(ui): migrate model_filters to shadcn
- @tremor Card/Text \u2192 shadcn Card + plain <span> + Tailwind labels.
- Native <select>/<input> kept (lightweight, no Radix portal in this
  filter bar). Replace 'border-gray-*'/text-gray-*'/text-blue-* raw
  classes with semantic tokens (border-input/text-muted-foreground/
  text-primary).

Gates: TS \u2713 | Build \u2713.

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
2026-04-23 09:09:07 +00:00