@samanhappy/mcphub 0.12.15 → 0.12.17

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.
Files changed (73) hide show
  1. package/dist/config/index.js +9 -9
  2. package/dist/config/index.js.map +1 -1
  3. package/dist/controllers/oauthCallbackController.js +10 -5
  4. package/dist/controllers/oauthCallbackController.js.map +1 -1
  5. package/dist/middlewares/userContext.js +17 -2
  6. package/dist/middlewares/userContext.js.map +1 -1
  7. package/dist/server.js +2 -4
  8. package/dist/server.js.map +1 -1
  9. package/dist/services/mcpService.js +7 -2
  10. package/dist/services/mcpService.js.map +1 -1
  11. package/dist/services/sseService.js +14 -1
  12. package/dist/services/sseService.js.map +1 -1
  13. package/dist/services/vectorSearchService.js +5 -1
  14. package/dist/services/vectorSearchService.js.map +1 -1
  15. package/dist/utils/proxyTrust.js +20 -0
  16. package/dist/utils/proxyTrust.js.map +1 -0
  17. package/frontend/dist/assets/ActivityPage-ClgKeihP.js +2 -0
  18. package/frontend/dist/assets/ActivityPage-ClgKeihP.js.map +1 -0
  19. package/frontend/dist/assets/Badge-Ck2fhRdl.js +2 -0
  20. package/frontend/dist/assets/Badge-Ck2fhRdl.js.map +1 -0
  21. package/frontend/dist/assets/ConfirmDialog-uYjffH4V.js +2 -0
  22. package/frontend/dist/assets/ConfirmDialog-uYjffH4V.js.map +1 -0
  23. package/frontend/dist/assets/Dashboard-BIXrLobn.js +2 -0
  24. package/frontend/dist/assets/Dashboard-BIXrLobn.js.map +1 -0
  25. package/frontend/dist/assets/DeleteDialog-BAfrV8EB.js +2 -0
  26. package/frontend/dist/assets/DeleteDialog-BAfrV8EB.js.map +1 -0
  27. package/frontend/dist/assets/GroupsPage-BjrvyHwu.js +33 -0
  28. package/frontend/dist/assets/GroupsPage-BjrvyHwu.js.map +1 -0
  29. package/frontend/dist/assets/LoginPage-BBHt_TfF.js +2 -0
  30. package/frontend/dist/assets/LoginPage-BBHt_TfF.js.map +1 -0
  31. package/frontend/dist/assets/LogsPage-D8Znq5NB.js +2 -0
  32. package/frontend/dist/assets/LogsPage-D8Znq5NB.js.map +1 -0
  33. package/frontend/dist/assets/MarketPage-haRuzjCw.js +3 -0
  34. package/frontend/dist/assets/MarketPage-haRuzjCw.js.map +1 -0
  35. package/frontend/dist/assets/Pagination-y-gVO8ms.js +2 -0
  36. package/frontend/dist/assets/Pagination-y-gVO8ms.js.map +1 -0
  37. package/frontend/dist/assets/PromptsPage-ByHWPyGe.js +2 -0
  38. package/frontend/dist/assets/PromptsPage-ByHWPyGe.js.map +1 -0
  39. package/frontend/dist/assets/ResourcesPage-Bodw5OY9.js +2 -0
  40. package/frontend/dist/assets/ResourcesPage-Bodw5OY9.js.map +1 -0
  41. package/frontend/dist/assets/ServersPage-CtS1I4yS.js +37 -0
  42. package/frontend/dist/assets/ServersPage-CtS1I4yS.js.map +1 -0
  43. package/frontend/dist/assets/SettingsPage-DxVigf7p.js +12 -0
  44. package/frontend/dist/assets/SettingsPage-DxVigf7p.js.map +1 -0
  45. package/frontend/dist/assets/ToggleGroup-HfxdlkGi.js +2 -0
  46. package/frontend/dist/assets/ToggleGroup-HfxdlkGi.js.map +1 -0
  47. package/frontend/dist/assets/UsersPage-Bipw33cS.js +2 -0
  48. package/frontend/dist/assets/UsersPage-Bipw33cS.js.map +1 -0
  49. package/frontend/dist/assets/framework-vendor-_OBebcuv.js +61 -0
  50. package/frontend/dist/assets/framework-vendor-_OBebcuv.js.map +1 -0
  51. package/frontend/dist/assets/i18n-vendor-MQ921plD.js +2 -0
  52. package/frontend/dist/assets/i18n-vendor-MQ921plD.js.map +1 -0
  53. package/frontend/dist/assets/icons-vendor-B67NtVuR.js +172 -0
  54. package/frontend/dist/assets/icons-vendor-B67NtVuR.js.map +1 -0
  55. package/frontend/dist/assets/index-CmnA4an8.js +5 -0
  56. package/frontend/dist/assets/index-CmnA4an8.js.map +1 -0
  57. package/frontend/dist/assets/index-DfFHVARX.css +1 -0
  58. package/frontend/dist/assets/resourceService-BfCTSBsr.js +2 -0
  59. package/frontend/dist/assets/{resourceService-C3LGHhTi.js.map → resourceService-BfCTSBsr.js.map} +1 -1
  60. package/frontend/dist/assets/useGroupData-DLhbP6zd.js +2 -0
  61. package/frontend/dist/assets/useGroupData-DLhbP6zd.js.map +1 -0
  62. package/frontend/dist/assets/useServerData-QZqQTYcv.js +2 -0
  63. package/frontend/dist/assets/useServerData-QZqQTYcv.js.map +1 -0
  64. package/frontend/dist/assets/useSettingsData-D3VROqS7.js +2 -0
  65. package/frontend/dist/assets/useSettingsData-D3VROqS7.js.map +1 -0
  66. package/frontend/dist/assets/variableDetection-C3Xi21av.js +16 -0
  67. package/frontend/dist/assets/variableDetection-C3Xi21av.js.map +1 -0
  68. package/frontend/dist/index.html +5 -2
  69. package/package.json +2 -2
  70. package/frontend/dist/assets/index-CebeneXS.js +0 -323
  71. package/frontend/dist/assets/index-CebeneXS.js.map +0 -1
  72. package/frontend/dist/assets/index-PEyR1nSL.css +0 -1
  73. package/frontend/dist/assets/resourceService-C3LGHhTi.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketPage-haRuzjCw.js","sources":["../../src/hooks/useMarketData.ts","../../src/hooks/useCloudData.ts","../../src/hooks/useRegistryData.ts","../../src/components/MarketServerCard.tsx","../../src/components/MarketServerDetail.tsx","../../src/components/CloudServerCard.tsx","../../src/components/MCPRouterApiKeyError.tsx","../../src/components/CloudServerDetail.tsx","../../src/components/RegistryServerCard.tsx","../../src/components/RegistryServerDetail.tsx","../../src/components/ui/CursorPagination.tsx","../../src/pages/MarketPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MarketServer, ApiResponse, ServerConfig } from '@/types';\nimport { apiGet, apiPost } from '../utils/fetchInterceptor';\n\nexport const useMarketData = () => {\n const { t } = useTranslation();\n const [servers, setServers] = useState<MarketServer[]>([]);\n const [allServers, setAllServers] = useState<MarketServer[]>([]);\n const [categories, setCategories] = useState<string[]>([]);\n const [tags, setTags] = useState<string[]>([]);\n const [selectedCategory, setSelectedCategory] = useState<string>('');\n const [selectedTag, setSelectedTag] = useState<string>('');\n const [searchQuery, setSearchQuery] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [currentServer, setCurrentServer] = useState<MarketServer | null>(null);\n const [installedServers, setInstalledServers] = useState<string[]>([]);\n\n // Pagination states\n const [currentPage, setCurrentPage] = useState(1);\n const [serversPerPage, setServersPerPage] = useState(9);\n const [totalPages, setTotalPages] = useState(1);\n\n // Fetch all market servers\n const fetchMarketServers = useCallback(async () => {\n try {\n setLoading(true);\n const data: ApiResponse<MarketServer[]> = await apiGet('/market/servers');\n\n if (data && data.success && Array.isArray(data.data)) {\n setAllServers(data.data);\n // Apply pagination to the fetched data\n applyPagination(data.data, currentPage);\n } else {\n console.error('Invalid market servers data format', { data });\n setError(t('market.fetchError'));\n }\n } catch (err) {\n console.error('Error fetching market servers', { err });\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n }, [t]);\n\n // Apply pagination to data\n const applyPagination = useCallback(\n (data: MarketServer[], page: number, itemsPerPage = serversPerPage) => {\n const totalItems = data.length;\n const calculatedTotalPages = Math.ceil(totalItems / itemsPerPage);\n setTotalPages(calculatedTotalPages);\n\n // Ensure current page is valid\n const validPage = Math.max(1, Math.min(page, calculatedTotalPages));\n if (validPage !== page) {\n setCurrentPage(validPage);\n }\n\n const startIndex = (validPage - 1) * itemsPerPage;\n const paginatedServers = data.slice(startIndex, startIndex + itemsPerPage);\n setServers(paginatedServers);\n },\n [serversPerPage],\n );\n\n // Change page\n const changePage = useCallback(\n (page: number) => {\n setCurrentPage(page);\n applyPagination(allServers, page, serversPerPage);\n },\n [allServers, applyPagination, serversPerPage],\n );\n\n // Fetch all categories\n const fetchCategories = useCallback(async () => {\n try {\n const data: ApiResponse<string[]> = await apiGet('/market/categories');\n\n if (data && data.success && Array.isArray(data.data)) {\n setCategories(data.data);\n } else {\n console.error('Invalid categories data format', { data });\n }\n } catch (err) {\n console.error('Error fetching categories', { err });\n }\n }, []);\n\n // Fetch all tags\n const fetchTags = useCallback(async () => {\n try {\n const data: ApiResponse<string[]> = await apiGet('/market/tags');\n\n if (data && data.success && Array.isArray(data.data)) {\n setTags(data.data);\n } else {\n console.error('Invalid tags data format', { data });\n }\n } catch (err) {\n console.error('Error fetching tags', { err });\n }\n }, []);\n\n // Fetch server by name\n const fetchServerByName = useCallback(\n async (name: string) => {\n try {\n setLoading(true);\n const data: ApiResponse<MarketServer> = await apiGet(`/market/servers/${name}`);\n\n if (data && data.success && data.data) {\n setCurrentServer(data.data);\n return data.data;\n } else {\n console.error('Invalid market server data format', { name, data });\n setError(t('market.serverNotFound'));\n return null;\n }\n } catch (err) {\n console.error('Error fetching market server', { name, err });\n setError(err instanceof Error ? err.message : String(err));\n return null;\n } finally {\n setLoading(false);\n }\n },\n [t],\n );\n\n // Search servers by query\n const searchServers = useCallback(\n async (query: string) => {\n try {\n setLoading(true);\n setSearchQuery(query);\n\n if (!query.trim()) {\n // Fetch fresh data from server instead of just applying pagination\n fetchMarketServers();\n return;\n }\n\n const data: ApiResponse<MarketServer[]> = await apiGet(\n `/market/servers/search?query=${encodeURIComponent(query)}`,\n );\n\n if (data && data.success && Array.isArray(data.data)) {\n setAllServers(data.data);\n setCurrentPage(1);\n applyPagination(data.data, 1);\n } else {\n console.error('Invalid market search results format', { query, data });\n setError(t('market.searchError'));\n }\n } catch (err) {\n console.error('Error searching market servers', { query, err });\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n },\n [t, allServers, applyPagination, fetchMarketServers],\n );\n\n // Filter servers by category\n const filterByCategory = useCallback(\n async (category: string) => {\n try {\n setLoading(true);\n setSelectedCategory(category);\n setSelectedTag(''); // Reset tag filter when filtering by category\n\n if (!category) {\n fetchMarketServers();\n return;\n }\n\n const data: ApiResponse<MarketServer[]> = await apiGet(\n `/market/categories/${encodeURIComponent(category)}`,\n );\n\n if (data && data.success && Array.isArray(data.data)) {\n setAllServers(data.data);\n setCurrentPage(1);\n applyPagination(data.data, 1);\n } else {\n console.error('Invalid market category filter results format', { category, data });\n setError(t('market.filterError'));\n }\n } catch (err) {\n console.error('Error filtering market servers by category', { category, err });\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n },\n [t, fetchMarketServers, applyPagination],\n );\n\n // Filter servers by tag\n const filterByTag = useCallback(\n async (tag: string) => {\n try {\n setLoading(true);\n setSelectedTag(tag);\n setSelectedCategory(''); // Reset category filter when filtering by tag\n\n if (!tag) {\n fetchMarketServers();\n return;\n }\n\n const data: ApiResponse<MarketServer[]> = await apiGet(\n `/market/tags/${encodeURIComponent(tag)}`,\n );\n\n if (data && data.success && Array.isArray(data.data)) {\n setAllServers(data.data);\n setCurrentPage(1);\n applyPagination(data.data, 1);\n } else {\n console.error('Invalid market tag filter results format', { tag, data });\n setError(t('market.tagFilterError'));\n }\n } catch (err) {\n console.error('Error filtering market servers by tag', { tag, err });\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n },\n [t, fetchMarketServers, applyPagination],\n );\n\n // Fetch installed servers\n const fetchInstalledServers = useCallback(async () => {\n try {\n const data = await apiGet<{ success: boolean; data: any[] }>('/servers');\n\n if (data && data.success && Array.isArray(data.data)) {\n // Extract server names\n const installedServerNames = data.data.map((server: any) => server.name);\n setInstalledServers(installedServerNames);\n }\n } catch (err) {\n console.error('Error fetching installed servers', { err });\n }\n }, []);\n\n // Check if a server is already installed\n const isServerInstalled = useCallback(\n (serverName: string) => {\n return installedServers.includes(serverName);\n },\n [installedServers],\n );\n\n // Install server to the local environment\n const installServer = useCallback(\n async (server: MarketServer, customConfig: ServerConfig) => {\n try {\n const installType = server.installations?.npm\n ? 'npm'\n : Object.keys(server.installations || {}).length > 0\n ? Object.keys(server.installations)[0]\n : null;\n\n if (!installType || !server.installations?.[installType]) {\n setError(t('market.noInstallationMethod'));\n return false;\n }\n\n const installation = server.installations[installType];\n\n // Prepare server configuration, merging with customConfig\n const serverConfig = {\n name: server.name,\n config:\n customConfig.type === 'stdio'\n ? {\n command: customConfig.command || installation.command || '',\n args: customConfig.args || installation.args || [],\n env: { ...installation.env, ...customConfig.env },\n }\n : customConfig,\n };\n\n // Call the createServer API\n const result = await apiPost<{ success: boolean; message?: string }>(\n '/servers',\n serverConfig,\n );\n\n if (!result.success) {\n throw new Error(result.message || 'Failed to install server');\n }\n\n // Update installed servers list after successful installation\n await fetchInstalledServers();\n return true;\n } catch (err) {\n console.error('Error installing market server', { serverName: server.name, err });\n setError(err instanceof Error ? err.message : String(err));\n return false;\n }\n },\n [t, fetchInstalledServers],\n );\n\n // Change servers per page\n const changeServersPerPage = useCallback(\n (perPage: number) => {\n setServersPerPage(perPage);\n setCurrentPage(1);\n applyPagination(allServers, 1, perPage);\n },\n [allServers, applyPagination],\n );\n\n // Load initial data\n useEffect(() => {\n fetchMarketServers();\n fetchCategories();\n fetchTags();\n fetchInstalledServers();\n }, [fetchMarketServers, fetchCategories, fetchTags, fetchInstalledServers]);\n\n return {\n servers,\n allServers,\n categories,\n tags,\n selectedCategory,\n selectedTag,\n searchQuery,\n loading,\n error,\n setError,\n currentServer,\n fetchMarketServers,\n fetchServerByName,\n searchServers,\n filterByCategory,\n filterByTag,\n installServer,\n // Pagination properties and methods\n currentPage,\n totalPages,\n serversPerPage,\n changePage,\n changeServersPerPage,\n // Installed servers methods\n isServerInstalled,\n };\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CloudServer, ApiResponse, CloudServerTool } from '@/types';\nimport { apiGet, apiPost } from '../utils/fetchInterceptor';\n\nexport const useCloudData = () => {\n const { t } = useTranslation();\n const [servers, setServers] = useState<CloudServer[]>([]);\n const [allServers, setAllServers] = useState<CloudServer[]>([]);\n const [categories, setCategories] = useState<string[]>([]);\n const [tags, setTags] = useState<string[]>([]);\n const [selectedCategory, setSelectedCategory] = useState<string>('');\n const [selectedTag, setSelectedTag] = useState<string>('');\n const [searchQuery, setSearchQuery] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [currentServer, setCurrentServer] = useState<CloudServer | null>(null);\n\n // Pagination states\n const [currentPage, setCurrentPage] = useState(1);\n const [serversPerPage, setServersPerPage] = useState(9);\n const [totalPages, setTotalPages] = useState(1);\n\n // Fetch all cloud market servers\n const fetchCloudServers = useCallback(async () => {\n try {\n setLoading(true);\n const data: ApiResponse<CloudServer[]> = await apiGet('/cloud/servers');\n\n if (data && data.success && Array.isArray(data.data)) {\n setAllServers(data.data);\n // Apply pagination to the fetched data\n applyPagination(data.data, currentPage);\n } else {\n console.error('Invalid cloud market servers data format', { data });\n setError(t('cloud.fetchError'));\n }\n } catch (err) {\n console.error('Error fetching cloud market servers', { err });\n const errorMessage = err instanceof Error ? err.message : String(err);\n // Keep the original error message for API key errors\n if (\n errorMessage === 'MCPROUTER_API_KEY_NOT_CONFIGURED' ||\n errorMessage.toLowerCase().includes('mcprouter api key not configured')\n ) {\n setError(errorMessage);\n } else {\n setError(errorMessage);\n }\n } finally {\n setLoading(false);\n }\n }, [t]);\n\n // Apply pagination to data\n const applyPagination = useCallback(\n (data: CloudServer[], page: number, itemsPerPage = serversPerPage) => {\n const totalItems = data.length;\n const calculatedTotalPages = Math.ceil(totalItems / itemsPerPage);\n setTotalPages(calculatedTotalPages);\n\n // Ensure current page is valid\n const validPage = Math.max(1, Math.min(page, calculatedTotalPages));\n if (validPage !== page) {\n setCurrentPage(validPage);\n }\n\n const startIndex = (validPage - 1) * itemsPerPage;\n const paginatedServers = data.slice(startIndex, startIndex + itemsPerPage);\n setServers(paginatedServers);\n },\n [serversPerPage],\n );\n\n // Change page\n const changePage = useCallback(\n (page: number) => {\n setCurrentPage(page);\n applyPagination(allServers, page, serversPerPage);\n },\n [allServers, applyPagination, serversPerPage],\n );\n\n // Fetch all categories\n const fetchCategories = useCallback(async () => {\n try {\n const data: ApiResponse<string[]> = await apiGet('/cloud/categories');\n\n if (data && data.success && Array.isArray(data.data)) {\n setCategories(data.data);\n } else {\n console.error('Invalid cloud market categories data format', { data });\n }\n } catch (err) {\n console.error('Error fetching cloud market categories', { err });\n }\n }, []);\n\n // Fetch all tags\n const fetchTags = useCallback(async () => {\n try {\n const data: ApiResponse<string[]> = await apiGet('/cloud/tags');\n\n if (data && data.success && Array.isArray(data.data)) {\n setTags(data.data);\n } else {\n console.error('Invalid cloud market tags data format', { data });\n }\n } catch (err) {\n console.error('Error fetching cloud market tags', { err });\n }\n }, []);\n\n // Fetch server by name\n const fetchServerByName = useCallback(\n async (name: string) => {\n try {\n setLoading(true);\n const data: ApiResponse<CloudServer> = await apiGet(`/cloud/servers/${name}`);\n\n if (data && data.success && data.data) {\n setCurrentServer(data.data);\n return data.data;\n } else {\n console.error('Invalid cloud server data format', { name, data });\n setError(t('cloud.serverNotFound'));\n return null;\n }\n } catch (err) {\n console.error('Error fetching cloud server', { name, err });\n const errorMessage = err instanceof Error ? err.message : String(err);\n // Keep the original error message for API key errors\n if (\n errorMessage === 'MCPROUTER_API_KEY_NOT_CONFIGURED' ||\n errorMessage.toLowerCase().includes('mcprouter api key not configured')\n ) {\n setError(errorMessage);\n } else {\n setError(errorMessage);\n }\n return null;\n } finally {\n setLoading(false);\n }\n },\n [t],\n );\n\n // Search servers by query\n const searchServers = useCallback(\n async (query: string) => {\n try {\n setLoading(true);\n setSearchQuery(query);\n\n if (!query.trim()) {\n // Fetch fresh data from server instead of just applying pagination\n fetchCloudServers();\n return;\n }\n\n const data: ApiResponse<CloudServer[]> = await apiGet(\n `/cloud/servers/search?query=${encodeURIComponent(query)}`,\n );\n\n if (data && data.success && Array.isArray(data.data)) {\n setAllServers(data.data);\n setCurrentPage(1);\n applyPagination(data.data, 1);\n } else {\n console.error('Invalid cloud search results format', { query, data });\n setError(t('cloud.searchError'));\n }\n } catch (err) {\n console.error('Error searching cloud servers', { query, err });\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n },\n [t, allServers, applyPagination, fetchCloudServers],\n );\n\n // Filter servers by category\n const filterByCategory = useCallback(\n async (category: string) => {\n try {\n setLoading(true);\n setSelectedCategory(category);\n setSelectedTag(''); // Reset tag filter when filtering by category\n\n if (!category) {\n fetchCloudServers();\n return;\n }\n\n const data: ApiResponse<CloudServer[]> = await apiGet(\n `/cloud/categories/${encodeURIComponent(category)}`,\n );\n\n if (data && data.success && Array.isArray(data.data)) {\n setAllServers(data.data);\n setCurrentPage(1);\n applyPagination(data.data, 1);\n } else {\n console.error('Invalid cloud category filter results format', { category, data });\n setError(t('cloud.filterError'));\n }\n } catch (err) {\n console.error('Error filtering cloud servers by category', { category, err });\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n },\n [t, fetchCloudServers, applyPagination],\n );\n\n // Filter servers by tag\n const filterByTag = useCallback(\n async (tag: string) => {\n try {\n setLoading(true);\n setSelectedTag(tag);\n setSelectedCategory(''); // Reset category filter when filtering by tag\n\n if (!tag) {\n fetchCloudServers();\n return;\n }\n\n const data: ApiResponse<CloudServer[]> = await apiGet(\n `/cloud/tags/${encodeURIComponent(tag)}`,\n );\n\n if (data && data.success && Array.isArray(data.data)) {\n setAllServers(data.data);\n setCurrentPage(1);\n applyPagination(data.data, 1);\n } else {\n console.error('Invalid cloud tag filter results format', { tag, data });\n setError(t('cloud.tagFilterError'));\n }\n } catch (err) {\n console.error('Error filtering cloud servers by tag', { tag, err });\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n },\n [t, fetchCloudServers, applyPagination],\n );\n\n // Fetch tools for a specific server\n const fetchServerTools = useCallback(async (serverName: string) => {\n try {\n const data: ApiResponse<CloudServerTool[]> = await apiGet(\n `/cloud/servers/${serverName}/tools`,\n );\n\n if (!data.success) {\n console.error('Failed to fetch cloud server tools', { serverName, data });\n throw new Error(data.message || 'Failed to fetch cloud server tools');\n }\n\n if (data && data.success && Array.isArray(data.data)) {\n return data.data;\n } else {\n console.error('Invalid cloud server tools data format', { serverName, data });\n return [];\n }\n } catch (err) {\n console.error('Error fetching tools for cloud server', { serverName, err });\n const errorMessage = err instanceof Error ? err.message : String(err);\n // Re-throw API key errors so they can be handled by the component\n if (\n errorMessage === 'MCPROUTER_API_KEY_NOT_CONFIGURED' ||\n errorMessage.toLowerCase().includes('mcprouter api key not configured')\n ) {\n throw err;\n }\n return [];\n }\n }, []);\n\n // Call a tool on a cloud server\n const callServerTool = useCallback(\n async (serverName: string, toolName: string, args: Record<string, any>) => {\n try {\n // URL-encode server and tool names to handle slashes (e.g., \"com.atlassian/atlassian-mcp-server\")\n const data = await apiPost(\n `/cloud/servers/${encodeURIComponent(serverName)}/tools/${encodeURIComponent(toolName)}/call`,\n {\n arguments: args,\n },\n );\n\n if (data && data.success) {\n return data.data;\n } else {\n throw new Error(data.message || 'Failed to call tool');\n }\n } catch (err) {\n console.error('Error calling tool on cloud server', { serverName, toolName, err });\n throw err;\n }\n },\n [],\n );\n\n // Change servers per page\n const changeServersPerPage = useCallback(\n (perPage: number) => {\n setServersPerPage(perPage);\n setCurrentPage(1);\n applyPagination(allServers, 1, perPage);\n },\n [allServers, applyPagination],\n );\n\n // Load initial data\n useEffect(() => {\n fetchCloudServers();\n fetchCategories();\n fetchTags();\n }, [fetchCloudServers, fetchCategories, fetchTags]);\n\n return {\n servers,\n allServers,\n categories,\n tags,\n selectedCategory,\n selectedTag,\n searchQuery,\n loading,\n error,\n setError,\n currentServer,\n fetchCloudServers: fetchCloudServers,\n fetchServerByName,\n searchServers,\n filterByCategory,\n filterByTag,\n fetchServerTools,\n callServerTool,\n // Pagination properties and methods\n currentPage,\n totalPages,\n serversPerPage,\n changePage,\n changeServersPerPage,\n };\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n RegistryServerEntry,\n RegistryServersResponse,\n RegistryServerVersionResponse,\n RegistryServerVersionsResponse,\n} from '@/types';\nimport { apiGet } from '../utils/fetchInterceptor';\n\nexport const useRegistryData = () => {\n const { t } = useTranslation();\n const [servers, setServers] = useState<RegistryServerEntry[]>([]);\n const [allServers, setAllServers] = useState<RegistryServerEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState<string>('');\n\n // Cursor-based pagination states\n const [currentPage, setCurrentPage] = useState(1);\n const [serversPerPage, setServersPerPage] = useState(9);\n const [nextCursor, setNextCursor] = useState<string | null>(null);\n const [hasNextPage, setHasNextPage] = useState(false);\n const [cursorHistory, setCursorHistory] = useState<string[]>([]);\n const [totalPages] = useState(1); // Legacy support, not used in cursor pagination\n\n // Fetch registry servers with cursor-based pagination\n const fetchRegistryServers = useCallback(\n async (cursor?: string, search?: string) => {\n try {\n setLoading(true);\n setError(null);\n\n // Build query parameters\n const params = new URLSearchParams();\n params.append('limit', serversPerPage.toString());\n if (cursor) {\n params.append('cursor', cursor);\n }\n const queryToUse = search !== undefined ? search : searchQuery;\n if (queryToUse.trim()) {\n params.append('search', queryToUse.trim());\n }\n\n const response = await apiGet(`/registry/servers?${params.toString()}`);\n\n if (response && response.success && response.data) {\n const data: RegistryServersResponse = response.data;\n if (data.servers && Array.isArray(data.servers)) {\n setServers(data.servers);\n // Update pagination state\n const hasMore = data.metadata.count === serversPerPage && !!data.metadata.nextCursor;\n setHasNextPage(hasMore);\n setNextCursor(data.metadata.nextCursor || null);\n\n // For display purposes, keep track of all loaded servers\n if (!cursor) {\n // First page\n setAllServers(data.servers);\n } else {\n // Subsequent pages - append to all servers\n setAllServers((prev) => [...prev, ...data.servers]);\n }\n } else {\n console.error('Invalid registry servers data format', { data });\n setError(t('registry.fetchError'));\n }\n } else {\n setError(t('registry.fetchError'));\n }\n } catch (err) {\n console.error('Error fetching registry servers', { cursor, search, err });\n const errorMessage = err instanceof Error ? err.message : String(err);\n setError(errorMessage);\n } finally {\n setLoading(false);\n }\n },\n [t, serversPerPage],\n );\n\n // Navigate to next page\n const goToNextPage = useCallback(async () => {\n if (!hasNextPage || !nextCursor) return;\n\n // Save current cursor to history for back navigation\n const currentCursor = cursorHistory[cursorHistory.length - 1] || '';\n setCursorHistory((prev) => [...prev, currentCursor]);\n\n setCurrentPage((prev) => prev + 1);\n await fetchRegistryServers(nextCursor, searchQuery);\n }, [hasNextPage, nextCursor, cursorHistory, searchQuery, fetchRegistryServers]);\n\n // Navigate to previous page\n const goToPreviousPage = useCallback(async () => {\n if (currentPage <= 1) return;\n\n // Get the previous cursor from history\n const newHistory = [...cursorHistory];\n newHistory.pop(); // Remove current position\n const previousCursor = newHistory[newHistory.length - 1];\n\n setCursorHistory(newHistory);\n setCurrentPage((prev) => prev - 1);\n\n // Fetch with previous cursor (undefined for first page)\n await fetchRegistryServers(previousCursor || undefined, searchQuery);\n }, [currentPage, cursorHistory, searchQuery, fetchRegistryServers]);\n\n // Change page (legacy support for page number navigation)\n const changePage = useCallback(\n async (page: number) => {\n if (page === currentPage) return;\n\n if (page > currentPage && hasNextPage) {\n await goToNextPage();\n } else if (page < currentPage && currentPage > 1) {\n await goToPreviousPage();\n }\n },\n [currentPage, hasNextPage, goToNextPage, goToPreviousPage],\n );\n\n // Change items per page\n const changeServersPerPage = useCallback(\n async (newServersPerPage: number) => {\n setServersPerPage(newServersPerPage);\n setCurrentPage(1);\n setCursorHistory([]);\n setAllServers([]);\n await fetchRegistryServers(undefined, searchQuery);\n },\n [searchQuery, fetchRegistryServers],\n );\n\n // Fetch server by name\n const fetchServerByName = useCallback(\n async (serverName: string) => {\n try {\n setLoading(true);\n setError(null);\n\n // URL encode the server name\n const encodedName = encodeURIComponent(serverName);\n const response = await apiGet(`/registry/servers/versions?serverName=${encodedName}`);\n\n if (response && response.success && response.data) {\n const data: RegistryServerVersionsResponse = response.data;\n if (data.servers && Array.isArray(data.servers) && data.servers.length > 0) {\n // Return the first server entry (should be the latest or specified version)\n return data.servers[0];\n } else {\n console.error('Invalid registry server data format', { serverName, data });\n setError(t('registry.serverNotFound'));\n return null;\n }\n } else {\n setError(t('registry.serverNotFound'));\n return null;\n }\n } catch (err) {\n console.error('Error fetching registry server', { serverName, err });\n const errorMessage = err instanceof Error ? err.message : String(err);\n setError(errorMessage);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [t],\n );\n\n // Fetch all versions of a server\n const fetchServerVersions = useCallback(async (serverName: string) => {\n try {\n setError(null);\n\n // URL encode the server name\n const encodedName = encodeURIComponent(serverName);\n const response = await apiGet(`/registry/servers/versions?serverName=${encodedName}`);\n\n if (response && response.success && response.data) {\n const data: RegistryServerVersionsResponse = response.data;\n if (data.servers && Array.isArray(data.servers)) {\n return data.servers;\n } else {\n console.error('Invalid registry server versions data format', { serverName, data });\n return [];\n }\n } else {\n return [];\n }\n } catch (err) {\n console.error('Error fetching versions for registry server', { serverName, err });\n const errorMessage = err instanceof Error ? err.message : String(err);\n setError(errorMessage);\n return [];\n }\n }, []);\n\n // Fetch specific version of a server\n const fetchServerVersion = useCallback(async (serverName: string, version: string) => {\n try {\n setError(null);\n\n // URL encode the server name and version\n const encodedName = encodeURIComponent(serverName);\n const encodedVersion = encodeURIComponent(version);\n const response = await apiGet(`/registry/servers/version?serverName=${encodedName}&version=${encodedVersion}`);\n\n if (response && response.success && response.data) {\n const data: RegistryServerVersionResponse = response.data;\n if (data && data.server) {\n return data;\n } else {\n console.error('Invalid registry server version data format', { serverName, version, data });\n return null;\n }\n } else {\n return null;\n }\n } catch (err) {\n console.error('Error fetching specific registry server version', { serverName, version, err });\n const errorMessage = err instanceof Error ? err.message : String(err);\n setError(errorMessage);\n return null;\n }\n }, []);\n\n // Search servers by query (client-side filtering on loaded data)\n const searchServers = useCallback(\n async (query: string) => {\n console.log('Searching registry servers', { query });\n setSearchQuery(query);\n setCurrentPage(1);\n setCursorHistory([]);\n setAllServers([]);\n\n await fetchRegistryServers(undefined, query);\n },\n [fetchRegistryServers],\n );\n\n // Clear search\n const clearSearch = useCallback(async () => {\n setSearchQuery('');\n setCurrentPage(1);\n setCursorHistory([]);\n setAllServers([]);\n await fetchRegistryServers(undefined, '');\n }, [fetchRegistryServers]);\n\n // Initial fetch\n useEffect(() => {\n fetchRegistryServers(undefined, searchQuery);\n // Only run on mount\n }, []);\n\n return {\n servers,\n allServers,\n loading,\n error,\n setError,\n searchQuery,\n searchServers,\n clearSearch,\n fetchServerByName,\n fetchServerVersions,\n fetchServerVersion,\n // Cursor-based pagination\n currentPage,\n totalPages,\n hasNextPage,\n hasPreviousPage: currentPage > 1,\n changePage,\n goToNextPage,\n goToPreviousPage,\n serversPerPage,\n changeServersPerPage,\n };\n};\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MarketServer } from '@/types';\n\ninterface MarketServerCardProps {\n server: MarketServer;\n onClick: (server: MarketServer) => void;\n}\n\nconst MarketServerCard: React.FC<MarketServerCardProps> = ({ server, onClick }) => {\n const { t } = useTranslation();\n\n // Get initials for avatar\n const getAuthorInitials = (name: string) => {\n return name\n .split(' ')\n .map(word => word.charAt(0))\n .join('')\n .toUpperCase()\n .slice(0, 2);\n };\n\n // Intelligently calculate how many tags to display to ensure they fit in a single line\n const getTagsToDisplay = () => {\n if (!server.tags || server.tags.length === 0) {\n return { tagsToShow: [], hasMore: false, moreCount: 0 };\n }\n\n // Estimate available width in the card (in characters)\n const estimatedAvailableWidth = 28; // Estimated number of characters that can fit in one line\n\n // Calculate the character space needed for tags and plus sign (including # and spacing)\n const calculateTagWidth = (tag: string) => tag.length + 3; // +3 for # and spacing\n\n // Loop to determine the maximum number of tags that can be displayed\n let totalWidth = 0;\n let i = 0;\n\n // First, sort tags by length to prioritize displaying shorter tags\n const sortedTags = [...server.tags].sort((a, b) => a.length - b.length);\n\n // Calculate how many tags can fit\n for (i = 0; i < sortedTags.length; i++) {\n const tagWidth = calculateTagWidth(sortedTags[i]);\n\n // If this tag would make the total width exceed available width, stop adding\n if (totalWidth + tagWidth > estimatedAvailableWidth) {\n break;\n }\n\n totalWidth += tagWidth;\n\n // If this is the last tag but there's still space, no need to show \"more\"\n if (i === sortedTags.length - 1) {\n return {\n tagsToShow: sortedTags,\n hasMore: false,\n moreCount: 0\n };\n }\n }\n\n // If there's not enough space to display any tags, show at least one\n if (i === 0 && sortedTags.length > 0) {\n i = 1;\n }\n\n // Calculate space needed for the \"more\" tag\n const moreCount = sortedTags.length - i;\n const moreTagWidth = 3 + String(moreCount).length + t('market.moreTags').length;\n\n // If there's enough remaining space to display the \"more\" tag\n if (totalWidth + moreTagWidth <= estimatedAvailableWidth || i < 1) {\n return {\n tagsToShow: sortedTags.slice(0, i),\n hasMore: true,\n moreCount\n };\n }\n\n // If there's not enough space for even the \"more\" tag, reduce one tag to make room\n return {\n tagsToShow: sortedTags.slice(0, Math.max(1, i - 1)),\n hasMore: true,\n moreCount: moreCount + 1\n };\n };\n\n const { tagsToShow, hasMore, moreCount } = getTagsToDisplay();\n\n return (\n <div\n 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\"\n onClick={() => onClick(server)}\n >\n {/* Background gradient overlay on hover */}\n <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\" />\n\n {/* Server Header */}\n <div className=\"relative z-10 flex-1 flex flex-col\">\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"flex-1\">\n <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\">\n {server.display_name}\n </h3>\n\n {/* Author Section */}\n <div className=\"flex items-center space-x-2 mb-1\">\n <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\">\n {getAuthorInitials(server.author?.name || t('market.unknown'))}\n </div>\n <div>\n <p className=\"text-xs font-medium text-gray-700\">{server.author?.name || t('market.unknown')}</p>\n </div>\n </div>\n </div>\n\n {/* Server Type Badge */}\n <div className=\"flex flex-col items-end space-y-2\">\n {server.is_official && (\n <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\">\n {t('market.official')}\n </span>\n )}\n </div>\n </div>\n\n {/* Description */}\n <div className=\"mb-2 flex-1\">\n <p className=\"text-gray-600 text-sm leading-relaxed line-clamp-2 min-h-[36px]\">\n {server.description}\n </p>\n </div>\n\n {/* Categories */}\n <div className=\"mb-2\">\n <div className=\"flex flex-wrap gap-1 min-h-[24px]\">\n {server.categories?.length > 0 ? (\n server.categories.map((category, index) => (\n <span\n key={index}\n className=\"bg-gray-100 dark:bg-gray-800 text-gray-800 text-xs px-2 py-1 rounded whitespace-nowrap\"\n >\n {category}\n </span>\n ))\n ) : (\n <span className=\"text-xs text-gray-400 py-1\">-</span>\n )}\n </div>\n </div>\n\n {/* Tags */}\n <div className=\"mb-2\">\n <div className=\"relative min-h-[24px] overflow-x-auto\">\n {server.tags?.length > 0 ? (\n <div className=\"flex gap-1 items-center whitespace-nowrap\">\n {tagsToShow.map((tag, index) => (\n <span\n key={index}\n className=\"bg-green-50 text-green-700 text-xs px-2 py-1 rounded flex-shrink-0\"\n >\n #{tag}\n </span>\n ))}\n {hasMore && (\n <span className=\"bg-gray-100 dark:bg-gray-800 text-gray-600 text-xs px-1.5 py-1 rounded flex-shrink-0\">\n +{moreCount} {t('market.moreTags')}\n </span>\n )}\n </div>\n ) : (\n <span className=\"text-xs text-gray-400 py-1\">-</span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default MarketServerCard;","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MarketServer, MarketServerInstallation } from '@/types';\nimport ServerForm from './ServerForm';\nimport { detectVariables } from '../utils/variableDetection';\n\nimport { ServerConfig } from '@/types';\n\ninterface MarketServerDetailProps {\n server: MarketServer;\n onBack: () => void;\n onInstall: (server: MarketServer, config: ServerConfig) => void;\n installing?: boolean;\n isInstalled?: boolean;\n}\n\nconst MarketServerDetail: React.FC<MarketServerDetailProps> = ({\n server,\n onBack,\n onInstall,\n installing = false,\n isInstalled = false,\n}) => {\n const { t } = useTranslation();\n const [modalVisible, setModalVisible] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [confirmationVisible, setConfirmationVisible] = useState(false);\n const [pendingPayload, setPendingPayload] = useState<any>(null);\n const [detectedVariables, setDetectedVariables] = useState<string[]>([]);\n\n // Helper function to determine button state\n const getButtonProps = () => {\n if (isInstalled) {\n return {\n className: 'bg-green-600 cursor-default px-4 py-2 rounded text-sm font-medium text-white',\n disabled: true,\n text: t('market.installed'),\n };\n } else if (installing) {\n return {\n className:\n 'bg-gray-400 cursor-not-allowed px-4 py-2 rounded text-sm font-medium text-white',\n disabled: true,\n text: t('market.installing'),\n };\n } else {\n return {\n className:\n 'bg-blue-600 hover:bg-blue-700 px-4 py-2 rounded text-sm font-medium text-white btn-primary',\n disabled: false,\n text: t('market.install'),\n };\n }\n };\n\n const toggleModal = () => {\n setModalVisible(!modalVisible);\n setError(null); // Clear any previous errors when toggling modal\n setConfirmationVisible(false);\n setPendingPayload(null);\n };\n\n const handleConfirmInstall = async () => {\n if (pendingPayload) {\n await proceedWithInstall(pendingPayload);\n setConfirmationVisible(false);\n setPendingPayload(null);\n }\n };\n\n const proceedWithInstall = async (payload: any) => {\n try {\n setError(null);\n onInstall(server, payload.config);\n setModalVisible(false);\n } catch (err) {\n console.error('Error installing server:', err);\n setError(t('errors.serverInstall'));\n }\n };\n\n const handleInstall = () => {\n if (!isInstalled) {\n toggleModal();\n }\n };\n\n // Get the preferred installation configuration based on priority:\n // npm > uvx > default\n const getPreferredInstallation = (): MarketServerInstallation | undefined => {\n if (!server.installations) {\n return undefined;\n }\n\n if (server.installations.npm) {\n return server.installations.npm;\n } else if (server.installations.uvx) {\n return server.installations.uvx;\n } else if (server.installations.default) {\n return server.installations.default;\n }\n\n // If none of the preferred types are available, get the first available installation type\n const installTypes = Object.keys(server.installations);\n if (installTypes.length > 0) {\n return server.installations[installTypes[0]];\n }\n\n return undefined;\n };\n\n const handleSubmit = async (payload: any) => {\n try {\n // Check for variables in the payload\n const variables = detectVariables(payload);\n\n if (variables.length > 0) {\n // Show confirmation dialog\n setDetectedVariables(variables);\n setPendingPayload(payload);\n setConfirmationVisible(true);\n } else {\n // Install directly if no variables found\n await proceedWithInstall(payload);\n }\n } catch (err) {\n console.error('Error processing server installation:', err);\n setError(t('errors.serverInstall'));\n }\n };\n\n const buttonProps = getButtonProps();\n const preferredInstallation = getPreferredInstallation();\n\n return (\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-md p-6\">\n <div className=\"mb-4\">\n <button onClick={onBack} className=\"text-gray-600 hover:text-gray-900 flex items-center\">\n <svg\n className=\"h-5 w-5 mr-1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n 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\"\n clipRule=\"evenodd\"\n />\n </svg>\n {t('market.backToList')}\n </button>\n </div>\n\n <div className=\"flex justify-between items-start mb-4\">\n <div>\n <h2 className=\"text-2xl font-bold text-gray-900 flex items-center flex-wrap\">\n {server.display_name}\n <span className=\"text-sm font-normal text-gray-500 ml-2\">({server.name})</span>\n <span className=\"text-sm font-normal text-gray-600 ml-4\">\n {t('market.author')}: {server.author?.name || t('market.unknown')} •{' '}\n {t('market.license')}: {server.license} •\n <a\n href={server.repository.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-500 hover:underline ml-1\"\n >\n {t('market.repository')}\n </a>\n </span>\n </h2>\n </div>\n\n <div className=\"flex items-center\">\n {server.is_official && (\n <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\">\n {t('market.official')}\n </span>\n )}\n <button\n onClick={handleInstall}\n disabled={buttonProps.disabled}\n className={buttonProps.className}\n >\n {buttonProps.text}\n </button>\n </div>\n </div>\n\n <p className=\"text-gray-700 mb-6\">{server.description}</p>\n\n <div className=\"mb-6\">\n <h3 className=\"text-lg font-semibold mb-3\">\n {t('market.categories')} & {t('market.tags')}\n </h3>\n <div className=\"flex flex-wrap gap-2\">\n {server.categories?.map((category, index) => (\n <span key={`cat-${index}`} className=\"bg-gray-100 dark:bg-gray-800 text-gray-800 px-3 py-1 rounded\">\n {category}\n </span>\n ))}\n {server.tags &&\n server.tags.map((tag, index) => (\n <span\n key={`tag-${index}`}\n className=\"bg-gray-100 dark:bg-gray-800 text-green-700 px-2 py-1 rounded text-sm\"\n >\n #{tag}\n </span>\n ))}\n </div>\n </div>\n\n {server.arguments && Object.keys(server.arguments).length > 0 && (\n <div className=\"mb-6\">\n <h3 className=\"text-lg font-semibold mb-3\">{t('market.arguments')}</h3>\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\">\n <thead className=\"bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700\">\n <tr>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap\">\n {t('market.argumentName')}\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap\">\n {t('market.description')}\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap\">\n {t('market.required')}\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap\">\n {t('market.example')}\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\">\n {Object.entries(server.arguments).map(([name, arg], index) => (\n <tr key={index}>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900\">\n {name}\n </td>\n <td className=\"px-6 py-4 text-sm text-gray-500\">{arg.description}</td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n {arg.required ? (\n <span className=\"text-green-600\">✓</span>\n ) : (\n <span className=\"text-gray-600\">✗</span>\n )}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n <code className=\"bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded\">{arg.example}</code>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n <div className=\"mb-6\">\n <h3 className=\"text-lg font-semibold mb-3\">{t('market.tools')}</h3>\n <div className=\"space-y-4\">\n {server.tools?.map((tool, index) => (\n <div key={index} className=\"border border-gray-200 dark:border-gray-700 rounded p-4\">\n <h4 className=\"font-medium mb-2\">\n {tool.name}\n <button\n type=\"button\"\n onClick={() => {\n // Toggle visibility of schema (simplified for this implementation)\n const element = document.getElementById(`schema-${index}`);\n if (element) {\n element.classList.toggle('hidden');\n }\n }}\n className=\"text-sm text-blue-500 font-normal hover:underline focus:outline-none ml-2\"\n >\n {t('market.viewSchema')}\n </button>\n </h4>\n <p className=\"text-gray-600 mb-2\">{tool.description}</p>\n <div className=\"mt-2\">\n <pre\n id={`schema-${index}`}\n className=\"hidden bg-gray-50 dark:bg-gray-800 p-3 rounded text-sm overflow-auto mt-2\"\n >\n {JSON.stringify(tool.inputSchema, null, 2)}\n </pre>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {server.examples && server.examples.length > 0 && (\n <div className=\"mb-6\">\n <h3 className=\"text-lg font-semibold mb-3\">{t('market.examples')}</h3>\n <div className=\"space-y-4\">\n {server.examples.map((example, index) => (\n <div key={index} className=\"border border-gray-200 dark:border-gray-700 rounded p-4\">\n <h4 className=\"font-medium mb-2\">{example.title}</h4>\n <p className=\"text-gray-600 mb-2\">{example.description}</p>\n <pre className=\"bg-gray-50 dark:bg-gray-800 p-3 rounded text-sm overflow-auto\">{example.prompt}</pre>\n </div>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"mt-6 flex justify-end\">\n <button\n onClick={handleInstall}\n disabled={buttonProps.disabled}\n className={buttonProps.className}\n >\n {buttonProps.text}\n </button>\n </div>\n\n {modalVisible && (\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\">\n <ServerForm\n onSubmit={handleSubmit}\n onCancel={toggleModal}\n modalTitle={t('market.installServer', { name: server.display_name })}\n formError={error}\n initialData={{\n name: server.name,\n status: 'disconnected',\n config: preferredInstallation\n ? {\n command: preferredInstallation.command || '',\n args: preferredInstallation.args || [],\n env: preferredInstallation.env || {},\n }\n : undefined,\n }}\n />\n </div>\n )}\n\n {confirmationVisible && (\n <div className=\"fixed inset-0 bg-black/50 z-[60] flex items-center justify-center p-4\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg p-6 w-full max-w-md\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n {t('server.confirmVariables')}\n </h3>\n <p className=\"text-gray-600 mb-4\">{t('server.variablesDetected')}</p>\n <div className=\"bg-yellow-50 border border-yellow-200 rounded p-3 mb-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n 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\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n <div className=\"ml-3\">\n <h4 className=\"text-sm font-medium text-yellow-800\">\n {t('server.detectedVariables')}:\n </h4>\n <ul className=\"mt-1 text-sm text-yellow-700\">\n {detectedVariables.map((variable, index) => (\n <li key={index} className=\"font-mono\">\n ${`{${variable}}`}\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n <p className=\"text-gray-600 text-sm mb-6\">{t('market.confirmVariablesMessage')}</p>\n <div className=\"flex justify-end space-x-3\">\n <button\n onClick={() => {\n setConfirmationVisible(false);\n setPendingPayload(null);\n }}\n 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\"\n >\n {t('common.cancel')}\n </button>\n <button\n onClick={handleConfirmInstall}\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 btn-primary\"\n >\n {t('market.confirmAndInstall')}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default MarketServerDetail;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CloudServer } from '@/types';\n\ninterface CloudServerCardProps {\n server: CloudServer;\n onClick: (server: CloudServer) => void;\n}\n\nconst CloudServerCard: React.FC<CloudServerCardProps> = ({ server, onClick }) => {\n const { t } = useTranslation();\n\n const handleClick = () => {\n onClick(server);\n };\n\n // Extract a brief description from content if description is too long\n const getDisplayDescription = () => {\n if (server.description && server.description.length <= 150) {\n return server.description;\n }\n\n // Try to extract a summary from content\n if (server.content) {\n const lines = server.content.split('\\n').filter(line => line.trim());\n for (const line of lines) {\n if (line.length > 50 && line.length <= 150) {\n return line;\n }\n }\n }\n\n return server.description ?\n server.description.slice(0, 150) + '...' :\n t('cloud.noDescription');\n };\n\n // Format date for display\n const formatDate = (dateString: string) => {\n try {\n const date = new Date(dateString);\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n return `${year}/${month}/${day}`;\n } catch {\n return '';\n }\n };\n\n // Get initials for avatar\n const getAuthorInitials = (name: string) => {\n return name\n .split(' ')\n .map(word => word.charAt(0))\n .join('')\n .toUpperCase()\n .slice(0, 2);\n };\n\n return (\n <div\n 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\"\n onClick={handleClick}\n >\n {/* Background gradient overlay on hover */}\n <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\" />\n\n {/* Server Header */}\n <div className=\"relative z-10 flex-1 flex flex-col\">\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex-1\">\n <h3 className=\"text-lg font-bold text-gray-900 group-hover:text-blue-600 transition-colors duration-200 mb-2 line-clamp-2\">\n {server.title || server.name}\n </h3>\n\n {/* Author Section */}\n <div className=\"flex items-center space-x-2 mb-2\">\n <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\">\n {getAuthorInitials(server.author_name)}\n </div>\n <div>\n <p className=\"text-sm font-medium text-gray-700\">{server.author_name}</p>\n {server.updated_at && (\n <p className=\"text-xs text-gray-500\">\n {t('cloud.updated')} {formatDate(server.updated_at)}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Server Type Badge */}\n <div className=\"flex flex-col items-end space-y-2\">\n <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\">\n MCP Server\n </span>\n </div>\n </div>\n\n {/* Description */}\n <div className=\"mb-3 flex-1\">\n <p className=\"text-gray-600 text-sm leading-relaxed line-clamp-2\">\n {getDisplayDescription()}\n </p>\n </div>\n\n {/* Tools Info */}\n {server.tools && server.tools.length > 0 && (\n <div className=\"mb-3\">\n <div className=\"flex items-center space-x-2\">\n <svg className=\"w-4 h-4 text-gray-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <span className=\"text-sm text-gray-600 font-medium\">\n {server.tools.length} {server.tools.length === 1 ? t('cloud.tool') : t('cloud.tools')}\n </span>\n </div>\n </div>\n )}\n\n {/* Footer - 固定在底部 */}\n <div className=\"flex items-center justify-between pt-3 border-t border-gray-100 dark:border-gray-700 mt-auto\">\n <div className=\"flex items-center space-x-2 text-xs text-gray-500\">\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <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\" />\n </svg>\n <span>{formatDate(server.created_at)}</span>\n </div>\n\n <div className=\"flex items-center text-blue-600 text-sm font-medium group-hover:text-blue-700 transition-colors\">\n <span>{t('cloud.viewDetails')}</span>\n <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\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default CloudServerCard;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom';\n\nconst MCPRouterApiKeyError: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n const handleConfigureSettings = () => {\n navigate('/settings');\n };\n\n const handleGetApiKey = () => {\n window.open('https://mcprouter.co', '_blank', 'noopener,noreferrer');\n };\n\n return (\n <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\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <svg\n className=\"h-5 w-5 text-amber-400 dark:text-amber-500\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n 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\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-amber-800 dark:text-amber-400\">\n {t('cloud.apiKeyNotConfigured')}\n </h3>\n <div className=\"mt-2 text-sm text-amber-700 dark:text-amber-300\">\n <p>{t('cloud.apiKeyNotConfiguredDescription')}</p>\n </div>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <button\n onClick={handleGetApiKey}\n 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\"\n >\n <svg\n className=\"w-4 h-4 mr-1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n {t('cloud.getApiKey')}\n </button>\n <button\n onClick={handleConfigureSettings}\n 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\"\n >\n <svg\n className=\"w-4 h-4 mr-1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n 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\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n {t('cloud.configureInSettings')}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default MCPRouterApiKeyError;\n","import React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CloudServer, CloudServerTool, ServerConfig } from '@/types';\nimport { apiGet } from '@/utils/fetchInterceptor';\nimport { useSettingsData } from '@/hooks/useSettingsData';\nimport MCPRouterApiKeyError from './MCPRouterApiKeyError';\nimport ServerForm from './ServerForm';\n\ninterface CloudServerDetailProps {\n serverName: string;\n onBack: () => void;\n onCallTool?: (serverName: string, toolName: string, args: Record<string, any>) => Promise<any>;\n fetchServerTools?: (serverName: string) => Promise<CloudServerTool[]>;\n onInstall?: (server: CloudServer, config: ServerConfig) => void;\n installing?: boolean;\n isInstalled?: boolean;\n}\n\nconst CloudServerDetail: React.FC<CloudServerDetailProps> = ({\n serverName,\n onBack,\n onCallTool,\n fetchServerTools,\n onInstall,\n installing = false,\n isInstalled = false\n}) => {\n const { t } = useTranslation();\n const { mcpRouterConfig } = useSettingsData();\n const [server, setServer] = useState<CloudServer | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [tools, setTools] = useState<CloudServerTool[]>([]);\n const [loadingTools, setLoadingTools] = useState(false);\n const [toolsApiKeyError, setToolsApiKeyError] = useState(false);\n const [toolCallLoading, setToolCallLoading] = useState<string | null>(null);\n const [toolCallResults, setToolCallResults] = useState<Record<string, any>>({});\n const [toolArgs, setToolArgs] = useState<Record<string, Record<string, any>>>({});\n const [expandedSchemas, setExpandedSchemas] = useState<Record<string, boolean>>({});\n const [modalVisible, setModalVisible] = useState(false);\n const [installError, setInstallError] = useState<string | null>(null);\n\n // Helper function to check if error is MCPRouter API key not configured\n const isMCPRouterApiKeyError = (errorMessage: string) => {\n console.error('Checking for MCPRouter API key error:', errorMessage);\n return errorMessage === 'MCPROUTER_API_KEY_NOT_CONFIGURED' ||\n errorMessage.toLowerCase().includes('mcprouter api key not configured');\n };\n\n // Helper function to determine button state for install\n const getInstallButtonProps = () => {\n if (isInstalled) {\n return {\n className: \"bg-green-600 cursor-default px-4 py-2 rounded text-sm font-medium text-white\",\n disabled: true,\n text: t('market.installed')\n };\n } else if (installing) {\n return {\n className: \"bg-gray-400 cursor-not-allowed px-4 py-2 rounded text-sm font-medium text-white\",\n disabled: true,\n text: t('market.installing')\n };\n } else {\n return {\n className: \"bg-blue-600 hover:bg-blue-700 px-4 py-2 rounded text-sm font-medium text-white transition-colors\",\n disabled: false,\n text: t('market.install')\n };\n }\n };\n\n // Handle install button click\n const handleInstall = () => {\n if (!isInstalled && onInstall) {\n setModalVisible(true);\n setInstallError(null);\n }\n };\n\n // Handle modal close\n const handleModalClose = () => {\n setModalVisible(false);\n setInstallError(null);\n };\n\n // Handle install form submission\n const handleInstallSubmit = async (payload: any) => {\n try {\n if (!server || !onInstall) return;\n\n setInstallError(null);\n onInstall(server, payload.config);\n setModalVisible(false);\n } catch (err) {\n console.error('Error installing server:', err);\n setInstallError(t('errors.serverInstall'));\n }\n };\n\n // Load server details\n useEffect(() => {\n const loadServerDetails = async () => {\n try {\n setLoading(true);\n setError(null);\n const response = await apiGet(`/cloud/servers/${serverName}`);\n\n if (response && response.success && response.data) {\n setServer(response.data);\n setTools(response.data.tools || []);\n } else {\n setError(t('cloud.serverNotFound'));\n }\n } catch (err) {\n console.error('Failed to load server details:', err);\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n };\n\n loadServerDetails();\n }, [serverName, t]);\n\n // Load tools if not already loaded\n useEffect(() => {\n const loadTools = async () => {\n if (server && (!server.tools || server.tools.length === 0) && fetchServerTools) {\n setLoadingTools(true);\n setToolsApiKeyError(false);\n try {\n const fetchedTools = await fetchServerTools(server.name);\n setTools(fetchedTools);\n } catch (error) {\n console.error('Failed to load tools:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (isMCPRouterApiKeyError(errorMessage)) {\n setToolsApiKeyError(true);\n }\n } finally {\n setLoadingTools(false);\n }\n }\n };\n\n loadTools();\n }, [server?.name, server?.tools, fetchServerTools]);\n\n // Format creation date\n const formatDate = (dateStr: string) => {\n try {\n const date = new Date(dateStr);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n } catch {\n return dateStr;\n }\n };\n\n // Handle tool argument changes\n const handleArgChange = (toolName: string, argName: string, value: any) => {\n setToolArgs(prev => ({\n ...prev,\n [toolName]: {\n ...prev[toolName],\n [argName]: value\n }\n }));\n };\n\n // Handle tool call\n const handleCallTool = async (toolName: string) => {\n if (!onCallTool || !server) return;\n\n setToolCallLoading(toolName);\n try {\n const args = toolArgs[toolName] || {};\n const result = await onCallTool(server.server_key, toolName, args);\n setToolCallResults(prev => ({\n ...prev,\n [toolName]: result\n }));\n } catch (error) {\n console.error('Tool call failed:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n setToolCallResults(prev => ({\n ...prev,\n [toolName]: { error: errorMessage }\n }));\n } finally {\n setToolCallLoading(null);\n }\n };\n\n // Toggle schema visibility\n const toggleSchema = (toolName: string) => {\n setExpandedSchemas(prev => ({\n ...prev,\n [toolName]: !prev[toolName]\n }));\n };\n\n // Render tool input field based on schema\n const renderToolInput = (tool: CloudServerTool, propName: string, propSchema: any) => {\n const currentValue = toolArgs[tool.name]?.[propName] || '';\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {\n let value: any = e.target.value;\n\n // Convert value based on schema type\n if (propSchema.type === 'number' || propSchema.type === 'integer') {\n value = value === '' ? undefined : Number(value);\n } else if (propSchema.type === 'boolean') {\n value = e.target.value === 'true';\n }\n\n handleArgChange(tool.name, propName, value);\n };\n\n if (propSchema.type === 'boolean') {\n return (\n <select\n value={currentValue === true ? 'true' : currentValue === false ? 'false' : ''}\n onChange={handleChange}\n 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\"\n >\n <option value=\"\"></option>\n <option value=\"true\">{t('common.true')}</option>\n <option value=\"false\">{t('common.false')}</option>\n </select>\n );\n } else if (propSchema.type === 'number' || propSchema.type === 'integer') {\n return (\n <input\n type=\"number\"\n step={propSchema.type === 'integer' ? '1' : 'any'}\n value={currentValue || ''}\n onChange={handleChange}\n 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\"\n />\n );\n } else {\n return (\n <input\n type=\"text\"\n value={currentValue || ''}\n onChange={handleChange}\n 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\"\n />\n );\n }\n };\n\n return (\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-md p-6\">\n <div className=\"mb-6\">\n <button\n onClick={onBack}\n className=\"inline-flex items-center text-gray-600 hover:text-gray-900 transition-colors group\"\n >\n <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\">\n <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\" />\n </svg>\n {t('cloud.backToList')}\n </button>\n </div>\n\n {loading ? (\n <div className=\"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-12\">\n <div className=\"flex flex-col items-center\">\n <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\">\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 <p className=\"text-gray-600 text-lg\">{t('app.loading')}</p>\n </div>\n </div>\n ) : error && !isMCPRouterApiKeyError(error) ? (\n <div className=\"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6\">\n <div className=\"bg-red-50 border border-red-200 dark:bg-red-900/20 dark:border-red-900/50 rounded-lg p-4\">\n <div className=\"flex items-center\">\n <svg className=\"h-5 w-5 text-red-400 dark:text-red-500 mr-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <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\" />\n </svg>\n <p className=\"text-red-700 dark:text-red-400\">{error}</p>\n </div>\n </div>\n </div>\n ) : !server ? (\n <div className=\"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-12\">\n <div className=\"text-center\">\n <svg className=\"h-12 w-12 text-gray-400 mx-auto mb-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n <p className=\"text-gray-600 text-lg\">{t('cloud.serverNotFound')}</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {/* Server Header Card */}\n <div className=\"bg-white dark:bg-gray-800 rounded-xl shadow-sm overflow-hidden\">\n <div className=\"bg-gradient-to-r from-gray-100 to-gray-200 dark:from-gray-800 dark:to-gray-700 px-6 py-4\">\n <div className=\"flex justify-between items-end\">\n <div className=\"flex-1\">\n <h1 className=\"text-2xl font-bold text-gray-800 mb-2\">\n {server.title || server.name}\n </h1>\n <div className=\"flex flex-wrap items-center gap-4 text-gray-600\">\n <span className=\"text-sm bg-white/60 dark:bg-gray-800/60 text-gray-700 px-3 py-1 rounded-full\">\n {server.name}\n </span>\n <div className=\"flex items-center\">\n <svg className=\"h-4 w-4 mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z\" clipRule=\"evenodd\" />\n </svg>\n {t('cloud.by')} {server.author_name}\n </div>\n </div>\n </div>\n\n <div className=\"text-right flex flex-col items-end gap-3\">\n <div className=\"text-xs text-gray-500\">\n {t('cloud.updated')}: {formatDate(server.updated_at)}\n </div>\n {onInstall && !isMCPRouterApiKeyError(error || '') && !toolsApiKeyError && (\n <button\n onClick={handleInstall}\n disabled={getInstallButtonProps().disabled}\n className={getInstallButtonProps().className}\n >\n {getInstallButtonProps().text}\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Description Card */}\n <div className=\"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6\">\n <h2 className=\"text-xl font-semibold text-gray-900 mb-4 flex items-center\">\n <svg className=\"h-5 w-5 text-gray-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n {t('cloud.description')}\n </h2>\n <p className=\"text-gray-700 leading-relaxed\">{server.description}</p>\n </div>\n\n {/* Content Card */}\n {server.content && (\n <div className=\"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6\">\n <h2 className=\"text-xl font-semibold text-gray-900 mb-4 flex items-center\">\n <svg className=\"h-5 w-5 text-gray-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n {t('cloud.details')}\n </h2>\n <div className=\"bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 overflow-auto\">\n <pre className=\"text-sm text-gray-800 whitespace-pre-wrap\">{server.content}</pre>\n </div>\n </div>\n )}\n\n {/* Tools Card */}\n <div className=\"bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6\">\n <h2 className=\"text-xl font-semibold text-gray-900 mb-4 flex items-center\">\n <svg className=\"h-5 w-5 text-gray-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n {t('cloud.tools')}\n {tools.length > 0 && (\n <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\">\n {tools.length}\n </span>\n )}\n </h2>\n\n {/* Check for API key error */}\n {toolsApiKeyError && (\n <MCPRouterApiKeyError />\n )}\n\n {loadingTools ? (\n <div className=\"flex items-center justify-center py-12\">\n <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\">\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 className=\"text-gray-600\">{t('cloud.loadingTools')}</span>\n </div>\n ) : tools.length === 0 && !toolsApiKeyError ? (\n <div className=\"text-center py-12\">\n <svg className=\"h-12 w-12 text-gray-400 mx-auto mb-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n <p className=\"text-gray-600\">{t('cloud.noTools')}</p>\n </div>\n ) : tools.length > 0 ? (\n <div className=\"space-y-4\">\n {tools.map((tool, index) => (\n <div key={index} className=\"border border-gray-200 dark:border-gray-700 rounded-lg p-6 hover:border-gray-300 transition-colors\">\n <div className=\"flex justify-between items-start mb-4\">\n <div className=\"flex-1\">\n <h3 className=\"text-lg font-medium text-gray-900 mb-2 flex items-center\">\n <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\">\n TOOL\n </span>\n {tool.name}\n </h3>\n <p className=\"text-gray-600 leading-relaxed whitespace-pre-wrap\">{tool.description}</p>\n </div>\n {onCallTool && (\n <button\n onClick={() => handleCallTool(tool.name)}\n disabled={toolCallLoading === tool.name}\n 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\"\n >\n {toolCallLoading === tool.name ? (\n <>\n <svg className=\"animate-spin h-4 w-4 mr-2\" 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 {t('cloud.calling')}\n </>\n ) : (\n <>\n <svg className=\"h-4 w-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14.828 14.828a4 4 0 01-5.656 0M9 10h6m2 8l4-4H7l4 4z\" />\n </svg>\n {t('cloud.callTool')}\n </>\n )}\n </button>\n )}\n </div>\n\n {/* Tool inputs */}\n {tool.inputSchema && tool.inputSchema.properties && Object.keys(tool.inputSchema.properties).length > 0 && (\n <div className=\"border-t border-gray-100 dark:border-gray-700 pt-4\">\n <div className=\"flex items-center gap-3 mb-4\">\n <h4 className=\"text-sm font-medium text-gray-700\">{t('cloud.parameters')}</h4>\n <button\n onClick={() => toggleSchema(tool.name)}\n className=\"text-sm text-blue-600 hover:text-blue-800 focus:outline-none flex items-center gap-1 transition-colors\"\n >\n {t('cloud.viewSchema')}\n <svg\n className={`h-3 w-3 transition-transform duration-200 ${expandedSchemas[tool.name] ? 'rotate-90' : 'rotate-0'}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <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\" />\n </svg>\n </button>\n </div>\n\n {/* Schema content */}\n {expandedSchemas[tool.name] && (\n <div className=\"mb-4\">\n <div className=\"bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-3 overflow-auto\">\n <pre className=\"text-sm text-gray-800\">\n {JSON.stringify(tool.inputSchema, null, 2)}\n </pre>\n </div>\n </div>\n )}\n\n <div className=\"space-y-4\">\n {Object.entries(tool.inputSchema.properties).map(([propName, propSchema]: [string, any]) => (\n <div key={propName} className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-gray-700\">\n {propName}\n {tool.inputSchema.required?.includes(propName) && (\n <span className=\"text-red-500 ml-1\">*</span>\n )}\n </label>\n {propSchema.description && (\n <p className=\"text-xs text-gray-500\">{propSchema.description}</p>\n )}\n {renderToolInput(tool, propName, propSchema)}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Tool call result */}\n {toolCallResults[tool.name] && (\n <div className=\"border-t border-gray-100 dark:border-gray-700 pt-4 mt-4\">\n {toolCallResults[tool.name].error ? (\n <>\n {isMCPRouterApiKeyError(toolCallResults[tool.name].error) ? (\n <MCPRouterApiKeyError />\n ) : (\n <>\n <h4 className=\"text-sm font-medium text-red-600 mb-3 flex items-center\">\n <svg className=\"h-4 w-4 text-red-500 mr-2\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <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\" />\n </svg>\n {t('cloud.error')}\n </h4>\n <div className=\"bg-red-50 border border-red-200 dark:bg-red-900/20 dark:border-red-900/50 rounded-lg p-4\">\n <pre className=\"text-sm text-red-800 dark:text-red-300 whitespace-pre-wrap overflow-auto\">\n {toolCallResults[tool.name].error}\n </pre>\n </div>\n </>\n )}\n </>\n ) : (\n <>\n <h4 className=\"text-sm font-medium text-gray-700 mb-3 flex items-center\">\n <svg className=\"h-4 w-4 text-green-500 mr-2\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <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\" />\n </svg>\n {t('cloud.result')}\n </h4>\n <div className=\"bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4\">\n <pre className=\"text-sm text-gray-800 whitespace-pre-wrap overflow-auto\">\n {JSON.stringify(toolCallResults[tool.name], null, 2)}\n </pre>\n </div>\n </>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n )}\n\n {/* Install Modal */}\n {modalVisible && server && (\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\">\n <ServerForm\n onSubmit={handleInstallSubmit}\n onCancel={handleModalClose}\n modalTitle={t('cloud.installServer', { name: server.title || server.name })}\n formError={installError}\n initialData={{\n name: server.name,\n status: 'disconnected',\n config: {\n type: 'streamable-http',\n url: server.server_url,\n headers: {\n 'Authorization': `Bearer ${mcpRouterConfig.apiKey || '<MCPROUTER_API_KEY>'}`,\n 'HTTP-Referer': mcpRouterConfig.referer || '<YOUR_APP_URL>',\n 'X-Title': mcpRouterConfig.title || '<YOUR_APP_NAME>'\n }\n }\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default CloudServerDetail;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { RegistryServerEntry } from '@/types';\n\ninterface RegistryServerCardProps {\n serverEntry: RegistryServerEntry;\n onClick: (serverEntry: RegistryServerEntry) => void;\n}\n\nconst RegistryServerCard: React.FC<RegistryServerCardProps> = ({ serverEntry, onClick }) => {\n const { t } = useTranslation();\n const { server, _meta } = serverEntry;\n\n const handleClick = () => {\n onClick(serverEntry);\n };\n\n // Get display description\n const getDisplayDescription = () => {\n if (server.description && server.description.length <= 150) {\n return server.description;\n }\n return server.description\n ? server.description.slice(0, 150) + '...'\n : t('registry.noDescription');\n };\n\n // Format date for display\n const formatDate = (dateString?: string) => {\n if (!dateString) return '';\n try {\n const date = new Date(dateString);\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n return `${year}/${month}/${day}`;\n } catch {\n return '';\n }\n };\n\n // Get icon to display\n const getIcon = () => {\n if (server.icons && server.icons.length > 0) {\n // Prefer light theme icon\n const lightIcon = server.icons.find((icon) => !icon.theme || icon.theme === 'light');\n return lightIcon || server.icons[0];\n }\n return null;\n };\n\n const icon = getIcon();\n const officialMeta = _meta?.['io.modelcontextprotocol.registry/official'];\n const isLatest = officialMeta?.isLatest;\n const publishedAt = officialMeta?.publishedAt;\n const updatedAt = officialMeta?.updatedAt;\n\n // Count packages and remotes\n const packageCount = server.packages?.length || 0;\n const remoteCount = server.remotes?.length || 0;\n const totalOptions = packageCount + remoteCount;\n\n return (\n <div\n 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\"\n onClick={handleClick}\n >\n {/* Background gradient overlay on hover */}\n <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\" />\n\n {/* Server Header */}\n <div className=\"relative z-10 flex-1 flex flex-col\">\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex items-start space-x-3 flex-1\">\n {/* Icon */}\n {icon ? (\n <img\n src={icon.src}\n alt={server.title}\n className=\"w-12 h-12 rounded-lg object-cover flex-shrink-0\"\n onError={(e) => {\n e.currentTarget.style.display = 'none';\n }}\n />\n ) : (\n <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\">\n M\n </div>\n )}\n\n {/* Title and badges */}\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-lg font-bold text-gray-900 group-hover:text-blue-600 transition-colors duration-200 mb-1 line-clamp-2\">\n {server.name}\n </h3>\n <div className=\"flex flex-wrap gap-1 mb-1\">\n {isLatest && (\n <span className=\"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800\">\n {t('registry.latest')}\n </span>\n )}\n <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\">\n v{server.version}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Server Name */}\n {/* <div className=\"mb-2\">\n <p className=\"text-xs text-gray-500 font-mono\">{server.name}</p>\n </div> */}\n\n {/* Description */}\n <div className=\"mb-3 flex-1\">\n <p className=\"text-gray-600 text-sm leading-relaxed line-clamp-3\">\n {getDisplayDescription()}\n </p>\n </div>\n\n {/* Installation Options Info */}\n {totalOptions > 0 && (\n <div className=\"mb-3\">\n <div className=\"flex items-center space-x-4\">\n {packageCount > 0 && (\n <div className=\"flex items-center space-x-1\">\n <svg\n className=\"w-4 h-4 text-gray-500\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4\"\n />\n </svg>\n <span className=\"text-sm text-gray-600\">\n {packageCount}{' '}\n {packageCount === 1 ? t('registry.package') : t('registry.packages')}\n </span>\n </div>\n )}\n {remoteCount > 0 && (\n <div className=\"flex items-center space-x-1\">\n <svg\n className=\"w-4 h-4 text-gray-500\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n 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\"\n />\n </svg>\n <span className=\"text-sm text-gray-600\">\n {remoteCount} {remoteCount === 1 ? t('registry.remote') : t('registry.remotes')}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Footer - fixed at bottom */}\n <div className=\"flex items-center justify-between pt-3 border-t border-gray-100 dark:border-gray-700 mt-auto\">\n <div className=\"flex items-center space-x-2 text-xs text-gray-500\">\n {(publishedAt || updatedAt) && (\n <>\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n 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\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span>{formatDate(updatedAt || publishedAt)}</span>\n </>\n )}\n </div>\n\n <div className=\"flex items-center text-blue-600 text-sm font-medium group-hover:text-blue-700 transition-colors\">\n <span>{t('registry.viewDetails')}</span>\n <svg\n className=\"w-4 h-4 ml-1 transform group-hover:translate-x-1 transition-transform\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default RegistryServerCard;\n","import { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n RegistryServerEntry,\n RegistryPackage,\n RegistryRemote,\n RegistryServerData,\n ServerConfig,\n} from '@/types';\nimport ServerForm from './ServerForm';\n\ninterface RegistryServerDetailProps {\n serverEntry: RegistryServerEntry;\n onBack: () => void;\n onInstall?: (server: RegistryServerData, config: ServerConfig) => void;\n installing?: boolean;\n isInstalled?: boolean;\n fetchVersions?: (serverName: string) => Promise<RegistryServerEntry[]>;\n}\n\nconst RegistryServerDetail: React.FC<RegistryServerDetailProps> = ({\n serverEntry,\n onBack,\n onInstall,\n installing = false,\n isInstalled = false,\n fetchVersions,\n}) => {\n const { t } = useTranslation();\n const { server, _meta } = serverEntry;\n\n const [_selectedVersion, _setSelectedVersion] = useState<string>(server.version);\n const [_availableVersions, setAvailableVersions] = useState<RegistryServerEntry[]>([]);\n const [_loadingVersions, setLoadingVersions] = useState(false);\n const [modalVisible, setModalVisible] = useState(false);\n const [selectedInstallType, setSelectedInstallType] = useState<'package' | 'remote' | null>(null);\n const [selectedOption, setSelectedOption] = useState<RegistryPackage | RegistryRemote | null>(\n null,\n );\n const [installError, setInstallError] = useState<string | null>(null);\n const [expandedSections, setExpandedSections] = useState<Record<string, boolean>>({\n packages: true,\n remotes: true,\n repository: true,\n });\n\n const officialMeta = _meta?.['io.modelcontextprotocol.registry/official'];\n\n // Load available versions\n useEffect(() => {\n const loadVersions = async () => {\n if (fetchVersions) {\n setLoadingVersions(true);\n try {\n const versions = await fetchVersions(server.name);\n setAvailableVersions(versions);\n } catch (error) {\n console.error('Failed to load versions:', error);\n } finally {\n setLoadingVersions(false);\n }\n }\n };\n\n loadVersions();\n }, [server.name, fetchVersions]);\n\n // Get icon to display\n const getIcon = () => {\n if (server.icons && server.icons.length > 0) {\n const lightIcon = server.icons.find((icon) => !icon.theme || icon.theme === 'light');\n return lightIcon || server.icons[0];\n }\n return null;\n };\n\n const icon = getIcon();\n\n // Format date\n const formatDate = (dateString?: string) => {\n if (!dateString) return '';\n try {\n const date = new Date(dateString);\n return date.toLocaleDateString();\n } catch {\n return '';\n }\n };\n\n // Toggle section expansion\n const toggleSection = (section: string) => {\n setExpandedSections((prev) => ({ ...prev, [section]: !prev[section] }));\n };\n\n // Handle install button click\n const handleInstallClick = (\n type: 'package' | 'remote',\n option: RegistryPackage | RegistryRemote,\n ) => {\n setSelectedInstallType(type);\n setSelectedOption(option);\n setInstallError(null);\n setModalVisible(true);\n };\n\n // Handle modal close\n const handleModalClose = () => {\n setModalVisible(false);\n setInstallError(null);\n };\n\n // Handle install submission\n const handleInstallSubmit = async (payload: any) => {\n try {\n if (!onInstall || !selectedOption || !selectedInstallType) return;\n\n setInstallError(null);\n\n // Extract the ServerConfig from the payload\n const config: ServerConfig = payload.config;\n\n // Call onInstall with server data and config\n onInstall(server, config);\n setModalVisible(false);\n } catch (err) {\n console.error('Error installing server:', err);\n setInstallError(t('errors.serverInstall'));\n }\n };\n\n // Build initial data for ServerForm\n const getInitialFormData = () => {\n if (!selectedOption || !selectedInstallType) return null;\n console.log('Building initial form data for:', selectedOption);\n\n if (selectedInstallType === 'package' && 'identifier' in selectedOption) {\n const pkg = selectedOption as RegistryPackage;\n\n // Build environment variables from package definition\n const env: Record<string, string> = {};\n if (pkg.environmentVariables) {\n pkg.environmentVariables.forEach((envVar) => {\n env[envVar.name] = envVar.default || '';\n });\n }\n\n const command = getCommand(pkg.registryType);\n return {\n name: server.name,\n status: 'disconnected' as const,\n config: {\n type: 'stdio' as const,\n command: command,\n args: getArgs(command, pkg),\n env: Object.keys(env).length > 0 ? env : undefined,\n },\n };\n } else if (selectedInstallType === 'remote' && 'url' in selectedOption) {\n const remote = selectedOption as RegistryRemote;\n\n // Build headers from remote definition\n const headers: Record<string, string> = {};\n if (remote.headers) {\n remote.headers.forEach((header) => {\n headers[header.name] = header.default || header.value || '';\n });\n }\n\n // Determine transport type - default to streamable-http for remotes\n const transportType = remote.type === 'sse' ? ('sse' as const) : ('streamable-http' as const);\n\n return {\n name: server.name,\n status: 'disconnected' as const,\n config: {\n type: transportType,\n url: remote.url,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n },\n };\n }\n\n return null;\n };\n\n // Render package option\n const renderPackage = (pkg: RegistryPackage, index: number) => {\n return (\n <div\n key={index}\n className=\"border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-3 hover:border-blue-400 transition-colors\"\n >\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex-1\">\n <h4 className=\"font-medium text-gray-900\">{pkg.identifier}</h4>\n {pkg.version && <p className=\"text-sm text-gray-500\">Version: {pkg.version}</p>}\n {pkg.runtimeHint && <p className=\"text-sm text-gray-600 mt-1\">{pkg.runtimeHint}</p>}\n </div>\n <button\n onClick={() => handleInstallClick('package', pkg)}\n disabled={isInstalled || installing}\n className={`px-4 py-2 rounded text-sm font-medium transition-colors ${\n isInstalled\n ? 'bg-green-600 text-white cursor-default'\n : installing\n ? 'bg-gray-400 text-white cursor-not-allowed'\n : 'bg-blue-600 text-white hover:bg-blue-700'\n }`}\n >\n {isInstalled\n ? t('registry.installed')\n : installing\n ? t('registry.installing')\n : t('registry.install')}\n </button>\n </div>\n\n {/* Package details */}\n {pkg.registryType && (\n <div className=\"text-sm text-gray-600 mb-2\">\n <span className=\"font-medium\">Registry:</span> {pkg.registryType}\n </div>\n )}\n\n {/* Transport type */}\n {pkg.transport && (\n <div className=\"text-sm text-gray-600 mb-2\">\n <span className=\"font-medium\">Transport:</span> {pkg.transport.type}\n {pkg.transport.url && <span className=\"ml-2 text-gray-500\">({pkg.transport.url})</span>}\n </div>\n )}\n\n {/* Environment Variables */}\n {pkg.environmentVariables && pkg.environmentVariables.length > 0 && (\n <div className=\"mt-3 border-t border-gray-200 dark:border-gray-700 pt-3\">\n <h5 className=\"text-sm font-medium text-gray-700 mb-2\">\n {t('registry.environmentVariables')}:\n </h5>\n <div className=\"space-y-2\">\n {pkg.environmentVariables.map((envVar, envIndex) => (\n <div key={envIndex} className=\"text-sm\">\n <div className=\"flex items-start\">\n <span className=\"font-mono text-gray-900 font-medium\">{envVar.name}</span>\n {envVar.isRequired && (\n <span className=\"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800\">\n {t('common.required')}\n </span>\n )}\n {envVar.isSecret && (\n <span className=\"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-yellow-100 text-yellow-800\">\n {t('common.secret')}\n </span>\n )}\n </div>\n {envVar.description && <p className=\"text-gray-600 mt-1\">{envVar.description}</p>}\n {envVar.default && (\n <p className=\"text-gray-500 mt-1\">\n <span className=\"font-medium\">{t('common.default')}:</span>{' '}\n <span className=\"font-mono\">{envVar.default}</span>\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Package Arguments */}\n {pkg.packageArguments && pkg.packageArguments.length > 0 && (\n <div className=\"mt-3 border-t border-gray-200 dark:border-gray-700 pt-3\">\n <h5 className=\"text-sm font-medium text-gray-700 mb-2\">\n {t('registry.packageArguments')}:\n </h5>\n <div className=\"space-y-2\">\n {pkg.packageArguments.map((arg, argIndex) => (\n <div key={argIndex} className=\"text-sm\">\n <div className=\"flex items-start\">\n <span className=\"font-mono text-gray-900 font-medium\">{arg.name}</span>\n {arg.isRequired && (\n <span className=\"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800\">\n {t('common.required')}\n </span>\n )}\n {arg.isSecret && (\n <span className=\"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-yellow-100 text-yellow-800\">\n {t('common.secret')}\n </span>\n )}\n {arg.isRepeated && (\n <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\">\n {t('common.repeated')}\n </span>\n )}\n </div>\n {arg.description && <p className=\"text-gray-600 mt-1\">{arg.description}</p>}\n {arg.type && (\n <p className=\"text-gray-500 mt-1\">\n <span className=\"font-medium\">{t('common.type')}:</span>{' '}\n <span className=\"font-mono\">{arg.type}</span>\n </p>\n )}\n {arg.default && (\n <p className=\"text-gray-500 mt-1\">\n <span className=\"font-medium\">{t('common.default')}:</span>{' '}\n <span className=\"font-mono\">{arg.default}</span>\n </p>\n )}\n {arg.value && (\n <p className=\"text-gray-500 mt-1\">\n <span className=\"font-medium\">{t('common.value')}:</span>{' '}\n <span className=\"font-mono\">{arg.value}</span>\n </p>\n )}\n {arg.valueHint && (\n <p className=\"text-gray-500 mt-1\">\n <span className=\"font-medium\">{t('common.valueHint')}:</span>{' '}\n <span className=\"font-mono\">{arg.valueHint}</span>\n </p>\n )}\n {arg.choices && arg.choices.length > 0 && (\n <p className=\"text-gray-500 mt-1\">\n <span className=\"font-medium\">{t('common.choices')}:</span>{' '}\n <span className=\"font-mono\">{arg.choices.join(', ')}</span>\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n };\n\n // Render remote option\n const renderRemote = (remote: RegistryRemote, index: number) => {\n return (\n <div\n key={index}\n className=\"border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-3 hover:border-blue-400 transition-colors\"\n >\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex-1\">\n <h4 className=\"font-medium text-gray-900\">{remote.type}</h4>\n <p className=\"text-sm text-gray-600 mt-1 break-all\">{remote.url}</p>\n </div>\n <button\n onClick={() => handleInstallClick('remote', remote)}\n disabled={isInstalled || installing}\n className={`px-4 py-2 rounded text-sm font-medium transition-colors ${\n isInstalled\n ? 'bg-green-600 text-white cursor-default'\n : installing\n ? 'bg-gray-400 text-white cursor-not-allowed'\n : 'bg-blue-600 text-white hover:bg-blue-700'\n }`}\n >\n {isInstalled\n ? t('registry.installed')\n : installing\n ? t('registry.installing')\n : t('registry.install')}\n </button>\n </div>\n\n {/* Headers */}\n {remote.headers && remote.headers.length > 0 && (\n <div className=\"mt-3 border-t border-gray-200 dark:border-gray-700 pt-3\">\n <h5 className=\"text-sm font-medium text-gray-700 mb-2\">{t('registry.headers')}:</h5>\n <div className=\"space-y-2\">\n {remote.headers.map((header, headerIndex) => (\n <div key={headerIndex} className=\"text-sm\">\n <div className=\"flex items-start\">\n <span className=\"font-mono text-gray-900 font-medium\">{header.name}</span>\n {header.isRequired && (\n <span className=\"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800\">\n {t('common.required')}\n </span>\n )}\n {header.isSecret && (\n <span className=\"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-yellow-100 text-yellow-800\">\n {t('common.secret')}\n </span>\n )}\n </div>\n {header.description && <p className=\"text-gray-600 mt-1\">{header.description}</p>}\n {header.value && (\n <p className=\"text-gray-500 mt-1\">\n <span className=\"font-medium\">{t('common.value')}:</span>{' '}\n <span className=\"font-mono\">{header.value}</span>\n </p>\n )}\n {header.default && (\n <p className=\"text-gray-500 mt-1\">\n <span className=\"font-medium\">{t('common.default')}:</span>{' '}\n <span className=\"font-mono\">{header.default}</span>\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"bg-white dark:bg-gray-800 shadow rounded-lg p-6\">\n {/* Header */}\n <div className=\"mb-6\">\n <button\n onClick={onBack}\n className=\"flex items-center text-blue-600 hover:text-blue-800 mb-4 transition-colors\"\n >\n <svg className=\"w-5 h-5 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n {t('registry.backToList')}\n </button>\n\n <div className=\"flex items-start space-x-4\">\n {/* Icon */}\n {icon ? (\n <img\n src={icon.src}\n alt={server.title}\n className=\"w-20 h-20 rounded-lg object-cover flex-shrink-0\"\n onError={(e) => {\n e.currentTarget.style.display = 'none';\n }}\n />\n ) : (\n <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\">\n M\n </div>\n )}\n\n {/* Title and metadata */}\n <div className=\"flex-1\">\n <h1 className=\"text-3xl font-bold text-gray-900 mb-2\">{server.name}</h1>\n\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {officialMeta?.isLatest && (\n <span className=\"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-green-100 text-green-800\">\n {t('registry.latest')}\n </span>\n )}\n <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\">\n v{server.version}\n </span>\n {officialMeta?.status && (\n <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\">\n {officialMeta.status}\n </span>\n )}\n {/* Dates */}\n <span className=\"flex flex-wrap items-center gap-4 text-sm text-gray-600\">\n {officialMeta?.publishedAt && (\n <div>\n <span className=\"font-medium\">{t('registry.published')}:</span>{' '}\n {formatDate(officialMeta.publishedAt)}\n </div>\n )}\n {officialMeta?.updatedAt && (\n <div>\n <span className=\"font-medium\">{t('registry.updated')}:</span>{' '}\n {formatDate(officialMeta.updatedAt)}\n </div>\n )}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Description */}\n <div className=\"mb-6\">\n <h2 className=\"text-xl font-semibold text-gray-900 mb-3\">{t('registry.description')}</h2>\n <p className=\"text-gray-700 leading-relaxed whitespace-pre-wrap\">{server.description}</p>\n </div>\n\n {/* Website */}\n {server.websiteUrl && (\n <div className=\"mb-6\">\n <h2 className=\"text-xl font-semibold text-gray-900 mb-3\">{t('registry.website')}</h2>\n <a\n href={server.websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 hover:text-blue-800 hover:underline\"\n >\n {server.websiteUrl}\n </a>\n </div>\n )}\n\n {/* Packages */}\n {server.packages && server.packages.length > 0 && (\n <div className=\"mb-6\">\n <button\n onClick={() => toggleSection('packages')}\n className=\"flex items-center justify-between w-full text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors\"\n >\n <span>\n {t('registry.packages')} ({server.packages.length})\n </span>\n <svg\n className={`w-5 h-5 transform transition-transform ${expandedSections.packages ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n {expandedSections.packages && (\n <div className=\"space-y-3\">{server.packages.map(renderPackage)}</div>\n )}\n </div>\n )}\n\n {/* Remotes */}\n {server.remotes && server.remotes.length > 0 && (\n <div className=\"mb-6\">\n <button\n onClick={() => toggleSection('remotes')}\n className=\"flex items-center justify-between w-full text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors\"\n >\n <span>\n {t('registry.remotes')} ({server.remotes.length})\n </span>\n <svg\n className={`w-5 h-5 transform transition-transform ${expandedSections.remotes ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n {expandedSections.remotes && (\n <div className=\"space-y-3\">{server.remotes.map(renderRemote)}</div>\n )}\n </div>\n )}\n\n {/* Repository */}\n {server.repository && (\n <div className=\"mb-6\">\n <button\n onClick={() => toggleSection('repository')}\n className=\"flex items-center justify-between w-full text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors\"\n >\n <span>{t('registry.repository')}</span>\n <svg\n className={`w-5 h-5 transform transition-transform ${expandedSections.repository ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n {expandedSections.repository && (\n <div className=\"border border-gray-200 dark:border-gray-700 rounded-lg p-4\">\n {server.repository.url && (\n <div className=\"mb-2\">\n <span className=\"font-medium text-gray-700\">URL:</span>{' '}\n <a\n href={server.repository.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 hover:text-blue-800 hover:underline break-all\"\n >\n {server.repository.url}\n </a>\n </div>\n )}\n {server.repository.source && (\n <div className=\"mb-2\">\n <span className=\"font-medium text-gray-700\">Source:</span>{' '}\n {server.repository.source}\n </div>\n )}\n {server.repository.subfolder && (\n <div className=\"mb-2\">\n <span className=\"font-medium text-gray-700\">Subfolder:</span>{' '}\n {server.repository.subfolder}\n </div>\n )}\n {server.repository.id && (\n <div>\n <span className=\"font-medium text-gray-700\">ID:</span> {server.repository.id}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Install Modal */}\n {modalVisible && selectedOption && selectedInstallType && (\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\">\n <ServerForm\n onSubmit={handleInstallSubmit}\n onCancel={handleModalClose}\n modalTitle={t('registry.installServer', { name: server.title || server.name })}\n formError={installError}\n initialData={getInitialFormData()}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default RegistryServerDetail;\n// Helper function to determine command based on registry type\nfunction getCommand(registryType: string): string {\n // Map registry types to appropriate commands\n switch (registryType.toLowerCase()) {\n case 'pypi':\n case 'python':\n return 'uvx';\n case 'npm':\n case 'node':\n return 'npx';\n case 'oci':\n case 'docker':\n return 'docker';\n default:\n return '';\n }\n}\n\n// Helper function to get appropriate args based on command type and package identifier\nfunction getArgs(command: string, pkg: RegistryPackage): string[] {\n const identifier = [pkg.identifier + (pkg.version ? `@${pkg.version}` : '')];\n\n // Build package arguments if available\n const packageArgs: string[] = [];\n if (pkg.packageArguments && pkg.packageArguments.length > 0) {\n pkg.packageArguments.forEach((arg) => {\n // Add required arguments or arguments with default values\n if (arg.isRequired || arg.default || arg.value) {\n const argName = `--${arg.name}`;\n // Priority: value > default > placeholder\n const argValue = arg.value || arg.default || `\\${${arg.name.toUpperCase()}}`;\n packageArgs.push(argName, argValue);\n }\n });\n }\n\n // Map commands to appropriate argument patterns\n switch (command.toLowerCase()) {\n case 'uvx':\n // For Python packages: uvx package-name --arg1 value1 --arg2 value2\n return [...identifier, ...packageArgs];\n case 'npx':\n // For Node.js packages: npx package-name --arg1 value1 --arg2 value2\n return [...identifier, ...packageArgs];\n case 'docker': {\n // add envs from environment variables if available\n const envs: string[] = [];\n if (pkg.environmentVariables) {\n pkg.environmentVariables.forEach((env) => {\n envs.push('-e', `${env.name}`);\n });\n }\n // For Docker images: docker run -i package-name --arg1 value1 --arg2 value2\n return ['run', '-i', '--rm', ...envs, ...identifier, ...packageArgs];\n }\n default:\n // If no specific pattern is defined, return identifier with package args\n return [...identifier, ...packageArgs];\n }\n}\n","import React from 'react';\n\ninterface CursorPaginationProps {\n currentPage: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n onNextPage: () => void;\n onPreviousPage: () => void;\n}\n\nconst CursorPagination: React.FC<CursorPaginationProps> = ({\n currentPage,\n hasNextPage,\n hasPreviousPage,\n onNextPage,\n onPreviousPage,\n}) => {\n return (\n <div className=\"flex items-center justify-center space-x-2 my-6\">\n {/* Previous button */}\n <button\n onClick={onPreviousPage}\n disabled={!hasPreviousPage}\n className={`px-4 py-2 rounded transition-all duration-200 ${\n hasPreviousPage\n ? 'bg-gray-200 hover:bg-gray-300 text-gray-700 btn-secondary'\n : 'bg-gray-100 text-gray-400 cursor-not-allowed'\n }`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5 inline-block mr-1\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n 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\"\n clipRule=\"evenodd\"\n />\n </svg>\n Prev\n </button>\n\n {/* Current page indicator */}\n <span className=\"px-4 py-2 bg-blue-500 text-white rounded btn-primary\">\n Page {currentPage}\n </span>\n\n {/* Next button */}\n <button\n onClick={onNextPage}\n disabled={!hasNextPage}\n className={`px-4 py-2 rounded transition-all duration-200 ${\n hasNextPage\n ? 'bg-gray-200 hover:bg-gray-300 text-gray-700 btn-secondary'\n : 'bg-gray-100 text-gray-400 cursor-not-allowed'\n }`}\n >\n Next\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5 inline-block ml-1\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n 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\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n );\n};\n\nexport default CursorPagination;\n","import React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\nimport {\n MarketServer,\n CloudServer,\n ServerConfig,\n RegistryServerEntry,\n RegistryServerData,\n} from '@/types';\nimport { useMarketData } from '@/hooks/useMarketData';\nimport { useCloudData } from '@/hooks/useCloudData';\nimport { useRegistryData } from '@/hooks/useRegistryData';\nimport { useToast } from '@/contexts/ToastContext';\nimport { apiPost } from '@/utils/fetchInterceptor';\nimport MarketServerCard from '@/components/MarketServerCard';\nimport MarketServerDetail from '@/components/MarketServerDetail';\nimport CloudServerCard from '@/components/CloudServerCard';\nimport CloudServerDetail from '@/components/CloudServerDetail';\nimport RegistryServerCard from '@/components/RegistryServerCard';\nimport RegistryServerDetail from '@/components/RegistryServerDetail';\nimport MCPRouterApiKeyError from '@/components/MCPRouterApiKeyError';\nimport Pagination from '@/components/ui/Pagination';\nimport CursorPagination from '@/components/ui/CursorPagination';\n\nconst MarketPage: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { serverName } = useParams<{ serverName?: string }>();\n const { showToast } = useToast();\n\n // Get tab from URL search params\n const [searchParams, setSearchParams] = useSearchParams();\n const currentTab = searchParams.get('tab') || 'cloud';\n\n // Local market data\n const {\n servers: localServers,\n allServers: allLocalServers,\n categories: localCategories,\n loading: localLoading,\n error: localError,\n setError: setLocalError,\n searchServers: searchLocalServers,\n filterByCategory: filterLocalByCategory,\n filterByTag: filterLocalByTag,\n selectedCategory: selectedLocalCategory,\n selectedTag: selectedLocalTag,\n installServer: installLocalServer,\n fetchServerByName: fetchLocalServerByName,\n isServerInstalled,\n // Pagination\n currentPage: localCurrentPage,\n totalPages: localTotalPages,\n changePage: changeLocalPage,\n serversPerPage: localServersPerPage,\n changeServersPerPage: changeLocalServersPerPage,\n } = useMarketData();\n\n // Cloud market data\n const {\n servers: cloudServers,\n allServers: allCloudServers,\n loading: cloudLoading,\n error: cloudError,\n setError: setCloudError,\n fetchServerTools,\n callServerTool,\n // Pagination\n currentPage: cloudCurrentPage,\n totalPages: cloudTotalPages,\n changePage: changeCloudPage,\n serversPerPage: cloudServersPerPage,\n changeServersPerPage: changeCloudServersPerPage,\n } = useCloudData();\n\n // Registry data\n const {\n servers: registryServers,\n allServers: allRegistryServers,\n loading: registryLoading,\n error: registryError,\n setError: setRegistryError,\n searchServers: searchRegistryServers,\n clearSearch: clearRegistrySearch,\n fetchServerByName: fetchRegistryServerByName,\n fetchServerVersions: fetchRegistryServerVersions,\n // Cursor-based pagination\n currentPage: registryCurrentPage,\n totalPages: registryTotalPages,\n hasNextPage: registryHasNextPage,\n hasPreviousPage: registryHasPreviousPage,\n changePage: changeRegistryPage,\n goToNextPage: goToRegistryNextPage,\n goToPreviousPage: goToRegistryPreviousPage,\n serversPerPage: registryServersPerPage,\n changeServersPerPage: changeRegistryServersPerPage,\n } = useRegistryData();\n\n const [selectedServer, setSelectedServer] = useState<MarketServer | null>(null);\n const [selectedCloudServer, setSelectedCloudServer] = useState<CloudServer | null>(null);\n const [selectedRegistryServer, setSelectedRegistryServer] = useState<RegistryServerEntry | null>(\n null,\n );\n const [searchQuery, setSearchQuery] = useState('');\n const [registrySearchQuery, setRegistrySearchQuery] = useState('');\n const [installing, setInstalling] = useState(false);\n const [installedCloudServers, setInstalledCloudServers] = useState<Set<string>>(new Set());\n const [installedRegistryServers, setInstalledRegistryServers] = useState<Set<string>>(new Set());\n\n // Load server details if a server name is in the URL\n useEffect(() => {\n const loadServerDetails = async () => {\n if (serverName) {\n // Determine if it's a cloud, local, or registry server based on the current tab\n if (currentTab === 'cloud') {\n // Try to find the server in cloud servers\n const server = cloudServers.find((s) => s.name === serverName);\n if (server) {\n setSelectedCloudServer(server);\n } else {\n // If server not found, navigate back to market page\n navigate('/market?tab=cloud');\n }\n } else if (currentTab === 'registry') {\n console.log('Loading registry server details for:', serverName);\n // Registry market\n const serverEntry = await fetchRegistryServerByName(serverName);\n if (serverEntry) {\n setSelectedRegistryServer(serverEntry);\n } else {\n // If server not found, navigate back to market page\n navigate('/market?tab=registry');\n }\n } else {\n // Local market\n const server = await fetchLocalServerByName(serverName);\n if (server) {\n setSelectedServer(server);\n } else {\n // If server not found, navigate back to market page\n navigate('/market?tab=local');\n }\n }\n } else {\n setSelectedServer(null);\n setSelectedCloudServer(null);\n setSelectedRegistryServer(null);\n }\n };\n\n loadServerDetails();\n }, [\n serverName,\n currentTab,\n cloudServers,\n fetchLocalServerByName,\n fetchRegistryServerByName,\n navigate,\n ]);\n\n // Tab switching handler\n const switchTab = (tab: 'local' | 'cloud' | 'registry') => {\n const newSearchParams = new URLSearchParams(searchParams);\n newSearchParams.set('tab', tab);\n setSearchParams(newSearchParams);\n // Clear any selected server when switching tabs\n if (serverName) {\n navigate('/market?' + newSearchParams.toString());\n }\n };\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n if (currentTab === 'local') {\n searchLocalServers(searchQuery);\n } else if (currentTab === 'registry') {\n searchRegistryServers(registrySearchQuery);\n }\n // Cloud search is not implemented in the original cloud page\n };\n\n const handleCategoryClick = (category: string) => {\n if (currentTab === 'local') {\n filterLocalByCategory(category);\n }\n };\n\n const handleClearFilters = () => {\n if (currentTab === 'local') {\n setSearchQuery('');\n filterLocalByCategory('');\n filterLocalByTag('');\n } else if (currentTab === 'registry') {\n setRegistrySearchQuery('');\n clearRegistrySearch();\n }\n };\n\n const handleServerClick = (server: MarketServer | CloudServer | RegistryServerEntry) => {\n if (currentTab === 'cloud') {\n const cloudServer = server as CloudServer;\n navigate(`/market/${cloudServer.name}?tab=cloud`);\n } else if (currentTab === 'registry') {\n const registryServer = server as RegistryServerEntry;\n console.log('Registry server clicked:', registryServer);\n const serverName = registryServer.server?.name;\n console.log('Server name extracted:', serverName);\n if (serverName) {\n const targetUrl = `/market/${encodeURIComponent(serverName)}?tab=registry`;\n console.log('Navigating to:', targetUrl);\n navigate(targetUrl);\n } else {\n console.error('Server name is undefined in registry server:', registryServer);\n }\n } else {\n const marketServer = server as MarketServer;\n navigate(`/market/${marketServer.name}?tab=local`);\n }\n };\n\n const handleBackToList = () => {\n navigate(`/market?tab=${currentTab}`);\n };\n\n const handleLocalInstall = async (server: MarketServer, config: ServerConfig) => {\n try {\n setInstalling(true);\n const success = await installLocalServer(server, config);\n if (success) {\n showToast(t('market.installSuccess', { serverName: server.display_name }), 'success');\n }\n } finally {\n setInstalling(false);\n }\n };\n\n // Handle cloud server installation\n const handleCloudInstall = async (server: CloudServer, config: ServerConfig) => {\n try {\n setInstalling(true);\n\n const payload = {\n name: server.name,\n config: config,\n };\n\n const result = await apiPost('/servers', payload);\n\n if (!result.success) {\n const errorMessage = result?.message || t('server.addError');\n showToast(errorMessage, 'error');\n return;\n }\n\n // Update installed servers set\n setInstalledCloudServers((prev) => new Set(prev).add(server.name));\n showToast(t('cloud.installSuccess', { name: server.title || server.name }), 'success');\n } catch (error) {\n console.error('Error installing cloud server:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n showToast(t('cloud.installError', { error: errorMessage }), 'error');\n } finally {\n setInstalling(false);\n }\n };\n\n // Handle registry server installation\n const handleRegistryInstall = async (server: RegistryServerData, config: ServerConfig) => {\n try {\n setInstalling(true);\n\n const payload = {\n name: server.name,\n config: config,\n };\n\n const result = await apiPost('/servers', payload);\n\n if (!result.success) {\n const errorMessage = result?.message || t('server.addError');\n showToast(errorMessage, 'error');\n return;\n }\n\n // Update installed servers set\n setInstalledRegistryServers((prev) => new Set(prev).add(server.name));\n showToast(t('registry.installSuccess', { name: server.title || server.name }), 'success');\n } catch (error) {\n console.error('Error installing registry server:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n showToast(t('registry.installError', { error: errorMessage }), 'error');\n } finally {\n setInstalling(false);\n }\n };\n\n const handleCallTool = async (\n serverName: string,\n toolName: string,\n args: Record<string, any>,\n ) => {\n try {\n const result = await callServerTool(serverName, toolName, args);\n showToast(t('cloud.toolCallSuccess', { toolName }), 'success');\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n // Don't show toast for API key errors, let the component handle it\n if (!isMCPRouterApiKeyError(errorMessage)) {\n showToast(t('cloud.toolCallError', { toolName, error: errorMessage }), 'error');\n }\n throw error;\n }\n };\n\n // Helper function to check if error is MCPRouter API key not configured\n const isMCPRouterApiKeyError = (errorMessage: string) => {\n return (\n errorMessage === 'MCPROUTER_API_KEY_NOT_CONFIGURED' ||\n errorMessage.toLowerCase().includes('mcprouter api key not configured')\n );\n };\n\n const handlePageChange = (page: number) => {\n if (currentTab === 'local') {\n changeLocalPage(page);\n } else if (currentTab === 'registry') {\n changeRegistryPage(page);\n } else {\n changeCloudPage(page);\n }\n // Scroll to top of page when changing pages\n window.scrollTo({ top: 0, behavior: 'smooth' });\n };\n\n const handleChangeItemsPerPage = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newValue = parseInt(e.target.value, 10);\n if (currentTab === 'local') {\n changeLocalServersPerPage(newValue);\n } else if (currentTab === 'registry') {\n changeRegistryServersPerPage(newValue);\n } else {\n changeCloudServersPerPage(newValue);\n }\n };\n\n // Render detailed view if a server is selected\n if (selectedServer) {\n return (\n <MarketServerDetail\n server={selectedServer}\n onBack={handleBackToList}\n onInstall={handleLocalInstall}\n installing={installing}\n isInstalled={isServerInstalled(selectedServer.name)}\n />\n );\n }\n\n // Render cloud server detail if selected\n if (selectedCloudServer) {\n return (\n <CloudServerDetail\n serverName={selectedCloudServer.name}\n onBack={handleBackToList}\n onCallTool={handleCallTool}\n fetchServerTools={fetchServerTools}\n onInstall={handleCloudInstall}\n installing={installing}\n isInstalled={installedCloudServers.has(selectedCloudServer.name)}\n />\n );\n }\n\n // Render registry server detail if selected\n if (selectedRegistryServer) {\n return (\n <RegistryServerDetail\n serverEntry={selectedRegistryServer}\n onBack={handleBackToList}\n onInstall={handleRegistryInstall}\n installing={installing}\n isInstalled={installedRegistryServers.has(selectedRegistryServer.server.name)}\n fetchVersions={fetchRegistryServerVersions}\n />\n );\n }\n\n // Get current data based on active tab\n const isLocalTab = currentTab === 'local';\n const isRegistryTab = currentTab === 'registry';\n const servers = isLocalTab ? localServers : isRegistryTab ? registryServers : cloudServers;\n const allServers = isLocalTab\n ? allLocalServers\n : isRegistryTab\n ? allRegistryServers\n : allCloudServers;\n const categories = isLocalTab ? localCategories : [];\n const loading = isLocalTab ? localLoading : isRegistryTab ? registryLoading : cloudLoading;\n const error = isLocalTab ? localError : isRegistryTab ? registryError : cloudError;\n const setError = isLocalTab ? setLocalError : isRegistryTab ? setRegistryError : setCloudError;\n const selectedCategory = isLocalTab ? selectedLocalCategory : '';\n const selectedTag = isLocalTab ? selectedLocalTag : '';\n const currentPage = isLocalTab\n ? localCurrentPage\n : isRegistryTab\n ? registryCurrentPage\n : cloudCurrentPage;\n const totalPages = isLocalTab\n ? localTotalPages\n : isRegistryTab\n ? registryTotalPages\n : cloudTotalPages;\n const serversPerPage = isLocalTab\n ? localServersPerPage\n : isRegistryTab\n ? registryServersPerPage\n : cloudServersPerPage;\n\n return (\n <div>\n {/* Tab Navigation */}\n <div className=\"mb-6\">\n <div className=\"border-b border-gray-200 dark:border-gray-700\">\n <nav className=\"-mb-px flex space-x-3\">\n <button\n onClick={() => switchTab('cloud')}\n className={`py-2 px-1 border-b-2 font-medium text-lg hover:cursor-pointer transition-colors duration-200 ${\n !isLocalTab && !isRegistryTab\n ? 'border-blue-500 text-blue-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'\n }`}\n >\n {t('cloud.title')}\n <span className=\"text-xs text-gray-400 font-normal ml-1\">\n (\n <a\n href=\"https://mcprouter.co\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"external-link\"\n >\n MCPRouter\n </a>\n )\n </span>\n </button>\n <button\n onClick={() => switchTab('local')}\n className={`py-2 px-1 border-b-2 font-medium text-lg hover:cursor-pointer transition-colors duration-200 ${\n isLocalTab\n ? 'border-blue-500 text-blue-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'\n }`}\n >\n {t('market.title')}\n <span className=\"text-xs text-gray-400 font-normal ml-1\">\n (\n <a\n href=\"https://mcpm.sh\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"external-link\"\n >\n MCPM\n </a>\n )\n </span>\n </button>\n <button\n onClick={() => switchTab('registry')}\n className={`py-2 px-1 border-b-2 font-medium text-lg hover:cursor-pointer transition-colors duration-200 ${\n isRegistryTab\n ? 'border-blue-500 text-blue-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'\n }`}\n >\n {t('registry.title')}\n <span className=\"text-xs text-gray-400 font-normal ml-1\">\n (\n <a\n href=\"https://registry.modelcontextprotocol.io\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"external-link\"\n >\n {t('registry.official')}\n </a>\n )\n </span>\n </button>\n </nav>\n </div>\n </div>\n\n {error && (\n <>\n {!isLocalTab && isMCPRouterApiKeyError(error) ? (\n <MCPRouterApiKeyError />\n ) : (\n <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\">\n <div className=\"flex items-center justify-between\">\n <p>{error}</p>\n <button\n onClick={() => setError(null)}\n className=\"text-red-700 dark:text-red-400 hover:text-red-900 transition-colors duration-200\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n 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\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Search bar for local market and registry */}\n {(isLocalTab || isRegistryTab) && (\n <div className=\"bg-white dark:bg-gray-800 shadow rounded-lg p-6 mb-6 page-card\">\n <form onSubmit={handleSearch} className=\"flex space-x-4 mb-0\">\n <div className=\"flex-grow\">\n <input\n type=\"text\"\n value={isRegistryTab ? registrySearchQuery : searchQuery}\n onChange={(e) => {\n if (isRegistryTab) {\n setRegistrySearchQuery(e.target.value);\n } else {\n setSearchQuery(e.target.value);\n }\n }}\n placeholder={\n isRegistryTab ? t('registry.searchPlaceholder') : t('market.searchPlaceholder')\n }\n 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\"\n />\n </div>\n <button\n type=\"submit\"\n 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\"\n >\n {isRegistryTab ? t('registry.search') : t('market.search')}\n </button>\n {((isLocalTab && (searchQuery || selectedCategory || selectedTag)) ||\n (isRegistryTab && registrySearchQuery)) && (\n <button\n type=\"button\"\n onClick={handleClearFilters}\n 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\"\n >\n {isRegistryTab ? t('registry.clearFilters') : t('market.clearFilters')}\n </button>\n )}\n </form>\n </div>\n )}\n\n <div className=\"flex flex-col md:flex-row gap-6\">\n {/* Left sidebar for filters (local market only) */}\n {isLocalTab && (\n <div className=\"md:w-48 flex-shrink-0\">\n <div className=\"bg-white dark:bg-gray-800 shadow rounded-lg p-4 mb-6 sticky top-4 page-card\">\n {/* Categories */}\n {categories.length > 0 ? (\n <div className=\"mb-6\">\n <div className=\"flex justify-between items-center mb-3\">\n <h3 className=\"font-medium text-gray-900\">{t('market.categories')}</h3>\n {selectedCategory && (\n <span\n className=\"text-xs text-blue-600 cursor-pointer hover:underline transition-colors duration-200\"\n onClick={() => filterLocalByCategory('')}\n >\n {t('market.clearCategoryFilter')}\n </span>\n )}\n </div>\n <div className=\"flex flex-col gap-2\">\n {categories.map((category) => (\n <button\n key={category}\n onClick={() => handleCategoryClick(category)}\n className={`px-3 py-2 rounded text-sm text-left transition-all duration-200 ${\n selectedCategory === category\n ? 'bg-blue-100 text-blue-800 font-medium btn-primary'\n : 'bg-gray-100 text-gray-800 hover:bg-gray-200 btn-secondary'\n }`}\n >\n {category}\n </button>\n ))}\n </div>\n </div>\n ) : loading ? (\n <div className=\"mb-6\">\n <div className=\"mb-3\">\n <h3 className=\"font-medium text-gray-900\">{t('market.categories')}</h3>\n </div>\n <div className=\"flex flex-col gap-2 items-center py-4 loading-container\">\n <svg\n className=\"animate-spin h-6 w-6 text-blue-500 mb-2\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n 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\"\n ></path>\n </svg>\n <p className=\"text-sm text-gray-600\">{t('app.loading')}</p>\n </div>\n </div>\n ) : (\n <div className=\"mb-6\">\n <div className=\"mb-3\">\n <h3 className=\"font-medium text-gray-900\">{t('market.categories')}</h3>\n </div>\n <p className=\"text-sm text-gray-600 py-2\">{t('market.noCategories')}</p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Main content area */}\n <div className=\"flex-grow\">\n {loading ? (\n <div className=\"bg-white dark:bg-gray-800 shadow rounded-lg p-6 flex items-center justify-center\">\n <div className=\"flex flex-col items-center\">\n <svg\n className=\"animate-spin h-10 w-10 text-blue-500 mb-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n 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\"\n ></path>\n </svg>\n <p className=\"text-gray-600\">{t('app.loading')}</p>\n </div>\n </div>\n ) : servers.length === 0 ? (\n <div className=\"bg-white dark:bg-gray-800 shadow rounded-lg p-6\">\n <p className=\"text-gray-600\">\n {isLocalTab\n ? t('market.noServers')\n : isRegistryTab\n ? t('registry.noServers')\n : t('cloud.noServers')}\n </p>\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 gap-6\">\n {servers.map((server, index) =>\n isLocalTab ? (\n <MarketServerCard\n key={index}\n server={server as MarketServer}\n onClick={handleServerClick}\n />\n ) : isRegistryTab ? (\n <RegistryServerCard\n key={index}\n serverEntry={server as RegistryServerEntry}\n onClick={handleServerClick}\n />\n ) : (\n <CloudServerCard\n key={index}\n server={server as CloudServer}\n onClick={handleServerClick}\n />\n ),\n )}\n </div>\n\n <div className=\"flex items-center mb-4\">\n <div className=\"flex-[2] text-sm text-gray-500\">\n {isLocalTab\n ? t('market.showing', {\n from: (currentPage - 1) * serversPerPage + 1,\n to: Math.min(currentPage * serversPerPage, allServers.length),\n total: allServers.length,\n })\n : isRegistryTab\n ? t('registry.showing', {\n from: (currentPage - 1) * serversPerPage + 1,\n to: (currentPage - 1) * serversPerPage + servers.length,\n total: allServers.length + (registryHasNextPage ? '+' : ''),\n })\n : t('cloud.showing', {\n from: (currentPage - 1) * serversPerPage + 1,\n to: Math.min(currentPage * serversPerPage, allServers.length),\n total: allServers.length,\n })}\n </div>\n <div className=\"flex-[4] flex justify-center\">\n {isRegistryTab ? (\n <CursorPagination\n currentPage={currentPage}\n hasNextPage={registryHasNextPage}\n hasPreviousPage={registryHasPreviousPage}\n onNextPage={goToRegistryNextPage}\n onPreviousPage={goToRegistryPreviousPage}\n />\n ) : (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={handlePageChange}\n />\n )}\n </div>\n <div className=\"flex-[2] flex items-center justify-end space-x-2\">\n <label htmlFor=\"perPage\" className=\"text-sm text-gray-600\">\n {isLocalTab\n ? t('market.perPage')\n : isRegistryTab\n ? t('registry.perPage')\n : t('cloud.perPage')}\n :\n </label>\n <select\n id=\"perPage\"\n value={serversPerPage}\n onChange={handleChangeItemsPerPage}\n className=\"border rounded p-1 text-sm btn-secondary outline-none\"\n >\n <option value=\"6\">6</option>\n <option value=\"9\">9</option>\n <option value=\"12\">12</option>\n <option value=\"24\">24</option>\n </select>\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default MarketPage;\n"],"names":["useMarketData","t","useTranslation","servers","setServers","useState","allServers","setAllServers","categories","setCategories","tags","setTags","selectedCategory","setSelectedCategory","selectedTag","setSelectedTag","searchQuery","setSearchQuery","loading","setLoading","error","setError","currentServer","setCurrentServer","installedServers","setInstalledServers","currentPage","setCurrentPage","serversPerPage","setServersPerPage","totalPages","setTotalPages","fetchMarketServers","useCallback","data","apiGet","applyPagination","err","page","itemsPerPage","totalItems","calculatedTotalPages","validPage","startIndex","paginatedServers","changePage","fetchCategories","fetchTags","fetchServerByName","name","searchServers","query","filterByCategory","category","filterByTag","tag","fetchInstalledServers","installedServerNames","server","isServerInstalled","serverName","installServer","customConfig","installType","_a","_b","installation","serverConfig","result","apiPost","changeServersPerPage","perPage","useEffect","useCloudData","fetchCloudServers","errorMessage","fetchServerTools","callServerTool","toolName","args","useRegistryData","nextCursor","setNextCursor","hasNextPage","setHasNextPage","cursorHistory","setCursorHistory","fetchRegistryServers","cursor","search","params","queryToUse","response","hasMore","prev","goToNextPage","currentCursor","goToPreviousPage","newHistory","previousCursor","newServersPerPage","encodedName","fetchServerVersions","fetchServerVersion","version","encodedVersion","clearSearch","MarketServerCard","onClick","getAuthorInitials","word","getTagsToDisplay","estimatedAvailableWidth","calculateTagWidth","totalWidth","i","sortedTags","a","b","tagWidth","moreCount","moreTagWidth","tagsToShow","jsxs","jsx","_c","index","_d","MarketServerDetail","onBack","onInstall","installing","isInstalled","modalVisible","setModalVisible","confirmationVisible","setConfirmationVisible","pendingPayload","setPendingPayload","detectedVariables","setDetectedVariables","getButtonProps","toggleModal","handleConfirmInstall","proceedWithInstall","payload","handleInstall","getPreferredInstallation","installTypes","handleSubmit","variables","detectVariables","buttonProps","preferredInstallation","arg","tool","element","example","ServerForm","variable","CloudServerCard","handleClick","getDisplayDescription","lines","line","formatDate","dateString","date","year","month","day","MCPRouterApiKeyError","navigate","useNavigate","handleConfigureSettings","handleGetApiKey","CloudServerDetail","onCallTool","mcpRouterConfig","useSettingsData","setServer","tools","setTools","loadingTools","setLoadingTools","toolsApiKeyError","setToolsApiKeyError","toolCallLoading","setToolCallLoading","toolCallResults","setToolCallResults","toolArgs","setToolArgs","expandedSchemas","setExpandedSchemas","installError","setInstallError","isMCPRouterApiKeyError","getInstallButtonProps","handleModalClose","handleInstallSubmit","fetchedTools","dateStr","hours","minutes","seconds","handleArgChange","argName","value","handleCallTool","toggleSchema","renderToolInput","propName","propSchema","currentValue","handleChange","e","Fragment","RegistryServerCard","serverEntry","_meta","icon","officialMeta","isLatest","publishedAt","updatedAt","packageCount","remoteCount","totalOptions","RegistryServerDetail","fetchVersions","_selectedVersion","_setSelectedVersion","_availableVersions","setAvailableVersions","_loadingVersions","setLoadingVersions","selectedInstallType","setSelectedInstallType","selectedOption","setSelectedOption","expandedSections","setExpandedSections","versions","toggleSection","section","handleInstallClick","type","option","config","getInitialFormData","pkg","env","envVar","command","getCommand","getArgs","remote","headers","header","transportType","renderPackage","envIndex","argIndex","renderRemote","headerIndex","registryType","identifier","packageArgs","argValue","envs","CursorPagination","hasPreviousPage","onNextPage","onPreviousPage","MarketPage","useParams","showToast","useToast","searchParams","setSearchParams","useSearchParams","currentTab","localServers","allLocalServers","localCategories","localLoading","localError","setLocalError","searchLocalServers","filterLocalByCategory","filterLocalByTag","selectedLocalCategory","selectedLocalTag","installLocalServer","fetchLocalServerByName","localCurrentPage","localTotalPages","changeLocalPage","localServersPerPage","changeLocalServersPerPage","cloudServers","allCloudServers","cloudLoading","cloudError","setCloudError","cloudCurrentPage","cloudTotalPages","changeCloudPage","cloudServersPerPage","changeCloudServersPerPage","registryServers","allRegistryServers","registryLoading","registryError","setRegistryError","searchRegistryServers","clearRegistrySearch","fetchRegistryServerByName","fetchRegistryServerVersions","registryCurrentPage","registryTotalPages","registryHasNextPage","registryHasPreviousPage","changeRegistryPage","goToRegistryNextPage","goToRegistryPreviousPage","registryServersPerPage","changeRegistryServersPerPage","selectedServer","setSelectedServer","selectedCloudServer","setSelectedCloudServer","selectedRegistryServer","setSelectedRegistryServer","registrySearchQuery","setRegistrySearchQuery","setInstalling","installedCloudServers","setInstalledCloudServers","installedRegistryServers","setInstalledRegistryServers","s","switchTab","tab","newSearchParams","handleSearch","handleCategoryClick","handleClearFilters","handleServerClick","registryServer","targetUrl","handleBackToList","handleLocalInstall","handleCloudInstall","handleRegistryInstall","handlePageChange","handleChangeItemsPerPage","newValue","isLocalTab","isRegistryTab","Pagination"],"mappings":"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"}