@samanhappy/mcphub 1.0.30 → 1.0.32

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 (277) hide show
  1. package/dist/betterAuth.js +13 -5
  2. package/dist/betterAuth.js.map +1 -1
  3. package/dist/cli/commands/cache.js.map +1 -1
  4. package/dist/cli/commands/call.js +2 -2
  5. package/dist/cli/commands/call.js.map +1 -1
  6. package/dist/cli/commands/config.js.map +1 -1
  7. package/dist/cli/commands/discover.js.map +1 -1
  8. package/dist/cli/commands/export.js.map +1 -1
  9. package/dist/cli/commands/groups.js.map +1 -1
  10. package/dist/cli/commands/install.js +1 -1
  11. package/dist/cli/commands/install.js.map +1 -1
  12. package/dist/cli/commands/keys.js.map +1 -1
  13. package/dist/cli/commands/login.js.map +1 -1
  14. package/dist/cli/commands/servers.js.map +1 -1
  15. package/dist/cli/commands/tools.js +2 -2
  16. package/dist/cli/commands/tools.js.map +1 -1
  17. package/dist/cli/context.js +1 -1
  18. package/dist/cli/context.js.map +1 -1
  19. package/dist/cli/http.js +3 -1
  20. package/dist/cli/http.js.map +1 -1
  21. package/dist/clients/openapi.js +75 -7
  22. package/dist/clients/openapi.js.map +1 -1
  23. package/dist/config/DaoConfigService.js +3 -2
  24. package/dist/config/DaoConfigService.js.map +1 -1
  25. package/dist/config/configManager.js +11 -9
  26. package/dist/config/configManager.js.map +1 -1
  27. package/dist/config/index.js +32 -7
  28. package/dist/config/index.js.map +1 -1
  29. package/dist/config/jwt.js +2 -1
  30. package/dist/config/jwt.js.map +1 -1
  31. package/dist/config/migrationUtils.js +46 -45
  32. package/dist/config/migrationUtils.js.map +1 -1
  33. package/dist/constants/oauthServerDefaults.js.map +1 -1
  34. package/dist/controllers/activityController.js +6 -5
  35. package/dist/controllers/activityController.js.map +1 -1
  36. package/dist/controllers/authController.js +5 -4
  37. package/dist/controllers/authController.js.map +1 -1
  38. package/dist/controllers/bearerKeyController.js +7 -6
  39. package/dist/controllers/bearerKeyController.js.map +1 -1
  40. package/dist/controllers/betterAuthController.js +2 -1
  41. package/dist/controllers/betterAuthController.js.map +1 -1
  42. package/dist/controllers/builtinPromptController.js +13 -5
  43. package/dist/controllers/builtinPromptController.js.map +1 -1
  44. package/dist/controllers/builtinResourceController.js +14 -6
  45. package/dist/controllers/builtinResourceController.js.map +1 -1
  46. package/dist/controllers/changelogController.js +5 -2
  47. package/dist/controllers/changelogController.js.map +1 -1
  48. package/dist/controllers/cloudController.js +11 -10
  49. package/dist/controllers/cloudController.js.map +1 -1
  50. package/dist/controllers/configController.js +4 -3
  51. package/dist/controllers/configController.js.map +1 -1
  52. package/dist/controllers/contextCostController.js +3 -2
  53. package/dist/controllers/contextCostController.js.map +1 -1
  54. package/dist/controllers/groupController.js +2 -1
  55. package/dist/controllers/groupController.js.map +1 -1
  56. package/dist/controllers/healthController.js +2 -1
  57. package/dist/controllers/healthController.js.map +1 -1
  58. package/dist/controllers/hostedInternalController.js +2 -1
  59. package/dist/controllers/hostedInternalController.js.map +1 -1
  60. package/dist/controllers/logController.js +5 -4
  61. package/dist/controllers/logController.js.map +1 -1
  62. package/dist/controllers/mcpbController.js +17 -7
  63. package/dist/controllers/mcpbController.js.map +1 -1
  64. package/dist/controllers/oauthCallbackController.js +28 -27
  65. package/dist/controllers/oauthCallbackController.js.map +1 -1
  66. package/dist/controllers/oauthClientController.js +7 -6
  67. package/dist/controllers/oauthClientController.js.map +1 -1
  68. package/dist/controllers/oauthDynamicRegistrationController.js +22 -4
  69. package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -1
  70. package/dist/controllers/oauthServerController.js +96 -10
  71. package/dist/controllers/oauthServerController.js.map +1 -1
  72. package/dist/controllers/openApiController.js +7 -6
  73. package/dist/controllers/openApiController.js.map +1 -1
  74. package/dist/controllers/promptController.js +2 -1
  75. package/dist/controllers/promptController.js.map +1 -1
  76. package/dist/controllers/registryController.js +4 -3
  77. package/dist/controllers/registryController.js.map +1 -1
  78. package/dist/controllers/serverController.js +46 -34
  79. package/dist/controllers/serverController.js.map +1 -1
  80. package/dist/controllers/templateController.js +2 -1
  81. package/dist/controllers/templateController.js.map +1 -1
  82. package/dist/controllers/toolController.js +2 -1
  83. package/dist/controllers/toolController.js.map +1 -1
  84. package/dist/dao/DaoFactory.js +3 -2
  85. package/dist/dao/DaoFactory.js.map +1 -1
  86. package/dist/dao/ServerDao.js.map +1 -1
  87. package/dist/dao/UserConfigDaoDbImpl.js.map +1 -1
  88. package/dist/dao/UserDao.js.map +1 -1
  89. package/dist/dao/base/JsonFileBaseDao.js +3 -2
  90. package/dist/dao/base/JsonFileBaseDao.js.map +1 -1
  91. package/dist/dao/examples.js +35 -34
  92. package/dist/dao/examples.js.map +1 -1
  93. package/dist/db/connection.js +59 -58
  94. package/dist/db/connection.js.map +1 -1
  95. package/dist/db/index.js +2 -1
  96. package/dist/db/index.js.map +1 -1
  97. package/dist/db/repositories/ServerRepository.js +3 -3
  98. package/dist/db/repositories/ServerRepository.js.map +1 -1
  99. package/dist/db/repositories/SystemConfigRepository.js +2 -1
  100. package/dist/db/repositories/SystemConfigRepository.js.map +1 -1
  101. package/dist/db/repositories/UserConfigRepository.js.map +1 -1
  102. package/dist/db/repositories/VectorEmbeddingRepository.js +6 -5
  103. package/dist/db/repositories/VectorEmbeddingRepository.js.map +1 -1
  104. package/dist/index.js +28 -19
  105. package/dist/index.js.map +1 -1
  106. package/dist/middlewares/auth.js +4 -3
  107. package/dist/middlewares/auth.js.map +1 -1
  108. package/dist/middlewares/index.js +2 -1
  109. package/dist/middlewares/index.js.map +1 -1
  110. package/dist/middlewares/userContext.js +7 -6
  111. package/dist/middlewares/userContext.js.map +1 -1
  112. package/dist/models/OAuth.js +7 -6
  113. package/dist/models/OAuth.js.map +1 -1
  114. package/dist/models/User.js +13 -12
  115. package/dist/models/User.js.map +1 -1
  116. package/dist/routes/index.js +9 -9
  117. package/dist/routes/index.js.map +1 -1
  118. package/dist/scripts/dao-demo.js +28 -27
  119. package/dist/scripts/dao-demo.js.map +1 -1
  120. package/dist/server.js +40 -30
  121. package/dist/server.js.map +1 -1
  122. package/dist/services/activityLoggingService.js +3 -2
  123. package/dist/services/activityLoggingService.js.map +1 -1
  124. package/dist/services/betterAuthConfig.js +1 -4
  125. package/dist/services/betterAuthConfig.js.map +1 -1
  126. package/dist/services/betterAuthSession.js +8 -7
  127. package/dist/services/betterAuthSession.js.map +1 -1
  128. package/dist/services/changelogService.js +5 -2
  129. package/dist/services/changelogService.js.map +1 -1
  130. package/dist/services/cloudService.js +10 -9
  131. package/dist/services/cloudService.js.map +1 -1
  132. package/dist/services/contextCostService.js +6 -2
  133. package/dist/services/contextCostService.js.map +1 -1
  134. package/dist/services/groupService.js +8 -7
  135. package/dist/services/groupService.js.map +1 -1
  136. package/dist/services/hostedAuthService.js +3 -2
  137. package/dist/services/hostedAuthService.js.map +1 -1
  138. package/dist/services/hostedControlPlaneClient.js.map +1 -1
  139. package/dist/services/hostedEventSubscriber.js +9 -8
  140. package/dist/services/hostedEventSubscriber.js.map +1 -1
  141. package/dist/services/hostedRuntimeCatalogNames.js +1 -3
  142. package/dist/services/hostedRuntimeCatalogNames.js.map +1 -1
  143. package/dist/services/keepAliveService.js +7 -6
  144. package/dist/services/keepAliveService.js.map +1 -1
  145. package/dist/services/marketService.js +2 -1
  146. package/dist/services/marketService.js.map +1 -1
  147. package/dist/services/mcpOAuthProvider.js +22 -21
  148. package/dist/services/mcpOAuthProvider.js.map +1 -1
  149. package/dist/services/mcpService.js +136 -123
  150. package/dist/services/mcpService.js.map +1 -1
  151. package/dist/services/oauthClientRegistration.js +30 -29
  152. package/dist/services/oauthClientRegistration.js.map +1 -1
  153. package/dist/services/oauthServerService.js +22 -17
  154. package/dist/services/oauthServerService.js.map +1 -1
  155. package/dist/services/oauthService.js +16 -15
  156. package/dist/services/oauthService.js.map +1 -1
  157. package/dist/services/oauthSettingsStore.js +4 -3
  158. package/dist/services/oauthSettingsStore.js.map +1 -1
  159. package/dist/services/openApiGeneratorService.js +1 -3
  160. package/dist/services/openApiGeneratorService.js.map +1 -1
  161. package/dist/services/registry.js +2 -1
  162. package/dist/services/registry.js.map +1 -1
  163. package/dist/services/requestContextService.js.map +1 -1
  164. package/dist/services/smartRoutingService.js +6 -5
  165. package/dist/services/smartRoutingService.js.map +1 -1
  166. package/dist/services/sseService.js +66 -55
  167. package/dist/services/sseService.js.map +1 -1
  168. package/dist/services/templateService.js +57 -12
  169. package/dist/services/templateService.js.map +1 -1
  170. package/dist/services/toolResultCompressionService.js +8 -5
  171. package/dist/services/toolResultCompressionService.js.map +1 -1
  172. package/dist/services/upstreamOAuthDisconnectService.js +9 -6
  173. package/dist/services/upstreamOAuthDisconnectService.js.map +1 -1
  174. package/dist/services/userService.js +5 -4
  175. package/dist/services/userService.js.map +1 -1
  176. package/dist/services/vectorSearchService.js +126 -112
  177. package/dist/services/vectorSearchService.js.map +1 -1
  178. package/dist/utils/abortIsolatingFetch.js +31 -0
  179. package/dist/utils/abortIsolatingFetch.js.map +1 -0
  180. package/dist/utils/basePath.js +13 -0
  181. package/dist/utils/basePath.js.map +1 -0
  182. package/dist/utils/cacheUtils.js +5 -4
  183. package/dist/utils/cacheUtils.js.map +1 -1
  184. package/dist/utils/corsOrigin.js +42 -0
  185. package/dist/utils/corsOrigin.js.map +1 -0
  186. package/dist/utils/dbRetry.js +2 -5
  187. package/dist/utils/dbRetry.js.map +1 -1
  188. package/dist/utils/frontendShell.js +89 -0
  189. package/dist/utils/frontendShell.js.map +1 -0
  190. package/dist/utils/i18n.js.map +1 -1
  191. package/dist/utils/logger.js +170 -0
  192. package/dist/utils/logger.js.map +1 -0
  193. package/dist/utils/migration.js +51 -50
  194. package/dist/utils/migration.js.map +1 -1
  195. package/dist/utils/oauthConsentResource.js +45 -0
  196. package/dist/utils/oauthConsentResource.js.map +1 -0
  197. package/dist/utils/parameterConversion.js +2 -1
  198. package/dist/utils/parameterConversion.js.map +1 -1
  199. package/dist/utils/path.js +9 -8
  200. package/dist/utils/path.js.map +1 -1
  201. package/dist/utils/proxyTrust.js.map +1 -1
  202. package/dist/utils/rateLimit.js +8 -0
  203. package/dist/utils/rateLimit.js.map +1 -1
  204. package/dist/utils/requireAdmin.js +15 -0
  205. package/dist/utils/requireAdmin.js.map +1 -0
  206. package/dist/utils/serverConfigPersistence.js.map +1 -1
  207. package/dist/utils/serverShutdown.js +3 -2
  208. package/dist/utils/serverShutdown.js.map +1 -1
  209. package/dist/utils/smartRouting.js +4 -3
  210. package/dist/utils/smartRouting.js.map +1 -1
  211. package/dist/utils/ssrf.js +19 -6
  212. package/dist/utils/ssrf.js.map +1 -1
  213. package/dist/utils/tokenCost.js.map +1 -1
  214. package/dist/utils/tokenTruncation.js +9 -4
  215. package/dist/utils/tokenTruncation.js.map +1 -1
  216. package/dist/utils/version.js +3 -2
  217. package/dist/utils/version.js.map +1 -1
  218. package/frontend/dist/assets/{ActivityPage-U9om5C9X.js → ActivityPage-C6m1hGLq.js} +2 -2
  219. package/frontend/dist/assets/{ActivityPage-U9om5C9X.js.map → ActivityPage-C6m1hGLq.js.map} +1 -1
  220. package/frontend/dist/assets/{ConfirmDialog-CYfXEuyU.js → ConfirmDialog-BCMNzi21.js} +2 -2
  221. package/frontend/dist/assets/{ConfirmDialog-CYfXEuyU.js.map → ConfirmDialog-BCMNzi21.js.map} +1 -1
  222. package/frontend/dist/assets/{Dashboard-DGqpU4bd.js → Dashboard-DFKfjPff.js} +2 -2
  223. package/frontend/dist/assets/{Dashboard-DGqpU4bd.js.map → Dashboard-DFKfjPff.js.map} +1 -1
  224. package/frontend/dist/assets/{DeleteDialog-DNe-zTEl.js → DeleteDialog-D9ycSRvn.js} +2 -2
  225. package/frontend/dist/assets/{DeleteDialog-DNe-zTEl.js.map → DeleteDialog-D9ycSRvn.js.map} +1 -1
  226. package/frontend/dist/assets/{EndpointCopy-DuGmhiMq.js → EndpointCopy-CP_Fb1To.js} +2 -2
  227. package/frontend/dist/assets/{EndpointCopy-DuGmhiMq.js.map → EndpointCopy-CP_Fb1To.js.map} +1 -1
  228. package/frontend/dist/assets/{GroupsPage-Dhqy02FY.js → GroupsPage-Cwfm5q-a.js} +3 -3
  229. package/frontend/dist/assets/{GroupsPage-Dhqy02FY.js.map → GroupsPage-Cwfm5q-a.js.map} +1 -1
  230. package/frontend/dist/assets/{LoginPage-BXRn47pC.js → LoginPage-CnF44h_n.js} +2 -2
  231. package/frontend/dist/assets/LoginPage-CnF44h_n.js.map +1 -0
  232. package/frontend/dist/assets/{LogsPage-CiO6LZEJ.js → LogsPage-BFIpICsM.js} +2 -2
  233. package/frontend/dist/assets/{LogsPage-CiO6LZEJ.js.map → LogsPage-BFIpICsM.js.map} +1 -1
  234. package/frontend/dist/assets/{MarketPage-BEdWfj0u.js → MarketPage-Du-NqiEl.js} +2 -2
  235. package/frontend/dist/assets/{MarketPage-BEdWfj0u.js.map → MarketPage-Du-NqiEl.js.map} +1 -1
  236. package/frontend/dist/assets/OAuthConsentPage-zqXUvKMF.js +2 -0
  237. package/frontend/dist/assets/OAuthConsentPage-zqXUvKMF.js.map +1 -0
  238. package/frontend/dist/assets/{Pagination-DLSuQ8hw.js → Pagination-Dwko3g48.js} +2 -2
  239. package/frontend/dist/assets/{Pagination-DLSuQ8hw.js.map → Pagination-Dwko3g48.js.map} +1 -1
  240. package/frontend/dist/assets/{PromptsPage-BG6oWgAk.js → PromptsPage-Cm8ykiI4.js} +2 -2
  241. package/frontend/dist/assets/{PromptsPage-BG6oWgAk.js.map → PromptsPage-Cm8ykiI4.js.map} +1 -1
  242. package/frontend/dist/assets/{ResourcesPage-BqJUKqnV.js → ResourcesPage-UMyO6mQ4.js} +2 -2
  243. package/frontend/dist/assets/{ResourcesPage-BqJUKqnV.js.map → ResourcesPage-UMyO6mQ4.js.map} +1 -1
  244. package/frontend/dist/assets/{ServersPage-CHbXHEcG.js → ServersPage-B0RoM8ez.js} +8 -8
  245. package/frontend/dist/assets/ServersPage-B0RoM8ez.js.map +1 -0
  246. package/frontend/dist/assets/{SettingsPage-B6yl-U9T.js → SettingsPage-BTB-36-n.js} +2 -2
  247. package/frontend/dist/assets/{SettingsPage-B6yl-U9T.js.map → SettingsPage-BTB-36-n.js.map} +1 -1
  248. package/frontend/dist/assets/{StatusDot-Bz7sBh0t.js → StatusDot-BAMXeT2x.js} +2 -2
  249. package/frontend/dist/assets/{StatusDot-Bz7sBh0t.js.map → StatusDot-BAMXeT2x.js.map} +1 -1
  250. package/frontend/dist/assets/{ToggleGroup-60voS_0U.js → ToggleGroup-Cfgt5lJo.js} +2 -2
  251. package/frontend/dist/assets/{ToggleGroup-60voS_0U.js.map → ToggleGroup-Cfgt5lJo.js.map} +1 -1
  252. package/frontend/dist/assets/{UsersPage-Dzzo9CC-.js → UsersPage-DlzYf7Su.js} +2 -2
  253. package/frontend/dist/assets/{UsersPage-Dzzo9CC-.js.map → UsersPage-DlzYf7Su.js.map} +1 -1
  254. package/frontend/dist/assets/{contextCost-CIOdvJNu.js → contextCost-kp2vZYp7.js} +2 -2
  255. package/frontend/dist/assets/{contextCost-CIOdvJNu.js.map → contextCost-kp2vZYp7.js.map} +1 -1
  256. package/frontend/dist/assets/{framework-vendor-I9Y6AgD5.js → framework-vendor-BHAQX05P.js} +3 -3
  257. package/frontend/dist/assets/{framework-vendor-I9Y6AgD5.js.map → framework-vendor-BHAQX05P.js.map} +1 -1
  258. package/frontend/dist/assets/{i18n-vendor-y9bLzIeh.js → i18n-vendor-CMcB7XUR.js} +2 -2
  259. package/frontend/dist/assets/{i18n-vendor-y9bLzIeh.js.map → i18n-vendor-CMcB7XUR.js.map} +1 -1
  260. package/frontend/dist/assets/{icons-vendor-hw0ScL8G.js → icons-vendor-HZHHWeTa.js} +65 -60
  261. package/frontend/dist/assets/icons-vendor-HZHHWeTa.js.map +1 -0
  262. package/frontend/dist/assets/index-CvXw771N.js +3 -0
  263. package/frontend/dist/assets/index-CvXw771N.js.map +1 -0
  264. package/frontend/dist/assets/{resourceService-DIIsi_li.js → resourceService-D2QmlFby.js} +2 -2
  265. package/frontend/dist/assets/{resourceService-DIIsi_li.js.map → resourceService-D2QmlFby.js.map} +1 -1
  266. package/frontend/dist/assets/useSettingsData-CeCvZ2nU.js +2 -0
  267. package/frontend/dist/assets/{useSettingsData-C84qj7ge.js.map → useSettingsData-CeCvZ2nU.js.map} +1 -1
  268. package/frontend/dist/assets/{variableDetection-Y9ymMI80.js → variableDetection-DKPiHkxr.js} +2 -2
  269. package/frontend/dist/assets/{variableDetection-Y9ymMI80.js.map → variableDetection-DKPiHkxr.js.map} +1 -1
  270. package/frontend/dist/index.html +4 -4
  271. package/package.json +2 -2
  272. package/frontend/dist/assets/LoginPage-BXRn47pC.js.map +0 -1
  273. package/frontend/dist/assets/ServersPage-CHbXHEcG.js.map +0 -1
  274. package/frontend/dist/assets/icons-vendor-hw0ScL8G.js.map +0 -1
  275. package/frontend/dist/assets/index-Ca9HKIrV.js +0 -3
  276. package/frontend/dist/assets/index-Ca9HKIrV.js.map +0 -1
  277. package/frontend/dist/assets/useSettingsData-C84qj7ge.js +0 -2
@@ -9,10 +9,10 @@
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
- <script type="module" crossorigin src="./assets/index-Ca9HKIrV.js"></script>
13
- <link rel="modulepreload" crossorigin href="./assets/framework-vendor-I9Y6AgD5.js">
14
- <link rel="modulepreload" crossorigin href="./assets/i18n-vendor-y9bLzIeh.js">
15
- <link rel="modulepreload" crossorigin href="./assets/icons-vendor-hw0ScL8G.js">
12
+ <script type="module" crossorigin src="./assets/index-CvXw771N.js"></script>
13
+ <link rel="modulepreload" crossorigin href="./assets/framework-vendor-BHAQX05P.js">
14
+ <link rel="modulepreload" crossorigin href="./assets/i18n-vendor-CMcB7XUR.js">
15
+ <link rel="modulepreload" crossorigin href="./assets/icons-vendor-HZHHWeTa.js">
16
16
  <link rel="stylesheet" crossorigin href="./assets/index-CGvImZ3F.css">
17
17
  </head>
18
18
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@samanhappy/mcphub",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "description": "A hub server for mcp servers",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -111,7 +111,7 @@
111
111
  "react": "19.2.7",
112
112
  "react-dom": "19.2.7",
113
113
  "react-i18next": "^16.2.4",
114
- "react-router-dom": "^7.15.1",
114
+ "react-router-dom": "^7.18.2",
115
115
  "supertest": "^7.2.2",
116
116
  "tailwind-merge": "^3.3.1",
117
117
  "tailwind-scrollbar-hide": "^4.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"LoginPage-BXRn47pC.js","sources":["../../src/components/ui/DefaultPasswordWarningModal.tsx","../../src/pages/LoginPage.tsx"],"sourcesContent":["import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom';\n\ninterface DefaultPasswordWarningModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nconst DefaultPasswordWarningModal: React.FC<DefaultPasswordWarningModalProps> = ({\n isOpen,\n onClose,\n}) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n if (!isOpen) return null;\n\n const handleGoToSettings = () => {\n onClose();\n navigate('/settings');\n // Auto-scroll to password section after a small delay to ensure page is loaded\n setTimeout(() => {\n const passwordSection = document.querySelector('[data-section=\"password\"]');\n if (passwordSection) {\n passwordSection.scrollIntoView({ behavior: 'smooth', block: 'start' });\n // If the section is collapsed, expand it\n const clickTarget = passwordSection.querySelector('[role=\"button\"]');\n if (clickTarget && !passwordSection.querySelector('.mt-4')) {\n (clickTarget as HTMLElement).click();\n }\n }\n }, 100);\n };\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n return (\n <div\n className=\"fixed inset-0 bg-black/50 z-[100] flex items-center justify-center p-4\"\n onClick={handleBackdropClick}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n >\n <div\n className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-md w-full transform transition-all duration-200 ease-out\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"password-warning-title\"\n aria-describedby=\"password-warning-message\"\n >\n <div className=\"p-6\">\n <div className=\"flex items-start space-x-3\">\n <div className=\"flex-shrink-0\">\n <svg\n className=\"w-6 h-6 text-yellow-600 dark:text-yellow-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n </div>\n <div className=\"flex-1\">\n <h3\n id=\"password-warning-title\"\n className=\"text-lg font-medium text-gray-900 dark:text-white mb-2\"\n >\n {t('auth.defaultPasswordWarning')}\n </h3>\n <p\n id=\"password-warning-message\"\n className=\"text-gray-600 dark:text-gray-300 leading-relaxed\"\n >\n {t('auth.defaultPasswordMessage')}\n </p>\n </div>\n </div>\n\n <div className=\"flex justify-end space-x-3 mt-6\">\n <button\n onClick={onClose}\n className=\"hub-btn\"\n >\n {t('common.cancel')}\n </button>\n <button\n onClick={handleGoToSettings}\n className=\"hub-btn primary\"\n autoFocus\n >\n {t('auth.goToSettings')}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default DefaultPasswordWarningModal;\n","import React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { BookOpen, AlertCircle } from 'lucide-react';\nimport { useAuth } from '../contexts/AuthContext';\nimport { getToken } from '../services/authService';\nimport { getPublicConfig } from '../services/configService';\nimport { createBetterAuthClient, startOidcLogin } from '../services/betterAuthClient';\nimport { getBasePath } from '../utils/runtime';\nimport ThemeSwitch from '@/components/ui/ThemeSwitch';\nimport LanguageSwitch from '@/components/ui/LanguageSwitch';\nimport GitHubIcon from '@/components/icons/GitHubIcon';\nimport DefaultPasswordWarningModal from '@/components/ui/DefaultPasswordWarningModal';\n\ntype SocialProvider = 'google' | 'github' | 'oidc';\n\nconst sanitizeReturnUrl = (value: string | null): string | null => {\n if (!value) return null;\n try {\n const origin = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n const url = new URL(value, origin);\n if (url.origin !== origin) return null;\n const relativePath = `${url.pathname}${url.search}${url.hash}`;\n return relativePath || '/';\n } catch {\n if (value.startsWith('/') && !value.startsWith('//')) return value;\n return null;\n }\n};\n\nconst LoginPage: React.FC = () => {\n const { t } = useTranslation();\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [socialLoading, setSocialLoading] = useState<SocialProvider | null>(null);\n const [socialError, setSocialError] = useState<string | null>(null);\n const [betterAuthBasePath, setBetterAuthBasePath] = useState<string | undefined>(undefined);\n const [socialProviders, setSocialProviders] = useState({\n google: false,\n github: false,\n oidc: false,\n });\n const [oidcProviderId, setOidcProviderId] = useState<string>('oidc');\n const [showDefaultPasswordWarning, setShowDefaultPasswordWarning] = useState(false);\n const { login, auth } = useAuth();\n const location = useLocation();\n const navigate = useNavigate();\n const returnUrl = useMemo(() => {\n const params = new URLSearchParams(location.search);\n return sanitizeReturnUrl(params.get('returnUrl'));\n }, [location.search]);\n\n const isServerUnavailableError = useCallback((message?: string) => {\n if (!message) return false;\n const normalized = message.toLowerCase();\n return (\n normalized.includes('failed to fetch') ||\n normalized.includes('networkerror') ||\n normalized.includes('network error') ||\n normalized.includes('connection refused') ||\n normalized.includes('unable to connect') ||\n normalized.includes('fetch error') ||\n normalized.includes('econnrefused') ||\n normalized.includes('http 500') ||\n normalized.includes('internal server error') ||\n normalized.includes('proxy error')\n );\n }, []);\n\n const buildRedirectTarget = useCallback(() => {\n if (!returnUrl) return '/';\n if (!returnUrl.startsWith('/oauth/authorize')) return returnUrl;\n const token = getToken();\n if (!token) return returnUrl;\n try {\n const origin = window.location.origin;\n const url = new URL(returnUrl, origin);\n url.searchParams.set('token', token);\n return `${url.pathname}${url.search}${url.hash}`;\n } catch {\n const separator = returnUrl.includes('?') ? '&' : '?';\n return `${returnUrl}${separator}token=${encodeURIComponent(token)}`;\n }\n }, [returnUrl]);\n\n const redirectAfterLogin = useCallback(() => {\n if (returnUrl) {\n window.location.assign(buildRedirectTarget());\n } else {\n navigate('/');\n }\n }, [buildRedirectTarget, navigate, returnUrl]);\n\n useEffect(() => {\n if (!auth.loading && auth.isAuthenticated) redirectAfterLogin();\n }, [auth.isAuthenticated, auth.loading, redirectAfterLogin]);\n\n useEffect(() => {\n const params = new URLSearchParams(location.search);\n const errorCode = params.get('error');\n if (errorCode) {\n const i18nKey = `auth.error.${errorCode}`;\n const translated = t(i18nKey);\n setSocialError(translated !== i18nKey ? translated : t('auth.socialLoginFailed'));\n }\n }, [location.search, t]);\n\n useEffect(() => {\n const loadAuthProviders = async () => {\n const publicConfig = await getPublicConfig();\n const betterAuth = publicConfig.betterAuth;\n if (!betterAuth?.enabled) {\n setSocialProviders({ google: false, github: false, oidc: false });\n return;\n }\n setBetterAuthBasePath(betterAuth.basePath);\n setOidcProviderId(betterAuth.providers?.oidc?.providerId || 'oidc');\n setSocialProviders({\n google: betterAuth.providers?.google?.enabled === true,\n github: betterAuth.providers?.github?.enabled === true,\n oidc: betterAuth.providers?.oidc?.enabled === true,\n });\n };\n loadAuthProviders();\n }, []);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSocialError(null);\n setLoading(true);\n try {\n if (!username || !password) {\n setError(t('auth.emptyFields'));\n setLoading(false);\n return;\n }\n const result = await login(username, password);\n if (result.success) {\n if (result.isUsingDefaultPassword) setShowDefaultPasswordWarning(true);\n else redirectAfterLogin();\n } else {\n const message = result.message;\n setError(isServerUnavailableError(message) ? t('auth.serverUnavailable') : t('auth.loginFailed'));\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : undefined;\n setError(isServerUnavailableError(message) ? t('auth.serverUnavailable') : t('auth.loginError'));\n } finally {\n setLoading(false);\n }\n };\n\n const handleSocialLogin = async (provider: SocialProvider) => {\n setSocialError(null);\n setSocialLoading(provider);\n try {\n if (provider === 'oidc') {\n await startOidcLogin({\n providerId: oidcProviderId,\n callbackURL: returnUrl || '/',\n errorCallbackURL: `${getBasePath()}/login`,\n basePathOverride: betterAuthBasePath,\n });\n return;\n }\n\n const client = createBetterAuthClient(betterAuthBasePath);\n await client.signIn.social({\n provider,\n callbackURL: returnUrl || '/',\n errorCallbackURL: `${getBasePath()}/login`,\n });\n } catch (err) {\n console.error('Social login error:', err);\n setSocialError(t('auth.socialLoginFailed'));\n setSocialLoading(null);\n }\n };\n\n const handleCloseWarning = () => {\n setShowDefaultPasswordWarning(false);\n redirectAfterLogin();\n };\n\n return (\n <div\n className=\"relative min-h-screen w-full overflow-hidden\"\n style={{ background: 'var(--hub-bg)', color: 'var(--hub-ink)' }}\n >\n {/* Top-right controls */}\n <div className=\"absolute top-3 right-4 z-20 flex items-center gap-1\">\n <a\n href=\"https://github.com/samanhappy/mcphub\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hub-icon-btn\"\n aria-label=\"GitHub Repository\"\n >\n <GitHubIcon className=\"h-4 w-4\" />\n </a>\n <a\n href=\"https://docs.mcphub.app\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hub-icon-btn\"\n aria-label=\"Documentation\"\n >\n <BookOpen className=\"h-4 w-4\" />\n </a>\n <ThemeSwitch />\n <LanguageSwitch />\n </div>\n\n {/* Subtle grid pattern (kept low-key, hair-line) */}\n <div className=\"pointer-events-none absolute inset-0 -z-10\">\n <svg\n className=\"h-full w-full\"\n style={{ opacity: 0.5 }}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <pattern id=\"grid\" width=\"32\" height=\"32\" patternUnits=\"userSpaceOnUse\">\n <path\n d=\"M 32 0 L 0 0 0 32\"\n fill=\"none\"\n stroke=\"var(--hub-line-2)\"\n strokeWidth=\"0.5\"\n />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n </svg>\n </div>\n\n <div className=\"relative mx-auto flex min-h-screen w-full max-w-md items-center justify-center px-6\">\n <div className=\"w-full space-y-8\">\n {/* Brand */}\n <div className=\"flex flex-col items-center gap-3\">\n <div\n className=\"relative grid place-items-center\"\n style={{\n width: 44,\n height: 44,\n borderRadius: 10,\n background: 'var(--hub-ink)',\n color: 'white',\n }}\n >\n <span className=\"hub-mono font-semibold\" style={{ fontSize: 18 }}>\n M\n </span>\n <span\n className=\"absolute\"\n style={{\n right: -2,\n bottom: -2,\n width: 8,\n height: 8,\n borderRadius: 50,\n background: 'var(--hub-ok)',\n boxShadow: '0 0 0 3px var(--hub-bg)',\n }}\n />\n </div>\n <div className=\"text-center\">\n <h1\n style={{\n fontSize: 20,\n fontWeight: 600,\n letterSpacing: '-0.02em',\n color: 'var(--hub-ink)',\n }}\n >\n {t('app.title')}\n </h1>\n <p className=\"hub-sub\" style={{ marginTop: 4 }}>\n {t('auth.slogan')}\n </p>\n </div>\n </div>\n\n {/* Login card */}\n <div\n className=\"hub-card\"\n style={{\n padding: '22px 22px 20px',\n boxShadow: '0 1px 2px rgba(0,0,0,0.02)',\n }}\n >\n <form className=\"space-y-3\" onSubmit={handleSubmit}>\n <div>\n <label\n htmlFor=\"username\"\n className=\"hub-sect block\"\n style={{ marginBottom: 6 }}\n >\n {t('auth.username')}\n </label>\n <input\n id=\"username\"\n name=\"username\"\n type=\"text\"\n autoComplete=\"username\"\n required\n className=\"hub-input\"\n placeholder={t('auth.username')}\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n />\n </div>\n <div>\n <label\n htmlFor=\"password\"\n className=\"hub-sect block\"\n style={{ marginBottom: 6 }}\n >\n {t('auth.password')}\n </label>\n <input\n id=\"password\"\n name=\"password\"\n type=\"password\"\n autoComplete=\"current-password\"\n required\n className=\"hub-input\"\n placeholder={t('auth.password')}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n </div>\n\n {error && (\n <div\n className=\"flex items-center gap-2\"\n style={{\n padding: '8px 10px',\n borderRadius: 7,\n border: '1px solid oklch(0.85 0.1 25)',\n background: 'oklch(0.97 0.03 25)',\n color: 'oklch(0.4 0.18 25)',\n fontSize: 12.5,\n }}\n >\n <AlertCircle size={13} className=\"flex-shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={loading}\n className=\"hub-btn primary w-full justify-center\"\n style={{ height: 34 }}\n >\n {loading ? t('auth.loggingIn') : t('auth.login')}\n </button>\n </form>\n\n {(socialProviders.google || socialProviders.github || socialProviders.oidc) && (\n <div className=\"mt-5 space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-px flex-1\" style={{ background: 'var(--hub-line)' }} />\n <span\n className=\"hub-sect\"\n style={{ textTransform: 'uppercase', letterSpacing: '0.08em' }}\n >\n {t('auth.orContinue')}\n </span>\n <div className=\"h-px flex-1\" style={{ background: 'var(--hub-line)' }} />\n </div>\n\n {socialError && (\n <div\n className=\"flex items-center gap-2\"\n style={{\n padding: '8px 10px',\n borderRadius: 7,\n border: '1px solid oklch(0.85 0.1 25)',\n background: 'oklch(0.97 0.03 25)',\n color: 'oklch(0.4 0.18 25)',\n fontSize: 12.5,\n }}\n >\n <AlertCircle size={13} className=\"flex-shrink-0\" />\n <span>{socialError}</span>\n </div>\n )}\n\n <div className=\"space-y-2\">\n {socialProviders.google && (\n <button\n type=\"button\"\n onClick={() => handleSocialLogin('google')}\n disabled={socialLoading !== null}\n className=\"hub-btn w-full justify-center\"\n style={{ height: 34 }}\n >\n {socialLoading === 'google'\n ? t('auth.loggingIn')\n : t('auth.loginWithGoogle')}\n </button>\n )}\n {socialProviders.github && (\n <button\n type=\"button\"\n onClick={() => handleSocialLogin('github')}\n disabled={socialLoading !== null}\n className=\"hub-btn w-full justify-center\"\n style={{\n height: 34,\n background: 'var(--hub-ink)',\n color: 'var(--hub-bg)',\n borderColor: 'var(--hub-ink)',\n }}\n >\n <GitHubIcon className=\"h-3.5 w-3.5\" />\n {socialLoading === 'github'\n ? t('auth.loggingIn')\n : t('auth.loginWithGithub')}\n </button>\n )}\n {socialProviders.oidc && (\n <button\n type=\"button\"\n onClick={() => handleSocialLogin('oidc')}\n disabled={socialLoading !== null}\n className=\"hub-btn w-full justify-center\"\n style={{ height: 34 }}\n >\n {socialLoading === 'oidc'\n ? t('auth.loggingIn')\n : t('auth.loginWithOIDC')}\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n\n <p\n className=\"text-center hub-mono\"\n style={{ fontSize: 11, color: 'var(--hub-ink-3)' }}\n >\n v{import.meta.env.PACKAGE_VERSION}\n </p>\n </div>\n </div>\n\n <DefaultPasswordWarningModal\n isOpen={showDefaultPasswordWarning}\n onClose={handleCloseWarning}\n />\n </div>\n );\n};\n\nexport default LoginPage;\n"],"names":["DefaultPasswordWarningModal","isOpen","onClose","t","useTranslation","navigate","useNavigate","handleGoToSettings","passwordSection","clickTarget","handleBackdropClick","e","handleKeyDown","jsx","jsxs","sanitizeReturnUrl","value","origin","url","LoginPage","username","setUsername","useState","password","setPassword","error","setError","loading","setLoading","socialLoading","setSocialLoading","socialError","setSocialError","betterAuthBasePath","setBetterAuthBasePath","socialProviders","setSocialProviders","oidcProviderId","setOidcProviderId","showDefaultPasswordWarning","setShowDefaultPasswordWarning","login","auth","useAuth","location","useLocation","returnUrl","useMemo","params","isServerUnavailableError","useCallback","message","normalized","buildRedirectTarget","token","getToken","separator","redirectAfterLogin","useEffect","errorCode","i18nKey","translated","betterAuth","getPublicConfig","_b","_a","_d","_c","_f","_e","_h","_g","handleSubmit","result","err","handleSocialLogin","provider","startOidcLogin","getBasePath","createBetterAuthClient","handleCloseWarning","GitHubIcon","BookOpen","ThemeSwitch","LanguageSwitch","AlertCircle"],"mappings":"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"}