chore: shared UI package - #1333
Conversation
- 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.
|
Important Review skippedReview was skipped as selected files did not have any reviewable changes. 💤 Files selected but had no reviewable changes (1)
You can disable this status message by setting the WalkthroughAdds a new shared UI/components package ( Changes
Sequence Diagram(s)mermaid Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Points to review closely:
Possibly related PRs
Suggested labels
Suggested reviewers
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 20
🧹 Nitpick comments (17)
packages/shared/src/components/ui/tooltip.tsx (1)
21-29: Consider documenting the nested TooltipProvider pattern.Each
Tooltipcreates its ownTooltipProvider, which overrides any app-level provider settings (likedelayDuration). 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 addingforwardReftoInputGroupInputfor consistency.
InputGroupTextareausesforwardRef(lines 148-164), butInputGroupInputdoes 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
getProviderLogoandgetProviderLogoSmallhelper 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
TabsTriggerclassName (line 45) contains an extremely long string of Tailwind utilities that's difficult to read and maintain. Consider usingcva(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.
Lines 34-43 contain extensive comments discussing implementation decisions. Per coding guidelines, avoid unnecessary code comments.
The
providers.find()lookup on line 33 is redundant—rootProvidersalready containsproviderInfo.
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:orgIdis destructured but unused.The
orgIdparameter 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 authorizationOr simply remove it:
-const { projectId, keyId } = await params; +const { projectId, keyId } = await params;
30-36: Consider usingnotFound()for proper 404 handling.Using Next.js's
notFound()function would provide proper 404 semantics and allow the app'snot-found.tsxto 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-sloton Root has no effect.
HoverCardPrimitive.Rootis a context provider and doesn't render a DOM element, so thedata-slotattribute 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-sloton Portal has no effect.Similarly,
HoverCardPrimitive.Portaldoesn't render a DOM node — only its children are portaled. Thedata-slot="hover-card-portal"won't appear in the DOM.return ( - <HoverCardPrimitive.Portal data-slot="hover-card-portal"> + <HoverCardPrimitive.Portal> <HoverCardPrimitive.Contentapps/ui/src/components/api-keys/iam-rules-client.tsx (3)
146-176: Missing error handling for create mutation.The
createRulemutation only handlesonSuccess. 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
undefinedto 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-slotonDialogPrimitive.Roothas no effect.Same as HoverCard —
Rootis 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-slotonDialogPortalhas 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
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis 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 useanyoras anyunless absolutely necessary in TypeScript code
For database reads: Usedb().query.<table>.findMany()ordb().query.<table>.findFirst()
Files:
packages/shared/src/components/ui/switch.tsxpackages/shared/src/lib/types.tspackages/shared/src/components/ui/separator.tsxpackages/shared/src/components/ui/badge.tsxpackages/shared/src/components/ui/tabs.tsxpackages/shared/src/components/ui/checkbox.tsxpackages/shared/src/components/ui/textarea.tsxapps/ui/src/components/providers/provider-models-grid.tsxpackages/shared/src/lib/utils.tspackages/shared/src/components/index.tsxapps/playground/src/components/playground/chat-header.tsxapps/playground/src/components/playground/group-chat-client.tsxpackages/shared/src/index.tspackages/shared/src/lib/mapmodels.tspackages/shared/src/components/ui/label.tsxapps/ui/src/components/models-supported.tsxpackages/shared/src/components/provider-icons.tsxapps/ui/src/components/models/model-provider-card.tsxapps/ui/src/components/providers/hero.tsxapps/ui/src/components/models/playground-model-selector.tsxpackages/shared/src/components/ui/select.tsxapps/playground/src/components/playground/chat-page-client.tsxapps/ui/src/components/models/provider-card.tsxpackages/shared/src/components/ui/alert.tsxapps/ui/src/components/models/all-models.tsxpackages/shared/src/components/ui/popover.tsxpackages/shared/src/components/multi-provider-selector.tsxapps/ui/src/components/api-keys/iam-rules-client.tsxpackages/shared/src/components/ui/image-zoom.tsxapps/ui/src/components/api-keys/api-keys-list.tsxpackages/shared/src/components/multi-model-selector.tsxpackages/shared/src/components/ui/skeleton.tsxpackages/shared/src/components/ui/tooltip.tsxapps/ui/src/components/models/model-comparison.tsxpackages/shared/src/components/ui/form.tsxapps/ui/src/app/models/[name]/opengraph-image.tsxpackages/shared/src/components/ui/sheet.tsxpackages/shared/src/components/ui/carousel.tsxpackages/shared/src/components/ui/sonner.tsxapps/ui/src/components/api-keys/iam-rules-dialog.tsxpackages/shared/src/components/ui/collapsible.tsxpackages/shared/src/components/ui/index.tsxpackages/shared/src/lib/model-utils.tsapps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsxpackages/shared/src/components/ui/input-group.tsxpackages/shared/src/components/ui/logo.tsxpackages/shared/src/components/ui/dialog.tsxpackages/shared/src/components/ui/avatar.tsxpackages/shared/src/components/ui/scroll-area.tsxpackages/shared/src/components/ui/command.tsxapps/ui/src/components/landing/graph.tsxapps/ui/src/components/models/model-card.tsxapps/ui/src/app/providers/[id]/opengraph-image.tsxpackages/shared/src/hooks/use-mobile.tspackages/shared/src/components/ui/input.tsxapps/ui/src/components/provider-keys/provider-select.tsxapps/ui/src/components/provider-keys/provider-keys-list.tsxpackages/shared/src/components/model-selector.tsxpackages/shared/src/components/ui/button.tsxapps/ui/src/components/landing/hero.tsxpackages/shared/src/components/ui/progress.tsxapps/ui/src/components/shared/model-search.tsxapps/ui/src/components/api-keys/multi-provider-selector.tsxpackages/shared/src/components/ui/hover-card.tsxpackages/shared/src/components/ui/dropdown-menu.tsxpackages/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.tsxpackages/shared/src/lib/types.tspackages/shared/src/components/ui/separator.tsxpackages/shared/src/components/ui/badge.tsxpackages/shared/src/components/ui/tabs.tsxpackages/shared/src/components/ui/checkbox.tsxpackages/shared/src/components/ui/textarea.tsxapps/ui/src/components/providers/provider-models-grid.tsxpackages/shared/src/lib/utils.tspackages/shared/src/components/index.tsxapps/playground/src/components/playground/chat-header.tsxapps/playground/src/components/playground/group-chat-client.tsxpackages/shared/src/index.tspackages/shared/src/lib/mapmodels.tspackages/shared/src/components/ui/label.tsxapps/ui/src/components/models-supported.tsxpackages/shared/src/components/provider-icons.tsxapps/ui/src/components/models/model-provider-card.tsxapps/ui/src/components/providers/hero.tsxapps/ui/src/components/models/playground-model-selector.tsxpackages/shared/src/components/ui/select.tsxapps/playground/src/components/playground/chat-page-client.tsxapps/ui/src/components/models/provider-card.tsxpackages/shared/src/components/ui/alert.tsxapps/ui/src/components/models/all-models.tsxpackages/shared/src/components/ui/popover.tsxpackages/shared/src/components/multi-provider-selector.tsxapps/ui/src/components/api-keys/iam-rules-client.tsxpackages/shared/src/components/ui/image-zoom.tsxapps/ui/src/components/api-keys/api-keys-list.tsxpackages/shared/src/components/multi-model-selector.tsxpackages/shared/package.jsonpackages/shared/src/components/ui/skeleton.tsxpackages/shared/src/components/ui/tooltip.tsxapps/ui/src/components/models/model-comparison.tsxpackages/shared/src/components/ui/form.tsxapps/ui/src/app/models/[name]/opengraph-image.tsxpackages/shared/src/components/ui/sheet.tsxpackages/shared/src/components/ui/carousel.tsxpackages/shared/src/components/ui/sonner.tsxapps/ui/package.jsonapps/ui/src/components/api-keys/iam-rules-dialog.tsxpackages/shared/src/components/ui/collapsible.tsxpackages/shared/src/components/ui/index.tsxpackages/shared/src/lib/model-utils.tsapps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsxpackages/shared/src/components/ui/input-group.tsxpackages/shared/src/components/ui/logo.tsxpackages/shared/src/components/ui/dialog.tsxpackages/shared/src/components/ui/avatar.tsxpackages/shared/src/components/ui/scroll-area.tsxpackages/shared/src/components/ui/command.tsxapps/ui/src/components/landing/graph.tsxapps/playground/package.jsonapps/ui/src/components/models/model-card.tsxapps/ui/src/app/providers/[id]/opengraph-image.tsxpackages/shared/src/hooks/use-mobile.tspackages/shared/src/components/ui/input.tsxapps/ui/src/components/provider-keys/provider-select.tsxpackages/shared/tsconfig.jsonapps/ui/src/components/provider-keys/provider-keys-list.tsxpackages/shared/src/components/model-selector.tsxpackages/shared/src/components/ui/button.tsxapps/ui/src/components/landing/hero.tsxpackages/shared/src/components/ui/progress.tsxapps/ui/src/components/shared/model-search.tsxapps/ui/src/components/api-keys/multi-provider-selector.tsxpackages/shared/src/components/ui/hover-card.tsxpackages/shared/src/components/ui/dropdown-menu.tsxpackages/shared/src/components/ui/sidebar.tsx
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{ts,tsx,js,jsx}: Always use top-levelimport, never use require or dynamic imports
No unnecessary code comments
Files:
packages/shared/src/components/ui/switch.tsxpackages/shared/src/lib/types.tspackages/shared/src/components/ui/separator.tsxpackages/shared/src/components/ui/badge.tsxpackages/shared/src/components/ui/tabs.tsxpackages/shared/src/components/ui/checkbox.tsxpackages/shared/src/components/ui/textarea.tsxapps/ui/src/components/providers/provider-models-grid.tsxpackages/shared/src/lib/utils.tspackages/shared/src/components/index.tsxapps/playground/src/components/playground/chat-header.tsxapps/playground/src/components/playground/group-chat-client.tsxpackages/shared/src/index.tspackages/shared/src/lib/mapmodels.tspackages/shared/src/components/ui/label.tsxapps/ui/src/components/models-supported.tsxpackages/shared/src/components/provider-icons.tsxapps/ui/src/components/models/model-provider-card.tsxapps/ui/src/components/providers/hero.tsxapps/ui/src/components/models/playground-model-selector.tsxpackages/shared/src/components/ui/select.tsxapps/playground/src/components/playground/chat-page-client.tsxapps/ui/src/components/models/provider-card.tsxpackages/shared/src/components/ui/alert.tsxapps/ui/src/components/models/all-models.tsxpackages/shared/src/components/ui/popover.tsxpackages/shared/src/components/multi-provider-selector.tsxapps/ui/src/components/api-keys/iam-rules-client.tsxpackages/shared/src/components/ui/image-zoom.tsxapps/ui/src/components/api-keys/api-keys-list.tsxpackages/shared/src/components/multi-model-selector.tsxpackages/shared/src/components/ui/skeleton.tsxpackages/shared/src/components/ui/tooltip.tsxapps/ui/src/components/models/model-comparison.tsxpackages/shared/src/components/ui/form.tsxapps/ui/src/app/models/[name]/opengraph-image.tsxpackages/shared/src/components/ui/sheet.tsxpackages/shared/src/components/ui/carousel.tsxpackages/shared/src/components/ui/sonner.tsxapps/ui/src/components/api-keys/iam-rules-dialog.tsxpackages/shared/src/components/ui/collapsible.tsxpackages/shared/src/components/ui/index.tsxpackages/shared/src/lib/model-utils.tsapps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsxpackages/shared/src/components/ui/input-group.tsxpackages/shared/src/components/ui/logo.tsxpackages/shared/src/components/ui/dialog.tsxpackages/shared/src/components/ui/avatar.tsxpackages/shared/src/components/ui/scroll-area.tsxpackages/shared/src/components/ui/command.tsxapps/ui/src/components/landing/graph.tsxapps/ui/src/components/models/model-card.tsxapps/ui/src/app/providers/[id]/opengraph-image.tsxpackages/shared/src/hooks/use-mobile.tspackages/shared/src/components/ui/input.tsxapps/ui/src/components/provider-keys/provider-select.tsxapps/ui/src/components/provider-keys/provider-keys-list.tsxpackages/shared/src/components/model-selector.tsxpackages/shared/src/components/ui/button.tsxapps/ui/src/components/landing/hero.tsxpackages/shared/src/components/ui/progress.tsxapps/ui/src/components/shared/model-search.tsxapps/ui/src/components/api-keys/multi-provider-selector.tsxpackages/shared/src/components/ui/hover-card.tsxpackages/shared/src/components/ui/dropdown-menu.tsxpackages/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.tsxpackages/shared/src/lib/types.tspackages/shared/src/components/ui/separator.tsxpackages/shared/src/components/ui/badge.tsxpackages/shared/src/components/ui/tabs.tsxpackages/shared/src/components/ui/checkbox.tsxpackages/shared/src/components/ui/textarea.tsxapps/ui/src/components/providers/provider-models-grid.tsxpackages/shared/src/lib/utils.tspackages/shared/src/components/index.tsxapps/playground/src/components/playground/chat-header.tsxapps/playground/src/components/playground/group-chat-client.tsxpackages/shared/src/index.tspackages/shared/src/lib/mapmodels.tspackages/shared/src/components/ui/label.tsxapps/ui/src/components/models-supported.tsxpackages/shared/src/components/provider-icons.tsxapps/ui/src/components/models/model-provider-card.tsxapps/ui/src/components/providers/hero.tsxapps/ui/src/components/models/playground-model-selector.tsxpackages/shared/src/components/ui/select.tsxapps/playground/src/components/playground/chat-page-client.tsxapps/ui/src/components/models/provider-card.tsxpackages/shared/src/components/ui/alert.tsxapps/ui/src/components/models/all-models.tsxpackages/shared/src/components/ui/popover.tsxpackages/shared/src/components/multi-provider-selector.tsxapps/ui/src/components/api-keys/iam-rules-client.tsxpackages/shared/src/components/ui/image-zoom.tsxapps/ui/src/components/api-keys/api-keys-list.tsxpackages/shared/src/components/multi-model-selector.tsxpackages/shared/src/components/ui/skeleton.tsxpackages/shared/src/components/ui/tooltip.tsxapps/ui/src/components/models/model-comparison.tsxpackages/shared/src/components/ui/form.tsxapps/ui/src/app/models/[name]/opengraph-image.tsxpackages/shared/src/components/ui/sheet.tsxpackages/shared/src/components/ui/carousel.tsxpackages/shared/src/components/ui/sonner.tsxapps/ui/src/components/api-keys/iam-rules-dialog.tsxpackages/shared/src/components/ui/collapsible.tsxpackages/shared/src/components/ui/index.tsxpackages/shared/src/lib/model-utils.tsapps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsxpackages/shared/src/components/ui/input-group.tsxpackages/shared/src/components/ui/logo.tsxpackages/shared/src/components/ui/dialog.tsxpackages/shared/src/components/ui/avatar.tsxpackages/shared/src/components/ui/scroll-area.tsxpackages/shared/src/components/ui/command.tsxapps/ui/src/components/landing/graph.tsxapps/ui/src/components/models/model-card.tsxapps/ui/src/app/providers/[id]/opengraph-image.tsxpackages/shared/src/hooks/use-mobile.tspackages/shared/src/components/ui/input.tsxapps/ui/src/components/provider-keys/provider-select.tsxapps/ui/src/components/provider-keys/provider-keys-list.tsxpackages/shared/src/components/model-selector.tsxpackages/shared/src/components/ui/button.tsxapps/ui/src/components/landing/hero.tsxpackages/shared/src/components/ui/progress.tsxapps/ui/src/components/shared/model-search.tsxapps/ui/src/components/api-keys/multi-provider-selector.tsxpackages/shared/src/components/ui/hover-card.tsxpackages/shared/src/components/ui/dropdown-menu.tsxpackages/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 developmentUse cookies for user-settings which are not saved in the database to ensure SSR works
Files:
apps/ui/src/components/providers/provider-models-grid.tsxapps/playground/src/components/playground/chat-header.tsxapps/playground/src/components/playground/group-chat-client.tsxapps/ui/src/components/models-supported.tsxapps/ui/src/components/models/model-provider-card.tsxapps/ui/src/components/providers/hero.tsxapps/ui/src/components/models/playground-model-selector.tsxapps/playground/src/components/playground/chat-page-client.tsxapps/ui/src/components/models/provider-card.tsxapps/ui/src/components/models/all-models.tsxapps/ui/src/components/api-keys/iam-rules-client.tsxapps/ui/src/components/api-keys/api-keys-list.tsxapps/ui/src/components/models/model-comparison.tsxapps/ui/src/app/models/[name]/opengraph-image.tsxapps/ui/src/components/api-keys/iam-rules-dialog.tsxapps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsxapps/ui/src/components/landing/graph.tsxapps/ui/src/components/models/model-card.tsxapps/ui/src/app/providers/[id]/opengraph-image.tsxapps/ui/src/components/provider-keys/provider-select.tsxapps/ui/src/components/provider-keys/provider-keys-list.tsxapps/ui/src/components/landing/hero.tsxapps/ui/src/components/shared/model-search.tsxapps/ui/src/components/api-keys/multi-provider-selector.tsx
apps/{ui,playground,docs}/**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
Use
next/linkfor links andnext/navigation's router for programmatic navigation
Files:
apps/ui/src/components/providers/provider-models-grid.tsxapps/playground/src/components/playground/chat-header.tsxapps/playground/src/components/playground/group-chat-client.tsxapps/ui/src/components/models-supported.tsxapps/ui/src/components/models/model-provider-card.tsxapps/ui/src/components/providers/hero.tsxapps/ui/src/components/models/playground-model-selector.tsxapps/playground/src/components/playground/chat-page-client.tsxapps/ui/src/components/models/provider-card.tsxapps/ui/src/components/models/all-models.tsxapps/ui/src/components/api-keys/iam-rules-client.tsxapps/ui/src/components/api-keys/api-keys-list.tsxapps/ui/src/components/models/model-comparison.tsxapps/ui/src/app/models/[name]/opengraph-image.tsxapps/ui/src/components/api-keys/iam-rules-dialog.tsxapps/ui/src/app/dashboard/[orgId]/[projectId]/api-keys/[keyId]/iam/page.tsxapps/ui/src/components/landing/graph.tsxapps/ui/src/components/models/model-card.tsxapps/ui/src/app/providers/[id]/opengraph-image.tsxapps/ui/src/components/provider-keys/provider-select.tsxapps/ui/src/components/provider-keys/provider-keys-list.tsxapps/ui/src/components/landing/hero.tsxapps/ui/src/components/shared/model-search.tsxapps/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.tsxpackages/shared/src/components/ui/separator.tsxpackages/shared/src/components/ui/tabs.tsxapps/playground/src/components/playground/group-chat-client.tsxapps/ui/src/components/api-keys/api-keys-list.tsxapps/ui/src/components/models/model-comparison.tsxpackages/shared/src/components/ui/carousel.tsxpackages/shared/src/components/ui/scroll-area.tsxpackages/shared/src/components/ui/hover-card.tsxpackages/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.tsxapps/ui/src/components/api-keys/api-keys-list.tsxapps/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.tsxapps/ui/src/components/api-keys/api-keys-list.tsxapps/ui/src/components/models/model-comparison.tsxpackages/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.jsonpackages/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.
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
packages/shared/tsconfig.json (1)
8-8: Consider disablingallowJsfor 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
📒 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
rootDirdirectly 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:
libincludes necessary DOM and ESNext typesstrictmode enabled for better type safetydeclarationgenerates type definitions (essential for a shared package)jsx: "react-jsx"uses the modern React transformisolatedModulesandincrementaloptimize build performance- Include/exclude patterns correctly scope the package
Also applies to: 9-18, 24-25
13-13: VerifymoduleResolution: "bundler"is compatible with your build setup.The
bundleroption 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.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
packages/shared/package.json (1)
23-23: Consider cross-platform compatibility for the build script.The
rm -rfcommand is Unix-specific and may fail on Windows systems without Git Bash or WSL. Consider using a cross-platform alternative likerimrafor the newer Node.js nativefs.rmAPI.Example using
rimraf:- "build": "rm -rf dist tsconfig.tsbuildinfo && tsc && resolve-tspaths", + "build": "rimraf dist tsconfig.tsbuildinfo && tsc && resolve-tspaths",(Requires adding
rimrafto devDependencies)
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 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
*.tsbuildinfois 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
./componentsexport 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.
Summary by CodeRabbit
New Features
Improvements
✏️ Tip: You can customize this high-level summary in your review settings.