@samanhappy/mcphub 0.12.17 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.fr.md +7 -5
- package/README.md +24 -4
- package/README.zh.md +25 -4
- package/bin/cli.js +64 -50
- package/dist/cli/call-arguments.js +81 -0
- package/dist/cli/call-arguments.js.map +1 -0
- package/dist/cli/commands/call.js +75 -0
- package/dist/cli/commands/call.js.map +1 -0
- package/dist/cli/commands/config.js +132 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/discover.js +127 -0
- package/dist/cli/commands/discover.js.map +1 -0
- package/dist/cli/commands/export.js +20 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/groups.js +107 -0
- package/dist/cli/commands/groups.js.map +1 -0
- package/dist/cli/commands/install.js +173 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/keys.js +91 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cli/commands/login.js +70 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/servers.js +142 -0
- package/dist/cli/commands/servers.js.map +1 -0
- package/dist/cli/commands/tools.js +162 -0
- package/dist/cli/commands/tools.js.map +1 -0
- package/dist/cli/context.js +44 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/errors.js +19 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/help.js +157 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/http.js +93 -0
- package/dist/cli/http.js.map +1 -0
- package/dist/cli/main.js +81 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.js +47 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parse-args.js +103 -0
- package/dist/cli/parse-args.js.map +1 -0
- package/dist/cli/profile.js +109 -0
- package/dist/cli/profile.js.map +1 -0
- package/dist/cli/prompts.js +56 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/controllers/oauthServerController.js +37 -1
- package/dist/controllers/oauthServerController.js.map +1 -1
- package/dist/dao/ServerDaoDbImpl.js +3 -0
- package/dist/dao/ServerDaoDbImpl.js.map +1 -1
- package/dist/db/connection.js +48 -4
- package/dist/db/connection.js.map +1 -1
- package/dist/db/entities/Server.js +4 -0
- package/dist/db/entities/Server.js.map +1 -1
- package/dist/db/entities/VectorEmbedding.js +2 -5
- package/dist/db/entities/VectorEmbedding.js.map +1 -1
- package/dist/db/repositories/VectorEmbeddingRepository.js +100 -34
- package/dist/db/repositories/VectorEmbeddingRepository.js.map +1 -1
- package/dist/services/dataService.js +10 -1
- package/dist/services/dataService.js.map +1 -1
- package/dist/services/mcpService.js +47 -10
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/sseService.js +5 -3
- package/dist/services/sseService.js.map +1 -1
- package/dist/services/vectorSearchService.js +16 -3
- package/dist/services/vectorSearchService.js.map +1 -1
- package/dist/utils/migration.js +1 -0
- package/dist/utils/migration.js.map +1 -1
- package/dist/utils/serverConfigPersistence.js +5 -0
- package/dist/utils/serverConfigPersistence.js.map +1 -1
- package/frontend/dist/assets/ActivityPage-DwzGiMh_.js +2 -0
- package/frontend/dist/assets/ActivityPage-DwzGiMh_.js.map +1 -0
- package/frontend/dist/assets/ConfirmDialog-CxlizGia.js +2 -0
- package/frontend/dist/assets/ConfirmDialog-CxlizGia.js.map +1 -0
- package/frontend/dist/assets/Dashboard-BUCJcvk-.js +2 -0
- package/frontend/dist/assets/Dashboard-BUCJcvk-.js.map +1 -0
- package/frontend/dist/assets/DeleteDialog-DRbWonMu.js +2 -0
- package/frontend/dist/assets/DeleteDialog-DRbWonMu.js.map +1 -0
- package/frontend/dist/assets/EndpointCopy-D5NjDdYi.js +2 -0
- package/frontend/dist/assets/EndpointCopy-D5NjDdYi.js.map +1 -0
- package/frontend/dist/assets/GroupsPage-DfLlww4U.js +33 -0
- package/frontend/dist/assets/GroupsPage-DfLlww4U.js.map +1 -0
- package/frontend/dist/assets/LoginPage-DCjqYw_8.js +2 -0
- package/frontend/dist/assets/LoginPage-DCjqYw_8.js.map +1 -0
- package/frontend/dist/assets/LogsPage-CTa8kuDf.js +2 -0
- package/frontend/dist/assets/LogsPage-CTa8kuDf.js.map +1 -0
- package/frontend/dist/assets/MarketPage-C2Rh4WJB.js +3 -0
- package/frontend/dist/assets/MarketPage-C2Rh4WJB.js.map +1 -0
- package/frontend/dist/assets/{Pagination-y-gVO8ms.js → Pagination-BFi-X7qY.js} +2 -2
- package/frontend/dist/assets/{Pagination-y-gVO8ms.js.map → Pagination-BFi-X7qY.js.map} +1 -1
- package/frontend/dist/assets/PromptsPage-Dh3qjX3x.js +2 -0
- package/frontend/dist/assets/PromptsPage-Dh3qjX3x.js.map +1 -0
- package/frontend/dist/assets/ResourcesPage-Bc5ZpCIh.js +2 -0
- package/frontend/dist/assets/ResourcesPage-Bc5ZpCIh.js.map +1 -0
- package/frontend/dist/assets/ServersPage-hgCbCglG.js +37 -0
- package/frontend/dist/assets/ServersPage-hgCbCglG.js.map +1 -0
- package/frontend/dist/assets/SettingsPage-BzNX8mXv.js +12 -0
- package/frontend/dist/assets/SettingsPage-BzNX8mXv.js.map +1 -0
- package/frontend/dist/assets/StatusDot-CQzailBQ.js +2 -0
- package/frontend/dist/assets/StatusDot-CQzailBQ.js.map +1 -0
- package/frontend/dist/assets/{ToggleGroup-HfxdlkGi.js → ToggleGroup-CNBBvo3C.js} +2 -2
- package/frontend/dist/assets/{ToggleGroup-HfxdlkGi.js.map → ToggleGroup-CNBBvo3C.js.map} +1 -1
- package/frontend/dist/assets/UsersPage-C33b7LCM.js +2 -0
- package/frontend/dist/assets/UsersPage-C33b7LCM.js.map +1 -0
- package/frontend/dist/assets/{framework-vendor-_OBebcuv.js → framework-vendor-BUhDPOUZ.js} +2 -2
- package/frontend/dist/assets/{framework-vendor-_OBebcuv.js.map → framework-vendor-BUhDPOUZ.js.map} +1 -1
- package/frontend/dist/assets/{i18n-vendor-MQ921plD.js → i18n-vendor-Kbr87Ofu.js} +2 -2
- package/frontend/dist/assets/{i18n-vendor-MQ921plD.js.map → i18n-vendor-Kbr87Ofu.js.map} +1 -1
- package/frontend/dist/assets/icons-vendor-CKgJB3SC.js +292 -0
- package/frontend/dist/assets/icons-vendor-CKgJB3SC.js.map +1 -0
- package/frontend/dist/assets/index-BGiKkKzj.js +3 -0
- package/frontend/dist/assets/index-BGiKkKzj.js.map +1 -0
- package/frontend/dist/assets/index-D0OIBhmN.css +1 -0
- package/frontend/dist/assets/{resourceService-BfCTSBsr.js → resourceService-C6umWRgq.js} +2 -2
- package/frontend/dist/assets/{resourceService-BfCTSBsr.js.map → resourceService-C6umWRgq.js.map} +1 -1
- package/frontend/dist/assets/useServerData-P5In98R4.js +2 -0
- package/frontend/dist/assets/{useServerData-QZqQTYcv.js.map → useServerData-P5In98R4.js.map} +1 -1
- package/frontend/dist/assets/useSettingsData-Cz7vKGLE.js +2 -0
- package/frontend/dist/assets/{useSettingsData-D3VROqS7.js.map → useSettingsData-Cz7vKGLE.js.map} +1 -1
- package/frontend/dist/assets/variableDetection-DsYuiOB_.js +16 -0
- package/frontend/dist/assets/variableDetection-DsYuiOB_.js.map +1 -0
- package/frontend/dist/index.html +5 -5
- package/package.json +2 -1
- package/frontend/dist/assets/ActivityPage-ClgKeihP.js +0 -2
- package/frontend/dist/assets/ActivityPage-ClgKeihP.js.map +0 -1
- package/frontend/dist/assets/Badge-Ck2fhRdl.js +0 -2
- package/frontend/dist/assets/Badge-Ck2fhRdl.js.map +0 -1
- package/frontend/dist/assets/ConfirmDialog-uYjffH4V.js +0 -2
- package/frontend/dist/assets/ConfirmDialog-uYjffH4V.js.map +0 -1
- package/frontend/dist/assets/Dashboard-BIXrLobn.js +0 -2
- package/frontend/dist/assets/Dashboard-BIXrLobn.js.map +0 -1
- package/frontend/dist/assets/DeleteDialog-BAfrV8EB.js +0 -2
- package/frontend/dist/assets/DeleteDialog-BAfrV8EB.js.map +0 -1
- package/frontend/dist/assets/GroupsPage-BjrvyHwu.js +0 -33
- package/frontend/dist/assets/GroupsPage-BjrvyHwu.js.map +0 -1
- package/frontend/dist/assets/LoginPage-BBHt_TfF.js +0 -2
- package/frontend/dist/assets/LoginPage-BBHt_TfF.js.map +0 -1
- package/frontend/dist/assets/LogsPage-D8Znq5NB.js +0 -2
- package/frontend/dist/assets/LogsPage-D8Znq5NB.js.map +0 -1
- package/frontend/dist/assets/MarketPage-haRuzjCw.js +0 -3
- package/frontend/dist/assets/MarketPage-haRuzjCw.js.map +0 -1
- package/frontend/dist/assets/PromptsPage-ByHWPyGe.js +0 -2
- package/frontend/dist/assets/PromptsPage-ByHWPyGe.js.map +0 -1
- package/frontend/dist/assets/ResourcesPage-Bodw5OY9.js +0 -2
- package/frontend/dist/assets/ResourcesPage-Bodw5OY9.js.map +0 -1
- package/frontend/dist/assets/ServersPage-CtS1I4yS.js +0 -37
- package/frontend/dist/assets/ServersPage-CtS1I4yS.js.map +0 -1
- package/frontend/dist/assets/SettingsPage-DxVigf7p.js +0 -12
- package/frontend/dist/assets/SettingsPage-DxVigf7p.js.map +0 -1
- package/frontend/dist/assets/UsersPage-Bipw33cS.js +0 -2
- package/frontend/dist/assets/UsersPage-Bipw33cS.js.map +0 -1
- package/frontend/dist/assets/icons-vendor-B67NtVuR.js +0 -172
- package/frontend/dist/assets/icons-vendor-B67NtVuR.js.map +0 -1
- package/frontend/dist/assets/index-CmnA4an8.js +0 -5
- package/frontend/dist/assets/index-CmnA4an8.js.map +0 -1
- package/frontend/dist/assets/index-DfFHVARX.css +0 -1
- package/frontend/dist/assets/useGroupData-DLhbP6zd.js +0 -2
- package/frontend/dist/assets/useGroupData-DLhbP6zd.js.map +0 -1
- package/frontend/dist/assets/useServerData-QZqQTYcv.js +0 -2
- package/frontend/dist/assets/useSettingsData-D3VROqS7.js +0 -2
- package/frontend/dist/assets/variableDetection-C3Xi21av.js +0 -16
- package/frontend/dist/assets/variableDetection-C3Xi21av.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LoginPage-BBHt_TfF.js","sources":["../../src/components/ui/DefaultPasswordWarningModal.tsx","../../src/pages/LoginPage.tsx"],"sourcesContent":["import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom';\n\ninterface DefaultPasswordWarningModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nconst DefaultPasswordWarningModal: React.FC<DefaultPasswordWarningModalProps> = ({\n isOpen,\n onClose,\n}) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n if (!isOpen) return null;\n\n const handleGoToSettings = () => {\n onClose();\n navigate('/settings');\n // Auto-scroll to password section after a small delay to ensure page is loaded\n setTimeout(() => {\n const passwordSection = document.querySelector('[data-section=\"password\"]');\n if (passwordSection) {\n passwordSection.scrollIntoView({ behavior: 'smooth', block: 'start' });\n // If the section is collapsed, expand it\n const clickTarget = passwordSection.querySelector('[role=\"button\"]');\n if (clickTarget && !passwordSection.querySelector('.mt-4')) {\n (clickTarget as HTMLElement).click();\n }\n }\n }, 100);\n };\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n return (\n <div\n className=\"fixed inset-0 bg-black/50 z-[100] flex items-center justify-center p-4\"\n onClick={handleBackdropClick}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n >\n <div\n className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-md w-full transform transition-all duration-200 ease-out\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"password-warning-title\"\n aria-describedby=\"password-warning-message\"\n >\n <div className=\"p-6\">\n <div className=\"flex items-start space-x-3\">\n <div className=\"flex-shrink-0\">\n <svg\n className=\"w-6 h-6 text-yellow-600 dark:text-yellow-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n </div>\n <div className=\"flex-1\">\n <h3\n id=\"password-warning-title\"\n className=\"text-lg font-medium text-gray-900 dark:text-white mb-2\"\n >\n {t('auth.defaultPasswordWarning')}\n </h3>\n <p\n id=\"password-warning-message\"\n className=\"text-gray-600 dark:text-gray-300 leading-relaxed\"\n >\n {t('auth.defaultPasswordMessage')}\n </p>\n </div>\n </div>\n\n <div className=\"flex justify-end space-x-3 mt-6\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-gray-600 dark:text-gray-300 hover:text-gray-800 dark:hover:text-white hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 rounded-md transition-colors duration-150 btn-secondary\"\n >\n {t('common.cancel')}\n </button>\n <button\n onClick={handleGoToSettings}\n className=\"px-4 py-2 bg-yellow-600 hover:bg-yellow-700 text-white rounded-md transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-yellow-500 btn-warning\"\n autoFocus\n >\n {t('auth.goToSettings')}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default DefaultPasswordWarningModal;\n","import React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { BookOpen } from 'lucide-react';\nimport { useAuth } from '../contexts/AuthContext';\nimport { getToken } from '../services/authService';\nimport { getPublicConfig } from '../services/configService';\nimport { createBetterAuthClient } from '../services/betterAuthClient';\nimport { getBasePath } from '../utils/runtime';\nimport ThemeSwitch from '@/components/ui/ThemeSwitch';\nimport LanguageSwitch from '@/components/ui/LanguageSwitch';\nimport DefaultPasswordWarningModal from '@/components/ui/DefaultPasswordWarningModal';\n\nconst sanitizeReturnUrl = (value: string | null): string | null => {\n if (!value) {\n return null;\n }\n\n try {\n // Support both relative paths and absolute URLs on the same origin\n const origin = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n const url = new URL(value, origin);\n if (url.origin !== origin) {\n return null;\n }\n const relativePath = `${url.pathname}${url.search}${url.hash}`;\n return relativePath || '/';\n } catch {\n if (value.startsWith('/') && !value.startsWith('//')) {\n return value;\n }\n return null;\n }\n};\n\nconst LoginPage: React.FC = () => {\n const { t } = useTranslation();\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [socialLoading, setSocialLoading] = useState<'google' | 'github' | null>(null);\n const [socialError, setSocialError] = useState<string | null>(null);\n const [betterAuthBasePath, setBetterAuthBasePath] = useState<string | undefined>(undefined);\n const [socialProviders, setSocialProviders] = useState({\n google: false,\n github: false,\n });\n const [showDefaultPasswordWarning, setShowDefaultPasswordWarning] = useState(false);\n const { login, auth } = useAuth();\n const location = useLocation();\n const navigate = useNavigate();\n const returnUrl = useMemo(() => {\n const params = new URLSearchParams(location.search);\n return sanitizeReturnUrl(params.get('returnUrl'));\n }, [location.search]);\n\n const isServerUnavailableError = useCallback((message?: string) => {\n if (!message) return false;\n const normalized = message.toLowerCase();\n\n return (\n normalized.includes('failed to fetch') ||\n normalized.includes('networkerror') ||\n normalized.includes('network error') ||\n normalized.includes('connection refused') ||\n normalized.includes('unable to connect') ||\n normalized.includes('fetch error') ||\n normalized.includes('econnrefused') ||\n normalized.includes('http 500') ||\n normalized.includes('internal server error') ||\n normalized.includes('proxy error')\n );\n }, []);\n\n const buildRedirectTarget = useCallback(() => {\n if (!returnUrl) {\n return '/';\n }\n\n // Only attach JWT when returning to the OAuth authorize endpoint\n if (!returnUrl.startsWith('/oauth/authorize')) {\n return returnUrl;\n }\n\n const token = getToken();\n if (!token) {\n return returnUrl;\n }\n\n try {\n const origin = window.location.origin;\n const url = new URL(returnUrl, origin);\n url.searchParams.set('token', token);\n return `${url.pathname}${url.search}${url.hash}`;\n } catch {\n const separator = returnUrl.includes('?') ? '&' : '?';\n return `${returnUrl}${separator}token=${encodeURIComponent(token)}`;\n }\n }, [returnUrl]);\n\n const redirectAfterLogin = useCallback(() => {\n if (returnUrl) {\n window.location.assign(buildRedirectTarget());\n } else {\n navigate('/');\n }\n }, [buildRedirectTarget, navigate, returnUrl]);\n\n useEffect(() => {\n if (!auth.loading && auth.isAuthenticated) {\n redirectAfterLogin();\n }\n }, [auth.isAuthenticated, auth.loading, redirectAfterLogin]);\n\n useEffect(() => {\n const loadAuthProviders = async () => {\n const publicConfig = await getPublicConfig();\n const betterAuth = publicConfig.betterAuth;\n if (!betterAuth?.enabled) {\n setSocialProviders({ google: false, github: false });\n return;\n }\n\n setBetterAuthBasePath(betterAuth.basePath);\n setSocialProviders({\n google: betterAuth.providers?.google?.enabled === true,\n github: betterAuth.providers?.github?.enabled === true,\n });\n };\n\n loadAuthProviders();\n }, []);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSocialError(null);\n setLoading(true);\n\n try {\n if (!username || !password) {\n setError(t('auth.emptyFields'));\n setLoading(false);\n return;\n }\n\n const result = await login(username, password);\n\n if (result.success) {\n if (result.isUsingDefaultPassword) {\n // Show warning modal instead of navigating immediately\n setShowDefaultPasswordWarning(true);\n } else {\n redirectAfterLogin();\n }\n } else {\n const message = result.message;\n if (isServerUnavailableError(message)) {\n setError(t('auth.serverUnavailable'));\n } else {\n setError(t('auth.loginFailed'));\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : undefined;\n if (isServerUnavailableError(message)) {\n setError(t('auth.serverUnavailable'));\n } else {\n setError(t('auth.loginError'));\n }\n } finally {\n setLoading(false);\n }\n };\n\n const handleSocialLogin = async (provider: 'google' | 'github') => {\n setSocialError(null);\n setSocialLoading(provider);\n try {\n const client = createBetterAuthClient(betterAuthBasePath);\n await client.signIn.social({\n provider,\n callbackURL: returnUrl || '/',\n errorCallbackURL: `${getBasePath()}/login`,\n });\n } catch (err) {\n console.error('Social login error:', err);\n setSocialError(t('auth.socialLoginFailed'));\n setSocialLoading(null);\n }\n };\n\n const handleCloseWarning = () => {\n setShowDefaultPasswordWarning(false);\n redirectAfterLogin();\n };\n\n return (\n <div className=\"relative min-h-screen w-full overflow-hidden bg-gray-50 dark:bg-gray-950\">\n {/* Top-right controls */}\n <div className=\"absolute top-4 right-4 z-20 flex items-center gap-2\">\n <a\n href=\"https://docs.mcphub.app\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"rounded-md p-2 text-gray-500 hover:bg-gray-100 dark:bg-gray-800 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-200\"\n aria-label=\"Documentation\"\n >\n <BookOpen className=\"h-5 w-5\" />\n </a>\n <ThemeSwitch />\n <LanguageSwitch />\n </div>\n\n {/* Tech background layer */}\n <div\n className=\"pointer-events-none absolute inset-0 -z-10 opacity-60 dark:opacity-70\"\n style={{\n backgroundImage:\n 'radial-gradient(60rem 60rem at 20% -10%, rgba(99,102,241,0.25), transparent), radial-gradient(50rem 50rem at 120% 10%, rgba(168,85,247,0.15), transparent)',\n }}\n />\n <div className=\"pointer-events-none absolute inset-0 -z-10\">\n <svg\n className=\"h-full w-full opacity-[0.08] dark:opacity-[0.12]\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <pattern id=\"grid\" width=\"32\" height=\"32\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M 32 0 L 0 0 0 32\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"0.5\" />\n </pattern>\n </defs>\n <rect\n width=\"100%\"\n height=\"100%\"\n fill=\"url(#grid)\"\n className=\"text-gray-400 dark:text-gray-300\"\n />\n </svg>\n </div>\n\n {/* Main content */}\n <div className=\"relative mx-auto flex min-h-screen w-full max-w-md items-center justify-center px-6 py-16\">\n <div className=\"w-full space-y-16\">\n {/* Centered slogan */}\n <div className=\"flex justify-center w-full\">\n <h1 className=\"text-5xl sm:text-5xl font-extrabold leading-tight tracking-tight text-gray-900 dark:text-white whitespace-nowrap\">\n <span className=\"bg-gradient-to-r from-indigo-400 via-cyan-400 to-emerald-400 bg-clip-text text-transparent\">\n {t('auth.slogan')}\n </span>\n </h1>\n </div>\n\n {/* Centered login card */}\n <div className=\"login-card relative w-full rounded-2xl border border-white/10 bg-white/60 p-8 shadow-xl backdrop-blur-md transition dark:border-white/10 dark:bg-gray-900/60\">\n <div className=\"absolute -top-24 right-12 h-40 w-40 -translate-y-6 rounded-full bg-indigo-500/30 blur-3xl\" />\n <div className=\"absolute -bottom-24 -left-12 h-40 w-40 translate-y-6 rounded-full bg-cyan-500/20 blur-3xl\" />\n <form className=\"mt-4 space-y-4\" onSubmit={handleSubmit}>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"username\" className=\"sr-only\">\n {t('auth.username')}\n </label>\n <input\n id=\"username\"\n name=\"username\"\n type=\"text\"\n autoComplete=\"username\"\n required\n className=\"login-input appearance-none relative block w-full rounded-md border border-gray-300/60 bg-white/70 px-3 py-3 text-gray-900 shadow-sm outline-none ring-0 transition-all placeholder:text-gray-500 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500 dark:border-gray-700/60 dark:bg-gray-800/70 dark:text-white dark:placeholder:text-gray-400\"\n placeholder={t('auth.username')}\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n />\n </div>\n <div>\n <label htmlFor=\"password\" className=\"sr-only\">\n {t('auth.password')}\n </label>\n <input\n id=\"password\"\n name=\"password\"\n type=\"password\"\n autoComplete=\"current-password\"\n required\n className=\"login-input appearance-none relative block w-full rounded-md border border-gray-300/60 bg-white/70 px-3 py-3 text-gray-900 shadow-sm outline-none ring-0 transition-all placeholder:text-gray-500 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500 dark:border-gray-700/60 dark:bg-gray-800/70 dark:text-white dark:placeholder:text-gray-400\"\n placeholder={t('auth.password')}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n </div>\n </div>\n\n {error && (\n <div className=\"error-box rounded border border-red-500/20 bg-red-500/10 p-2 text-center text-sm text-red-600 dark:text-red-400\">\n {error}\n </div>\n )}\n\n <div>\n <button\n type=\"submit\"\n disabled={loading}\n className=\"login-button btn-primary group relative flex w-full items-center justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white transition-all hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-70\"\n >\n {loading ? t('auth.loggingIn') : t('auth.login')}\n </button>\n </div>\n </form>\n\n {(socialProviders.google || socialProviders.github) && (\n <div className=\"mt-6 space-y-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-px flex-1 bg-gray-200/80 dark:bg-gray-700/80\" />\n <span className=\"text-xs uppercase tracking-widest text-gray-500 dark:text-gray-400\">\n {t('auth.orContinue')}\n </span>\n <div className=\"h-px flex-1 bg-gray-200/80 dark:bg-gray-700/80\" />\n </div>\n\n {socialError && (\n <div className=\"error-box rounded border border-red-500/20 bg-red-500/10 p-2 text-center text-sm text-red-600 dark:text-red-400\">\n {socialError}\n </div>\n )}\n\n <div className=\"space-y-3\">\n {socialProviders.google && (\n <button\n type=\"button\"\n onClick={() => handleSocialLogin('google')}\n disabled={socialLoading !== null}\n className=\"flex w-full items-center justify-center gap-2 rounded-md border border-gray-200 bg-white/80 px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition hover:bg-gray-50 dark:hover:bg-gray-700 disabled:cursor-not-allowed disabled:opacity-70 dark:border-gray-700 dark:bg-gray-900/70 dark:text-gray-200\"\n >\n {socialLoading === 'google' ? t('auth.loggingIn') : t('auth.loginWithGoogle')}\n </button>\n )}\n {socialProviders.github && (\n <button\n type=\"button\"\n onClick={() => handleSocialLogin('github')}\n disabled={socialLoading !== null}\n className=\"flex w-full items-center justify-center gap-2 rounded-md border border-gray-200 bg-gray-900 px-4 py-2 text-sm font-medium text-white shadow-sm transition hover:bg-gray-800 disabled:cursor-not-allowed disabled:opacity-70 dark:border-gray-700\"\n >\n {socialLoading === 'github' ? t('auth.loggingIn') : t('auth.loginWithGithub')}\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Default Password Warning Modal */}\n <DefaultPasswordWarningModal\n isOpen={showDefaultPasswordWarning}\n onClose={handleCloseWarning}\n />\n </div>\n );\n};\n\nexport default LoginPage;\n"],"names":["DefaultPasswordWarningModal","isOpen","onClose","t","useTranslation","navigate","useNavigate","handleGoToSettings","passwordSection","clickTarget","handleBackdropClick","e","handleKeyDown","jsx","jsxs","sanitizeReturnUrl","value","origin","url","LoginPage","username","setUsername","useState","password","setPassword","error","setError","loading","setLoading","socialLoading","setSocialLoading","socialError","setSocialError","betterAuthBasePath","setBetterAuthBasePath","socialProviders","setSocialProviders","showDefaultPasswordWarning","setShowDefaultPasswordWarning","login","auth","useAuth","location","useLocation","returnUrl","useMemo","params","isServerUnavailableError","useCallback","message","normalized","buildRedirectTarget","token","getToken","separator","redirectAfterLogin","useEffect","betterAuth","getPublicConfig","_b","_a","_d","_c","handleSubmit","result","err","handleSocialLogin","provider","createBetterAuthClient","getBasePath","handleCloseWarning","BookOpen","ThemeSwitch","LanguageSwitch"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as o,j as r}from"./framework-vendor-_OBebcuv.js";import{l as C,p as E}from"./index-CmnA4an8.js";import{B as w}from"./Badge-Ck2fhRdl.js";import{u as k}from"./i18n-vendor-MQ921plD.js";import"./icons-vendor-B67NtVuR.js";function S(s,n){if(typeof s=="function")return s(n);s!=null&&(s.current=n)}function R(...s){return n=>{let a=!1;const l=s.map(e=>{const i=S(e,n);return!a&&typeof i=="function"&&(a=!0),i});if(a)return()=>{for(let e=0;e<l.length;e++){const i=l[e];typeof i=="function"?i():S(s[e],null)}}}}function T(s){const n=F(s),a=o.forwardRef((l,e)=>{const{children:i,...c}=l,d=o.Children.toArray(i),u=d.find(P);if(u){const p=u.props.children,m=d.map(g=>g===u?o.Children.count(p)>1?o.Children.only(null):o.isValidElement(p)?p.props.children:null:g);return r.jsx(n,{...c,ref:e,children:o.isValidElement(p)?o.cloneElement(p,void 0,m):null})}return r.jsx(n,{...c,ref:e,children:i})});return a.displayName=`${s}.Slot`,a}var $=T("Slot");function F(s){const n=o.forwardRef((a,l)=>{const{children:e,...i}=a;if(o.isValidElement(e)){const c=A(e),d=V(i,e.props);return e.type!==o.Fragment&&(d.ref=l?R(l,c):c),o.cloneElement(e,d)}return o.Children.count(e)>1?o.Children.only(null):null});return n.displayName=`${s}.SlotClone`,n}var I=Symbol("radix.slottable");function P(s){return o.isValidElement(s)&&typeof s.type=="function"&&"__radixId"in s.type&&s.type.__radixId===I}function V(s,n){const a={...n};for(const l in n){const e=s[l],i=n[l];/^on[A-Z]/.test(l)?e&&i?a[l]=(...d)=>{const u=i(...d);return e(...d),u}:e&&(a[l]=e):l==="style"?a[l]={...e,...i}:l==="className"&&(a[l]=[e,i].filter(Boolean).join(" "))}return{...s,...a}}function A(s){var l,e;let n=(l=Object.getOwnPropertyDescriptor(s.props,"ref"))==null?void 0:l.get,a=n&&"isReactWarning"in n&&n.isReactWarning;return a?s.ref:(n=(e=Object.getOwnPropertyDescriptor(s,"ref"))==null?void 0:e.get,a=n&&"isReactWarning"in n&&n.isReactWarning,a?s.props.ref:s.props.ref||s.ref)}const B={default:"bg-blue-500 text-white hover:bg-blue-600 focus:ring-blue-500",outline:"border border-gray-300 dark:border-gray-700 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300",ghost:"bg-transparent hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300",link:"bg-transparent underline-offset-4 hover:underline text-blue-500 hover:text-blue-600",destructive:"bg-red-500 text-white hover:bg-red-600 focus:ring-red-500"},W={default:"h-10 py-2 px-4",sm:"h-8 px-3 text-sm",lg:"h-12 px-6",icon:"h-10 w-10 p-0 text-center"};function H({variant:s="default",size:n="default",className:a,disabled:l,loading:e=!1,asChild:i=!1,children:c,onClick:d,...u}){const[p,m]=o.useState(!1),g=e||p,x=async j=>{if(d)try{const h=d(j);h&&typeof h.then=="function"&&(m(!0),await h)}finally{m(!1)}},b=i?$:"button";return r.jsx(b,{className:C("rounded-md inline-flex items-center justify-center font-medium transition-all duration-200 active:scale-95 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none relative",B[s],W[n],a),disabled:l||g,onClick:x,...u,children:i?c:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:C("flex items-center justify-center",g&&"invisible"),children:c}),g&&r.jsx("span",{className:"absolute inset-0 flex items-center justify-center",children:r.jsxs("svg",{className:"animate-spin h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[r.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),r.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]})})]})})}const O=({logs:s,isLoading:n=!1,error:a=null,onClear:l})=>{const{t:e}=k(),i=o.useRef(null),[c,d]=o.useState(!0),[u,p]=o.useState(""),[m,g]=o.useState(["info","error","warn","debug"]),[x,b]=o.useState(["main","child"]);o.useEffect(()=>{c&&i.current&&(i.current.scrollTop=i.current.scrollHeight)},[s,c]);const j=s.filter(t=>{const f=u?t.message.toLowerCase().includes(u.toLowerCase()):!0,y=m.includes(t.type),L=x.includes(t.source);return f&&y&&L}),h=t=>new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),v=t=>{switch(t){case"error":return"bg-red-400/80 text-white";case"warn":return"bg-yellow-400/80 text-gray-900";case"debug":return"bg-purple-400/80 text-white";case"info":return"bg-blue-400/80 text-white";default:return"bg-blue-400/80 text-white"}},N=t=>{switch(t){case"main":return"bg-green-400/80 text-white";case"child":return"bg-orange-400/80 text-white";default:return"bg-gray-400/80 text-white"}};return r.jsxs("div",{className:"flex flex-col h-full",children:[r.jsxs("div",{className:"bg-card p-3 rounded-t-md flex flex-wrap items-center justify-between gap-2",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[r.jsxs("span",{className:"font-semibold text-sm",children:[e("logs.filters"),":"]}),r.jsx("input",{type:"text",placeholder:e("logs.search"),className:"shadow appearance-none border border-gray-200 dark:border-gray-700 rounded py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline form-input",value:u,onChange:t=>p(t.target.value)}),r.jsx("div",{className:"flex gap-1 items-center",children:["debug","info","error","warn"].map(t=>r.jsx(w,{variant:m.includes(t)?"default":"outline",className:`cursor-pointer ${m.includes(t)?v(t):""}`,onClick:()=>{m.includes(t)?g(f=>f.filter(y=>y!==t)):g(f=>[...f,t])},children:t},t))}),r.jsx("div",{className:"flex gap-1 items-center ml-2",children:["main","child"].map(t=>r.jsx(w,{variant:x.includes(t)?"default":"outline",className:`cursor-pointer ${x.includes(t)?N(t):""}`,onClick:()=>{x.includes(t)?b(f=>f.filter(y=>y!==t)):b(f=>[...f,t])},children:e(t==="main"?"logs.mainProcess":"logs.childProcess")},t))})]}),r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsxs("label",{className:"flex items-center gap-1 text-sm",children:[r.jsx("input",{type:"checkbox",checked:c,onChange:()=>d(!c),className:"form-checkbox h-4 w-4"}),e("logs.autoScroll")]}),r.jsx(H,{variant:"outline",size:"sm",onClick:l,className:"btn-secondary",disabled:n||s.length===0,children:e("logs.clearLogs")})]})]}),r.jsx("div",{ref:i,className:"flex-grow p-2 overflow-auto bg-card rounded-b-md font-mono text-sm",style:{maxHeight:"calc(100vh - 300px)"},children:n?r.jsx("div",{className:"flex justify-center items-center h-full",children:r.jsx("span",{children:e("logs.loading")})}):a?r.jsx("div",{className:"text-red-500 p-2",children:a.message}):j.length===0?r.jsx("div",{className:"text-center text-muted-foreground p-8",children:u||m.length<4||x.length<2?e("logs.noMatch"):e("logs.noLogs")}):j.map((t,f)=>r.jsxs("div",{className:`py-1 ${t.type==="error"?"text-red-500":t.type==="warn"?"text-yellow-500":""}`,children:[r.jsxs("span",{className:"text-gray-400",children:["[",h(t.timestamp),"]"]}),r.jsx(w,{className:`ml-2 mr-1 ${v(t.type)}`,children:t.type}),r.jsxs(w,{variant:"default",className:`mr-2 ${N(t.source)}`,children:[t.source==="main"?e("logs.main"):e("logs.child"),t.processId?` (${t.processId})`:""]}),r.jsx("span",{className:"whitespace-pre-wrap",children:t.message})]},`${t.timestamp}-${f}`))})]})},q=()=>{const{t:s}=k(),{logs:n,loading:a,error:l,clearLogs:e}=E();return r.jsxs("div",{className:"container mx-auto p-4",children:[r.jsx("div",{className:"flex justify-between items-center mb-4",children:r.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:s("pages.logs.title")})}),r.jsx("div",{className:"bg-card rounded-md shadow-sm border border-gray-200 dark:border-gray-700 page-card",children:r.jsx(O,{logs:n,isLoading:a,error:l,onClear:e})})]})};export{q as default};
|
|
2
|
-
//# sourceMappingURL=LogsPage-D8Znq5NB.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LogsPage-D8Znq5NB.js","sources":["../../../node_modules/.pnpm/@radix-ui+react-compose-refs@1.1.2_@types+react@19.2.7_react@19.2.1/node_modules/@radix-ui/react-compose-refs/dist/index.mjs","../../../node_modules/.pnpm/@radix-ui+react-slot@1.2.3_@types+react@19.2.7_react@19.2.1/node_modules/@radix-ui/react-slot/dist/index.mjs","../../src/components/ui/Button.tsx","../../src/components/LogViewer.tsx","../../src/pages/LogsPage.tsx"],"sourcesContent":["// packages/react/compose-refs/src/compose-refs.tsx\nimport * as React from \"react\";\nfunction setRef(ref, value) {\n if (typeof ref === \"function\") {\n return ref(value);\n } else if (ref !== null && ref !== void 0) {\n ref.current = value;\n }\n}\nfunction composeRefs(...refs) {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup == \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup == \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\nfunction useComposedRefs(...refs) {\n return React.useCallback(composeRefs(...refs), refs);\n}\nexport {\n composeRefs,\n useComposedRefs\n};\n//# sourceMappingURL=index.mjs.map\n","// src/slot.tsx\nimport * as React from \"react\";\nimport { composeRefs } from \"@radix-ui/react-compose-refs\";\nimport { Fragment as Fragment2, jsx } from \"react/jsx-runtime\";\n// @__NO_SIDE_EFFECTS__\nfunction createSlot(ownerName) {\n const SlotClone = /* @__PURE__ */ createSlotClone(ownerName);\n const Slot2 = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n if (slottable) {\n const newElement = slottable.props.children;\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n if (React.Children.count(newElement) > 1) return React.Children.only(null);\n return React.isValidElement(newElement) ? newElement.props.children : null;\n } else {\n return child;\n }\n });\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: React.isValidElement(newElement) ? React.cloneElement(newElement, void 0, newChildren) : null });\n }\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });\n });\n Slot2.displayName = `${ownerName}.Slot`;\n return Slot2;\n}\nvar Slot = /* @__PURE__ */ createSlot(\"Slot\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlotClone(ownerName) {\n const SlotClone = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const props2 = mergeProps(slotProps, children.props);\n if (children.type !== React.Fragment) {\n props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;\n }\n return React.cloneElement(children, props2);\n }\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n });\n SlotClone.displayName = `${ownerName}.SlotClone`;\n return SlotClone;\n}\nvar SLOTTABLE_IDENTIFIER = Symbol(\"radix.slottable\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlottable(ownerName) {\n const Slottable2 = ({ children }) => {\n return /* @__PURE__ */ jsx(Fragment2, { children });\n };\n Slottable2.displayName = `${ownerName}.Slottable`;\n Slottable2.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable2;\n}\nvar Slottable = /* @__PURE__ */ createSlottable(\"Slottable\");\nfunction isSlottable(child) {\n return React.isValidElement(child) && typeof child.type === \"function\" && \"__radixId\" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;\n}\nfunction mergeProps(slotProps, childProps) {\n const overrideProps = { ...childProps };\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === \"style\") {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === \"className\") {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n }\n }\n return { ...slotProps, ...overrideProps };\n}\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\nexport {\n Slot as Root,\n Slot,\n Slottable,\n createSlot,\n createSlottable\n};\n//# sourceMappingURL=index.mjs.map\n","import React, { useState } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '../../utils/cn';\n\ntype ButtonVariant = 'default' | 'outline' | 'ghost' | 'link' | 'destructive';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n asChild?: boolean;\n loading?: boolean;\n children: React.ReactNode;\n}\n\nconst variantStyles: Record<ButtonVariant, string> = {\n default: 'bg-blue-500 text-white hover:bg-blue-600 focus:ring-blue-500',\n outline: 'border border-gray-300 dark:border-gray-700 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300',\n ghost: 'bg-transparent hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300',\n link: 'bg-transparent underline-offset-4 hover:underline text-blue-500 hover:text-blue-600',\n destructive: 'bg-red-500 text-white hover:bg-red-600 focus:ring-red-500',\n};\n\nconst sizeStyles: Record<ButtonSize, string> = {\n default: 'h-10 py-2 px-4',\n sm: 'h-8 px-3 text-sm',\n lg: 'h-12 px-6',\n icon: 'h-10 w-10 p-0 text-center',\n};\n\nexport function Button({\n variant = 'default',\n size = 'default',\n className,\n disabled,\n loading: externalLoading = false,\n asChild = false,\n children,\n onClick,\n ...props\n}: ButtonProps) {\n const [internalLoading, setInternalLoading] = useState(false);\n const isLoading = externalLoading || internalLoading;\n\n const handleClick = async (e: React.MouseEvent<HTMLButtonElement>) => {\n if (!onClick) return;\n \n try {\n const result = onClick(e);\n if (result && typeof (result as any).then === 'function') {\n setInternalLoading(true);\n await result;\n }\n } finally {\n if (internalLoading) {\n // Need to check if component unmounted?\n // It's a standard pattern, state update on unmounted is no longer an error in React 18+\n }\n setInternalLoading(false);\n }\n };\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n className={cn(\n 'rounded-md inline-flex items-center justify-center font-medium transition-all duration-200 active:scale-95 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none relative',\n variantStyles[variant],\n sizeStyles[size],\n className\n )}\n disabled={disabled || isLoading}\n onClick={handleClick}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n <span className={cn('flex items-center justify-center', isLoading && 'invisible')}>\n {children}\n </span>\n {isLoading && (\n <span className=\"absolute inset-0 flex items-center justify-center\">\n <svg className=\"animate-spin h-5 w-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </span>\n )}\n </>\n )}\n </Comp>\n );\n}","import React, { useEffect, useRef, useState } from 'react';\nimport { LogEntry } from '../services/logService';\nimport { Button } from './ui/Button';\nimport { Badge } from './ui/Badge';\nimport { useTranslation } from 'react-i18next';\n\ninterface LogViewerProps {\n logs: LogEntry[];\n isLoading?: boolean;\n error?: Error | null;\n onClear?: () => void;\n}\n\nconst LogViewer: React.FC<LogViewerProps> = ({ logs, isLoading = false, error = null, onClear }) => {\n const { t } = useTranslation();\n const logContainerRef = useRef<HTMLDivElement>(null);\n const [autoScroll, setAutoScroll] = useState(true);\n const [filter, setFilter] = useState<string>('');\n const [typeFilter, setTypeFilter] = useState<Array<'info' | 'error' | 'warn' | 'debug'>>(['info', 'error', 'warn', 'debug']);\n const [sourceFilter, setSourceFilter] = useState<Array<'main' | 'child'>>(['main', 'child']);\n\n // Auto scroll to bottom when new logs come in if autoScroll is enabled\n useEffect(() => {\n if (autoScroll && logContainerRef.current) {\n logContainerRef.current.scrollTop = logContainerRef.current.scrollHeight;\n }\n }, [logs, autoScroll]);\n\n // Filter logs based on current filter settings\n const filteredLogs = logs.filter(log => {\n const matchesText = filter ? log.message.toLowerCase().includes(filter.toLowerCase()) : true;\n const matchesType = typeFilter.includes(log.type);\n const matchesSource = sourceFilter.includes(log.source as 'main' | 'child');\n return matchesText && matchesType && matchesSource;\n });\n\n // Format timestamp to readable format\n const formatTimestamp = (timestamp: number) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n });\n };\n\n // Get badge color based on log type\n const getLogTypeColor = (type: string) => {\n switch (type) {\n case 'error': return 'bg-red-400/80 text-white';\n case 'warn': return 'bg-yellow-400/80 text-gray-900';\n case 'debug': return 'bg-purple-400/80 text-white';\n case 'info': return 'bg-blue-400/80 text-white';\n default: return 'bg-blue-400/80 text-white';\n }\n };\n\n // Get badge color based on log source\n const getSourceColor = (source: string) => {\n switch (source) {\n case 'main': return 'bg-green-400/80 text-white';\n case 'child': return 'bg-orange-400/80 text-white';\n default: return 'bg-gray-400/80 text-white';\n }\n };\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"bg-card p-3 rounded-t-md flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-semibold text-sm\">{t('logs.filters')}:</span>\n\n {/* Text search filter */}\n <input\n type=\"text\"\n placeholder={t('logs.search')}\n className=\"shadow appearance-none border border-gray-200 dark:border-gray-700 rounded py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline form-input\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n />\n\n {/* Log type filters */}\n <div className=\"flex gap-1 items-center\">\n {(['debug', 'info', 'error', 'warn'] as const).map(type => (\n <Badge\n key={type}\n variant={typeFilter.includes(type) ? 'default' : 'outline'}\n className={`cursor-pointer ${typeFilter.includes(type) ? getLogTypeColor(type) : ''}`}\n onClick={() => {\n if (typeFilter.includes(type)) {\n setTypeFilter(prev => prev.filter(t => t !== type));\n } else {\n setTypeFilter(prev => [...prev, type]);\n }\n }}\n >\n {type}\n </Badge>\n ))}\n </div>\n\n {/* Log source filters */}\n <div className=\"flex gap-1 items-center ml-2\">\n {(['main', 'child'] as const).map(source => (\n <Badge\n key={source}\n variant={sourceFilter.includes(source) ? 'default' : 'outline'}\n className={`cursor-pointer ${sourceFilter.includes(source) ? getSourceColor(source) : ''}`}\n onClick={() => {\n if (sourceFilter.includes(source)) {\n setSourceFilter(prev => prev.filter(s => s !== source));\n } else {\n setSourceFilter(prev => [...prev, source]);\n }\n }}\n >\n {source === 'main' ? t('logs.mainProcess') : t('logs.childProcess')}\n </Badge>\n ))}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <label className=\"flex items-center gap-1 text-sm\">\n <input\n type=\"checkbox\"\n checked={autoScroll}\n onChange={() => setAutoScroll(!autoScroll)}\n className=\"form-checkbox h-4 w-4\"\n />\n {t('logs.autoScroll')}\n </label>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onClear}\n className='btn-secondary'\n disabled={isLoading || logs.length === 0}\n >\n {t('logs.clearLogs')}\n </Button>\n </div>\n </div>\n\n <div\n ref={logContainerRef}\n className=\"flex-grow p-2 overflow-auto bg-card rounded-b-md font-mono text-sm\"\n style={{ maxHeight: 'calc(100vh - 300px)' }}\n >\n {isLoading ? (\n <div className=\"flex justify-center items-center h-full\">\n <span>{t('logs.loading')}</span>\n </div>\n ) : error ? (\n <div className=\"text-red-500 p-2\">\n {error.message}\n </div>\n ) : filteredLogs.length === 0 ? (\n <div className=\"text-center text-muted-foreground p-8\">\n {filter || typeFilter.length < 4 || sourceFilter.length < 2\n ? t('logs.noMatch')\n : t('logs.noLogs')}\n </div>\n ) : (\n filteredLogs.map((log, index) => (\n <div\n key={`${log.timestamp}-${index}`}\n className={`py-1 ${log.type === 'error' ? 'text-red-500' :\n log.type === 'warn' ? 'text-yellow-500' : ''\n }`}\n >\n <span className=\"text-gray-400\">[{formatTimestamp(log.timestamp)}]</span>\n <Badge className={`ml-2 mr-1 ${getLogTypeColor(log.type)}`}>\n {log.type}\n </Badge>\n <Badge\n variant=\"default\"\n className={`mr-2 ${getSourceColor(log.source)}`}\n >\n {log.source === 'main' ? t('logs.main') : t('logs.child')}\n {log.processId ? ` (${log.processId})` : ''}\n </Badge>\n <span className=\"whitespace-pre-wrap\">{log.message}</span>\n </div>\n ))\n )}\n </div>\n </div>\n );\n};\n\nexport default LogViewer;","// filepath: /Users/sunmeng/code/github/mcphub/frontend/src/pages/LogsPage.tsx\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport LogViewer from '../components/LogViewer';\nimport { useLogs } from '../services/logService';\n\nconst LogsPage: React.FC = () => {\n const { t } = useTranslation();\n const { logs, loading, error, clearLogs } = useLogs();\n\n return (\n <div className=\"container mx-auto p-4\">\n <div className=\"flex justify-between items-center mb-4\">\n <h1 className=\"text-2xl font-bold text-gray-900\">{t('pages.logs.title')}</h1>\n </div>\n <div className=\"bg-card rounded-md shadow-sm border border-gray-200 dark:border-gray-700 page-card\">\n <LogViewer\n logs={logs}\n isLoading={loading}\n error={error}\n onClear={clearLogs}\n />\n </div>\n </div>\n );\n};\n\nexport default LogsPage;"],"names":["setRef","ref","value","composeRefs","refs","node","hasCleanup","cleanups","cleanup","i","createSlot","ownerName","SlotClone","createSlotClone","Slot2","React.forwardRef","props","forwardedRef","children","slotProps","childrenArray","React.Children","slottable","isSlottable","newElement","newChildren","child","React.isValidElement","jsx","React.cloneElement","Slot","childrenRef","getElementRef","props2","mergeProps","React.Fragment","SLOTTABLE_IDENTIFIER","childProps","overrideProps","propName","slotPropValue","childPropValue","args","result","element","getter","_a","mayWarn","_b","variantStyles","sizeStyles","Button","variant","size","className","disabled","externalLoading","asChild","onClick","internalLoading","setInternalLoading","useState","isLoading","handleClick","e","Comp","cn","jsxs","Fragment","LogViewer","logs","error","onClear","t","useTranslation","logContainerRef","useRef","autoScroll","setAutoScroll","filter","setFilter","typeFilter","setTypeFilter","sourceFilter","setSourceFilter","useEffect","filteredLogs","log","matchesText","matchesType","matchesSource","formatTimestamp","timestamp","getLogTypeColor","type","getSourceColor","source","Badge","prev","s","index","LogsPage","loading","clearLogs","useLogs"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{r as s,j as e,u as Be,e as tr,h as ar}from"./framework-vendor-_OBebcuv.js";import{i as J,d as ue,h as nr}from"./index-CmnA4an8.js";import{u as le}from"./i18n-vendor-MQ921plD.js";import{S as Ce,d as lr}from"./variableDetection-C3Xi21av.js";import{u as or}from"./useSettingsData-D3VROqS7.js";import{P as ir}from"./Pagination-y-gVO8ms.js";import"./icons-vendor-B67NtVuR.js";const cr=()=>{const{t:r}=le(),[C,f]=s.useState([]),[c,x]=s.useState([]),[g,i]=s.useState([]),[l,j]=s.useState([]),[m,_]=s.useState(""),[D,M]=s.useState(""),[z,O]=s.useState(""),[L,N]=s.useState(!0),[H,S]=s.useState(null),[P,U]=s.useState(null),[Z,T]=s.useState([]),[R,W]=s.useState(1),[A,re]=s.useState(9),[K,y]=s.useState(1),k=s.useCallback(async()=>{try{N(!0);const a=await J("/market/servers");a&&a.success&&Array.isArray(a.data)?(x(a.data),V(a.data,R)):(console.error("Invalid market servers data format",{data:a}),S(r("market.fetchError")))}catch(a){console.error("Error fetching market servers",{err:a}),S(a instanceof Error?a.message:String(a))}finally{N(!1)}},[r]),V=s.useCallback((a,t,u=A)=>{const I=a.length,B=Math.ceil(I/u);y(B);const ee=Math.max(1,Math.min(t,B));ee!==t&&W(ee);const ne=(ee-1)*u,ae=a.slice(ne,ne+u);f(ae)},[A]),te=s.useCallback(a=>{W(a),V(c,a,A)},[c,V,A]),b=s.useCallback(async()=>{try{const a=await J("/market/categories");a&&a.success&&Array.isArray(a.data)?i(a.data):console.error("Invalid categories data format",{data:a})}catch(a){console.error("Error fetching categories",{err:a})}},[]),E=s.useCallback(async()=>{try{const a=await J("/market/tags");a&&a.success&&Array.isArray(a.data)?j(a.data):console.error("Invalid tags data format",{data:a})}catch(a){console.error("Error fetching tags",{err:a})}},[]),w=s.useCallback(async a=>{try{N(!0);const t=await J(`/market/servers/${a}`);return t&&t.success&&t.data?(U(t.data),t.data):(console.error("Invalid market server data format",{name:a,data:t}),S(r("market.serverNotFound")),null)}catch(t){return console.error("Error fetching market server",{name:a,err:t}),S(t instanceof Error?t.message:String(t)),null}finally{N(!1)}},[r]),F=s.useCallback(async a=>{try{if(N(!0),O(a),!a.trim()){k();return}const t=await J(`/market/servers/search?query=${encodeURIComponent(a)}`);t&&t.success&&Array.isArray(t.data)?(x(t.data),W(1),V(t.data,1)):(console.error("Invalid market search results format",{query:a,data:t}),S(r("market.searchError")))}catch(t){console.error("Error searching market servers",{query:a,err:t}),S(t instanceof Error?t.message:String(t))}finally{N(!1)}},[r,c,V,k]),d=s.useCallback(async a=>{try{if(N(!0),_(a),M(""),!a){k();return}const t=await J(`/market/categories/${encodeURIComponent(a)}`);t&&t.success&&Array.isArray(t.data)?(x(t.data),W(1),V(t.data,1)):(console.error("Invalid market category filter results format",{category:a,data:t}),S(r("market.filterError")))}catch(t){console.error("Error filtering market servers by category",{category:a,err:t}),S(t instanceof Error?t.message:String(t))}finally{N(!1)}},[r,k,V]),p=s.useCallback(async a=>{try{if(N(!0),M(a),_(""),!a){k();return}const t=await J(`/market/tags/${encodeURIComponent(a)}`);t&&t.success&&Array.isArray(t.data)?(x(t.data),W(1),V(t.data,1)):(console.error("Invalid market tag filter results format",{tag:a,data:t}),S(r("market.tagFilterError")))}catch(t){console.error("Error filtering market servers by tag",{tag:a,err:t}),S(t instanceof Error?t.message:String(t))}finally{N(!1)}},[r,k,V]),h=s.useCallback(async()=>{try{const a=await J("/servers");if(a&&a.success&&Array.isArray(a.data)){const t=a.data.map(u=>u.name);T(t)}}catch(a){console.error("Error fetching installed servers",{err:a})}},[]),n=s.useCallback(a=>Z.includes(a),[Z]),o=s.useCallback(async(a,t)=>{var u,I;try{const B=(u=a.installations)!=null&&u.npm?"npm":Object.keys(a.installations||{}).length>0?Object.keys(a.installations)[0]:null;if(!B||!((I=a.installations)!=null&&I[B]))return S(r("market.noInstallationMethod")),!1;const ee=a.installations[B],ne={name:a.name,config:t.type==="stdio"?{command:t.command||ee.command||"",args:t.args||ee.args||[],env:{...ee.env,...t.env}}:t},ae=await ue("/servers",ne);if(!ae.success)throw new Error(ae.message||"Failed to install server");return await h(),!0}catch(B){return console.error("Error installing market server",{serverName:a.name,err:B}),S(B instanceof Error?B.message:String(B)),!1}},[r,h]),X=s.useCallback(a=>{re(a),W(1),V(c,1,a)},[c,V]);return s.useEffect(()=>{k(),b(),E(),h()},[k,b,E,h]),{servers:C,allServers:c,categories:g,tags:l,selectedCategory:m,selectedTag:D,searchQuery:z,loading:L,error:H,setError:S,currentServer:P,fetchMarketServers:k,fetchServerByName:w,searchServers:F,filterByCategory:d,filterByTag:p,installServer:o,currentPage:R,totalPages:K,serversPerPage:A,changePage:te,changeServersPerPage:X,isServerInstalled:n}},dr=()=>{const{t:r}=le(),[C,f]=s.useState([]),[c,x]=s.useState([]),[g,i]=s.useState([]),[l,j]=s.useState([]),[m,_]=s.useState(""),[D,M]=s.useState(""),[z,O]=s.useState(""),[L,N]=s.useState(!0),[H,S]=s.useState(null),[P,U]=s.useState(null),[Z,T]=s.useState(1),[R,W]=s.useState(9),[A,re]=s.useState(1),K=s.useCallback(async()=>{try{N(!0);const n=await J("/cloud/servers");n&&n.success&&Array.isArray(n.data)?(x(n.data),y(n.data,Z)):(console.error("Invalid cloud market servers data format",{data:n}),S(r("cloud.fetchError")))}catch(n){console.error("Error fetching cloud market servers",{err:n});const o=n instanceof Error?n.message:String(n);o==="MCPROUTER_API_KEY_NOT_CONFIGURED"||o.toLowerCase().includes("mcprouter api key not configured"),S(o)}finally{N(!1)}},[r]),y=s.useCallback((n,o,X=R)=>{const a=n.length,t=Math.ceil(a/X);re(t);const u=Math.max(1,Math.min(o,t));u!==o&&T(u);const I=(u-1)*X,B=n.slice(I,I+X);f(B)},[R]),k=s.useCallback(n=>{T(n),y(c,n,R)},[c,y,R]),V=s.useCallback(async()=>{try{const n=await J("/cloud/categories");n&&n.success&&Array.isArray(n.data)?i(n.data):console.error("Invalid cloud market categories data format",{data:n})}catch(n){console.error("Error fetching cloud market categories",{err:n})}},[]),te=s.useCallback(async()=>{try{const n=await J("/cloud/tags");n&&n.success&&Array.isArray(n.data)?j(n.data):console.error("Invalid cloud market tags data format",{data:n})}catch(n){console.error("Error fetching cloud market tags",{err:n})}},[]),b=s.useCallback(async n=>{try{N(!0);const o=await J(`/cloud/servers/${n}`);return o&&o.success&&o.data?(U(o.data),o.data):(console.error("Invalid cloud server data format",{name:n,data:o}),S(r("cloud.serverNotFound")),null)}catch(o){console.error("Error fetching cloud server",{name:n,err:o});const X=o instanceof Error?o.message:String(o);return X==="MCPROUTER_API_KEY_NOT_CONFIGURED"||X.toLowerCase().includes("mcprouter api key not configured"),S(X),null}finally{N(!1)}},[r]),E=s.useCallback(async n=>{try{if(N(!0),O(n),!n.trim()){K();return}const o=await J(`/cloud/servers/search?query=${encodeURIComponent(n)}`);o&&o.success&&Array.isArray(o.data)?(x(o.data),T(1),y(o.data,1)):(console.error("Invalid cloud search results format",{query:n,data:o}),S(r("cloud.searchError")))}catch(o){console.error("Error searching cloud servers",{query:n,err:o}),S(o instanceof Error?o.message:String(o))}finally{N(!1)}},[r,c,y,K]),w=s.useCallback(async n=>{try{if(N(!0),_(n),M(""),!n){K();return}const o=await J(`/cloud/categories/${encodeURIComponent(n)}`);o&&o.success&&Array.isArray(o.data)?(x(o.data),T(1),y(o.data,1)):(console.error("Invalid cloud category filter results format",{category:n,data:o}),S(r("cloud.filterError")))}catch(o){console.error("Error filtering cloud servers by category",{category:n,err:o}),S(o instanceof Error?o.message:String(o))}finally{N(!1)}},[r,K,y]),F=s.useCallback(async n=>{try{if(N(!0),M(n),_(""),!n){K();return}const o=await J(`/cloud/tags/${encodeURIComponent(n)}`);o&&o.success&&Array.isArray(o.data)?(x(o.data),T(1),y(o.data,1)):(console.error("Invalid cloud tag filter results format",{tag:n,data:o}),S(r("cloud.tagFilterError")))}catch(o){console.error("Error filtering cloud servers by tag",{tag:n,err:o}),S(o instanceof Error?o.message:String(o))}finally{N(!1)}},[r,K,y]),d=s.useCallback(async n=>{try{const o=await J(`/cloud/servers/${n}/tools`);if(!o.success)throw console.error("Failed to fetch cloud server tools",{serverName:n,data:o}),new Error(o.message||"Failed to fetch cloud server tools");return o&&o.success&&Array.isArray(o.data)?o.data:(console.error("Invalid cloud server tools data format",{serverName:n,data:o}),[])}catch(o){console.error("Error fetching tools for cloud server",{serverName:n,err:o});const X=o instanceof Error?o.message:String(o);if(X==="MCPROUTER_API_KEY_NOT_CONFIGURED"||X.toLowerCase().includes("mcprouter api key not configured"))throw o;return[]}},[]),p=s.useCallback(async(n,o,X)=>{try{const a=await ue(`/cloud/servers/${encodeURIComponent(n)}/tools/${encodeURIComponent(o)}/call`,{arguments:X});if(a&&a.success)return a.data;throw new Error(a.message||"Failed to call tool")}catch(a){throw console.error("Error calling tool on cloud server",{serverName:n,toolName:o,err:a}),a}},[]),h=s.useCallback(n=>{W(n),T(1),y(c,1,n)},[c,y]);return s.useEffect(()=>{K(),V(),te()},[K,V,te]),{servers:C,allServers:c,categories:g,tags:l,selectedCategory:m,selectedTag:D,searchQuery:z,loading:L,error:H,setError:S,currentServer:P,fetchCloudServers:K,fetchServerByName:b,searchServers:E,filterByCategory:w,filterByTag:F,fetchServerTools:d,callServerTool:p,currentPage:Z,totalPages:A,serversPerPage:R,changePage:k,changeServersPerPage:h}},mr=()=>{const{t:r}=le(),[C,f]=s.useState([]),[c,x]=s.useState([]),[g,i]=s.useState(!0),[l,j]=s.useState(null),[m,_]=s.useState(""),[D,M]=s.useState(1),[z,O]=s.useState(9),[L,N]=s.useState(null),[H,S]=s.useState(!1),[P,U]=s.useState([]),[Z]=s.useState(1),T=s.useCallback(async(b,E)=>{try{i(!0),j(null);const w=new URLSearchParams;w.append("limit",z.toString()),b&&w.append("cursor",b);const F=E!==void 0?E:m;F.trim()&&w.append("search",F.trim());const d=await J(`/registry/servers?${w.toString()}`);if(d&&d.success&&d.data){const p=d.data;if(p.servers&&Array.isArray(p.servers)){f(p.servers);const h=p.metadata.count===z&&!!p.metadata.nextCursor;S(h),N(p.metadata.nextCursor||null),x(b?n=>[...n,...p.servers]:p.servers)}else console.error("Invalid registry servers data format",{data:p}),j(r("registry.fetchError"))}else j(r("registry.fetchError"))}catch(w){console.error("Error fetching registry servers",{cursor:b,search:E,err:w});const F=w instanceof Error?w.message:String(w);j(F)}finally{i(!1)}},[r,z]),R=s.useCallback(async()=>{if(!H||!L)return;const b=P[P.length-1]||"";U(E=>[...E,b]),M(E=>E+1),await T(L,m)},[H,L,P,m,T]),W=s.useCallback(async()=>{if(D<=1)return;const b=[...P];b.pop();const E=b[b.length-1];U(b),M(w=>w-1),await T(E||void 0,m)},[D,P,m,T]),A=s.useCallback(async b=>{b!==D&&(b>D&&H?await R():b<D&&D>1&&await W())},[D,H,R,W]),re=s.useCallback(async b=>{O(b),M(1),U([]),x([]),await T(void 0,m)},[m,T]),K=s.useCallback(async b=>{try{i(!0),j(null);const E=encodeURIComponent(b),w=await J(`/registry/servers/versions?serverName=${E}`);if(w&&w.success&&w.data){const F=w.data;return F.servers&&Array.isArray(F.servers)&&F.servers.length>0?F.servers[0]:(console.error("Invalid registry server data format",{serverName:b,data:F}),j(r("registry.serverNotFound")),null)}else return j(r("registry.serverNotFound")),null}catch(E){console.error("Error fetching registry server",{serverName:b,err:E});const w=E instanceof Error?E.message:String(E);return j(w),null}finally{i(!1)}},[r]),y=s.useCallback(async b=>{try{j(null);const E=encodeURIComponent(b),w=await J(`/registry/servers/versions?serverName=${E}`);if(w&&w.success&&w.data){const F=w.data;return F.servers&&Array.isArray(F.servers)?F.servers:(console.error("Invalid registry server versions data format",{serverName:b,data:F}),[])}else return[]}catch(E){console.error("Error fetching versions for registry server",{serverName:b,err:E});const w=E instanceof Error?E.message:String(E);return j(w),[]}},[]),k=s.useCallback(async(b,E)=>{try{j(null);const w=encodeURIComponent(b),F=encodeURIComponent(E),d=await J(`/registry/servers/version?serverName=${w}&version=${F}`);if(d&&d.success&&d.data){const p=d.data;return p&&p.server?p:(console.error("Invalid registry server version data format",{serverName:b,version:E,data:p}),null)}else return null}catch(w){console.error("Error fetching specific registry server version",{serverName:b,version:E,err:w});const F=w instanceof Error?w.message:String(w);return j(F),null}},[]),V=s.useCallback(async b=>{console.log("Searching registry servers",{query:b}),_(b),M(1),U([]),x([]),await T(void 0,b)},[T]),te=s.useCallback(async()=>{_(""),M(1),U([]),x([]),await T(void 0,"")},[T]);return s.useEffect(()=>{T(void 0,m)},[]),{servers:C,allServers:c,loading:g,error:l,setError:j,searchQuery:m,searchServers:V,clearSearch:te,fetchServerByName:K,fetchServerVersions:y,fetchServerVersion:k,currentPage:D,totalPages:Z,hasNextPage:H,hasPreviousPage:D>1,changePage:A,goToNextPage:R,goToPreviousPage:W,serversPerPage:z,changeServersPerPage:re}},ur=({server:r,onClick:C})=>{var j,m,_,D;const{t:f}=le(),c=M=>M.split(" ").map(z=>z.charAt(0)).join("").toUpperCase().slice(0,2),x=()=>{if(!r.tags||r.tags.length===0)return{tagsToShow:[],hasMore:!1,moreCount:0};const M=28,z=P=>P.length+3;let O=0,L=0;const N=[...r.tags].sort((P,U)=>P.length-U.length);for(L=0;L<N.length;L++){const P=z(N[L]);if(O+P>M)break;if(O+=P,L===N.length-1)return{tagsToShow:N,hasMore:!1,moreCount:0}}L===0&&N.length>0&&(L=1);const H=N.length-L,S=3+String(H).length+f("market.moreTags").length;return O+S<=M||L<1?{tagsToShow:N.slice(0,L),hasMore:!0,moreCount:H}:{tagsToShow:N.slice(0,Math.max(1,L-1)),hasMore:!0,moreCount:H+1}},{tagsToShow:g,hasMore:i,moreCount:l}=x();return e.jsxs("div",{className:"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-4 hover:shadow-lg hover:border-blue-400 hover:-translate-y-1 transition-all duration-300 cursor-pointer group relative overflow-hidden h-full flex flex-col",onClick:()=>C(r),children:[e.jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-blue-50/0 to-purple-50/0 group-hover:from-blue-50/30 group-hover:to-purple-50/30 dark:group-hover:from-blue-900/30 dark:group-hover:to-purple-900/30 transition-all duration-300 pointer-events-none"}),e.jsxs("div",{className:"relative z-10 flex-1 flex flex-col",children:[e.jsxs("div",{className:"flex items-start justify-between mb-2",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h3",{className:"text-lg font-bold text-gray-900 group-hover:text-blue-600 transition-colors duration-200 mb-1 line-clamp-1 mr-2",children:r.display_name}),e.jsxs("div",{className:"flex items-center space-x-2 mb-1",children:[e.jsx("div",{className:"w-6 h-6 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full flex items-center justify-center text-white text-xs font-semibold",children:c(((j=r.author)==null?void 0:j.name)||f("market.unknown"))}),e.jsx("div",{children:e.jsx("p",{className:"text-xs font-medium text-gray-700",children:((m=r.author)==null?void 0:m.name)||f("market.unknown")})})]})]}),e.jsx("div",{className:"flex flex-col items-end space-y-2",children:r.is_official&&e.jsx("span",{className:"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300",children:f("market.official")})})]}),e.jsx("div",{className:"mb-2 flex-1",children:e.jsx("p",{className:"text-gray-600 text-sm leading-relaxed line-clamp-2 min-h-[36px]",children:r.description})}),e.jsx("div",{className:"mb-2",children:e.jsx("div",{className:"flex flex-wrap gap-1 min-h-[24px]",children:((_=r.categories)==null?void 0:_.length)>0?r.categories.map((M,z)=>e.jsx("span",{className:"bg-gray-100 dark:bg-gray-800 text-gray-800 text-xs px-2 py-1 rounded whitespace-nowrap",children:M},z)):e.jsx("span",{className:"text-xs text-gray-400 py-1",children:"-"})})}),e.jsx("div",{className:"mb-2",children:e.jsx("div",{className:"relative min-h-[24px] overflow-x-auto",children:((D=r.tags)==null?void 0:D.length)>0?e.jsxs("div",{className:"flex gap-1 items-center whitespace-nowrap",children:[g.map((M,z)=>e.jsxs("span",{className:"bg-green-50 text-green-700 text-xs px-2 py-1 rounded flex-shrink-0",children:["#",M]},z)),i&&e.jsxs("span",{className:"bg-gray-100 dark:bg-gray-800 text-gray-600 text-xs px-1.5 py-1 rounded flex-shrink-0",children:["+",l," ",f("market.moreTags")]})]}):e.jsx("span",{className:"text-xs text-gray-400 py-1",children:"-"})})})]})]})},xr=({server:r,onBack:C,onInstall:f,installing:c=!1,isInstalled:x=!1})=>{var A,re,K;const{t:g}=le(),[i,l]=s.useState(!1),[j,m]=s.useState(null),[_,D]=s.useState(!1),[M,z]=s.useState(null),[O,L]=s.useState([]),N=()=>x?{className:"bg-green-600 cursor-default px-4 py-2 rounded text-sm font-medium text-white",disabled:!0,text:g("market.installed")}:c?{className:"bg-gray-400 cursor-not-allowed px-4 py-2 rounded text-sm font-medium text-white",disabled:!0,text:g("market.installing")}:{className:"bg-blue-600 hover:bg-blue-700 px-4 py-2 rounded text-sm font-medium text-white btn-primary",disabled:!1,text:g("market.install")},H=()=>{l(!i),m(null),D(!1),z(null)},S=async()=>{M&&(await P(M),D(!1),z(null))},P=async y=>{try{m(null),f(r,y.config),l(!1)}catch(k){console.error("Error installing server:",k),m(g("errors.serverInstall"))}},U=()=>{x||H()},Z=()=>{if(!r.installations)return;if(r.installations.npm)return r.installations.npm;if(r.installations.uvx)return r.installations.uvx;if(r.installations.default)return r.installations.default;const y=Object.keys(r.installations);if(y.length>0)return r.installations[y[0]]},T=async y=>{try{const k=lr(y);k.length>0?(L(k),z(y),D(!0)):await P(y)}catch(k){console.error("Error processing server installation:",k),m(g("errors.serverInstall"))}},R=N(),W=Z();return e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg shadow-md p-6",children:[e.jsx("div",{className:"mb-4",children:e.jsxs("button",{onClick:C,className:"text-gray-600 hover:text-gray-900 flex items-center",children:[e.jsx("svg",{className:"h-5 w-5 mr-1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z",clipRule:"evenodd"})}),g("market.backToList")]})}),e.jsxs("div",{className:"flex justify-between items-start mb-4",children:[e.jsx("div",{children:e.jsxs("h2",{className:"text-2xl font-bold text-gray-900 flex items-center flex-wrap",children:[r.display_name,e.jsxs("span",{className:"text-sm font-normal text-gray-500 ml-2",children:["(",r.name,")"]}),e.jsxs("span",{className:"text-sm font-normal text-gray-600 ml-4",children:[g("market.author"),": ",((A=r.author)==null?void 0:A.name)||g("market.unknown")," •"," ",g("market.license"),": ",r.license," •",e.jsx("a",{href:r.repository.url,target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline ml-1",children:g("market.repository")})]})]})}),e.jsxs("div",{className:"flex items-center",children:[r.is_official&&e.jsx("span",{className:"bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300 text-sm font-normal px-4 py-2 rounded mr-2 flex items-center label-primary",children:g("market.official")}),e.jsx("button",{onClick:U,disabled:R.disabled,className:R.className,children:R.text})]})]}),e.jsx("p",{className:"text-gray-700 mb-6",children:r.description}),e.jsxs("div",{className:"mb-6",children:[e.jsxs("h3",{className:"text-lg font-semibold mb-3",children:[g("market.categories")," & ",g("market.tags")]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[(re=r.categories)==null?void 0:re.map((y,k)=>e.jsx("span",{className:"bg-gray-100 dark:bg-gray-800 text-gray-800 px-3 py-1 rounded",children:y},`cat-${k}`)),r.tags&&r.tags.map((y,k)=>e.jsxs("span",{className:"bg-gray-100 dark:bg-gray-800 text-green-700 px-2 py-1 rounded text-sm",children:["#",y]},`tag-${k}`))]})]}),r.arguments&&Object.keys(r.arguments).length>0&&e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:g("market.arguments")}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"min-w-full divide-y divide-gray-200 dark:divide-gray-700",children:[e.jsx("thead",{className:"bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap",children:g("market.argumentName")}),e.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap",children:g("market.description")}),e.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap",children:g("market.required")}),e.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap",children:g("market.example")})]})}),e.jsx("tbody",{className:"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700",children:Object.entries(r.arguments).map(([y,k],V)=>e.jsxs("tr",{children:[e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900",children:y}),e.jsx("td",{className:"px-6 py-4 text-sm text-gray-500",children:k.description}),e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500",children:k.required?e.jsx("span",{className:"text-green-600",children:"✓"}):e.jsx("span",{className:"text-gray-600",children:"✗"})}),e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500",children:e.jsx("code",{className:"bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded",children:k.example})})]},V))})]})})]}),e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:g("market.tools")}),e.jsx("div",{className:"space-y-4",children:(K=r.tools)==null?void 0:K.map((y,k)=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded p-4",children:[e.jsxs("h4",{className:"font-medium mb-2",children:[y.name,e.jsx("button",{type:"button",onClick:()=>{const V=document.getElementById(`schema-${k}`);V&&V.classList.toggle("hidden")},className:"text-sm text-blue-500 font-normal hover:underline focus:outline-none ml-2",children:g("market.viewSchema")})]}),e.jsx("p",{className:"text-gray-600 mb-2",children:y.description}),e.jsx("div",{className:"mt-2",children:e.jsx("pre",{id:`schema-${k}`,className:"hidden bg-gray-50 dark:bg-gray-800 p-3 rounded text-sm overflow-auto mt-2",children:JSON.stringify(y.inputSchema,null,2)})})]},k))})]}),r.examples&&r.examples.length>0&&e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:g("market.examples")}),e.jsx("div",{className:"space-y-4",children:r.examples.map((y,k)=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded p-4",children:[e.jsx("h4",{className:"font-medium mb-2",children:y.title}),e.jsx("p",{className:"text-gray-600 mb-2",children:y.description}),e.jsx("pre",{className:"bg-gray-50 dark:bg-gray-800 p-3 rounded text-sm overflow-auto",children:y.prompt})]},k))})]}),e.jsx("div",{className:"mt-6 flex justify-end",children:e.jsx("button",{onClick:U,disabled:R.disabled,className:R.className,children:R.text})}),i&&e.jsx("div",{className:"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4",children:e.jsx(Ce,{onSubmit:T,onCancel:H,modalTitle:g("market.installServer",{name:r.display_name}),formError:j,initialData:{name:r.name,status:"disconnected",config:W?{command:W.command||"",args:W.args||[],env:W.env||{}}:void 0}})}),_&&e.jsx("div",{className:"fixed inset-0 bg-black/50 z-[60] flex items-center justify-center p-4",children:e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg p-6 w-full max-w-md",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-4",children:g("server.confirmVariables")}),e.jsx("p",{className:"text-gray-600 mb-4",children:g("server.variablesDetected")}),e.jsx("div",{className:"bg-yellow-50 border border-yellow-200 rounded p-3 mb-4",children:e.jsxs("div",{className:"flex items-start",children:[e.jsx("div",{className:"flex-shrink-0",children:e.jsx("svg",{className:"h-5 w-5 text-yellow-400",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z",clipRule:"evenodd"})})}),e.jsxs("div",{className:"ml-3",children:[e.jsxs("h4",{className:"text-sm font-medium text-yellow-800",children:[g("server.detectedVariables"),":"]}),e.jsx("ul",{className:"mt-1 text-sm text-yellow-700",children:O.map((y,k)=>e.jsxs("li",{className:"font-mono",children:["$",`{${y}}`]},k))})]})]})}),e.jsx("p",{className:"text-gray-600 text-sm mb-6",children:g("market.confirmVariablesMessage")}),e.jsxs("div",{className:"flex justify-end space-x-3",children:[e.jsx("button",{onClick:()=>{D(!1),z(null)},className:"px-4 py-2 text-gray-600 border border-gray-300 rounded hover:bg-gray-50 dark:bg-gray-800 dark:hover:bg-gray-700 btn-secondary",children:g("common.cancel")}),e.jsx("button",{onClick:S,className:"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 btn-primary",children:g("market.confirmAndInstall")})]})]})})]})},gr=({server:r,onClick:C})=>{const{t:f}=le(),c=()=>{C(r)},x=()=>{if(r.description&&r.description.length<=150)return r.description;if(r.content){const l=r.content.split(`
|
|
2
|
-
`).filter(j=>j.trim());for(const j of l)if(j.length>50&&j.length<=150)return j}return r.description?r.description.slice(0,150)+"...":f("cloud.noDescription")},g=l=>{try{const j=new Date(l),m=j.getFullYear(),_=(j.getMonth()+1).toString().padStart(2,"0"),D=j.getDate().toString().padStart(2,"0");return`${m}/${_}/${D}`}catch{return""}},i=l=>l.split(" ").map(j=>j.charAt(0)).join("").toUpperCase().slice(0,2);return e.jsxs("div",{className:"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-4 hover:shadow-lg hover:border-blue-400 hover:-translate-y-1 transition-all duration-300 cursor-pointer group relative overflow-hidden h-full flex flex-col",onClick:c,children:[e.jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-blue-50/0 to-purple-50/0 group-hover:from-blue-50/30 group-hover:to-purple-50/30 dark:group-hover:from-blue-900/30 dark:group-hover:to-purple-900/30 transition-all duration-300 pointer-events-none"}),e.jsxs("div",{className:"relative z-10 flex-1 flex flex-col",children:[e.jsxs("div",{className:"flex items-start justify-between mb-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h3",{className:"text-lg font-bold text-gray-900 group-hover:text-blue-600 transition-colors duration-200 mb-2 line-clamp-2",children:r.title||r.name}),e.jsxs("div",{className:"flex items-center space-x-2 mb-2",children:[e.jsx("div",{className:"w-7 h-7 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full flex items-center justify-center text-white text-xs font-semibold",children:i(r.author_name)}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-gray-700",children:r.author_name}),r.updated_at&&e.jsxs("p",{className:"text-xs text-gray-500",children:[f("cloud.updated")," ",g(r.updated_at)]})]})]})]}),e.jsx("div",{className:"flex flex-col items-end space-y-2",children:e.jsx("span",{className:"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300",children:"MCP Server"})})]}),e.jsx("div",{className:"mb-3 flex-1",children:e.jsx("p",{className:"text-gray-600 text-sm leading-relaxed line-clamp-2",children:x()})}),r.tools&&r.tools.length>0&&e.jsx("div",{className:"mb-3",children:e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsxs("svg",{className:"w-4 h-4 text-gray-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:[e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]}),e.jsxs("span",{className:"text-sm text-gray-600 font-medium",children:[r.tools.length," ",r.tools.length===1?f("cloud.tool"):f("cloud.tools")]})]})}),e.jsxs("div",{className:"flex items-center justify-between pt-3 border-t border-gray-100 dark:border-gray-700 mt-auto",children:[e.jsxs("div",{className:"flex items-center space-x-2 text-xs text-gray-500",children:[e.jsx("svg",{className:"w-3 h-3",fill:"currentColor",viewBox:"0 0 20 20",children:e.jsx("path",{fillRule:"evenodd",d:"M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z",clipRule:"evenodd"})}),e.jsx("span",{children:g(r.created_at)})]}),e.jsxs("div",{className:"flex items-center text-blue-600 text-sm font-medium group-hover:text-blue-700 transition-colors",children:[e.jsx("span",{children:f("cloud.viewDetails")}),e.jsx("svg",{className:"w-4 h-4 ml-1 transform group-hover:translate-x-1 transition-transform",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})]})]})]})]})},Se=()=>{const{t:r}=le(),C=Be(),f=()=>{C("/settings")},c=()=>{window.open("https://mcprouter.co","_blank","noopener,noreferrer")};return e.jsx("div",{className:"bg-amber-50 border border-amber-200 dark:bg-amber-900/20 dark:border-amber-900/50 rounded-lg p-6 mb-6",children:e.jsxs("div",{className:"flex items-start",children:[e.jsx("div",{className:"flex-shrink-0",children:e.jsx("svg",{className:"h-5 w-5 text-amber-400 dark:text-amber-500",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z",clipRule:"evenodd"})})}),e.jsxs("div",{className:"ml-3 flex-1",children:[e.jsx("h3",{className:"text-sm font-medium text-amber-800 dark:text-amber-400",children:r("cloud.apiKeyNotConfigured")}),e.jsx("div",{className:"mt-2 text-sm text-amber-700 dark:text-amber-300",children:e.jsx("p",{children:r("cloud.apiKeyNotConfiguredDescription")})}),e.jsxs("div",{className:"mt-4 flex flex-wrap gap-2",children:[e.jsxs("button",{onClick:c,className:"inline-flex items-center px-3 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors duration-200",children:[e.jsx("svg",{className:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})}),r("cloud.getApiKey")]}),e.jsxs("button",{onClick:f,className:"inline-flex items-center px-3 py-2 text-sm font-medium text-amber-800 dark:text-amber-400 bg-amber-100 border border-amber-300 dark:bg-amber-900/40 dark:border-amber-700 dark:text-amber-300 rounded-md hover:bg-amber-200 dark:hover:bg-amber-900/60 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-amber-500 dark:focus:ring-amber-400 transition-colors duration-200",children:[e.jsxs("svg",{className:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:[e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]}),r("cloud.configureInSettings")]})]})]})]})})},hr=({serverName:r,onBack:C,onCallTool:f,fetchServerTools:c,onInstall:x,installing:g=!1,isInstalled:i=!1})=>{const{t:l}=le(),{mcpRouterConfig:j}=or(),[m,_]=s.useState(null),[D,M]=s.useState(!0),[z,O]=s.useState(null),[L,N]=s.useState([]),[H,S]=s.useState(!1),[P,U]=s.useState(!1),[Z,T]=s.useState(null),[R,W]=s.useState({}),[A,re]=s.useState({}),[K,y]=s.useState({}),[k,V]=s.useState(!1),[te,b]=s.useState(null),E=t=>(console.error("Checking for MCPRouter API key error:",t),t==="MCPROUTER_API_KEY_NOT_CONFIGURED"||t.toLowerCase().includes("mcprouter api key not configured")),w=()=>i?{className:"bg-green-600 cursor-default px-4 py-2 rounded text-sm font-medium text-white",disabled:!0,text:l("market.installed")}:g?{className:"bg-gray-400 cursor-not-allowed px-4 py-2 rounded text-sm font-medium text-white",disabled:!0,text:l("market.installing")}:{className:"bg-blue-600 hover:bg-blue-700 px-4 py-2 rounded text-sm font-medium text-white transition-colors",disabled:!1,text:l("market.install")},F=()=>{!i&&x&&(V(!0),b(null))},d=()=>{V(!1),b(null)},p=async t=>{try{if(!m||!x)return;b(null),x(m,t.config),V(!1)}catch(u){console.error("Error installing server:",u),b(l("errors.serverInstall"))}};s.useEffect(()=>{(async()=>{try{M(!0),O(null);const u=await J(`/cloud/servers/${r}`);u&&u.success&&u.data?(_(u.data),N(u.data.tools||[])):O(l("cloud.serverNotFound"))}catch(u){console.error("Failed to load server details:",u),O(u instanceof Error?u.message:String(u))}finally{M(!1)}})()},[r,l]),s.useEffect(()=>{(async()=>{if(m&&(!m.tools||m.tools.length===0)&&c){S(!0),U(!1);try{const u=await c(m.name);N(u)}catch(u){console.error("Failed to load tools:",u);const I=u instanceof Error?u.message:String(u);E(I)&&U(!0)}finally{S(!1)}}})()},[m==null?void 0:m.name,m==null?void 0:m.tools,c]);const h=t=>{try{const u=new Date(t),I=u.getFullYear(),B=String(u.getMonth()+1).padStart(2,"0"),ee=String(u.getDate()).padStart(2,"0"),ne=String(u.getHours()).padStart(2,"0"),ae=String(u.getMinutes()).padStart(2,"0"),oe=String(u.getSeconds()).padStart(2,"0");return`${I}-${B}-${ee} ${ne}:${ae}:${oe}`}catch{return t}},n=(t,u,I)=>{re(B=>({...B,[t]:{...B[t],[u]:I}}))},o=async t=>{if(!(!f||!m)){T(t);try{const u=A[t]||{},I=await f(m.server_key,t,u);W(B=>({...B,[t]:I}))}catch(u){console.error("Tool call failed:",u);const I=u instanceof Error?u.message:String(u);W(B=>({...B,[t]:{error:I}}))}finally{T(null)}}},X=t=>{y(u=>({...u,[t]:!u[t]}))},a=(t,u,I)=>{var ne;const B=((ne=A[t.name])==null?void 0:ne[u])||"",ee=ae=>{let oe=ae.target.value;I.type==="number"||I.type==="integer"?oe=oe===""?void 0:Number(oe):I.type==="boolean"&&(oe=ae.target.value==="true"),n(t.name,u,oe)};return I.type==="boolean"?e.jsxs("select",{value:B===!0?"true":B===!1?"false":"",onChange:ee,className:"w-full border rounded-md px-3 py-2 border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500 form-input",children:[e.jsx("option",{value:""}),e.jsx("option",{value:"true",children:l("common.true")}),e.jsx("option",{value:"false",children:l("common.false")})]}):I.type==="number"||I.type==="integer"?e.jsx("input",{type:"number",step:I.type==="integer"?"1":"any",value:B||"",onChange:ee,className:"w-full border rounded-md px-3 py-2 border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500 form-input"}):e.jsx("input",{type:"text",value:B||"",onChange:ee,className:"w-full border rounded-md px-3 py-2 border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500 form-input"})};return e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg shadow-md p-6",children:[e.jsx("div",{className:"mb-6",children:e.jsxs("button",{onClick:C,className:"inline-flex items-center text-gray-600 hover:text-gray-900 transition-colors group",children:[e.jsx("svg",{className:"h-5 w-5 mr-2 transform group-hover:-translate-x-1 transition-transform",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z",clipRule:"evenodd"})}),l("cloud.backToList")]})}),D?e.jsx("div",{className:"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-12",children:e.jsxs("div",{className:"flex flex-col items-center",children:[e.jsxs("svg",{className:"animate-spin h-12 w-12 text-blue-500 mb-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[e.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),e.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),e.jsx("p",{className:"text-gray-600 text-lg",children:l("app.loading")})]})}):z&&!E(z)?e.jsx("div",{className:"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6",children:e.jsx("div",{className:"bg-red-50 border border-red-200 dark:bg-red-900/20 dark:border-red-900/50 rounded-lg p-4",children:e.jsxs("div",{className:"flex items-center",children:[e.jsx("svg",{className:"h-5 w-5 text-red-400 dark:text-red-500 mr-3",fill:"currentColor",viewBox:"0 0 20 20",children:e.jsx("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",clipRule:"evenodd"})}),e.jsx("p",{className:"text-red-700 dark:text-red-400",children:z})]})})}):m?e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"bg-white dark:bg-gray-800 rounded-xl shadow-sm overflow-hidden",children:e.jsx("div",{className:"bg-gradient-to-r from-gray-100 to-gray-200 dark:from-gray-800 dark:to-gray-700 px-6 py-4",children:e.jsxs("div",{className:"flex justify-between items-end",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h1",{className:"text-2xl font-bold text-gray-800 mb-2",children:m.title||m.name}),e.jsxs("div",{className:"flex flex-wrap items-center gap-4 text-gray-600",children:[e.jsx("span",{className:"text-sm bg-white/60 dark:bg-gray-800/60 text-gray-700 px-3 py-1 rounded-full",children:m.name}),e.jsxs("div",{className:"flex items-center",children:[e.jsx("svg",{className:"h-4 w-4 mr-1",fill:"currentColor",viewBox:"0 0 20 20",children:e.jsx("path",{fillRule:"evenodd",d:"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z",clipRule:"evenodd"})}),l("cloud.by")," ",m.author_name]})]})]}),e.jsxs("div",{className:"text-right flex flex-col items-end gap-3",children:[e.jsxs("div",{className:"text-xs text-gray-500",children:[l("cloud.updated"),": ",h(m.updated_at)]}),x&&!E(z||"")&&!P&&e.jsx("button",{onClick:F,disabled:w().disabled,className:w().className,children:w().text})]})]})})}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6",children:[e.jsxs("h2",{className:"text-xl font-semibold text-gray-900 mb-4 flex items-center",children:[e.jsx("svg",{className:"h-5 w-5 text-gray-500 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),l("cloud.description")]}),e.jsx("p",{className:"text-gray-700 leading-relaxed",children:m.description})]}),m.content&&e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6",children:[e.jsxs("h2",{className:"text-xl font-semibold text-gray-900 mb-4 flex items-center",children:[e.jsx("svg",{className:"h-5 w-5 text-gray-500 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12h6m-6 4h6m2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})}),l("cloud.details")]}),e.jsx("div",{className:"bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 overflow-auto",children:e.jsx("pre",{className:"text-sm text-gray-800 whitespace-pre-wrap",children:m.content})})]}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6",children:[e.jsxs("h2",{className:"text-xl font-semibold text-gray-900 mb-4 flex items-center",children:[e.jsxs("svg",{className:"h-5 w-5 text-gray-500 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:[e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]}),l("cloud.tools"),L.length>0&&e.jsx("span",{className:"ml-2 bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300 text-sm font-medium px-2.5 py-0.5 rounded-full",children:L.length})]}),P&&e.jsx(Se,{}),H?e.jsxs("div",{className:"flex items-center justify-center py-12",children:[e.jsxs("svg",{className:"animate-spin h-8 w-8 text-blue-500 mr-3",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[e.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),e.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),e.jsx("span",{className:"text-gray-600",children:l("cloud.loadingTools")})]}):L.length===0&&!P?e.jsxs("div",{className:"text-center py-12",children:[e.jsx("svg",{className:"h-12 w-12 text-gray-400 mx-auto mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1,d:"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"})}),e.jsx("p",{className:"text-gray-600",children:l("cloud.noTools")})]}):L.length>0?e.jsx("div",{className:"space-y-4",children:L.map((t,u)=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded-lg p-6 hover:border-gray-300 transition-colors",children:[e.jsxs("div",{className:"flex justify-between items-start mb-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("h3",{className:"text-lg font-medium text-gray-900 mb-2 flex items-center",children:[e.jsx("span",{className:"bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300 text-xs font-medium px-2 py-1 rounded mr-3",children:"TOOL"}),t.name]}),e.jsx("p",{className:"text-gray-600 leading-relaxed whitespace-pre-wrap",children:t.description})]}),f&&e.jsx("button",{onClick:()=>o(t.name),disabled:Z===t.name,className:"ml-4 bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center min-w-[100px] justify-center",children:Z===t.name?e.jsxs(e.Fragment,{children:[e.jsxs("svg",{className:"animate-spin h-4 w-4 mr-2",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[e.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),e.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),l("cloud.calling")]}):e.jsxs(e.Fragment,{children:[e.jsx("svg",{className:"h-4 w-4 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M14.828 14.828a4 4 0 01-5.656 0M9 10h6m2 8l4-4H7l4 4z"})}),l("cloud.callTool")]})})]}),t.inputSchema&&t.inputSchema.properties&&Object.keys(t.inputSchema.properties).length>0&&e.jsxs("div",{className:"border-t border-gray-100 dark:border-gray-700 pt-4",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700",children:l("cloud.parameters")}),e.jsxs("button",{onClick:()=>X(t.name),className:"text-sm text-blue-600 hover:text-blue-800 focus:outline-none flex items-center gap-1 transition-colors",children:[l("cloud.viewSchema"),e.jsx("svg",{className:`h-3 w-3 transition-transform duration-200 ${K[t.name]?"rotate-90":"rotate-0"}`,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z",clipRule:"evenodd"})})]})]}),K[t.name]&&e.jsx("div",{className:"mb-4",children:e.jsx("div",{className:"bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-3 overflow-auto",children:e.jsx("pre",{className:"text-sm text-gray-800",children:JSON.stringify(t.inputSchema,null,2)})})}),e.jsx("div",{className:"space-y-4",children:Object.entries(t.inputSchema.properties).map(([I,B])=>{var ee;return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("label",{className:"block text-sm font-medium text-gray-700",children:[I,((ee=t.inputSchema.required)==null?void 0:ee.includes(I))&&e.jsx("span",{className:"text-red-500 ml-1",children:"*"})]}),B.description&&e.jsx("p",{className:"text-xs text-gray-500",children:B.description}),a(t,I,B)]},I)})})]}),R[t.name]&&e.jsx("div",{className:"border-t border-gray-100 dark:border-gray-700 pt-4 mt-4",children:R[t.name].error?e.jsx(e.Fragment,{children:E(R[t.name].error)?e.jsx(Se,{}):e.jsxs(e.Fragment,{children:[e.jsxs("h4",{className:"text-sm font-medium text-red-600 mb-3 flex items-center",children:[e.jsx("svg",{className:"h-4 w-4 text-red-500 mr-2",fill:"currentColor",viewBox:"0 0 20 20",children:e.jsx("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",clipRule:"evenodd"})}),l("cloud.error")]}),e.jsx("div",{className:"bg-red-50 border border-red-200 dark:bg-red-900/20 dark:border-red-900/50 rounded-lg p-4",children:e.jsx("pre",{className:"text-sm text-red-800 dark:text-red-300 whitespace-pre-wrap overflow-auto",children:R[t.name].error})})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("h4",{className:"text-sm font-medium text-gray-700 mb-3 flex items-center",children:[e.jsx("svg",{className:"h-4 w-4 text-green-500 mr-2",fill:"currentColor",viewBox:"0 0 20 20",children:e.jsx("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",clipRule:"evenodd"})}),l("cloud.result")]}),e.jsx("div",{className:"bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4",children:e.jsx("pre",{className:"text-sm text-gray-800 whitespace-pre-wrap overflow-auto",children:JSON.stringify(R[t.name],null,2)})})]})})]},u))}):null]})]}):e.jsx("div",{className:"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-12",children:e.jsxs("div",{className:"text-center",children:[e.jsx("svg",{className:"h-12 w-12 text-gray-400 mx-auto mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1,d:"M9.172 16.172a4 4 0 015.656 0M9 12h6m-6-4h6m2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})}),e.jsx("p",{className:"text-gray-600 text-lg",children:l("cloud.serverNotFound")})]})}),k&&m&&e.jsx("div",{className:"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4",children:e.jsx(Ce,{onSubmit:p,onCancel:d,modalTitle:l("cloud.installServer",{name:m.title||m.name}),formError:te,initialData:{name:m.name,status:"disconnected",config:{type:"streamable-http",url:m.server_url,headers:{Authorization:`Bearer ${j.apiKey||"<MCPROUTER_API_KEY>"}`,"HTTP-Referer":j.referer||"<YOUR_APP_URL>","X-Title":j.title||"<YOUR_APP_NAME>"}}}})})]})},fr=({serverEntry:r,onClick:C})=>{var H,S;const{t:f}=le(),{server:c,_meta:x}=r,g=()=>{C(r)},i=()=>c.description&&c.description.length<=150?c.description:c.description?c.description.slice(0,150)+"...":f("registry.noDescription"),l=P=>{if(!P)return"";try{const U=new Date(P),Z=U.getFullYear(),T=(U.getMonth()+1).toString().padStart(2,"0"),R=U.getDate().toString().padStart(2,"0");return`${Z}/${T}/${R}`}catch{return""}},m=c.icons&&c.icons.length>0?c.icons.find(U=>!U.theme||U.theme==="light")||c.icons[0]:null,_=x==null?void 0:x["io.modelcontextprotocol.registry/official"],D=_==null?void 0:_.isLatest,M=_==null?void 0:_.publishedAt,z=_==null?void 0:_.updatedAt,O=((H=c.packages)==null?void 0:H.length)||0,L=((S=c.remotes)==null?void 0:S.length)||0,N=O+L;return e.jsxs("div",{className:"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-4 hover:shadow-lg hover:border-blue-400 hover:-translate-y-1 transition-all duration-300 cursor-pointer group relative overflow-hidden h-full flex flex-col",onClick:g,children:[e.jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-blue-50/0 to-purple-50/0 group-hover:from-blue-50/30 group-hover:to-purple-50/30 dark:group-hover:from-blue-900/30 dark:group-hover:to-purple-900/30 transition-all duration-300 pointer-events-none"}),e.jsxs("div",{className:"relative z-10 flex-1 flex flex-col",children:[e.jsx("div",{className:"flex items-start justify-between mb-3",children:e.jsxs("div",{className:"flex items-start space-x-3 flex-1",children:[m?e.jsx("img",{src:m.src,alt:c.title,className:"w-12 h-12 rounded-lg object-cover flex-shrink-0",onError:P=>{P.currentTarget.style.display="none"}}):e.jsx("div",{className:"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg flex items-center justify-center text-white text-xl font-semibold flex-shrink-0",children:"M"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-bold text-gray-900 group-hover:text-blue-600 transition-colors duration-200 mb-1 line-clamp-2",children:c.name}),e.jsxs("div",{className:"flex flex-wrap gap-1 mb-1",children:[D&&e.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800",children:f("registry.latest")}),e.jsxs("span",{className:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300",children:["v",c.version]})]})]})]})}),e.jsx("div",{className:"mb-3 flex-1",children:e.jsx("p",{className:"text-gray-600 text-sm leading-relaxed line-clamp-3",children:i()})}),N>0&&e.jsx("div",{className:"mb-3",children:e.jsxs("div",{className:"flex items-center space-x-4",children:[O>0&&e.jsxs("div",{className:"flex items-center space-x-1",children:[e.jsx("svg",{className:"w-4 h-4 text-gray-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"})}),e.jsxs("span",{className:"text-sm text-gray-600",children:[O," ",f(O===1?"registry.package":"registry.packages")]})]}),L>0&&e.jsxs("div",{className:"flex items-center space-x-1",children:[e.jsx("svg",{className:"w-4 h-4 text-gray-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})}),e.jsxs("span",{className:"text-sm text-gray-600",children:[L," ",f(L===1?"registry.remote":"registry.remotes")]})]})]})}),e.jsxs("div",{className:"flex items-center justify-between pt-3 border-t border-gray-100 dark:border-gray-700 mt-auto",children:[e.jsx("div",{className:"flex items-center space-x-2 text-xs text-gray-500",children:(M||z)&&e.jsxs(e.Fragment,{children:[e.jsx("svg",{className:"w-3 h-3",fill:"currentColor",viewBox:"0 0 20 20",children:e.jsx("path",{fillRule:"evenodd",d:"M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z",clipRule:"evenodd"})}),e.jsx("span",{children:l(z||M)})]})}),e.jsxs("div",{className:"flex items-center text-blue-600 text-sm font-medium group-hover:text-blue-700 transition-colors",children:[e.jsx("span",{children:f("registry.viewDetails")}),e.jsx("svg",{className:"w-4 h-4 ml-1 transform group-hover:translate-x-1 transition-transform",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})]})]})]})]})},pr=({serverEntry:r,onBack:C,onInstall:f,installing:c=!1,isInstalled:x=!1,fetchVersions:g})=>{const{t:i}=le(),{server:l,_meta:j}=r,[m,_]=s.useState(l.version),[D,M]=s.useState([]),[z,O]=s.useState(!1),[L,N]=s.useState(!1),[H,S]=s.useState(null),[P,U]=s.useState(null),[Z,T]=s.useState(null),[R,W]=s.useState({packages:!0,remotes:!0,repository:!0}),A=j==null?void 0:j["io.modelcontextprotocol.registry/official"];s.useEffect(()=>{(async()=>{if(g){O(!0);try{const p=await g(l.name);M(p)}catch(p){console.error("Failed to load versions:",p)}finally{O(!1)}}})()},[l.name,g]);const K=l.icons&&l.icons.length>0?l.icons.find(p=>!p.theme||p.theme==="light")||l.icons[0]:null,y=d=>{if(!d)return"";try{return new Date(d).toLocaleDateString()}catch{return""}},k=d=>{W(p=>({...p,[d]:!p[d]}))},V=(d,p)=>{S(d),U(p),T(null),N(!0)},te=()=>{N(!1),T(null)},b=async d=>{try{if(!f||!P||!H)return;T(null);const p=d.config;f(l,p),N(!1)}catch(p){console.error("Error installing server:",p),T(i("errors.serverInstall"))}},E=()=>{if(!P||!H)return null;if(console.log("Building initial form data for:",P),H==="package"&&"identifier"in P){const d=P,p={};d.environmentVariables&&d.environmentVariables.forEach(n=>{p[n.name]=n.default||""});const h=yr(d.registryType);return{name:l.name,status:"disconnected",config:{type:"stdio",command:h,args:br(h,d),env:Object.keys(p).length>0?p:void 0}}}else if(H==="remote"&&"url"in P){const d=P,p={};d.headers&&d.headers.forEach(n=>{p[n.name]=n.default||n.value||""});const h=d.type==="sse"?"sse":"streamable-http";return{name:l.name,status:"disconnected",config:{type:h,url:d.url,headers:Object.keys(p).length>0?p:void 0}}}return null},w=(d,p)=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-3 hover:border-blue-400 transition-colors",children:[e.jsxs("div",{className:"flex items-start justify-between mb-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h4",{className:"font-medium text-gray-900",children:d.identifier}),d.version&&e.jsxs("p",{className:"text-sm text-gray-500",children:["Version: ",d.version]}),d.runtimeHint&&e.jsx("p",{className:"text-sm text-gray-600 mt-1",children:d.runtimeHint})]}),e.jsx("button",{onClick:()=>V("package",d),disabled:x||c,className:`px-4 py-2 rounded text-sm font-medium transition-colors ${x?"bg-green-600 text-white cursor-default":c?"bg-gray-400 text-white cursor-not-allowed":"bg-blue-600 text-white hover:bg-blue-700"}`,children:i(x?"registry.installed":c?"registry.installing":"registry.install")})]}),d.registryType&&e.jsxs("div",{className:"text-sm text-gray-600 mb-2",children:[e.jsx("span",{className:"font-medium",children:"Registry:"})," ",d.registryType]}),d.transport&&e.jsxs("div",{className:"text-sm text-gray-600 mb-2",children:[e.jsx("span",{className:"font-medium",children:"Transport:"})," ",d.transport.type,d.transport.url&&e.jsxs("span",{className:"ml-2 text-gray-500",children:["(",d.transport.url,")"]})]}),d.environmentVariables&&d.environmentVariables.length>0&&e.jsxs("div",{className:"mt-3 border-t border-gray-200 dark:border-gray-700 pt-3",children:[e.jsxs("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:[i("registry.environmentVariables"),":"]}),e.jsx("div",{className:"space-y-2",children:d.environmentVariables.map((h,n)=>e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"flex items-start",children:[e.jsx("span",{className:"font-mono text-gray-900 font-medium",children:h.name}),h.isRequired&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800",children:i("common.required")}),h.isSecret&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-yellow-100 text-yellow-800",children:i("common.secret")})]}),h.description&&e.jsx("p",{className:"text-gray-600 mt-1",children:h.description}),h.default&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[i("common.default"),":"]})," ",e.jsx("span",{className:"font-mono",children:h.default})]})]},n))})]}),d.packageArguments&&d.packageArguments.length>0&&e.jsxs("div",{className:"mt-3 border-t border-gray-200 dark:border-gray-700 pt-3",children:[e.jsxs("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:[i("registry.packageArguments"),":"]}),e.jsx("div",{className:"space-y-2",children:d.packageArguments.map((h,n)=>e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"flex items-start",children:[e.jsx("span",{className:"font-mono text-gray-900 font-medium",children:h.name}),h.isRequired&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800",children:i("common.required")}),h.isSecret&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-yellow-100 text-yellow-800",children:i("common.secret")}),h.isRepeated&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-purple-100 text-purple-800 dark:bg-purple-900/40 dark:text-purple-300",children:i("common.repeated")})]}),h.description&&e.jsx("p",{className:"text-gray-600 mt-1",children:h.description}),h.type&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[i("common.type"),":"]})," ",e.jsx("span",{className:"font-mono",children:h.type})]}),h.default&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[i("common.default"),":"]})," ",e.jsx("span",{className:"font-mono",children:h.default})]}),h.value&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[i("common.value"),":"]})," ",e.jsx("span",{className:"font-mono",children:h.value})]}),h.valueHint&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[i("common.valueHint"),":"]})," ",e.jsx("span",{className:"font-mono",children:h.valueHint})]}),h.choices&&h.choices.length>0&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[i("common.choices"),":"]})," ",e.jsx("span",{className:"font-mono",children:h.choices.join(", ")})]})]},n))})]})]},p),F=(d,p)=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-3 hover:border-blue-400 transition-colors",children:[e.jsxs("div",{className:"flex items-start justify-between mb-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h4",{className:"font-medium text-gray-900",children:d.type}),e.jsx("p",{className:"text-sm text-gray-600 mt-1 break-all",children:d.url})]}),e.jsx("button",{onClick:()=>V("remote",d),disabled:x||c,className:`px-4 py-2 rounded text-sm font-medium transition-colors ${x?"bg-green-600 text-white cursor-default":c?"bg-gray-400 text-white cursor-not-allowed":"bg-blue-600 text-white hover:bg-blue-700"}`,children:i(x?"registry.installed":c?"registry.installing":"registry.install")})]}),d.headers&&d.headers.length>0&&e.jsxs("div",{className:"mt-3 border-t border-gray-200 dark:border-gray-700 pt-3",children:[e.jsxs("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:[i("registry.headers"),":"]}),e.jsx("div",{className:"space-y-2",children:d.headers.map((h,n)=>e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"flex items-start",children:[e.jsx("span",{className:"font-mono text-gray-900 font-medium",children:h.name}),h.isRequired&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800",children:i("common.required")}),h.isSecret&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-yellow-100 text-yellow-800",children:i("common.secret")})]}),h.description&&e.jsx("p",{className:"text-gray-600 mt-1",children:h.description}),h.value&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[i("common.value"),":"]})," ",e.jsx("span",{className:"font-mono",children:h.value})]}),h.default&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[i("common.default"),":"]})," ",e.jsx("span",{className:"font-mono",children:h.default})]})]},n))})]})]},p);return e.jsxs("div",{className:"bg-white dark:bg-gray-800 shadow rounded-lg p-6",children:[e.jsxs("div",{className:"mb-6",children:[e.jsxs("button",{onClick:C,className:"flex items-center text-blue-600 hover:text-blue-800 mb-4 transition-colors",children:[e.jsx("svg",{className:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})}),i("registry.backToList")]}),e.jsxs("div",{className:"flex items-start space-x-4",children:[K?e.jsx("img",{src:K.src,alt:l.title,className:"w-20 h-20 rounded-lg object-cover flex-shrink-0",onError:d=>{d.currentTarget.style.display="none"}}):e.jsx("div",{className:"w-20 h-20 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg flex items-center justify-center text-white text-3xl font-semibold flex-shrink-0",children:"M"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("h1",{className:"text-3xl font-bold text-gray-900 mb-2",children:l.name}),e.jsxs("div",{className:"flex flex-wrap gap-2 mb-3",children:[(A==null?void 0:A.isLatest)&&e.jsx("span",{className:"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-green-100 text-green-800",children:i("registry.latest")}),e.jsxs("span",{className:"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300",children:["v",l.version]}),(A==null?void 0:A.status)&&e.jsx("span",{className:"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-gray-100 dark:bg-gray-800 text-gray-800",children:A.status}),e.jsxs("span",{className:"flex flex-wrap items-center gap-4 text-sm text-gray-600",children:[(A==null?void 0:A.publishedAt)&&e.jsxs("div",{children:[e.jsxs("span",{className:"font-medium",children:[i("registry.published"),":"]})," ",y(A.publishedAt)]}),(A==null?void 0:A.updatedAt)&&e.jsxs("div",{children:[e.jsxs("span",{className:"font-medium",children:[i("registry.updated"),":"]})," ",y(A.updatedAt)]})]})]})]})]})]}),e.jsxs("div",{className:"mb-6",children:[e.jsx("h2",{className:"text-xl font-semibold text-gray-900 mb-3",children:i("registry.description")}),e.jsx("p",{className:"text-gray-700 leading-relaxed whitespace-pre-wrap",children:l.description})]}),l.websiteUrl&&e.jsxs("div",{className:"mb-6",children:[e.jsx("h2",{className:"text-xl font-semibold text-gray-900 mb-3",children:i("registry.website")}),e.jsx("a",{href:l.websiteUrl,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800 hover:underline",children:l.websiteUrl})]}),l.packages&&l.packages.length>0&&e.jsxs("div",{className:"mb-6",children:[e.jsxs("button",{onClick:()=>k("packages"),className:"flex items-center justify-between w-full text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors",children:[e.jsxs("span",{children:[i("registry.packages")," (",l.packages.length,")"]}),e.jsx("svg",{className:`w-5 h-5 transform transition-transform ${R.packages?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),R.packages&&e.jsx("div",{className:"space-y-3",children:l.packages.map(w)})]}),l.remotes&&l.remotes.length>0&&e.jsxs("div",{className:"mb-6",children:[e.jsxs("button",{onClick:()=>k("remotes"),className:"flex items-center justify-between w-full text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors",children:[e.jsxs("span",{children:[i("registry.remotes")," (",l.remotes.length,")"]}),e.jsx("svg",{className:`w-5 h-5 transform transition-transform ${R.remotes?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),R.remotes&&e.jsx("div",{className:"space-y-3",children:l.remotes.map(F)})]}),l.repository&&e.jsxs("div",{className:"mb-6",children:[e.jsxs("button",{onClick:()=>k("repository"),className:"flex items-center justify-between w-full text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors",children:[e.jsx("span",{children:i("registry.repository")}),e.jsx("svg",{className:`w-5 h-5 transform transition-transform ${R.repository?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),R.repository&&e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded-lg p-4",children:[l.repository.url&&e.jsxs("div",{className:"mb-2",children:[e.jsx("span",{className:"font-medium text-gray-700",children:"URL:"})," ",e.jsx("a",{href:l.repository.url,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800 hover:underline break-all",children:l.repository.url})]}),l.repository.source&&e.jsxs("div",{className:"mb-2",children:[e.jsx("span",{className:"font-medium text-gray-700",children:"Source:"})," ",l.repository.source]}),l.repository.subfolder&&e.jsxs("div",{className:"mb-2",children:[e.jsx("span",{className:"font-medium text-gray-700",children:"Subfolder:"})," ",l.repository.subfolder]}),l.repository.id&&e.jsxs("div",{children:[e.jsx("span",{className:"font-medium text-gray-700",children:"ID:"})," ",l.repository.id]})]})]}),L&&P&&H&&e.jsx("div",{className:"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4",children:e.jsx(Ce,{onSubmit:b,onCancel:te,modalTitle:i("registry.installServer",{name:l.title||l.name}),formError:Z,initialData:E()})})]})};function yr(r){switch(r.toLowerCase()){case"pypi":case"python":return"uvx";case"npm":case"node":return"npx";case"oci":case"docker":return"docker";default:return""}}function br(r,C){const f=[C.identifier+(C.version?`@${C.version}`:"")],c=[];switch(C.packageArguments&&C.packageArguments.length>0&&C.packageArguments.forEach(x=>{if(x.isRequired||x.default||x.value){const g=`--${x.name}`,i=x.value||x.default||`\${${x.name.toUpperCase()}}`;c.push(g,i)}}),r.toLowerCase()){case"uvx":return[...f,...c];case"npx":return[...f,...c];case"docker":{const x=[];return C.environmentVariables&&C.environmentVariables.forEach(g=>{x.push("-e",`${g.name}`)}),["run","-i","--rm",...x,...f,...c]}default:return[...f,...c]}}const vr=({currentPage:r,hasNextPage:C,hasPreviousPage:f,onNextPage:c,onPreviousPage:x})=>e.jsxs("div",{className:"flex items-center justify-center space-x-2 my-6",children:[e.jsxs("button",{onClick:x,disabled:!f,className:`px-4 py-2 rounded transition-all duration-200 ${f?"bg-gray-200 hover:bg-gray-300 text-gray-700 btn-secondary":"bg-gray-100 text-gray-400 cursor-not-allowed"}`,children:[e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",className:"h-5 w-5 inline-block mr-1",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z",clipRule:"evenodd"})}),"Prev"]}),e.jsxs("span",{className:"px-4 py-2 bg-blue-500 text-white rounded btn-primary",children:["Page ",r]}),e.jsxs("button",{onClick:c,disabled:!C,className:`px-4 py-2 rounded transition-all duration-200 ${C?"bg-gray-200 hover:bg-gray-300 text-gray-700 btn-secondary":"bg-gray-100 text-gray-400 cursor-not-allowed"}`,children:["Next",e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",className:"h-5 w-5 inline-block ml-1",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z",clipRule:"evenodd"})})]})]}),Er=()=>{const{t:r}=le(),C=Be(),{serverName:f}=tr(),{showToast:c}=nr(),[x,g]=ar(),i=x.get("tab")||"cloud",{servers:l,allServers:j,categories:m,loading:_,error:D,setError:M,searchServers:z,filterByCategory:O,filterByTag:L,selectedCategory:N,selectedTag:H,installServer:S,fetchServerByName:P,isServerInstalled:U,currentPage:Z,totalPages:T,changePage:R,serversPerPage:W,changeServersPerPage:A}=cr(),{servers:re,allServers:K,loading:y,error:k,setError:V,fetchServerTools:te,callServerTool:b,currentPage:E,totalPages:w,changePage:F,serversPerPage:d,changeServersPerPage:p}=dr(),{servers:h,allServers:n,loading:o,error:X,setError:a,searchServers:t,clearSearch:u,fetchServerByName:I,fetchServerVersions:B,currentPage:ee,totalPages:ne,hasNextPage:ae,hasPreviousPage:oe,changePage:$e,goToNextPage:ze,goToPreviousPage:_e,serversPerPage:De,changeServersPerPage:Ve}=mr(),[xe,Pe]=s.useState(null),[ge,Ee]=s.useState(null),[he,Le]=s.useState(null),[fe,Re]=s.useState(""),[pe,Te]=s.useState(""),[ye,de]=s.useState(!1),[He,Fe]=s.useState(new Set),[Ue,Oe]=s.useState(new Set);s.useEffect(()=>{(async()=>{if(f)if(i==="cloud"){const $=re.find(Y=>Y.name===f);$?Ee($):C("/market?tab=cloud")}else if(i==="registry"){console.log("Loading registry server details for:",f);const $=await I(f);$?Le($):C("/market?tab=registry")}else{const $=await P(f);$?Pe($):C("/market?tab=local")}else Pe(null),Ee(null),Le(null)})()},[f,i,re,P,I,C]);const be=v=>{const $=new URLSearchParams(x);$.set("tab",v),g($),f&&C("/market?"+$.toString())},We=v=>{v.preventDefault(),i==="local"?z(fe):i==="registry"&&t(pe)},Ke=v=>{i==="local"&&O(v)},Ye=()=>{i==="local"?(Re(""),O(""),L("")):i==="registry"&&(Te(""),u())},ve=v=>{var $;if(i==="cloud")C(`/market/${v.name}?tab=cloud`);else if(i==="registry"){const Y=v;console.log("Registry server clicked:",Y);const Q=($=Y.server)==null?void 0:$.name;if(console.log("Server name extracted:",Q),Q){const se=`/market/${encodeURIComponent(Q)}?tab=registry`;console.log("Navigating to:",se),C(se)}else console.error("Server name is undefined in registry server:",Y)}else C(`/market/${v.name}?tab=local`)},je=()=>{C(`/market?tab=${i}`)},Qe=async(v,$)=>{try{de(!0),await S(v,$)&&c(r("market.installSuccess",{serverName:v.display_name}),"success")}finally{de(!1)}},Ge=async(v,$)=>{try{de(!0);const Y={name:v.name,config:$},Q=await ue("/servers",Y);if(!Q.success){const se=(Q==null?void 0:Q.message)||r("server.addError");c(se,"error");return}Fe(se=>new Set(se).add(v.name)),c(r("cloud.installSuccess",{name:v.title||v.name}),"success")}catch(Y){console.error("Error installing cloud server:",Y);const Q=Y instanceof Error?Y.message:String(Y);c(r("cloud.installError",{error:Q}),"error")}finally{de(!1)}},qe=async(v,$)=>{try{de(!0);const Y={name:v.name,config:$},Q=await ue("/servers",Y);if(!Q.success){const se=(Q==null?void 0:Q.message)||r("server.addError");c(se,"error");return}Oe(se=>new Set(se).add(v.name)),c(r("registry.installSuccess",{name:v.title||v.name}),"success")}catch(Y){console.error("Error installing registry server:",Y);const Q=Y instanceof Error?Y.message:String(Y);c(r("registry.installError",{error:Q}),"error")}finally{de(!1)}},Je=async(v,$,Y)=>{try{const Q=await b(v,$,Y);return c(r("cloud.toolCallSuccess",{toolName:$}),"success"),Q}catch(Q){const se=Q instanceof Error?Q.message:String(Q);throw Me(se)||c(r("cloud.toolCallError",{toolName:$,error:se}),"error"),Q}},Me=v=>v==="MCPROUTER_API_KEY_NOT_CONFIGURED"||v.toLowerCase().includes("mcprouter api key not configured"),Xe=v=>{i==="local"?R(v):i==="registry"?$e(v):F(v),window.scrollTo({top:0,behavior:"smooth"})},Ze=v=>{const $=parseInt(v.target.value,10);i==="local"?A($):i==="registry"?Ve($):p($)};if(xe)return e.jsx(xr,{server:xe,onBack:je,onInstall:Qe,installing:ye,isInstalled:U(xe.name)});if(ge)return e.jsx(hr,{serverName:ge.name,onBack:je,onCallTool:Je,fetchServerTools:te,onInstall:Ge,installing:ye,isInstalled:He.has(ge.name)});if(he)return e.jsx(pr,{serverEntry:he,onBack:je,onInstall:qe,installing:ye,isInstalled:Ue.has(he.server.name),fetchVersions:B});const q=i==="local",G=i==="registry",Ne=q?l:G?h:re,me=q?j:G?n:K,Ae=q?m:[],Ie=q?_:G?o:y,ke=q?D:G?X:k,er=q?M:G?a:V,we=q?N:"",rr=q?H:"",ie=q?Z:G?ee:E,sr=q?T:G?ne:w,ce=q?W:G?De:d;return e.jsxs("div",{children:[e.jsx("div",{className:"mb-6",children:e.jsx("div",{className:"border-b border-gray-200 dark:border-gray-700",children:e.jsxs("nav",{className:"-mb-px flex space-x-3",children:[e.jsxs("button",{onClick:()=>be("cloud"),className:`py-2 px-1 border-b-2 font-medium text-lg hover:cursor-pointer transition-colors duration-200 ${!q&&!G?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}`,children:[r("cloud.title"),e.jsxs("span",{className:"text-xs text-gray-400 font-normal ml-1",children:["(",e.jsx("a",{href:"https://mcprouter.co",target:"_blank",rel:"noopener noreferrer",className:"external-link",children:"MCPRouter"}),")"]})]}),e.jsxs("button",{onClick:()=>be("local"),className:`py-2 px-1 border-b-2 font-medium text-lg hover:cursor-pointer transition-colors duration-200 ${q?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}`,children:[r("market.title"),e.jsxs("span",{className:"text-xs text-gray-400 font-normal ml-1",children:["(",e.jsx("a",{href:"https://mcpm.sh",target:"_blank",rel:"noopener noreferrer",className:"external-link",children:"MCPM"}),")"]})]}),e.jsxs("button",{onClick:()=>be("registry"),className:`py-2 px-1 border-b-2 font-medium text-lg hover:cursor-pointer transition-colors duration-200 ${G?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}`,children:[r("registry.title"),e.jsxs("span",{className:"text-xs text-gray-400 font-normal ml-1",children:["(",e.jsx("a",{href:"https://registry.modelcontextprotocol.io",target:"_blank",rel:"noopener noreferrer",className:"external-link",children:r("registry.official")}),")"]})]})]})})}),ke&&e.jsx(e.Fragment,{children:!q&&Me(ke)?e.jsx(Se,{}):e.jsx("div",{className:"bg-red-100 border-l-4 border-red-500 text-red-700 dark:text-red-400 p-4 mb-6 error-box rounded-lg",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("p",{children:ke}),e.jsx("button",{onClick:()=>er(null),className:"text-red-700 dark:text-red-400 hover:text-red-900 transition-colors duration-200",children:e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",className:"h-5 w-5",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 011.414 0L10 8.586l4.293-4.293a1 1 01.414 1.414L11.414 10l4.293 4.293a1 1 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 01-1.414-1.414L8.586 10 4.293 5.707a1 1 010-1.414z",clipRule:"evenodd"})})})]})})}),(q||G)&&e.jsx("div",{className:"bg-white dark:bg-gray-800 shadow rounded-lg p-6 mb-6 page-card",children:e.jsxs("form",{onSubmit:We,className:"flex space-x-4 mb-0",children:[e.jsx("div",{className:"flex-grow",children:e.jsx("input",{type:"text",value:G?pe:fe,onChange:v=>{G?Te(v.target.value):Re(v.target.value)},placeholder:r(G?"registry.searchPlaceholder":"market.searchPlaceholder"),className:"shadow appearance-none border border-gray-200 dark:border-gray-700 rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline form-input"})}),e.jsx("button",{type:"submit",className:"px-4 py-2 bg-blue-100 text-blue-800 rounded hover:bg-blue-200 flex items-center btn-primary transition-all duration-200",children:r(G?"registry.search":"market.search")}),(q&&(fe||we||rr)||G&&pe)&&e.jsx("button",{type:"button",onClick:Ye,className:"border border-gray-300 text-gray-700 font-medium py-2 px-4 rounded hover:bg-gray-50 dark:bg-gray-800 dark:hover:bg-gray-700 btn-secondary transition-all duration-200",children:r(G?"registry.clearFilters":"market.clearFilters")})]})}),e.jsxs("div",{className:"flex flex-col md:flex-row gap-6",children:[q&&e.jsx("div",{className:"md:w-48 flex-shrink-0",children:e.jsx("div",{className:"bg-white dark:bg-gray-800 shadow rounded-lg p-4 mb-6 sticky top-4 page-card",children:Ae.length>0?e.jsxs("div",{className:"mb-6",children:[e.jsxs("div",{className:"flex justify-between items-center mb-3",children:[e.jsx("h3",{className:"font-medium text-gray-900",children:r("market.categories")}),we&&e.jsx("span",{className:"text-xs text-blue-600 cursor-pointer hover:underline transition-colors duration-200",onClick:()=>O(""),children:r("market.clearCategoryFilter")})]}),e.jsx("div",{className:"flex flex-col gap-2",children:Ae.map(v=>e.jsx("button",{onClick:()=>Ke(v),className:`px-3 py-2 rounded text-sm text-left transition-all duration-200 ${we===v?"bg-blue-100 text-blue-800 font-medium btn-primary":"bg-gray-100 text-gray-800 hover:bg-gray-200 btn-secondary"}`,children:v},v))})]}):Ie?e.jsxs("div",{className:"mb-6",children:[e.jsx("div",{className:"mb-3",children:e.jsx("h3",{className:"font-medium text-gray-900",children:r("market.categories")})}),e.jsxs("div",{className:"flex flex-col gap-2 items-center py-4 loading-container",children:[e.jsxs("svg",{className:"animate-spin h-6 w-6 text-blue-500 mb-2",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[e.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),e.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),e.jsx("p",{className:"text-sm text-gray-600",children:r("app.loading")})]})]}):e.jsxs("div",{className:"mb-6",children:[e.jsx("div",{className:"mb-3",children:e.jsx("h3",{className:"font-medium text-gray-900",children:r("market.categories")})}),e.jsx("p",{className:"text-sm text-gray-600 py-2",children:r("market.noCategories")})]})})}),e.jsx("div",{className:"flex-grow",children:Ie?e.jsx("div",{className:"bg-white dark:bg-gray-800 shadow rounded-lg p-6 flex items-center justify-center",children:e.jsxs("div",{className:"flex flex-col items-center",children:[e.jsxs("svg",{className:"animate-spin h-10 w-10 text-blue-500 mb-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[e.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),e.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),e.jsx("p",{className:"text-gray-600",children:r("app.loading")})]})}):Ne.length===0?e.jsx("div",{className:"bg-white dark:bg-gray-800 shadow rounded-lg p-6",children:e.jsx("p",{className:"text-gray-600",children:r(q?"market.noServers":G?"registry.noServers":"cloud.noServers")})}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 gap-6",children:Ne.map((v,$)=>q?e.jsx(ur,{server:v,onClick:ve},$):G?e.jsx(fr,{serverEntry:v,onClick:ve},$):e.jsx(gr,{server:v,onClick:ve},$))}),e.jsxs("div",{className:"flex items-center mb-4",children:[e.jsx("div",{className:"flex-[2] text-sm text-gray-500",children:q?r("market.showing",{from:(ie-1)*ce+1,to:Math.min(ie*ce,me.length),total:me.length}):G?r("registry.showing",{from:(ie-1)*ce+1,to:(ie-1)*ce+Ne.length,total:me.length+(ae?"+":"")}):r("cloud.showing",{from:(ie-1)*ce+1,to:Math.min(ie*ce,me.length),total:me.length})}),e.jsx("div",{className:"flex-[4] flex justify-center",children:G?e.jsx(vr,{currentPage:ie,hasNextPage:ae,hasPreviousPage:oe,onNextPage:ze,onPreviousPage:_e}):e.jsx(ir,{currentPage:ie,totalPages:sr,onPageChange:Xe})}),e.jsxs("div",{className:"flex-[2] flex items-center justify-end space-x-2",children:[e.jsxs("label",{htmlFor:"perPage",className:"text-sm text-gray-600",children:[r(q?"market.perPage":G?"registry.perPage":"cloud.perPage"),":"]}),e.jsxs("select",{id:"perPage",value:ce,onChange:Ze,className:"border rounded p-1 text-sm btn-secondary outline-none",children:[e.jsx("option",{value:"6",children:"6"}),e.jsx("option",{value:"9",children:"9"}),e.jsx("option",{value:"12",children:"12"}),e.jsx("option",{value:"24",children:"24"})]})]})]})]})})]})]})};export{Er as default};
|
|
3
|
-
//# sourceMappingURL=MarketPage-haRuzjCw.js.map
|