@shipit-ai/cli 1.173.2 → 1.174.1-pr20.dba624c

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 (212) hide show
  1. package/dist/packages/core/src/infrastructure/services/mcp-server-browser/mcp-server-browser.service.js +46 -1
  2. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/codex-cli.json +1 -1
  3. package/dist/src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.d.ts.map +1 -1
  4. package/dist/src/presentation/web/components/features/mcp-servers/mcp-connect-instructions.js +1 -3
  5. package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-card.d.ts.map +1 -1
  6. package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-card.js +2 -8
  7. package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.d.ts.map +1 -1
  8. package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.js +5 -4
  9. package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-icon.d.ts +45 -0
  10. package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-icon.d.ts.map +1 -0
  11. package/dist/src/presentation/web/components/features/mcp-servers/mcp-server-icon.js +138 -0
  12. package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/features/mcp-servers/mcp-servers-page-client.js +7 -6
  14. package/dist/src/presentation/web/components/features/mcp-servers/vendor-brand-icons.d.ts +29 -0
  15. package/dist/src/presentation/web/components/features/mcp-servers/vendor-brand-icons.d.ts.map +1 -0
  16. package/dist/src/presentation/web/components/features/mcp-servers/vendor-brand-icons.js +25 -0
  17. package/dist/tsconfig.build.tsbuildinfo +1 -1
  18. package/package.json +6 -6
  19. package/web/.next/BUILD_ID +1 -1
  20. package/web/.next/build-manifest.json +3 -3
  21. package/web/.next/fallback-build-manifest.json +3 -3
  22. package/web/.next/prerender-manifest.json +3 -3
  23. package/web/.next/required-server-files.js +3 -3
  24. package/web/.next/required-server-files.json +3 -3
  25. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  26. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  29. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  30. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
  32. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  33. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  35. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  36. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  38. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  41. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  44. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  47. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
  50. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  53. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  56. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  59. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  62. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  65. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/_global-error.html +1 -1
  68. package/web/.next/server/app/_global-error.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  71. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  72. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  74. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  75. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  76. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  78. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  79. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  80. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  81. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  82. package/web/.next/server/app/mcp-servers/page/server-reference-manifest.json +13 -13
  83. package/web/.next/server/app/mcp-servers/page.js.nft.json +1 -1
  84. package/web/.next/server/app/mcp-servers/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/plugins/page/server-reference-manifest.json +15 -15
  86. package/web/.next/server/app/plugins/page.js.nft.json +1 -1
  87. package/web/.next/server/app/plugins/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/settings/page/server-reference-manifest.json +12 -12
  89. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  90. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  92. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  93. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  95. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  96. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  98. package/web/.next/server/app/version/page.js.nft.json +1 -1
  99. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
  101. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
  102. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
  104. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/0j.8_web_components_features_mcp-servers_mcp-servers-page-client_tsx_0dda8ih._.js +2 -2
  106. package/web/.next/server/chunks/ssr/0j.8_web_components_features_mcp-servers_mcp-servers-page-client_tsx_0dda8ih._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
  108. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
  110. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__0mwao26._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__0mwao26._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/{_0~d-l61._.js → _01.73dm._.js} +2 -2
  130. package/web/.next/server/chunks/ssr/{_0~d-l61._.js.map → _01.73dm._.js.map} +1 -1
  131. package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
  132. package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
  134. package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/{_1031n_-._.js → _083k45~._.js} +2 -2
  136. package/web/.next/server/chunks/ssr/{_1031n_-._.js.map → _083k45~._.js.map} +1 -1
  137. package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
  138. package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/{_09b301s._.js → _0ajzmj-._.js} +2 -2
  142. package/web/.next/server/chunks/ssr/{_09b301s._.js.map → _0ajzmj-._.js.map} +1 -1
  143. package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
  144. package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
  146. package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/_0fswe4r._.js +1 -1
  148. package/web/.next/server/chunks/ssr/_0fswe4r._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/{_0u09c2.._.js → _0mbb.7k._.js} +2 -2
  150. package/web/.next/server/chunks/ssr/{_0u09c2.._.js.map → _0mbb.7k._.js.map} +1 -1
  151. package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
  152. package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
  154. package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
  156. package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/{_096x3u~._.js → _0vq0c0x._.js} +2 -2
  158. package/web/.next/server/chunks/ssr/{_096x3u~._.js.map → _0vq0c0x._.js.map} +1 -1
  159. package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
  160. package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
  162. package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
  164. package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
  166. package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/_0~g5-.e._.js +3 -0
  168. package/web/.next/server/chunks/ssr/_0~g5-.e._.js.map +1 -0
  169. package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
  170. package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_mcp-servers_page_actions_0d.r4q..js +1 -1
  172. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_mcp-servers_page_actions_0d.r4q..js.map +1 -1
  173. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js +1 -1
  174. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
  176. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
  178. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
  180. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
  181. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
  182. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
  183. package/web/.next/server/middleware-build-manifest.js +3 -3
  184. package/web/.next/server/pages/500.html +1 -1
  185. package/web/.next/server/server-reference-manifest.js +1 -1
  186. package/web/.next/server/server-reference-manifest.json +57 -57
  187. package/web/.next/static/chunks/{0whqmoyf3zd67.js → 0-m4rnec155i1.js} +1 -1
  188. package/web/.next/static/chunks/02940.vqpqt~w.js +8 -0
  189. package/web/.next/static/chunks/{0t~1ohqb2m7ma.js → 094xbjw.1t41_.js} +1 -1
  190. package/web/.next/static/chunks/{0ul697ie_gsw9.js → 0_bfubsp9neaf.js} +1 -1
  191. package/web/.next/static/chunks/0a~-dbzk6tkpw.css +1 -0
  192. package/web/.next/static/chunks/{159n33nvplqug.js → 0g304jt8qhu-~.js} +1 -1
  193. package/web/.next/static/chunks/{0pb77veci.7gd.js → 0k4d8i58i.mo0.js} +1 -1
  194. package/web/.next/static/chunks/0lb_dekd7d4xu.js +1 -0
  195. package/web/.next/static/chunks/{08w-qt8wfe5u..js → 0lc14m5evyhuu.js} +1 -1
  196. package/web/.next/static/chunks/{07kpqi8hle98h.js → 0lt_ok~0hysqu.js} +1 -1
  197. package/web/.next/static/chunks/{06_a861w0tkp6.js → 0nct2gnbj84mf.js} +1 -1
  198. package/web/.next/static/chunks/{0xee.1sl6c~24.js → 0nm97zmm.ri8o.js} +1 -1
  199. package/web/.next/static/chunks/{10p0lo4adb2~5.js → 0y~7z3sw~k~a3.js} +1 -1
  200. package/web/.next/static/chunks/{0mekjif_lg0-r.js → 0~5w460yes32a.js} +2 -2
  201. package/web/.next/static/chunks/{10j-adknfho63.js → 10rtagfoabp3b.js} +1 -1
  202. package/web/.next/static/chunks/{0~9hrc9~63dvr.js → 13wohdlnw9eid.js} +1 -1
  203. package/web/.next/static/chunks/{050mn~oci41h6.js → 15qu-.zhd9f48.js} +3 -3
  204. package/web/public/icons/tools/openai.svg +1 -0
  205. package/web/.next/server/chunks/ssr/_0vm01xk._.js +0 -3
  206. package/web/.next/server/chunks/ssr/_0vm01xk._.js.map +0 -1
  207. package/web/.next/static/chunks/0h2nh2s2b3ma2.css +0 -1
  208. package/web/.next/static/chunks/14ixmk5pm1-rc.js +0 -8
  209. package/web/.next/static/chunks/167z9~gq-q~oy.js +0 -1
  210. /package/web/.next/static/{q4u94V1z_KGlqS1uxSgT2 → MgGhOZyXLY0dmh1EnLE2U}/_buildManifest.js +0 -0
  211. /package/web/.next/static/{q4u94V1z_KGlqS1uxSgT2 → MgGhOZyXLY0dmh1EnLE2U}/_clientMiddlewareManifest.js +0 -0
  212. /package/web/.next/static/{q4u94V1z_KGlqS1uxSgT2 → MgGhOZyXLY0dmh1EnLE2U}/_ssgManifest.js +0 -0
@@ -1,10 +1,10 @@
1
- module.exports=[6790,a=>{"use strict";var b=a.i(53083),c=a.i(11321);a.i(98617);var d=a.i(50040),e=a.i(90894),f=a.i(50950),g=a.i(63466),h=a.i(90920),i=a.i(58339);a.i(38702);var j=a.i(16223),k=a.i(84117);let l=(0,a.i(97624).default)("wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]);var m=a.i(8685);let n={http:g.Server,sse:l,stdio:m.Terminal};function o({server:a,onSelect:c}){let{t:e}=(0,d.useTranslation)("web"),f=n[a.transport]??g.Server,h=a.mcp_info?.description??"";return(0,b.jsxs)(k.Card,{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",role:"button",tabIndex:0,onClick:()=>c(a),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),c(a))},children:[(0,b.jsxs)("div",{className:"flex items-start justify-between gap-2",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(f,{className:"text-muted-foreground h-4 w-4 shrink-0"}),(0,b.jsx)("h3",{className:"text-sm font-semibold",children:a.name})]}),(0,b.jsx)(i.Badge,{variant:"outline",className:"shrink-0 text-xs",children:e(`mcpServers.transport.${a.transport}`,a.transport.toUpperCase())})]}),h?(0,b.jsx)("p",{className:"text-muted-foreground mt-2 line-clamp-2 text-xs",children:h}):null,(0,b.jsx)("div",{className:"mt-3 flex items-center gap-2",children:a.auth_type&&"none"!==a.auth_type?(0,b.jsx)(i.Badge,{variant:"secondary",className:"text-xs",children:e(`mcpServers.authType.${a.auth_type}`,a.auth_type)}):null})]})}a.i(78454);var p=a.i(24255),q=a.i(2824),r=a.i(13126),s=a.i(18948),t=a.i(67664);function u({tools:a,serverName:e}){let{t:f}=(0,d.useTranslation)("web"),g=(0,c.useMemo)(()=>{let b;return b=`${e}-`,a.map(a=>({displayName:a.name.startsWith(b)?a.name.slice(b.length):a.name,description:a.description,key:a.name})).sort((a,b)=>a.displayName.localeCompare(b.displayName))},[a,e]);return 0===a.length?(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:f("mcpServers.tools.noTools")}):(0,b.jsx)("div",{className:"space-y-2",children:g.map(a=>(0,b.jsxs)("div",{className:"rounded-md border p-2",children:[(0,b.jsx)("div",{className:"flex items-center gap-2",children:(0,b.jsx)(i.Badge,{variant:"outline",className:"font-mono text-xs",children:a.displayName})}),a.description?(0,b.jsx)("p",{className:"text-muted-foreground mt-1 text-xs",children:a.description}):null]},a.key))})}var v=a.i(60197),w=a.i(34948);let x=[{id:"claude-code",label:"Claude Code"},{id:"cursor",label:"Cursor"},{id:"vscode",label:"VS Code"},{id:"gemini",label:"Gemini CLI"},{id:"codex",label:"Codex CLI"},{id:"curl",label:"cURL"}];function y({proxyBaseUrl:a,serverName:e}){let{t:f}=(0,d.useTranslation)("web"),[g,h]=(0,c.useState)("claude-code"),[i,j]=(0,c.useState)(!1),k=function(a,b,c){let d=`${b.replace(/\/$/,"")}/${c}/mcp`;switch(a){case"claude-code":return`claude mcp add --transport http ${c} \\
1
+ module.exports=[6790,a=>{"use strict";var b=a.i(53083),c=a.i(11321);a.i(98617);var d=a.i(50040),e=a.i(90894),f=a.i(50950),g=a.i(63466),h=a.i(90920),i=a.i(18948);a.i(38702);var j=a.i(16223);a.i(55135);var k=a.i(75550),l=a.i(84117),m=a.i(58339);let n=(0,a.i(97624).default)("wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]);var o=a.i(8685);function p({className:a,size:c=20}){return(0,b.jsxs)("svg",{className:a,width:c,height:c,viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[(0,b.jsx)("path",{d:"M12 4L2 20h7l3-5 3 5h7L12 4Z",fill:"#0089D6"}),(0,b.jsx)("path",{d:"M12 4l-3 5h6l-3-5Z",fill:"#54AEF0"})]})}let q=[{match:/microsoft[_-]?learn|learn\.microsoft/,inlineIcon:function({className:a,size:c=20}){return(0,b.jsxs)("svg",{className:a,width:c,height:c,viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[(0,b.jsx)("path",{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",fill:"#0078D4"}),(0,b.jsx)("path",{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",fill:"#50E6FF"})]})}},{match:/foundry|ai\.azure|azure[_-]?foundry|bedrock[_-]?agentcore/,inlineIcon:p},{match:/\bazure\b/,inlineIcon:p},{match:/microsoft|\.microsoft\./,inlineIcon:function({className:a,size:c=20}){return(0,b.jsxs)("svg",{className:a,width:c,height:c,viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[(0,b.jsx)("rect",{x:"2",y:"2",width:"9",height:"9",fill:"#F25022"}),(0,b.jsx)("rect",{x:"13",y:"2",width:"9",height:"9",fill:"#7FBA00"}),(0,b.jsx)("rect",{x:"2",y:"13",width:"9",height:"9",fill:"#00A4EF"}),(0,b.jsx)("rect",{x:"13",y:"13",width:"9",height:"9",fill:"#FFB900"})]})}},{match:/github[_-]?copilot|\bcopilot\b/,simpleIconSlug:"githubcopilot"},{match:/github|api\.github/,simpleIconSlug:"github"},{match:/gitlab/,simpleIconSlug:"gitlab"},{match:/bitbucket/,simpleIconSlug:"bitbucket"},{match:/anthropic|\bclaude\b/,simpleIconSlug:"anthropic"},{match:/gemini|google[_-]?ai/,simpleIconSlug:"googlegemini"},{match:/perplexity/,simpleIconSlug:"perplexity"},{match:/deepwiki|deep[_-]?wiki/,inlineIcon:function({className:a,size:c=20}){return(0,b.jsxs)("svg",{className:a,width:c,height:c,viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[(0,b.jsx)("rect",{x:"4",y:"3",width:"13",height:"16",rx:"1.5",fill:"#6366F1"}),(0,b.jsx)("rect",{x:"7",y:"6",width:"7",height:"1.5",rx:"0.5",fill:"#E0E7FF"}),(0,b.jsx)("rect",{x:"7",y:"9",width:"7",height:"1.5",rx:"0.5",fill:"#E0E7FF"}),(0,b.jsx)("rect",{x:"7",y:"12",width:"4",height:"1.5",rx:"0.5",fill:"#E0E7FF"}),(0,b.jsx)("circle",{cx:"17",cy:"17",r:"4",fill:"none",stroke:"#F59E0B",strokeWidth:"2"}),(0,b.jsx)("line",{x1:"20",y1:"20",x2:"22",y2:"22",stroke:"#F59E0B",strokeWidth:"2",strokeLinecap:"round"})]})}},{match:/notion/,simpleIconSlug:"notion"},{match:/confluence/,simpleIconSlug:"confluence"},{match:/readthedocs/,simpleIconSlug:"readthedocs"},{match:/mintlify/,simpleIconSlug:"mintlify"},{match:/firecrawl/,inlineIcon:function({className:a,size:c=20}){return(0,b.jsxs)("svg",{className:a,width:c,height:c,viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[(0,b.jsx)("path",{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",fill:"#F26B21"}),(0,b.jsx)("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"})]})}},{match:/\baws\b|amazon[_-]?web|bedrock/,inlineIcon:function({className:a,size:c=20}){return(0,b.jsxs)("svg",{className:a,width:c,height:c,viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[(0,b.jsx)("path",{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",fill:"#FF9900"}),(0,b.jsx)("path",{d:"M12 5v14M6 9.5l6 3 6-3",stroke:"#232F3E",strokeWidth:"1.2",fill:"none"})]})}},{match:/cloudflare/,simpleIconSlug:"cloudflare"},{match:/vercel/,simpleIconSlug:"vercel"},{match:/netlify/,simpleIconSlug:"netlify"},{match:/digitalocean/,simpleIconSlug:"digitalocean"},{match:/railway/,simpleIconSlug:"railway"},{match:/postgres/,simpleIconSlug:"postgresql"},{match:/mongodb/,simpleIconSlug:"mongodb"},{match:/\bredis\b/,simpleIconSlug:"redis"},{match:/mysql/,simpleIconSlug:"mysql"},{match:/sqlite/,simpleIconSlug:"sqlite"},{match:/supabase/,simpleIconSlug:"supabase"},{match:/planetscale/,simpleIconSlug:"planetscale"},{match:/slack/,simpleIconSlug:"slack"},{match:/discord/,simpleIconSlug:"discord"},{match:/linear/,simpleIconSlug:"linear"},{match:/jira|atlassian/,simpleIconSlug:"jira"},{match:/asana/,simpleIconSlug:"asana"},{match:/zapier/,simpleIconSlug:"zapier"},{match:/datadog/,simpleIconSlug:"datadog"},{match:/sentry/,simpleIconSlug:"sentry"},{match:/grafana/,simpleIconSlug:"grafana"},{match:/newrelic/,simpleIconSlug:"newrelic"},{match:/stripe/,simpleIconSlug:"stripe"},{match:/shopify/,simpleIconSlug:"shopify"}],r={http:g.Server,sse:n,stdio:o.Terminal},s={sm:"size-4",md:"size-5",lg:"size-6"},t={sm:16,md:20,lg:24};function u({serverName:a,url:d,transport:e,className:f,size:h="sm"}){let[i,j]=(0,c.useState)(!1),k=function(a,b){let c=`${a} ${b??""}`.toLowerCase();for(let a of q)if(a.match.test(c)){if(a.inlineIcon)return{kind:"inline",component:a.inlineIcon};if(a.simpleIconSlug)return{kind:"simpleicons",slug:a.simpleIconSlug}}return{kind:"none"}}(a,d),l=r[e]??g.Server,m=s[h],n=t[h];if("inline"===k.kind){let a=k.component;return(0,b.jsx)(a,{className:`${m} shrink-0 ${f??""}`,size:n})}return"simpleicons"!==k.kind||i?(0,b.jsx)(l,{className:`text-muted-foreground ${m} shrink-0 ${f??""}`}):(0,b.jsx)("img",{src:`https://cdn.simpleicons.org/${k.slug}`,alt:"",width:n,height:n,className:`${m} shrink-0 ${f??""}`,onError:()=>j(!0)})}function v({server:a,onSelect:c}){let{t:e}=(0,d.useTranslation)("web"),f=a.mcp_info?.description??"";return(0,b.jsxs)(l.Card,{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",role:"button",tabIndex:0,onClick:()=>c(a),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),c(a))},"data-testid":`mcp-server-card-${a.server_name}`,children:[(0,b.jsxs)("div",{className:"flex items-start gap-3",children:[(0,b.jsx)("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",children:(0,b.jsx)(u,{serverName:a.server_name,url:a.url,transport:a.transport,size:"md"})}),(0,b.jsx)("h3",{className:"text-foreground mt-2 min-w-0 flex-1 truncate text-sm leading-tight font-bold tracking-tight",children:a.name})]}),f?(0,b.jsx)("p",{className:"text-muted-foreground mt-3 line-clamp-2 text-xs leading-relaxed",children:f}):null,(0,b.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(m.Badge,{variant:"outline",children:e(`mcpServers.transport.${a.transport}`,a.transport.toUpperCase())}),a.auth_type&&"none"!==a.auth_type?(0,b.jsx)(m.Badge,{variant:"secondary",children:e(`mcpServers.authType.${a.auth_type}`,a.auth_type)}):null]})]})}a.i(78454);var w=a.i(24255),x=a.i(2824),y=a.i(13126),z=a.i(67664);function A({tools:a,serverName:e}){let{t:f}=(0,d.useTranslation)("web"),g=(0,c.useMemo)(()=>{let b;return b=`${e}-`,a.map(a=>({displayName:a.name.startsWith(b)?a.name.slice(b.length):a.name,description:a.description,key:a.name})).sort((a,b)=>a.displayName.localeCompare(b.displayName))},[a,e]);return 0===a.length?(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:f("mcpServers.tools.noTools")}):(0,b.jsx)("div",{className:"space-y-2",children:g.map(a=>(0,b.jsxs)("div",{className:"rounded-md border p-2",children:[(0,b.jsx)("div",{className:"flex items-center gap-2",children:(0,b.jsx)(m.Badge,{variant:"outline",className:"font-mono text-xs",children:a.displayName})}),a.description?(0,b.jsx)("p",{className:"text-muted-foreground mt-1 text-xs",children:a.description}):null]},a.key))})}var B=a.i(60197),C=a.i(34948);let D=[{id:"claude-code",label:"Claude Code"},{id:"cursor",label:"Cursor"},{id:"vscode",label:"VS Code"},{id:"gemini",label:"Gemini CLI"},{id:"codex",label:"Codex CLI"},{id:"curl",label:"cURL"}];function E({proxyBaseUrl:a,serverName:e}){let{t:f}=(0,d.useTranslation)("web"),[g,h]=(0,c.useState)("claude-code"),[j,k]=(0,c.useState)(!1),l=function(a,b,c){let d=`${b.replace(/\/$/,"")}/${c}/mcp`;switch(a){case"claude-code":return`claude mcp add --transport http ${c} \\
2
2
  ${d} \\
3
3
  --header "x-litellm-api-key: Bearer <LITELLM_API_KEY>"`;case"cursor":return JSON.stringify({mcpServers:{[c]:{url:d,headers:{"x-litellm-api-key":"Bearer <LITELLM_API_KEY>"}}}},null,2);case"vscode":return JSON.stringify({mcp:{servers:{[c]:{type:"http",url:d,headers:{"x-litellm-api-key":"Bearer <LITELLM_API_KEY>"}}}}},null,2);case"gemini":return JSON.stringify({mcpServers:{[c]:{httpUrl:d,headers:{"x-litellm-api-key":"Bearer <LITELLM_API_KEY>"}}}},null,2);case"codex":return`[mcp_servers.${c}]
4
4
  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),l=async()=>{try{await navigator.clipboard.writeText(k),j(!0),setTimeout(()=>j(!1),2e3)}catch{}};return(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("div",{className:"flex flex-wrap gap-1",role:"tablist",children:x.map(a=>(0,b.jsx)("button",{type:"button",role:"tab","aria-selected":g===a.id,onClick:()=>h(a.id),className:g===a.id?"bg-primary text-primary-foreground rounded-md px-2.5 py-1 text-xs font-medium":"border-border hover:bg-muted rounded-md border px-2.5 py-1 text-xs",children:a.label},a.id))}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)("pre",{className:"bg-muted max-h-64 overflow-auto rounded-md p-3 pr-10 font-mono text-[11px] leading-relaxed",children:(0,b.jsx)("code",{children:k})}),(0,b.jsx)(s.Button,{type:"button",variant:"ghost",size:"icon",className:"absolute top-1 right-1 h-7 w-7",onClick:l,"aria-label":f("mcpServers.connect.copy"),children:i?(0,b.jsx)(v.Check,{className:"text-primary h-3.5 w-3.5"}):(0,b.jsx)(w.Copy,{className:"h-3.5 w-3.5"})})]}),(0,b.jsx)("p",{className:"text-muted-foreground text-xs",children:f("mcpServers.connect.replaceKey")})]})}var z=a.i(6120);let A=(0,z.createServerReference)("40a6d30a870afac1c6055ea758f86bfe4d9e2b7415",z.callServer,void 0,z.findSourceMapURL,"fetchMcpServerToolsAction");function B({server:a,proxyBaseUrl:e,open:f,onClose:g}){let{t:h}=(0,d.useTranslation)("web"),[j,k]=(0,c.useState)([]),[l,m]=(0,c.useState)(!1),[n,o]=(0,c.useState)(null),[v,w]=(0,c.useState)(null),x=(0,c.useCallback)(async a=>{m(!0),o(null);try{let b=await A(a);k(b.tools),b.error&&o(b.error),w(a)}catch{o("Failed to load tools")}finally{m(!1)}},[]);(0,c.useEffect)(()=>{f&&a&&v!==a.server_name&&x(a.server_name)},[f,a,v,x]);let z=(0,c.useCallback)(()=>{a&&(w(null),x(a.server_name))},[a,x]);if(!a)return null;let C=a.mcp_info?.description??"";return(0,b.jsxs)(p.BaseDrawer,{open:f,onClose:g,children:[(0,b.jsx)(q.DrawerTitle,{children:a.name}),C?(0,b.jsx)(q.DrawerDescription,{children:C}):null,(0,b.jsx)(r.Separator,{className:"my-4"}),(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",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",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs",children:h("mcpServers.detail.url")}),(0,b.jsx)("span",{className:"max-w-[200px] truncate font-mono text-xs",children:a.url})]}),(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs",children:h("mcpServers.detail.transport")}),(0,b.jsx)(i.Badge,{variant:"outline",className:"text-xs",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",children:h("mcpServers.detail.authType")}),(0,b.jsx)(i.Badge,{variant:"secondary",className:"text-xs",children:h(`mcpServers.authType.${a.auth_type}`,a.auth_type)})]}):null]}),(0,b.jsx)(r.Separator,{className:"my-4"}),(0,b.jsxs)("div",{className:"mb-3 flex items-center justify-between",children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:h("mcpServers.tools.title")}),(0,b.jsx)(s.Button,{type:"button",variant:"ghost",size:"icon",className:"h-7 w-7",onClick:z,disabled:l,"aria-label":h("mcpServers.tools.refresh"),"data-testid":"mcp-tools-refresh",children:(0,b.jsx)(t.RefreshCw,{className:`h-3.5 w-3.5 ${l?"animate-spin":""}`})})]}),l?(0,b.jsxs)("p",{className:"text-muted-foreground text-sm",children:[h("accessibility.loading"),"..."]}):n?(0,b.jsx)("p",{className:"text-destructive text-sm",children:n}):(0,b.jsx)(u,{tools:j,serverName:a.server_name}),(0,b.jsx)(r.Separator,{className:"my-4"}),(0,b.jsx)("h3",{className:"mb-3 text-sm font-semibold",children:h("mcpServers.connect.title")}),(0,b.jsx)(y,{proxyBaseUrl:e,serverName:a.server_name})]})}let C=(0,z.createServerReference)("0022bd456ef0028b04cd1d4afbfde320e4cadf4420",z.callServer,void 0,z.findSourceMapURL,"fetchMcpServersAction"),D=["all","http","sse","stdio"];a.s(["McpServersPageClient",0,function({proxyConfigured:a,proxyBaseUrl:k}){let{t:l}=(0,d.useTranslation)("web"),[m,n]=(0,c.useState)(""),[p,q]=(0,c.useState)("all"),[r,s]=(0,c.useState)(null),[t,u]=(0,c.useState)([]),[v,w]=(0,c.useState)(!0),[x,y]=(0,c.useState)(null);(0,c.useEffect)(()=>{a?C().then(a=>{u(a.servers),a.error&&y(a.error)}).catch(()=>{y(l("mcpServers.fetchError"))}).finally(()=>{w(!1)}):w(!1)},[a,l]);let z=(0,c.useMemo)(()=>t.filter(a=>{let b=m.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,m,p]);return a?v?(0,b.jsx)("div",{className:"flex h-full items-center justify-center p-8",children:(0,b.jsxs)("p",{className:"text-muted-foreground",children:[l("accessibility.loading"),"..."]})}):(0,b.jsxs)("div",{className:"space-y-6 p-6",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-bold",children:l("mcpServers.title")}),x?(0,b.jsx)("div",{className:"border-destructive/50 bg-destructive/10 mt-2 rounded-md border p-3",children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(e.AlertCircle,{className:"text-destructive h-4 w-4"}),(0,b.jsx)("p",{className:"text-destructive text-sm",children:x})]})}):null,(0,b.jsx)("p",{className:"text-muted-foreground mt-1 text-sm",children:l("mcpServers.subtitle")})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,b.jsx)(h.Input,{placeholder:l("mcpServers.searchPlaceholder"),value:m,onChange:a=>n(a.target.value),className:"max-w-xs"}),(0,b.jsx)("div",{className:"flex gap-1",children:D.map(a=>(0,b.jsx)(i.Badge,{variant:p===a?"default":"outline",className:"cursor-pointer",onClick:()=>q(a),children:"all"===a?l("mcpServers.filter.all"):l(`mcpServers.transport.${a}`,a.toUpperCase())},a))})]}),0===z.length?(0,b.jsx)("div",{className:"flex items-center justify-center py-16",children:(0,b.jsx)(j.EmptyState,{icon:0===t.length?(0,b.jsx)(g.Server,{className:"h-8 w-8"}):(0,b.jsx)(f.Search,{className:"h-8 w-8"}),title:0===t.length?l("mcpServers.noServers"):l("mcpServers.noResults")})}):(0,b.jsx)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",children:z.map(a=>(0,b.jsx)(o,{server:a,onSelect:s},a.server_id))}),(0,b.jsx)(B,{server:r,proxyBaseUrl:k,open:!!r,onClose:()=>s(null)})]}):(0,b.jsx)("div",{className:"flex h-full items-center justify-center p-8",children:(0,b.jsx)(j.EmptyState,{icon:(0,b.jsx)(e.AlertCircle,{className:"h-8 w-8"}),title:l("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)("403e59c75825e1aba732958801e051f3f71fffd9ca",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)("007628010d447d44466654be108e7c2367ea8d4c69",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-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%3Aaf2fe2%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.tsx","../../../../../../../src/presentation/web/app/actions/data%3A597571%20%3Ctext/javascript%3E","../../../../../../../node_modules/.pnpm/lucide-react%401.7.0_react%4019.2.4/node_modules/lucide-react/src/icons/wifi.ts"],"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 { Badge } from '@/components/ui/badge';\nimport { EmptyState } from '@/components/common/empty-state';\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<string>('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 h-full items-center justify-center p-8\">\n <EmptyState icon={<AlertCircle className=\"h-8 w-8\" />} title={t('mcpServers.noProxy')} />\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"flex h-full items-center justify-center p-8\">\n <p className=\"text-muted-foreground\">{t('accessibility.loading')}...</p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-bold\">{t('mcpServers.title')}</h1>\n {error ? (\n <div className=\"border-destructive/50 bg-destructive/10 mt-2 rounded-md border p-3\">\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"text-destructive h-4 w-4\" />\n <p className=\"text-destructive text-sm\">{error}</p>\n </div>\n </div>\n ) : null}\n <p className=\"text-muted-foreground mt-1 text-sm\">{t('mcpServers.subtitle')}</p>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-3\">\n <Input\n placeholder={t('mcpServers.searchPlaceholder')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"max-w-xs\"\n />\n <div className=\"flex gap-1\">\n {TRANSPORT_FILTERS.map((filter) => (\n <Badge\n key={filter}\n variant={transportFilter === filter ? 'default' : 'outline'}\n className=\"cursor-pointer\"\n onClick={() => setTransportFilter(filter)}\n >\n {filter === 'all'\n ? t('mcpServers.filter.all')\n : t(`mcpServers.transport.${filter}`, filter.toUpperCase())}\n </Badge>\n ))}\n </div>\n </div>\n\n {filtered.length === 0 ? (\n <div className=\"flex items-center justify-center py-16\">\n <EmptyState\n icon={\n servers.length === 0 ? <Server className=\"h-8 w-8\" /> : <Search className=\"h-8 w-8\" />\n }\n title={servers.length === 0 ? t('mcpServers.noServers') : t('mcpServers.noResults')}\n />\n </div>\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 { useTranslation } from 'react-i18next';\nimport { Card } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport { Server, Wifi, Terminal } from 'lucide-react';\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\nconst TRANSPORT_ICONS: Record<string, typeof Server> = {\n http: Server,\n sse: Wifi,\n stdio: Terminal,\n};\n\nexport function McpServerCard({ server, onSelect }: McpServerCardProps) {\n const { t } = useTranslation('web');\n const TransportIcon = TRANSPORT_ICONS[server.transport] ?? Server;\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 >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <TransportIcon className=\"text-muted-foreground h-4 w-4 shrink-0\" />\n <h3 className=\"text-sm font-semibold\">{server.name}</h3>\n </div>\n <Badge variant=\"outline\" className=\"shrink-0 text-xs\">\n {t(`mcpServers.transport.${server.transport}`, server.transport.toUpperCase())}\n </Badge>\n </div>\n\n {description ? (\n <p className=\"text-muted-foreground mt-2 line-clamp-2 text-xs\">{description}</p>\n ) : null}\n\n <div className=\"mt-3 flex items-center gap-2\">\n {server.auth_type && server.auth_type !== 'none' ? (\n <Badge variant=\"secondary\" className=\"text-xs\">\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 className=\"flex flex-wrap gap-1\" role=\"tablist\">\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 className={\n activeClient === client.id\n ? 'bg-primary text-primary-foreground rounded-md px-2.5 py-1 text-xs font-medium'\n : 'border-border hover:bg-muted rounded-md border px-2.5 py-1 text-xs'\n }\n >\n {client.label}\n </button>\n ))}\n </div>\n\n <div className=\"relative\">\n <pre className=\"bg-muted max-h-64 overflow-auto rounded-md p-3 pr-10 font-mono text-[11px] leading-relaxed\">\n <code>{snippet}</code>\n </pre>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute top-1 right-1 h-7 w-7\"\n onClick={handleCopy}\n aria-label={t('mcpServers.connect.copy')}\n >\n {copied ? (\n <Check className=\"text-primary h-3.5 w-3.5\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" />\n )}\n </Button>\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__ [{\"40a6d30a870afac1c6055ea758f86bfe4d9e2b7415\":{\"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(\"40a6d30a870afac1c6055ea758f86bfe4d9e2b7415\",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 { 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 on the next render\n // and call loadTools 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}>\n <DrawerTitle>{server.name}</DrawerTitle>\n {description ? <DrawerDescription>{description}</DrawerDescription> : null}\n\n <Separator className=\"my-4\" />\n\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs\">{t('mcpServers.detail.serverName')}</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\">\n <span className=\"text-muted-foreground text-xs\">{t('mcpServers.detail.url')}</span>\n <span className=\"max-w-[200px] truncate font-mono text-xs\">{server.url}</span>\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs\">{t('mcpServers.detail.transport')}</span>\n <Badge variant=\"outline\" className=\"text-xs\">\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\">{t('mcpServers.detail.authType')}</span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {t(`mcpServers.authType.${server.auth_type}`, server.auth_type)}\n </Badge>\n </div>\n ) : null}\n </div>\n\n <Separator className=\"my-4\" />\n\n <div className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{t('mcpServers.tools.title')}</h3>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={handleRefresh}\n disabled={loadingTools}\n aria-label={t('mcpServers.tools.refresh')}\n data-testid=\"mcp-tools-refresh\"\n >\n <RefreshCw className={`h-3.5 w-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\n <Separator className=\"my-4\" />\n\n <h3 className=\"mb-3 text-sm font-semibold\">{t('mcpServers.connect.title')}</h3>\n <McpConnectInstructions proxyBaseUrl={proxyBaseUrl} serverName={server.server_name} />\n </BaseDrawer>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"0022bd456ef0028b04cd1d4afbfde320e4cadf4420\":{\"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(\"0022bd456ef0028b04cd1d4afbfde320e4cadf4420\",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"],"names":["d"],"mappings":"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","ignoreList":[7]}
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%3A6cff93%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/mcp-servers/mcp-server-detail-drawer.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ade1b23%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__ [{\"403e59c75825e1aba732958801e051f3f71fffd9ca\":{\"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(\"403e59c75825e1aba732958801e051f3f71fffd9ca\",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__ [{\"007628010d447d44466654be108e7c2367ea8d4c69\":{\"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(\"007628010d447d44466654be108e7c2367ea8d4c69\",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]}