Skip to content

chore: shared UI package - #1333

Merged
steebchen merged 7 commits into
mainfrom
chore/shared-ui
Dec 17, 2025
Merged

steebchen merged 7 commits into
mainfrom
chore/shared-ui

Conversation

@smakosh

@smakosh smakosh commented Dec 17, 2025

Copy link
Copy Markdown
Member

Summary by CodeRabbit

  • New Features

    • IAM Rules management UI for API keys (create, view, delete rules).
    • New shared component library with reusable UI controls and multi-select model/provider selectors.
  • Improvements

    • Link-based navigation to IAM Rules from the API keys list.
    • Visual and spacing refinements across model listings, search, and provider/logo displays.

✏️ Tip: You can customize this high-level summary in your review settings.

- Updated TypeScript version for '@content-collections/core' and 'openapi-typescript' to 5.9.3 in pnpm-lock.yaml.
- Removed unused components including model-selector, provider-icons, and related files from the playground and admin applications.
- Integrated shared components for model and provider selection across applications.
@smakosh smakosh self-assigned this Dec 17, 2025
@smakosh
smakosh requested a review from steebchen December 17, 2025 21:04
@coderabbitai

coderabbitai Bot commented Dec 17, 2025

Copy link
Copy Markdown
Contributor

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

💤 Files selected but had no reviewable changes (1)
  • packages/shared/tsconfig.tsbuildinfo

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

Adds a new shared UI/components package (packages/shared) exporting many UI primitives, selectors, utilities and types; updates apps (apps/ui, apps/playground) to depend on and import from @llmgateway/shared; and adds an IAM rules page plus a client-side IAM rules management UI.

Changes

Cohort / File(s) Summary
Shared package manifest & entry
packages/shared/package.json, packages/shared/tsconfig.json, packages/shared/src/index.ts
New package exports (./components), dependencies/devDependencies, tsconfig settings, and re-exports (ModelSelector, ProviderIcons, useIsMobile, cn, UI barrel).
Shared components barrel
packages/shared/src/components/index.tsx, packages/shared/src/components/ui/index.tsx
New export barrels exposing shared components and UI sub-exports.
Shared UI primitives
packages/shared/src/components/ui/...
Added many UI primitives (Alert, Button, Dialog, Popover, Select, Tabs, Carousel, Sidebar, Form, etc.) with consistent styling and exports.
Shared selectors & icons
packages/shared/src/components/{model-selector,multi-model-selector,multi-provider-selector,provider-icons}.tsx
New/updated ModelSelector, MultiModelSelector, MultiProviderSelector and providerLogo mapping (added cerebras), multi-select and stability logic.
Shared utils, types & hooks
packages/shared/src/lib/{types,utils,model-utils,mapmodels}.ts, packages/shared/src/hooks/use-mobile.ts
Added ComboboxModel type, cn util, model-formatting helpers, mapModels mapper, and useIsMobile hook.
Playground app: dependency & imports
apps/playground/package.json, apps/playground/src/components/playground/{chat-header,chat-page-client,group-chat-client}.tsx
Added workspace dependency @llmgateway/shared and replaced local ModelSelector/provider icon imports with @llmgateway/shared/components.
UI app: dependency & new IAM page
apps/ui/package.json, apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx
Added @llmgateway/shared dependency and new server-side IamRulesPage (export dynamic = "force-dynamic") that fetches API keys and renders IamRulesClient.
API-keys IAM UI
apps/ui/src/components/api-keys/{iam-rules-client,iam-rules-dialog,api-keys-list,multi-provider-selector}.tsx
Added IamRulesClient (client-side CRUD UI for IAM rules), updated IamRulesDialog to use shared multi-selectors/models, and converted API-keys list IAM flow to Link navigation to the new IAM page.
Import migrations across UI
multiple apps/ui/src/components/** and apps/ui/src/app/** files
Replaced many local imports for getProviderIcon, providerLogoUrls, ModelSelector with @llmgateway/shared/components; small UI tweaks (unique keys, sizing, prop passthroughs).
CI & misc
.github/workflows/e2e.yml, .gitignore
e2e workflow triggers extended to packages/shared/**; .gitignore added *.tsbuildinfo.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant Browser as Client (IamRulesClient)
participant Server as Next.js Server/API
participant DB as API/DB (IAM rules service)
Note over Browser,Server: Create IAM rule flow
Browser->>Server: POST /api/keys/{keyId}/iam (new rule payload)
Server->>DB: Persist IAM rule for keyId
DB-->>Server: Created rule (id)
Server-->>Browser: 201 Created (rule)
Note over Browser,Server: Delete IAM rule flow
Browser->>Server: DELETE /api/keys/{keyId}/iam/{ruleId}
Server->>DB: Remove IAM rule
DB-->>Server: Deleted
Server-->>Browser: 200 OK (invalidate/refresh)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Points to review closely:

  • apps/ui/src/components/api-keys/iam-rules-client.tsx — rule construction, create/delete mutations, query invalidation, and form validation.
  • packages/shared/src/components/{model-selector,multi-model-selector,multi-provider-selector} — selection logic, sorting, stability badges, and React key uniqueness.
  • apps/ui/src/components/api-keys/api-keys-list.tsx — pathname parsing (extractOrgAndProjectFromPath) and Link navigation replacing dialog behavior.
  • packages/shared exports and package.json — ensure exported subpath ./components and import paths resolve correctly.

Possibly related PRs

Suggested labels

codex

Suggested reviewers

  • steebchen

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 1.35% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'chore: shared UI package' clearly describes the main objective: extracting and sharing UI components into a new shared package that other apps can depend on.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 20

🧹 Nitpick comments (17)
packages/shared/src/components/ui/tooltip.tsx (1)

21-29: Consider documenting the nested TooltipProvider pattern.

Each Tooltip creates its own TooltipProvider, which overrides any app-level provider settings (like delayDuration). This self-contained approach works but may surprise consumers expecting to configure tooltips globally via a single provider.

packages/shared/src/components/ui/input-group.tsx (1)

132-146: Consider adding forwardRef to InputGroupInput for consistency.

InputGroupTextarea uses forwardRef (lines 148-164), but InputGroupInput does not. This inconsistency could surprise consumers who expect to pass refs to both components uniformly.

-function InputGroupInput({
-	className,
-	...props
-}: React.ComponentProps<"input">) {
-	return (
-		<Input
-			data-slot="input-group-control"
-			className={cn(
-				"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent",
-				className,
-			)}
-			{...props}
-		/>
-	);
-}
+const InputGroupInput = React.forwardRef<
+	HTMLInputElement,
+	React.ComponentProps<"input">
+>(({ className, ...props }, ref) => {
+	return (
+		<Input
+			ref={ref}
+			data-slot="input-group-control"
+			className={cn(
+				"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent",
+				className,
+			)}
+			{...props}
+		/>
+	);
+});
+InputGroupInput.displayName = "InputGroupInput";
apps/ui/src/components/models-supported.tsx (1)

50-78: Move helper functions to shared package.

The getProviderLogo and getProviderLogoSmall helper functions duplicate logic that could benefit other components. Since you're already migrating provider utilities to the shared package, consider moving these helpers there as well for reusability.

Consider extracting these to packages/shared/src/components/provider-utils.tsx:

export const getProviderLogo = (providerId: ProviderId, size: "sm" | "md" | "lg" = "md") => {
	const sizes = {
		sm: "h-5 w-5",
		md: "h-10 w-10",
		lg: "h-16 w-16"
	};
	
	const LogoComponent = providerLogoUrls[providerId];
	const className = `${sizes[size]} object-contain`;
	
	if (LogoComponent) {
		return <LogoComponent className={className} />;
	}
	
	const IconComponent = getProviderIcon(providerId);
	return IconComponent ? (
		<IconComponent className={className} />
	) : (
		<div className={`${className} bg-gray-200 rounded`} />
	);
};
packages/shared/src/components/ui/tabs.tsx (1)

37-51: Consider extracting the complex className for better maintainability.

The TabsTrigger className (line 45) contains an extremely long string of Tailwind utilities that's difficult to read and maintain. Consider using cva (class-variance-authority) like the Button component does, or breaking it into logical groups with comments.

Example refactor using cva:

+const tabsTriggerVariants = cva(
+	"inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow]",
+	{
+		variants: {
+			state: {
+				active: "bg-background dark:text-foreground dark:border-input dark:bg-input/30 shadow-sm",
+				inactive: "text-foreground dark:text-muted-foreground"
+			}
+		}
+	}
+);

 function TabsTrigger({
 	className,
 	...props
 }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
 	return (
 		<TabsPrimitive.Trigger
 			data-slot="tabs-trigger"
-			className={cn(
-				"data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
-				className,
-			)}
+			className={cn(tabsTriggerVariants(), className)}
 			{...props}
 		/>
 	);
 }
packages/shared/src/components/ui/image-zoom.tsx (1)

21-51: Consider extracting className strings into named constants for maintainability.

The component contains extremely long className strings (lines 22-47) that are difficult to read and maintain. Consider extracting logical groups into named constants.

Example refactor:

+const ZOOM_GHOST_CLASSES = "pointer-events-none absolute";
+const ZOOM_BUTTON_BASE_CLASSES = "m-0 size-10 touch-manipulation appearance-none rounded-[50%] border-none bg-foreground/70 p-2 text-background outline-offset-2";
+const ZOOM_BTN_HIDDEN_CLASSES = "pointer-events-none absolute size-px overflow-hidden whitespace-nowrap [clip-path:inset(50%)] [clip:rect(0_0_0_0)]";
+
+const wrapperClasses = cn(
+	"relative",
+	`[&_[data-rmiz-ghost]]:${ZOOM_GHOST_CLASSES}`,
+	`[&_[data-rmiz-btn-zoom]]:${ZOOM_BUTTON_BASE_CLASSES}`,
+	// ... additional classes
+	className,
+);
packages/shared/src/lib/mapmodels.ts (1)

32-57: Remove verbose internal decision comments; extract repeated logic.

  1. Lines 34-43 contain extensive comments discussing implementation decisions. Per coding guidelines, avoid unnecessary code comments.

  2. The providers.find() lookup on line 33 is redundant—rootProviders already contains providerInfo.

  3. m.output?.includes("image") is duplicated (lines 19 and 55).

 for (const p of m.providers) {
-  const providerInfo = providers.find((pr) => pr.id === p.providerId);
-  // Ensure we use the same ID format as ModelSelector: providerId/modelId
-  // Note: ModelSelector uses m.id (Gateway ID), not p.modelName (Provider ID)
-  // We should match that to ensure lookups work if we looked up by provider-specific ID.
-  // However, ChatPageClient uses mapModels primarily for capabilities lookup.
-  // If ModelSelector uses providerId/m.id, we should probably align here or support both?
-  // The existing code used providerId/p.modelName.
-  // Let's keep p.modelName for now to avoid breaking if p.modelName is expected elsewhere,
-  // but ideally it should be m.id.
-  // Let's assume ModelSelector logic is the correct one for "User Selection".
-
+  const providerEntry = rootProviders.find((rp) => rp.providerId === p.providerId);
   entries.push({
-    id: `${p.providerId}/${m.id}`, // Changed to match ModelSelector
+    id: `${p.providerId}/${m.id}`,
     name: m.name ?? m.id,
-    provider: providerInfo?.name ?? p.providerId,
+    provider: providerEntry?.providerInfo?.name ?? p.providerId,
     providerId: p.providerId,
     family: m.family,
     context: p.contextSize,
     inputPrice: p.inputPrice,
     outputPrice: p.outputPrice,
     vision: p.vision,
     tools: p.tools,
-    imageGen: m.output?.includes("image"),
+    imageGen: hasImageGen,
   });
 }
apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx (3)

13-13: orgId is destructured but unused.

The orgId parameter is extracted from params but never used in this file.

-const { projectId, keyId } = await params;
+const { projectId, keyId } = await params;
+// orgId available if needed for breadcrumbs or authorization

Or simply remove it:

-const { projectId, keyId } = await params;
+const { projectId, keyId } = await params;

30-36: Consider using notFound() for proper 404 handling.

Using Next.js's notFound() function would provide proper 404 semantics and allow the app's not-found.tsx to render consistently.

+import { notFound } from "next/navigation";
+
 // ... in the function body:
 if (!apiKey) {
-  return (
-    <div className="flex flex-col items-center justify-center py-16 text-muted-foreground text-center">
-      <p className="text-gray-400">API key not found.</p>
-    </div>
-  );
+  notFound();
 }

15-28: Fetching all keys to find one is suboptimal.

The current approach fetches all API keys for the project, then filters client-side. If a direct endpoint like /keys/api/{id} exists, consider using it for better performance.

This is a nice-to-have optimization. If no direct endpoint exists, the current approach is acceptable.

packages/shared/src/components/ui/hover-card.tsx (2)

8-12: data-slot on Root has no effect.

HoverCardPrimitive.Root is a context provider and doesn't render a DOM element, so the data-slot attribute won't appear in the DOM. This is harmless but misleading for testing/selection purposes.

 function HoverCard({
 	...props
 }: React.ComponentProps<typeof HoverCardPrimitive.Root>) {
-	return <HoverCardPrimitive.Root data-slot="hover-card" {...props} />;
+	return <HoverCardPrimitive.Root {...props} />;
 }

28-41: data-slot on Portal has no effect.

Similarly, HoverCardPrimitive.Portal doesn't render a DOM node — only its children are portaled. The data-slot="hover-card-portal" won't appear in the DOM.

 	return (
-		<HoverCardPrimitive.Portal data-slot="hover-card-portal">
+		<HoverCardPrimitive.Portal>
 			<HoverCardPrimitive.Content
apps/ui/src/components/api-keys/iam-rules-client.tsx (3)

146-176: Missing error handling for create mutation.

The createRule mutation only handles onSuccess. If the API call fails, users won't receive feedback.

 		createRule(
 			{
 				params: { path: { id: apiKey.id } },
 				body: {
 					ruleType: newRule.ruleType,
 					ruleValue,
 					status: "active",
 				},
 			},
 			{
 				onSuccess: () => {
 					queryClient.invalidateQueries({
 						queryKey: api.queryOptions("get", "/keys/api/{id}/iam", {
 							params: { path: { id: apiKey.id } },
 						}).queryKey,
 					});

 					// Reset form
 					setNewRule({
 						ruleType: "allow_models",
 						models: [],
 						providers: [],
 						pricingType: "",
 						maxInputPrice: "",
 						maxOutputPrice: "",
 					});

 					toast({ title: "IAM rule created successfully" });
 				},
+				onError: (error) => {
+					toast({
+						title: "Failed to create IAM rule",
+						description: error.message,
+						variant: "destructive",
+					});
+				},
 			},
 		);

179-196: Missing error handling for delete mutation.

Same issue — the delete operation should provide user feedback on failure.

 	const handleDeleteRule = (ruleId: string) => {
 		deleteRule(
 			{
 				params: { path: { id: apiKey.id, ruleId } },
 			},
 			{
 				onSuccess: () => {
 					queryClient.invalidateQueries({
 						queryKey: api.queryOptions("get", "/keys/api/{id}/iam", {
 							params: { path: { id: apiKey.id } },
 						}).queryKey,
 					});

 					toast({ title: "IAM rule deleted successfully" });
 				},
+				onError: (error) => {
+					toast({
+						title: "Failed to delete IAM rule",
+						description: error.message,
+						variant: "destructive",
+					});
+				},
 			},
 		);
 	};

560-570: Hardcoded "en-US" locale.

Consider using undefined to respect the user's browser locale, or a locale from your app's i18n context.

 								<p className="text-xs text-muted-foreground">
 									Created{" "}
 									{new Date(rule.createdAt).toLocaleDateString(
-										"en-US",
+										undefined,
 										{
 											year: "numeric",
 											month: "short",
 											day: "numeric",
 										},
 									)}
 								</p>
packages/shared/src/components/ui/dialog.tsx (2)

9-13: data-slot on DialogPrimitive.Root has no effect.

Same as HoverCard — Root is a context provider without a DOM node.

 function Dialog({
 	...props
 }: React.ComponentProps<typeof DialogPrimitive.Root>) {
-	return <DialogPrimitive.Root data-slot="dialog" {...props} />;
+	return <DialogPrimitive.Root {...props} />;
 }

57-59: data-slot on DialogPortal has no effect.

The Portal component doesn't render a DOM element.

 	return (
-		<DialogPortal data-slot="dialog-portal">
+		<DialogPortal>
 			<DialogOverlay />
packages/shared/src/components/ui/sidebar.tsx (1)

79-92: Consider extracting cookie handling to a helper function.

Direct cookie string manipulation (line 89) works but is somewhat fragile. For better maintainability and testability, consider extracting this to a dedicated cookie utility function.

Example helper function:

function setSidebarCookie(value: boolean) {
	document.cookie = `${SIDEBAR_COOKIE_NAME}=${value}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
}

Then use:

-			document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
+			setSidebarCookie(openState);
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1c053ce and 1a0c93f.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (70)
  • apps/playground/package.json (1 hunks)
  • apps/playground/src/components/playground/chat-header.tsx (1 hunks)
  • apps/playground/src/components/playground/chat-page-client.tsx (1 hunks)
  • apps/playground/src/components/playground/group-chat-client.tsx (1 hunks)
  • apps/ui/package.json (1 hunks)
  • apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx (1 hunks)
  • apps/ui/src/app/models/[name]/opengraph-image.tsx (1 hunks)
  • apps/ui/src/app/providers/[id]/opengraph-image.tsx (1 hunks)
  • apps/ui/src/components/api-keys/api-keys-list.tsx (9 hunks)
  • apps/ui/src/components/api-keys/iam-rules-client.tsx (1 hunks)
  • apps/ui/src/components/api-keys/iam-rules-dialog.tsx (3 hunks)
  • apps/ui/src/components/api-keys/multi-provider-selector.tsx (1 hunks)
  • apps/ui/src/components/landing/graph.tsx (1 hunks)
  • apps/ui/src/components/landing/hero.tsx (2 hunks)
  • apps/ui/src/components/models-supported.tsx (2 hunks)
  • apps/ui/src/components/models/all-models.tsx (1 hunks)
  • apps/ui/src/components/models/model-card.tsx (1 hunks)
  • apps/ui/src/components/models/model-comparison.tsx (3 hunks)
  • apps/ui/src/components/models/model-provider-card.tsx (1 hunks)
  • apps/ui/src/components/models/playground-model-selector.tsx (4 hunks)
  • apps/ui/src/components/models/provider-card.tsx (1 hunks)
  • apps/ui/src/components/provider-keys/provider-keys-list.tsx (2 hunks)
  • apps/ui/src/components/provider-keys/provider-select.tsx (2 hunks)
  • apps/ui/src/components/providers/hero.tsx (1 hunks)
  • apps/ui/src/components/providers/provider-models-grid.tsx (1 hunks)
  • apps/ui/src/components/shared/model-search.tsx (2 hunks)
  • packages/shared/package.json (2 hunks)
  • packages/shared/src/components/index.tsx (1 hunks)
  • packages/shared/src/components/model-selector.tsx (10 hunks)
  • packages/shared/src/components/multi-model-selector.tsx (1 hunks)
  • packages/shared/src/components/multi-provider-selector.tsx (1 hunks)
  • packages/shared/src/components/provider-icons.tsx (1 hunks)
  • packages/shared/src/components/ui/alert.tsx (1 hunks)
  • packages/shared/src/components/ui/avatar.tsx (1 hunks)
  • packages/shared/src/components/ui/badge.tsx (1 hunks)
  • packages/shared/src/components/ui/button.tsx (1 hunks)
  • packages/shared/src/components/ui/carousel.tsx (1 hunks)
  • packages/shared/src/components/ui/checkbox.tsx (1 hunks)
  • packages/shared/src/components/ui/collapsible.tsx (1 hunks)
  • packages/shared/src/components/ui/command.tsx (1 hunks)
  • packages/shared/src/components/ui/dialog.tsx (1 hunks)
  • packages/shared/src/components/ui/dropdown-menu.tsx (1 hunks)
  • packages/shared/src/components/ui/form.tsx (1 hunks)
  • packages/shared/src/components/ui/hover-card.tsx (1 hunks)
  • packages/shared/src/components/ui/image-zoom.tsx (1 hunks)
  • packages/shared/src/components/ui/index.tsx (1 hunks)
  • packages/shared/src/components/ui/input-group.tsx (1 hunks)
  • packages/shared/src/components/ui/input.tsx (1 hunks)
  • packages/shared/src/components/ui/label.tsx (1 hunks)
  • packages/shared/src/components/ui/logo.tsx (1 hunks)
  • packages/shared/src/components/ui/popover.tsx (1 hunks)
  • packages/shared/src/components/ui/progress.tsx (1 hunks)
  • packages/shared/src/components/ui/scroll-area.tsx (1 hunks)
  • packages/shared/src/components/ui/select.tsx (1 hunks)
  • packages/shared/src/components/ui/separator.tsx (1 hunks)
  • packages/shared/src/components/ui/sheet.tsx (1 hunks)
  • packages/shared/src/components/ui/sidebar.tsx (1 hunks)
  • packages/shared/src/components/ui/skeleton.tsx (1 hunks)
  • packages/shared/src/components/ui/sonner.tsx (1 hunks)
  • packages/shared/src/components/ui/switch.tsx (1 hunks)
  • packages/shared/src/components/ui/tabs.tsx (1 hunks)
  • packages/shared/src/components/ui/textarea.tsx (1 hunks)
  • packages/shared/src/components/ui/tooltip.tsx (1 hunks)
  • packages/shared/src/hooks/use-mobile.ts (1 hunks)
  • packages/shared/src/index.ts (1 hunks)
  • packages/shared/src/lib/mapmodels.ts (1 hunks)
  • packages/shared/src/lib/model-utils.ts (1 hunks)
  • packages/shared/src/lib/types.ts (1 hunks)
  • packages/shared/src/lib/utils.ts (1 hunks)
  • packages/shared/tsconfig.json (1 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Never use any or as any unless absolutely necessary in TypeScript code
For database reads: Use db().query.<table>.findMany() or db().query.<table>.findFirst()

Files:

  • packages/shared/src/components/ui/switch.tsx
  • packages/shared/src/lib/types.ts
  • packages/shared/src/components/ui/separator.tsx
  • packages/shared/src/components/ui/badge.tsx
  • packages/shared/src/components/ui/tabs.tsx
  • packages/shared/src/components/ui/checkbox.tsx
  • packages/shared/src/components/ui/textarea.tsx
  • apps/ui/src/components/providers/provider-models-grid.tsx
  • packages/shared/src/lib/utils.ts
  • packages/shared/src/components/index.tsx
  • apps/playground/src/components/playground/chat-header.tsx
  • apps/playground/src/components/playground/group-chat-client.tsx
  • packages/shared/src/index.ts
  • packages/shared/src/lib/mapmodels.ts
  • packages/shared/src/components/ui/label.tsx
  • apps/ui/src/components/models-supported.tsx
  • packages/shared/src/components/provider-icons.tsx
  • apps/ui/src/components/models/model-provider-card.tsx
  • apps/ui/src/components/providers/hero.tsx
  • apps/ui/src/components/models/playground-model-selector.tsx
  • packages/shared/src/components/ui/select.tsx
  • apps/playground/src/components/playground/chat-page-client.tsx
  • apps/ui/src/components/models/provider-card.tsx
  • packages/shared/src/components/ui/alert.tsx
  • apps/ui/src/components/models/all-models.tsx
  • packages/shared/src/components/ui/popover.tsx
  • packages/shared/src/components/multi-provider-selector.tsx
  • apps/ui/src/components/api-keys/iam-rules-client.tsx
  • packages/shared/src/components/ui/image-zoom.tsx
  • apps/ui/src/components/api-keys/api-keys-list.tsx
  • packages/shared/src/components/multi-model-selector.tsx
  • packages/shared/src/components/ui/skeleton.tsx
  • packages/shared/src/components/ui/tooltip.tsx
  • apps/ui/src/components/models/model-comparison.tsx
  • packages/shared/src/components/ui/form.tsx
  • apps/ui/src/app/models/[name]/opengraph-image.tsx
  • packages/shared/src/components/ui/sheet.tsx
  • packages/shared/src/components/ui/carousel.tsx
  • packages/shared/src/components/ui/sonner.tsx
  • apps/ui/src/components/api-keys/iam-rules-dialog.tsx
  • packages/shared/src/components/ui/collapsible.tsx
  • packages/shared/src/components/ui/index.tsx
  • packages/shared/src/lib/model-utils.ts
  • apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx
  • packages/shared/src/components/ui/input-group.tsx
  • packages/shared/src/components/ui/logo.tsx
  • packages/shared/src/components/ui/dialog.tsx
  • packages/shared/src/components/ui/avatar.tsx
  • packages/shared/src/components/ui/scroll-area.tsx
  • packages/shared/src/components/ui/command.tsx
  • apps/ui/src/components/landing/graph.tsx
  • apps/ui/src/components/models/model-card.tsx
  • apps/ui/src/app/providers/[id]/opengraph-image.tsx
  • packages/shared/src/hooks/use-mobile.ts
  • packages/shared/src/components/ui/input.tsx
  • apps/ui/src/components/provider-keys/provider-select.tsx
  • apps/ui/src/components/provider-keys/provider-keys-list.tsx
  • packages/shared/src/components/model-selector.tsx
  • packages/shared/src/components/ui/button.tsx
  • apps/ui/src/components/landing/hero.tsx
  • packages/shared/src/components/ui/progress.tsx
  • apps/ui/src/components/shared/model-search.tsx
  • apps/ui/src/components/api-keys/multi-provider-selector.tsx
  • packages/shared/src/components/ui/hover-card.tsx
  • packages/shared/src/components/ui/dropdown-menu.tsx
  • packages/shared/src/components/ui/sidebar.tsx
**/*.{ts,tsx,js,jsx,json,md}

📄 CodeRabbit inference engine (CLAUDE.md)

Always use tabs for indentation

Files:

  • packages/shared/src/components/ui/switch.tsx
  • packages/shared/src/lib/types.ts
  • packages/shared/src/components/ui/separator.tsx
  • packages/shared/src/components/ui/badge.tsx
  • packages/shared/src/components/ui/tabs.tsx
  • packages/shared/src/components/ui/checkbox.tsx
  • packages/shared/src/components/ui/textarea.tsx
  • apps/ui/src/components/providers/provider-models-grid.tsx
  • packages/shared/src/lib/utils.ts
  • packages/shared/src/components/index.tsx
  • apps/playground/src/components/playground/chat-header.tsx
  • apps/playground/src/components/playground/group-chat-client.tsx
  • packages/shared/src/index.ts
  • packages/shared/src/lib/mapmodels.ts
  • packages/shared/src/components/ui/label.tsx
  • apps/ui/src/components/models-supported.tsx
  • packages/shared/src/components/provider-icons.tsx
  • apps/ui/src/components/models/model-provider-card.tsx
  • apps/ui/src/components/providers/hero.tsx
  • apps/ui/src/components/models/playground-model-selector.tsx
  • packages/shared/src/components/ui/select.tsx
  • apps/playground/src/components/playground/chat-page-client.tsx
  • apps/ui/src/components/models/provider-card.tsx
  • packages/shared/src/components/ui/alert.tsx
  • apps/ui/src/components/models/all-models.tsx
  • packages/shared/src/components/ui/popover.tsx
  • packages/shared/src/components/multi-provider-selector.tsx
  • apps/ui/src/components/api-keys/iam-rules-client.tsx
  • packages/shared/src/components/ui/image-zoom.tsx
  • apps/ui/src/components/api-keys/api-keys-list.tsx
  • packages/shared/src/components/multi-model-selector.tsx
  • packages/shared/package.json
  • packages/shared/src/components/ui/skeleton.tsx
  • packages/shared/src/components/ui/tooltip.tsx
  • apps/ui/src/components/models/model-comparison.tsx
  • packages/shared/src/components/ui/form.tsx
  • apps/ui/src/app/models/[name]/opengraph-image.tsx
  • packages/shared/src/components/ui/sheet.tsx
  • packages/shared/src/components/ui/carousel.tsx
  • packages/shared/src/components/ui/sonner.tsx
  • apps/ui/package.json
  • apps/ui/src/components/api-keys/iam-rules-dialog.tsx
  • packages/shared/src/components/ui/collapsible.tsx
  • packages/shared/src/components/ui/index.tsx
  • packages/shared/src/lib/model-utils.ts
  • apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx
  • packages/shared/src/components/ui/input-group.tsx
  • packages/shared/src/components/ui/logo.tsx
  • packages/shared/src/components/ui/dialog.tsx
  • packages/shared/src/components/ui/avatar.tsx
  • packages/shared/src/components/ui/scroll-area.tsx
  • packages/shared/src/components/ui/command.tsx
  • apps/ui/src/components/landing/graph.tsx
  • apps/playground/package.json
  • apps/ui/src/components/models/model-card.tsx
  • apps/ui/src/app/providers/[id]/opengraph-image.tsx
  • packages/shared/src/hooks/use-mobile.ts
  • packages/shared/src/components/ui/input.tsx
  • apps/ui/src/components/provider-keys/provider-select.tsx
  • packages/shared/tsconfig.json
  • apps/ui/src/components/provider-keys/provider-keys-list.tsx
  • packages/shared/src/components/model-selector.tsx
  • packages/shared/src/components/ui/button.tsx
  • apps/ui/src/components/landing/hero.tsx
  • packages/shared/src/components/ui/progress.tsx
  • apps/ui/src/components/shared/model-search.tsx
  • apps/ui/src/components/api-keys/multi-provider-selector.tsx
  • packages/shared/src/components/ui/hover-card.tsx
  • packages/shared/src/components/ui/dropdown-menu.tsx
  • packages/shared/src/components/ui/sidebar.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,js,jsx}: Always use top-level import, never use require or dynamic imports
No unnecessary code comments

Files:

  • packages/shared/src/components/ui/switch.tsx
  • packages/shared/src/lib/types.ts
  • packages/shared/src/components/ui/separator.tsx
  • packages/shared/src/components/ui/badge.tsx
  • packages/shared/src/components/ui/tabs.tsx
  • packages/shared/src/components/ui/checkbox.tsx
  • packages/shared/src/components/ui/textarea.tsx
  • apps/ui/src/components/providers/provider-models-grid.tsx
  • packages/shared/src/lib/utils.ts
  • packages/shared/src/components/index.tsx
  • apps/playground/src/components/playground/chat-header.tsx
  • apps/playground/src/components/playground/group-chat-client.tsx
  • packages/shared/src/index.ts
  • packages/shared/src/lib/mapmodels.ts
  • packages/shared/src/components/ui/label.tsx
  • apps/ui/src/components/models-supported.tsx
  • packages/shared/src/components/provider-icons.tsx
  • apps/ui/src/components/models/model-provider-card.tsx
  • apps/ui/src/components/providers/hero.tsx
  • apps/ui/src/components/models/playground-model-selector.tsx
  • packages/shared/src/components/ui/select.tsx
  • apps/playground/src/components/playground/chat-page-client.tsx
  • apps/ui/src/components/models/provider-card.tsx
  • packages/shared/src/components/ui/alert.tsx
  • apps/ui/src/components/models/all-models.tsx
  • packages/shared/src/components/ui/popover.tsx
  • packages/shared/src/components/multi-provider-selector.tsx
  • apps/ui/src/components/api-keys/iam-rules-client.tsx
  • packages/shared/src/components/ui/image-zoom.tsx
  • apps/ui/src/components/api-keys/api-keys-list.tsx
  • packages/shared/src/components/multi-model-selector.tsx
  • packages/shared/src/components/ui/skeleton.tsx
  • packages/shared/src/components/ui/tooltip.tsx
  • apps/ui/src/components/models/model-comparison.tsx
  • packages/shared/src/components/ui/form.tsx
  • apps/ui/src/app/models/[name]/opengraph-image.tsx
  • packages/shared/src/components/ui/sheet.tsx
  • packages/shared/src/components/ui/carousel.tsx
  • packages/shared/src/components/ui/sonner.tsx
  • apps/ui/src/components/api-keys/iam-rules-dialog.tsx
  • packages/shared/src/components/ui/collapsible.tsx
  • packages/shared/src/components/ui/index.tsx
  • packages/shared/src/lib/model-utils.ts
  • apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx
  • packages/shared/src/components/ui/input-group.tsx
  • packages/shared/src/components/ui/logo.tsx
  • packages/shared/src/components/ui/dialog.tsx
  • packages/shared/src/components/ui/avatar.tsx
  • packages/shared/src/components/ui/scroll-area.tsx
  • packages/shared/src/components/ui/command.tsx
  • apps/ui/src/components/landing/graph.tsx
  • apps/ui/src/components/models/model-card.tsx
  • apps/ui/src/app/providers/[id]/opengraph-image.tsx
  • packages/shared/src/hooks/use-mobile.ts
  • packages/shared/src/components/ui/input.tsx
  • apps/ui/src/components/provider-keys/provider-select.tsx
  • apps/ui/src/components/provider-keys/provider-keys-list.tsx
  • packages/shared/src/components/model-selector.tsx
  • packages/shared/src/components/ui/button.tsx
  • apps/ui/src/components/landing/hero.tsx
  • packages/shared/src/components/ui/progress.tsx
  • apps/ui/src/components/shared/model-search.tsx
  • apps/ui/src/components/api-keys/multi-provider-selector.tsx
  • packages/shared/src/components/ui/hover-card.tsx
  • packages/shared/src/components/ui/dropdown-menu.tsx
  • packages/shared/src/components/ui/sidebar.tsx
**/*.{js,ts,tsx,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

Always use top-level import, never use require or dynamic imports

Files:

  • packages/shared/src/components/ui/switch.tsx
  • packages/shared/src/lib/types.ts
  • packages/shared/src/components/ui/separator.tsx
  • packages/shared/src/components/ui/badge.tsx
  • packages/shared/src/components/ui/tabs.tsx
  • packages/shared/src/components/ui/checkbox.tsx
  • packages/shared/src/components/ui/textarea.tsx
  • apps/ui/src/components/providers/provider-models-grid.tsx
  • packages/shared/src/lib/utils.ts
  • packages/shared/src/components/index.tsx
  • apps/playground/src/components/playground/chat-header.tsx
  • apps/playground/src/components/playground/group-chat-client.tsx
  • packages/shared/src/index.ts
  • packages/shared/src/lib/mapmodels.ts
  • packages/shared/src/components/ui/label.tsx
  • apps/ui/src/components/models-supported.tsx
  • packages/shared/src/components/provider-icons.tsx
  • apps/ui/src/components/models/model-provider-card.tsx
  • apps/ui/src/components/providers/hero.tsx
  • apps/ui/src/components/models/playground-model-selector.tsx
  • packages/shared/src/components/ui/select.tsx
  • apps/playground/src/components/playground/chat-page-client.tsx
  • apps/ui/src/components/models/provider-card.tsx
  • packages/shared/src/components/ui/alert.tsx
  • apps/ui/src/components/models/all-models.tsx
  • packages/shared/src/components/ui/popover.tsx
  • packages/shared/src/components/multi-provider-selector.tsx
  • apps/ui/src/components/api-keys/iam-rules-client.tsx
  • packages/shared/src/components/ui/image-zoom.tsx
  • apps/ui/src/components/api-keys/api-keys-list.tsx
  • packages/shared/src/components/multi-model-selector.tsx
  • packages/shared/src/components/ui/skeleton.tsx
  • packages/shared/src/components/ui/tooltip.tsx
  • apps/ui/src/components/models/model-comparison.tsx
  • packages/shared/src/components/ui/form.tsx
  • apps/ui/src/app/models/[name]/opengraph-image.tsx
  • packages/shared/src/components/ui/sheet.tsx
  • packages/shared/src/components/ui/carousel.tsx
  • packages/shared/src/components/ui/sonner.tsx
  • apps/ui/src/components/api-keys/iam-rules-dialog.tsx
  • packages/shared/src/components/ui/collapsible.tsx
  • packages/shared/src/components/ui/index.tsx
  • packages/shared/src/lib/model-utils.ts
  • apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx
  • packages/shared/src/components/ui/input-group.tsx
  • packages/shared/src/components/ui/logo.tsx
  • packages/shared/src/components/ui/dialog.tsx
  • packages/shared/src/components/ui/avatar.tsx
  • packages/shared/src/components/ui/scroll-area.tsx
  • packages/shared/src/components/ui/command.tsx
  • apps/ui/src/components/landing/graph.tsx
  • apps/ui/src/components/models/model-card.tsx
  • apps/ui/src/app/providers/[id]/opengraph-image.tsx
  • packages/shared/src/hooks/use-mobile.ts
  • packages/shared/src/components/ui/input.tsx
  • apps/ui/src/components/provider-keys/provider-select.tsx
  • apps/ui/src/components/provider-keys/provider-keys-list.tsx
  • packages/shared/src/components/model-selector.tsx
  • packages/shared/src/components/ui/button.tsx
  • apps/ui/src/components/landing/hero.tsx
  • packages/shared/src/components/ui/progress.tsx
  • apps/ui/src/components/shared/model-search.tsx
  • apps/ui/src/components/api-keys/multi-provider-selector.tsx
  • packages/shared/src/components/ui/hover-card.tsx
  • packages/shared/src/components/ui/dropdown-menu.tsx
  • packages/shared/src/components/ui/sidebar.tsx
apps/{ui,playground}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

apps/{ui,playground}/**/*.{ts,tsx}: Use cookies for user-settings which are not saved in the database to ensure SSR works
Use Next.js App Router with React Server Components for frontend development

Use cookies for user-settings which are not saved in the database to ensure SSR works

Files:

  • apps/ui/src/components/providers/provider-models-grid.tsx
  • apps/playground/src/components/playground/chat-header.tsx
  • apps/playground/src/components/playground/group-chat-client.tsx
  • apps/ui/src/components/models-supported.tsx
  • apps/ui/src/components/models/model-provider-card.tsx
  • apps/ui/src/components/providers/hero.tsx
  • apps/ui/src/components/models/playground-model-selector.tsx
  • apps/playground/src/components/playground/chat-page-client.tsx
  • apps/ui/src/components/models/provider-card.tsx
  • apps/ui/src/components/models/all-models.tsx
  • apps/ui/src/components/api-keys/iam-rules-client.tsx
  • apps/ui/src/components/api-keys/api-keys-list.tsx
  • apps/ui/src/components/models/model-comparison.tsx
  • apps/ui/src/app/models/[name]/opengraph-image.tsx
  • apps/ui/src/components/api-keys/iam-rules-dialog.tsx
  • apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx
  • apps/ui/src/components/landing/graph.tsx
  • apps/ui/src/components/models/model-card.tsx
  • apps/ui/src/app/providers/[id]/opengraph-image.tsx
  • apps/ui/src/components/provider-keys/provider-select.tsx
  • apps/ui/src/components/provider-keys/provider-keys-list.tsx
  • apps/ui/src/components/landing/hero.tsx
  • apps/ui/src/components/shared/model-search.tsx
  • apps/ui/src/components/api-keys/multi-provider-selector.tsx
apps/{ui,playground,docs}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use next/link for links and next/navigation's router for programmatic navigation

Files:

  • apps/ui/src/components/providers/provider-models-grid.tsx
  • apps/playground/src/components/playground/chat-header.tsx
  • apps/playground/src/components/playground/group-chat-client.tsx
  • apps/ui/src/components/models-supported.tsx
  • apps/ui/src/components/models/model-provider-card.tsx
  • apps/ui/src/components/providers/hero.tsx
  • apps/ui/src/components/models/playground-model-selector.tsx
  • apps/playground/src/components/playground/chat-page-client.tsx
  • apps/ui/src/components/models/provider-card.tsx
  • apps/ui/src/components/models/all-models.tsx
  • apps/ui/src/components/api-keys/iam-rules-client.tsx
  • apps/ui/src/components/api-keys/api-keys-list.tsx
  • apps/ui/src/components/models/model-comparison.tsx
  • apps/ui/src/app/models/[name]/opengraph-image.tsx
  • apps/ui/src/components/api-keys/iam-rules-dialog.tsx
  • apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx
  • apps/ui/src/components/landing/graph.tsx
  • apps/ui/src/components/models/model-card.tsx
  • apps/ui/src/app/providers/[id]/opengraph-image.tsx
  • apps/ui/src/components/provider-keys/provider-select.tsx
  • apps/ui/src/components/provider-keys/provider-keys-list.tsx
  • apps/ui/src/components/landing/hero.tsx
  • apps/ui/src/components/shared/model-search.tsx
  • apps/ui/src/components/api-keys/multi-provider-selector.tsx
🧠 Learnings (7)
📚 Learning: 2025-12-03T12:42:14.219Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-03T12:42:14.219Z
Learning: Applies to apps/{ui,playground}/**/*.{ts,tsx} : Use Next.js App Router with React Server Components for frontend development

Applied to files:

  • packages/shared/src/components/ui/switch.tsx
  • packages/shared/src/components/ui/separator.tsx
  • packages/shared/src/components/ui/tabs.tsx
  • apps/playground/src/components/playground/group-chat-client.tsx
  • apps/ui/src/components/api-keys/api-keys-list.tsx
  • apps/ui/src/components/models/model-comparison.tsx
  • packages/shared/src/components/ui/carousel.tsx
  • packages/shared/src/components/ui/scroll-area.tsx
  • packages/shared/src/components/ui/hover-card.tsx
  • packages/shared/src/components/ui/sidebar.tsx
📚 Learning: 2025-12-03T12:42:26.162Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T12:42:26.162Z
Learning: Applies to apps/{ui,playground,docs}/**/*.{ts,tsx} : Use `next/link` for links and `next/navigation`'s router for programmatic navigation

Applied to files:

  • packages/shared/src/components/ui/tabs.tsx
  • apps/ui/src/components/api-keys/api-keys-list.tsx
  • apps/ui/src/components/models/model-comparison.tsx
📚 Learning: 2025-12-03T12:42:14.219Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-03T12:42:14.219Z
Learning: Applies to apps/{ui,playground}/**/*.{tsx} : Use `next/link` for links and `next/navigation`'s router for programmatic navigation

Applied to files:

  • packages/shared/src/components/ui/tabs.tsx
  • apps/ui/src/components/api-keys/api-keys-list.tsx
  • apps/ui/src/components/models/model-comparison.tsx
  • packages/shared/src/components/ui/carousel.tsx
📚 Learning: 2025-12-03T12:42:14.219Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-03T12:42:14.219Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : Always use top-level `import`, never use require or dynamic imports

Applied to files:

  • packages/shared/package.json
  • packages/shared/tsconfig.json
📚 Learning: 2025-12-03T12:42:26.162Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T12:42:26.162Z
Learning: Applies to **/*.{js,ts,tsx,jsx} : Always use top-level `import`, never use require or dynamic imports

Applied to files:

  • packages/shared/package.json
📚 Learning: 2025-12-03T12:42:14.219Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-03T12:42:14.219Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : No unnecessary code comments

Applied to files:

  • packages/shared/tsconfig.json
📚 Learning: 2025-09-22T18:30:32.055Z
Learnt from: smakosh
Repo: theopenco/llmgateway PR: 911
File: apps/ui/src/lib/components/tweet-card.tsx:170-174
Timestamp: 2025-09-22T18:30:32.055Z
Learning: In the tweet-card component at apps/ui/src/lib/components/tweet-card.tsx, the use of dangerouslySetInnerHTML for rendering tweet entity text is acceptable. The react-tweet library content is considered safe to render as HTML in this context.

Applied to files:

  • packages/shared/src/components/ui/hover-card.tsx
🧬 Code graph analysis (29)
packages/shared/src/components/ui/switch.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/ui/separator.tsx (3)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
apps/admin/src/components/ui/separator.tsx (1)
  • Separator (8-26)
packages/shared/src/components/ui/badge.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/ui/checkbox.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/ui/textarea.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
apps/ui/src/components/providers/provider-models-grid.tsx (1)
apps/ui/src/components/models/model-card.tsx (1)
  • ModelCard (44-465)
packages/shared/src/components/ui/label.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/provider-icons.tsx (1)
packages/shared/src/index.ts (1)
  • ProviderIcons (15-15)
apps/ui/src/components/models/playground-model-selector.tsx (1)
apps/ui/src/lib/components/providers-icons.tsx (1)
  • getProviderIcon (1213-1226)
packages/shared/src/components/ui/select.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/ui/alert.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/ui/image-zoom.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
apps/ui/src/components/api-keys/api-keys-list.tsx (1)
apps/ui/src/lib/navigation-utils.ts (1)
  • extractOrgAndProjectFromPath (83-118)
packages/shared/src/components/multi-model-selector.tsx (3)
packages/models/src/models.ts (2)
  • ModelDefinition (161-221)
  • StabilityLevel (159-159)
packages/models/src/providers.ts (2)
  • ProviderDefinition (9-32)
  • providers (34-444)
apps/ui/src/lib/components/providers-icons.tsx (1)
  • getProviderIcon (1213-1226)
packages/shared/src/components/ui/tooltip.tsx (1)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
apps/ui/src/components/models/model-comparison.tsx (2)
apps/ui/src/components/models/playground-model-selector.tsx (1)
  • ModelSelector (71-522)
packages/shared/src/components/model-selector.tsx (1)
  • ModelSelector (296-1688)
packages/shared/src/components/ui/sheet.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
apps/ui/src/components/api-keys/iam-rules-dialog.tsx (1)
packages/models/src/providers.ts (1)
  • providers (34-444)
packages/shared/src/lib/model-utils.ts (2)
packages/models/src/models.ts (1)
  • ModelDefinition (161-221)
packages/models/src/providers.ts (2)
  • providers (34-444)
  • ProviderDefinition (9-32)
apps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsx (2)
packages/db/src/schema.ts (1)
  • apiKey (267-294)
apps/ui/src/components/api-keys/iam-rules-client.tsx (1)
  • IamRulesClient (74-582)
packages/shared/src/components/ui/input-group.tsx (4)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/ui/button.tsx (1)
  • Button (60-60)
packages/shared/src/components/ui/input.tsx (1)
  • Input (21-21)
packages/shared/src/components/ui/textarea.tsx (1)
  • Textarea (18-18)
packages/shared/src/components/ui/scroll-area.tsx (1)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/hooks/use-mobile.ts (1)
packages/shared/src/index.ts (1)
  • useIsMobile (17-17)
packages/shared/src/components/ui/input.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
apps/ui/src/components/provider-keys/provider-keys-list.tsx (1)
apps/ui/src/lib/components/providers-icons.tsx (1)
  • getProviderIcon (1213-1226)
packages/shared/src/components/ui/button.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/ui/progress.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/ui/hover-card.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
packages/shared/src/components/ui/dropdown-menu.tsx (2)
packages/shared/src/index.ts (1)
  • cn (19-19)
packages/shared/src/lib/utils.ts (1)
  • cn (4-6)
🪛 GitHub Actions: ci
packages/shared/src/components/ui/switch.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/lib/types.ts

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/separator.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/badge.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/tabs.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/checkbox.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/textarea.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/lib/utils.ts

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/index.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/index.ts

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/lib/mapmodels.ts

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/label.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/provider-icons.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/select.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/alert.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/popover.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/multi-provider-selector.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/image-zoom.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/multi-model-selector.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/package.json

[error] 1-1: Build failed (tsc) due to ambiguous project root: supply 'rootDir' in tsconfig to disambiguate export map entry '.' in '/home/runner/work/llmgateway/llmgateway/packages/shared/package.json'. Command failed: 'pnpm run build' for packages/shared.

packages/shared/src/components/ui/skeleton.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/tooltip.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/form.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/sheet.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/carousel.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/sonner.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/collapsible.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/index.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/lib/model-utils.ts

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/input-group.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/logo.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/dialog.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/avatar.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/scroll-area.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/command.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/hooks/use-mobile.ts

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/input.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/tsconfig.json

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/model-selector.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/button.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/progress.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/hover-card.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/dropdown-menu.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

packages/shared/src/components/ui/sidebar.tsx

[error] 1-1: Command failed with exit code 2 during build step. The build script 'pnpm run build' exited with an error.

Comment thread apps/ui/package.json
Comment thread apps/ui/src/components/api-keys/api-keys-list.tsx
Comment thread apps/ui/src/components/models-supported.tsx
Comment thread apps/ui/src/components/models/playground-model-selector.tsx
Comment thread packages/shared/src/components/model-selector.tsx
Comment thread packages/shared/src/components/ui/sidebar.tsx
Comment thread packages/shared/src/components/ui/skeleton.tsx
Comment thread packages/shared/src/components/ui/switch.tsx
Comment thread packages/shared/src/components/ui/textarea.tsx
Comment thread packages/shared/tsconfig.json

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
packages/shared/tsconfig.json (1)

8-8: Consider disabling allowJs for a new TypeScript package.

For a new shared package, keeping it TypeScript-only improves type safety and consistency. If there's no immediate need to support JavaScript files, consider setting this to false.

📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1a0c93f and 4a448ec.

📒 Files selected for processing (1)
  • packages/shared/tsconfig.json (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,js,jsx,json,md}

📄 CodeRabbit inference engine (CLAUDE.md)

Always use tabs for indentation

Files:

  • packages/shared/tsconfig.json
🧠 Learnings (1)
📚 Learning: 2025-12-03T12:42:14.219Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-03T12:42:14.219Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : No unnecessary code comments

Applied to files:

  • packages/shared/tsconfig.json
🔇 Additional comments (4)
packages/shared/tsconfig.json (4)

5-5: Critical issue resolved.

The addition of rootDir directly addresses the previous pipeline failure. This fixes the ambiguous project root error.


6-6: Verify the ES5 target is intentional.

Targeting ES5 is extremely conservative for 2025. Modern shared packages typically target ES2015 or higher, which produces smaller, more efficient code. Most build tools can transpile to ES5 if needed for legacy browser support.

Unless there's a specific requirement for ES5 output, consider updating to at least ES2015 or ES2020.


7-7: Configuration looks appropriate for a shared React UI package.

The compiler options are well-configured:

  • lib includes necessary DOM and ESNext types
  • strict mode enabled for better type safety
  • declaration generates type definitions (essential for a shared package)
  • jsx: "react-jsx" uses the modern React transform
  • isolatedModules and incremental optimize build performance
  • Include/exclude patterns correctly scope the package

Also applies to: 9-18, 24-25


13-13: Verify moduleResolution: "bundler" is compatible with your build setup.

The bundler option is appropriate for packages that will be bundled, but it's a newer TypeScript feature. Ensure your build tools (webpack, vite, rollup, etc.) properly support this resolution strategy.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
packages/shared/package.json (1)

23-23: Consider cross-platform compatibility for the build script.

The rm -rf command is Unix-specific and may fail on Windows systems without Git Bash or WSL. Consider using a cross-platform alternative like rimraf or the newer Node.js native fs.rm API.

Example using rimraf:

-		"build": "rm -rf dist tsconfig.tsbuildinfo && tsc && resolve-tspaths",
+		"build": "rimraf dist tsconfig.tsbuildinfo && tsc && resolve-tspaths",

(Requires adding rimraf to devDependencies)

📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4a448ec and f99e792.

📒 Files selected for processing (3)
  • .github/workflows/e2e.yml (1 hunks)
  • .gitignore (1 hunks)
  • packages/shared/package.json (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,js,jsx,json,md}

📄 CodeRabbit inference engine (CLAUDE.md)

Always use tabs for indentation

Files:

  • packages/shared/package.json
🧠 Learnings (3)
📚 Learning: 2025-12-03T12:42:14.219Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-03T12:42:14.219Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : Always use top-level `import`, never use require or dynamic imports

Applied to files:

  • packages/shared/package.json
  • .gitignore
📚 Learning: 2025-12-03T12:42:26.162Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T12:42:26.162Z
Learning: Applies to **/*.{js,ts,tsx,jsx} : Always use top-level `import`, never use require or dynamic imports

Applied to files:

  • packages/shared/package.json
  • .gitignore
📚 Learning: 2025-12-03T12:42:14.219Z
Learnt from: CR
Repo: theopenco/llmgateway PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-03T12:42:14.219Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : No unnecessary code comments

Applied to files:

  • .gitignore
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
  • GitHub Check: build-split (playground, linux/amd64)
  • GitHub Check: build-split (admin, linux/amd64)
  • GitHub Check: build-split (worker, linux/amd64)
  • GitHub Check: build-split (gateway, linux/amd64)
  • GitHub Check: build-split (docs, linux/amd64)
  • GitHub Check: build-split (ui, linux/amd64)
  • GitHub Check: build-split (api, linux/amd64)
  • GitHub Check: build-unified (linux/amd64)
  • GitHub Check: generate / run
  • GitHub Check: lint / run
  • GitHub Check: test / run
  • GitHub Check: build / run
  • GitHub Check: autofix
  • GitHub Check: e2e-shards (5)
  • GitHub Check: e2e-shards (1)
  • GitHub Check: e2e-shards (3)
  • GitHub Check: e2e-shards (4)
  • GitHub Check: e2e-shards (2)
🔇 Additional comments (4)
.gitignore (1)

3-3: Good addition for TypeScript incremental builds.

Adding *.tsbuildinfo is appropriate—these files are generated by TypeScript's incremental compilation and shouldn't be committed. The placement alongside other generated artifacts is conventional.

.github/workflows/e2e.yml (1)

8-8: LGTM! Appropriate e2e trigger for the shared package.

Adding packages/shared/** to the path triggers ensures e2e tests run when the shared UI package is modified, which is correct since these components are consumed by multiple apps and could affect their behavior.

packages/shared/package.json (2)

11-15: LGTM!

The new ./components export subpath is properly structured with separate type and import paths, following the same pattern as the root export.


61-64: LGTM!

The React type definitions correctly match React 19 and will ensure proper TypeScript support for the shared UI components.

Comment thread packages/shared/package.json
@steebchen
steebchen enabled auto-merge December 17, 2025 21:47
@steebchen
steebchen added this pull request to the merge queue Dec 17, 2025
Merged via the queue into main with commit f926655 Dec 17, 2025
25 of 26 checks passed
@steebchen
steebchen deleted the chore/shared-ui branch December 17, 2025 21:59
@coderabbitai coderabbitai Bot mentioned this pull request Dec 29, 2025
13 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants