@samanhappy/mcphub 1.0.45 → 1.0.46

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 (66) hide show
  1. package/dist/controllers/oauthCallbackController.js +2 -2
  2. package/dist/controllers/oauthCallbackController.js.map +1 -1
  3. package/dist/services/mcpService.js +41 -15
  4. package/dist/services/mcpService.js.map +1 -1
  5. package/dist/services/principalRuntimeService.js +2 -2
  6. package/dist/services/principalRuntimeService.js.map +1 -1
  7. package/dist/services/serverConfigEnvironment.js +23 -0
  8. package/dist/services/serverConfigEnvironment.js.map +1 -0
  9. package/frontend/dist/assets/{ActivityPage-DPlbWRuE.js → ActivityPage-C4vGn8kC.js} +2 -2
  10. package/frontend/dist/assets/{ActivityPage-DPlbWRuE.js.map → ActivityPage-C4vGn8kC.js.map} +1 -1
  11. package/frontend/dist/assets/{CopyClientConfigDialog-BmrvVqKm.js → CopyClientConfigDialog-gqu8M16p.js} +2 -2
  12. package/frontend/dist/assets/{CopyClientConfigDialog-BmrvVqKm.js.map → CopyClientConfigDialog-gqu8M16p.js.map} +1 -1
  13. package/frontend/dist/assets/{CredentialsPage-DUa5COar.js → CredentialsPage-EJYe8sf_.js} +2 -2
  14. package/frontend/dist/assets/{CredentialsPage-DUa5COar.js.map → CredentialsPage-EJYe8sf_.js.map} +1 -1
  15. package/frontend/dist/assets/{Dashboard-DaTYK_nx.js → Dashboard-CqqzEeM3.js} +2 -2
  16. package/frontend/dist/assets/{Dashboard-DaTYK_nx.js.map → Dashboard-CqqzEeM3.js.map} +1 -1
  17. package/frontend/dist/assets/{EndpointCopy-BCfqwDEK.js → EndpointCopy-sH8M0Zl-.js} +2 -2
  18. package/frontend/dist/assets/{EndpointCopy-BCfqwDEK.js.map → EndpointCopy-sH8M0Zl-.js.map} +1 -1
  19. package/frontend/dist/assets/{GroupsPage-Cuxz5FyS.js → GroupsPage-BAiER86x.js} +4 -4
  20. package/frontend/dist/assets/{GroupsPage-Cuxz5FyS.js.map → GroupsPage-BAiER86x.js.map} +1 -1
  21. package/frontend/dist/assets/{LoginPage-yTpHn5Tx.js → LoginPage-BPhnf62f.js} +2 -2
  22. package/frontend/dist/assets/{LoginPage-yTpHn5Tx.js.map → LoginPage-BPhnf62f.js.map} +1 -1
  23. package/frontend/dist/assets/{LogsPage-BbSlC06Q.js → LogsPage-Ci0H5Hbz.js} +2 -2
  24. package/frontend/dist/assets/{LogsPage-BbSlC06Q.js.map → LogsPage-Ci0H5Hbz.js.map} +1 -1
  25. package/frontend/dist/assets/MarketPage-B0bU64Fu.js +2 -0
  26. package/frontend/dist/assets/MarketPage-B0bU64Fu.js.map +1 -0
  27. package/frontend/dist/assets/{OAuthConsentPage-W05BBBpL.js → OAuthConsentPage-COPngtNn.js} +2 -2
  28. package/frontend/dist/assets/{OAuthConsentPage-W05BBBpL.js.map → OAuthConsentPage-COPngtNn.js.map} +1 -1
  29. package/frontend/dist/assets/{PromptsPage-Bq7xptCw.js → PromptsPage-DkRz0aOM.js} +2 -2
  30. package/frontend/dist/assets/{PromptsPage-Bq7xptCw.js.map → PromptsPage-DkRz0aOM.js.map} +1 -1
  31. package/frontend/dist/assets/{ResourcesPage-CsL39aff.js → ResourcesPage-D9UvvBJO.js} +2 -2
  32. package/frontend/dist/assets/{ResourcesPage-CsL39aff.js.map → ResourcesPage-D9UvvBJO.js.map} +1 -1
  33. package/frontend/dist/assets/ServersPage-D9DDRTwG.js +39 -0
  34. package/frontend/dist/assets/ServersPage-D9DDRTwG.js.map +1 -0
  35. package/frontend/dist/assets/SettingsPage-p0RqcQ3b.js +12 -0
  36. package/frontend/dist/assets/SettingsPage-p0RqcQ3b.js.map +1 -0
  37. package/frontend/dist/assets/{StatusDot-DnCf86-T.js → StatusDot-rU2z4UIB.js} +2 -2
  38. package/frontend/dist/assets/{StatusDot-DnCf86-T.js.map → StatusDot-rU2z4UIB.js.map} +1 -1
  39. package/frontend/dist/assets/{ToggleGroup-DFjmIz4f.js → ToggleGroup-B-m_CA-c.js} +2 -2
  40. package/frontend/dist/assets/{ToggleGroup-DFjmIz4f.js.map → ToggleGroup-B-m_CA-c.js.map} +1 -1
  41. package/frontend/dist/assets/{UsersPage-g_A6Nis1.js → UsersPage-BtCcY8iT.js} +2 -2
  42. package/frontend/dist/assets/{UsersPage-g_A6Nis1.js.map → UsersPage-BtCcY8iT.js.map} +1 -1
  43. package/frontend/dist/assets/{clipboard-C6pDz_7o.js → clipboard-ZgOiZZfc.js} +2 -2
  44. package/frontend/dist/assets/{clipboard-C6pDz_7o.js.map → clipboard-ZgOiZZfc.js.map} +1 -1
  45. package/frontend/dist/assets/index-D-J2WUmj.css +1 -0
  46. package/frontend/dist/assets/index-DeDkxr8P.js +3 -0
  47. package/frontend/dist/assets/index-DeDkxr8P.js.map +1 -0
  48. package/frontend/dist/assets/{resourceService-CAxgCzyV.js → resourceService-B_JEhB8X.js} +2 -2
  49. package/frontend/dist/assets/{resourceService-CAxgCzyV.js.map → resourceService-B_JEhB8X.js.map} +1 -1
  50. package/frontend/dist/assets/{useCostData-wcUc6g7_.js → useCostData-B9tFvSJs.js} +2 -2
  51. package/frontend/dist/assets/{useCostData-wcUc6g7_.js.map → useCostData-B9tFvSJs.js.map} +1 -1
  52. package/frontend/dist/assets/variableDetection-DSNGipcp.js +16 -0
  53. package/frontend/dist/assets/variableDetection-DSNGipcp.js.map +1 -0
  54. package/frontend/dist/index.html +2 -2
  55. package/package.json +1 -1
  56. package/frontend/dist/assets/MarketPage-nAF8uFkv.js +0 -2
  57. package/frontend/dist/assets/MarketPage-nAF8uFkv.js.map +0 -1
  58. package/frontend/dist/assets/ServersPage-p9LgWUzS.js +0 -39
  59. package/frontend/dist/assets/ServersPage-p9LgWUzS.js.map +0 -1
  60. package/frontend/dist/assets/SettingsPage-DobkN2nZ.js +0 -12
  61. package/frontend/dist/assets/SettingsPage-DobkN2nZ.js.map +0 -1
  62. package/frontend/dist/assets/index-BlEZfPQl.js +0 -3
  63. package/frontend/dist/assets/index-BlEZfPQl.js.map +0 -1
  64. package/frontend/dist/assets/index-Cla8rRxG.css +0 -1
  65. package/frontend/dist/assets/variableDetection-DxVZhKpb.js +0 -16
  66. package/frontend/dist/assets/variableDetection-DxVZhKpb.js.map +0 -1
@@ -1,2 +0,0 @@
1
- import{r as t,j as e,d as De,b as Ue,i as He}from"./framework-vendor-CQFm9vKd.js";import{e as O,i as ve,j as We}from"./index-BlEZfPQl.js";import{u as te}from"./i18n-vendor-DVmjrzgW.js";import{a as je,d as _e,s as xe}from"./variableDetection-DxVZhKpb.js";import{C as Ne,$ as Fe,a5 as Oe,a7 as Qe,l as qe,X as Ge,G as Je,u as Xe}from"./icons-vendor-CEwDZ1lN.js";import{P as Ye}from"./Pagination-BRqqU5Ct.js";import"./contextCost-CilWqGWT.js";const Ze=()=>{const{t:s}=te(),[f,j]=t.useState([]),[o,u]=t.useState([]),[i,a]=t.useState([]),[c,b]=t.useState([]),[P,_]=t.useState(""),[T,$]=t.useState(""),[D,U]=t.useState(""),[B,w]=t.useState(!0),[V,L]=t.useState(null),[E,W]=t.useState(null),[q,R]=t.useState([]),[I,z]=t.useState(1),[N,X]=t.useState(9),[Q,v]=t.useState(1),h=t.useCallback(async()=>{try{w(!0);const r=await O("/market/servers");r&&r.success&&Array.isArray(r.data)?(u(r.data),C(r.data,I)):(console.error("Invalid market servers data format",{data:r}),L(s("market.fetchError")))}catch(r){console.error("Error fetching market servers",{err:r}),L(r instanceof Error?r.message:String(r))}finally{w(!1)}},[s]),C=t.useCallback((r,l,F=N)=>{const K=r.length,H=Math.ceil(K/F);v(H);const G=Math.max(1,Math.min(l,H));G!==l&&z(G);const Y=(G-1)*F,ee=r.slice(Y,Y+F);j(ee)},[N]),Z=t.useCallback(r=>{z(r),C(o,r,N)},[o,C,N]),g=t.useCallback(async()=>{try{const r=await O("/market/categories");r&&r.success&&Array.isArray(r.data)?a(r.data):console.error("Invalid categories data format",{data:r})}catch(r){console.error("Error fetching categories",{err:r})}},[]),y=t.useCallback(async()=>{try{const r=await O("/market/tags");r&&r.success&&Array.isArray(r.data)?b(r.data):console.error("Invalid tags data format",{data:r})}catch(r){console.error("Error fetching tags",{err:r})}},[]),p=t.useCallback(async r=>{try{w(!0);const l=await O(`/market/servers/${r}`);return l&&l.success&&l.data?(W(l.data),l.data):(console.error("Invalid market server data format",{name:r,data:l}),L(s("market.serverNotFound")),null)}catch(l){return console.error("Error fetching market server",{name:r,err:l}),L(l instanceof Error?l.message:String(l)),null}finally{w(!1)}},[s]),S=t.useCallback(async r=>{try{if(w(!0),U(r),!r.trim()){h();return}const l=await O(`/market/servers/search?query=${encodeURIComponent(r)}`);l&&l.success&&Array.isArray(l.data)?(u(l.data),z(1),C(l.data,1)):(console.error("Invalid market search results format",{query:r,data:l}),L(s("market.searchError")))}catch(l){console.error("Error searching market servers",{query:r,err:l}),L(l instanceof Error?l.message:String(l))}finally{w(!1)}},[s,o,C,h]),n=t.useCallback(async r=>{try{if(w(!0),_(r),$(""),!r){h();return}const l=await O(`/market/categories/${encodeURIComponent(r)}`);l&&l.success&&Array.isArray(l.data)?(u(l.data),z(1),C(l.data,1)):(console.error("Invalid market category filter results format",{category:r,data:l}),L(s("market.filterError")))}catch(l){console.error("Error filtering market servers by category",{category:r,err:l}),L(l instanceof Error?l.message:String(l))}finally{w(!1)}},[s,h,C]),m=t.useCallback(async r=>{try{if(w(!0),$(r),_(""),!r){h();return}const l=await O(`/market/tags/${encodeURIComponent(r)}`);l&&l.success&&Array.isArray(l.data)?(u(l.data),z(1),C(l.data,1)):(console.error("Invalid market tag filter results format",{tag:r,data:l}),L(s("market.tagFilterError")))}catch(l){console.error("Error filtering market servers by tag",{tag:r,err:l}),L(l instanceof Error?l.message:String(l))}finally{w(!1)}},[s,h,C]),d=t.useCallback(async()=>{try{const r=await O("/servers");if(r&&r.success&&Array.isArray(r.data)){const l=r.data.map(F=>F.name);R(l)}}catch(r){console.error("Error fetching installed servers",{err:r})}},[]),M=t.useCallback(r=>q.includes(r),[q]),oe=t.useCallback(async(r,l)=>{var F,K;try{const H=(F=r.installations)!=null&&F.npm?"npm":Object.keys(r.installations||{}).length>0?Object.keys(r.installations)[0]:null;if(!H||!((K=r.installations)!=null&&K[H]))return L(s("market.noInstallationMethod")),!1;const G=r.installations[H],Y={name:r.name,config:l.type==="stdio"?{command:l.command||G.command||"",args:l.args||G.args||[],env:{...G.env,...l.env}}:l},ee=await ve("/servers",Y);if(!ee.success)throw new Error(ee.message||"Failed to install server");return await d(),!0}catch(H){return console.error("Error installing market server",{serverName:r.name,err:H}),L(H instanceof Error?H.message:String(H)),!1}},[s,d]),ce=t.useCallback(r=>{X(r),z(1),C(o,1,r)},[o,C]);return t.useEffect(()=>{h(),g(),y(),d()},[h,g,y,d]),{servers:f,allServers:o,categories:i,tags:c,selectedCategory:P,selectedTag:T,searchQuery:D,loading:B,error:V,setError:L,currentServer:E,fetchMarketServers:h,fetchServerByName:p,searchServers:S,filterByCategory:n,filterByTag:m,installServer:oe,currentPage:I,totalPages:Q,serversPerPage:N,changePage:Z,changeServersPerPage:ce,isServerInstalled:M}},Ke=()=>{const{t:s}=te(),[f,j]=t.useState([]),[o,u]=t.useState([]),[i,a]=t.useState(!0),[c,b]=t.useState(null),[P,_]=t.useState(""),[T,$]=t.useState(1),[D,U]=t.useState(9),[B,w]=t.useState(null),[V,L]=t.useState(!1),[E,W]=t.useState([]),[q]=t.useState(1),R=t.useCallback(async(g,y)=>{try{a(!0),b(null);const p=new URLSearchParams;p.append("limit",D.toString()),g&&p.append("cursor",g);const S=y!==void 0?y:P;S.trim()&&p.append("search",S.trim());const n=await O(`/registry/servers?${p.toString()}`);if(n&&n.success&&n.data){const m=n.data;if(m.servers&&Array.isArray(m.servers)){j(m.servers);const d=m.metadata.count===D&&!!m.metadata.nextCursor;L(d),w(m.metadata.nextCursor||null),u(g?M=>[...M,...m.servers]:m.servers)}else console.error("Invalid registry servers data format",{data:m}),b(s("registry.fetchError"))}else b(s("registry.fetchError"))}catch(p){console.error("Error fetching registry servers",{cursor:g,search:y,err:p});const S=p instanceof Error?p.message:String(p);b(S)}finally{a(!1)}},[s,D]),I=t.useCallback(async()=>{if(!V||!B)return;const g=E[E.length-1]||"";W(y=>[...y,g]),$(y=>y+1),await R(B,P)},[V,B,E,P,R]),z=t.useCallback(async()=>{if(T<=1)return;const g=[...E];g.pop();const y=g[g.length-1];W(g),$(p=>p-1),await R(y||void 0,P)},[T,E,P,R]),N=t.useCallback(async g=>{g!==T&&(g>T&&V?await I():g<T&&T>1&&await z())},[T,V,I,z]),X=t.useCallback(async g=>{U(g),$(1),W([]),u([]),await R(void 0,P)},[P,R]),Q=t.useCallback(async g=>{try{a(!0),b(null);const y=encodeURIComponent(g),p=await O(`/registry/servers/versions?serverName=${y}`);if(p&&p.success&&p.data){const S=p.data;return S.servers&&Array.isArray(S.servers)&&S.servers.length>0?S.servers[0]:(console.error("Invalid registry server data format",{serverName:g,data:S}),b(s("registry.serverNotFound")),null)}else return b(s("registry.serverNotFound")),null}catch(y){console.error("Error fetching registry server",{serverName:g,err:y});const p=y instanceof Error?y.message:String(y);return b(p),null}finally{a(!1)}},[s]),v=t.useCallback(async g=>{try{b(null);const y=encodeURIComponent(g),p=await O(`/registry/servers/versions?serverName=${y}`);if(p&&p.success&&p.data){const S=p.data;return S.servers&&Array.isArray(S.servers)?S.servers:(console.error("Invalid registry server versions data format",{serverName:g,data:S}),[])}else return[]}catch(y){console.error("Error fetching versions for registry server",{serverName:g,err:y});const p=y instanceof Error?y.message:String(y);return b(p),[]}},[]),h=t.useCallback(async(g,y)=>{try{b(null);const p=encodeURIComponent(g),S=encodeURIComponent(y),n=await O(`/registry/servers/version?serverName=${p}&version=${S}`);if(n&&n.success&&n.data){const m=n.data;return m&&m.server?m:(console.error("Invalid registry server version data format",{serverName:g,version:y,data:m}),null)}else return null}catch(p){console.error("Error fetching specific registry server version",{serverName:g,version:y,err:p});const S=p instanceof Error?p.message:String(p);return b(S),null}},[]),C=t.useCallback(async g=>{console.log("Searching registry servers",{query:g}),_(g),$(1),W([]),u([]),await R(void 0,g)},[R]),Z=t.useCallback(async()=>{_(""),$(1),W([]),u([]),await R(void 0,"")},[R]);return t.useEffect(()=>{R(void 0,P)},[]),{servers:f,allServers:o,loading:i,error:c,setError:b,searchQuery:P,searchServers:C,clearSearch:Z,fetchServerByName:Q,fetchServerVersions:v,fetchServerVersion:h,currentPage:T,totalPages:q,hasNextPage:V,hasPreviousPage:T>1,changePage:N,goToNextPage:I,goToPreviousPage:z,serversPerPage:D,changeServersPerPage:X}},es=s=>s.split(" ").map(f=>f.charAt(0)).join("").toUpperCase().slice(0,2),ss=({server:s,onClick:f})=>{var i,a,c;const{t:j}=te(),o=(s.tags||[]).slice(0,3),u=(i=s.categories)==null?void 0:i[0];return e.jsxs("div",{className:"hub-card flex flex-col cursor-pointer transition-colors h-full overflow-hidden",onClick:()=>f(s),onMouseEnter:b=>b.currentTarget.style.borderColor="var(--hub-ink-2)",onMouseLeave:b=>b.currentTarget.style.borderColor="var(--hub-line)",children:[e.jsxs("div",{className:"p-3.5 flex-1 flex flex-col gap-2.5",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"hub-mono",style:{width:28,height:28,borderRadius:7,background:"var(--hub-ink)",color:"var(--hub-bg)",display:"grid",placeItems:"center",fontWeight:600,fontSize:13,flexShrink:0},children:es(s.display_name||s.name)[0]||"?"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"truncate",style:{fontSize:14,fontWeight:500,letterSpacing:"-0.01em"},children:s.display_name}),s.is_official&&e.jsxs("span",{className:"inline-flex items-center gap-0.5",style:{fontSize:10,color:"var(--hub-accent)",background:"var(--hub-accent-soft)",padding:"0 5px",height:16,borderRadius:3,fontWeight:500},children:[e.jsx(Ne,{size:9,strokeWidth:2.5}),j("market.official")]})]}),e.jsxs("div",{className:"hub-mono truncate",style:{fontSize:11,color:"var(--hub-ink-3)"},children:["@",((a=s.author)==null?void 0:a.name)||j("market.unknown")]})]})]}),e.jsx("div",{className:"flex-1 line-clamp-2",style:{fontSize:12.5,color:"var(--hub-ink-2)",lineHeight:1.5},children:s.description}),o.length>0&&e.jsx("div",{className:"flex gap-1 flex-wrap",children:o.map(b=>e.jsxs("span",{className:"hub-tag",style:{background:"oklch(0.96 0.04 145)",color:"oklch(0.4 0.1 145)",border:0},children:["#",b]},b))})]}),e.jsx("div",{className:"flex items-center justify-between px-3.5 py-2",style:{borderTop:"1px solid var(--hub-line-2)",background:"var(--hub-bg-2)"},children:e.jsxs("div",{className:"hub-mono flex items-center gap-3",style:{fontSize:11.5,color:"var(--hub-ink-3)"},children:[e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Fe,{size:11}),((c=s.tools)==null?void 0:c.length)??0," ",j("server.tools").toLowerCase()]}),u&&e.jsx("span",{className:"truncate",children:u})]})})]})},rs=({server:s,onBack:f,onInstall:j,installing:o=!1,isInstalled:u=!1})=>{var N,X,Q;const{t:i}=te(),[a,c]=t.useState(!1),[b,P]=t.useState(null),[_,T]=t.useState(!1),[$,D]=t.useState(null),[U,B]=t.useState([]),w=()=>u?{className:"bg-green-600 cursor-default px-4 py-2 rounded text-sm font-medium text-white",disabled:!0,text:i("market.installed")}:o?{className:"bg-gray-400 cursor-not-allowed px-4 py-2 rounded text-sm font-medium text-white",disabled:!0,text:i("market.installing")}:{className:"hub-btn primary",disabled:!1,text:i("market.install")},V=()=>{c(!a),P(null),T(!1),D(null)},L=async()=>{$&&(await E($),T(!1),D(null))},E=async v=>{try{P(null),j(s,v.config),c(!1)}catch(h){console.error("Error installing server:",h),P(i("errors.serverInstall"))}},W=()=>{u||V()},q=()=>{if(!s.installations)return;if(s.installations.npm)return s.installations.npm;if(s.installations.uvx)return s.installations.uvx;if(s.installations.default)return s.installations.default;const v=Object.keys(s.installations);if(v.length>0)return s.installations[v[0]]},R=async v=>{try{const h=_e(v);h.length>0?(B(h),D(v),T(!0)):await E(v)}catch(h){console.error("Error processing server installation:",h),P(i("errors.serverInstall"))}},I=w(),z=q();return e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg shadow-md p-6",children:[e.jsx("div",{className:"mb-4",children:e.jsxs("button",{onClick:f,className:"text-gray-600 hover:text-gray-900 flex items-center",children:[e.jsx("svg",{className:"h-5 w-5 mr-1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z",clipRule:"evenodd"})}),i("market.backToList")]})}),e.jsxs("div",{className:"flex justify-between items-start mb-4",children:[e.jsx("div",{children:e.jsxs("h2",{className:"text-2xl font-bold text-gray-900 flex items-center flex-wrap",children:[s.display_name,e.jsxs("span",{className:"text-sm font-normal text-gray-500 ml-2",children:["(",s.name,")"]}),e.jsxs("span",{className:"text-sm font-normal text-gray-600 ml-4",children:[i("market.author"),": ",((N=s.author)==null?void 0:N.name)||i("market.unknown")," •"," ",i("market.license"),": ",s.license," •",e.jsx("a",{href:s.repository.url,target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline ml-1",children:i("market.repository")})]})]})}),e.jsxs("div",{className:"flex items-center",children:[s.is_official&&e.jsx("span",{className:"bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300 text-sm font-normal px-4 py-2 rounded mr-2 flex items-center label-primary",children:i("market.official")}),e.jsx("button",{onClick:W,disabled:I.disabled,className:I.className,children:I.text})]})]}),e.jsx("p",{className:"text-gray-700 mb-6",children:s.description}),e.jsxs("div",{className:"mb-6",children:[e.jsxs("h3",{className:"text-lg font-semibold mb-3",children:[i("market.categories")," & ",i("market.tags")]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[(X=s.categories)==null?void 0:X.map((v,h)=>e.jsx("span",{className:"bg-gray-100 dark:bg-gray-800 text-gray-800 px-3 py-1 rounded",children:v},`cat-${h}`)),s.tags&&s.tags.map((v,h)=>e.jsxs("span",{className:"bg-gray-100 dark:bg-gray-800 text-green-700 px-2 py-1 rounded text-sm",children:["#",v]},`tag-${h}`))]})]}),s.arguments&&Object.keys(s.arguments).length>0&&e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:i("market.arguments")}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"min-w-full divide-y divide-gray-200 dark:divide-gray-700",children:[e.jsx("thead",{className:"bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap",children:i("market.argumentName")}),e.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap",children:i("market.description")}),e.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap",children:i("market.required")}),e.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider whitespace-nowrap",children:i("market.example")})]})}),e.jsx("tbody",{className:"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700",children:Object.entries(s.arguments).map(([v,h],C)=>e.jsxs("tr",{children:[e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900",children:v}),e.jsx("td",{className:"px-6 py-4 text-sm text-gray-500",children:h.description}),e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500",children:h.required?e.jsx("span",{className:"text-green-600",children:"✓"}):e.jsx("span",{className:"text-gray-600",children:"✗"})}),e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500",children:e.jsx("code",{className:"bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded",children:h.example})})]},C))})]})})]}),e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:i("market.tools")}),e.jsx("div",{className:"space-y-4",children:(Q=s.tools)==null?void 0:Q.map((v,h)=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded p-4",children:[e.jsxs("h4",{className:"font-medium mb-2",children:[v.name,e.jsx("button",{type:"button",onClick:()=>{const C=document.getElementById(`schema-${h}`);C&&C.classList.toggle("hidden")},className:"text-sm text-blue-500 font-normal hover:underline focus:outline-none ml-2",children:i("market.viewSchema")})]}),e.jsx("p",{className:"text-gray-600 mb-2",children:v.description}),e.jsx("div",{className:"mt-2",children:e.jsx("pre",{id:`schema-${h}`,className:"hidden bg-gray-50 dark:bg-gray-800 p-3 rounded text-sm overflow-auto mt-2",children:JSON.stringify(v.inputSchema,null,2)})})]},h))})]}),s.examples&&s.examples.length>0&&e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:i("market.examples")}),e.jsx("div",{className:"space-y-4",children:s.examples.map((v,h)=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded p-4",children:[e.jsx("h4",{className:"font-medium mb-2",children:v.title}),e.jsx("p",{className:"text-gray-600 mb-2",children:v.description}),e.jsx("pre",{className:"bg-gray-50 dark:bg-gray-800 p-3 rounded text-sm overflow-auto",children:v.prompt})]},h))})]}),e.jsx("div",{className:"mt-6 flex justify-end",children:e.jsx("button",{onClick:W,disabled:I.disabled,className:I.className,children:I.text})}),a&&e.jsx("div",{className:"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4",children:e.jsx(je,{onSubmit:R,onCancel:V,modalTitle:i("market.installServer",{name:s.display_name}),formError:b,initialData:{name:s.name,status:"disconnected",config:z?{command:z.command||"",args:z.args||[],env:z.env||{}}:void 0}})}),_&&e.jsx("div",{className:"fixed inset-0 bg-black/50 z-[60] flex items-center justify-center p-4",children:e.jsxs("div",{className:"hub-card p-6 w-full max-w-md",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-4",children:i("server.confirmVariables")}),e.jsx("p",{className:"text-gray-600 mb-4",children:i("server.variablesDetected")}),e.jsx("div",{className:"bg-yellow-50 border border-yellow-200 rounded p-3 mb-4",children:e.jsxs("div",{className:"flex items-start",children:[e.jsx("div",{className:"flex-shrink-0",children:e.jsx("svg",{className:"h-5 w-5 text-yellow-400",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z",clipRule:"evenodd"})})}),e.jsxs("div",{className:"ml-3",children:[e.jsxs("h4",{className:"text-sm font-medium text-yellow-800",children:[i("server.detectedVariables"),":"]}),e.jsx("ul",{className:"mt-1 text-sm text-yellow-700",children:U.map((v,h)=>e.jsxs("li",{className:"font-mono",children:["$",`{${v}}`]},h))})]})]})}),e.jsx("p",{className:"text-gray-600 text-sm mb-6",children:i("market.confirmVariablesMessage")}),e.jsxs("div",{className:"flex justify-end space-x-3",children:[e.jsx("button",{onClick:()=>{T(!1),D(null)},className:"hub-btn",children:i("common.cancel")}),e.jsx("button",{onClick:L,className:"hub-btn primary",children:i("market.confirmAndInstall")})]})]})})]})},ts=s=>{if(!s)return"";try{const f=new Date(s),j=f.getFullYear(),o=(f.getMonth()+1).toString().padStart(2,"0"),u=f.getDate().toString().padStart(2,"0");return`${j}/${o}/${u}`}catch{return""}},as=({serverEntry:s,onClick:f})=>{var D,U;const{t:j}=te(),{server:o,_meta:u}=s,i=u==null?void 0:u["io.modelcontextprotocol.registry/official"],a=i==null?void 0:i.isLatest,c=i==null?void 0:i.publishedAt,b=i==null?void 0:i.updatedAt,P=((D=o.packages)==null?void 0:D.length)||0,_=((U=o.remotes)==null?void 0:U.length)||0,T=o.description?o.description.length<=150?o.description:o.description.slice(0,150)+"...":j("registry.noDescription"),$=o.icons&&o.icons.length>0?o.icons.find(w=>!w.theme||w.theme==="light")||o.icons[0]:null;return e.jsxs("div",{className:"hub-card flex flex-col cursor-pointer transition-colors h-full overflow-hidden",onClick:()=>f(s),onMouseEnter:B=>B.currentTarget.style.borderColor="var(--hub-ink-2)",onMouseLeave:B=>B.currentTarget.style.borderColor="var(--hub-line)",children:[e.jsxs("div",{className:"p-3.5 flex-1 flex flex-col gap-2.5",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[$?e.jsx("img",{src:$.src,alt:o.title||o.name,className:"rounded-md object-cover flex-shrink-0",style:{width:28,height:28},onError:B=>{B.currentTarget.style.display="none"}}):e.jsx("div",{className:"hub-mono flex-shrink-0",style:{width:28,height:28,borderRadius:7,background:"var(--hub-ink)",color:"var(--hub-bg)",display:"grid",placeItems:"center",fontWeight:600,fontSize:13},children:o.name.charAt(0).toUpperCase()}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"truncate",style:{fontSize:14,fontWeight:500,letterSpacing:"-0.01em"},children:o.title||o.name}),a&&e.jsxs("span",{className:"inline-flex items-center gap-0.5 flex-shrink-0",style:{fontSize:10,color:"oklch(0.4 0.13 145)",background:"oklch(0.95 0.05 145)",padding:"0 5px",height:16,borderRadius:3,fontWeight:500},children:[e.jsx(Ne,{size:9,strokeWidth:2.5}),j("registry.latest")]})]}),e.jsxs("div",{className:"hub-mono truncate",style:{fontSize:11,color:"var(--hub-ink-3)"},children:[o.name," · v",o.version]})]})]}),e.jsx("div",{className:"flex-1 line-clamp-2",style:{fontSize:12.5,color:"var(--hub-ink-2)",lineHeight:1.5},children:T})]}),e.jsxs("div",{className:"flex items-center justify-between px-3.5 py-2",style:{borderTop:"1px solid var(--hub-line-2)",background:"var(--hub-bg-2)"},children:[e.jsxs("div",{className:"hub-mono flex items-center gap-3",style:{fontSize:11.5,color:"var(--hub-ink-3)"},children:[P>0&&e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Oe,{size:11}),P]}),_>0&&e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Qe,{size:11}),_]}),(c||b)&&e.jsx("span",{children:ts(b||c)})]}),e.jsxs("span",{className:"hub-mono",style:{fontSize:11,color:"var(--hub-accent)"},children:[j("registry.viewDetails")," →"]})]})]})},ns=({serverEntry:s,onBack:f,onInstall:j,installing:o=!1,isInstalled:u=!1,fetchVersions:i})=>{const{t:a}=te(),{server:c,_meta:b}=s,[P,_]=t.useState(c.version),[T,$]=t.useState([]),[D,U]=t.useState(!1),[B,w]=t.useState(!1),[V,L]=t.useState(null),[E,W]=t.useState(null),[q,R]=t.useState(null),[I,z]=t.useState({packages:!0,remotes:!0,repository:!0}),N=b==null?void 0:b["io.modelcontextprotocol.registry/official"];t.useEffect(()=>{(async()=>{if(i){U(!0);try{const m=await i(c.name);$(m)}catch(m){console.error("Failed to load versions:",m)}finally{U(!1)}}})()},[c.name,i]);const Q=c.icons&&c.icons.length>0?c.icons.find(m=>!m.theme||m.theme==="light")||c.icons[0]:null,v=n=>{if(!n)return"";try{return new Date(n).toLocaleDateString()}catch{return""}},h=n=>{z(m=>({...m,[n]:!m[n]}))},C=(n,m)=>{L(n),W(m),R(null),w(!0)},Z=()=>{w(!1),R(null)},g=async n=>{try{if(!j||!E||!V)return;R(null);const m=n.config;j(c,m),w(!1)}catch(m){console.error("Error installing server:",m),R(a("errors.serverInstall"))}},y=()=>{if(!E||!V)return null;if(console.log("Building initial form data for:",E),V==="package"&&"identifier"in E){const n=E,m={};n.environmentVariables&&n.environmentVariables.forEach(M=>{m[M.name]=M.default||""});const d=ls(n.registryType);return{name:xe(c.name),status:"disconnected",config:{type:"stdio",command:d,args:is(d,n),env:Object.keys(m).length>0?m:void 0}}}else if(V==="remote"&&"url"in E){const n=E,m={};n.headers&&n.headers.forEach(M=>{m[M.name]=M.default||M.value||""});const d=n.type==="sse"?"sse":"streamable-http";return{name:xe(c.name),status:"disconnected",config:{type:d,url:n.url,headers:Object.keys(m).length>0?m:void 0}}}return null},p=(n,m)=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-3 hover:border-blue-400 transition-colors",children:[e.jsxs("div",{className:"flex items-start justify-between mb-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h4",{className:"font-medium text-gray-900",children:n.identifier}),n.version&&e.jsxs("p",{className:"text-sm text-gray-500",children:["Version: ",n.version]}),n.runtimeHint&&e.jsx("p",{className:"text-sm text-gray-600 mt-1",children:n.runtimeHint})]}),e.jsx("button",{onClick:()=>C("package",n),disabled:u||o,className:`px-4 py-2 rounded text-sm font-medium transition-colors ${u?"hub-btn cursor-default":o?"hub-btn cursor-not-allowed opacity-50":"hub-btn primary"}`,children:a(u?"registry.installed":o?"registry.installing":"registry.install")})]}),n.registryType&&e.jsxs("div",{className:"text-sm text-gray-600 mb-2",children:[e.jsx("span",{className:"font-medium",children:"Registry:"})," ",n.registryType]}),n.transport&&e.jsxs("div",{className:"text-sm text-gray-600 mb-2",children:[e.jsx("span",{className:"font-medium",children:"Transport:"})," ",n.transport.type,n.transport.url&&e.jsxs("span",{className:"ml-2 text-gray-500",children:["(",n.transport.url,")"]})]}),n.environmentVariables&&n.environmentVariables.length>0&&e.jsxs("div",{className:"mt-3 border-t border-gray-200 dark:border-gray-700 pt-3",children:[e.jsxs("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:[a("registry.environmentVariables"),":"]}),e.jsx("div",{className:"space-y-2",children:n.environmentVariables.map((d,M)=>e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"flex items-start",children:[e.jsx("span",{className:"font-mono text-gray-900 font-medium",children:d.name}),d.isRequired&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800",children:a("common.required")}),d.isSecret&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-yellow-100 text-yellow-800",children:a("common.secret")})]}),d.description&&e.jsx("p",{className:"text-gray-600 mt-1",children:d.description}),d.default&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[a("common.default"),":"]})," ",e.jsx("span",{className:"font-mono",children:d.default})]})]},M))})]}),n.packageArguments&&n.packageArguments.length>0&&e.jsxs("div",{className:"mt-3 border-t border-gray-200 dark:border-gray-700 pt-3",children:[e.jsxs("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:[a("registry.packageArguments"),":"]}),e.jsx("div",{className:"space-y-2",children:n.packageArguments.map((d,M)=>e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"flex items-start",children:[e.jsx("span",{className:"font-mono text-gray-900 font-medium",children:d.name}),d.isRequired&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800",children:a("common.required")}),d.isSecret&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-yellow-100 text-yellow-800",children:a("common.secret")}),d.isRepeated&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-purple-100 text-purple-800 dark:bg-purple-900/40 dark:text-purple-300",children:a("common.repeated")})]}),d.description&&e.jsx("p",{className:"text-gray-600 mt-1",children:d.description}),d.type&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[a("common.type"),":"]})," ",e.jsx("span",{className:"font-mono",children:d.type})]}),d.default&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[a("common.default"),":"]})," ",e.jsx("span",{className:"font-mono",children:d.default})]}),d.value&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[a("common.value"),":"]})," ",e.jsx("span",{className:"font-mono",children:d.value})]}),d.valueHint&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[a("common.valueHint"),":"]})," ",e.jsx("span",{className:"font-mono",children:d.valueHint})]}),d.choices&&d.choices.length>0&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[a("common.choices"),":"]})," ",e.jsx("span",{className:"font-mono",children:d.choices.join(", ")})]})]},M))})]})]},m),S=(n,m)=>e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-3 hover:border-blue-400 transition-colors",children:[e.jsxs("div",{className:"flex items-start justify-between mb-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h4",{className:"font-medium text-gray-900",children:n.type}),e.jsx("p",{className:"text-sm text-gray-600 mt-1 break-all",children:n.url})]}),e.jsx("button",{onClick:()=>C("remote",n),disabled:u||o,className:`px-4 py-2 rounded text-sm font-medium transition-colors ${u?"hub-btn cursor-default":o?"hub-btn cursor-not-allowed opacity-50":"hub-btn primary"}`,children:a(u?"registry.installed":o?"registry.installing":"registry.install")})]}),n.headers&&n.headers.length>0&&e.jsxs("div",{className:"mt-3 border-t border-gray-200 dark:border-gray-700 pt-3",children:[e.jsxs("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:[a("registry.headers"),":"]}),e.jsx("div",{className:"space-y-2",children:n.headers.map((d,M)=>e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"flex items-start",children:[e.jsx("span",{className:"font-mono text-gray-900 font-medium",children:d.name}),d.isRequired&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800",children:a("common.required")}),d.isSecret&&e.jsx("span",{className:"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-yellow-100 text-yellow-800",children:a("common.secret")})]}),d.description&&e.jsx("p",{className:"text-gray-600 mt-1",children:d.description}),d.value&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[a("common.value"),":"]})," ",e.jsx("span",{className:"font-mono",children:d.value})]}),d.default&&e.jsxs("p",{className:"text-gray-500 mt-1",children:[e.jsxs("span",{className:"font-medium",children:[a("common.default"),":"]})," ",e.jsx("span",{className:"font-mono",children:d.default})]})]},M))})]})]},m);return e.jsxs("div",{className:"bg-white dark:bg-gray-800 shadow rounded-lg p-6",children:[e.jsxs("div",{className:"mb-6",children:[e.jsxs("button",{onClick:f,className:"flex items-center text-blue-600 hover:text-blue-800 mb-4 transition-colors",children:[e.jsx("svg",{className:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})}),a("registry.backToList")]}),e.jsxs("div",{className:"flex items-start space-x-4",children:[Q?e.jsx("img",{src:Q.src,alt:c.title,className:"w-20 h-20 rounded-lg object-cover flex-shrink-0",onError:n=>{n.currentTarget.style.display="none"}}):e.jsx("div",{className:"w-20 h-20 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg flex items-center justify-center text-white text-3xl font-semibold flex-shrink-0",children:"M"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("h1",{className:"text-3xl font-bold text-gray-900 mb-2",children:c.name}),e.jsxs("div",{className:"flex flex-wrap gap-2 mb-3",children:[(N==null?void 0:N.isLatest)&&e.jsx("span",{className:"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-green-100 text-green-800",children:a("registry.latest")}),e.jsxs("span",{className:"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300",children:["v",c.version]}),(N==null?void 0:N.status)&&e.jsx("span",{className:"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-gray-100 dark:bg-gray-800 text-gray-800",children:N.status}),e.jsxs("span",{className:"flex flex-wrap items-center gap-4 text-sm text-gray-600",children:[(N==null?void 0:N.publishedAt)&&e.jsxs("div",{children:[e.jsxs("span",{className:"font-medium",children:[a("registry.published"),":"]})," ",v(N.publishedAt)]}),(N==null?void 0:N.updatedAt)&&e.jsxs("div",{children:[e.jsxs("span",{className:"font-medium",children:[a("registry.updated"),":"]})," ",v(N.updatedAt)]})]})]})]})]})]}),e.jsxs("div",{className:"mb-6",children:[e.jsx("h2",{className:"text-xl font-semibold text-gray-900 mb-3",children:a("registry.description")}),e.jsx("p",{className:"text-gray-700 leading-relaxed whitespace-pre-wrap",children:c.description})]}),c.websiteUrl&&e.jsxs("div",{className:"mb-6",children:[e.jsx("h2",{className:"text-xl font-semibold text-gray-900 mb-3",children:a("registry.website")}),e.jsx("a",{href:c.websiteUrl,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800 hover:underline",children:c.websiteUrl})]}),c.packages&&c.packages.length>0&&e.jsxs("div",{className:"mb-6",children:[e.jsxs("button",{onClick:()=>h("packages"),className:"flex items-center justify-between w-full text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors",children:[e.jsxs("span",{children:[a("registry.packages")," (",c.packages.length,")"]}),e.jsx("svg",{className:`w-5 h-5 transform transition-transform ${I.packages?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),I.packages&&e.jsx("div",{className:"space-y-3",children:c.packages.map(p)})]}),c.remotes&&c.remotes.length>0&&e.jsxs("div",{className:"mb-6",children:[e.jsxs("button",{onClick:()=>h("remotes"),className:"flex items-center justify-between w-full text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors",children:[e.jsxs("span",{children:[a("registry.remotes")," (",c.remotes.length,")"]}),e.jsx("svg",{className:`w-5 h-5 transform transition-transform ${I.remotes?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),I.remotes&&e.jsx("div",{className:"space-y-3",children:c.remotes.map(S)})]}),c.repository&&e.jsxs("div",{className:"mb-6",children:[e.jsxs("button",{onClick:()=>h("repository"),className:"flex items-center justify-between w-full text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors",children:[e.jsx("span",{children:a("registry.repository")}),e.jsx("svg",{className:`w-5 h-5 transform transition-transform ${I.repository?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),I.repository&&e.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded-lg p-4",children:[c.repository.url&&e.jsxs("div",{className:"mb-2",children:[e.jsx("span",{className:"font-medium text-gray-700",children:"URL:"})," ",e.jsx("a",{href:c.repository.url,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800 hover:underline break-all",children:c.repository.url})]}),c.repository.source&&e.jsxs("div",{className:"mb-2",children:[e.jsx("span",{className:"font-medium text-gray-700",children:"Source:"})," ",c.repository.source]}),c.repository.subfolder&&e.jsxs("div",{className:"mb-2",children:[e.jsx("span",{className:"font-medium text-gray-700",children:"Subfolder:"})," ",c.repository.subfolder]}),c.repository.id&&e.jsxs("div",{children:[e.jsx("span",{className:"font-medium text-gray-700",children:"ID:"})," ",c.repository.id]})]})]}),B&&E&&V&&e.jsx("div",{className:"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4",children:e.jsx(je,{onSubmit:g,onCancel:Z,modalTitle:a("registry.installServer",{name:c.title||c.name}),formError:q,initialData:y()})})]})};function ls(s){switch(s.toLowerCase()){case"pypi":case"python":return"uvx";case"npm":case"node":return"npx";case"oci":case"docker":return"docker";default:return""}}function is(s,f){const j=[f.identifier+(f.version?`@${f.version}`:"")],o=[];switch(f.packageArguments&&f.packageArguments.length>0&&f.packageArguments.forEach(u=>{if(u.isRequired||u.default||u.value){const i=`--${u.name}`,a=u.value||u.default||`\${${u.name.toUpperCase()}}`;o.push(i,a)}}),s.toLowerCase()){case"uvx":return[...j,...o];case"npx":return[...j,...o];case"docker":{const u=[];return f.environmentVariables&&f.environmentVariables.forEach(i=>{u.push("-e",`${i.name}`)}),["run","-i","--rm",...u,...j,...o]}default:return[...j,...o]}}const os=({currentPage:s,hasNextPage:f,hasPreviousPage:j,onNextPage:o,onPreviousPage:u})=>e.jsxs("div",{className:"flex items-center justify-center space-x-2 my-6",children:[e.jsxs("button",{onClick:u,disabled:!j,className:`px-4 py-2 rounded transition-all duration-200 ${j?"bg-gray-200 hover:bg-gray-300 text-gray-700 btn-secondary":"bg-gray-100 text-gray-400 cursor-not-allowed"}`,children:[e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",className:"h-5 w-5 inline-block mr-1",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z",clipRule:"evenodd"})}),"Prev"]}),e.jsxs("span",{className:"px-4 py-2 bg-blue-500 text-white rounded btn-primary",children:["Page ",s]}),e.jsxs("button",{onClick:o,disabled:!f,className:`px-4 py-2 rounded transition-all duration-200 ${f?"bg-gray-200 hover:bg-gray-300 text-gray-700 btn-secondary":"bg-gray-100 text-gray-400 cursor-not-allowed"}`,children:["Next",e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",className:"h-5 w-5 inline-block ml-1",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z",clipRule:"evenodd"})})]})]}),ps=()=>{const{t:s}=te(),f=De(),{serverName:j}=Ue(),{showToast:o}=We(),[u,i]=He(),a=u.get("tab")==="registry"?"registry":"local",{servers:c,allServers:b,categories:P,loading:_,error:T,setError:$,searchServers:D,filterByCategory:U,filterByTag:B,selectedCategory:w,selectedTag:V,installServer:L,fetchServerByName:E,isServerInstalled:W,currentPage:q,totalPages:R,changePage:I,serversPerPage:z,changeServersPerPage:N}=Ze(),{servers:X,allServers:Q,loading:v,error:h,setError:C,searchServers:Z,clearSearch:g,fetchServerByName:y,fetchServerVersions:p,currentPage:S,totalPages:n,hasNextPage:m,hasPreviousPage:d,changePage:M,goToNextPage:oe,goToPreviousPage:ce,serversPerPage:r,changeServersPerPage:l}=Ke(),[F,K]=t.useState(null),[H,G]=t.useState(null),[Y,ee]=t.useState(""),[de,he]=t.useState(""),[ge,ie]=t.useState(!1),[ke,Se]=t.useState(new Set);t.useEffect(()=>{(async()=>{if(j)if(a==="registry"){const k=await y(j);k?G(k):f("/market?tab=registry")}else{const k=await E(j);k?K(k):f("/market?tab=local")}else K(null),G(null)})()},[j,a,E,y,f]);const we=x=>{const k=new URLSearchParams(u);k.set("tab",x),i(k),j&&f("/market?"+k.toString())},Ce=x=>{x.preventDefault(),a==="local"?D(Y):a==="registry"&&Z(de)},Pe=x=>{a==="local"&&U(x)},Ee=()=>{a==="local"?(ee(""),U(""),B("")):a==="registry"&&(he(""),g())},pe=x=>{var k;if(a==="registry"){const re=(k=x.server)==null?void 0:k.name;re&&f(`/market/${encodeURIComponent(re)}?tab=registry`)}else f(`/market/${x.name}?tab=local`)},fe=()=>f(`/market?tab=${a}`),Re=async(x,k)=>{try{ie(!0),await L(x,k)&&o(s("market.installSuccess",{serverName:x.display_name}),"success")}finally{ie(!1)}},Ie=async(x,k)=>{try{ie(!0);const J={name:xe(x.name),config:k},re=await ve("/servers",J);if(!re.success){o((re==null?void 0:re.message)||s("server.addError"),"error");return}Se(Me=>new Set(Me).add(x.name)),o(s("registry.installSuccess",{name:x.title||x.name}),"success")}catch(J){o(s("registry.installError",{error:J instanceof Error?J.message:String(J)}),"error")}finally{ie(!1)}},Te=x=>{a==="local"?I(x):M(x),window.scrollTo({top:0,behavior:"smooth"})},Le=x=>{const k=parseInt(x.target.value,10);a==="local"?N(k):l(k)};if(F)return e.jsx(rs,{server:F,onBack:fe,onInstall:Re,installing:ge,isInstalled:W(F.name)});if(H)return e.jsx(ns,{serverEntry:H,onBack:fe,onInstall:Ie,installing:ge,isInstalled:ke.has(H.server.name),fetchVersions:p});const A=a==="local",ae=a==="registry",me=A?c:X,ue=A?b:Q,Ae=A?P:[],ze=A?_:v,ye=A?T:h,$e=A?$:C,se=A?w:"",Be=A?V:"",ne=A?q:S,Ve=A?R:n,le=A?z:r,be=[{id:"local",label:s("market.title"),sourceLabel:"MCPM",sourceUrl:"https://mcpm.sh"},{id:"registry",label:s("registry.title"),sourceLabel:s("registry.official"),sourceUrl:"https://registry.modelcontextprotocol.io"}];return e.jsxs("div",{children:[e.jsx("div",{className:"flex items-end justify-between gap-4 mb-6",children:e.jsxs("div",{children:[e.jsx("h1",{className:"hub-h1",children:s("nav.market")}),e.jsx("p",{className:"hub-sub",children:be.map(x=>x.label).join(" · ")})]})}),e.jsx("div",{className:"mb-5",children:e.jsx("div",{style:{borderBottom:"1px solid var(--hub-line)"},children:e.jsx("nav",{className:"flex -mb-px gap-1.5",children:be.map(x=>{const k=a===x.id;return e.jsxs("button",{onClick:()=>we(x.id),className:"py-2 px-3 transition-colors text-[14px]",style:{borderBottom:"2px solid "+(k?"var(--hub-ink)":"transparent"),color:k?"var(--hub-ink)":"var(--hub-ink-3)",fontWeight:k?500:400},children:[x.label,e.jsxs("a",{href:x.sourceUrl,target:"_blank",rel:"noopener noreferrer",className:"hub-mono ml-1.5",style:{fontSize:11,color:"var(--hub-ink-3)"},onClick:J=>J.stopPropagation(),children:["(",x.sourceLabel,")"]})]},x.id)})})})}),ye&&e.jsxs("div",{className:"hub-card flex items-center justify-between gap-3 mb-4",style:{padding:"10px 14px",borderColor:"oklch(0.85 0.1 25)",background:"oklch(0.97 0.03 25)",color:"oklch(0.4 0.18 25)"},children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx(qe,{size:14,className:"flex-shrink-0"}),e.jsx("span",{className:"truncate text-[13px]",children:ye})]}),e.jsx("button",{className:"hub-icon-btn sm",onClick:()=>$e(null),children:e.jsx(Ge,{size:13})})]}),(A||ae)&&e.jsxs("form",{onSubmit:Ce,className:"hub-card flex items-center gap-2 px-3 mb-5",style:{padding:6},children:[e.jsx(Je,{size:16,style:{color:"var(--hub-ink-3)",margin:"0 6px 0 6px"}}),e.jsx("input",{type:"text",value:ae?de:Y,onChange:x=>{ae?he(x.target.value):ee(x.target.value)},placeholder:s(ae?"registry.searchPlaceholder":"market.searchPlaceholder"),className:"flex-1 bg-transparent outline-none",style:{height:32,fontSize:14,color:"var(--hub-ink)"}}),e.jsx("button",{type:"submit",className:"hub-btn",children:s("common.search")}),(A&&(Y||se||Be)||ae&&de)&&e.jsx("button",{type:"button",onClick:Ee,className:"hub-btn ghost",children:s("common.clear")})]}),e.jsxs("div",{className:A?"grid gap-5":"",style:A?{gridTemplateColumns:"180px 1fr"}:void 0,children:[A&&e.jsxs("div",{children:[e.jsx("h3",{className:"hub-sect mb-2",children:s("market.categories")}),e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs("button",{onClick:()=>U(""),className:"flex items-center justify-between transition-colors text-[13px]",style:{padding:"6px 10px",borderRadius:6,background:se?"transparent":"var(--hub-surface)",color:se?"var(--hub-ink-2)":"var(--hub-ink)",border:"1px solid "+(se?"transparent":"var(--hub-line)")},children:[e.jsx("span",{children:s("common.all")}),e.jsx("span",{className:"hub-mono",style:{fontSize:11,color:"var(--hub-ink-3)"},children:b.length})]}),Ae.map(x=>e.jsx("button",{onClick:()=>Pe(x),className:"flex items-center justify-between transition-colors text-[13px]",style:{padding:"6px 10px",borderRadius:6,background:se===x?"var(--hub-surface)":"transparent",color:se===x?"var(--hub-ink)":"var(--hub-ink-2)",border:"1px solid "+(se===x?"var(--hub-line)":"transparent")},children:e.jsx("span",{className:"truncate",children:x})},x))]})]}),e.jsx("div",{children:ze?e.jsx("div",{className:"hub-card p-6 text-center",style:{color:"var(--hub-ink-3)"},children:s("app.loading")}):me.length===0?e.jsx("div",{className:"hub-card p-10 text-center",style:{color:"var(--hub-ink-3)"},children:s(A?"market.noServers":"registry.noServers")}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-3",children:me.map((x,k)=>A?e.jsx(ss,{server:x,onClick:pe},k):e.jsx(as,{serverEntry:x,onClick:pe},k))}),e.jsxs("div",{className:"flex items-center mt-4 text-[12px]",style:{color:"var(--hub-ink-3)"},children:[e.jsx("div",{className:"flex-[2]",children:A?s("market.showing",{from:(ne-1)*le+1,to:Math.min(ne*le,ue.length),total:ue.length}):s("registry.showing",{from:(ne-1)*le+1,to:(ne-1)*le+me.length,total:ue.length+(m?"+":"")})}),e.jsx("div",{className:"flex-[4] flex justify-center",children:ae?e.jsx(os,{currentPage:ne,hasNextPage:m,hasPreviousPage:d,onNextPage:oe,onPreviousPage:ce}):e.jsx(Ye,{currentPage:ne,totalPages:Ve,onPageChange:Te})}),e.jsxs("div",{className:"flex-[2] flex items-center justify-end gap-2",children:[e.jsxs("label",{htmlFor:"perPage",children:[s(A?"market.perPage":"registry.perPage"),":"]}),e.jsxs("div",{className:"relative",children:[e.jsxs("select",{id:"perPage",value:le,onChange:Le,className:"hub-input pr-7",style:{height:26,width:70,padding:"0 6px",fontSize:12},children:[e.jsx("option",{value:"6",children:"6"}),e.jsx("option",{value:"9",children:"9"}),e.jsx("option",{value:"12",children:"12"}),e.jsx("option",{value:"24",children:"24"})]}),e.jsx(Xe,{size:11,className:"absolute right-1.5 top-1/2 -translate-y-1/2 pointer-events-none",style:{color:"var(--hub-ink-3)"}})]})]})]})]})})]})]})};export{ps as default};
2
- //# sourceMappingURL=MarketPage-nAF8uFkv.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarketPage-nAF8uFkv.js","sources":["../../src/hooks/useMarketData.ts","../../src/hooks/useRegistryData.ts","../../src/components/MarketServerCard.tsx","../../src/components/MarketServerDetail.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 {\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 { Check, Zap } from 'lucide-react';\nimport { MarketServer } from '@/types';\n\ninterface MarketServerCardProps {\n server: MarketServer;\n onClick: (server: MarketServer) => void;\n}\n\nconst getInitials = (name: string) =>\n name\n .split(' ')\n .map((w) => w.charAt(0))\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\nconst MarketServerCard: React.FC<MarketServerCardProps> = ({ server, onClick }) => {\n const { t } = useTranslation();\n const tags = (server.tags || []).slice(0, 3);\n const category = server.categories?.[0];\n\n return (\n <div\n className=\"hub-card flex flex-col cursor-pointer transition-colors h-full overflow-hidden\"\n onClick={() => onClick(server)}\n onMouseEnter={(e) => (e.currentTarget.style.borderColor = 'var(--hub-ink-2)')}\n onMouseLeave={(e) => (e.currentTarget.style.borderColor = 'var(--hub-line)')}\n >\n <div className=\"p-3.5 flex-1 flex flex-col gap-2.5\">\n <div className=\"flex items-center gap-2\">\n <div\n className=\"hub-mono\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 7,\n background: 'var(--hub-ink)',\n color: 'var(--hub-bg)',\n display: 'grid',\n placeItems: 'center',\n fontWeight: 600,\n fontSize: 13,\n flexShrink: 0,\n }}\n >\n {getInitials(server.display_name || server.name)[0] || '?'}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n <span\n className=\"truncate\"\n style={{ fontSize: 14, fontWeight: 500, letterSpacing: '-0.01em' }}\n >\n {server.display_name}\n </span>\n {server.is_official && (\n <span\n className=\"inline-flex items-center gap-0.5\"\n style={{\n fontSize: 10,\n color: 'var(--hub-accent)',\n background: 'var(--hub-accent-soft)',\n padding: '0 5px',\n height: 16,\n borderRadius: 3,\n fontWeight: 500,\n }}\n >\n <Check size={9} strokeWidth={2.5} />\n {t('market.official')}\n </span>\n )}\n </div>\n <div\n className=\"hub-mono truncate\"\n style={{ fontSize: 11, color: 'var(--hub-ink-3)' }}\n >\n @{server.author?.name || t('market.unknown')}\n </div>\n </div>\n </div>\n\n <div\n className=\"flex-1 line-clamp-2\"\n style={{ fontSize: 12.5, color: 'var(--hub-ink-2)', lineHeight: 1.5 }}\n >\n {server.description}\n </div>\n\n {tags.length > 0 && (\n <div className=\"flex gap-1 flex-wrap\">\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"hub-tag\"\n style={{\n background: 'oklch(0.96 0.04 145)',\n color: 'oklch(0.4 0.1 145)',\n border: 0,\n }}\n >\n #{tag}\n </span>\n ))}\n </div>\n )}\n </div>\n\n <div\n className=\"flex items-center justify-between px-3.5 py-2\"\n style={{\n borderTop: '1px solid var(--hub-line-2)',\n background: 'var(--hub-bg-2)',\n }}\n >\n <div\n className=\"hub-mono flex items-center gap-3\"\n style={{ fontSize: 11.5, color: 'var(--hub-ink-3)' }}\n >\n <span className=\"inline-flex items-center gap-1\">\n <Zap size={11} />\n {server.tools?.length ?? 0} {t('server.tools').toLowerCase()}\n </span>\n {category && <span className=\"truncate\">{category}</span>}\n </div>\n </div>\n </div>\n );\n};\n\nexport default MarketServerCard;\n","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 'hub-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=\"hub-card 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=\"hub-btn\"\n >\n {t('common.cancel')}\n </button>\n <button\n onClick={handleConfirmInstall}\n className=\"hub-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 { Package, Globe, Check } from 'lucide-react';\nimport { RegistryServerEntry } from '@/types';\n\ninterface RegistryServerCardProps {\n serverEntry: RegistryServerEntry;\n onClick: (serverEntry: RegistryServerEntry) => void;\n}\n\nconst formatDate = (dateString?: string) => {\n if (!dateString) return '';\n try {\n const date = new Date(dateString);\n const y = date.getFullYear();\n const m = (date.getMonth() + 1).toString().padStart(2, '0');\n const d = date.getDate().toString().padStart(2, '0');\n return `${y}/${m}/${d}`;\n } catch {\n return '';\n }\n};\n\nconst RegistryServerCard: React.FC<RegistryServerCardProps> = ({ serverEntry, onClick }) => {\n const { t } = useTranslation();\n const { server, _meta } = serverEntry;\n const officialMeta = _meta?.['io.modelcontextprotocol.registry/official'];\n const isLatest = officialMeta?.isLatest;\n const publishedAt = officialMeta?.publishedAt;\n const updatedAt = officialMeta?.updatedAt;\n const packageCount = server.packages?.length || 0;\n const remoteCount = server.remotes?.length || 0;\n const description = server.description\n ? server.description.length <= 150\n ? server.description\n : server.description.slice(0, 150) + '...'\n : t('registry.noDescription');\n\n const icon = (() => {\n if (server.icons && server.icons.length > 0) {\n const light = server.icons.find((i) => !i.theme || i.theme === 'light');\n return light || server.icons[0];\n }\n return null;\n })();\n\n return (\n <div\n className=\"hub-card flex flex-col cursor-pointer transition-colors h-full overflow-hidden\"\n onClick={() => onClick(serverEntry)}\n onMouseEnter={(e) => (e.currentTarget.style.borderColor = 'var(--hub-ink-2)')}\n onMouseLeave={(e) => (e.currentTarget.style.borderColor = 'var(--hub-line)')}\n >\n <div className=\"p-3.5 flex-1 flex flex-col gap-2.5\">\n <div className=\"flex items-start gap-2\">\n {icon ? (\n <img\n src={icon.src}\n alt={server.title || server.name}\n className=\"rounded-md object-cover flex-shrink-0\"\n style={{ width: 28, height: 28 }}\n onError={(e) => {\n (e.currentTarget as HTMLImageElement).style.display = 'none';\n }}\n />\n ) : (\n <div\n className=\"hub-mono flex-shrink-0\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 7,\n background: 'var(--hub-ink)',\n color: 'var(--hub-bg)',\n display: 'grid',\n placeItems: 'center',\n fontWeight: 600,\n fontSize: 13,\n }}\n >\n {server.name.charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n <span\n className=\"truncate\"\n style={{ fontSize: 14, fontWeight: 500, letterSpacing: '-0.01em' }}\n >\n {server.title || server.name}\n </span>\n {isLatest && (\n <span\n className=\"inline-flex items-center gap-0.5 flex-shrink-0\"\n style={{\n fontSize: 10,\n color: 'oklch(0.4 0.13 145)',\n background: 'oklch(0.95 0.05 145)',\n padding: '0 5px',\n height: 16,\n borderRadius: 3,\n fontWeight: 500,\n }}\n >\n <Check size={9} strokeWidth={2.5} />\n {t('registry.latest')}\n </span>\n )}\n </div>\n <div\n className=\"hub-mono truncate\"\n style={{ fontSize: 11, color: 'var(--hub-ink-3)' }}\n >\n {server.name} · v{server.version}\n </div>\n </div>\n </div>\n\n <div\n className=\"flex-1 line-clamp-2\"\n style={{ fontSize: 12.5, color: 'var(--hub-ink-2)', lineHeight: 1.5 }}\n >\n {description}\n </div>\n </div>\n\n <div\n className=\"flex items-center justify-between px-3.5 py-2\"\n style={{ borderTop: '1px solid var(--hub-line-2)', background: 'var(--hub-bg-2)' }}\n >\n <div\n className=\"hub-mono flex items-center gap-3\"\n style={{ fontSize: 11.5, color: 'var(--hub-ink-3)' }}\n >\n {packageCount > 0 && (\n <span className=\"inline-flex items-center gap-1\">\n <Package size={11} />\n {packageCount}\n </span>\n )}\n {remoteCount > 0 && (\n <span className=\"inline-flex items-center gap-1\">\n <Globe size={11} />\n {remoteCount}\n </span>\n )}\n {(publishedAt || updatedAt) && <span>{formatDate(updatedAt || publishedAt)}</span>}\n </div>\n <span className=\"hub-mono\" style={{ fontSize: 11, color: 'var(--hub-accent)' }}>\n {t('registry.viewDetails')} →\n </span>\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';\nimport { slugifyServerName } from '@/utils/serverName';\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 // Registry names are reverse-DNS (`io.github.user/weather`); the `/`\n // is not part of the MCP tool-name charset, so slugify it. The field\n // stays editable in the form.\n name: slugifyServerName(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: slugifyServerName(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 ? 'hub-btn cursor-default'\n : installing\n ? 'hub-btn cursor-not-allowed opacity-50'\n : 'hub-btn primary'\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 ? 'hub-btn cursor-default'\n : installing\n ? 'hub-btn cursor-not-allowed opacity-50'\n : 'hub-btn primary'\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 { Search, AlertCircle, X, ChevronDown } from 'lucide-react';\nimport {\n MarketServer,\n ServerConfig,\n RegistryServerEntry,\n RegistryServerData,\n} from '@/types';\nimport { useMarketData } from '@/hooks/useMarketData';\nimport { useRegistryData } from '@/hooks/useRegistryData';\nimport { useToast } from '@/contexts/ToastContext';\nimport { apiPost } from '@/utils/fetchInterceptor';\nimport { slugifyServerName } from '@/utils/serverName';\nimport MarketServerCard from '@/components/MarketServerCard';\nimport MarketServerDetail from '@/components/MarketServerDetail';\nimport RegistryServerCard from '@/components/RegistryServerCard';\nimport RegistryServerDetail from '@/components/RegistryServerDetail';\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 const [searchParams, setSearchParams] = useSearchParams();\n // The cloud (MCPRouter) tab is hidden; only 'local' and 'registry' remain.\n const currentTab: 'local' | 'registry' =\n searchParams.get('tab') === 'registry' ? 'registry' : 'local';\n\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 currentPage: localCurrentPage,\n totalPages: localTotalPages,\n changePage: changeLocalPage,\n serversPerPage: localServersPerPage,\n changeServersPerPage: changeLocalServersPerPage,\n } = useMarketData();\n\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 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 [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 [installedRegistryServers, setInstalledRegistryServers] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n const loadServerDetails = async () => {\n if (serverName) {\n if (currentTab === 'registry') {\n const serverEntry = await fetchRegistryServerByName(serverName);\n if (serverEntry) setSelectedRegistryServer(serverEntry);\n else navigate('/market?tab=registry');\n } else {\n const server = await fetchLocalServerByName(serverName);\n if (server) setSelectedServer(server);\n else navigate('/market?tab=local');\n }\n } else {\n setSelectedServer(null);\n setSelectedRegistryServer(null);\n }\n };\n loadServerDetails();\n }, [\n serverName,\n currentTab,\n fetchLocalServerByName,\n fetchRegistryServerByName,\n navigate,\n ]);\n\n const switchTab = (tab: 'local' | 'registry') => {\n const newParams = new URLSearchParams(searchParams);\n newParams.set('tab', tab);\n setSearchParams(newParams);\n if (serverName) navigate('/market?' + newParams.toString());\n };\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n if (currentTab === 'local') searchLocalServers(searchQuery);\n else if (currentTab === 'registry') searchRegistryServers(registrySearchQuery);\n };\n\n const handleCategoryClick = (category: string) => {\n if (currentTab === 'local') filterLocalByCategory(category);\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 | RegistryServerEntry) => {\n if (currentTab === 'registry') {\n const registryServer = server as RegistryServerEntry;\n const name = registryServer.server?.name;\n if (name) navigate(`/market/${encodeURIComponent(name)}?tab=registry`);\n } else {\n const marketServer = server as MarketServer;\n navigate(`/market/${marketServer.name}?tab=local`);\n }\n };\n\n const handleBackToList = () => navigate(`/market?tab=${currentTab}`);\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 const handleRegistryInstall = async (server: RegistryServerData, config: ServerConfig) => {\n try {\n setInstalling(true);\n // Registry names are reverse-DNS (`io.github.user/weather`); the `/` is\n // not part of the MCP tool-name charset, so slugify before creating.\n const payload = { name: slugifyServerName(server.name), config };\n const result = await apiPost('/servers', payload);\n if (!result.success) {\n showToast(result?.message || t('server.addError'), 'error');\n return;\n }\n setInstalledRegistryServers((prev) => new Set(prev).add(server.name));\n showToast(t('registry.installSuccess', { name: server.title || server.name }), 'success');\n } catch (error) {\n showToast(\n t('registry.installError', { error: error instanceof Error ? error.message : String(error) }),\n 'error',\n );\n } finally {\n setInstalling(false);\n }\n };\n\n const handlePageChange = (page: number) => {\n if (currentTab === 'local') changeLocalPage(page);\n else changeRegistryPage(page);\n window.scrollTo({ top: 0, behavior: 'smooth' });\n };\n\n const handleChangeItemsPerPage = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const v = parseInt(e.target.value, 10);\n if (currentTab === 'local') changeLocalServersPerPage(v);\n else changeRegistryServersPerPage(v);\n };\n\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 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 const isLocalTab = currentTab === 'local';\n const isRegistryTab = currentTab === 'registry';\n const servers = isLocalTab ? localServers : registryServers;\n const allServers = isLocalTab ? allLocalServers : allRegistryServers;\n const categories = isLocalTab ? localCategories : [];\n const loading = isLocalTab ? localLoading : registryLoading;\n const error = isLocalTab ? localError : registryError;\n const setError = isLocalTab ? setLocalError : setRegistryError;\n const selectedCategory = isLocalTab ? selectedLocalCategory : '';\n const selectedTag = isLocalTab ? selectedLocalTag : '';\n const currentPage = isLocalTab ? localCurrentPage : registryCurrentPage;\n const totalPages = isLocalTab ? localTotalPages : registryTotalPages;\n const serversPerPage = isLocalTab ? localServersPerPage : registryServersPerPage;\n\n const tabs: { id: 'local' | 'registry'; label: string; sourceLabel: string; sourceUrl: string }[] = [\n { id: 'local', label: t('market.title'), sourceLabel: 'MCPM', sourceUrl: 'https://mcpm.sh' },\n {\n id: 'registry',\n label: t('registry.title'),\n sourceLabel: t('registry.official'),\n sourceUrl: 'https://registry.modelcontextprotocol.io',\n },\n ];\n\n return (\n <div>\n {/* Header */}\n <div className=\"flex items-end justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"hub-h1\">{t('nav.market')}</h1>\n <p className=\"hub-sub\">\n {tabs.map((tab) => tab.label).join(' · ')}\n </p>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"mb-5\">\n <div style={{ borderBottom: '1px solid var(--hub-line)' }}>\n <nav className=\"flex -mb-px gap-1.5\">\n {tabs.map((tab) => {\n const active = currentTab === tab.id;\n return (\n <button\n key={tab.id}\n onClick={() => switchTab(tab.id)}\n className=\"py-2 px-3 transition-colors text-[14px]\"\n style={{\n borderBottom: '2px solid ' + (active ? 'var(--hub-ink)' : 'transparent'),\n color: active ? 'var(--hub-ink)' : 'var(--hub-ink-3)',\n fontWeight: active ? 500 : 400,\n }}\n >\n {tab.label}\n <a\n href={tab.sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hub-mono ml-1.5\"\n style={{ fontSize: 11, color: 'var(--hub-ink-3)' }}\n onClick={(e) => e.stopPropagation()}\n >\n ({tab.sourceLabel})\n </a>\n </button>\n );\n })}\n </nav>\n </div>\n </div>\n\n {error && (\n <div\n className=\"hub-card flex items-center justify-between gap-3 mb-4\"\n style={{\n padding: '10px 14px',\n borderColor: 'oklch(0.85 0.1 25)',\n background: 'oklch(0.97 0.03 25)',\n color: 'oklch(0.4 0.18 25)',\n }}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <AlertCircle size={14} className=\"flex-shrink-0\" />\n <span className=\"truncate text-[13px]\">{error}</span>\n </div>\n <button className=\"hub-icon-btn sm\" onClick={() => setError(null)}>\n <X size={13} />\n </button>\n </div>\n )}\n\n {/* Search bar */}\n {(isLocalTab || isRegistryTab) && (\n <form onSubmit={handleSearch} className=\"hub-card flex items-center gap-2 px-3 mb-5\" style={{ padding: 6 }}>\n <Search size={16} style={{ color: 'var(--hub-ink-3)', margin: '0 6px 0 6px' }} />\n <input\n type=\"text\"\n value={isRegistryTab ? registrySearchQuery : searchQuery}\n onChange={(e) => {\n if (isRegistryTab) setRegistrySearchQuery(e.target.value);\n else setSearchQuery(e.target.value);\n }}\n placeholder={\n isRegistryTab ? t('registry.searchPlaceholder') : t('market.searchPlaceholder')\n }\n className=\"flex-1 bg-transparent outline-none\"\n style={{ height: 32, fontSize: 14, color: 'var(--hub-ink)' }}\n />\n <button type=\"submit\" className=\"hub-btn\">\n {t('common.search')}\n </button>\n {((isLocalTab && (searchQuery || selectedCategory || selectedTag)) ||\n (isRegistryTab && registrySearchQuery)) && (\n <button type=\"button\" onClick={handleClearFilters} className=\"hub-btn ghost\">\n {t('common.clear')}\n </button>\n )}\n </form>\n )}\n\n <div className={isLocalTab ? 'grid gap-5' : ''} style={isLocalTab ? { gridTemplateColumns: '180px 1fr' } : undefined}>\n {/* Categories sidebar (local only) */}\n {isLocalTab && (\n <div>\n <h3 className=\"hub-sect mb-2\">{t('market.categories')}</h3>\n <div className=\"flex flex-col gap-0.5\">\n <button\n onClick={() => filterLocalByCategory('')}\n className=\"flex items-center justify-between transition-colors text-[13px]\"\n style={{\n padding: '6px 10px',\n borderRadius: 6,\n background: !selectedCategory ? 'var(--hub-surface)' : 'transparent',\n color: !selectedCategory ? 'var(--hub-ink)' : 'var(--hub-ink-2)',\n border: '1px solid ' + (!selectedCategory ? 'var(--hub-line)' : 'transparent'),\n }}\n >\n <span>{t('common.all')}</span>\n <span className=\"hub-mono\" style={{ fontSize: 11, color: 'var(--hub-ink-3)' }}>\n {allLocalServers.length}\n </span>\n </button>\n {categories.map((cat) => (\n <button\n key={cat}\n onClick={() => handleCategoryClick(cat)}\n className=\"flex items-center justify-between transition-colors text-[13px]\"\n style={{\n padding: '6px 10px',\n borderRadius: 6,\n background: selectedCategory === cat ? 'var(--hub-surface)' : 'transparent',\n color: selectedCategory === cat ? 'var(--hub-ink)' : 'var(--hub-ink-2)',\n border:\n '1px solid ' + (selectedCategory === cat ? 'var(--hub-line)' : 'transparent'),\n }}\n >\n <span className=\"truncate\">{cat}</span>\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Grid */}\n <div>\n {loading ? (\n <div className=\"hub-card p-6 text-center\" style={{ color: 'var(--hub-ink-3)' }}>\n {t('app.loading')}\n </div>\n ) : servers.length === 0 ? (\n <div className=\"hub-card p-10 text-center\" style={{ color: 'var(--hub-ink-3)' }}>\n {isLocalTab ? t('market.noServers') : t('registry.noServers')}\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-3\">\n {servers.map((server, index) =>\n isLocalTab ? (\n <MarketServerCard\n key={index}\n server={server as MarketServer}\n onClick={handleServerClick}\n />\n ) : (\n <RegistryServerCard\n key={index}\n serverEntry={server as RegistryServerEntry}\n onClick={handleServerClick}\n />\n ),\n )}\n </div>\n\n <div\n className=\"flex items-center mt-4 text-[12px]\"\n style={{ color: 'var(--hub-ink-3)' }}\n >\n <div className=\"flex-[2]\">\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 : t('registry.showing', {\n from: (currentPage - 1) * serversPerPage + 1,\n to: (currentPage - 1) * serversPerPage + servers.length,\n total: allServers.length + (registryHasNextPage ? '+' : ''),\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 gap-2\">\n <label htmlFor=\"perPage\">\n {isLocalTab ? t('market.perPage') : t('registry.perPage')}:\n </label>\n <div className=\"relative\">\n <select\n id=\"perPage\"\n value={serversPerPage}\n onChange={handleChangeItemsPerPage}\n className=\"hub-input pr-7\"\n style={{ height: 26, width: 70, padding: '0 6px', fontSize: 12 }}\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 <ChevronDown\n size={11}\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 pointer-events-none\"\n style={{ color: 'var(--hub-ink-3)' }}\n />\n </div>\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","useRegistryData","nextCursor","setNextCursor","hasNextPage","setHasNextPage","cursorHistory","setCursorHistory","fetchRegistryServers","cursor","search","params","queryToUse","response","hasMore","prev","errorMessage","goToNextPage","currentCursor","goToPreviousPage","newHistory","previousCursor","newServersPerPage","encodedName","fetchServerVersions","fetchServerVersion","version","encodedVersion","clearSearch","getInitials","w","MarketServerCard","onClick","jsxs","e","jsx","Check","Zap","_c","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","index","arg","tool","element","example","ServerForm","variable","formatDate","dateString","date","y","m","d","RegistryServerCard","serverEntry","_meta","officialMeta","isLatest","publishedAt","updatedAt","packageCount","remoteCount","description","icon","i","Package","Globe","RegistryServerDetail","fetchVersions","_selectedVersion","_setSelectedVersion","_availableVersions","setAvailableVersions","_loadingVersions","setLoadingVersions","selectedInstallType","setSelectedInstallType","selectedOption","setSelectedOption","installError","setInstallError","expandedSections","setExpandedSections","versions","toggleSection","section","handleInstallClick","type","option","handleModalClose","handleInstallSubmit","config","getInitialFormData","pkg","env","envVar","command","getCommand","slugifyServerName","getArgs","remote","headers","header","transportType","renderPackage","envIndex","argIndex","renderRemote","headerIndex","registryType","identifier","packageArgs","argName","argValue","envs","CursorPagination","hasPreviousPage","onNextPage","onPreviousPage","MarketPage","navigate","useNavigate","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","registryServers","allRegistryServers","registryLoading","registryError","setRegistryError","searchRegistryServers","clearRegistrySearch","fetchRegistryServerByName","fetchRegistryServerVersions","registryCurrentPage","registryTotalPages","registryHasNextPage","registryHasPreviousPage","changeRegistryPage","goToRegistryNextPage","goToRegistryPreviousPage","registryServersPerPage","changeRegistryServersPerPage","selectedServer","setSelectedServer","selectedRegistryServer","setSelectedRegistryServer","registrySearchQuery","setRegistrySearchQuery","setInstalling","installedRegistryServers","setInstalledRegistryServers","switchTab","tab","newParams","handleSearch","handleCategoryClick","handleClearFilters","handleServerClick","handleBackToList","handleLocalInstall","handleRegistryInstall","handlePageChange","handleChangeItemsPerPage","v","isLocalTab","isRegistryTab","tabs","active","AlertCircle","X","Search","cat","Fragment","Pagination","ChevronDown"],"mappings":"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"}