diff --git a/ui/src/components/AppConnectionSidebar.tsx b/ui/src/components/AppConnectionSidebar.tsx
index 7b6ec27d465..adc50eef97f 100644
--- a/ui/src/components/AppConnectionSidebar.tsx
+++ b/ui/src/components/AppConnectionSidebar.tsx
@@ -1,7 +1,7 @@
import { ChevronLeft } from "lucide-react";
import { useQuery } from "@tanstack/react-query";
import { humanizeConnectionDisplayName } from "@paperclipai/shared";
-import type { AppDefinition, ToolApplication, ToolConnection } from "@paperclipai/shared";
+import type { ToolApplication, ToolConnection } from "@paperclipai/shared";
import { Link } from "@/lib/router";
import { toolsApi } from "@/api/tools";
import { useCompany } from "@/context/CompanyContext";
@@ -15,6 +15,12 @@ import {
type AppTabKey,
} from "@/pages/apps/app-tabs";
import { AppLogo } from "@/pages/apps/AppLogo";
+import {
+ appDefinitionLogoUrl,
+ appDefinitionName,
+ appDefinitionSlug,
+ type AppGalleryDisplayEntry,
+} from "@/pages/apps/app-definition-display";
import { SidebarNavItem } from "./SidebarNavItem";
type AppDetailSidebarProps =
@@ -61,7 +67,11 @@ export function AppDetailSidebar(props: AppDetailSidebarProps) {
: [];
const previousConnection = latestArchivedConnection(appConnections);
const appName = connection ? humanizeConnectionDisplayName(connection) : application?.name ?? "App";
- const logoEntry = galleryEntryFor(galleryQuery.data?.apps ?? [], connection, application ?? undefined);
+ const logoEntry = galleryEntryFor(
+ (galleryQuery.data?.apps ?? []) as AppGalleryDisplayEntry[],
+ connection,
+ application ?? undefined,
+ );
const reviewConnectionId = connection?.id ?? previousConnection?.id ?? null;
const attentionItem = reviewConnectionId
? attentionQuery.data?.apps.find((app) => app.connection.id === reviewConnectionId)
@@ -83,7 +93,7 @@ export function AppDetailSidebar(props: AppDetailSidebarProps) {
All apps
@@ -117,17 +127,19 @@ function tabHref(props: AppDetailSidebarProps, tab: AppTabKey): string {
}
function galleryEntryFor(
- apps: AppDefinition[],
+ apps: AppGalleryDisplayEntry[],
connection: ToolConnection | undefined,
application: ToolApplication | undefined,
-): AppDefinition | null {
+): AppGalleryDisplayEntry | null {
if (application?.applicationKey) {
- const keyed = apps.find((app) => app.slug === application.applicationKey);
+ const keyed = apps.find((app) => appDefinitionSlug(app) === application.applicationKey);
if (keyed) return keyed;
}
const name = (connection?.name ?? application?.name)?.toLowerCase();
if (!name) return null;
- return apps.find((app) => app.name.toLowerCase() === name) ?? apps.find((app) => app.slug === name) ?? null;
+ return apps.find((app) => appDefinitionName(app).toLowerCase() === name) ??
+ apps.find((app) => appDefinitionSlug(app) === name) ??
+ null;
}
function latestArchivedConnection(connections: ToolConnection[]): ToolConnection | null {
diff --git a/ui/src/pages/apps/AppDetail.tsx b/ui/src/pages/apps/AppDetail.tsx
index 758e96c6447..010311c37af 100644
--- a/ui/src/pages/apps/AppDetail.tsx
+++ b/ui/src/pages/apps/AppDetail.tsx
@@ -2,7 +2,6 @@ import { useEffect, useMemo, useState } from "react";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { Check, Loader2, Pencil } from "lucide-react";
import type {
- AppDefinition,
ToolConnection,
ToolPolicy,
ToolProfileWithDetails,
@@ -28,6 +27,12 @@ import { Input } from "@/components/ui/input";
import { Skeleton } from "@/components/ui/skeleton";
import { cn } from "@/lib/utils";
import { AppLogo } from "./AppLogo";
+import {
+ appDefinitionLogoUrl,
+ appDefinitionName,
+ appDefinitionSlug,
+ type AppGalleryDisplayEntry,
+} from "./app-definition-display";
import { appTabHref, appTabLabel, isAppTabKey, type AppTabKey } from "./app-tabs";
import { SetupPanel } from "./app-detail/SetupPanel";
import { PermissionsPanel } from "./app-detail/PermissionsPanel";
@@ -147,7 +152,7 @@ export function AppDetail() {
return labels;
}, [userDirectoryQuery.data, sessionQuery.data]);
const logoEntry = useMemo(
- () => galleryEntryFor(galleryQuery.data?.apps ?? [], connection),
+ () => galleryEntryFor((galleryQuery.data?.apps ?? []) as AppGalleryDisplayEntry[], connection),
[galleryQuery.data, connection],
);
@@ -479,7 +484,7 @@ function AppDetailHeader({
}: {
appName: string;
connection: ToolConnection;
- logoEntry: AppDefinition | null;
+ logoEntry: AppGalleryDisplayEntry | null;
status: StatusInfo;
actionCount: number;
renaming: boolean;
@@ -493,7 +498,7 @@ function AppDetailHeader({
return (