@shipit-ai/cli 1.174.0 → 1.174.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/codex-cli.json +1 -1
  2. package/package.json +1 -1
  3. package/web/.next/BUILD_ID +1 -1
  4. package/web/.next/build-manifest.json +3 -3
  5. package/web/.next/fallback-build-manifest.json +3 -3
  6. package/web/.next/prerender-manifest.json +3 -3
  7. package/web/.next/required-server-files.js +2 -2
  8. package/web/.next/required-server-files.json +2 -2
  9. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  10. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  11. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  12. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  13. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  14. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  15. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
  16. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  17. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  18. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  19. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  21. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  22. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  25. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  28. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  29. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  30. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  31. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  32. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  33. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
  34. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  37. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  38. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  40. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  41. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  43. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  44. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  45. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  46. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  49. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/_global-error.html +1 -1
  52. package/web/.next/server/app/_global-error.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  54. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  55. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  56. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  57. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  58. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  59. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  60. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  62. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  63. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  64. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  65. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  66. package/web/.next/server/app/mcp-servers/page/server-reference-manifest.json +13 -13
  67. package/web/.next/server/app/mcp-servers/page.js.nft.json +1 -1
  68. package/web/.next/server/app/mcp-servers/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/plugins/page/server-reference-manifest.json +15 -15
  70. package/web/.next/server/app/plugins/page.js.nft.json +1 -1
  71. package/web/.next/server/app/plugins/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/settings/page/server-reference-manifest.json +12 -12
  73. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  74. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  76. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  77. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  79. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  80. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  82. package/web/.next/server/app/version/page.js.nft.json +1 -1
  83. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
  85. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
  86. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
  88. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/0j.8_web_components_features_mcp-servers_mcp-servers-page-client_tsx_0dda8ih._.js +1 -1
  90. package/web/.next/server/chunks/ssr/0j.8_web_components_features_mcp-servers_mcp-servers-page-client_tsx_0dda8ih._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
  92. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
  94. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__0mwao26._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__0mwao26._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/{_0bknjp-._.js → _019y939._.js} +2 -2
  114. package/web/.next/server/chunks/ssr/{_0bknjp-._.js.map → _019y939._.js.map} +1 -1
  115. package/web/.next/server/chunks/ssr/{_087x~el._.js → _01jtwj3._.js} +2 -2
  116. package/web/.next/server/chunks/ssr/{_087x~el._.js.map → _01jtwj3._.js.map} +1 -1
  117. package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
  118. package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
  120. package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
  122. package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
  124. package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
  126. package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
  128. package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/_0fswe4r._.js +1 -1
  130. package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
  131. package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/{_0glox21._.js → _0pwlot2._.js} +2 -2
  133. package/web/.next/server/chunks/ssr/{_0glox21._.js.map → _0pwlot2._.js.map} +1 -1
  134. package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
  135. package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
  137. package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/_0vq0c0x._.js +1 -1
  139. package/web/.next/server/chunks/ssr/_0vq0c0x._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
  141. package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
  143. package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
  145. package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
  147. package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
  149. package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_mcp-servers_page_actions_0d.r4q..js +1 -1
  151. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_mcp-servers_page_actions_0d.r4q..js.map +1 -1
  152. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js +1 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
  157. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
  162. package/web/.next/server/middleware-build-manifest.js +3 -3
  163. package/web/.next/server/pages/500.html +1 -1
  164. package/web/.next/server/server-reference-manifest.js +1 -1
  165. package/web/.next/server/server-reference-manifest.json +57 -57
  166. package/web/.next/static/chunks/{0c.5-5ohi38wu.js → 0-sn8_v5.1tfa.js} +1 -1
  167. package/web/.next/static/chunks/{0iey6w_th4w6t.js → 0.3drm0s7ymfs.js} +1 -1
  168. package/web/.next/static/chunks/{0q1rh6cwq8q~e.js → 02zfrf7ikyp29.js} +1 -1
  169. package/web/.next/static/chunks/{0zwhmf.myybu0.js → 03hqf_4_4qwm3.js} +3 -3
  170. package/web/.next/static/chunks/{113fyg.4c74k~.js → 06mib0h4gcgk5.js} +1 -1
  171. package/web/.next/static/chunks/{0djvgyu139qht.js → 0_9e92fdo3l-q.js} +1 -1
  172. package/web/.next/static/chunks/{11v7w0zh-u9s8.js → 0e_8lon2juca..js} +1 -1
  173. package/web/.next/static/chunks/{0etn4uwpbu0p..js → 0egftcm_dm9y9.js} +1 -1
  174. package/web/.next/static/chunks/{0w9~abfpfmxwe.js → 0fr8fr~b7xh6n.js} +1 -1
  175. package/web/.next/static/chunks/{093...bdsa2vi.js → 0n_1ni2m~6utg.js} +1 -1
  176. package/web/.next/static/chunks/{030tqac1cx-fj.js → 0q1wkqn0g7-pm.js} +1 -1
  177. package/web/.next/static/chunks/{164.6ma3h~kkp.js → 0vi.ovr0j.l39.js} +1 -1
  178. package/web/.next/static/chunks/0wd.i4f822qoa.js +1 -0
  179. package/web/.next/static/chunks/{11n8b8mq7xbv9.js → 0xebtxnu~n6~7.js} +1 -1
  180. package/web/.next/static/chunks/{0ou6vmrmvv4.f.js → 0y_.-wq2.g0em.js} +1 -1
  181. package/web/.next/static/chunks/{0mukkm1m79wpt.js → 15lkkh2eg.w0h.js} +1 -1
  182. package/web/.next/static/chunks/18alqn4hhlmew.js +1 -0
  183. package/web/public/icons/tools/openai.svg +1 -0
  184. package/web/.next/static/chunks/0fzx4yzxqtc6v.js +0 -1
  185. package/web/.next/static/chunks/0inayq2zzadja.js +0 -1
  186. /package/web/.next/static/{G6UvAet1r3tmTZHz91Byx → 0k1x5A5Hmt_Py4vQ0o-XR}/_buildManifest.js +0 -0
  187. /package/web/.next/static/{G6UvAet1r3tmTZHz91Byx → 0k1x5A5Hmt_Py4vQ0o-XR}/_clientMiddlewareManifest.js +0 -0
  188. /package/web/.next/static/{G6UvAet1r3tmTZHz91Byx → 0k1x5A5Hmt_Py4vQ0o-XR}/_ssgManifest.js +0 -0
@@ -5,6 +5,6 @@ url = "${d}"
5
5
  headers = { "x-litellm-api-key" = "Bearer <LITELLM_API_KEY>" }`;case"curl":return`curl --location '${d}' \\
6
6
  --header 'Content-Type: application/json' \\
7
7
  --header 'x-litellm-api-key: Bearer <LITELLM_API_KEY>' \\
8
- --data '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'`}}(g,a,e),m=async()=>{try{await navigator.clipboard.writeText(l),k(!0),setTimeout(()=>k(!1),2e3)}catch{}};return(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("div",{className:"flex flex-wrap gap-1.5 rounded-lg border border-slate-200/60 bg-slate-50/50 p-1 dark:border-slate-700/50 dark:bg-slate-900/40",role:"tablist","aria-label":f("mcpServers.connect.title"),children:D.map(a=>(0,b.jsx)("button",{type:"button",role:"tab","aria-selected":g===a.id,onClick:()=>h(a.id),"data-state":g===a.id?"active":"inactive",className:"data-[state=active]:bg-card data-[state=active]:text-primary text-muted-foreground hover:text-foreground rounded-md px-2.5 py-1 text-xs font-medium transition-all data-[state=active]:shadow-sm data-[state=active]:ring-1 data-[state=active]:ring-slate-200/70 dark:data-[state=active]:ring-slate-700/50",children:a.label},a.id))}),(0,b.jsxs)("div",{className:"editorial-shadow group relative overflow-hidden rounded-xl border border-slate-200/60 bg-slate-50/60 dark:border-slate-700/50 dark:bg-slate-900/60",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-slate-200/60 bg-slate-100/40 px-3 py-2 dark:border-slate-700/50 dark:bg-slate-900/40",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)("span",{className:"size-2 rounded-full bg-slate-300 dark:bg-slate-600","aria-hidden":!0}),(0,b.jsx)("span",{className:"size-2 rounded-full bg-slate-300 dark:bg-slate-600","aria-hidden":!0}),(0,b.jsx)("span",{className:"size-2 rounded-full bg-slate-300 dark:bg-slate-600","aria-hidden":!0})]}),(0,b.jsx)(i.Button,{type:"button",variant:"ghost",size:"icon",className:"size-6 shrink-0",onClick:m,"aria-label":f("mcpServers.connect.copy"),children:j?(0,b.jsx)(B.Check,{className:"text-primary size-3"}):(0,b.jsx)(C.Copy,{className:"size-3"})})]}),(0,b.jsx)("pre",{className:"max-h-64 overflow-auto p-3 font-mono text-[11px] leading-relaxed",children:(0,b.jsx)("code",{children:l})})]}),(0,b.jsx)("p",{className:"text-muted-foreground text-xs",children:f("mcpServers.connect.replaceKey")})]})}var F=a.i(6120);let G=(0,F.createServerReference)("40b8c8b3465bde89ddd23df1c2c896fe7e43e5ba22",F.callServer,void 0,F.findSourceMapURL,"fetchMcpServerToolsAction");function H({server:a,proxyBaseUrl:e,open:f,onClose:g}){let{t:h}=(0,d.useTranslation)("web"),[j,k]=(0,c.useState)([]),[l,n]=(0,c.useState)(!1),[o,p]=(0,c.useState)(null),[q,r]=(0,c.useState)(null),s=(0,c.useCallback)(async a=>{n(!0),p(null);try{let b=await G(a);k(b.tools),b.error&&p(b.error),r(a)}catch{p("Failed to load tools")}finally{n(!1)}},[]);(0,c.useEffect)(()=>{f&&a&&q!==a.server_name&&s(a.server_name)},[f,a,q,s]);let t=(0,c.useCallback)(()=>{a&&(r(null),s(a.server_name))},[a,s]);if(!a)return null;let v=a.mcp_info?.description??"";return(0,b.jsx)(w.BaseDrawer,{open:f,onClose:g,"data-testid":"mcp-server-detail-drawer",children:(0,b.jsxs)("div",{className:"flex flex-col gap-6 overflow-y-auto p-6",children:[(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsxs)("span",{className:"text-[10px] font-bold tracking-[0.2em] text-slate-400 uppercase",children:[h(`mcpServers.transport.${a.transport}`,a.transport.toUpperCase()),"· MCP Server"]}),(0,b.jsxs)("div",{className:"flex items-start gap-3",children:[(0,b.jsx)("div",{className:"flex size-12 shrink-0 items-center justify-center rounded-lg bg-slate-100 ring-1 ring-slate-200/50 dark:bg-slate-800 dark:ring-slate-700/50",children:(0,b.jsx)(u,{serverName:a.server_name,url:a.url,transport:a.transport,size:"lg"})}),(0,b.jsx)(x.DrawerTitle,{className:"text-foreground mt-2 text-lg font-bold tracking-tight",children:a.name})]}),v?(0,b.jsx)(x.DrawerDescription,{className:"text-muted-foreground text-sm leading-relaxed",children:v}):null]}),(0,b.jsx)(y.Separator,{}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-medium",children:h("mcpServers.detail.serverName")}),(0,b.jsx)("span",{className:"font-mono text-xs",children:a.server_name})]}),!function(a){if(!a)return!1;try{let b=new URL(a);return"http:"===b.protocol||"https:"===b.protocol}catch{return!1}}(a.url)?null:(0,b.jsxs)("div",{className:"flex items-center justify-between gap-4",children:[(0,b.jsx)("span",{className:"text-muted-foreground shrink-0 text-xs font-medium",children:h("mcpServers.detail.url")}),(0,b.jsx)("span",{className:"truncate font-mono text-xs",title:a.url,children:a.url})]}),(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-medium",children:h("mcpServers.detail.transport")}),(0,b.jsx)(m.Badge,{variant:"outline",children:h(`mcpServers.transport.${a.transport}`,a.transport.toUpperCase())})]}),a.auth_type&&"none"!==a.auth_type?(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-medium",children:h("mcpServers.detail.authType")}),(0,b.jsx)(m.Badge,{variant:"secondary",children:h(`mcpServers.authType.${a.auth_type}`,a.auth_type)})]}):null]}),(0,b.jsx)(y.Separator,{}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("h3",{className:"text-foreground text-sm font-bold tracking-tight",children:h("mcpServers.tools.title")}),(0,b.jsx)(i.Button,{type:"button",variant:"ghost",size:"icon",className:"size-7",onClick:t,disabled:l,"aria-label":h("mcpServers.tools.refresh"),"data-testid":"mcp-tools-refresh",children:(0,b.jsx)(z.RefreshCw,{className:`size-3.5 ${l?"animate-spin":""}`})})]}),l?(0,b.jsxs)("p",{className:"text-muted-foreground text-sm",children:[h("accessibility.loading"),"..."]}):o?(0,b.jsx)("p",{className:"text-destructive text-sm",children:o}):(0,b.jsx)(A,{tools:j,serverName:a.server_name})]}),(0,b.jsx)(y.Separator,{}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("h3",{className:"text-foreground text-sm font-bold tracking-tight",children:h("mcpServers.connect.title")}),(0,b.jsx)(E,{proxyBaseUrl:e,serverName:a.server_name})]})]})})}let I=(0,F.createServerReference)("00b4aa2f2237a33bea82972983cf57ee4b3b15b8bc",F.callServer,void 0,F.findSourceMapURL,"fetchMcpServersAction"),J=["all","http","sse","stdio"];a.s(["McpServersPageClient",0,function({proxyConfigured:a,proxyBaseUrl:l}){let{t:m}=(0,d.useTranslation)("web"),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)("all"),[r,s]=(0,c.useState)(null),[t,u]=(0,c.useState)([]),[w,x]=(0,c.useState)(!0),[y,z]=(0,c.useState)(null);(0,c.useEffect)(()=>{a?I().then(a=>{u(a.servers),a.error&&z(a.error)}).catch(()=>{z(m("mcpServers.fetchError"))}).finally(()=>{x(!1)}):x(!1)},[a,m]);let A=(0,c.useMemo)(()=>t.filter(a=>{let b=n.toLowerCase(),c=!b||a.name.toLowerCase().includes(b)||(a.mcp_info?.description??"").toLowerCase().includes(b),d="all"===p||a.transport===p;return c&&d}),[t,n,p]);return a?w?(0,b.jsxs)("div",{className:"flex flex-col gap-8 p-8",children:[(0,b.jsx)(k.PageHeader,{eyebrow:"Developer Portal",title:m("mcpServers.title"),description:m("mcpServers.subtitle")}),(0,b.jsxs)("div",{className:"text-muted-foreground text-center text-sm",children:[m("accessibility.loading"),"..."]})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-8 p-8",children:[(0,b.jsx)(k.PageHeader,{eyebrow:"Developer Portal",title:m("mcpServers.title"),description:m("mcpServers.subtitle")}),y?(0,b.jsxs)("div",{role:"alert",className:"border-destructive/40 bg-destructive/10 editorial-shadow flex items-center gap-2 rounded-xl border px-4 py-3",children:[(0,b.jsx)(e.AlertCircle,{className:"text-destructive size-4 shrink-0"}),(0,b.jsx)("p",{className:"text-destructive text-sm font-medium",children:y})]}):null,(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(f.Search,{className:"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2"}),(0,b.jsx)(h.Input,{placeholder:m("mcpServers.searchPlaceholder"),value:n,onChange:a=>o(a.target.value),className:"ps-9","data-testid":"mcp-servers-search"})]}),(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:J.map(a=>(0,b.jsx)(i.Button,{variant:p===a?"default":"outline",size:"sm",onClick:()=>q(a),"data-testid":`mcp-servers-filter-${a}`,children:"all"===a?m("mcpServers.filter.all"):m(`mcpServers.transport.${a}`,a.toUpperCase())},a))}),0===A.length?(0,b.jsx)(j.EmptyState,{icon:0===t.length?(0,b.jsx)(g.Server,{className:"size-10"}):(0,b.jsx)(f.Search,{className:"size-10"}),title:0===t.length?m("mcpServers.noServers"):m("mcpServers.noResults")}):(0,b.jsx)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",children:A.map(a=>(0,b.jsx)(v,{server:a,onSelect:s},a.server_id))}),(0,b.jsx)(H,{server:r,proxyBaseUrl:l,open:!!r,onClose:()=>s(null)})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-8 p-8",children:[(0,b.jsx)(k.PageHeader,{eyebrow:"Developer Portal",title:m("mcpServers.title"),description:m("mcpServers.subtitle")}),(0,b.jsx)(j.EmptyState,{icon:(0,b.jsx)(e.AlertCircle,{className:"size-10"}),title:m("mcpServers.noProxy")})]})}],6790)}];
8
+ --data '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'`}}(g,a,e),m=async()=>{try{await navigator.clipboard.writeText(l),k(!0),setTimeout(()=>k(!1),2e3)}catch{}};return(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("div",{className:"flex flex-wrap gap-1.5 rounded-lg border border-slate-200/60 bg-slate-50/50 p-1 dark:border-slate-700/50 dark:bg-slate-900/40",role:"tablist","aria-label":f("mcpServers.connect.title"),children:D.map(a=>(0,b.jsx)("button",{type:"button",role:"tab","aria-selected":g===a.id,onClick:()=>h(a.id),"data-state":g===a.id?"active":"inactive",className:"data-[state=active]:bg-card data-[state=active]:text-primary text-muted-foreground hover:text-foreground rounded-md px-2.5 py-1 text-xs font-medium transition-all data-[state=active]:shadow-sm data-[state=active]:ring-1 data-[state=active]:ring-slate-200/70 dark:data-[state=active]:ring-slate-700/50",children:a.label},a.id))}),(0,b.jsxs)("div",{className:"editorial-shadow group relative overflow-hidden rounded-xl border border-slate-200/60 bg-slate-50/60 dark:border-slate-700/50 dark:bg-slate-900/60",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-slate-200/60 bg-slate-100/40 px-3 py-2 dark:border-slate-700/50 dark:bg-slate-900/40",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)("span",{className:"size-2 rounded-full bg-slate-300 dark:bg-slate-600","aria-hidden":!0}),(0,b.jsx)("span",{className:"size-2 rounded-full bg-slate-300 dark:bg-slate-600","aria-hidden":!0}),(0,b.jsx)("span",{className:"size-2 rounded-full bg-slate-300 dark:bg-slate-600","aria-hidden":!0})]}),(0,b.jsx)(i.Button,{type:"button",variant:"ghost",size:"icon",className:"size-6 shrink-0",onClick:m,"aria-label":f("mcpServers.connect.copy"),children:j?(0,b.jsx)(B.Check,{className:"text-primary size-3"}):(0,b.jsx)(C.Copy,{className:"size-3"})})]}),(0,b.jsx)("pre",{className:"max-h-64 overflow-auto p-3 font-mono text-[11px] leading-relaxed",children:(0,b.jsx)("code",{children:l})})]}),(0,b.jsx)("p",{className:"text-muted-foreground text-xs",children:f("mcpServers.connect.replaceKey")})]})}var F=a.i(6120);let G=(0,F.createServerReference)("40c134ff7e31bf984b616914a63a14d9554944ba95",F.callServer,void 0,F.findSourceMapURL,"fetchMcpServerToolsAction");function H({server:a,proxyBaseUrl:e,open:f,onClose:g}){let{t:h}=(0,d.useTranslation)("web"),[j,k]=(0,c.useState)([]),[l,n]=(0,c.useState)(!1),[o,p]=(0,c.useState)(null),[q,r]=(0,c.useState)(null),s=(0,c.useCallback)(async a=>{n(!0),p(null);try{let b=await G(a);k(b.tools),b.error&&p(b.error),r(a)}catch{p("Failed to load tools")}finally{n(!1)}},[]);(0,c.useEffect)(()=>{f&&a&&q!==a.server_name&&s(a.server_name)},[f,a,q,s]);let t=(0,c.useCallback)(()=>{a&&(r(null),s(a.server_name))},[a,s]);if(!a)return null;let v=a.mcp_info?.description??"";return(0,b.jsx)(w.BaseDrawer,{open:f,onClose:g,"data-testid":"mcp-server-detail-drawer",children:(0,b.jsxs)("div",{className:"flex flex-col gap-6 overflow-y-auto p-6",children:[(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsxs)("span",{className:"text-[10px] font-bold tracking-[0.2em] text-slate-400 uppercase",children:[h(`mcpServers.transport.${a.transport}`,a.transport.toUpperCase()),"· MCP Server"]}),(0,b.jsxs)("div",{className:"flex items-start gap-3",children:[(0,b.jsx)("div",{className:"flex size-12 shrink-0 items-center justify-center rounded-lg bg-slate-100 ring-1 ring-slate-200/50 dark:bg-slate-800 dark:ring-slate-700/50",children:(0,b.jsx)(u,{serverName:a.server_name,url:a.url,transport:a.transport,size:"lg"})}),(0,b.jsx)(x.DrawerTitle,{className:"text-foreground mt-2 text-lg font-bold tracking-tight",children:a.name})]}),v?(0,b.jsx)(x.DrawerDescription,{className:"text-muted-foreground text-sm leading-relaxed",children:v}):null]}),(0,b.jsx)(y.Separator,{}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-medium",children:h("mcpServers.detail.serverName")}),(0,b.jsx)("span",{className:"font-mono text-xs",children:a.server_name})]}),!function(a){if(!a)return!1;try{let b=new URL(a);return"http:"===b.protocol||"https:"===b.protocol}catch{return!1}}(a.url)?null:(0,b.jsxs)("div",{className:"flex items-center justify-between gap-4",children:[(0,b.jsx)("span",{className:"text-muted-foreground shrink-0 text-xs font-medium",children:h("mcpServers.detail.url")}),(0,b.jsx)("span",{className:"truncate font-mono text-xs",title:a.url,children:a.url})]}),(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-medium",children:h("mcpServers.detail.transport")}),(0,b.jsx)(m.Badge,{variant:"outline",children:h(`mcpServers.transport.${a.transport}`,a.transport.toUpperCase())})]}),a.auth_type&&"none"!==a.auth_type?(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-medium",children:h("mcpServers.detail.authType")}),(0,b.jsx)(m.Badge,{variant:"secondary",children:h(`mcpServers.authType.${a.auth_type}`,a.auth_type)})]}):null]}),(0,b.jsx)(y.Separator,{}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("h3",{className:"text-foreground text-sm font-bold tracking-tight",children:h("mcpServers.tools.title")}),(0,b.jsx)(i.Button,{type:"button",variant:"ghost",size:"icon",className:"size-7",onClick:t,disabled:l,"aria-label":h("mcpServers.tools.refresh"),"data-testid":"mcp-tools-refresh",children:(0,b.jsx)(z.RefreshCw,{className:`size-3.5 ${l?"animate-spin":""}`})})]}),l?(0,b.jsxs)("p",{className:"text-muted-foreground text-sm",children:[h("accessibility.loading"),"..."]}):o?(0,b.jsx)("p",{className:"text-destructive text-sm",children:o}):(0,b.jsx)(A,{tools:j,serverName:a.server_name})]}),(0,b.jsx)(y.Separator,{}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("h3",{className:"text-foreground text-sm font-bold tracking-tight",children:h("mcpServers.connect.title")}),(0,b.jsx)(E,{proxyBaseUrl:e,serverName:a.server_name})]})]})})}let I=(0,F.createServerReference)("00d2029cb61611e627613ff7b9590e065339029832",F.callServer,void 0,F.findSourceMapURL,"fetchMcpServersAction"),J=["all","http","sse","stdio"];a.s(["McpServersPageClient",0,function({proxyConfigured:a,proxyBaseUrl:l}){let{t:m}=(0,d.useTranslation)("web"),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)("all"),[r,s]=(0,c.useState)(null),[t,u]=(0,c.useState)([]),[w,x]=(0,c.useState)(!0),[y,z]=(0,c.useState)(null);(0,c.useEffect)(()=>{a?I().then(a=>{u(a.servers),a.error&&z(a.error)}).catch(()=>{z(m("mcpServers.fetchError"))}).finally(()=>{x(!1)}):x(!1)},[a,m]);let A=(0,c.useMemo)(()=>t.filter(a=>{let b=n.toLowerCase(),c=!b||a.name.toLowerCase().includes(b)||(a.mcp_info?.description??"").toLowerCase().includes(b),d="all"===p||a.transport===p;return c&&d}),[t,n,p]);return a?w?(0,b.jsxs)("div",{className:"flex flex-col gap-8 p-8",children:[(0,b.jsx)(k.PageHeader,{eyebrow:"Developer Portal",title:m("mcpServers.title"),description:m("mcpServers.subtitle")}),(0,b.jsxs)("div",{className:"text-muted-foreground text-center text-sm",children:[m("accessibility.loading"),"..."]})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-8 p-8",children:[(0,b.jsx)(k.PageHeader,{eyebrow:"Developer Portal",title:m("mcpServers.title"),description:m("mcpServers.subtitle")}),y?(0,b.jsxs)("div",{role:"alert",className:"border-destructive/40 bg-destructive/10 editorial-shadow flex items-center gap-2 rounded-xl border px-4 py-3",children:[(0,b.jsx)(e.AlertCircle,{className:"text-destructive size-4 shrink-0"}),(0,b.jsx)("p",{className:"text-destructive text-sm font-medium",children:y})]}):null,(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(f.Search,{className:"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2"}),(0,b.jsx)(h.Input,{placeholder:m("mcpServers.searchPlaceholder"),value:n,onChange:a=>o(a.target.value),className:"ps-9","data-testid":"mcp-servers-search"})]}),(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:J.map(a=>(0,b.jsx)(i.Button,{variant:p===a?"default":"outline",size:"sm",onClick:()=>q(a),"data-testid":`mcp-servers-filter-${a}`,children:"all"===a?m("mcpServers.filter.all"):m(`mcpServers.transport.${a}`,a.toUpperCase())},a))}),0===A.length?(0,b.jsx)(j.EmptyState,{icon:0===t.length?(0,b.jsx)(g.Server,{className:"size-10"}):(0,b.jsx)(f.Search,{className:"size-10"}),title:0===t.length?m("mcpServers.noServers"):m("mcpServers.noResults")}):(0,b.jsx)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",children:A.map(a=>(0,b.jsx)(v,{server:a,onSelect:s},a.server_id))}),(0,b.jsx)(H,{server:r,proxyBaseUrl:l,open:!!r,onClose:()=>s(null)})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-8 p-8",children:[(0,b.jsx)(k.PageHeader,{eyebrow:"Developer Portal",title:m("mcpServers.title"),description:m("mcpServers.subtitle")}),(0,b.jsx)(j.EmptyState,{icon:(0,b.jsx)(e.AlertCircle,{className:"size-10"}),title:m("mcpServers.noProxy")})]})}],6790)}];
9
9
 
10
10
  //# sourceMappingURL=0j.8_web_components_features_mcp-servers_mcp-servers-page-client_tsx_0dda8ih._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.tsx","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-icon.tsx","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-card.tsx","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-tool-list.tsx","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.tsx","../../../../../../../src/presentation/web/app/actions/data%3A0619c2%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.tsx","../../../../../../../src/presentation/web/app/actions/data%3Af7eea3%20%3Ctext/javascript%3E","../../../../../../../node_modules/.pnpm/lucide-react%401.7.0_react%4019.2.4/node_modules/lucide-react/src/icons/wifi.ts","../../../../../../../src/presentation/web/components/features/mcp-servers/vendor-brand-icons.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle, Search, Server } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { EmptyState } from '@/components/common/empty-state';\nimport { PageHeader } from '@/components/common/page-header';\nimport { McpServerCard } from './mcp-server-card';\nimport { McpServerDetailDrawer } from './mcp-server-detail-drawer';\nimport { fetchMcpServersAction } from '@/app/actions/fetch-mcp-servers';\nimport type { McpServerInfo } from '@shipit-ai/core/application/ports/output/services/mcp-server-browser.interface';\n\ninterface McpServersPageClientProps {\n proxyConfigured: boolean;\n proxyBaseUrl: string;\n}\n\nconst TRANSPORT_FILTERS = ['all', 'http', 'sse', 'stdio'] as const;\n\nexport function McpServersPageClient({ proxyConfigured, proxyBaseUrl }: McpServersPageClientProps) {\n const { t } = useTranslation('web');\n const [searchQuery, setSearchQuery] = useState('');\n const [transportFilter, setTransportFilter] = useState<(typeof TRANSPORT_FILTERS)[number]>('all');\n const [selectedServer, setSelectedServer] = useState<McpServerInfo | null>(null);\n const [servers, setServers] = useState<McpServerInfo[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!proxyConfigured) {\n setLoading(false);\n return;\n }\n fetchMcpServersAction()\n .then((result) => {\n setServers(result.servers);\n if (result.error) setError(result.error);\n })\n .catch(() => {\n setError(t('mcpServers.fetchError'));\n })\n .finally(() => {\n setLoading(false);\n });\n }, [proxyConfigured, t]);\n\n const filtered = useMemo(() => {\n return servers.filter((server) => {\n const query = searchQuery.toLowerCase();\n const matchesQuery =\n !query ||\n server.name.toLowerCase().includes(query) ||\n (server.mcp_info?.description ?? '').toLowerCase().includes(query);\n\n const matchesTransport = transportFilter === 'all' || server.transport === transportFilter;\n\n return matchesQuery && matchesTransport;\n });\n }, [servers, searchQuery, transportFilter]);\n\n if (!proxyConfigured) {\n return (\n <div className=\"flex flex-col gap-8 p-8\">\n <PageHeader\n eyebrow=\"Developer Portal\"\n title={t('mcpServers.title')}\n description={t('mcpServers.subtitle')}\n />\n <EmptyState icon={<AlertCircle className=\"size-10\" />} title={t('mcpServers.noProxy')} />\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"flex flex-col gap-8 p-8\">\n <PageHeader\n eyebrow=\"Developer Portal\"\n title={t('mcpServers.title')}\n description={t('mcpServers.subtitle')}\n />\n <div className=\"text-muted-foreground text-center text-sm\">\n {t('accessibility.loading')}...\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-8 p-8\">\n <PageHeader\n eyebrow=\"Developer Portal\"\n title={t('mcpServers.title')}\n description={t('mcpServers.subtitle')}\n />\n\n {error ? (\n <div\n role=\"alert\"\n className=\"border-destructive/40 bg-destructive/10 editorial-shadow flex items-center gap-2 rounded-xl border px-4 py-3\"\n >\n <AlertCircle className=\"text-destructive size-4 shrink-0\" />\n <p className=\"text-destructive text-sm font-medium\">{error}</p>\n </div>\n ) : null}\n\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n <Input\n placeholder={t('mcpServers.searchPlaceholder')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-9\"\n data-testid=\"mcp-servers-search\"\n />\n </div>\n\n {/* Transport filter */}\n <div className=\"flex flex-wrap gap-2\">\n {TRANSPORT_FILTERS.map((filter) => (\n <Button\n key={filter}\n variant={transportFilter === filter ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setTransportFilter(filter)}\n data-testid={`mcp-servers-filter-${filter}`}\n >\n {filter === 'all'\n ? t('mcpServers.filter.all')\n : t(`mcpServers.transport.${filter}`, filter.toUpperCase())}\n </Button>\n ))}\n </div>\n\n {filtered.length === 0 ? (\n <EmptyState\n icon={\n servers.length === 0 ? <Server className=\"size-10\" /> : <Search className=\"size-10\" />\n }\n title={servers.length === 0 ? t('mcpServers.noServers') : t('mcpServers.noResults')}\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((server) => (\n <McpServerCard key={server.server_id} server={server} onSelect={setSelectedServer} />\n ))}\n </div>\n )}\n\n <McpServerDetailDrawer\n server={selectedServer}\n proxyBaseUrl={proxyBaseUrl}\n open={!!selectedServer}\n onClose={() => setSelectedServer(null)}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useState, type ComponentType } from 'react';\nimport { Server, Wifi, Terminal } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport {\n MicrosoftIcon,\n MicrosoftLearnIcon,\n AzureIcon,\n FirecrawlIcon,\n DeepWikiIcon,\n AwsIcon,\n} from './vendor-brand-icons';\n\ninterface McpServerIconProps {\n serverName: string;\n url?: string;\n transport: string;\n className?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\ntype BrandIconComponent = ComponentType<{ className?: string; size?: number }>;\n\ninterface VendorMapping {\n /** Regex pattern matched against lowercased `server_name + \" \" + url`. */\n match: RegExp;\n /** SimpleIcons slug (for brands that exist on cdn.simpleicons.org). */\n simpleIconSlug?: string;\n /** Inline brand component (for brands SimpleIcons doesn't serve). */\n inlineIcon?: BrandIconComponent;\n}\n\n/**\n * Vendor icon resolution map.\n *\n * Priority rules:\n * 1. More-specific patterns FIRST (e.g. `microsoft_learn` before `microsoft`,\n * `github_copilot` before plain `github`).\n * 2. Inline SVG brand icons take priority over SimpleIcons when both are\n * available — inline icons are guaranteed to render and have no CDN\n * dependency.\n * 3. Verified slugs only. Every SimpleIcons slug in this file must return\n * HTTP 200 from https://cdn.simpleicons.org/{slug} as of the last audit.\n *\n * When no vendor matches, the `McpServerIcon` component falls back to the\n * transport-type Lucide icon (Server/Wifi/Terminal).\n *\n * Exported `resolveVendorMapping` is the source of truth for tests.\n */\nconst VENDOR_MAP: VendorMapping[] = [\n // Microsoft (SimpleIcons removed all MS icons for legal reasons — use inline)\n { match: /microsoft[_-]?learn|learn\\.microsoft/, inlineIcon: MicrosoftLearnIcon },\n { match: /foundry|ai\\.azure|azure[_-]?foundry|bedrock[_-]?agentcore/, inlineIcon: AzureIcon },\n { match: /\\bazure\\b/, inlineIcon: AzureIcon },\n { match: /microsoft|\\.microsoft\\./, inlineIcon: MicrosoftIcon },\n\n // GitHub / Copilot (SimpleIcons has these)\n { match: /github[_-]?copilot|\\bcopilot\\b/, simpleIconSlug: 'githubcopilot' },\n { match: /github|api\\.github/, simpleIconSlug: 'github' },\n { match: /gitlab/, simpleIconSlug: 'gitlab' },\n { match: /bitbucket/, simpleIconSlug: 'bitbucket' },\n\n // AI / LLM vendors\n { match: /anthropic|\\bclaude\\b/, simpleIconSlug: 'anthropic' },\n { match: /gemini|google[_-]?ai/, simpleIconSlug: 'googlegemini' },\n { match: /perplexity/, simpleIconSlug: 'perplexity' },\n\n // Documentation / knowledge (DeepWiki gets its own distinct mark)\n { match: /deepwiki|deep[_-]?wiki/, inlineIcon: DeepWikiIcon },\n { match: /notion/, simpleIconSlug: 'notion' },\n { match: /confluence/, simpleIconSlug: 'confluence' },\n { match: /readthedocs/, simpleIconSlug: 'readthedocs' },\n { match: /mintlify/, simpleIconSlug: 'mintlify' },\n\n // Web scraping / crawling (inline for Firecrawl — no SimpleIcons)\n { match: /firecrawl/, inlineIcon: FirecrawlIcon },\n\n // Cloud / infra\n { match: /\\baws\\b|amazon[_-]?web|bedrock/, inlineIcon: AwsIcon },\n { match: /cloudflare/, simpleIconSlug: 'cloudflare' },\n { match: /vercel/, simpleIconSlug: 'vercel' },\n { match: /netlify/, simpleIconSlug: 'netlify' },\n { match: /digitalocean/, simpleIconSlug: 'digitalocean' },\n { match: /railway/, simpleIconSlug: 'railway' },\n\n // Databases\n { match: /postgres/, simpleIconSlug: 'postgresql' },\n { match: /mongodb/, simpleIconSlug: 'mongodb' },\n { match: /\\bredis\\b/, simpleIconSlug: 'redis' },\n { match: /mysql/, simpleIconSlug: 'mysql' },\n { match: /sqlite/, simpleIconSlug: 'sqlite' },\n { match: /supabase/, simpleIconSlug: 'supabase' },\n { match: /planetscale/, simpleIconSlug: 'planetscale' },\n\n // Productivity / collaboration\n { match: /slack/, simpleIconSlug: 'slack' },\n { match: /discord/, simpleIconSlug: 'discord' },\n { match: /linear/, simpleIconSlug: 'linear' },\n { match: /jira|atlassian/, simpleIconSlug: 'jira' },\n { match: /asana/, simpleIconSlug: 'asana' },\n { match: /zapier/, simpleIconSlug: 'zapier' },\n\n // Observability\n { match: /datadog/, simpleIconSlug: 'datadog' },\n { match: /sentry/, simpleIconSlug: 'sentry' },\n { match: /grafana/, simpleIconSlug: 'grafana' },\n { match: /newrelic/, simpleIconSlug: 'newrelic' },\n\n // Payments / commerce\n { match: /stripe/, simpleIconSlug: 'stripe' },\n { match: /shopify/, simpleIconSlug: 'shopify' },\n];\n\nexport type VendorResolution =\n | { kind: 'inline'; component: BrandIconComponent }\n | { kind: 'simpleicons'; slug: string }\n | { kind: 'none' };\n\n/**\n * Resolve a vendor icon for an MCP server by matching name and URL against\n * the VENDOR_MAP patterns. Returns an inline component, a SimpleIcons slug,\n * or 'none' (caller falls back to transport icon).\n *\n * Exported for unit testing.\n */\nexport function resolveVendorMapping(serverName: string, url?: string): VendorResolution {\n const haystack = `${serverName} ${url ?? ''}`.toLowerCase();\n for (const entry of VENDOR_MAP) {\n if (entry.match.test(haystack)) {\n if (entry.inlineIcon) return { kind: 'inline', component: entry.inlineIcon };\n if (entry.simpleIconSlug) return { kind: 'simpleicons', slug: entry.simpleIconSlug };\n }\n }\n return { kind: 'none' };\n}\n\nconst TRANSPORT_FALLBACKS: Record<string, LucideIcon> = {\n http: Server,\n sse: Wifi,\n stdio: Terminal,\n};\n\nconst SIZE_CLASSES: Record<NonNullable<McpServerIconProps['size']>, string> = {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n};\n\nconst SIZE_PIXELS: Record<NonNullable<McpServerIconProps['size']>, number> = {\n sm: 16,\n md: 20,\n lg: 24,\n};\n\n/**\n * Renders an MCP server's brand icon when recognizable, falling back to the\n * transport-type icon otherwise.\n *\n * Resolution order:\n * 1. Inline brand SVG (Microsoft, Azure, DeepWiki, Firecrawl, AWS)\n * 2. SimpleIcons CDN image (GitHub, Stripe, Postgres, etc.)\n * 3. Transport fallback (Server/Wifi/Terminal from lucide-react)\n *\n * For SimpleIcons images, we handle `onError` by swapping to the transport\n * fallback — this protects against SimpleIcons slug changes without breaking\n * the UI.\n */\nexport function McpServerIcon({\n serverName,\n url,\n transport,\n className,\n size = 'sm',\n}: McpServerIconProps) {\n const [imageFailed, setImageFailed] = useState(false);\n const resolution = resolveVendorMapping(serverName, url);\n const FallbackIcon = TRANSPORT_FALLBACKS[transport] ?? Server;\n const sizeClass = SIZE_CLASSES[size];\n const sizePx = SIZE_PIXELS[size];\n\n if (resolution.kind === 'inline') {\n const Brand = resolution.component;\n return <Brand className={`${sizeClass} shrink-0 ${className ?? ''}`} size={sizePx} />;\n }\n\n if (resolution.kind === 'simpleicons' && !imageFailed) {\n return (\n /* eslint-disable-next-line @next/next/no-img-element */\n <img\n src={`https://cdn.simpleicons.org/${resolution.slug}`}\n alt=\"\"\n width={sizePx}\n height={sizePx}\n className={`${sizeClass} shrink-0 ${className ?? ''}`}\n onError={() => setImageFailed(true)}\n />\n );\n }\n\n return (\n <FallbackIcon className={`text-muted-foreground ${sizeClass} shrink-0 ${className ?? ''}`} />\n );\n}\n","'use client';\n\nimport { useTranslation } from 'react-i18next';\nimport { Card } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport { McpServerIcon } from './mcp-server-icon';\nimport type { McpServerInfo } from '@shipit-ai/core/application/ports/output/services/mcp-server-browser.interface';\n\ninterface McpServerCardProps {\n server: McpServerInfo;\n onSelect: (server: McpServerInfo) => void;\n}\n\nexport function McpServerCard({ server, onSelect }: McpServerCardProps) {\n const { t } = useTranslation('web');\n const description = server.mcp_info?.description ?? '';\n\n return (\n <Card\n className=\"cursor-pointer p-5 transition-all duration-300 hover:scale-[1.02] hover:shadow-md hover:ring-slate-300 dark:hover:ring-slate-600\"\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(server)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(server);\n }\n }}\n data-testid={`mcp-server-card-${server.server_name}`}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex size-11 shrink-0 items-center justify-center rounded-lg bg-slate-100 ring-1 ring-slate-200/50 dark:bg-slate-800 dark:ring-slate-700/50\">\n <McpServerIcon\n serverName={server.server_name}\n url={server.url}\n transport={server.transport}\n size=\"md\"\n />\n </div>\n <h3 className=\"text-foreground mt-2 min-w-0 flex-1 truncate text-sm leading-tight font-bold tracking-tight\">\n {server.name}\n </h3>\n </div>\n\n {description ? (\n <p className=\"text-muted-foreground mt-3 line-clamp-2 text-xs leading-relaxed\">\n {description}\n </p>\n ) : null}\n\n <div className=\"mt-4 flex flex-wrap items-center gap-1.5\">\n <Badge variant=\"outline\">\n {t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase())}\n </Badge>\n {server.auth_type && server.auth_type !== 'none' ? (\n <Badge variant=\"secondary\">\n {t(`mcpServers.authType.${server.auth_type}`, server.auth_type)}\n </Badge>\n ) : null}\n </div>\n </Card>\n );\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '@/components/ui/badge';\nimport type { McpToolInfo } from '@shipit-ai/core/application/ports/output/services/mcp-server-browser.interface';\n\ninterface McpToolListProps {\n tools: McpToolInfo[];\n /**\n * The server name that these tools belong to. Used to strip the\n * `{serverName}-` prefix from tool names for nicer display.\n */\n serverName: string;\n}\n\ninterface DisplayTool {\n displayName: string;\n description?: string;\n key: string;\n}\n\n/**\n * Normalize tools by stripping the `{serverName}-` prefix if present.\n *\n * LiteLLM sometimes prefixes tool names with the server alias (e.g.,\n * `github_mcp-list_issues`). When we're displaying tools for a single\n * known server, the prefix is redundant — strip it for cleaner UI.\n *\n * Exported for unit testing.\n */\nexport function stripServerPrefix(tools: McpToolInfo[], serverName: string): DisplayTool[] {\n const prefix = `${serverName}-`;\n return tools\n .map((tool) => {\n const displayName = tool.name.startsWith(prefix) ? tool.name.slice(prefix.length) : tool.name;\n return {\n displayName,\n description: tool.description,\n key: tool.name,\n };\n })\n .sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\nexport function McpToolList({ tools, serverName }: McpToolListProps) {\n const { t } = useTranslation('web');\n const displayTools = useMemo(() => stripServerPrefix(tools, serverName), [tools, serverName]);\n\n if (tools.length === 0) {\n return <p className=\"text-muted-foreground text-sm\">{t('mcpServers.tools.noTools')}</p>;\n }\n\n return (\n <div className=\"space-y-2\">\n {displayTools.map((tool) => (\n <div key={tool.key} className=\"rounded-md border p-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"font-mono text-xs\">\n {tool.displayName}\n </Badge>\n </div>\n {tool.description ? (\n <p className=\"text-muted-foreground mt-1 text-xs\">{tool.description}</p>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { Check, Copy } from 'lucide-react';\n\ninterface McpConnectInstructionsProps {\n proxyBaseUrl: string;\n serverName: string;\n}\n\ntype ClientId = 'claude-code' | 'cursor' | 'vscode' | 'gemini' | 'codex' | 'curl';\n\ninterface ClientOption {\n id: ClientId;\n label: string;\n}\n\nconst CLIENTS: ClientOption[] = [\n { id: 'claude-code', label: 'Claude Code' },\n { id: 'cursor', label: 'Cursor' },\n { id: 'vscode', label: 'VS Code' },\n { id: 'gemini', label: 'Gemini CLI' },\n { id: 'codex', label: 'Codex CLI' },\n { id: 'curl', label: 'cURL' },\n];\n\n/**\n * Generate copy-pasteable connection snippets for various MCP clients.\n *\n * The LiteLLM proxy exposes each MCP server at {proxyBaseUrl}/{serverName}/mcp\n * and authenticates via the `x-litellm-api-key: Bearer <key>` header.\n *\n * All snippets use `<LITELLM_API_KEY>` as a placeholder that the user must\n * replace with their actual virtual key — we never inline a real key into\n * copyable instructions.\n */\nexport function buildSnippet(clientId: ClientId, proxyBaseUrl: string, serverName: string): string {\n const endpoint = `${proxyBaseUrl.replace(/\\/$/, '')}/${serverName}/mcp`;\n\n switch (clientId) {\n case 'claude-code':\n // Claude Code supports `claude mcp add` command\n return [\n `claude mcp add --transport http ${serverName} \\\\`,\n ` ${endpoint} \\\\`,\n ` --header \"x-litellm-api-key: Bearer <LITELLM_API_KEY>\"`,\n ].join('\\n');\n\n case 'cursor':\n // Cursor: ~/.cursor/mcp.json\n return JSON.stringify(\n {\n mcpServers: {\n [serverName]: {\n url: endpoint,\n headers: {\n 'x-litellm-api-key': 'Bearer <LITELLM_API_KEY>',\n },\n },\n },\n },\n null,\n 2\n );\n\n case 'vscode':\n // VS Code / Copilot: settings.json under \"mcp\"\n return JSON.stringify(\n {\n mcp: {\n servers: {\n [serverName]: {\n type: 'http',\n url: endpoint,\n headers: {\n 'x-litellm-api-key': 'Bearer <LITELLM_API_KEY>',\n },\n },\n },\n },\n },\n null,\n 2\n );\n\n case 'gemini':\n // Gemini CLI: ~/.gemini/settings.json or project .gemini/settings.json\n return JSON.stringify(\n {\n mcpServers: {\n [serverName]: {\n httpUrl: endpoint,\n headers: {\n 'x-litellm-api-key': 'Bearer <LITELLM_API_KEY>',\n },\n },\n },\n },\n null,\n 2\n );\n\n case 'codex':\n // Codex CLI: ~/.codex/config.toml\n return [\n `[mcp_servers.${serverName}]`,\n `url = \"${endpoint}\"`,\n `headers = { \"x-litellm-api-key\" = \"Bearer <LITELLM_API_KEY>\" }`,\n ].join('\\n');\n\n case 'curl':\n return [\n `curl --location '${endpoint}' \\\\`,\n ` --header 'Content-Type: application/json' \\\\`,\n ` --header 'x-litellm-api-key: Bearer <LITELLM_API_KEY>' \\\\`,\n ` --data '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}'`,\n ].join('\\n');\n }\n}\n\nexport function McpConnectInstructions({ proxyBaseUrl, serverName }: McpConnectInstructionsProps) {\n const { t } = useTranslation('web');\n const [activeClient, setActiveClient] = useState<ClientId>('claude-code');\n const [copied, setCopied] = useState(false);\n\n const snippet = buildSnippet(activeClient, proxyBaseUrl, serverName);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(snippet);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard not available (e.g., insecure context) — silently ignore.\n }\n };\n\n return (\n <div className=\"space-y-3\">\n <div\n className=\"flex flex-wrap gap-1.5 rounded-lg border border-slate-200/60 bg-slate-50/50 p-1 dark:border-slate-700/50 dark:bg-slate-900/40\"\n role=\"tablist\"\n aria-label={t('mcpServers.connect.title')}\n >\n {CLIENTS.map((client) => (\n <button\n key={client.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeClient === client.id}\n onClick={() => setActiveClient(client.id)}\n data-state={activeClient === client.id ? 'active' : 'inactive'}\n className=\"data-[state=active]:bg-card data-[state=active]:text-primary text-muted-foreground hover:text-foreground rounded-md px-2.5 py-1 text-xs font-medium transition-all data-[state=active]:shadow-sm data-[state=active]:ring-1 data-[state=active]:ring-slate-200/70 dark:data-[state=active]:ring-slate-700/50\"\n >\n {client.label}\n </button>\n ))}\n </div>\n\n <div className=\"editorial-shadow group relative overflow-hidden rounded-xl border border-slate-200/60 bg-slate-50/60 dark:border-slate-700/50 dark:bg-slate-900/60\">\n {/* Terminal-style header bar with dots */}\n <div className=\"flex items-center justify-between border-b border-slate-200/60 bg-slate-100/40 px-3 py-2 dark:border-slate-700/50 dark:bg-slate-900/40\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-slate-300 dark:bg-slate-600\" aria-hidden />\n <span className=\"size-2 rounded-full bg-slate-300 dark:bg-slate-600\" aria-hidden />\n <span className=\"size-2 rounded-full bg-slate-300 dark:bg-slate-600\" aria-hidden />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 shrink-0\"\n onClick={handleCopy}\n aria-label={t('mcpServers.connect.copy')}\n >\n {copied ? <Check className=\"text-primary size-3\" /> : <Copy className=\"size-3\" />}\n </Button>\n </div>\n <pre className=\"max-h-64 overflow-auto p-3 font-mono text-[11px] leading-relaxed\">\n <code>{snippet}</code>\n </pre>\n </div>\n\n <p className=\"text-muted-foreground text-xs\">{t('mcpServers.connect.replaceKey')}</p>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b8c8b3465bde89ddd23df1c2c896fe7e43e5ba22\":{\"name\":\"fetchMcpServerToolsAction\"}},\"src/presentation/web/app/actions/fetch-mcp-server-tools.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40b8c8b3465bde89ddd23df1c2c896fe7e43e5ba22\",callServer,void 0,findSourceMapURL,\"fetchMcpServerToolsAction\");export{$$RSC_SERVER_ACTION_0 as fetchMcpServerToolsAction};","'use client';\n\nimport { useEffect, useState, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Separator } from '@/components/ui/separator';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { RefreshCw } from 'lucide-react';\nimport { McpToolList } from './mcp-tool-list';\nimport { McpConnectInstructions } from './mcp-connect-instructions';\nimport { McpServerIcon } from './mcp-server-icon';\nimport { fetchMcpServerToolsAction } from '@/app/actions/fetch-mcp-server-tools';\nimport type {\n McpServerInfo,\n McpToolInfo,\n} from '@shipit-ai/core/application/ports/output/services/mcp-server-browser.interface';\n\ninterface McpServerDetailDrawerProps {\n server: McpServerInfo | null;\n proxyBaseUrl: string;\n open: boolean;\n onClose: () => void;\n}\n\nfunction isValidDisplayUrl(url?: string): boolean {\n if (!url) return false;\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'http:' || parsed.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nexport function McpServerDetailDrawer({\n server,\n proxyBaseUrl,\n open,\n onClose,\n}: McpServerDetailDrawerProps) {\n const { t } = useTranslation('web');\n const [tools, setTools] = useState<McpToolInfo[]>([]);\n const [loadingTools, setLoadingTools] = useState(false);\n const [toolError, setToolError] = useState<string | null>(null);\n const [loadedServerName, setLoadedServerName] = useState<string | null>(null);\n\n const loadTools = useCallback(async (serverName: string) => {\n setLoadingTools(true);\n setToolError(null);\n try {\n const result = await fetchMcpServerToolsAction(serverName);\n setTools(result.tools);\n if (result.error) setToolError(result.error);\n setLoadedServerName(serverName);\n } catch {\n setToolError('Failed to load tools');\n } finally {\n setLoadingTools(false);\n }\n }, []);\n\n useEffect(() => {\n if (!open || !server) return;\n // Re-fetch whenever the drawer opens for a different server.\n if (loadedServerName === server.server_name) return;\n loadTools(server.server_name);\n }, [open, server, loadedServerName, loadTools]);\n\n const handleRefresh = useCallback(() => {\n if (!server) return;\n // Clear the cached server name to force a re-fetch and call loadTools\n // directly for immediate feedback.\n setLoadedServerName(null);\n loadTools(server.server_name);\n }, [server, loadTools]);\n\n if (!server) return null;\n\n const description = server.mcp_info?.description ?? '';\n\n return (\n <BaseDrawer open={open} onClose={onClose} data-testid=\"mcp-server-detail-drawer\">\n <div className=\"flex flex-col gap-6 overflow-y-auto p-6\">\n {/* Header */}\n <div className=\"space-y-2\">\n <span className=\"text-[10px] font-bold tracking-[0.2em] text-slate-400 uppercase\">\n {t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase())} &middot;\n MCP Server\n </span>\n <div className=\"flex items-start gap-3\">\n <div className=\"flex size-12 shrink-0 items-center justify-center rounded-lg bg-slate-100 ring-1 ring-slate-200/50 dark:bg-slate-800 dark:ring-slate-700/50\">\n <McpServerIcon\n serverName={server.server_name}\n url={server.url}\n transport={server.transport}\n size=\"lg\"\n />\n </div>\n <DrawerTitle className=\"text-foreground mt-2 text-lg font-bold tracking-tight\">\n {server.name}\n </DrawerTitle>\n </div>\n {description ? (\n <DrawerDescription className=\"text-muted-foreground text-sm leading-relaxed\">\n {description}\n </DrawerDescription>\n ) : null}\n </div>\n\n <Separator />\n\n {/* Metadata */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">\n {t('mcpServers.detail.serverName')}\n </span>\n <span className=\"font-mono text-xs\">{server.server_name}</span>\n </div>\n\n {isValidDisplayUrl(server.url) ? (\n <div className=\"flex items-center justify-between gap-4\">\n <span className=\"text-muted-foreground shrink-0 text-xs font-medium\">\n {t('mcpServers.detail.url')}\n </span>\n <span className=\"truncate font-mono text-xs\" title={server.url}>\n {server.url}\n </span>\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">\n {t('mcpServers.detail.transport')}\n </span>\n <Badge variant=\"outline\">\n {t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase())}\n </Badge>\n </div>\n\n {server.auth_type && server.auth_type !== 'none' ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">\n {t('mcpServers.detail.authType')}\n </span>\n <Badge variant=\"secondary\">\n {t(`mcpServers.authType.${server.auth_type}`, server.auth_type)}\n </Badge>\n </div>\n ) : null}\n </div>\n\n <Separator />\n\n {/* Tools */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-foreground text-sm font-bold tracking-tight\">\n {t('mcpServers.tools.title')}\n </h3>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={handleRefresh}\n disabled={loadingTools}\n aria-label={t('mcpServers.tools.refresh')}\n data-testid=\"mcp-tools-refresh\"\n >\n <RefreshCw className={`size-3.5 ${loadingTools ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n {loadingTools ? (\n <p className=\"text-muted-foreground text-sm\">{t('accessibility.loading')}...</p>\n ) : toolError ? (\n <p className=\"text-destructive text-sm\">{toolError}</p>\n ) : (\n <McpToolList tools={tools} serverName={server.server_name} />\n )}\n </div>\n\n <Separator />\n\n {/* Connect instructions */}\n <div className=\"space-y-3\">\n <h3 className=\"text-foreground text-sm font-bold tracking-tight\">\n {t('mcpServers.connect.title')}\n </h3>\n <McpConnectInstructions proxyBaseUrl={proxyBaseUrl} serverName={server.server_name} />\n </div>\n </div>\n </BaseDrawer>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"00b4aa2f2237a33bea82972983cf57ee4b3b15b8bc\":{\"name\":\"fetchMcpServersAction\"}},\"src/presentation/web/app/actions/fetch-mcp-servers.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"00b4aa2f2237a33bea82972983cf57ee4b3b15b8bc\",callServer,void 0,findSourceMapURL,\"fetchMcpServersAction\");export{$$RSC_SERVER_ACTION_0 as fetchMcpServersAction};","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 20h.01', key: 'zekei9' }],\n ['path', { d: 'M2 8.82a15 15 0 0 1 20 0', key: 'dnpr2z' }],\n ['path', { d: 'M5 12.859a10 10 0 0 1 14 0', key: '1x1e6c' }],\n ['path', { d: 'M8.5 16.429a5 5 0 0 1 7 0', key: '1bycff' }],\n];\n\n/**\n * @component @name Wifi\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMjBoLjAxIiAvPgogIDxwYXRoIGQ9Ik0yIDguODJhMTUgMTUgMCAwIDEgMjAgMCIgLz4KICA8cGF0aCBkPSJNNSAxMi44NTlhMTAgMTAgMCAwIDEgMTQgMCIgLz4KICA8cGF0aCBkPSJNOC41IDE2LjQyOWE1IDUgMCAwIDEgNyAwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/wifi\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Wifi = createLucideIcon('wifi', __iconNode);\n\nexport default Wifi;\n","/**\n * Inline brand icons for MCP server vendors that SimpleIcons either doesn't\n * serve (Microsoft — removed for legal reasons), hasn't added yet (Firecrawl,\n * DeepWiki), or where we want a project-specific treatment.\n *\n * Using inline SVG instead of remote image URLs because:\n * - No network request, no 404 risk, no CORS\n * - Uses `currentColor` where possible so brand marks adapt to dark mode\n * - All paths are public brand marks simplified to their geometric essentials\n * to avoid trademark ambiguity\n */\n\ninterface BrandIconProps {\n className?: string;\n size?: number;\n}\n\n/** Microsoft four-square window mark (simplified from public brand guidelines). */\nexport function MicrosoftIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <rect x=\"2\" y=\"2\" width=\"9\" height=\"9\" fill=\"#F25022\" />\n <rect x=\"13\" y=\"2\" width=\"9\" height=\"9\" fill=\"#7FBA00\" />\n <rect x=\"2\" y=\"13\" width=\"9\" height=\"9\" fill=\"#00A4EF\" />\n <rect x=\"13\" y=\"13\" width=\"9\" height=\"9\" fill=\"#FFB900\" />\n </svg>\n );\n}\n\n/** Microsoft Learn — book + graduation cap motif. */\nexport function MicrosoftLearnIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 6a1 1 0 0 1 1-1h6a2 2 0 0 1 2 2v13a1 1 0 0 1-1.447.894L6 18.618V7H4a1 1 0 0 1-1-1Z\"\n fill=\"#0078D4\"\n />\n <path\n d=\"M21 6a1 1 0 0 0-1-1h-6a2 2 0 0 0-2 2v13a1 1 0 0 0 1.447.894L18 18.618V7h2a1 1 0 0 0 1-1Z\"\n fill=\"#50E6FF\"\n />\n </svg>\n );\n}\n\n/** Azure / Foundry — stylized mountain triangles mark. */\nexport function AzureIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 4L2 20h7l3-5 3 5h7L12 4Z\" fill=\"#0089D6\" />\n <path d=\"M12 4l-3 5h6l-3-5Z\" fill=\"#54AEF0\" />\n </svg>\n );\n}\n\n/** Firecrawl — flame mark. */\nexport function FirecrawlIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M12 2C12 2 6 8 6 13a6 6 0 0 0 12 0c0-2-1-4-2-5 0 2-1 3-2 3 0-3-2-6-2-9Z\"\n fill=\"#F26B21\"\n />\n <path d=\"M12 11c0 2-1.5 3-1.5 5a1.5 1.5 0 0 0 3 0c0-1.5-1.5-2.5-1.5-5Z\" fill=\"#FFD166\" />\n </svg>\n );\n}\n\n/** DeepWiki — stacked pages with magnifying lens motif. */\nexport function DeepWikiIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <rect x=\"4\" y=\"3\" width=\"13\" height=\"16\" rx=\"1.5\" fill=\"#6366F1\" />\n <rect x=\"7\" y=\"6\" width=\"7\" height=\"1.5\" rx=\"0.5\" fill=\"#E0E7FF\" />\n <rect x=\"7\" y=\"9\" width=\"7\" height=\"1.5\" rx=\"0.5\" fill=\"#E0E7FF\" />\n <rect x=\"7\" y=\"12\" width=\"4\" height=\"1.5\" rx=\"0.5\" fill=\"#E0E7FF\" />\n <circle cx=\"17\" cy=\"17\" r=\"4\" fill=\"none\" stroke=\"#F59E0B\" strokeWidth=\"2\" />\n <line\n x1=\"20\"\n y1=\"20\"\n x2=\"22\"\n y2=\"22\"\n stroke=\"#F59E0B\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/** AWS — orange cube mark. */\nexport function AwsIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 14.5c0 1 .5 1.8 1.3 2.2L12 19l4.7-2.3c.8-.4 1.3-1.2 1.3-2.2v-5c0-1-.5-1.8-1.3-2.2L12 5 7.3 7.3C6.5 7.7 6 8.5 6 9.5v5Z\"\n fill=\"#FF9900\"\n />\n <path d=\"M12 5v14M6 9.5l6 3 6-3\" stroke=\"#232F3E\" strokeWidth=\"1.2\" fill=\"none\" />\n </svg>\n );\n}\n"],"names":["d","key"],"mappings":"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","ignoreList":[8]}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.tsx","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-icon.tsx","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-card.tsx","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-tool-list.tsx","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.tsx","../../../../../../../src/presentation/web/app/actions/data%3A9b1c03%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.tsx","../../../../../../../src/presentation/web/app/actions/data%3A3ac19d%20%3Ctext/javascript%3E","../../../../../../../node_modules/.pnpm/lucide-react%401.7.0_react%4019.2.4/node_modules/lucide-react/src/icons/wifi.ts","../../../../../../../src/presentation/web/components/features/mcp-servers/vendor-brand-icons.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle, Search, Server } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { EmptyState } from '@/components/common/empty-state';\nimport { PageHeader } from '@/components/common/page-header';\nimport { McpServerCard } from './mcp-server-card';\nimport { McpServerDetailDrawer } from './mcp-server-detail-drawer';\nimport { fetchMcpServersAction } from '@/app/actions/fetch-mcp-servers';\nimport type { McpServerInfo } from '@shipit-ai/core/application/ports/output/services/mcp-server-browser.interface';\n\ninterface McpServersPageClientProps {\n proxyConfigured: boolean;\n proxyBaseUrl: string;\n}\n\nconst TRANSPORT_FILTERS = ['all', 'http', 'sse', 'stdio'] as const;\n\nexport function McpServersPageClient({ proxyConfigured, proxyBaseUrl }: McpServersPageClientProps) {\n const { t } = useTranslation('web');\n const [searchQuery, setSearchQuery] = useState('');\n const [transportFilter, setTransportFilter] = useState<(typeof TRANSPORT_FILTERS)[number]>('all');\n const [selectedServer, setSelectedServer] = useState<McpServerInfo | null>(null);\n const [servers, setServers] = useState<McpServerInfo[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!proxyConfigured) {\n setLoading(false);\n return;\n }\n fetchMcpServersAction()\n .then((result) => {\n setServers(result.servers);\n if (result.error) setError(result.error);\n })\n .catch(() => {\n setError(t('mcpServers.fetchError'));\n })\n .finally(() => {\n setLoading(false);\n });\n }, [proxyConfigured, t]);\n\n const filtered = useMemo(() => {\n return servers.filter((server) => {\n const query = searchQuery.toLowerCase();\n const matchesQuery =\n !query ||\n server.name.toLowerCase().includes(query) ||\n (server.mcp_info?.description ?? '').toLowerCase().includes(query);\n\n const matchesTransport = transportFilter === 'all' || server.transport === transportFilter;\n\n return matchesQuery && matchesTransport;\n });\n }, [servers, searchQuery, transportFilter]);\n\n if (!proxyConfigured) {\n return (\n <div className=\"flex flex-col gap-8 p-8\">\n <PageHeader\n eyebrow=\"Developer Portal\"\n title={t('mcpServers.title')}\n description={t('mcpServers.subtitle')}\n />\n <EmptyState icon={<AlertCircle className=\"size-10\" />} title={t('mcpServers.noProxy')} />\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"flex flex-col gap-8 p-8\">\n <PageHeader\n eyebrow=\"Developer Portal\"\n title={t('mcpServers.title')}\n description={t('mcpServers.subtitle')}\n />\n <div className=\"text-muted-foreground text-center text-sm\">\n {t('accessibility.loading')}...\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-8 p-8\">\n <PageHeader\n eyebrow=\"Developer Portal\"\n title={t('mcpServers.title')}\n description={t('mcpServers.subtitle')}\n />\n\n {error ? (\n <div\n role=\"alert\"\n className=\"border-destructive/40 bg-destructive/10 editorial-shadow flex items-center gap-2 rounded-xl border px-4 py-3\"\n >\n <AlertCircle className=\"text-destructive size-4 shrink-0\" />\n <p className=\"text-destructive text-sm font-medium\">{error}</p>\n </div>\n ) : null}\n\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n <Input\n placeholder={t('mcpServers.searchPlaceholder')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-9\"\n data-testid=\"mcp-servers-search\"\n />\n </div>\n\n {/* Transport filter */}\n <div className=\"flex flex-wrap gap-2\">\n {TRANSPORT_FILTERS.map((filter) => (\n <Button\n key={filter}\n variant={transportFilter === filter ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setTransportFilter(filter)}\n data-testid={`mcp-servers-filter-${filter}`}\n >\n {filter === 'all'\n ? t('mcpServers.filter.all')\n : t(`mcpServers.transport.${filter}`, filter.toUpperCase())}\n </Button>\n ))}\n </div>\n\n {filtered.length === 0 ? (\n <EmptyState\n icon={\n servers.length === 0 ? <Server className=\"size-10\" /> : <Search className=\"size-10\" />\n }\n title={servers.length === 0 ? t('mcpServers.noServers') : t('mcpServers.noResults')}\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((server) => (\n <McpServerCard key={server.server_id} server={server} onSelect={setSelectedServer} />\n ))}\n </div>\n )}\n\n <McpServerDetailDrawer\n server={selectedServer}\n proxyBaseUrl={proxyBaseUrl}\n open={!!selectedServer}\n onClose={() => setSelectedServer(null)}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useState, type ComponentType } from 'react';\nimport { Server, Wifi, Terminal } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport {\n MicrosoftIcon,\n MicrosoftLearnIcon,\n AzureIcon,\n FirecrawlIcon,\n DeepWikiIcon,\n AwsIcon,\n} from './vendor-brand-icons';\n\ninterface McpServerIconProps {\n serverName: string;\n url?: string;\n transport: string;\n className?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\ntype BrandIconComponent = ComponentType<{ className?: string; size?: number }>;\n\ninterface VendorMapping {\n /** Regex pattern matched against lowercased `server_name + \" \" + url`. */\n match: RegExp;\n /** SimpleIcons slug (for brands that exist on cdn.simpleicons.org). */\n simpleIconSlug?: string;\n /** Inline brand component (for brands SimpleIcons doesn't serve). */\n inlineIcon?: BrandIconComponent;\n}\n\n/**\n * Vendor icon resolution map.\n *\n * Priority rules:\n * 1. More-specific patterns FIRST (e.g. `microsoft_learn` before `microsoft`,\n * `github_copilot` before plain `github`).\n * 2. Inline SVG brand icons take priority over SimpleIcons when both are\n * available — inline icons are guaranteed to render and have no CDN\n * dependency.\n * 3. Verified slugs only. Every SimpleIcons slug in this file must return\n * HTTP 200 from https://cdn.simpleicons.org/{slug} as of the last audit.\n *\n * When no vendor matches, the `McpServerIcon` component falls back to the\n * transport-type Lucide icon (Server/Wifi/Terminal).\n *\n * Exported `resolveVendorMapping` is the source of truth for tests.\n */\nconst VENDOR_MAP: VendorMapping[] = [\n // Microsoft (SimpleIcons removed all MS icons for legal reasons — use inline)\n { match: /microsoft[_-]?learn|learn\\.microsoft/, inlineIcon: MicrosoftLearnIcon },\n { match: /foundry|ai\\.azure|azure[_-]?foundry|bedrock[_-]?agentcore/, inlineIcon: AzureIcon },\n { match: /\\bazure\\b/, inlineIcon: AzureIcon },\n { match: /microsoft|\\.microsoft\\./, inlineIcon: MicrosoftIcon },\n\n // GitHub / Copilot (SimpleIcons has these)\n { match: /github[_-]?copilot|\\bcopilot\\b/, simpleIconSlug: 'githubcopilot' },\n { match: /github|api\\.github/, simpleIconSlug: 'github' },\n { match: /gitlab/, simpleIconSlug: 'gitlab' },\n { match: /bitbucket/, simpleIconSlug: 'bitbucket' },\n\n // AI / LLM vendors\n { match: /anthropic|\\bclaude\\b/, simpleIconSlug: 'anthropic' },\n { match: /gemini|google[_-]?ai/, simpleIconSlug: 'googlegemini' },\n { match: /perplexity/, simpleIconSlug: 'perplexity' },\n\n // Documentation / knowledge (DeepWiki gets its own distinct mark)\n { match: /deepwiki|deep[_-]?wiki/, inlineIcon: DeepWikiIcon },\n { match: /notion/, simpleIconSlug: 'notion' },\n { match: /confluence/, simpleIconSlug: 'confluence' },\n { match: /readthedocs/, simpleIconSlug: 'readthedocs' },\n { match: /mintlify/, simpleIconSlug: 'mintlify' },\n\n // Web scraping / crawling (inline for Firecrawl — no SimpleIcons)\n { match: /firecrawl/, inlineIcon: FirecrawlIcon },\n\n // Cloud / infra\n { match: /\\baws\\b|amazon[_-]?web|bedrock/, inlineIcon: AwsIcon },\n { match: /cloudflare/, simpleIconSlug: 'cloudflare' },\n { match: /vercel/, simpleIconSlug: 'vercel' },\n { match: /netlify/, simpleIconSlug: 'netlify' },\n { match: /digitalocean/, simpleIconSlug: 'digitalocean' },\n { match: /railway/, simpleIconSlug: 'railway' },\n\n // Databases\n { match: /postgres/, simpleIconSlug: 'postgresql' },\n { match: /mongodb/, simpleIconSlug: 'mongodb' },\n { match: /\\bredis\\b/, simpleIconSlug: 'redis' },\n { match: /mysql/, simpleIconSlug: 'mysql' },\n { match: /sqlite/, simpleIconSlug: 'sqlite' },\n { match: /supabase/, simpleIconSlug: 'supabase' },\n { match: /planetscale/, simpleIconSlug: 'planetscale' },\n\n // Productivity / collaboration\n { match: /slack/, simpleIconSlug: 'slack' },\n { match: /discord/, simpleIconSlug: 'discord' },\n { match: /linear/, simpleIconSlug: 'linear' },\n { match: /jira|atlassian/, simpleIconSlug: 'jira' },\n { match: /asana/, simpleIconSlug: 'asana' },\n { match: /zapier/, simpleIconSlug: 'zapier' },\n\n // Observability\n { match: /datadog/, simpleIconSlug: 'datadog' },\n { match: /sentry/, simpleIconSlug: 'sentry' },\n { match: /grafana/, simpleIconSlug: 'grafana' },\n { match: /newrelic/, simpleIconSlug: 'newrelic' },\n\n // Payments / commerce\n { match: /stripe/, simpleIconSlug: 'stripe' },\n { match: /shopify/, simpleIconSlug: 'shopify' },\n];\n\nexport type VendorResolution =\n | { kind: 'inline'; component: BrandIconComponent }\n | { kind: 'simpleicons'; slug: string }\n | { kind: 'none' };\n\n/**\n * Resolve a vendor icon for an MCP server by matching name and URL against\n * the VENDOR_MAP patterns. Returns an inline component, a SimpleIcons slug,\n * or 'none' (caller falls back to transport icon).\n *\n * Exported for unit testing.\n */\nexport function resolveVendorMapping(serverName: string, url?: string): VendorResolution {\n const haystack = `${serverName} ${url ?? ''}`.toLowerCase();\n for (const entry of VENDOR_MAP) {\n if (entry.match.test(haystack)) {\n if (entry.inlineIcon) return { kind: 'inline', component: entry.inlineIcon };\n if (entry.simpleIconSlug) return { kind: 'simpleicons', slug: entry.simpleIconSlug };\n }\n }\n return { kind: 'none' };\n}\n\nconst TRANSPORT_FALLBACKS: Record<string, LucideIcon> = {\n http: Server,\n sse: Wifi,\n stdio: Terminal,\n};\n\nconst SIZE_CLASSES: Record<NonNullable<McpServerIconProps['size']>, string> = {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n};\n\nconst SIZE_PIXELS: Record<NonNullable<McpServerIconProps['size']>, number> = {\n sm: 16,\n md: 20,\n lg: 24,\n};\n\n/**\n * Renders an MCP server's brand icon when recognizable, falling back to the\n * transport-type icon otherwise.\n *\n * Resolution order:\n * 1. Inline brand SVG (Microsoft, Azure, DeepWiki, Firecrawl, AWS)\n * 2. SimpleIcons CDN image (GitHub, Stripe, Postgres, etc.)\n * 3. Transport fallback (Server/Wifi/Terminal from lucide-react)\n *\n * For SimpleIcons images, we handle `onError` by swapping to the transport\n * fallback — this protects against SimpleIcons slug changes without breaking\n * the UI.\n */\nexport function McpServerIcon({\n serverName,\n url,\n transport,\n className,\n size = 'sm',\n}: McpServerIconProps) {\n const [imageFailed, setImageFailed] = useState(false);\n const resolution = resolveVendorMapping(serverName, url);\n const FallbackIcon = TRANSPORT_FALLBACKS[transport] ?? Server;\n const sizeClass = SIZE_CLASSES[size];\n const sizePx = SIZE_PIXELS[size];\n\n if (resolution.kind === 'inline') {\n const Brand = resolution.component;\n return <Brand className={`${sizeClass} shrink-0 ${className ?? ''}`} size={sizePx} />;\n }\n\n if (resolution.kind === 'simpleicons' && !imageFailed) {\n return (\n /* eslint-disable-next-line @next/next/no-img-element */\n <img\n src={`https://cdn.simpleicons.org/${resolution.slug}`}\n alt=\"\"\n width={sizePx}\n height={sizePx}\n className={`${sizeClass} shrink-0 ${className ?? ''}`}\n onError={() => setImageFailed(true)}\n />\n );\n }\n\n return (\n <FallbackIcon className={`text-muted-foreground ${sizeClass} shrink-0 ${className ?? ''}`} />\n );\n}\n","'use client';\n\nimport { useTranslation } from 'react-i18next';\nimport { Card } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport { McpServerIcon } from './mcp-server-icon';\nimport type { McpServerInfo } from '@shipit-ai/core/application/ports/output/services/mcp-server-browser.interface';\n\ninterface McpServerCardProps {\n server: McpServerInfo;\n onSelect: (server: McpServerInfo) => void;\n}\n\nexport function McpServerCard({ server, onSelect }: McpServerCardProps) {\n const { t } = useTranslation('web');\n const description = server.mcp_info?.description ?? '';\n\n return (\n <Card\n className=\"cursor-pointer p-5 transition-all duration-300 hover:scale-[1.02] hover:shadow-md hover:ring-slate-300 dark:hover:ring-slate-600\"\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(server)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(server);\n }\n }}\n data-testid={`mcp-server-card-${server.server_name}`}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex size-11 shrink-0 items-center justify-center rounded-lg bg-slate-100 ring-1 ring-slate-200/50 dark:bg-slate-800 dark:ring-slate-700/50\">\n <McpServerIcon\n serverName={server.server_name}\n url={server.url}\n transport={server.transport}\n size=\"md\"\n />\n </div>\n <h3 className=\"text-foreground mt-2 min-w-0 flex-1 truncate text-sm leading-tight font-bold tracking-tight\">\n {server.name}\n </h3>\n </div>\n\n {description ? (\n <p className=\"text-muted-foreground mt-3 line-clamp-2 text-xs leading-relaxed\">\n {description}\n </p>\n ) : null}\n\n <div className=\"mt-4 flex flex-wrap items-center gap-1.5\">\n <Badge variant=\"outline\">\n {t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase())}\n </Badge>\n {server.auth_type && server.auth_type !== 'none' ? (\n <Badge variant=\"secondary\">\n {t(`mcpServers.authType.${server.auth_type}`, server.auth_type)}\n </Badge>\n ) : null}\n </div>\n </Card>\n );\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '@/components/ui/badge';\nimport type { McpToolInfo } from '@shipit-ai/core/application/ports/output/services/mcp-server-browser.interface';\n\ninterface McpToolListProps {\n tools: McpToolInfo[];\n /**\n * The server name that these tools belong to. Used to strip the\n * `{serverName}-` prefix from tool names for nicer display.\n */\n serverName: string;\n}\n\ninterface DisplayTool {\n displayName: string;\n description?: string;\n key: string;\n}\n\n/**\n * Normalize tools by stripping the `{serverName}-` prefix if present.\n *\n * LiteLLM sometimes prefixes tool names with the server alias (e.g.,\n * `github_mcp-list_issues`). When we're displaying tools for a single\n * known server, the prefix is redundant — strip it for cleaner UI.\n *\n * Exported for unit testing.\n */\nexport function stripServerPrefix(tools: McpToolInfo[], serverName: string): DisplayTool[] {\n const prefix = `${serverName}-`;\n return tools\n .map((tool) => {\n const displayName = tool.name.startsWith(prefix) ? tool.name.slice(prefix.length) : tool.name;\n return {\n displayName,\n description: tool.description,\n key: tool.name,\n };\n })\n .sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\nexport function McpToolList({ tools, serverName }: McpToolListProps) {\n const { t } = useTranslation('web');\n const displayTools = useMemo(() => stripServerPrefix(tools, serverName), [tools, serverName]);\n\n if (tools.length === 0) {\n return <p className=\"text-muted-foreground text-sm\">{t('mcpServers.tools.noTools')}</p>;\n }\n\n return (\n <div className=\"space-y-2\">\n {displayTools.map((tool) => (\n <div key={tool.key} className=\"rounded-md border p-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"font-mono text-xs\">\n {tool.displayName}\n </Badge>\n </div>\n {tool.description ? (\n <p className=\"text-muted-foreground mt-1 text-xs\">{tool.description}</p>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { Check, Copy } from 'lucide-react';\n\ninterface McpConnectInstructionsProps {\n proxyBaseUrl: string;\n serverName: string;\n}\n\ntype ClientId = 'claude-code' | 'cursor' | 'vscode' | 'gemini' | 'codex' | 'curl';\n\ninterface ClientOption {\n id: ClientId;\n label: string;\n}\n\nconst CLIENTS: ClientOption[] = [\n { id: 'claude-code', label: 'Claude Code' },\n { id: 'cursor', label: 'Cursor' },\n { id: 'vscode', label: 'VS Code' },\n { id: 'gemini', label: 'Gemini CLI' },\n { id: 'codex', label: 'Codex CLI' },\n { id: 'curl', label: 'cURL' },\n];\n\n/**\n * Generate copy-pasteable connection snippets for various MCP clients.\n *\n * The LiteLLM proxy exposes each MCP server at {proxyBaseUrl}/{serverName}/mcp\n * and authenticates via the `x-litellm-api-key: Bearer <key>` header.\n *\n * All snippets use `<LITELLM_API_KEY>` as a placeholder that the user must\n * replace with their actual virtual key — we never inline a real key into\n * copyable instructions.\n */\nexport function buildSnippet(clientId: ClientId, proxyBaseUrl: string, serverName: string): string {\n const endpoint = `${proxyBaseUrl.replace(/\\/$/, '')}/${serverName}/mcp`;\n\n switch (clientId) {\n case 'claude-code':\n // Claude Code supports `claude mcp add` command\n return [\n `claude mcp add --transport http ${serverName} \\\\`,\n ` ${endpoint} \\\\`,\n ` --header \"x-litellm-api-key: Bearer <LITELLM_API_KEY>\"`,\n ].join('\\n');\n\n case 'cursor':\n // Cursor: ~/.cursor/mcp.json\n return JSON.stringify(\n {\n mcpServers: {\n [serverName]: {\n url: endpoint,\n headers: {\n 'x-litellm-api-key': 'Bearer <LITELLM_API_KEY>',\n },\n },\n },\n },\n null,\n 2\n );\n\n case 'vscode':\n // VS Code / Copilot: settings.json under \"mcp\"\n return JSON.stringify(\n {\n mcp: {\n servers: {\n [serverName]: {\n type: 'http',\n url: endpoint,\n headers: {\n 'x-litellm-api-key': 'Bearer <LITELLM_API_KEY>',\n },\n },\n },\n },\n },\n null,\n 2\n );\n\n case 'gemini':\n // Gemini CLI: ~/.gemini/settings.json or project .gemini/settings.json\n return JSON.stringify(\n {\n mcpServers: {\n [serverName]: {\n httpUrl: endpoint,\n headers: {\n 'x-litellm-api-key': 'Bearer <LITELLM_API_KEY>',\n },\n },\n },\n },\n null,\n 2\n );\n\n case 'codex':\n // Codex CLI: ~/.codex/config.toml\n return [\n `[mcp_servers.${serverName}]`,\n `url = \"${endpoint}\"`,\n `headers = { \"x-litellm-api-key\" = \"Bearer <LITELLM_API_KEY>\" }`,\n ].join('\\n');\n\n case 'curl':\n return [\n `curl --location '${endpoint}' \\\\`,\n ` --header 'Content-Type: application/json' \\\\`,\n ` --header 'x-litellm-api-key: Bearer <LITELLM_API_KEY>' \\\\`,\n ` --data '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}'`,\n ].join('\\n');\n }\n}\n\nexport function McpConnectInstructions({ proxyBaseUrl, serverName }: McpConnectInstructionsProps) {\n const { t } = useTranslation('web');\n const [activeClient, setActiveClient] = useState<ClientId>('claude-code');\n const [copied, setCopied] = useState(false);\n\n const snippet = buildSnippet(activeClient, proxyBaseUrl, serverName);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(snippet);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard not available (e.g., insecure context) — silently ignore.\n }\n };\n\n return (\n <div className=\"space-y-3\">\n <div\n className=\"flex flex-wrap gap-1.5 rounded-lg border border-slate-200/60 bg-slate-50/50 p-1 dark:border-slate-700/50 dark:bg-slate-900/40\"\n role=\"tablist\"\n aria-label={t('mcpServers.connect.title')}\n >\n {CLIENTS.map((client) => (\n <button\n key={client.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeClient === client.id}\n onClick={() => setActiveClient(client.id)}\n data-state={activeClient === client.id ? 'active' : 'inactive'}\n className=\"data-[state=active]:bg-card data-[state=active]:text-primary text-muted-foreground hover:text-foreground rounded-md px-2.5 py-1 text-xs font-medium transition-all data-[state=active]:shadow-sm data-[state=active]:ring-1 data-[state=active]:ring-slate-200/70 dark:data-[state=active]:ring-slate-700/50\"\n >\n {client.label}\n </button>\n ))}\n </div>\n\n <div className=\"editorial-shadow group relative overflow-hidden rounded-xl border border-slate-200/60 bg-slate-50/60 dark:border-slate-700/50 dark:bg-slate-900/60\">\n {/* Terminal-style header bar with dots */}\n <div className=\"flex items-center justify-between border-b border-slate-200/60 bg-slate-100/40 px-3 py-2 dark:border-slate-700/50 dark:bg-slate-900/40\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-slate-300 dark:bg-slate-600\" aria-hidden />\n <span className=\"size-2 rounded-full bg-slate-300 dark:bg-slate-600\" aria-hidden />\n <span className=\"size-2 rounded-full bg-slate-300 dark:bg-slate-600\" aria-hidden />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 shrink-0\"\n onClick={handleCopy}\n aria-label={t('mcpServers.connect.copy')}\n >\n {copied ? <Check className=\"text-primary size-3\" /> : <Copy className=\"size-3\" />}\n </Button>\n </div>\n <pre className=\"max-h-64 overflow-auto p-3 font-mono text-[11px] leading-relaxed\">\n <code>{snippet}</code>\n </pre>\n </div>\n\n <p className=\"text-muted-foreground text-xs\">{t('mcpServers.connect.replaceKey')}</p>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40c134ff7e31bf984b616914a63a14d9554944ba95\":{\"name\":\"fetchMcpServerToolsAction\"}},\"src/presentation/web/app/actions/fetch-mcp-server-tools.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40c134ff7e31bf984b616914a63a14d9554944ba95\",callServer,void 0,findSourceMapURL,\"fetchMcpServerToolsAction\");export{$$RSC_SERVER_ACTION_0 as fetchMcpServerToolsAction};","'use client';\n\nimport { useEffect, useState, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Separator } from '@/components/ui/separator';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { RefreshCw } from 'lucide-react';\nimport { McpToolList } from './mcp-tool-list';\nimport { McpConnectInstructions } from './mcp-connect-instructions';\nimport { McpServerIcon } from './mcp-server-icon';\nimport { fetchMcpServerToolsAction } from '@/app/actions/fetch-mcp-server-tools';\nimport type {\n McpServerInfo,\n McpToolInfo,\n} from '@shipit-ai/core/application/ports/output/services/mcp-server-browser.interface';\n\ninterface McpServerDetailDrawerProps {\n server: McpServerInfo | null;\n proxyBaseUrl: string;\n open: boolean;\n onClose: () => void;\n}\n\nfunction isValidDisplayUrl(url?: string): boolean {\n if (!url) return false;\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'http:' || parsed.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nexport function McpServerDetailDrawer({\n server,\n proxyBaseUrl,\n open,\n onClose,\n}: McpServerDetailDrawerProps) {\n const { t } = useTranslation('web');\n const [tools, setTools] = useState<McpToolInfo[]>([]);\n const [loadingTools, setLoadingTools] = useState(false);\n const [toolError, setToolError] = useState<string | null>(null);\n const [loadedServerName, setLoadedServerName] = useState<string | null>(null);\n\n const loadTools = useCallback(async (serverName: string) => {\n setLoadingTools(true);\n setToolError(null);\n try {\n const result = await fetchMcpServerToolsAction(serverName);\n setTools(result.tools);\n if (result.error) setToolError(result.error);\n setLoadedServerName(serverName);\n } catch {\n setToolError('Failed to load tools');\n } finally {\n setLoadingTools(false);\n }\n }, []);\n\n useEffect(() => {\n if (!open || !server) return;\n // Re-fetch whenever the drawer opens for a different server.\n if (loadedServerName === server.server_name) return;\n loadTools(server.server_name);\n }, [open, server, loadedServerName, loadTools]);\n\n const handleRefresh = useCallback(() => {\n if (!server) return;\n // Clear the cached server name to force a re-fetch and call loadTools\n // directly for immediate feedback.\n setLoadedServerName(null);\n loadTools(server.server_name);\n }, [server, loadTools]);\n\n if (!server) return null;\n\n const description = server.mcp_info?.description ?? '';\n\n return (\n <BaseDrawer open={open} onClose={onClose} data-testid=\"mcp-server-detail-drawer\">\n <div className=\"flex flex-col gap-6 overflow-y-auto p-6\">\n {/* Header */}\n <div className=\"space-y-2\">\n <span className=\"text-[10px] font-bold tracking-[0.2em] text-slate-400 uppercase\">\n {t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase())} &middot;\n MCP Server\n </span>\n <div className=\"flex items-start gap-3\">\n <div className=\"flex size-12 shrink-0 items-center justify-center rounded-lg bg-slate-100 ring-1 ring-slate-200/50 dark:bg-slate-800 dark:ring-slate-700/50\">\n <McpServerIcon\n serverName={server.server_name}\n url={server.url}\n transport={server.transport}\n size=\"lg\"\n />\n </div>\n <DrawerTitle className=\"text-foreground mt-2 text-lg font-bold tracking-tight\">\n {server.name}\n </DrawerTitle>\n </div>\n {description ? (\n <DrawerDescription className=\"text-muted-foreground text-sm leading-relaxed\">\n {description}\n </DrawerDescription>\n ) : null}\n </div>\n\n <Separator />\n\n {/* Metadata */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">\n {t('mcpServers.detail.serverName')}\n </span>\n <span className=\"font-mono text-xs\">{server.server_name}</span>\n </div>\n\n {isValidDisplayUrl(server.url) ? (\n <div className=\"flex items-center justify-between gap-4\">\n <span className=\"text-muted-foreground shrink-0 text-xs font-medium\">\n {t('mcpServers.detail.url')}\n </span>\n <span className=\"truncate font-mono text-xs\" title={server.url}>\n {server.url}\n </span>\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">\n {t('mcpServers.detail.transport')}\n </span>\n <Badge variant=\"outline\">\n {t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase())}\n </Badge>\n </div>\n\n {server.auth_type && server.auth_type !== 'none' ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">\n {t('mcpServers.detail.authType')}\n </span>\n <Badge variant=\"secondary\">\n {t(`mcpServers.authType.${server.auth_type}`, server.auth_type)}\n </Badge>\n </div>\n ) : null}\n </div>\n\n <Separator />\n\n {/* Tools */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-foreground text-sm font-bold tracking-tight\">\n {t('mcpServers.tools.title')}\n </h3>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={handleRefresh}\n disabled={loadingTools}\n aria-label={t('mcpServers.tools.refresh')}\n data-testid=\"mcp-tools-refresh\"\n >\n <RefreshCw className={`size-3.5 ${loadingTools ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n {loadingTools ? (\n <p className=\"text-muted-foreground text-sm\">{t('accessibility.loading')}...</p>\n ) : toolError ? (\n <p className=\"text-destructive text-sm\">{toolError}</p>\n ) : (\n <McpToolList tools={tools} serverName={server.server_name} />\n )}\n </div>\n\n <Separator />\n\n {/* Connect instructions */}\n <div className=\"space-y-3\">\n <h3 className=\"text-foreground text-sm font-bold tracking-tight\">\n {t('mcpServers.connect.title')}\n </h3>\n <McpConnectInstructions proxyBaseUrl={proxyBaseUrl} serverName={server.server_name} />\n </div>\n </div>\n </BaseDrawer>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"00d2029cb61611e627613ff7b9590e065339029832\":{\"name\":\"fetchMcpServersAction\"}},\"src/presentation/web/app/actions/fetch-mcp-servers.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"00d2029cb61611e627613ff7b9590e065339029832\",callServer,void 0,findSourceMapURL,\"fetchMcpServersAction\");export{$$RSC_SERVER_ACTION_0 as fetchMcpServersAction};","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 20h.01', key: 'zekei9' }],\n ['path', { d: 'M2 8.82a15 15 0 0 1 20 0', key: 'dnpr2z' }],\n ['path', { d: 'M5 12.859a10 10 0 0 1 14 0', key: '1x1e6c' }],\n ['path', { d: 'M8.5 16.429a5 5 0 0 1 7 0', key: '1bycff' }],\n];\n\n/**\n * @component @name Wifi\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMjBoLjAxIiAvPgogIDxwYXRoIGQ9Ik0yIDguODJhMTUgMTUgMCAwIDEgMjAgMCIgLz4KICA8cGF0aCBkPSJNNSAxMi44NTlhMTAgMTAgMCAwIDEgMTQgMCIgLz4KICA8cGF0aCBkPSJNOC41IDE2LjQyOWE1IDUgMCAwIDEgNyAwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/wifi\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Wifi = createLucideIcon('wifi', __iconNode);\n\nexport default Wifi;\n","/**\n * Inline brand icons for MCP server vendors that SimpleIcons either doesn't\n * serve (Microsoft — removed for legal reasons), hasn't added yet (Firecrawl,\n * DeepWiki), or where we want a project-specific treatment.\n *\n * Using inline SVG instead of remote image URLs because:\n * - No network request, no 404 risk, no CORS\n * - Uses `currentColor` where possible so brand marks adapt to dark mode\n * - All paths are public brand marks simplified to their geometric essentials\n * to avoid trademark ambiguity\n */\n\ninterface BrandIconProps {\n className?: string;\n size?: number;\n}\n\n/** Microsoft four-square window mark (simplified from public brand guidelines). */\nexport function MicrosoftIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <rect x=\"2\" y=\"2\" width=\"9\" height=\"9\" fill=\"#F25022\" />\n <rect x=\"13\" y=\"2\" width=\"9\" height=\"9\" fill=\"#7FBA00\" />\n <rect x=\"2\" y=\"13\" width=\"9\" height=\"9\" fill=\"#00A4EF\" />\n <rect x=\"13\" y=\"13\" width=\"9\" height=\"9\" fill=\"#FFB900\" />\n </svg>\n );\n}\n\n/** Microsoft Learn — book + graduation cap motif. */\nexport function MicrosoftLearnIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 6a1 1 0 0 1 1-1h6a2 2 0 0 1 2 2v13a1 1 0 0 1-1.447.894L6 18.618V7H4a1 1 0 0 1-1-1Z\"\n fill=\"#0078D4\"\n />\n <path\n d=\"M21 6a1 1 0 0 0-1-1h-6a2 2 0 0 0-2 2v13a1 1 0 0 0 1.447.894L18 18.618V7h2a1 1 0 0 0 1-1Z\"\n fill=\"#50E6FF\"\n />\n </svg>\n );\n}\n\n/** Azure / Foundry — stylized mountain triangles mark. */\nexport function AzureIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 4L2 20h7l3-5 3 5h7L12 4Z\" fill=\"#0089D6\" />\n <path d=\"M12 4l-3 5h6l-3-5Z\" fill=\"#54AEF0\" />\n </svg>\n );\n}\n\n/** Firecrawl — flame mark. */\nexport function FirecrawlIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M12 2C12 2 6 8 6 13a6 6 0 0 0 12 0c0-2-1-4-2-5 0 2-1 3-2 3 0-3-2-6-2-9Z\"\n fill=\"#F26B21\"\n />\n <path d=\"M12 11c0 2-1.5 3-1.5 5a1.5 1.5 0 0 0 3 0c0-1.5-1.5-2.5-1.5-5Z\" fill=\"#FFD166\" />\n </svg>\n );\n}\n\n/** DeepWiki — stacked pages with magnifying lens motif. */\nexport function DeepWikiIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <rect x=\"4\" y=\"3\" width=\"13\" height=\"16\" rx=\"1.5\" fill=\"#6366F1\" />\n <rect x=\"7\" y=\"6\" width=\"7\" height=\"1.5\" rx=\"0.5\" fill=\"#E0E7FF\" />\n <rect x=\"7\" y=\"9\" width=\"7\" height=\"1.5\" rx=\"0.5\" fill=\"#E0E7FF\" />\n <rect x=\"7\" y=\"12\" width=\"4\" height=\"1.5\" rx=\"0.5\" fill=\"#E0E7FF\" />\n <circle cx=\"17\" cy=\"17\" r=\"4\" fill=\"none\" stroke=\"#F59E0B\" strokeWidth=\"2\" />\n <line\n x1=\"20\"\n y1=\"20\"\n x2=\"22\"\n y2=\"22\"\n stroke=\"#F59E0B\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/** AWS — orange cube mark. */\nexport function AwsIcon({ className, size = 20 }: BrandIconProps) {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 14.5c0 1 .5 1.8 1.3 2.2L12 19l4.7-2.3c.8-.4 1.3-1.2 1.3-2.2v-5c0-1-.5-1.8-1.3-2.2L12 5 7.3 7.3C6.5 7.7 6 8.5 6 9.5v5Z\"\n fill=\"#FF9900\"\n />\n <path d=\"M12 5v14M6 9.5l6 3 6-3\" stroke=\"#232F3E\" strokeWidth=\"1.2\" fill=\"none\" />\n </svg>\n );\n}\n"],"names":["d","key"],"mappings":"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","ignoreList":[8]}