import React from "react"; import type { AppId } from "@/lib/api/types"; import type { VisibleApps } from "@/types"; import { ClaudeIcon, CodexIcon, GeminiIcon, OpenClawIcon, } from "@/components/BrandIcons"; import { ProviderIcon } from "@/components/ProviderIcon"; export interface AppConfig { label: string; icon: React.ReactNode; activeClass: string; badgeClass: string; } export const APP_IDS: AppId[] = [ "claude", "claude-desktop", "codex", "gemini", "grokbuild", "opencode", "openclaw", "hermes", "pi", ]; export const DEFAULT_VISIBLE_APPS: VisibleApps = { claude: true, "claude-desktop": true, codex: true, gemini: true, grokbuild: true, opencode: true, openclaw: true, hermes: true, pi: true, }; /** App IDs shown in Skills panels. */ export const SKILLS_APP_IDS: AppId[] = [ "claude", "codex", "gemini", "grokbuild", "opencode", "hermes", "pi", ]; export type ProxyAppId = Extract< AppId, "claude" | "codex" | "gemini" | "grokbuild" | "pi" >; /** Apps with a complete local gateway + failover data plane. */ export const PROXY_APP_IDS: ProxyAppId[] = [ "claude", "codex", "gemini", "grokbuild", "pi", ]; /** Pi has no native MCP registry; do not manufacture a disabled mirror. */ export type McpAppId = Exclude; export const MCP_APP_IDS: McpAppId[] = [ "claude", "codex", "gemini", "grokbuild", "opencode", "hermes", ]; export const APP_ICON_MAP: Record = { claude: { label: "Claude", icon: , activeClass: "bg-orange-500/10 ring-1 ring-orange-500/20 hover:bg-orange-500/20 text-orange-600 dark:text-orange-400", badgeClass: "bg-orange-500/10 text-orange-700 dark:text-orange-300 hover:bg-orange-500/20 border-0 gap-1.5", }, "claude-desktop": { label: "Claude Desktop", icon: , activeClass: "bg-amber-500/10 ring-1 ring-amber-500/20 hover:bg-amber-500/20 text-amber-700 dark:text-amber-300", badgeClass: "bg-amber-500/10 text-amber-700 dark:text-amber-300 hover:bg-amber-500/20 border-0 gap-1.5", }, codex: { label: "Codex", icon: , activeClass: "bg-green-500/10 ring-1 ring-green-500/20 hover:bg-green-500/20 text-green-600 dark:text-green-400", badgeClass: "bg-green-500/10 text-green-700 dark:text-green-300 hover:bg-green-500/20 border-0 gap-1.5", }, gemini: { label: "Gemini", icon: , activeClass: "bg-blue-500/10 ring-1 ring-blue-500/20 hover:bg-blue-500/20 text-blue-600 dark:text-blue-400", badgeClass: "bg-blue-500/10 text-blue-700 dark:text-blue-300 hover:bg-blue-500/20 border-0 gap-1.5", }, grokbuild: { label: "Grok Build", icon: ( ), activeClass: "bg-cyan-500/10 ring-1 ring-cyan-500/20 hover:bg-cyan-500/20 text-cyan-700 dark:text-cyan-300", badgeClass: "bg-cyan-500/10 text-cyan-700 dark:text-cyan-300 hover:bg-cyan-500/20 border-0 gap-1.5", }, opencode: { label: "OpenCode", icon: ( ), activeClass: "bg-indigo-500/10 ring-1 ring-indigo-500/20 hover:bg-indigo-500/20 text-indigo-600 dark:text-indigo-400", badgeClass: "bg-indigo-500/10 text-indigo-700 dark:text-indigo-300 hover:bg-indigo-500/20 border-0 gap-1.5", }, openclaw: { label: "OpenClaw", icon: , activeClass: "bg-rose-500/10 ring-1 ring-rose-500/20 hover:bg-rose-500/20 text-rose-600 dark:text-rose-400", badgeClass: "bg-rose-500/10 text-rose-700 dark:text-rose-300 hover:bg-rose-500/20 border-0 gap-1.5", }, hermes: { label: "Hermes", icon: ( ), activeClass: "bg-violet-500/10 ring-1 ring-violet-500/20 hover:bg-violet-500/20 text-violet-600 dark:text-violet-400", badgeClass: "bg-violet-500/10 text-violet-700 dark:text-violet-300 hover:bg-violet-500/20 border-0 gap-1.5", }, pi: { label: "Pi", icon: , activeClass: "bg-fuchsia-500/10 ring-1 ring-fuchsia-500/20 hover:bg-fuchsia-500/20 text-fuchsia-600 dark:text-fuchsia-400", badgeClass: "bg-fuchsia-500/10 text-fuchsia-700 dark:text-fuchsia-300 hover:bg-fuchsia-500/20 border-0 gap-1.5", }, }; export function getAppLabel(appId: string): string { return APP_ICON_MAP[appId as AppId]?.label ?? appId; }