@samanhappy/mcphub 1.2.0 → 1.2.2
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.
- package/README.md +5 -0
- package/dist/constants/oauthServerDefaults.js +2 -0
- package/dist/constants/oauthServerDefaults.js.map +1 -1
- package/dist/controllers/configController.js +2 -0
- package/dist/controllers/configController.js.map +1 -1
- package/dist/controllers/credentialBindingController.js +30 -1
- package/dist/controllers/credentialBindingController.js.map +1 -1
- package/dist/controllers/oauthApprovalController.js +63 -0
- package/dist/controllers/oauthApprovalController.js.map +1 -0
- package/dist/controllers/oauthServerController.js +55 -20
- package/dist/controllers/oauthServerController.js.map +1 -1
- package/dist/controllers/serverController.js +83 -27
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/dao/DaoFactory.js +7 -0
- package/dist/dao/DaoFactory.js.map +1 -1
- package/dist/dao/DatabaseDaoFactory.js +4 -0
- package/dist/dao/DatabaseDaoFactory.js.map +1 -1
- package/dist/dao/OAuthApprovalDao.js +52 -0
- package/dist/dao/OAuthApprovalDao.js.map +1 -0
- package/dist/dao/OAuthApprovalDaoDbImpl.js +26 -0
- package/dist/dao/OAuthApprovalDaoDbImpl.js.map +1 -0
- package/dist/dao/OAuthTokenDaoDbImpl.js +2 -0
- package/dist/dao/OAuthTokenDaoDbImpl.js.map +1 -1
- package/dist/dao/index.js +1 -0
- package/dist/dao/index.js.map +1 -1
- package/dist/db/entities/OAuthApproval.js +58 -0
- package/dist/db/entities/OAuthApproval.js.map +1 -0
- package/dist/db/entities/OAuthToken.js +4 -0
- package/dist/db/entities/OAuthToken.js.map +1 -1
- package/dist/db/entities/SystemConfig.js.map +1 -1
- package/dist/db/entities/index.js +3 -1
- package/dist/db/entities/index.js.map +1 -1
- package/dist/middlewares/auth.js +2 -2
- package/dist/middlewares/auth.js.map +1 -1
- package/dist/middlewares/userContext.js +26 -5
- package/dist/middlewares/userContext.js.map +1 -1
- package/dist/models/OAuth.js +19 -3
- package/dist/models/OAuth.js.map +1 -1
- package/dist/routes/index.js +6 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/services/credentialBindingService.js +39 -3
- package/dist/services/credentialBindingService.js.map +1 -1
- package/dist/services/forwardAuthService.js +27 -11
- package/dist/services/forwardAuthService.js.map +1 -1
- package/dist/services/mcpService.js +3 -3
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/oauthApprovalService.js +74 -0
- package/dist/services/oauthApprovalService.js.map +1 -0
- package/dist/services/oauthClientRegistration.js +9 -4
- package/dist/services/oauthClientRegistration.js.map +1 -1
- package/dist/services/oauthServerService.js +24 -7
- package/dist/services/oauthServerService.js.map +1 -1
- package/dist/services/openApiGeneratorService.js +10 -3
- package/dist/services/openApiGeneratorService.js.map +1 -1
- package/dist/services/sseService.js +16 -6
- package/dist/services/sseService.js.map +1 -1
- package/dist/services/userService.js +2 -0
- package/dist/services/userService.js.map +1 -1
- package/dist/services/vectorSearchService.js +139 -73
- package/dist/services/vectorSearchService.js.map +1 -1
- package/dist/types/network.js +2 -0
- package/dist/types/network.js.map +1 -0
- package/dist/utils/bearerAuth.js +23 -0
- package/dist/utils/bearerAuth.js.map +1 -1
- package/dist/utils/migration.js +1 -0
- package/dist/utils/migration.js.map +1 -1
- package/dist/utils/openApiSchema.js +148 -0
- package/dist/utils/openApiSchema.js.map +1 -0
- package/dist/utils/parameterConversion.js +38 -5
- package/dist/utils/parameterConversion.js.map +1 -1
- package/dist/utils/passthroughHeaders.js +9 -4
- package/dist/utils/passthroughHeaders.js.map +1 -1
- package/dist/utils/ssrf.js +46 -12
- package/dist/utils/ssrf.js.map +1 -1
- package/frontend/dist/assets/{ActivityPage-CSXEpl6y.js → ActivityPage-CB41zWix.js} +2 -2
- package/frontend/dist/assets/{ActivityPage-CSXEpl6y.js.map → ActivityPage-CB41zWix.js.map} +1 -1
- package/frontend/dist/assets/{ConfirmDialog-BJpzQmMw.js → ConfirmDialog-ByWCtrIw.js} +2 -2
- package/frontend/dist/assets/{ConfirmDialog-BJpzQmMw.js.map → ConfirmDialog-ByWCtrIw.js.map} +1 -1
- package/frontend/dist/assets/CredentialsPage-BecFRfro.js +2 -0
- package/frontend/dist/assets/CredentialsPage-BecFRfro.js.map +1 -0
- package/frontend/dist/assets/{Dashboard-Da-YT_l_.js → Dashboard-CwifBwm4.js} +2 -2
- package/frontend/dist/assets/{Dashboard-Da-YT_l_.js.map → Dashboard-CwifBwm4.js.map} +1 -1
- package/frontend/dist/assets/{DeleteDialog-BoMYLx3J.js → DeleteDialog-BkEKW9LB.js} +2 -2
- package/frontend/dist/assets/{DeleteDialog-BoMYLx3J.js.map → DeleteDialog-BkEKW9LB.js.map} +1 -1
- package/frontend/dist/assets/{EndpointCopy-CZOjiFAH.js → EndpointCopy-BeLf_ow_.js} +2 -2
- package/frontend/dist/assets/{EndpointCopy-CZOjiFAH.js.map → EndpointCopy-BeLf_ow_.js.map} +1 -1
- package/frontend/dist/assets/{GroupsPage-CSA5G9_H.js → GroupsPage-DLL1tFj8.js} +2 -2
- package/frontend/dist/assets/{GroupsPage-CSA5G9_H.js.map → GroupsPage-DLL1tFj8.js.map} +1 -1
- package/frontend/dist/assets/{LoginPage-7RswUPtG.js → LoginPage-DvHL1HNV.js} +2 -2
- package/frontend/dist/assets/{LoginPage-7RswUPtG.js.map → LoginPage-DvHL1HNV.js.map} +1 -1
- package/frontend/dist/assets/{LogsPage-Dbef_68F.js → LogsPage-Bva6Y11K.js} +2 -2
- package/frontend/dist/assets/{LogsPage-Dbef_68F.js.map → LogsPage-Bva6Y11K.js.map} +1 -1
- package/frontend/dist/assets/{MarketPage-rSBdHZxo.js → MarketPage-DGxNuifk.js} +2 -2
- package/frontend/dist/assets/{MarketPage-rSBdHZxo.js.map → MarketPage-DGxNuifk.js.map} +1 -1
- package/frontend/dist/assets/OAuthApprovalsPage-TzVNIJ27.js +2 -0
- package/frontend/dist/assets/OAuthApprovalsPage-TzVNIJ27.js.map +1 -0
- package/frontend/dist/assets/{OAuthConsentPage-BH9O7bk3.js → OAuthConsentPage-yQSgIbZ8.js} +2 -2
- package/frontend/dist/assets/{OAuthConsentPage-BH9O7bk3.js.map → OAuthConsentPage-yQSgIbZ8.js.map} +1 -1
- package/frontend/dist/assets/{Pagination-S-7lzy59.js → Pagination-B2WW4qn_.js} +2 -2
- package/frontend/dist/assets/{Pagination-S-7lzy59.js.map → Pagination-B2WW4qn_.js.map} +1 -1
- package/frontend/dist/assets/{PromptsPage-B558MhVU.js → PromptsPage-CIAVpo9B.js} +2 -2
- package/frontend/dist/assets/{PromptsPage-B558MhVU.js.map → PromptsPage-CIAVpo9B.js.map} +1 -1
- package/frontend/dist/assets/{ResourcesPage-DQpy8B9L.js → ResourcesPage-C5g-98tB.js} +2 -2
- package/frontend/dist/assets/{ResourcesPage-DQpy8B9L.js.map → ResourcesPage-C5g-98tB.js.map} +1 -1
- package/frontend/dist/assets/{ServersPage-DBcC8pG2.js → ServersPage-CJEgBQr-.js} +4 -4
- package/frontend/dist/assets/{ServersPage-DBcC8pG2.js.map → ServersPage-CJEgBQr-.js.map} +1 -1
- package/frontend/dist/assets/SettingsPage-Bub-g0mD.js +14 -0
- package/frontend/dist/assets/SettingsPage-Bub-g0mD.js.map +1 -0
- package/frontend/dist/assets/{StatusDot-CLxRrJ5l.js → StatusDot-B81gkUBo.js} +2 -2
- package/frontend/dist/assets/{StatusDot-CLxRrJ5l.js.map → StatusDot-B81gkUBo.js.map} +1 -1
- package/frontend/dist/assets/{ToggleGroup-DuWJZU41.js → ToggleGroup-DZ39486g.js} +2 -2
- package/frontend/dist/assets/{ToggleGroup-DuWJZU41.js.map → ToggleGroup-DZ39486g.js.map} +1 -1
- package/frontend/dist/assets/{UserGroupSelection-CN0weGXJ.js → UserGroupSelection-DionUENR.js} +2 -2
- package/frontend/dist/assets/{UserGroupSelection-CN0weGXJ.js.map → UserGroupSelection-DionUENR.js.map} +1 -1
- package/frontend/dist/assets/{UsersPage-B158Bofs.js → UsersPage-pdkVxTsL.js} +2 -2
- package/frontend/dist/assets/{UsersPage-B158Bofs.js.map → UsersPage-pdkVxTsL.js.map} +1 -1
- package/frontend/dist/assets/{clipboard-BLr_gbf8.js → clipboard-BYlVdxdy.js} +2 -2
- package/frontend/dist/assets/{clipboard-BLr_gbf8.js.map → clipboard-BYlVdxdy.js.map} +1 -1
- package/frontend/dist/assets/{costRevision-Dzec2k_b.js → costRevision-D-WY0B73.js} +2 -2
- package/frontend/dist/assets/{costRevision-Dzec2k_b.js.map → costRevision-D-WY0B73.js.map} +1 -1
- package/frontend/dist/assets/{i18n-vendor-COTriSc6.js → i18n-vendor-CPneThYa.js} +3 -3
- package/frontend/dist/assets/{i18n-vendor-COTriSc6.js.map → i18n-vendor-CPneThYa.js.map} +1 -1
- package/frontend/dist/assets/index-CyD60EHI.css +1 -0
- package/frontend/dist/assets/index-DKX_BExz.js +3 -0
- package/frontend/dist/assets/index-DKX_BExz.js.map +1 -0
- package/frontend/dist/assets/{resourceService-BNH7uNar.js → resourceService-CKAaXBkJ.js} +2 -2
- package/frontend/dist/assets/{resourceService-BNH7uNar.js.map → resourceService-CKAaXBkJ.js.map} +1 -1
- package/frontend/dist/assets/{useCostData-B2d2eLCD.js → useCostData-DzjFGnw4.js} +2 -2
- package/frontend/dist/assets/{useCostData-B2d2eLCD.js.map → useCostData-DzjFGnw4.js.map} +1 -1
- package/frontend/dist/assets/{variableDetection-DRdE941j.js → variableDetection-D75LR7nZ.js} +2 -2
- package/frontend/dist/assets/{variableDetection-DRdE941j.js.map → variableDetection-D75LR7nZ.js.map} +1 -1
- package/frontend/dist/index.html +3 -3
- package/mcp_settings.json +2 -0
- package/package.json +4 -4
- package/frontend/dist/assets/CredentialsPage-CPxOHQUZ.js +0 -2
- package/frontend/dist/assets/CredentialsPage-CPxOHQUZ.js.map +0 -1
- package/frontend/dist/assets/SettingsPage-BcpeHFR3.js +0 -14
- package/frontend/dist/assets/SettingsPage-BcpeHFR3.js.map +0 -1
- package/frontend/dist/assets/index-CGRjM_NC.js +0 -3
- package/frontend/dist/assets/index-CGRjM_NC.js.map +0 -1
- package/frontend/dist/assets/index-DrHctFvx.css +0 -1
package/frontend/dist/index.html
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
7
|
<title>MCPHub Dashboard</title>
|
|
8
8
|
<link rel="icon" type="image/x-icon" href="./assets/favicon-DJnZjsC8.ico">
|
|
9
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
+
<script type="module" crossorigin src="./assets/index-DKX_BExz.js"></script>
|
|
10
10
|
<link rel="modulepreload" crossorigin href="./assets/framework-vendor-D0S_ys6r.js">
|
|
11
|
-
<link rel="modulepreload" crossorigin href="./assets/i18n-vendor-
|
|
11
|
+
<link rel="modulepreload" crossorigin href="./assets/i18n-vendor-CPneThYa.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/icons-vendor-DZjjGrOu.js">
|
|
13
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
13
|
+
<link rel="stylesheet" crossorigin href="./assets/index-CyD60EHI.css">
|
|
14
14
|
</head>
|
|
15
15
|
|
|
16
16
|
<body class="bg-gray-100">
|
package/mcp_settings.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@samanhappy/mcphub",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "Open-source, self-hosted MCP gateway and control plane for connecting, controlling, and operating MCP servers.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@apidevtools/swagger-parser": "^12.1.0",
|
|
29
29
|
"@google/genai": "^1.44.0",
|
|
30
|
-
"@huggingface/tokenizers": "^0.
|
|
30
|
+
"@huggingface/tokenizers": "^0.2.0",
|
|
31
31
|
"@modelcontextprotocol/client": "2.1.0",
|
|
32
32
|
"@modelcontextprotocol/node": "^2.1.0",
|
|
33
33
|
"@modelcontextprotocol/server": "^2.1.0",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"jsonwebtoken": "^9.0.2",
|
|
62
62
|
"kysely": "^0.28.9",
|
|
63
63
|
"multer": "^2.2.0",
|
|
64
|
-
"openai": "^
|
|
64
|
+
"openai": "^7.45.1",
|
|
65
65
|
"openapi-types": "^12.1.3",
|
|
66
66
|
"openid-client": "^6.8.1",
|
|
67
67
|
"pg": "^8.16.3",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"autoprefixer": "^10.4.21",
|
|
108
108
|
"class-variance-authority": "^0.7.1",
|
|
109
109
|
"clsx": "^2.1.1",
|
|
110
|
-
"concurrently": "^
|
|
110
|
+
"concurrently": "^10.0.6",
|
|
111
111
|
"esbuild": "0.27.2",
|
|
112
112
|
"eslint": "^10.9.1",
|
|
113
113
|
"globals": "^17.8.0",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as b,r as i,j as s}from"./framework-vendor-D0S_ys6r.js";import{a as g,h as N,i as w,j as y}from"./index-CGRjM_NC.js";import{u as f}from"./i18n-vendor-COTriSc6.js";import"./icons-vendor-DZjjGrOu.js";const C=({binding:a,baseUrl:n,onChange:m})=>{const{t:l}=f(),[o,h]=i.useState({}),[x,v]=i.useState(!1),[c,d]=i.useState(""),u=async t=>{v(!0),d("");try{const e=`${n}/${encodeURIComponent(a.serverName)}`,r=t?await w(e):await y(e,{values:o});if(!r.success)throw new Error(r.message||l("credentials.failed"));h({}),d(l(t?"credentials.deleted":"credentials.saved")),await m()}catch(e){d(e instanceof Error?e.message:l("credentials.failed"))}finally{v(!1)}};return s.jsxs("form",{className:"hub-card p-5 space-y-4",onSubmit:t=>{t.preventDefault(),u(!1)},children:[s.jsxs("div",{className:"flex items-center justify-between gap-3",children:[s.jsx("h2",{className:"font-semibold",children:a.serverName}),s.jsx("span",{className:"hub-tag",children:l(a.configured?"credentials.configured":"credentials.required")})]}),s.jsx("p",{className:"text-sm text-[var(--hub-ink-3)]",children:l(a.valuePreviews?"credentials.previewNotice":"credentials.writeOnly")}),a.updatedAt&&s.jsxs("p",{className:"text-xs text-[var(--hub-ink-3)]",children:[l("credentials.updatedAt"),": ",new Date(a.updatedAt).toLocaleString()]}),a.credentialTemplate.map(t=>{var r,j;const e=`${t.target}.${t.name}`;return s.jsxs("label",{className:"block space-y-1 text-sm",children:[s.jsxs("span",{className:"font-medium",children:[t.label||t.name," ",s.jsxs("span",{className:"hub-mono text-xs font-normal text-[var(--hub-ink-3)]",children:["(",e,")"]})]}),((r=a.valuePreviews)==null?void 0:r[e])&&s.jsxs("span",{className:"block text-xs text-[var(--hub-ink-3)]",children:[l("credentials.savedValue"),":"," ",s.jsx("span",{className:"hub-mono",children:a.valuePreviews[e]})]}),t.target==="url"?s.jsxs("select",{required:!0,className:"hub-input",value:o[e]||"",onChange:p=>h({...o,[e]:p.target.value}),children:[s.jsx("option",{value:"",children:l("credentials.enterValue")}),(j=t.allowed)==null?void 0:j.map(p=>s.jsx("option",{value:p,children:p},p))]}):s.jsx("input",{type:"password",required:!0,autoComplete:"new-password",maxLength:16384,value:o[e]||"",placeholder:l(a.configuredSlots.includes(e)?"credentials.replaceValue":"credentials.enterValue"),className:"hub-input",onChange:p=>h({...o,[e]:p.target.value})})]},e)}),s.jsxs("div",{className:"flex flex-wrap gap-2",children:[s.jsx("button",{type:"submit",className:"hub-btn primary",disabled:x,children:l("credentials.save")}),s.jsx("button",{type:"button",className:"hub-btn danger",disabled:x||!a.updatedAt,onClick:()=>void u(!0),children:l("credentials.delete")})]}),c&&s.jsx("p",{role:"status",className:"text-sm text-[var(--hub-ink-2)]",children:c})]})};function S({baseUrl:a}){const{t:n}=f(),[m,l]=b(),[o,h]=i.useState([]),[x,v]=i.useState(!0),[c,d]=i.useState(""),u=i.useCallback(async()=>{try{const e=await N(a);if(!e.success)throw new Error(e.message||n("credentials.failed"));h(e.data||[]),d("")}catch(e){d(e instanceof Error?e.message:n("credentials.failed"))}finally{v(!1)}},[a,n]);i.useEffect(()=>{u()},[u]);const t=o.filter(e=>!m.get("server")||e.serverName===m.get("server"));return s.jsxs("div",{className:"max-w-4xl mx-auto space-y-5",children:[s.jsxs("div",{children:[s.jsx("h1",{className:"hub-h1",children:n("credentials.title")}),s.jsx("p",{className:"hub-sub",children:n("credentials.description")})]}),m.has("server")&&s.jsx("button",{className:"hub-btn",onClick:()=>l(e=>(e.delete("server"),e)),children:n("credentials.showAll")}),c&&s.jsx("div",{className:"hub-card px-4 py-3 text-sm",style:{color:"var(--hub-err)"},role:"alert",children:c}),x?s.jsx("div",{className:"hub-card p-10 text-center text-sm",style:{color:"var(--hub-ink-3)"},children:n("credentials.loading")}):!t.length&&!c?s.jsx("div",{className:"hub-card p-10 text-center text-sm",style:{color:"var(--hub-ink-3)"},children:n("credentials.empty")}):null,t.map(e=>s.jsx(C,{binding:e,baseUrl:a,onChange:u},e.serverName))]})}function V(){var t;const{t:a}=f(),{auth:n}=g(),[m,l]=b(),[o,h]=i.useState([]),[x,v]=i.useState(""),c=!!((t=n.user)!=null&&t.isAdmin),d=c&&m.get("user")||"",u=d?`/users/${encodeURIComponent(d)}/credentials`:"/credentials";return i.useEffect(()=>{if(!c)return;let e=!0;return N("/users").then(r=>{if(e){if(!r.success)throw new Error(r.message||a("credentials.failed"));h(r.data||[])}}).catch(r=>{e&&v(r instanceof Error?r.message:a("credentials.failed"))}),()=>{e=!1}},[c,a]),s.jsxs("div",{className:"space-y-5",children:[c&&s.jsxs("div",{className:"max-w-4xl mx-auto",children:[s.jsxs("label",{className:"block space-y-1 text-sm",children:[s.jsx("span",{children:a("credentials.targetUser")}),s.jsxs("select",{className:"hub-input",value:d,onChange:e=>l(r=>(e.target.value?r.set("user",e.target.value):r.delete("user"),r)),children:[s.jsx("option",{value:"",children:a("credentials.myCredentials")}),o.map(e=>s.jsx("option",{value:e.username,children:e.username},e.username))]})]}),x&&s.jsx("p",{role:"alert",children:x})]}),s.jsx(S,{baseUrl:u},u)]})}export{V as default};
|
|
2
|
-
//# sourceMappingURL=CredentialsPage-CPxOHQUZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialsPage-CPxOHQUZ.js","sources":["../../src/pages/CredentialsPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useSearchParams } from 'react-router-dom';\nimport { useAuth } from '../contexts/AuthContext';\nimport type { User, MyCredentialBinding } from '../types';\nimport { apiDelete, apiGet, apiPut, type ApiResponse } from '../utils/fetchInterceptor';\n\nconst CredentialForm = ({\n binding,\n baseUrl,\n onChange,\n}: {\n binding: MyCredentialBinding;\n baseUrl: string;\n onChange: () => Promise<void>;\n}) => {\n const { t } = useTranslation();\n const [values, setValues] = useState<Record<string, string>>({});\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState('');\n const save = async (remove: boolean) => {\n setBusy(true);\n setMessage('');\n try {\n const url = `${baseUrl}/${encodeURIComponent(binding.serverName)}`;\n const result = remove\n ? await apiDelete<ApiResponse>(url)\n : await apiPut<ApiResponse>(url, { values });\n if (!result.success) throw new Error(result.message || t('credentials.failed'));\n setValues({});\n setMessage(t(remove ? 'credentials.deleted' : 'credentials.saved'));\n await onChange();\n } catch (error) {\n setMessage(error instanceof Error ? error.message : t('credentials.failed'));\n } finally {\n setBusy(false);\n }\n };\n return (\n <form\n className=\"hub-card p-5 space-y-4\"\n onSubmit={(event) => {\n event.preventDefault();\n void save(false);\n }}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"font-semibold\">{binding.serverName}</h2>\n <span className=\"hub-tag\">\n {t(binding.configured ? 'credentials.configured' : 'credentials.required')}\n </span>\n </div>\n <p className=\"text-sm text-[var(--hub-ink-3)]\">\n {t(binding.valuePreviews ? 'credentials.previewNotice' : 'credentials.writeOnly')}\n </p>\n {binding.updatedAt && (\n <p className=\"text-xs text-[var(--hub-ink-3)]\">\n {t('credentials.updatedAt')}: {new Date(binding.updatedAt).toLocaleString()}\n </p>\n )}\n {binding.credentialTemplate.map((slot) => {\n const id = `${slot.target}.${slot.name}`;\n return (\n <label key={id} className=\"block space-y-1 text-sm\">\n <span className=\"font-medium\">\n {slot.label || slot.name}{' '}\n <span className=\"hub-mono text-xs font-normal text-[var(--hub-ink-3)]\">({id})</span>\n </span>\n {binding.valuePreviews?.[id] && (\n <span className=\"block text-xs text-[var(--hub-ink-3)]\">\n {t('credentials.savedValue')}:{' '}\n <span className=\"hub-mono\">{binding.valuePreviews[id]}</span>\n </span>\n )}\n {slot.target === 'url' ? (\n <select\n required\n className=\"hub-input\"\n value={values[id] || ''}\n onChange={(event) => setValues({ ...values, [id]: event.target.value })}\n >\n <option value=\"\">{t('credentials.enterValue')}</option>\n {slot.allowed?.map((value) => (\n <option key={value} value={value}>\n {value}\n </option>\n ))}\n </select>\n ) : (\n <input\n type=\"password\"\n required\n autoComplete=\"new-password\"\n maxLength={16384}\n value={values[id] || ''}\n placeholder={t(\n binding.configuredSlots.includes(id)\n ? 'credentials.replaceValue'\n : 'credentials.enterValue',\n )}\n className=\"hub-input\"\n onChange={(event) => setValues({ ...values, [id]: event.target.value })}\n />\n )}\n </label>\n );\n })}\n <div className=\"flex flex-wrap gap-2\">\n <button type=\"submit\" className=\"hub-btn primary\" disabled={busy}>\n {t('credentials.save')}\n </button>\n <button\n type=\"button\"\n className=\"hub-btn danger\"\n disabled={busy || !binding.updatedAt}\n onClick={() => void save(true)}\n >\n {t('credentials.delete')}\n </button>\n </div>\n {message && (\n <p role=\"status\" className=\"text-sm text-[var(--hub-ink-2)]\">\n {message}\n </p>\n )}\n </form>\n );\n};\n\nfunction CredentialList({ baseUrl }: { baseUrl: string }) {\n const { t } = useTranslation();\n const [search, setSearch] = useSearchParams();\n const [bindings, setBindings] = useState<MyCredentialBinding[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const reload = useCallback(async () => {\n try {\n const result = await apiGet<ApiResponse<MyCredentialBinding[]>>(baseUrl);\n if (!result.success) throw new Error(result.message || t('credentials.failed'));\n setBindings(result.data || []);\n setError('');\n } catch (error) {\n setError(error instanceof Error ? error.message : t('credentials.failed'));\n } finally {\n setLoading(false);\n }\n }, [baseUrl, t]);\n useEffect(() => {\n void reload();\n }, [reload]);\n const visible = bindings.filter(\n (binding) => !search.get('server') || binding.serverName === search.get('server'),\n );\n return (\n <div className=\"max-w-4xl mx-auto space-y-5\">\n <div>\n <h1 className=\"hub-h1\">{t('credentials.title')}</h1>\n <p className=\"hub-sub\">{t('credentials.description')}</p>\n </div>\n {search.has('server') && (\n <button\n className=\"hub-btn\"\n onClick={() =>\n setSearch((params) => {\n params.delete('server');\n return params;\n })\n }\n >\n {t('credentials.showAll')}\n </button>\n )}\n {error && (\n <div\n className=\"hub-card px-4 py-3 text-sm\"\n style={{ color: 'var(--hub-err)' }}\n role=\"alert\"\n >\n {error}\n </div>\n )}\n {loading ? (\n <div className=\"hub-card p-10 text-center text-sm\" style={{ color: 'var(--hub-ink-3)' }}>\n {t('credentials.loading')}\n </div>\n ) : !visible.length && !error ? (\n <div className=\"hub-card p-10 text-center text-sm\" style={{ color: 'var(--hub-ink-3)' }}>\n {t('credentials.empty')}\n </div>\n ) : null}\n {visible.map((binding) => (\n <CredentialForm\n key={binding.serverName}\n binding={binding}\n baseUrl={baseUrl}\n onChange={reload}\n />\n ))}\n </div>\n );\n}\n\nexport default function CredentialsPage() {\n const { t } = useTranslation();\n const { auth } = useAuth();\n const [search, setSearch] = useSearchParams();\n const [users, setUsers] = useState<User[]>([]);\n const [error, setError] = useState('');\n const admin = Boolean(auth.user?.isAdmin);\n const username = admin ? search.get('user') || '' : '';\n const baseUrl = username ? `/users/${encodeURIComponent(username)}/credentials` : '/credentials';\n useEffect(() => {\n if (!admin) return;\n let active = true;\n void apiGet<ApiResponse<User[]>>('/users')\n .then((result) => {\n if (!active) return;\n if (!result.success) throw new Error(result.message || t('credentials.failed'));\n setUsers(result.data || []);\n })\n .catch((error: unknown) => {\n if (active) setError(error instanceof Error ? error.message : t('credentials.failed'));\n });\n return () => {\n active = false;\n };\n }, [admin, t]);\n return (\n <div className=\"space-y-5\">\n {admin && (\n <div className=\"max-w-4xl mx-auto\">\n <label className=\"block space-y-1 text-sm\">\n <span>{t('credentials.targetUser')}</span>\n <select\n className=\"hub-input\"\n value={username}\n onChange={(event) =>\n setSearch((params) => {\n if (event.target.value) params.set('user', event.target.value);\n else params.delete('user');\n return params;\n })\n }\n >\n <option value=\"\">{t('credentials.myCredentials')}</option>\n {users.map((user) => (\n <option key={user.username} value={user.username}>\n {user.username}\n </option>\n ))}\n </select>\n </label>\n {error && <p role=\"alert\">{error}</p>}\n </div>\n )}\n <CredentialList key={baseUrl} baseUrl={baseUrl} />\n </div>\n );\n}\n"],"names":["CredentialForm","binding","baseUrl","onChange","t","useTranslation","values","setValues","useState","busy","setBusy","message","setMessage","save","remove","url","result","apiDelete","apiPut","error","jsxs","event","jsx","slot","id","_a","_b","value","CredentialList","search","setSearch","useSearchParams","bindings","setBindings","loading","setLoading","setError","reload","useCallback","apiGet","useEffect","visible","params","CredentialsPage","auth","useAuth","users","setUsers","admin","username","active","user"],"mappings":"+MAOA,MAAMA,EAAiB,CAAC,CACtB,QAAAC,EACA,QAAAC,EACA,SAAAC,CACF,IAIM,CACJ,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAA,EACR,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAiC,CAAA,CAAE,EACzD,CAACC,EAAMC,CAAO,EAAIF,EAAAA,SAAS,EAAK,EAChC,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAS,EAAE,EACnCK,EAAO,MAAOC,GAAoB,CACtCJ,EAAQ,EAAI,EACZE,EAAW,EAAE,EACb,GAAI,CACF,MAAMG,EAAM,GAAGb,CAAO,IAAI,mBAAmBD,EAAQ,UAAU,CAAC,GAC1De,EAASF,EACX,MAAMG,EAAuBF,CAAG,EAChC,MAAMG,EAAoBH,EAAK,CAAE,OAAAT,EAAQ,EAC7C,GAAI,CAACU,EAAO,QAAS,MAAM,IAAI,MAAMA,EAAO,SAAWZ,EAAE,oBAAoB,CAAC,EAC9EG,EAAU,CAAA,CAAE,EACZK,EAAWR,EAAEU,EAAS,sBAAwB,mBAAmB,CAAC,EAClE,MAAMX,EAAA,CACR,OAASgB,EAAO,CACdP,EAAWO,aAAiB,MAAQA,EAAM,QAAUf,EAAE,oBAAoB,CAAC,CAC7E,QAAA,CACEM,EAAQ,EAAK,CACf,CACF,EACA,OACEU,EAAAA,KAAC,OAAA,CACC,UAAU,yBACV,SAAWC,GAAU,CACnBA,EAAM,eAAA,EACDR,EAAK,EAAK,CACjB,EAEA,SAAA,CAAAO,EAAAA,KAAC,MAAA,CAAI,UAAU,0CACb,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,gBAAiB,SAAArB,EAAQ,WAAW,EAClDqB,EAAAA,IAAC,QAAK,UAAU,UACb,WAAErB,EAAQ,WAAa,yBAA2B,sBAAsB,CAAA,CAC3E,CAAA,EACF,EACAqB,EAAAA,IAAC,KAAE,UAAU,kCACV,WAAErB,EAAQ,cAAgB,4BAA8B,uBAAuB,CAAA,CAClF,EACCA,EAAQ,WACPmB,OAAC,IAAA,CAAE,UAAU,kCACV,SAAA,CAAAhB,EAAE,uBAAuB,EAAE,KAAG,IAAI,KAAKH,EAAQ,SAAS,EAAE,eAAA,CAAe,EAC5E,EAEDA,EAAQ,mBAAmB,IAAKsB,GAAS,SACxC,MAAMC,EAAK,GAAGD,EAAK,MAAM,IAAIA,EAAK,IAAI,GACtC,OACEH,EAAAA,KAAC,QAAA,CAAe,UAAU,0BACxB,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,cACb,SAAA,CAAAG,EAAK,OAASA,EAAK,KAAM,IAC1BH,EAAAA,KAAC,OAAA,CAAK,UAAU,uDAAuD,SAAA,CAAA,IAAEI,EAAG,GAAA,CAAA,CAAC,CAAA,EAC/E,IACCC,EAAAxB,EAAQ,gBAAR,YAAAwB,EAAwBD,KACvBJ,EAAAA,KAAC,OAAA,CAAK,UAAU,wCACb,SAAA,CAAAhB,EAAE,wBAAwB,EAAE,IAAE,UAC9B,OAAA,CAAK,UAAU,WAAY,SAAAH,EAAQ,cAAcuB,CAAE,CAAA,CAAE,CAAA,EACxD,EAEDD,EAAK,SAAW,MACfH,EAAAA,KAAC,SAAA,CACC,SAAQ,GACR,UAAU,YACV,MAAOd,EAAOkB,CAAE,GAAK,GACrB,SAAWH,GAAUd,EAAU,CAAE,GAAGD,EAAQ,CAACkB,CAAE,EAAGH,EAAM,OAAO,MAAO,EAEtE,SAAA,CAAAC,MAAC,SAAA,CAAO,MAAM,GAAI,SAAAlB,EAAE,wBAAwB,EAAE,GAC7CsB,EAAAH,EAAK,UAAL,YAAAG,EAAc,IAAKC,SACjB,SAAA,CAAmB,MAAAA,EACjB,SAAAA,CAAA,EADUA,CAEb,EACD,CAAA,CAAA,EAGHL,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,SAAQ,GACR,aAAa,eACb,UAAW,MACX,MAAOhB,EAAOkB,CAAE,GAAK,GACrB,YAAapB,EACXH,EAAQ,gBAAgB,SAASuB,CAAE,EAC/B,2BACA,wBAAA,EAEN,UAAU,YACV,SAAWH,GAAUd,EAAU,CAAE,GAAGD,EAAQ,CAACkB,CAAE,EAAGH,EAAM,OAAO,MAAO,CAAA,CAAA,CACxE,CAAA,EAvCQG,CAyCZ,CAEJ,CAAC,EACDJ,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAE,EAAAA,IAAC,SAAA,CAAO,KAAK,SAAS,UAAU,kBAAkB,SAAUb,EACzD,SAAAL,EAAE,kBAAkB,CAAA,CACvB,EACAkB,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,iBACV,SAAUb,GAAQ,CAACR,EAAQ,UAC3B,QAAS,IAAM,KAAKY,EAAK,EAAI,EAE5B,WAAE,oBAAoB,CAAA,CAAA,CACzB,EACF,EACCF,GACCW,EAAAA,IAAC,IAAA,CAAE,KAAK,SAAS,UAAU,kCACxB,SAAAX,CAAA,CACH,CAAA,CAAA,CAAA,CAIR,EAEA,SAASiB,EAAe,CAAE,QAAA1B,GAAgC,CACxD,KAAM,CAAE,EAAAE,CAAA,EAAMC,EAAA,EACR,CAACwB,EAAQC,CAAS,EAAIC,EAAA,EACtB,CAACC,EAAUC,CAAW,EAAIzB,EAAAA,SAAgC,CAAA,CAAE,EAC5D,CAAC0B,EAASC,CAAU,EAAI3B,EAAAA,SAAS,EAAI,EACrC,CAACW,EAAOiB,CAAQ,EAAI5B,EAAAA,SAAS,EAAE,EAC/B6B,EAASC,EAAAA,YAAY,SAAY,CACrC,GAAI,CACF,MAAMtB,EAAS,MAAMuB,EAA2CrC,CAAO,EACvE,GAAI,CAACc,EAAO,QAAS,MAAM,IAAI,MAAMA,EAAO,SAAWZ,EAAE,oBAAoB,CAAC,EAC9E6B,EAAYjB,EAAO,MAAQ,EAAE,EAC7BoB,EAAS,EAAE,CACb,OAASjB,EAAO,CACdiB,EAASjB,aAAiB,MAAQA,EAAM,QAAUf,EAAE,oBAAoB,CAAC,CAC3E,QAAA,CACE+B,EAAW,EAAK,CAClB,CACF,EAAG,CAACjC,EAASE,CAAC,CAAC,EACfoC,EAAAA,UAAU,IAAM,CACTH,EAAA,CACP,EAAG,CAACA,CAAM,CAAC,EACX,MAAMI,EAAUT,EAAS,OACtB/B,GAAY,CAAC4B,EAAO,IAAI,QAAQ,GAAK5B,EAAQ,aAAe4B,EAAO,IAAI,QAAQ,CAAA,EAElF,OACET,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAE,MAAC,KAAA,CAAG,UAAU,SAAU,SAAAlB,EAAE,mBAAmB,EAAE,QAC9C,IAAA,CAAE,UAAU,UAAW,SAAAA,EAAE,yBAAyB,CAAA,CAAE,CAAA,EACvD,EACCyB,EAAO,IAAI,QAAQ,GAClBP,EAAAA,IAAC,SAAA,CACC,UAAU,UACV,QAAS,IACPQ,EAAWY,IACTA,EAAO,OAAO,QAAQ,EACfA,EACR,EAGF,WAAE,qBAAqB,CAAA,CAAA,EAG3BvB,GACCG,EAAAA,IAAC,MAAA,CACC,UAAU,6BACV,MAAO,CAAE,MAAO,gBAAA,EAChB,KAAK,QAEJ,SAAAH,CAAA,CAAA,EAGJe,EACCZ,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAoC,MAAO,CAAE,MAAO,kBAAA,EAChE,SAAAlB,EAAE,qBAAqB,EAC1B,EACE,CAACqC,EAAQ,QAAU,CAACtB,EACtBG,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAoC,MAAO,CAAE,MAAO,kBAAA,EAChE,SAAAlB,EAAE,mBAAmB,EACxB,EACE,KACHqC,EAAQ,IAAKxC,GACZqB,EAAAA,IAACtB,EAAA,CAEC,QAAAC,EACA,QAAAC,EACA,SAAUmC,CAAA,EAHLpC,EAAQ,UAAA,CAKhB,CAAA,EACH,CAEJ,CAEA,SAAwB0C,GAAkB,OACxC,KAAM,CAAE,EAAAvC,CAAA,EAAMC,EAAA,EACR,CAAE,KAAAuC,CAAA,EAASC,EAAA,EACX,CAAChB,EAAQC,CAAS,EAAIC,EAAA,EACtB,CAACe,EAAOC,CAAQ,EAAIvC,EAAAA,SAAiB,CAAA,CAAE,EACvC,CAACW,EAAOiB,CAAQ,EAAI5B,EAAAA,SAAS,EAAE,EAC/BwC,EAAQ,IAAQvB,EAAAmB,EAAK,OAAL,MAAAnB,EAAW,SAC3BwB,EAAWD,GAAQnB,EAAO,IAAI,MAAM,GAAK,GACzC3B,EAAU+C,EAAW,UAAU,mBAAmBA,CAAQ,CAAC,eAAiB,eAClFT,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACQ,EAAO,OACZ,IAAIE,EAAS,GACb,OAAKX,EAA4B,QAAQ,EACtC,KAAMvB,GAAW,CAChB,GAAKkC,EACL,IAAI,CAAClC,EAAO,QAAS,MAAM,IAAI,MAAMA,EAAO,SAAWZ,EAAE,oBAAoB,CAAC,EAC9E2C,EAAS/B,EAAO,MAAQ,EAAE,EAC5B,CAAC,EACA,MAAOG,GAAmB,CACrB+B,KAAiB/B,aAAiB,MAAQA,EAAM,QAAUf,EAAE,oBAAoB,CAAC,CACvF,CAAC,EACI,IAAM,CACX8C,EAAS,EACX,CACF,EAAG,CAACF,EAAO5C,CAAC,CAAC,EAEXgB,EAAAA,KAAC,MAAA,CAAI,UAAU,YACZ,SAAA,CAAA4B,GACC5B,EAAAA,KAAC,MAAA,CAAI,UAAU,oBACb,SAAA,CAAAA,EAAAA,KAAC,QAAA,CAAM,UAAU,0BACf,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAM,SAAAlB,EAAE,wBAAwB,CAAA,CAAE,EACnCgB,EAAAA,KAAC,SAAA,CACC,UAAU,YACV,MAAO6B,EACP,SAAW5B,GACTS,EAAWY,IACLrB,EAAM,OAAO,MAAOqB,EAAO,IAAI,OAAQrB,EAAM,OAAO,KAAK,EACxDqB,EAAO,OAAO,MAAM,EAClBA,EACR,EAGH,SAAA,CAAApB,MAAC,SAAA,CAAO,MAAM,GAAI,SAAAlB,EAAE,2BAA2B,EAAE,EAChD0C,EAAM,IAAKK,GACV7B,EAAAA,IAAC,SAAA,CAA2B,MAAO6B,EAAK,SACrC,SAAAA,EAAK,QAAA,EADKA,EAAK,QAElB,CACD,CAAA,CAAA,CAAA,CACH,EACF,EACChC,GAASG,EAAAA,IAAC,IAAA,CAAE,KAAK,QAAS,SAAAH,CAAA,CAAM,CAAA,EACnC,EAEFG,EAAAA,IAACM,EAAA,CAA6B,QAAA1B,CAAA,EAATA,CAA2B,CAAA,EAClD,CAEJ"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import{r as d,j as e,d as Pt}from"./framework-vendor-D0S_ys6r.js";import{l as ts,q as Tt,r as At,v as Rt,h as Ts,k as rs,t as Ot,p as Et,e as Dt,a as zt,u as It,P as ae,f as Kt,j as Mt}from"./index-CGRjM_NC.js";import{c as Ut,u as Gt}from"./clipboard-BLr_gbf8.js";import{u as ve}from"./i18n-vendor-COTriSc6.js";import{v as js}from"./passwordValidation-DTLWgUy9.js";import{S as z}from"./ToggleGroup-DuWJZU41.js";import{X as As,n as Bt,C as Rs,O as Os,T as Es,P as Lt,Q as Ft,V as ke,R as ye,Y as Ds,e as _t,Z as $t,b as Vt,p as qt,_ as Ht,f as Ns,$ as Qt,a0 as Wt,W as Jt,a1 as Yt,F as Xt,a2 as ws,a3 as Zt,a4 as er,a5 as sr,K as tr,a6 as rr,r as ar,N as nr,s as ir}from"./icons-vendor-DZjjGrOu.js";import{E as lr}from"./EndpointCopy-CZOjiFAH.js";import{C as as}from"./ConfirmDialog-BJpzQmMw.js";function or({keyData:s,onClose:n,onReset:c}){const{t:l}=ve(),h=d.useRef(!1),[A,v]=d.useState(!1),[S,m]=d.useState(""),[r,p]=d.useState(""),[O,L]=d.useState(!1),P=async()=>{var R;if(!(h.current||S)){h.current=!0,v(!0),p("");try{const f=await ts(`/auth/keys/${encodeURIComponent(s.id)}/reset`,{});if(!f.success||!((R=f.data)!=null&&R.token)){p(f.message||l("settings.resetBearerKeyError"));return}m(f.data.token),await c()}catch{p(l("settings.resetBearerKeyError"))}finally{h.current=!1,v(!1)}}};return e.jsx("div",{className:"fixed inset-0 bg-black/50 z-[100] flex items-center justify-center p-4",children:e.jsxs("div",{role:"dialog","aria-modal":"true","aria-labelledby":"reset-key-title","aria-describedby":"reset-key-description",className:"hub-card p-6 max-w-xl w-full",children:[e.jsxs("h2",{id:"reset-key-title",className:"hub-h2 mb-4",children:[l("settings.resetBearerKey")," — ",s.name]}),e.jsx("p",{id:"reset-key-description",className:"hub-sub mb-4",children:l(S?"settings.resetBearerKeySuccess":"settings.resetBearerKeyConfirm")}),r&&e.jsx("p",{role:"alert",className:"mb-4 text-red-600",children:r}),S&&e.jsxs("div",{className:"mb-4",children:[e.jsx("label",{htmlFor:"reset-key-token",className:"block mb-2",children:l("settings.bearerKeyToken")}),e.jsx("textarea",{id:"reset-key-token",className:"hub-input w-full font-mono break-all",rows:3,style:{height:"auto",minHeight:88,resize:"none"},value:S,readOnly:!0,onFocus:R=>R.target.select()}),e.jsx("button",{className:"hub-btn mt-2",onClick:async()=>{const R=await Ut(S);L(R),p(R?"":l("common.copyFailed"))},children:l(O?"common.copied":"common.copy")})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{className:"hub-btn",disabled:A,onClick:n,autoFocus:!0,children:l(S?"common.close":"common.cancel")}),!S&&e.jsx("button",{className:"hub-btn primary",disabled:A,onClick:P,children:l(A?"common.updating":"common.confirm")})]})]})})}const dr=({onSuccess:s,onCancel:n})=>{const{t:c}=ve(),[l,h]=d.useState({currentPassword:"",newPassword:""}),[A,v]=d.useState(""),[S,m]=d.useState(!1),[r,p]=d.useState(null),[O,L]=d.useState(!1),[P,R]=d.useState([]),f=u=>{const{name:j,value:N}=u.target;if(j==="confirmPassword")v(N);else if(h(F=>({...F,[j]:N})),j==="newPassword"){const F=js(N);R(F.errors)}},M=async u=>{u.preventDefault(),p(null);const j=js(l.newPassword);if(!j.isValid){p(c("auth.passwordStrengthError")),R(j.errors);return}if(R([]),l.newPassword!==A){p(c("auth.passwordsNotMatch"));return}m(!0);try{const N=await Tt(l);N.success?(L(!0),s&&s()):p(N.message||c("auth.changePasswordError"))}catch{p(c("auth.changePasswordError"))}finally{m(!1)}};return e.jsxs("div",{className:"p-6 bg-white dark:bg-gray-800 rounded-lg shadow-md",children:[e.jsx("h2",{className:"text-xl font-bold mb-4",children:c("auth.changePassword")}),O?e.jsx("div",{className:"bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded mb-4",children:c("auth.changePasswordSuccess")}):e.jsxs("form",{onSubmit:M,children:[r&&e.jsxs("div",{className:"bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded mb-4",children:[e.jsx("p",{children:r}),P.length>0&&e.jsx("ul",{className:"list-disc list-inside mt-2 space-y-1",children:P.map(u=>e.jsx("li",{children:c(`auth.${u}`)},u))})]}),e.jsxs("div",{className:"mb-4",children:[e.jsx("label",{className:"block text-gray-700 text-sm font-bold mb-2",htmlFor:"currentPassword",children:c("auth.currentPassword")}),e.jsx("input",{type:"password",id:"currentPassword",name:"currentPassword",className:"w-full p-2 border rounded focus:outline-none focus:ring-2 focus:ring-blue-500 form-input",value:l.currentPassword,onChange:f,required:!0})]}),e.jsxs("div",{className:"mb-4",children:[e.jsx("label",{className:"block text-gray-700 text-sm font-bold mb-2",htmlFor:"newPassword",children:c("auth.newPassword")}),e.jsx("input",{type:"password",id:"newPassword",name:"newPassword",className:"w-full p-2 border rounded focus:outline-none focus:ring-2 focus:ring-blue-500 form-input",value:l.newPassword,onChange:f,required:!0,minLength:8}),l.newPassword&&P.length>0&&e.jsxs("div",{className:"mt-2 text-sm text-gray-600",children:[e.jsx("p",{className:"font-semibold mb-1",children:c("auth.passwordStrengthHint")}),e.jsx("ul",{className:"list-disc list-inside space-y-1",children:P.map(u=>e.jsx("li",{className:"text-red-600",children:c(`auth.${u}`)},u))})]}),l.newPassword&&P.length===0&&e.jsxs("p",{className:"mt-2 text-sm text-green-600",children:["✓ ",c("auth.passwordStrengthHint")]})]}),e.jsxs("div",{className:"mb-6",children:[e.jsx("label",{className:"block text-gray-700 text-sm font-bold mb-2",htmlFor:"confirmPassword",children:c("auth.confirmPassword")}),e.jsx("input",{type:"password",id:"confirmPassword",name:"confirmPassword",className:"w-full p-2 border rounded focus:outline-none focus:ring-2 focus:ring-blue-500 form-input",value:A,onChange:f,required:!0,minLength:8})]}),e.jsxs("div",{className:"flex justify-end space-x-2",children:[n&&e.jsx("button",{type:"button",onClick:n,disabled:S,className:"hub-btn",children:c("common.cancel")}),e.jsx("button",{type:"submit",disabled:S,className:"hub-btn primary",children:S?e.jsxs("span",{className:"flex items-center",children:[e.jsxs("svg",{className:"animate-spin -ml-1 mr-2 h-4 w-4 text-white",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[e.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),e.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),c("common.save")]}):c("common.save")})]})]})]})},ie=({options:s,selected:n,onChange:c,placeholder:l="Select items...",disabled:h=!1,className:A=""})=>{const[v,S]=d.useState(!1),[m,r]=d.useState(""),p=d.useRef(null),O=d.useRef(null);d.useEffect(()=>{const u=j=>{p.current&&!p.current.contains(j.target)&&(S(!1),r(""))};return document.addEventListener("mousedown",u),()=>document.removeEventListener("mousedown",u)},[]);const L=s.filter(u=>u.label.toLowerCase().includes(m.toLowerCase())),P=u=>{if(h)return;const j=n.includes(u)?n.filter(N=>N!==u):[...n,u];c(j)},R=(u,j)=>{j.stopPropagation(),!h&&c(n.filter(N=>N!==u))},f=()=>{h||(S(!v),v||setTimeout(()=>{var u;return(u=O.current)==null?void 0:u.focus()},0))},M=()=>n.map(u=>{var j;return((j=s.find(N=>N.value===u))==null?void 0:j.label)||u}).filter(Boolean);return e.jsxs("div",{ref:p,className:`relative ${A}`,children:[e.jsxs("div",{onClick:f,className:`
|
|
2
|
-
min-h-[38px] w-full px-3 py-1.5 border rounded-md shadow-sm
|
|
3
|
-
flex flex-wrap items-center gap-1.5 cursor-pointer
|
|
4
|
-
transition-all duration-200
|
|
5
|
-
${h?"bg-gray-100 cursor-not-allowed":"bg-white hover:border-blue-400"}
|
|
6
|
-
${v?"border-blue-500 ring-1 ring-blue-500":"border-gray-300"}
|
|
7
|
-
`,children:[n.length>0?e.jsx(e.Fragment,{children:M().map((u,j)=>e.jsxs("span",{className:"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300",children:[u,!h&&e.jsx("button",{type:"button",onClick:N=>R(n[j],N),className:"ml-1 hover:bg-blue-200 rounded-full p-0.5 transition-colors",children:e.jsx(As,{className:"h-3 w-3"})})]},n[j]))}):e.jsx("span",{className:"text-gray-400 text-sm",children:l}),e.jsx("div",{className:"flex-1"}),e.jsx(Bt,{className:`h-4 w-4 text-gray-400 transition-transform duration-200 ${v?"transform rotate-180":""}`})]}),v&&!h&&e.jsxs("div",{className:"absolute z-50 w-full mt-1 bg-white dark:bg-gray-800 border border-gray-300 rounded-md shadow-lg max-h-60 overflow-hidden",children:[e.jsx("div",{className:"p-2 border-b border-gray-200 dark:border-gray-700",children:e.jsx("input",{ref:O,type:"text",value:m,onChange:u=>r(u.target.value),placeholder:"Search...",className:"w-full px-3 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500",onClick:u=>u.stopPropagation()})}),e.jsx("div",{className:"max-h-48 overflow-y-auto",children:L.length>0?L.map(u=>{const j=n.includes(u.value);return e.jsxs("div",{onClick:()=>P(u.value),className:`
|
|
8
|
-
px-3 py-2 cursor-pointer flex items-center justify-between
|
|
9
|
-
transition-colors duration-150
|
|
10
|
-
${j?"bg-blue-50 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300":"hover:bg-gray-100 dark:hover:bg-gray-700"}
|
|
11
|
-
`,children:[e.jsx("span",{className:"text-sm",children:u.label}),j&&e.jsx(Rs,{className:"h-4 w-4 text-blue-600"})]},u.value)}):e.jsx("div",{className:"px-3 py-2 text-sm text-gray-500 text-center",children:m?"No results found":"No options available"})})]})]})},ne={SETTINGS_SMART_ROUTING:"settings:smart_routing",SETTINGS_ROUTE_CONFIG:"settings:route_config",SETTINGS_INSTALL_CONFIG:"settings:install_config",SETTINGS_SYSTEM_CONFIG:"settings:system_config",SETTINGS_OAUTH_SERVER:"settings:oauth_server",SETTINGS_EXPORT_CONFIG:"settings:export_config"},cr=["username","keyId","groupId","serverId","tool"],Ye="block w-full min-w-0 mt-1 py-2 px-3 border border-gray-300 rounded-md form-input text-sm",mr=({nameSeparator:s,rules:n,loading:c,loadError:l,onRetry:h,onSave:A,users:v,bearerKeys:S,servers:m,groups:r})=>{const{t:p}=ve(),[O,L]=d.useState(!1),[P,R]=d.useState(null),[f,M]=d.useState(""),[u,j]=d.useState(!1),[N,F]=d.useState(!1),U=P??n??[],X=c||N,_=P!==null&&JSON.stringify(P)!==JSON.stringify(n),G={username:v.map(x=>({value:x.username,label:x.username})),keyId:S.map(x=>({value:x.id,label:x.name})),groupId:r.map(x=>({value:x.id,label:x.name})),serverId:m.flatMap(x=>{var w;return(w=x.config)!=null&&w.id?[{value:x.config.id,label:x.name}]:[]})},Q=At(U,{serverId:G.serverId.map(({value:x})=>x),keyId:G.keyId.map(({value:x})=>x),groupId:G.groupId.map(({value:x})=>x)}),y=(x,w,E)=>{M(""),R(U.map(($,W)=>{if(W!==x)return $;const J={...$,[w]:E};return!E&&w!=="id"&&w!=="effect"&&delete J[w],J}))},le=()=>{try{Rt(U),M(""),j(!0)}catch{M(p("settings.toolPolicies.invalid"))}},ee=async()=>{j(!1),F(!0);try{await A(U)?R(null):M(p("settings.toolPolicies.saveFailed"))}catch{M(p("settings.toolPolicies.saveFailed"))}finally{F(!1)}};return e.jsxs("section",{className:"hub-card mb-6 overflow-hidden","aria-labelledby":"tool-policy-heading",children:[e.jsxs("button",{id:"tool-policy-heading",type:"button",className:"flex w-full justify-between items-center py-3 px-5 text-left hover:bg-[var(--hub-surface-hover)]","aria-expanded":O,"aria-controls":"tool-policy-content",onClick:()=>L(!O),children:[e.jsxs("span",{className:"flex items-center gap-2.5 font-medium",children:[e.jsx(Os,{size:15,"aria-hidden":"true"}),p("settings.toolPolicies.title"),e.jsx("span",{className:"text-sm text-[var(--hub-ink-3)]",children:(n==null?void 0:n.length)??"—"})]}),e.jsx("span",{"aria-hidden":"true",children:O?"−":"+"})]}),O&&e.jsxs("div",{id:"tool-policy-content",className:"p-4 sm:p-6 border-t border-[var(--hub-line-2)] space-y-4",children:[e.jsx("p",{className:"text-sm text-[var(--hub-ink-2)]",children:p("settings.toolPolicies.description")}),e.jsx("div",{className:"rounded-md bg-amber-50 dark:bg-amber-950 p-3 text-sm text-amber-900 dark:text-amber-200",children:p("settings.toolPolicies.semantics")}),Q.length>0&&e.jsxs("div",{role:"alert",className:"rounded-md bg-amber-50 dark:bg-amber-950 p-3 text-sm text-amber-900 dark:text-amber-200 break-all",children:[e.jsx("p",{children:p("settings.toolPolicies.missingReferences")}),e.jsx("ul",{className:"list-disc pl-5",children:Q.map(({policyId:x,selector:w,value:E},$)=>e.jsx("li",{children:p("settings.toolPolicies.missingReference",{policyId:x,selector:w,value:E})},$))})]}),n===void 0?e.jsxs("div",{role:"status",className:"text-sm",children:[l||p("common.loading"),!c&&e.jsx("button",{type:"button",className:"hub-btn ml-3",onClick:h,children:p("settings.toolPolicies.retry")})]}):e.jsxs(e.Fragment,{children:[e.jsxs("fieldset",{disabled:X,className:"min-w-0 space-y-4",children:[e.jsx("legend",{className:"sr-only",children:p("settings.toolPolicies.title")}),U.length===0&&e.jsx("p",{className:"text-sm text-[var(--hub-ink-2)]",children:p("settings.toolPolicies.empty")}),U.map((x,w)=>e.jsxs("fieldset",{className:"min-w-0 rounded-md border border-[var(--hub-line)] p-4",children:[e.jsx("legend",{className:"px-1 text-sm font-medium",children:p("settings.toolPolicies.rule",{number:w+1})}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-4",children:[e.jsxs("label",{className:"text-sm min-w-0",children:[p("settings.toolPolicies.id"),e.jsx("input",{className:Ye,value:x.id,required:!0,onChange:E=>y(w,"id",E.target.value)})]}),e.jsxs("label",{className:"text-sm min-w-0",children:[p("settings.toolPolicies.effect"),e.jsxs("select",{className:Ye,value:x.effect,onChange:E=>y(w,"effect",E.target.value),children:[e.jsx("option",{value:"deny",children:p("settings.toolPolicies.deny")}),e.jsx("option",{value:"allow",children:p("settings.toolPolicies.allow")})]})]}),cr.map(E=>{const $=`policy-${w}-${E}`,W=E==="tool"?m.filter(K=>{var V;return!x.serverId||((V=K.config)==null?void 0:V.id)===x.serverId}).flatMap(K=>(K.tools??[]).map(V=>({value:V.name.startsWith(`${K.name}${s}`)?V.name.slice(K.name.length+s.length):V.name,label:K.name}))):G[E],J=W.find(K=>K.value===x[E]);return e.jsxs("label",{className:"text-sm min-w-0",children:[p(`settings.toolPolicies.${E}`),e.jsx("input",{className:Ye,list:$,value:x[E]??"",placeholder:p("settings.toolPolicies.any"),onChange:K=>y(w,E,K.target.value)}),e.jsx("datalist",{id:$,children:Array.from(new Map(W.map(K=>[K.value,K])).values()).map(K=>e.jsx("option",{value:K.value,children:K.label},K.value))}),J&&E!=="tool"&&e.jsx("span",{className:"block mt-1 text-xs text-[var(--hub-ink-2)] break-all",children:J.label})]},E)})]}),e.jsx("div",{className:"flex justify-end mt-3",children:e.jsxs("button",{type:"button",className:"hub-btn text-red-600","aria-label":p("settings.toolPolicies.deleteRule",{number:w+1}),onClick:()=>{R(U.filter((E,$)=>$!==w)),M("")},children:[e.jsx(Es,{size:14,"aria-hidden":"true"}),p("common.delete")]})})]},w)),e.jsx("p",{className:"text-xs text-[var(--hub-ink-2)]",children:p("settings.toolPolicies.selectorsHint")}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs("button",{type:"button",className:"hub-btn",onClick:()=>R([...U,{id:"",effect:"deny"}]),children:[e.jsx(Lt,{size:14,"aria-hidden":"true"}),p("settings.toolPolicies.add")]}),e.jsx("button",{type:"button",className:"hub-btn",disabled:!_,onClick:()=>{R(null),M("")},children:p("common.cancel")}),e.jsx("button",{type:"button",className:"hub-btn primary",disabled:!_,onClick:le,children:p(N?"common.saving":"settings.toolPolicies.save")})]})]}),_&&e.jsx("p",{role:"status",className:"text-sm text-amber-700 dark:text-amber-400",children:p("settings.toolPolicies.unsaved")}),f&&e.jsx("p",{role:"alert",className:"text-sm text-red-600",children:f})]})]}),e.jsx(as,{isOpen:u,onClose:()=>j(!1),onConfirm:ee,title:p("settings.toolPolicies.save"),message:p(U.length?"settings.toolPolicies.confirm":"settings.toolPolicies.confirmClear",{count:U.length}),confirmText:p("common.save"),confirmDisabled:X})]})},ur=async()=>{const s=await Ts("/smart-routing/performance");if(!s.success)throw new Error(s.error||s.message||"Failed to load smart routing performance");return s.data},gr=async()=>{const s=await ts("/smart-routing/reindex");if(!s.success)throw new Error(s.error||s.message||"Failed to rebuild smart routing index");return s.data},Xe=s=>{if(!s)return"—";const n=new Date(s);return Number.isNaN(n.getTime())?s:n.toLocaleString()},pr=({enabled:s})=>{const{t:n}=ve(),{showToast:c}=rs(),[l,h]=d.useState(null),[A,v]=d.useState(!1),[S,m]=d.useState(null),[r,p]=d.useState(!1),[O,L]=d.useState(!1),[P,R]=d.useState(null),[f,M]=d.useState(null),u=O||!!(l!=null&&l.reindexing),j=d.useRef(0),N=d.useRef(null),F=d.useCallback(async()=>{if(!s){h(null),m(null);return}v(!0),m(null);try{const y=await ur();h(y)}catch(y){m(y instanceof Error?y.message:String(y)),h(null)}finally{v(!1)}},[s]);d.useEffect(()=>{F()},[F]),d.useEffect(()=>()=>{var y;(y=N.current)==null||y.call(N)},[]);const U=async()=>{var ee;p(!1),M(null),L(!0),R({serverName:"",current:0,total:0,status:"started"});const y=++j.current,le=Ot.subscribe(x=>{try{const w=JSON.parse(x.data);(w==null?void 0:w.type)==="embedding-sync-progress"&&w.progress&&R(w.progress)}catch{}});N.current=le;try{const x=await gr();if(y!==j.current)return;M(x),c(n("settings.smartRoutingIndexReindexDone",{synced:x.syncedServers,failed:x.failedServers,skipped:x.skippedServers,total:x.totalTools}),"success"),await F()}catch(x){if(y!==j.current)return;c(n("settings.smartRoutingIndexReindexFailed",{message:x instanceof Error?x.message:String(x)}),"error")}finally{y===j.current&&(L(!1),R(null),(ee=N.current)==null||ee.call(N),N.current=null)}},X=l?[{label:n("settings.smartRoutingIndexModel"),value:l.config.model||"—"},{label:n("settings.smartRoutingIndexDimensions"),value:String(l.vectorStore.dimensions??l.config.configuredDimensions??"—")},{label:n("settings.smartRoutingIndexTotalRows"),value:String(l.vectorStore.totalRows)},{label:n("settings.smartRoutingIndexToolRows"),value:String(l.vectorStore.toolRows)},{label:n("settings.smartRoutingIndexServerRows"),value:String(l.vectorStore.serverRows)},{label:n("settings.smartRoutingIndexClusterLabel"),value:String(l.vectorStore.distinctServers)},{label:n("settings.smartRoutingIndexCoverage"),value:`${l.coverage.indexedServers}/${l.coverage.totalServers}`},{label:n("settings.smartRoutingIndexPersonalCredentials"),value:String(l.coverage.personalCredentialServers)},{label:n("settings.smartRoutingIndexLastSynced"),value:Xe(l.vectorStore.newestUpdatedAt)}]:[],_=l==null?void 0:l.database.healthy,G=(f==null?void 0:f.results.filter(y=>!y.ok&&!y.skipped))??[],Q=(f==null?void 0:f.results.filter(y=>y.skipped))??[];return e.jsxs("div",{className:"hub-card",style:{padding:18},children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ft,{size:16,className:"text-[var(--hub-ink-2)]"}),e.jsx("h3",{className:"hub-card-title",style:{marginBottom:0},children:n("settings.smartRoutingIndexTitle")}),(l==null?void 0:l.vectorStore.available)===!1&&e.jsxs("span",{style:{fontSize:11.5,color:"var(--hub-warn, #b45309)"},children:[e.jsx(ke,{size:12}),n("settings.smartRoutingIndexStatsUnavailable")]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{type:"button",onClick:F,disabled:u||A,className:"hub-btn",style:{padding:"6px 10px",fontSize:12.5},children:[e.jsx(ye,{size:13}),n("settings.smartRoutingIndexRefresh")]}),e.jsxs("button",{type:"button",onClick:()=>p(!0),disabled:u||A||!s,className:"hub-btn primary",style:{padding:"6px 10px",fontSize:12.5},children:[u?e.jsx(ye,{size:13,className:"animate-spin"}):e.jsx(ye,{size:13}),n(u?"settings.smartRoutingIndexReindexing":"settings.smartRoutingIndexReindex")]})]})]}),A&&e.jsx("div",{className:"hub-sub",children:n("settings.smartRoutingIndexLoading")}),S&&!l&&e.jsxs("div",{className:"mb-3 flex items-start gap-2",style:{padding:"8px 12px",borderRadius:7,background:"var(--hub-red-soft, rgba(220,38,38,0.08))",color:"var(--hub-red, #dc2626)",fontSize:12.5},children:[e.jsx(ke,{size:14,className:"mt-0.5 shrink-0"}),e.jsx("span",{children:S})]}),!A&&!l&&!S&&e.jsx("div",{className:"hub-sub",children:n("settings.smartRoutingIndexNoData")}),l&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mb-3 flex items-center gap-2",style:{padding:"8px 12px",borderRadius:7,fontSize:12.5,background:_===!1?"var(--hub-warn-soft, rgba(234,179,8,0.10))":void 0,color:_===!1?"var(--hub-warn, #b45309)":"var(--hub-ink-2)"},children:[e.jsx(Ds,{size:14}),e.jsxs("span",{children:[n("settings.smartRoutingIndexDatabase"),":"," ",l.database.connected?n(_!==!1?"settings.smartRoutingIndexConnected":"settings.smartRoutingIndexUnhealthy"):n("settings.smartRoutingIndexDisconnected")]}),l.database.lastError&&e.jsxs("span",{style:{opacity:.75},children:["· ",l.database.lastError]})]}),e.jsx("div",{className:"grid gap-3",style:{gridTemplateColumns:"repeat(auto-fill, minmax(160px, 1fr))"},children:X.map(y=>e.jsxs("div",{style:{padding:"10px 12px",borderRadius:8,border:"1px solid var(--hub-line)",background:"var(--hub-bg-2)"},children:[e.jsx("div",{style:{fontSize:11.5,color:"var(--hub-ink-3)"},children:y.label}),e.jsx("div",{style:{fontSize:15,fontWeight:600,color:"var(--hub-ink)",marginTop:2,wordBreak:"break-all"},children:y.value})]},y.label))}),l.coverage.missingIndexServerCount>0&&e.jsxs("div",{className:"mt-3 flex items-start gap-2",style:{padding:"8px 12px",borderRadius:7,background:"var(--hub-warn-soft, rgba(234,179,8,0.10))",color:"var(--hub-warn, #b45309)",fontSize:12.5},children:[e.jsx(ke,{size:14,className:"mt-0.5 shrink-0"}),e.jsxs("span",{children:[n("settings.smartRoutingIndexMissingIndex",{count:l.coverage.missingIndexServerCount}),l.coverage.missingIndexServers.length>0&&`: ${l.coverage.missingIndexServers.slice(0,8).join(", ")}`]})]}),l.vectorStore.byServer.length>0&&e.jsxs("div",{className:"mt-3",children:[e.jsx("div",{className:"hub-sect mb-2",children:n("settings.smartRoutingIndexPerServer")}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:l.vectorStore.byServer.slice(0,30).map(y=>e.jsxs("span",{className:"inline-flex items-center gap-1",style:{padding:"3px 9px",borderRadius:999,fontSize:12,background:"var(--hub-bg-2)",border:"1px solid var(--hub-line)",color:"var(--hub-ink)"},children:[e.jsx(_t,{size:11,className:"text-[var(--hub-ink-2)]"}),y.serverName,e.jsxs("span",{className:"text-[var(--hub-ink-3)]",children:["(",y.toolCount,")"]})]},y.serverName))})]}),e.jsxs("div",{className:"mt-3 flex items-center gap-2",style:{fontSize:12.5,color:"var(--hub-ink-2)"},children:[e.jsx($t,{size:13}),e.jsx("span",{children:n("settings.smartRoutingIndexSyncedRange",{oldest:Xe(l.vectorStore.oldestUpdatedAt),newest:Xe(l.vectorStore.newestUpdatedAt)})})]})]}),O&&P&&e.jsxs("div",{className:"mt-3",style:{padding:"10px 12px",borderRadius:8,border:"1px solid var(--hub-line)",background:"var(--hub-bg-2)"},children:[e.jsxs("div",{className:"flex items-center justify-between",style:{fontSize:12.5},children:[e.jsxs("span",{className:"inline-flex items-center gap-2",style:{color:"var(--hub-ink)"},children:[e.jsx(ye,{size:13,className:"animate-spin"}),P.serverName?n("settings.smartRoutingIndexReindexingServer",{server:P.serverName}):n("settings.smartRoutingIndexReindexStarting")]}),P.total>0&&e.jsxs("span",{className:"text-[var(--hub-ink-3)]",children:[P.current,"/",P.total]})]}),P.total>0&&e.jsx("div",{className:"mt-2",style:{height:6,borderRadius:999,background:"var(--hub-line)",overflow:"hidden"},children:e.jsx("div",{style:{height:"100%",width:`${Math.min(100,P.current/P.total*100)}%`,background:"var(--hub-ok)",transition:"width 120ms ease"}})})]}),f&&!O&&e.jsxs("div",{className:"mt-3",children:[e.jsxs("div",{className:"flex items-center gap-2",style:{padding:"8px 12px",borderRadius:7,fontSize:12.5,background:G.length>0?"var(--hub-warn-soft, rgba(234,179,8,0.10))":"rgba(34,197,94,0.10)",color:G.length>0?"var(--hub-warn, #b45309)":"#166534"},children:[G.length>0?e.jsx(ke,{size:14,className:"shrink-0"}):e.jsx(Vt,{size:14,className:"shrink-0"}),e.jsxs("span",{children:[n("settings.smartRoutingIndexReindexSummary",{synced:f.syncedServers,failed:f.failedServers,skipped:f.skippedServers,total:f.totalTools}),G.length>0&&e.jsxs("span",{children:[" ",G.map(y=>y.serverName).join(", ")]})]})]}),(G.length>0||Q.length>0)&&e.jsx("ul",{className:"mt-2",style:{listStyle:"none",padding:0,margin:0,fontSize:12,color:"var(--hub-ink-2)"},children:[...G,...Q].map(y=>e.jsxs("li",{className:"flex items-start gap-1.5 py-0.5",children:[y.skipped?e.jsx(qt,{size:12,className:"mt-0.5 shrink-0"}):e.jsx(ke,{size:12,className:"mt-0.5 shrink-0"}),e.jsxs("span",{children:[e.jsx("strong",{style:{color:"var(--hub-ink)"},children:y.serverName}),": ",y.skipped?y.error||n("settings.smartRoutingIndexSkippedReason"):y.error,y.principals&&y.principals.length>0&&e.jsxs("span",{className:"text-[var(--hub-ink-3)]",children:[" ","(",n("settings.smartRoutingIndexIndexedAs",{principals:y.principals.join(", ")}),")"]})]})]},y.serverName))})]}),e.jsx(as,{isOpen:r,onClose:()=>p(!1),onConfirm:U,title:n("settings.smartRoutingIndexReindexConfirmTitle"),message:n("settings.smartRoutingIndexReindexConfirmMessage"),confirmText:n("settings.smartRoutingIndexReindex"),variant:"danger"})]})},Ge=s=>s.kind==="user"?"user":"system",hr=(s,n)=>{const c=new Set(n.map(h=>h.username)),l=Array.from(new Set(s.filter(h=>Ge(h)==="user"&&typeof h.owner=="string"&&h.owner.trim().length>0).map(h=>h.owner.trim())));return l.sort((h,A)=>{const v=c.has(h),S=c.has(A);return v!==S?v?-1:1:h.localeCompare(A)}),l},br=(s,n,c=[])=>{const l=[{value:"all",label:s("settings.bearerKeyAccessAll",{defaultValue:"All"})}];n.some(A=>Ge(A)==="system")&&l.push({value:"system",label:s("settings.bearerKeyKindSystem",{defaultValue:"System-level"})});const h=s("settings.bearerKeyKindUser",{defaultValue:"User-level"});for(const A of hr(n,c))l.push({value:`user:${A}`,label:`${h} · ${A}`});return l},xr=(s,n)=>{if(n==="all")return s;if(n==="system")return s.filter(l=>Ge(l)==="system");const c=n.slice(5);return s.filter(l=>Ge(l)==="user"&&l.owner===c)},fr=({keyData:s,loading:n,availableServers:c,availableGroups:l,isAdmin:h,onSave:A,onDelete:v,onReset:S})=>{const{t:m}=ve(),[r,p]=d.useState(!1),[O,L]=d.useState(s.name),[P,R]=d.useState(s.enabled),[f,M]=d.useState(s.accessType||"all"),[u,j]=d.useState(s.allowedGroups||[]),[N,F]=d.useState(s.allowedServers||[]),[U,X]=d.useState(s.excludedGroups||[]),[_,G]=d.useState(s.excludedServers||[]),[Q,y]=d.useState(!1),[le,ee]=d.useState(!1);d.useEffect(()=>{r||(L(s.name),R(s.enabled),M(s.accessType||"all"),j(s.allowedGroups||[]),F(s.allowedServers||[]),X(s.excludedGroups||[]),G(s.excludedServers||[]))},[s,r]);const{showToast:x}=rs(),w=(s.kind??"system")==="system",E=async()=>{if(w&&f==="groups"&&u.length===0){x(m("settings.selectAtLeastOneGroup")||"Please select at least one group","error");return}if(w&&f==="servers"&&N.length===0){x(m("settings.selectAtLeastOneServer")||"Please select at least one server","error");return}if(w&&f==="custom"&&u.length===0&&N.length===0){x(m("settings.selectAtLeastOneGroupOrServer")||"Please select at least one group or server","error");return}if(w&&f==="exclude"&&U.length===0&&_.length===0){x(m("settings.selectAtLeastOneExcludedGroupOrServer")||"Please select at least one group or server to exclude","error");return}y(!0);try{await A(s.id,{name:O,enabled:P,accessType:f,allowedGroups:u.join(", "),allowedServers:N.join(", "),excludedGroups:U.join(", "),excludedServers:_.join(", ")}),p(!1)}finally{y(!1)}},$=async()=>{if(window.confirm(m("settings.deleteBearerKeyConfirm")||"Delete this key?")){ee(!0);try{await v(s.id)}finally{ee(!1)}}},W=f==="groups",J=f==="custom",K=f==="exclude",V=C=>{if((C.kind??"system")==="user")return`${m("settings.bearerKeyAccessUserVisibility")||"User visibility"}${C.owner?` · ${C.owner}`:""}`;if(C.accessType==="all")return m("settings.bearerKeyAccessAll")||"All Resources";if(C.accessType==="groups")return`${m("settings.bearerKeyAccessGroups")||"Groups"}: ${C.allowedGroups}`;if(C.accessType==="servers")return`${m("settings.bearerKeyAccessServers")||"Servers"}: ${C.allowedServers}`;if(C.accessType==="custom"){const se=[];return C.allowedGroups&&C.allowedGroups.length>0&&se.push(`${m("settings.bearerKeyAccessGroups")||"Groups"}: ${C.allowedGroups}`),C.allowedServers&&C.allowedServers.length>0&&se.push(`${m("settings.bearerKeyAccessServers")||"Servers"}: ${C.allowedServers}`),`${m("settings.bearerKeyAccessCustom")||"Custom"}: ${se.join("; ")}`}if(C.accessType==="exclude"){const se=[];return C.excludedGroups&&C.excludedGroups.length>0&&se.push(`${m("settings.bearerKeyExcludedGroups")||"Excluded groups"}: ${C.excludedGroups}`),C.excludedServers&&C.excludedServers.length>0&&se.push(`${m("settings.bearerKeyExcludedServers")||"Excluded servers"}: ${C.excludedServers}`),`${m("settings.bearerKeyAccessExclude")||"All except"}: ${se.join("; ")}`}return""},Se=r?e.jsx("tr",{children:e.jsx("td",{colSpan:5,className:"p-0 border-b border-gray-200 dark:border-gray-700",children:e.jsxs("div",{className:"bg-gray-50 dark:bg-gray-800 p-5",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-12 gap-4 mb-4",children:[e.jsxs("div",{className:"md:col-span-3",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:m("settings.bearerKeyName")||"Name"}),e.jsx("input",{type:"text",className:"block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input transition-shadow duration-200",value:O,onChange:C=>L(C.target.value),disabled:n})]}),e.jsxs("div",{className:"md:col-span-9",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:m("settings.bearerKeyToken")||"Token"}),e.jsx("div",{className:"py-2 px-3 text-sm font-mono text-gray-500",children:s.token})]})]}),e.jsxs("div",{className:"flex flex-wrap items-end gap-4",children:[e.jsxs("div",{className:"w-40",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:m("settings.bearerKeyEnabled")||"Status"}),e.jsxs("div",{className:"flex items-center h-[38px] px-3 bg-white dark:bg-gray-800 border border-gray-300 rounded-md",children:[e.jsx("span",{className:`text-sm mr-3 ${P?"text-green-600 font-medium":"text-gray-500"}`,children:P?"Active":"Inactive"}),e.jsx(z,{disabled:n,checked:P,onCheckedChange:C=>R(C)})]})]}),h&&w&&e.jsxs("div",{className:"w-48",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:m("settings.bearerKeyAccessType")||"Access scope"}),e.jsxs("select",{className:"block w-full py-2 px-3 border border-gray-300 bg-white dark:bg-gray-800 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-select transition-shadow duration-200",value:f,onChange:C=>M(C.target.value),disabled:n,children:[e.jsx("option",{value:"all",children:m("settings.bearerKeyAccessAll")||"All Resources"}),e.jsx("option",{value:"groups",children:m("settings.bearerKeyAccessGroups")||"Specific Groups"}),e.jsx("option",{value:"servers",children:m("settings.bearerKeyAccessServers")||"Specific Servers"}),e.jsx("option",{value:"custom",children:m("settings.bearerKeyAccessCustom")||"Custom (Groups & Servers)"}),e.jsx("option",{value:"exclude",children:m("settings.bearerKeyAccessExclude")||"All except selected groups/servers"})]})]}),h&&w&&!J&&!K&&e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:`block text-sm font-medium mb-1 ${f==="all"?"text-gray-400":"text-gray-700"}`,children:W?m("settings.bearerKeyAllowedGroups")||"Allowed groups":m("settings.bearerKeyAllowedServers")||"Allowed servers"}),e.jsx(ie,{options:W?l:c,selected:W?u:N,onChange:W?j:F,placeholder:W?m("settings.selectGroups")||"Select groups...":m("settings.selectServers")||"Select servers...",disabled:n||f==="all"})]}),h&&w&&J&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:m("settings.bearerKeyAllowedGroups")||"Allowed groups"}),e.jsx(ie,{options:l,selected:u,onChange:j,placeholder:m("settings.selectGroups")||"Select groups...",disabled:n})]}),e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:m("settings.bearerKeyAllowedServers")||"Allowed servers"}),e.jsx(ie,{options:c,selected:N,onChange:F,placeholder:m("settings.selectServers")||"Select servers...",disabled:n})]})]}),h&&w&&K&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:m("settings.bearerKeyExcludedGroups")||"Excluded groups"}),e.jsx(ie,{options:l,selected:U,onChange:X,placeholder:m("settings.selectGroups")||"Select groups...",disabled:n})]}),e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:m("settings.bearerKeyExcludedServers")||"Excluded servers"}),e.jsx(ie,{options:c,selected:_,onChange:G,placeholder:m("settings.selectServers")||"Select servers...",disabled:n})]})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:()=>p(!1),className:"hub-btn",children:m("common.cancel")||"Cancel"}),e.jsx("button",{type:"button",onClick:E,disabled:n||Q,className:"hub-btn primary",children:Q?m("common.saving")||"Saving...":m("common.save")||"Save"})]})]})]})})}):null;return e.jsxs(e.Fragment,{children:[e.jsxs("tr",{className:"hover:bg-gray-50 dark:bg-gray-800 dark:hover:bg-gray-700",children:[e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900",children:s.name}),e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500 font-mono",children:e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{children:s.token})})}),e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm",children:e.jsxs("span",{className:`hub-status ${s.enabled?"ok":"muted"}`,children:[e.jsx("span",{className:"hub-dot"}),s.enabled?m("common.active")||"Active":m("common.inactive")||"Inactive"]})}),e.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500",children:V(s)}),e.jsxs("td",{className:"px-6 py-4 whitespace-nowrap text-right text-sm font-medium",children:[e.jsx("button",{onClick:()=>p(C=>!C),disabled:n||Q,"aria-expanded":r,"aria-label":m(r?"common.cancel":"common.edit"),className:"text-blue-600 hover:text-blue-900 mr-4 inline-flex items-center",title:m(r?"common.cancel":"common.edit"),children:r?e.jsx(As,{className:"h-4 w-4"}):e.jsx(ir,{className:"h-4 w-4"})}),e.jsx("button",{onClick:()=>S(s),disabled:n||Q||le,className:"text-blue-600 hover:text-blue-900 mr-4 inline-flex items-center",title:m("settings.resetBearerKey"),"aria-label":m("settings.resetBearerKey"),children:e.jsx(ye,{className:"h-4 w-4"})}),e.jsx("button",{onClick:$,disabled:n||Q||le,className:"text-red-600 hover:text-red-900 inline-flex items-center",title:m("common.delete")||"Delete",children:e.jsx(Es,{className:"h-4 w-4"})})]})]}),Se]})};function yr(s){const n=s.toLowerCase(),c=[["text-embedding-3-small",8191],["text-embedding-3-large",8191],["text-embedding-ada-002",8191],["gemini-embedding-001",2048],["bge-m3",8192]];for(const[l,h]of c)if(n.includes(l))return h;return n.includes("bge"),512}const zs={openai:{baseUrl:"https://api.openai.com/v1",model:"text-embedding-3-small"},openrouter:{baseUrl:"https://openrouter.ai/api/v1",model:"baai/bge-m3"},siliconflow:{baseUrl:"https://api.siliconflow.cn/v1",model:"BAAI/bge-m3"},gemini:{baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",model:"gemini-embedding-001"},custom:{}};function vr(s,n){var h,A;const c=s.trim().replace(/\/+$/,"").toLowerCase(),l=n.trim().toLowerCase();for(const[v,S]of Object.entries(zs))if(v!=="custom"&&c===((h=S.baseUrl)==null?void 0:h.replace(/\/+$/,"").toLowerCase())&&l===((A=S.model)==null?void 0:A.toLowerCase()))return v;return"custom"}function ks(s,n){const c=s.trim(),l=c?parseInt(c,10):NaN,h=c&&!isNaN(l)?l:null;return h!==(n??null)?h:void 0}function Ss(s,n){const c=s.trim();if(!c)return n==null?void 0:null;const l=Number(c);if(!(!Number.isSafeInteger(l)||l<=0))return l!==n?l:void 0}function Ue(s,n,c){const l=s.trim();if(!l)return n==null?void 0:null;const h=Number(l);if(!(!Number.isFinite(h)||!c(h)))return h!==n?h:void 0}const Ze=s=>s>=0&&s<=1,es=s=>Number.isInteger(s)&&s>=0,Cs=["title","annotations","outputSchema","execution","icons","_meta"],jr=["title","annotations"];function Ps(s,n){const c=s.trim(),l=c?parseInt(c,10):NaN,h=c&&!isNaN(l)&&l>=0?l:null;return h!==(n??null)?h:void 0}const ss=["openid","profile","email"],Or=()=>{var vs;const{t:s}=ve(),n=Pt(),{showToast:c}=rs(),{allServers:l}=Et(),{groups:h}=Dt(),{auth:A}=zt(),v=((vs=A.user)==null?void 0:vs.isAdmin)===!0,[S,m]=d.useState({pythonIndexUrl:"",npmRegistry:"",baseUrl:"http://localhost:3000"}),[r,p]=d.useState({dbUrl:"",basePacingDelayMs:"",embeddingProvider:"openai",embeddingProviderPreset:"openai",embeddingEncodingFormat:"auto",embeddingDimensions:"",embeddingDimensionsApiPassthrough:!1,llmProviderBaseUrl:"",llmProviderApiKey:"",embeddingModel:"",azureOpenaiEndpoint:"",azureOpenaiApiKey:"",azureOpenaiApiVersion:"2024-02-15-preview",azureOpenaiEmbeddingDeployment:"",azureOpenaiEmbeddingModel:"",embeddingMaxTokens:"",embeddingQueryPrefix:"",embeddingDocumentPrefix:"",similarityThreshold:"",fullSchemaTopN:""}),[O,L]=d.useState({minTokens:"2000",maxOutputTokens:"1200",strategy:"auto"}),[P,R]=d.useState({apiKey:"",referer:"https://www.mcphub.app",title:"MCPHub",baseUrl:"https://api.mcprouter.to/v1"}),[f,M]=d.useState({accessTokenLifetime:"3600",refreshTokenLifetime:"1209600",authorizationCodeLifetime:"300",allowedScopes:"read, write",dynamicRegistrationAllowedGrantTypes:"authorization_code, refresh_token",dynamicRegistrationClientTtl:"2592000"}),[u,j]=d.useState({baseUrl:"",basePath:"/api/auth/better",trustedOrigins:"",oidcProviderId:"oidc",oidcDiscoveryUrl:"",oidcScopes:ss.join(", "),oidcPrompt:""}),{dashboardName:N,setDashboardName:F}=It(),[U,X]=d.useState(N),[_,G]=d.useState(!1);d.useEffect(()=>{X(N)},[N]);const Q=async()=>{G(!0);try{const t=U.trim(),a=await Mt("/system-config",{dashboardName:t});if(!a.success)throw new Error(a.message||a.error);F(t),X(t),c(s("settings.systemConfigUpdated"))}catch{c(s("settings.dashboardNameSaveFailed"),"error")}finally{G(!1)}},[y,le]=d.useState("-"),[ee,x]=d.useState(!1),[w,E]=d.useState(null),[$,W]=d.useState(""),[J,K]=d.useState([]),[V,Se]=d.useState("all"),[C,se]=d.useState(!1),[Is,Be]=d.useState(!1),{routingConfig:Ce,tempRoutingConfig:Pe,setTempRoutingConfig:Ks,installConfig:Le,smartRoutingConfig:o,toolResultCompressionConfig:q,mcpRouterConfig:me,oauthServerConfig:k,allowRegistration:Ms,updateAllowRegistration:Us,toolPolicies:Gs,updateToolPolicies:Bs,error:Ls,fetchSettings:Fs,betterAuthConfig:I,nameSeparator:Fe,enableSessionRebuild:_s,allowedCidrs:ns,updateAllowedCidrs:$s,storeToolPayload:Vs,loading:i,bearerKeys:de,updateRoutingConfig:qs,updateInstallConfig:Hs,updateSmartRoutingConfig:Te,updateSmartRoutingConfigBatch:is,updateToolResultCompressionConfig:Qs,updateToolResultCompressionConfigBatch:Ws,updateMCPRouterConfig:Js,updateOAuthServerConfig:ue,updateBetterAuthConfigBatch:ls,updateNameSeparator:Ys,updateSessionRebuild:Xs,updateStoreToolPayload:Zs,exportMCPSettings:et,createBearerKey:st,updateBearerKey:tt,deleteBearerKey:rt,refreshBearerKeys:je}=Gt(),[os,ds]=d.useState("");d.useEffect(()=>{ds(ns.join(`
|
|
12
|
-
`))},[ns]);const te=t=>{var g,T;const a=(T=(g=o.envOverriddenFields)==null?void 0:g.find(H=>H.field===t))==null?void 0:T.envVar;return a?e.jsx("p",{className:"mt-2 text-xs text-amber-700 dark:text-amber-400",children:s("settings.smartRoutingEnvOverrideWarning",{envVar:a})}):null};d.useEffect(()=>{Le&&m(Le)},[Le]),d.useEffect(()=>{o&&p({dbUrl:o.dbUrl||"",basePacingDelayMs:o.basePacingDelayMs!=null?String(o.basePacingDelayMs):"",embeddingProvider:o.embeddingProvider==="azure_openai"?"azure_openai":"openai",embeddingProviderPreset:vr(o.llmProviderBaseUrl||"",o.embeddingModel||""),embeddingEncodingFormat:o.embeddingEncodingFormat==="base64"?"base64":o.embeddingEncodingFormat==="float"?"float":"auto",embeddingDimensions:o.embeddingDimensions!=null?String(o.embeddingDimensions):"",embeddingDimensionsApiPassthrough:o.embeddingDimensionsApiPassthrough,llmProviderBaseUrl:o.llmProviderBaseUrl||"",llmProviderApiKey:o.llmProviderApiKey||"",embeddingModel:o.embeddingModel||"",azureOpenaiEndpoint:o.azureOpenaiEndpoint||"",azureOpenaiApiKey:o.azureOpenaiApiKey||"",azureOpenaiApiVersion:o.azureOpenaiApiVersion||"2024-02-15-preview",azureOpenaiEmbeddingDeployment:o.azureOpenaiEmbeddingDeployment||"",azureOpenaiEmbeddingModel:o.azureOpenaiEmbeddingModel||"",embeddingMaxTokens:o.embeddingMaxTokens!=null?String(o.embeddingMaxTokens):"",embeddingQueryPrefix:o.embeddingQueryPrefix||"",embeddingDocumentPrefix:o.embeddingDocumentPrefix||"",similarityThreshold:o.similarityThreshold!=null?String(o.similarityThreshold):"",fullSchemaTopN:o.fullSchemaTopN!=null?String(o.fullSchemaTopN):""})},[o]),d.useEffect(()=>{q&&L({minTokens:String(q.minTokens||2e3),maxOutputTokens:String(q.maxOutputTokens||1200),strategy:q.strategy||"auto"})},[q]),d.useEffect(()=>{me&&R({apiKey:me.apiKey||"",referer:me.referer||"https://www.mcphub.app",title:me.title||"MCPHub",baseUrl:me.baseUrl||"https://api.mcprouter.to/v1"})},[me]),d.useEffect(()=>{var t,a,g;k&&M({accessTokenLifetime:k.accessTokenLifetime!==void 0?String(k.accessTokenLifetime):"",refreshTokenLifetime:k.refreshTokenLifetime!==void 0?String(k.refreshTokenLifetime):"",authorizationCodeLifetime:k.authorizationCodeLifetime!==void 0?String(k.authorizationCodeLifetime):"",allowedScopes:k.allowedScopes&&k.allowedScopes.length>0?k.allowedScopes.join(", "):"",dynamicRegistrationAllowedGrantTypes:(a=(t=k.dynamicRegistration)==null?void 0:t.allowedGrantTypes)!=null&&a.length?k.dynamicRegistration.allowedGrantTypes.join(", "):"",dynamicRegistrationClientTtl:((g=k.dynamicRegistration)==null?void 0:g.clientTtl)!==void 0?String(k.dynamicRegistration.clientTtl):""})},[k]),d.useEffect(()=>{var t,a;I&&j({baseUrl:I.baseUrl||"",basePath:I.basePath||"/api/auth/better",trustedOrigins:((t=I.trustedOrigins)==null?void 0:t.join(", "))||"",oidcProviderId:I.providers.oidc.providerId||"oidc",oidcDiscoveryUrl:I.providers.oidc.discoveryUrl||"",oidcScopes:((a=I.providers.oidc.scopes)==null?void 0:a.join(", "))||ss.join(", "),oidcPrompt:I.providers.oidc.prompt||""})},[I]),d.useEffect(()=>{le(Fe)},[Fe]),d.useEffect(()=>{je()},[]),d.useEffect(()=>{v&&Ts("/users").then(t=>{t.success&&Array.isArray(t.data)&&K(t.data)})},[v]);const Ae=d.useMemo(()=>br(s,de,J),[s,de,J]),at=d.useMemo(()=>xr(de,V),[de,V]);d.useEffect(()=>{Ae.some(t=>t.value===V)||Se("all")},[V,Ae]);const[D,nt]=d.useState({routingConfig:!1,installConfig:!1,smartRoutingConfig:!1,toolResultCompressionConfig:!1,oauthServerConfig:!1,betterAuthConfig:!1,mcpRouterConfig:!1,nameSeparator:!1,password:!1,exportConfig:!1,bearerKeys:!1}),Z=t=>{nt(a=>({...a,[t]:!a[t]}))},ge=async(t,a)=>{await qs(t,a)},cs=(t,a)=>{Ks(g=>({...g,[t]:a}))},_e=(t,a)=>{m({...S,[t]:a})},$e=async t=>{await Hs(t,S[t])},it=async()=>{se(!0);try{const t=await ts("/cache/clear",{});if(!t||!t.success){c((t==null?void 0:t.message)||s("settings.clearCacheError")||"Failed to clear cache","error");return}const a=t.results||{},g=[];for(const[H,Y]of Object.entries(a))Y.status==="cleared"?g.push(`${H}: ✓`):Y.status==="skipped"?g.push(`${H}: ${s("settings.clearCacheSkipped")||"skipped"}`):g.push(`${H}: ✗ ${Y.message||""}`);const T=g.length>0?g.join(", "):s("settings.clearCacheSuccess");c(T,"success")}catch(t){console.error("Failed to clear cache:",t),c(s("settings.clearCacheError")||"Failed to clear cache","error")}finally{se(!1)}},B=(t,a)=>{p({...r,[t]:a,...t==="llmProviderBaseUrl"||t==="embeddingModel"?{embeddingProviderPreset:"custom"}:{}})},lt=t=>{const a=zs[t];p({...r,embeddingProviderPreset:t,...a.baseUrl?{llmProviderBaseUrl:a.baseUrl}:{},...a.model?{embeddingModel:a.model}:{}})},ms=(t,a)=>{R({...P,[t]:a})},us=async t=>{await Js(t,P[t])},Re=(t,a)=>{M(g=>({...g,[t]:a}))},gs=(t,a)=>{M(g=>({...g,[t]:a}))},Ve=async t=>{const a=f[t];if(!a||a.trim()===""){c(s("settings.invalidNumberInput")||"Please enter a valid number","error");return}const g=Number(a);if(Number.isNaN(g)||g<0){c(s("settings.invalidNumberInput")||"Please enter a valid number","error");return}await ue(t,g)},ot=async()=>{const t=f.allowedScopes.split(",").map(a=>a.trim()).filter(a=>a.length>0);await ue("allowedScopes",t)},dt=async()=>{const t=f.dynamicRegistrationAllowedGrantTypes.split(",").map(a=>a.trim()).filter(a=>a.length>0);await ue("dynamicRegistration",{...k.dynamicRegistration,allowedGrantTypes:t})},ct=async()=>{const t=f.dynamicRegistrationClientTtl;if(t.trim()===""){c(s("settings.invalidNumberInput")||"Please enter a valid number","error");return}const a=Number(t);if(Number.isNaN(a)||a<0){c(s("settings.invalidNumberInput")||"Please enter a valid number","error");return}await ue("dynamicRegistration",{...k.dynamicRegistration,clientTtl:Math.floor(a)})},qe=async(t,a)=>{await ue(t,a)},ps=async t=>{await ue("dynamicRegistration",{...k.dynamicRegistration,...t})},ce=(t,a)=>{j(g=>({...g,[t]:a}))},pe=async t=>{await ls(t)},mt=async()=>{const t={},a=u.baseUrl.trim(),g=u.basePath.trim()||"/api/auth/better",T=fe(u.trustedOrigins)||[],H=u.oidcProviderId.trim()||"oidc",Y=u.oidcDiscoveryUrl.trim(),Ne=fe(u.oidcScopes)||[...ss],we=u.oidcPrompt.trim();a!==(I.baseUrl||"")&&(t.baseUrl=a),g!==I.basePath&&(t.basePath=g),T.join("|")!==(I.trustedOrigins||[]).join("|")&&(t.trustedOrigins=T);const oe={};if(H!==I.providers.oidc.providerId&&(oe.providerId=H),Y!==(I.providers.oidc.discoveryUrl||"")&&(oe.discoveryUrl=Y),Ne.join("|")!==I.providers.oidc.scopes.join("|")&&(oe.scopes=Ne),we!==(I.providers.oidc.prompt||"")&&(oe.prompt=we),Object.keys(oe).length>0&&(t.providers={oidc:oe}),Object.keys(t).length===0){c(s("settings.noChanges")||"No changes to save","info");return}await ls(t)},ut=async()=>{await Ys(y)},gt=()=>{const t=[],a=r.similarityThreshold.trim();a&&!Ze(Number(a))&&t.push(s("settings.similarityThreshold"));const g=r.fullSchemaTopN.trim();return g&&!es(Number(g))&&t.push(s("settings.fullSchemaTopN")),t},hs=()=>{const t=gt();return t.length>0&&c(s("settings.invalidSearchSettings",{fields:t.join(", ")}),"error"),t.length>0},pt=async t=>{if(t){const a=r.dbUrl||o.dbUrl,g=[];if(a||g.push(s("settings.dbUrl")||"Database URL"),r.embeddingProvider==="azure_openai"){const Qe=r.azureOpenaiEndpoint||o.azureOpenaiEndpoint,We=r.azureOpenaiApiKey||o.azureOpenaiApiKey,Je=r.azureOpenaiApiVersion||o.azureOpenaiApiVersion,Ct=r.azureOpenaiEmbeddingDeployment||o.azureOpenaiEmbeddingDeployment;(!Qe||!We||!Je||!Ct)&&g.push(s("settings.azureOpenaiEndpoint")||"Azure OpenAI Endpoint",s("settings.azureOpenaiApiKey")||"Azure OpenAI API Key",s("settings.azureOpenaiApiVersion")||"Azure OpenAI API Version",s("settings.azureOpenaiEmbeddingDeployment")||"Azure Embedding Deployment")}else{const Qe=(typeof r.llmProviderApiKey=="string"?r.llmProviderApiKey:o.llmProviderApiKey||"").trim(),We=(typeof r.llmProviderBaseUrl=="string"?r.llmProviderBaseUrl:o.llmProviderBaseUrl||"").trim(),Je=(typeof r.embeddingModel=="string"?r.embeddingModel:o.embeddingModel||"").trim();Qe||g.push(s("settings.llmProviderApiKey")||"OpenAI API Key"),We||g.push(s("settings.llmProviderBaseUrl")||"OpenAI API Base URL"),Je||g.push(s("settings.embeddingModel")||"OpenAI Embedding Model")}if(g.length>0){c(s("settings.smartRoutingValidationError",{fields:g.join(", ")}));return}if(hs())return;const T={enabled:t};r.dbUrl!==o.dbUrl&&(T.dbUrl=r.dbUrl);const H=Ps(r.basePacingDelayMs,o.basePacingDelayMs);H!==void 0&&(T.basePacingDelayMs=H),r.embeddingProvider!==o.embeddingProvider&&(T.embeddingProvider=r.embeddingProvider),r.embeddingEncodingFormat!==o.embeddingEncodingFormat&&(T.embeddingEncodingFormat=r.embeddingEncodingFormat),r.llmProviderBaseUrl!==o.llmProviderBaseUrl&&(T.llmProviderBaseUrl=r.llmProviderBaseUrl),r.llmProviderApiKey!==o.llmProviderApiKey&&(T.llmProviderApiKey=r.llmProviderApiKey),r.embeddingModel!==o.embeddingModel&&(T.embeddingModel=r.embeddingModel),r.azureOpenaiEndpoint!==o.azureOpenaiEndpoint&&(T.azureOpenaiEndpoint=r.azureOpenaiEndpoint),r.azureOpenaiApiKey!==o.azureOpenaiApiKey&&(T.azureOpenaiApiKey=r.azureOpenaiApiKey),r.azureOpenaiApiVersion!==o.azureOpenaiApiVersion&&(T.azureOpenaiApiVersion=r.azureOpenaiApiVersion),r.azureOpenaiEmbeddingDeployment!==o.azureOpenaiEmbeddingDeployment&&(T.azureOpenaiEmbeddingDeployment=r.azureOpenaiEmbeddingDeployment),r.azureOpenaiEmbeddingModel!==o.azureOpenaiEmbeddingModel&&(T.azureOpenaiEmbeddingModel=r.azureOpenaiEmbeddingModel),r.embeddingQueryPrefix!==(o.embeddingQueryPrefix||"")&&(T.embeddingQueryPrefix=r.embeddingQueryPrefix),r.embeddingDocumentPrefix!==(o.embeddingDocumentPrefix||"")&&(T.embeddingDocumentPrefix=r.embeddingDocumentPrefix);const Y=ks(r.embeddingMaxTokens,o.embeddingMaxTokens);Y!==void 0&&(T.embeddingMaxTokens=Y);const Ne=Ss(r.embeddingDimensions,o.embeddingDimensions);Ne!==void 0&&(T.embeddingDimensions=Ne);const we=Ue(r.similarityThreshold,o.similarityThreshold,Ze);we!==void 0&&(T.similarityThreshold=we);const oe=Ue(r.fullSchemaTopN,o.fullSchemaTopN,es);oe!==void 0&&(T.fullSchemaTopN=oe),await is(T)}else await Te("enabled",t)},ht=async()=>{if(hs())return;const t={};r.dbUrl!==o.dbUrl&&(t.dbUrl=r.dbUrl);const a=Ps(r.basePacingDelayMs,o.basePacingDelayMs);a!==void 0&&(t.basePacingDelayMs=a),r.embeddingProvider!==o.embeddingProvider&&(t.embeddingProvider=r.embeddingProvider),r.embeddingEncodingFormat!==o.embeddingEncodingFormat&&(t.embeddingEncodingFormat=r.embeddingEncodingFormat),r.llmProviderBaseUrl!==o.llmProviderBaseUrl&&(t.llmProviderBaseUrl=r.llmProviderBaseUrl),r.llmProviderApiKey!==o.llmProviderApiKey&&(t.llmProviderApiKey=r.llmProviderApiKey),r.embeddingModel!==o.embeddingModel&&(t.embeddingModel=r.embeddingModel),r.azureOpenaiEndpoint!==o.azureOpenaiEndpoint&&(t.azureOpenaiEndpoint=r.azureOpenaiEndpoint),r.azureOpenaiApiKey!==o.azureOpenaiApiKey&&(t.azureOpenaiApiKey=r.azureOpenaiApiKey),r.azureOpenaiApiVersion!==o.azureOpenaiApiVersion&&(t.azureOpenaiApiVersion=r.azureOpenaiApiVersion),r.azureOpenaiEmbeddingDeployment!==o.azureOpenaiEmbeddingDeployment&&(t.azureOpenaiEmbeddingDeployment=r.azureOpenaiEmbeddingDeployment),r.azureOpenaiEmbeddingModel!==o.azureOpenaiEmbeddingModel&&(t.azureOpenaiEmbeddingModel=r.azureOpenaiEmbeddingModel),r.embeddingQueryPrefix!==(o.embeddingQueryPrefix||"")&&(t.embeddingQueryPrefix=r.embeddingQueryPrefix),r.embeddingDocumentPrefix!==(o.embeddingDocumentPrefix||"")&&(t.embeddingDocumentPrefix=r.embeddingDocumentPrefix);const g=ks(r.embeddingMaxTokens,o.embeddingMaxTokens);g!==void 0&&(t.embeddingMaxTokens=g);const T=Ss(r.embeddingDimensions,o.embeddingDimensions);T!==void 0&&(t.embeddingDimensions=T);const H=Ue(r.similarityThreshold,o.similarityThreshold,Ze);H!==void 0&&(t.similarityThreshold=H);const Y=Ue(r.fullSchemaTopN,o.fullSchemaTopN,es);Y!==void 0&&(t.fullSchemaTopN=Y),Object.keys(t).length>0?await is(t):c(s("settings.noChanges")||"No changes to save","info")},He=(t,a)=>{L(g=>({...g,[t]:a}))},bs=(t,a)=>{const g=Number(t);return!Number.isFinite(g)||g<=0?(c(`${a} must be a positive number`,"error"),null):Math.floor(g)},bt=async t=>{await Qs("enabled",t)},xt=async()=>{const t=bs(O.minTokens,s("settings.toolResultCompressionMinTokens")||"Minimum tokens");if(t===null)return;const a=bs(O.maxOutputTokens,s("settings.toolResultCompressionMaxOutputTokens")||"Output token budget");if(a===null)return;const g={};t!==q.minTokens&&(g.minTokens=t),a!==q.maxOutputTokens&&(g.maxOutputTokens=a),O.strategy!==q.strategy&&(g.strategy=O.strategy),Object.keys(g).length>0?await Ws(g):c(s("settings.noChanges")||"No changes to save","info")},ft=()=>{setTimeout(()=>{n("/")},2e3)},[xs,Oe]=d.useState(!1),[re,yt]=d.useState(""),[b,he]=d.useState({name:"",enabled:!0,kind:"system",owner:"",accessType:"all",allowedGroups:"",allowedServers:"",excludedGroups:"",excludedServers:""}),[be,Ee]=d.useState([]),[xe,De]=d.useState([]),[ze,fs]=d.useState([]),[Ie,ys]=d.useState([]),Ke=l.map(t=>({value:t.name,label:t.name})),Me=h.map(t=>({value:t.name,label:t.name}));d.useEffect(()=>{b.accessType!=="groups"&&b.accessType!=="custom"&&Ee([]),b.accessType!=="servers"&&b.accessType!=="custom"&&De([])},[b.accessType]);const vt=async()=>{try{const t=await et();console.log("Fetched MCP settings:",t);const a=JSON.stringify(t.data,null,2);yt(a)}catch(t){console.error("Error fetching MCP settings:",t),c(s("settings.exportError")||"Failed to fetch settings","error")}};d.useEffect(()=>{D.exportConfig&&!re&&vt()},[D.exportConfig]);const jt=async()=>{if(re)try{if(navigator.clipboard&&window.isSecureContext)await navigator.clipboard.writeText(re),Oe(!0),c(s("common.copySuccess")||"Copied to clipboard","success"),setTimeout(()=>Oe(!1),2e3);else{const t=document.createElement("textarea");t.value=re,t.style.position="fixed",t.style.left="-9999px",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy"),Oe(!0),c(s("common.copySuccess")||"Copied to clipboard","success"),setTimeout(()=>Oe(!1),2e3)}catch(a){c(s("common.copyFailed")||"Copy failed","error"),console.error("Copy to clipboard failed:",a)}document.body.removeChild(t)}}catch(t){console.error("Error copying configuration:",t),c(s("common.copyFailed")||"Copy failed","error")}},Nt=()=>{if(!re)return;const t=new Blob([re],{type:"application/json"}),a=URL.createObjectURL(t),g=document.createElement("a");g.href=a,g.download="mcp_settings.json",document.body.appendChild(g),g.click(),document.body.removeChild(g),URL.revokeObjectURL(a),c(s("settings.exportSuccess")||"Settings exported successfully","success")},fe=t=>{const a=t.split(",").map(g=>g.trim()).filter(g=>g.length>0);return a.length>0?a:void 0},wt=async()=>{if(!b.name){c(s("settings.bearerKeyNameRequired")||"Name is required","error");return}if(v&&b.kind==="user"&&!b.owner){c(s("settings.bearerKeyOwnerRequired")||"Owner is required","error");return}if(b.kind==="system"&&b.accessType==="groups"&&be.length===0){c(s("settings.selectAtLeastOneGroup")||"Please select at least one group","error");return}if(b.kind==="system"&&b.accessType==="servers"&&xe.length===0){c(s("settings.selectAtLeastOneServer")||"Please select at least one server","error");return}if(b.kind==="system"&&b.accessType==="custom"&&be.length===0&&xe.length===0){c(s("settings.selectAtLeastOneGroupOrServer")||"Please select at least one group or server","error");return}if(b.kind==="system"&&b.accessType==="exclude"&&ze.length===0&&Ie.length===0){c(s("settings.selectAtLeastOneExcludedGroupOrServer")||"Please select at least one group or server to exclude","error");return}const t=await st({name:b.name,enabled:b.enabled,kind:v?b.kind:"user",owner:v&&b.kind==="user"?b.owner:void 0,accessType:b.accessType,allowedGroups:(b.accessType==="groups"||b.accessType==="custom")&&be.length>0?be:void 0,allowedServers:(b.accessType==="servers"||b.accessType==="custom")&&xe.length>0?xe:void 0,excludedGroups:b.accessType==="exclude"&&ze.length>0?ze:void 0,excludedServers:b.accessType==="exclude"&&Ie.length>0?Ie:void 0});t&&(W(t.token),he({name:"",enabled:!0,kind:"system",owner:"",accessType:"all",allowedGroups:"",allowedServers:"",excludedGroups:"",excludedServers:""}),Ee([]),De([]),fs([]),ys([]),await je())},kt=async(t,a)=>{await tt(t,{name:a.name,enabled:a.enabled,accessType:a.accessType,allowedGroups:fe(a.allowedGroups),allowedServers:fe(a.allowedServers),excludedGroups:fe(a.excludedGroups),excludedServers:fe(a.excludedServers)}),await je()},St=async t=>{await rt(t),await je()};return e.jsxs("div",{children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"hub-h1",children:s("pages.settings.title")}),e.jsx("p",{className:"hub-sub",children:s("settings.subtitle")||""})]}),w&&e.jsx(or,{keyData:w,onClose:()=>E(null),onReset:async()=>{W(""),await je()}}),v&&e.jsx(mr,{nameSeparator:Fe,rules:Gs,loading:i,loadError:Ls,onRetry:Fs,onSave:Bs,users:J,bearerKeys:de,servers:l,groups:h}),e.jsxs("div",{className:"hub-card mb-6 overflow-visible",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] rounded-t-[9px] py-3 px-5",onClick:()=>Z("bearerKeys"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(Ht,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("settings.bearerKeysSectionTitle")||"Bearer authentication keys"})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.bearerKeys?"−":"+"})]}),D.bearerKeys&&e.jsxs("div",{className:"space-y-4 pb-4 px-6 pt-4 border-t border-[var(--hub-line-2)]",children:[$&&e.jsxs("div",{className:"p-3 rounded-md border border-amber-300 bg-amber-50 text-amber-900 dark:border-amber-700/60 dark:bg-amber-900/20 dark:text-amber-300 text-sm",children:[e.jsx("div",{className:"font-medium",children:s("settings.bearerKeyShownOnce")||"Copy this token now. It will not be shown again."}),e.jsx("div",{className:"mt-2 font-mono break-all",children:$})]}),v&&e.jsx(e.Fragment,{children:e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.enableBearerAuth")||"Enable Bearer Authentication"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.enableBearerAuthDescription")||"Require bearer token authentication for MCP requests"})]}),e.jsx(z,{disabled:i,checked:Ce.enableBearerAuth,onCheckedChange:t=>ge("enableBearerAuth",t)})]})}),v&&e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.bearerAuthHeaderName")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.bearerAuthHeaderNameDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"text",value:Pe.bearerAuthHeaderName,onChange:t=>cs("bearerAuthHeaderName",t.target.value),placeholder:s("settings.bearerAuthHeaderNamePlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:()=>ge("bearerAuthHeaderName",Pe.bearerAuthHeaderName),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"flex flex-wrap justify-between items-center gap-3",children:[e.jsx("p",{className:"text-sm text-gray-600",children:s("settings.bearerKeysSectionDescription")||"Manage multiple bearer authentication keys with different access scopes."}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[de.length>0&&Ae.length>1&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:"bearer-key-scope-filter",className:"text-sm text-gray-600 whitespace-nowrap",children:s("settings.bearerKeyScopeFilter")||"Filter by scope"}),e.jsx("select",{id:"bearer-key-scope-filter",className:"block min-w-48 py-2 px-3 border border-gray-300 bg-white dark:bg-gray-800 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-select transition-shadow duration-200",value:V,onChange:t=>Se(t.target.value),children:Ae.map(t=>e.jsx("option",{value:t.value,children:t.label},t.value))})]}),!ee&&e.jsxs("button",{type:"button",onClick:()=>x(!0),className:"flex items-center text-blue-600 hover:text-blue-800 font-medium transition-colors duration-200",children:[e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",className:"h-5 w-5 mr-1",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z",clipRule:"evenodd"})}),s("settings.addBearerKey")||"Add bearer key"]})]})]}),de.length===0?e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.noBearerKeys")||"No bearer keys configured yet."}):e.jsx("div",{className:"mt-2 overflow-x-auto",children:e.jsxs("table",{className:"min-w-full divide-y divide-gray-200 dark:divide-gray-700 border border-gray-200 dark:border-gray-700 rounded-lg",children:[e.jsx("thead",{className:"bg-gray-50 dark:bg-gray-800",children:e.jsxs("tr",{children:[e.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:s("settings.bearerKeyName")||"Name"}),e.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:s("settings.bearerKeyToken")||"Token"}),e.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:s("settings.bearerKeyEnabled")||"Status"}),e.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:s("settings.bearerKeyAccessType")||"Access Scope"}),e.jsx("th",{scope:"col",className:"px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider",children:s("common.actions")||"Actions"})]})}),e.jsx("tbody",{className:"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700",children:at.map(t=>e.jsx(fr,{keyData:t,loading:i,availableServers:Ke,availableGroups:Me,isAdmin:v,onSave:kt,onDelete:St,onReset:E},t.id))})]})}),ee&&e.jsx("div",{className:"mt-6 border-t border-gray-200 dark:border-gray-700 pt-6",children:e.jsxs("div",{className:"bg-gray-50 dark:bg-gray-800 rounded-lg p-5 border border-gray-200 dark:border-gray-700",children:[e.jsxs("h3",{className:"font-medium text-gray-900 mb-4 flex items-center gap-2",children:[e.jsx("span",{className:"bg-blue-100 text-blue-600 p-1 rounded",children:e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",className:"h-4 w-4",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z",clipRule:"evenodd"})})}),s("settings.addBearerKey")||"Add bearer key"]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-12 gap-4 mb-4",children:[e.jsxs("div",{className:"md:col-span-4",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:s("settings.bearerKeyName")||"Name"}),e.jsx("input",{type:"text",className:"block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input transition-shadow duration-200",placeholder:"e.g. My API Key",value:b.name,onChange:t=>he(a=>({...a,name:t.target.value})),disabled:i})]}),v&&e.jsxs("div",{className:"md:col-span-4",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:s("settings.bearerKeyKind")||"Key type"}),e.jsxs("select",{className:"block w-full py-2 px-3 border border-gray-300 bg-white dark:bg-gray-800 rounded-md sm:text-sm form-select",value:b.kind,onChange:t=>he(a=>({...a,kind:t.target.value})),children:[e.jsx("option",{value:"system",children:s("settings.bearerKeyKindSystem")||"System-level"}),e.jsx("option",{value:"user",children:s("settings.bearerKeyKindUser")||"User-level"})]})]}),v&&b.kind==="user"&&e.jsxs("div",{className:"md:col-span-4",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:s("settings.bearerKeyOwner")||"Owner"}),e.jsxs("select",{className:"block w-full py-2 px-3 border border-gray-300 bg-white dark:bg-gray-800 rounded-md sm:text-sm form-select",value:b.owner,onChange:t=>he(a=>({...a,owner:t.target.value})),children:[e.jsx("option",{value:"",children:s("settings.bearerKeySelectOwner")||"Select user..."}),J.map(t=>e.jsx("option",{value:t.username,children:t.username},t.username))]})]})]}),e.jsxs("div",{className:"flex flex-wrap items-end gap-4 mb-2",children:[e.jsxs("div",{className:"w-40",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:s("settings.bearerKeyEnabled")||"Status"}),e.jsxs("div",{className:"flex items-center h-[38px] px-3 bg-white dark:bg-gray-800 border border-gray-300 rounded-md",children:[e.jsx("span",{className:`text-sm mr-3 ${b.enabled?"text-green-600 font-medium":"text-gray-500"}`,children:b.enabled?"Active":"Inactive"}),e.jsx(z,{disabled:i,checked:b.enabled,onCheckedChange:t=>he(a=>({...a,enabled:t}))})]})]}),v&&b.kind==="system"&&e.jsxs("div",{className:"w-48",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:s("settings.bearerKeyAccessType")||"Access scope"}),e.jsxs("select",{className:"block w-full py-2 px-3 border border-gray-300 bg-white dark:bg-gray-800 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-select transition-shadow duration-200",value:b.accessType,onChange:t=>he(a=>({...a,accessType:t.target.value})),disabled:i,children:[e.jsx("option",{value:"all",children:s("settings.bearerKeyAccessAll")||"All Resources"}),e.jsx("option",{value:"groups",children:s("settings.bearerKeyAccessGroups")||"Specific Groups"}),e.jsx("option",{value:"servers",children:s("settings.bearerKeyAccessServers")||"Specific Servers"}),e.jsx("option",{value:"custom",children:s("settings.bearerKeyAccessCustom")||"Custom (Groups & Servers)"}),e.jsx("option",{value:"exclude",children:s("settings.bearerKeyAccessExclude")||"All except selected groups/servers"})]})]}),v&&b.kind==="system"&&b.accessType!=="custom"&&b.accessType!=="exclude"&&e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:`block text-sm font-medium mb-1 ${b.accessType==="all"?"text-gray-400":"text-gray-700"}`,children:b.accessType==="groups"?s("settings.bearerKeyAllowedGroups")||"Allowed groups":s("settings.bearerKeyAllowedServers")||"Allowed servers"}),e.jsx(ie,{options:b.accessType==="groups"?Me:Ke,selected:b.accessType==="groups"?be:xe,onChange:b.accessType==="groups"?Ee:De,placeholder:b.accessType==="groups"?s("settings.selectGroups")||"Select groups...":s("settings.selectServers")||"Select servers...",disabled:i||b.accessType==="all"})]}),v&&b.kind==="system"&&b.accessType==="custom"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:s("settings.bearerKeyAllowedGroups")||"Allowed groups"}),e.jsx(ie,{options:Me,selected:be,onChange:Ee,placeholder:s("settings.selectGroups")||"Select groups...",disabled:i})]}),e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:s("settings.bearerKeyAllowedServers")||"Allowed servers"}),e.jsx(ie,{options:Ke,selected:xe,onChange:De,placeholder:s("settings.selectServers")||"Select servers...",disabled:i})]})]}),v&&b.kind==="system"&&b.accessType==="exclude"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:s("settings.bearerKeyExcludedGroups")||"Excluded groups"}),e.jsx(ie,{options:Me,selected:ze,onChange:fs,placeholder:s("settings.selectGroups")||"Select groups...",disabled:i})]}),e.jsxs("div",{className:"flex-1 min-w-[200px]",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:s("settings.bearerKeyExcludedServers")||"Excluded servers"}),e.jsx(ie,{options:Ke,selected:Ie,onChange:ys,placeholder:s("settings.selectServers")||"Select servers...",disabled:i})]})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:()=>x(!1),className:"hub-btn",children:s("common.cancel")||"Cancel"}),e.jsx("button",{type:"button",onClick:wt,disabled:i,className:"hub-btn primary",children:s("settings.addBearerKeyButton")||"Create Key"})]})]})]})})]})]}),e.jsx(ae,{permissions:ne.SETTINGS_SMART_ROUTING,children:e.jsxs("div",{className:"hub-card mb-6 overflow-hidden",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] px-6 py-3",onClick:()=>Z("smartRoutingConfig"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(Ns,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("pages.settings.smartRouting")}),e.jsxs("span",{className:"hub-status ml-2","data-state":o.enabled?"on":"off",children:[e.jsx("span",{className:"hub-dot",style:{background:o.enabled?"var(--hub-ok)":"var(--hub-ink-3)",boxShadow:o.enabled?"0 0 0 3px oklch(0.66 0.15 145 / 0.15)":"none"}}),e.jsx("span",{style:{color:o.enabled?"oklch(0.4 0.13 145)":"var(--hub-ink-3)",fontSize:12},children:o.enabled?s("common.active"):s("common.inactive")})]})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.smartRoutingConfig?"−":"+"})]}),D.smartRoutingConfig&&e.jsxs("div",{className:"px-6 py-5 border-t border-[var(--hub-line-2)]",children:[e.jsx("div",{className:"hub-card mb-4",style:{padding:16,background:"var(--hub-bg-2)"},children:e.jsxs("div",{className:"grid items-center gap-4",style:{gridTemplateColumns:"1.1fr 1px 1.4fr 1px auto"},children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"relative",style:{width:40,height:40},children:[e.jsx("div",{className:"absolute inset-0 rounded-md grid place-items-center",style:{background:o.enabled?"oklch(0.95 0.05 145)":"var(--hub-bg-2)",border:"1px solid var(--hub-line)"},children:e.jsx(Ns,{size:18,style:{color:o.enabled?"oklch(0.4 0.13 145)":"var(--hub-ink-3)"}})}),o.enabled&&e.jsx("span",{className:"absolute",style:{top:-2,right:-2,width:10,height:10,borderRadius:50,background:"var(--hub-ok)",boxShadow:"0 0 0 2px var(--hub-surface)"}})]}),e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:13.5,fontWeight:500},children:o.enabled?s("common.active"):s("common.inactive")}),e.jsx("div",{style:{fontSize:11.5,color:"var(--hub-ink-3)"},children:s("settings.enableSmartRoutingDescription")})]})]}),e.jsx("div",{style:{background:"var(--hub-line)",height:36}}),e.jsxs("div",{children:[e.jsx("div",{className:"hub-sect",style:{marginBottom:5},children:"smart endpoint"}),e.jsx(lr,{label:"SMART",url:`${(S.baseUrl||"").replace(/\/+$/,"")}/mcp/${Kt()}`})]}),e.jsx("div",{style:{background:"var(--hub-line)",height:36}}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{style:{fontSize:12.5,color:"var(--hub-ink-2)"},children:s("settings.enableSmartRouting")}),e.jsx(z,{disabled:i,checked:o.enabled,onCheckedChange:t=>pt(t)})]})]})}),e.jsxs("div",{className:"hub-card mb-4",style:{padding:18},children:[e.jsx("h3",{className:"hub-card-title",style:{marginBottom:4},children:s("settings.smartRoutingWorkflow")||"Workflow"}),e.jsx("p",{className:"hub-sub",style:{marginTop:0,marginBottom:16},children:s("settings.smartRoutingWorkflowDescription")||"Prompt is embedded, top-k similar tools are retrieved from pgvector, only relevant tools are exposed."}),e.jsx("div",{className:"grid items-center",style:{gridTemplateColumns:"repeat(9, 1fr)"},children:[{icon:e.jsx(Qt,{size:16}),title:"Prompt",sub:"client"},null,{icon:e.jsx(Wt,{size:16}),title:"Embedding",sub:"openai · 1536d"},null,{icon:e.jsx(Ds,{size:16}),title:"pgvector",sub:"ann · cosine"},null,{icon:e.jsx(Jt,{size:16}),title:"Top-K",sub:"score > 0.7"},null,{icon:e.jsx(Yt,{size:16}),title:"LLM",sub:"relevant subset"}].map((t,a)=>t===null?e.jsx("div",{className:"flex justify-center",children:e.jsxs("svg",{width:"100%",height:"20",preserveAspectRatio:"none",viewBox:"0 0 100 20",children:[e.jsx("line",{x1:"4",y1:"10",x2:"96",y2:"10",stroke:"var(--hub-line)",strokeWidth:"1",strokeDasharray:"3 3"}),e.jsx("polygon",{points:"96,10 88,6 88,14",fill:"var(--hub-ink-3)"})]})},`sep-${a}`):e.jsxs("div",{className:"flex flex-col items-center gap-2",children:[e.jsx("div",{className:"grid place-items-center",style:{width:42,height:42,borderRadius:10,border:"1px solid var(--hub-line)",background:"var(--hub-surface)",color:"var(--hub-ink)"},children:t.icon}),e.jsxs("div",{className:"text-center",children:[e.jsx("div",{style:{fontSize:12,fontWeight:500},children:t.title}),e.jsx("div",{className:"hub-mono",style:{fontSize:10.5,color:"var(--hub-ink-3)"},children:t.sub})]})]},a))})]}),e.jsx("div",{className:"mb-4 flex items-start gap-2",style:{padding:"8px 12px",borderRadius:7,background:"var(--hub-accent-soft)",color:"var(--hub-accent)",fontSize:12.5},children:e.jsx("span",{children:s("settings.smartRoutingRequiredFields")})}),e.jsxs("div",{className:"space-y-3 hub-sr-fields",children:[o.dbUrl!=="${DB_URL}"&&e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("div",{className:"mb-2",children:e.jsxs("h3",{className:"font-medium text-gray-700",children:[e.jsx("span",{className:"text-red-500 px-1",children:"*"}),s("settings.dbUrl")]})}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"text",value:r.dbUrl,onChange:t=>B("dbUrl",t.target.value),placeholder:s("settings.dbUrlPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm border-gray-300 form-input",disabled:i})})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("div",{className:"mb-2",children:e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.embeddingProvider")||"Embedding Provider"})}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsxs("select",{className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 bg-white dark:bg-gray-800 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-select",value:r.embeddingProvider,onChange:t=>B("embeddingProvider",t.target.value),disabled:i,children:[e.jsx("option",{value:"openai",children:"OpenAI (or compatible)"}),e.jsx("option",{value:"azure_openai",children:"Azure OpenAI"})]})})]}),r.embeddingProvider==="openai"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.embeddingProviderPreset")||"Provider Preset"}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.embeddingProviderPresetDescription")||"Choose a provider to prefill its OpenAI-compatible endpoint and model."})]}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsxs("select",{value:r.embeddingProviderPreset,onChange:t=>lt(t.target.value),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 bg-white dark:bg-gray-800 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-select",disabled:i,children:[e.jsx("option",{value:"openai",children:s("settings.embeddingProviderPresetOpenai")||"OpenAI"}),e.jsx("option",{value:"openrouter",children:s("settings.embeddingProviderPresetOpenrouter")||"OpenRouter"}),e.jsx("option",{value:"siliconflow",children:s("settings.embeddingProviderPresetSiliconflow")||"SiliconFlow · free tier"}),e.jsx("option",{value:"gemini",children:s("settings.embeddingProviderPresetGemini")||"Google Gemini · free tier"}),e.jsx("option",{value:"custom",children:s("settings.embeddingProviderPresetCustom")||"Other / OpenAI-compatible"})]})})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("div",{className:"mb-2",children:e.jsxs("h3",{className:"font-medium text-gray-700",children:[e.jsx("span",{className:"text-red-500 px-1",children:"*"}),s("settings.llmProviderApiKey")]})}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"password",value:r.llmProviderApiKey,onChange:t=>B("llmProviderApiKey",t.target.value),placeholder:s("settings.llmProviderApiKeyPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm border-gray-300",disabled:i})}),te("llmProviderApiKey")]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("div",{className:"mb-2",children:e.jsxs("h3",{className:"font-medium text-gray-700",children:[e.jsx("span",{className:"text-red-500 px-1",children:"*"}),s("settings.llmProviderBaseUrl")]})}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"text",value:r.llmProviderBaseUrl,onChange:t=>B("llmProviderBaseUrl",t.target.value),placeholder:s("settings.llmProviderBaseUrlPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i,required:!0})}),te("llmProviderBaseUrl")]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("div",{className:"mb-2",children:e.jsxs("h3",{className:"font-medium text-gray-700",children:[e.jsx("span",{className:"text-red-500 px-1",children:"*"}),s("settings.embeddingModel")]})}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"text",value:r.embeddingModel,onChange:t=>B("embeddingModel",t.target.value),placeholder:s("settings.embeddingModelPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i,required:!0})}),te("embeddingModel")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("div",{className:"mb-2",children:e.jsxs("h3",{className:"font-medium text-gray-700",children:[e.jsx("span",{className:"text-red-500 px-1",children:"*"}),s("settings.azureOpenaiEndpoint")||"Azure OpenAI Endpoint"]})}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"text",value:r.azureOpenaiEndpoint,onChange:t=>B("azureOpenaiEndpoint",t.target.value),placeholder:s("settings.azureOpenaiEndpointPlaceholder")||"https://YOUR_RESOURCE_NAME.openai.azure.com",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})}),te("azureOpenaiEndpoint")]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("div",{className:"mb-2",children:e.jsxs("h3",{className:"font-medium text-gray-700",children:[e.jsx("span",{className:"text-red-500 px-1",children:"*"}),s("settings.azureOpenaiApiKey")||"Azure OpenAI API Key"]})}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"password",value:r.azureOpenaiApiKey,onChange:t=>B("azureOpenaiApiKey",t.target.value),placeholder:s("settings.azureOpenaiApiKeyPlaceholder")||"***",className:"flex-1 mt-1 block w-full py-2 px-3 border rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm border-gray-300",disabled:i})}),te("azureOpenaiApiKey")]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("div",{className:"mb-2",children:e.jsxs("h3",{className:"font-medium text-gray-700",children:[e.jsx("span",{className:"text-red-500 px-1",children:"*"}),s("settings.azureOpenaiApiVersion")||"Azure OpenAI API Version"]})}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"text",value:r.azureOpenaiApiVersion,onChange:t=>B("azureOpenaiApiVersion",t.target.value),placeholder:s("settings.azureOpenaiApiVersionPlaceholder")||"2024-02-15-preview",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("div",{className:"mb-2",children:e.jsxs("h3",{className:"font-medium text-gray-700",children:[e.jsx("span",{className:"text-red-500 px-1",children:"*"}),s("settings.azureOpenaiEmbeddingDeployment")||"Azure Embedding Deployment"]})}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"text",value:r.azureOpenaiEmbeddingDeployment,onChange:t=>B("azureOpenaiEmbeddingDeployment",t.target.value),placeholder:s("settings.azureOpenaiEmbeddingDeploymentPlaceholder")||"your-embedding-deployment-name",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsxs("h3",{className:"font-medium text-gray-700",children:[e.jsx("span",{className:"text-red-500 px-1",children:"*"}),s("settings.azureOpenaiEmbeddingModel")||"Azure Embedding Model Name"]}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.azureOpenaiEmbeddingModelDescription")||"The actual OpenAI model name deployed in Azure (e.g. text-embedding-3-small). Used for accurate token counting."})]}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"text",value:r.azureOpenaiEmbeddingModel,onChange:t=>B("azureOpenaiEmbeddingModel",t.target.value),placeholder:s("settings.azureOpenaiEmbeddingModelPlaceholder")||"text-embedding-3-small",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i,required:!0})})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.embeddingDimensions")||"Embedding Dimensions"}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.embeddingDimensionsDescription")||"Optional output size for providers that support it. Leave empty to use the model's default."})]}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"number",min:"1",step:"1",value:r.embeddingDimensions,onChange:t=>B("embeddingDimensions",t.target.value),placeholder:s("settings.embeddingDimensionsPlaceholder")||"Empty = model default",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})}),e.jsxs("div",{className:"flex items-center justify-between mt-3",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-gray-700",children:s("settings.embeddingDimensionsApiPassthrough")||"Forward dimensions to API (MRL passthrough)"}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.embeddingDimensionsApiPassthroughDescription")||"Only models known to support Matryoshka (MRL) receive the dimensions parameter. Enable this to force it for other MRL-capable models. Non-MRL models (Qwen3-Embedding, BGE, vLLM/sglang) reject the parameter outright, so leave this off for them."})]}),e.jsx(z,{disabled:i||!o.enabled,checked:o.embeddingDimensionsApiPassthrough,onCheckedChange:t=>Te("embeddingDimensionsApiPassthrough",t)})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.basePacingDelayMs")}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.basePacingDelayMsDescription")})]}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"number",min:"0",step:"1000",value:r.basePacingDelayMs,onChange:t=>B("basePacingDelayMs",t.target.value),placeholder:s("settings.basePacingDelayMsPlaceholder")||"Empty = default 0 ms",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})}),e.jsx("p",{className:"text-xs text-gray-500 mt-2",children:(()=>{const t=r.basePacingDelayMs.trim();return t?s(t==="0"?"settings.basePacingDelayMsZero":"settings.basePacingDelayMsOverride"):s("settings.basePacingDelayMsAuto",{value:0})})()})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.embeddingEncodingFormat")}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.embeddingEncodingFormatDescription")})]}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsxs("select",{value:r.embeddingEncodingFormat,onChange:t=>B("embeddingEncodingFormat",t.target.value),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-select",disabled:i,children:[e.jsx("option",{value:"auto",children:s("settings.embeddingEncodingFormatAuto")||"Auto"}),e.jsx("option",{value:"base64",children:"Base64"}),e.jsx("option",{value:"float",children:"Float"})]})})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.embeddingMaxTokens")}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.embeddingMaxTokensDescription")})]}),e.jsx("div",{className:"flex items-center gap-3",children:e.jsx("input",{type:"number",min:"1",value:r.embeddingMaxTokens,onChange:t=>B("embeddingMaxTokens",t.target.value),placeholder:s("settings.embeddingMaxTokensPlaceholder")||"Empty = auto by model",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})}),e.jsx("p",{className:"text-xs text-gray-500 mt-2",children:(()=>{const t=(r.embeddingProvider==="azure_openai"?r.azureOpenaiEmbeddingModel||o.azureOpenaiEmbeddingModel:r.embeddingModel||o.embeddingModel)||"text-embedding-3-small";return r.embeddingMaxTokens.trim()?s("settings.embeddingMaxTokensOverride"):s("settings.embeddingMaxTokensAuto",{limit:yr(t),model:t})})()})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.embeddingPrefixes")}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.embeddingPrefixesDescription")})]}),e.jsx("label",{htmlFor:"embeddingQueryPrefix",className:"block text-xs text-gray-600 mt-2",children:s("settings.embeddingQueryPrefix")}),e.jsx("input",{id:"embeddingQueryPrefix",type:"text",value:r.embeddingQueryPrefix,onChange:t=>B("embeddingQueryPrefix",t.target.value),placeholder:"task: search result | query: ",className:"mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input font-mono",disabled:i}),te("embeddingQueryPrefix"),e.jsx("label",{htmlFor:"embeddingDocumentPrefix",className:"block text-xs text-gray-600 mt-3",children:s("settings.embeddingDocumentPrefix")}),e.jsx("input",{id:"embeddingDocumentPrefix",type:"text",value:r.embeddingDocumentPrefix,onChange:t=>B("embeddingDocumentPrefix",t.target.value),placeholder:"title: none | text: ",className:"mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input font-mono",disabled:i}),te("embeddingDocumentPrefix")]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.searchResults")}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.searchResultsDescription")})]}),e.jsx("label",{htmlFor:"similarityThreshold",className:"block text-xs text-gray-600 mt-2",children:s("settings.similarityThreshold")}),e.jsx("input",{id:"similarityThreshold",type:"number",min:"0",max:"1",step:"0.05",value:r.similarityThreshold,onChange:t=>B("similarityThreshold",t.target.value),placeholder:s("settings.similarityThresholdPlaceholder"),className:"mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),te("similarityThreshold"),e.jsx("label",{htmlFor:"fullSchemaTopN",className:"block text-xs text-gray-600 mt-3",children:s("settings.fullSchemaTopN")}),e.jsx("input",{id:"fullSchemaTopN",type:"number",min:"0",step:"1",value:r.fullSchemaTopN,onChange:t=>B("fullSchemaTopN",t.target.value),placeholder:s("settings.fullSchemaTopNPlaceholder"),className:"mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),te("fullSchemaTopN"),e.jsx("p",{className:"block text-xs text-gray-600 mt-3",children:s("settings.toolDefinitionFields")}),e.jsx("div",{className:"mt-1 flex flex-wrap gap-x-4 gap-y-1",children:Cs.map(t=>{const a=o.toolDefinitionFields??jr;return e.jsxs("label",{className:"flex items-center gap-1 text-sm font-mono",children:[e.jsx("input",{type:"checkbox",className:"form-checkbox h-4 w-4",checked:a.includes(t),onChange:g=>Te("toolDefinitionFields",Cs.filter(T=>T===t?g.target.checked:a.includes(T))),disabled:i}),t]},t)})}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.toolDefinitionFieldsDescription")}),te("toolDefinitionFields")]}),e.jsxs("div",{className:"flex items-center justify-between",style:{padding:"12px 14px",border:"1px solid var(--hub-line)",borderRadius:8,background:"var(--hub-bg-2)"},children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",style:{color:"var(--hub-ink)",fontSize:13},children:s("settings.progressiveDisclosure")}),e.jsx("p",{style:{fontSize:12,color:"var(--hub-ink-3)"},children:s("settings.progressiveDisclosureDescription")})]}),e.jsx(z,{disabled:i||!o.enabled,checked:o.progressiveDisclosure,onCheckedChange:t=>Te("progressiveDisclosure",t)})]})]}),e.jsx("div",{className:"flex justify-end pt-3",children:e.jsx("button",{onClick:ht,disabled:i,className:"hub-btn primary",children:s("common.save")})}),e.jsx("div",{style:{marginTop:20},children:e.jsx(pr,{enabled:o.enabled})})]})]})}),e.jsx(ae,{permissions:ne.SETTINGS_SMART_ROUTING,children:e.jsxs("div",{className:"hub-card mb-6 overflow-hidden",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] px-6 py-3",onClick:()=>Z("toolResultCompressionConfig"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(Xt,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("settings.toolResultCompressionTitle")||"Tool Result Compression"}),e.jsxs("span",{className:"hub-status ml-2","data-state":q.enabled?"on":"off",children:[e.jsx("span",{className:"hub-dot",style:{background:q.enabled?"var(--hub-ok)":"var(--hub-ink-3)",boxShadow:q.enabled?"0 0 0 3px oklch(0.66 0.15 145 / 0.15)":"none"}}),e.jsx("span",{style:{color:q.enabled?"oklch(0.4 0.13 145)":"var(--hub-ink-3)",fontSize:12},children:q.enabled?s("common.active"):s("common.inactive")})]})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.toolResultCompressionConfig?"−":"+"})]}),D.toolResultCompressionConfig&&e.jsxs("div",{className:"px-6 py-5 border-t border-[var(--hub-line-2)]",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",style:{padding:"12px 14px",border:"1px solid var(--hub-line)",borderRadius:8,background:"var(--hub-bg-2)"},children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",style:{color:"var(--hub-ink)",fontSize:13},children:s("settings.toolResultCompressionEnable")||"Enable compression"}),e.jsx("p",{style:{fontSize:12,color:"var(--hub-ink-3)"},children:s("settings.toolResultCompressionDescription")||"Reduce large text tool outputs before they reach MCP clients. Changes apply to the next tool call."})]}),e.jsx(z,{disabled:i,checked:q.enabled,onCheckedChange:t=>bt(t)})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.toolResultCompressionStrategy")||"Strategy"}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.toolResultCompressionStrategyDescription")||"Auto detects JSON, logs, search output, diffs, and plain text."})]}),e.jsxs("select",{value:O.strategy,onChange:t=>He("strategy",t.target.value),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 bg-white dark:bg-gray-800 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-select",disabled:i,children:[e.jsx("option",{value:"auto",children:"Auto"}),e.jsx("option",{value:"json",children:"JSON"}),e.jsx("option",{value:"log",children:"Log"}),e.jsx("option",{value:"search",children:"Search"}),e.jsx("option",{value:"diff",children:"Diff"}),e.jsx("option",{value:"text",children:"Text"})]})]}),e.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.toolResultCompressionMinTokens")||"Minimum tokens"}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.toolResultCompressionMinTokensDescription")||"Only compress text blocks at or above this size."})]}),e.jsx("input",{type:"number",min:"1",value:O.minTokens,onChange:t=>He("minTokens",t.target.value),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.toolResultCompressionMaxOutputTokens")||"Output token budget"}),e.jsx("p",{className:"text-xs text-gray-500 mt-1",children:s("settings.toolResultCompressionMaxOutputTokensDescription")||"Target maximum tokens for each compressed text block."})]}),e.jsx("input",{type:"number",min:"1",value:O.maxOutputTokens,onChange:t=>He("maxOutputTokens",t.target.value),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})]})]})]}),e.jsx("div",{className:"flex justify-end pt-4",children:e.jsx("button",{onClick:xt,disabled:i,className:"hub-btn primary",children:s("common.save")})})]})]})}),e.jsx(ae,{permissions:ne.SETTINGS_OAUTH_SERVER,children:e.jsxs("div",{className:"hub-card mb-6 overflow-hidden",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] py-3 px-5",onClick:()=>Z("oauthServerConfig"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(ws,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("pages.settings.oauthServer")})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.oauthServerConfig?"−":"+"})]}),D.oauthServerConfig&&e.jsxs("div",{className:"space-y-4 pb-4 px-6 pt-4 border-t border-[var(--hub-line-2)]",children:[e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.enableOauthServer")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.enableOauthServerDescription")})]}),e.jsx(z,{disabled:i,checked:k.enabled,onCheckedChange:t=>qe("enabled",t)})]}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.requireClientSecret")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.requireClientSecretDescription")})]}),e.jsx(z,{disabled:i||!k.enabled,checked:k.requireClientSecret,onCheckedChange:t=>qe("requireClientSecret",t)})]}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.requireState")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.requireStateDescription")})]}),e.jsx(z,{disabled:i||!k.enabled,checked:k.requireState,onCheckedChange:t=>qe("requireState",t)})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.accessTokenLifetime")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.accessTokenLifetimeDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"number",value:f.accessTokenLifetime,onChange:t=>Re("accessTokenLifetime",t.target.value),placeholder:s("settings.accessTokenLifetimePlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:()=>Ve("accessTokenLifetime"),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.refreshTokenLifetime")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.refreshTokenLifetimeDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"number",value:f.refreshTokenLifetime,onChange:t=>Re("refreshTokenLifetime",t.target.value),placeholder:s("settings.refreshTokenLifetimePlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:()=>Ve("refreshTokenLifetime"),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.authorizationCodeLifetime")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.authorizationCodeLifetimeDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"number",value:f.authorizationCodeLifetime,onChange:t=>Re("authorizationCodeLifetime",t.target.value),placeholder:s("settings.authorizationCodeLifetimePlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:()=>Ve("authorizationCodeLifetime"),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.allowedScopes")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.allowedScopesDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"text",value:f.allowedScopes,onChange:t=>gs("allowedScopes",t.target.value),placeholder:s("settings.allowedScopesPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:ot,disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md space-y-4",children:[e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.enableDynamicRegistration")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.dynamicRegistrationDescription")})]}),e.jsx(z,{disabled:i||!k.enabled,checked:k.dynamicRegistration.enabled,onCheckedChange:t=>ps({enabled:t})})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.dynamicRegistrationAllowedGrantTypes")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.dynamicRegistrationAllowedGrantTypesDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"text",value:f.dynamicRegistrationAllowedGrantTypes,onChange:t=>gs("dynamicRegistrationAllowedGrantTypes",t.target.value),placeholder:s("settings.dynamicRegistrationAllowedGrantTypesPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i||!k.enabled||!k.dynamicRegistration.enabled}),e.jsx("button",{onClick:dt,disabled:i||!k.enabled||!k.dynamicRegistration.enabled,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.dynamicRegistrationClientTtl")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.dynamicRegistrationClientTtlDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"number",min:0,value:f.dynamicRegistrationClientTtl,onChange:t=>Re("dynamicRegistrationClientTtl",t.target.value),placeholder:s("settings.dynamicRegistrationClientTtlPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i||!k.enabled||!k.dynamicRegistration.enabled}),e.jsx("button",{onClick:ct,disabled:i||!k.enabled||!k.dynamicRegistration.enabled,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.dynamicRegistrationAuth")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.dynamicRegistrationAuthDescription")})]}),e.jsx(z,{disabled:i||!k.enabled||!k.dynamicRegistration.enabled,checked:k.dynamicRegistration.requiresAuthentication,onCheckedChange:t=>ps({requiresAuthentication:t})})]})]})]})]})}),e.jsx(ae,{permissions:ne.SETTINGS_INSTALL_CONFIG,children:e.jsxs("div",{className:"hub-card mb-6 overflow-hidden",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] py-3 px-5",onClick:()=>Z("mcpRouterConfig"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(Zt,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("settings.mcpRouterConfig")})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.mcpRouterConfig?"−":"+"})]}),D.mcpRouterConfig&&e.jsxs("div",{className:"space-y-4 pb-4 px-6 pt-4 border-t border-[var(--hub-line-2)]",children:[e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.mcpRouterApiKey")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.mcpRouterApiKeyDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"password",value:P.apiKey,onChange:t=>ms("apiKey",t.target.value),placeholder:s("settings.mcpRouterApiKeyPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm border-gray-300 form-input",disabled:i}),e.jsx("button",{onClick:()=>us("apiKey"),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.mcpRouterBaseUrl")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.mcpRouterBaseUrlDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"text",value:P.baseUrl,onChange:t=>ms("baseUrl",t.target.value),placeholder:s("settings.mcpRouterBaseUrlPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:()=>us("baseUrl"),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]})]})]})}),e.jsx(ae,{permissions:ne.SETTINGS_SYSTEM_CONFIG,children:e.jsxs("div",{className:"hub-card mb-6 overflow-hidden",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] py-3 px-5",onClick:()=>Z("betterAuthConfig"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(ws,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("settings.betterAuthTitle")||"Better Auth"})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.betterAuthConfig?"−":"+"})]}),D.betterAuthConfig&&e.jsxs("div",{className:"space-y-4 pb-4 px-6 pt-4 border-t border-[var(--hub-line-2)]",children:[e.jsx("div",{className:"flex items-start gap-2",style:{padding:"8px 12px",borderRadius:7,background:"var(--hub-accent-soft)",color:"var(--hub-accent)",fontSize:12.5},children:e.jsx("span",{children:s("settings.betterAuthEnvNote")||"Client IDs and secrets still come from environment variables. Changing Better Auth settings may require an application restart, and the install base URL origin is trusted automatically."})}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.enableBetterAuth")||"Enable Better Auth"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.enableBetterAuthDescription")||"Enable social and OIDC login when the required environment variables are configured."})]}),e.jsx(z,{disabled:i,checked:I.enabled,onCheckedChange:t=>pe({enabled:t})})]}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.disablePasswordLogin")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.disablePasswordLoginDescription")})]}),e.jsx(z,{disabled:i,checked:I.disablePasswordLogin,onCheckedChange:t=>pe({disablePasswordLogin:t})})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.betterAuthBaseUrl")||"Base URL"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthBaseUrlDescription")||"Public base URL used to build Better Auth redirect URIs. Falls back to the install base URL when empty; the BETTER_AUTH_URL environment variable takes precedence."})]}),e.jsx("input",{type:"text",value:u.baseUrl,onChange:t=>ce("baseUrl",t.target.value),placeholder:"https://mcphub.example.com",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.betterAuthBasePath")||"Auth base path"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthBasePathDescription")||"Relative API path used by the Better Auth routes."})]}),e.jsx("input",{type:"text",value:u.basePath,onChange:t=>ce("basePath",t.target.value),placeholder:"/api/auth/better",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.betterAuthTrustedOrigins")||"Trusted origins"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthTrustedOriginsDescription")||"Comma-separated origins allowed for Better Auth requests. The install base URL origin is added automatically."})]}),e.jsx("input",{type:"text",value:u.trustedOrigins,onChange:t=>ce("trustedOrigins",t.target.value),placeholder:"https://app.example.com, https://admin.example.com",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md space-y-4",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.betterAuthProviders")||"Providers"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthProvidersDescription")||"Provider switches control which configured login methods are exposed on the sign-in page."})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-gray-700",children:"Google"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthGoogleDescription")||"Requires GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET."})]}),e.jsx(z,{disabled:i,checked:I.providers.google.enabled,onCheckedChange:t=>pe({providers:{google:{enabled:t}}})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-gray-700",children:"GitHub"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthGithubDescription")||"Requires GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET."})]}),e.jsx(z,{disabled:i,checked:I.providers.github.enabled,onCheckedChange:t=>pe({providers:{github:{enabled:t}}})})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-gray-700",children:"OIDC"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthOidcDescription")||"Requires OIDC client credentials plus a discovery URL."})]}),e.jsx(z,{disabled:i,checked:I.providers.oidc.enabled,onCheckedChange:t=>pe({providers:{oidc:{enabled:t}}})})]})]}),I.providers.oidc.enabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.betterAuthOidcProviderId")||"OIDC provider ID"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthOidcProviderIdDescription")||"Provider identifier used when starting the OIDC login flow."})]}),e.jsx("input",{type:"text",value:u.oidcProviderId,onChange:t=>ce("oidcProviderId",t.target.value),placeholder:"oidc",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.betterAuthOidcDiscoveryUrl")||"OIDC discovery URL"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthOidcDiscoveryUrlDescription")||"Well-known OpenID configuration URL published by your identity provider."})]}),e.jsx("input",{type:"text",value:u.oidcDiscoveryUrl,onChange:t=>ce("oidcDiscoveryUrl",t.target.value),placeholder:"https://issuer.example.com/.well-known/openid-configuration",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.betterAuthOidcScopes")||"OIDC scopes"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthOidcScopesDescription")||"Comma-separated scopes requested during the OIDC sign-in flow."})]}),e.jsx("input",{type:"text",value:u.oidcScopes,onChange:t=>ce("oidcScopes",t.target.value),placeholder:"openid, profile, email",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.betterAuthOidcPrompt")||"OIDC prompt"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthOidcPromptDescription")||"Optional prompt value sent to the identity provider, such as login or consent."})]}),e.jsx("input",{type:"text",value:u.oidcPrompt,onChange:t=>ce("oidcPrompt",t.target.value),placeholder:"login",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i})]}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.betterAuthOidcPkce")||"Enable PKCE"}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.betterAuthOidcPkceDescription")||"Use PKCE for the OIDC authorization flow."})]}),e.jsx(z,{disabled:i,checked:I.providers.oidc.pkce,onCheckedChange:t=>pe({providers:{oidc:{pkce:t}}})})]})]}),e.jsx("div",{className:"flex justify-end pt-3",children:e.jsx("button",{onClick:mt,disabled:i,className:"hub-btn primary",children:s("common.save")})})]})]})}),e.jsx(ae,{permissions:ne.SETTINGS_SYSTEM_CONFIG,children:e.jsxs("div",{className:"hub-card mb-6 overflow-hidden",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] py-3 px-5",onClick:()=>Z("nameSeparator"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(er,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("settings.systemSettings")})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.nameSeparator?"−":"+"})]}),D.nameSeparator&&e.jsxs("div",{className:"space-y-4 pb-4 px-6 pt-4 border-t border-[var(--hub-line-2)]",children:[e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("label",{htmlFor:"dashboard-name",className:"block font-medium text-gray-700",children:s("settings.dashboardName")}),e.jsx("p",{id:"dashboard-name-description",className:"text-sm text-gray-500 mb-2",children:s("settings.dashboardNameDescription")}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{id:"dashboard-name","aria-describedby":"dashboard-name-description",value:U,onChange:t=>X(t.target.value),maxLength:100,placeholder:s("app.title"),disabled:_,className:"flex-1 min-w-0 py-2 px-3 border border-gray-300 rounded-md form-input"}),e.jsx("button",{onClick:Q,disabled:_,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.nameSeparatorLabel")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.nameSeparatorDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"text",value:y,onChange:t=>le(t.target.value),placeholder:"-",className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i,maxLength:5}),e.jsx("button",{onClick:ut,disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.enableSessionRebuild")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.enableSessionRebuildDescription")})]}),e.jsx(z,{disabled:i,checked:_s,onCheckedChange:t=>Xs(t)})]}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.storeToolPayload")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.storeToolPayloadDescription")})]}),e.jsx(z,{disabled:i,checked:Vs,onCheckedChange:t=>Zs(t)})]})]})]})}),e.jsx(ae,{permissions:ne.SETTINGS_ROUTE_CONFIG,children:e.jsxs("div",{className:"hub-card mb-6 overflow-hidden",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] py-3 px-5",onClick:()=>Z("routingConfig"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(Os,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("pages.settings.routeConfig")})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.routingConfig?"−":"+"})]}),D.routingConfig&&e.jsxs("div",{className:"space-y-4 pb-4 px-6 pt-4 border-t border-[var(--hub-line-2)]",children:[e.jsx(ae,{permissions:ne.SETTINGS_SYSTEM_CONFIG,children:e.jsxs("div",{className:"flex items-center justify-between gap-4 p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.allowRegistration")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.allowRegistrationDescription")})]}),e.jsx(z,{"aria-label":s("settings.allowRegistration"),disabled:i,checked:Ms,onCheckedChange:Us})]})}),v&&e.jsxs("div",{className:"space-y-3 p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsx("label",{htmlFor:"allowed-cidrs",className:"block font-medium text-[var(--hub-ink)]",children:s("settings.allowedCidrs")}),e.jsx("p",{className:"text-sm text-[var(--hub-ink-2)]",children:s("settings.allowedCidrsDescription")}),e.jsx("textarea",{id:"allowed-cidrs",value:os,onChange:t=>ds(t.target.value),placeholder:`192.168.1.0/24
|
|
13
|
-
fd00::/64`,rows:4,disabled:i,className:"block w-full py-2 px-3 border border-gray-300 rounded-md form-input font-mono"}),e.jsx("button",{className:"hub-btn primary",disabled:i,onClick:()=>$s(os.split(/\s+/).filter(Boolean)),children:s("common.save")})]}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.enableGlobalRoute")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.enableGlobalRouteDescription")})]}),e.jsx(z,{disabled:i,checked:Ce.enableGlobalRoute,onCheckedChange:t=>ge("enableGlobalRoute",t)})]}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.enableGroupNameRoute")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.enableGroupNameRouteDescription")})]}),e.jsx(z,{disabled:i,checked:Ce.enableGroupNameRoute,onCheckedChange:t=>ge("enableGroupNameRoute",t)})]}),e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.skipAuth")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.skipAuthDescription")})]}),e.jsx(z,{disabled:i,checked:Ce.skipAuth,onCheckedChange:t=>ge("skipAuth",t)})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.jsonBodyLimit")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.jsonBodyLimitDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"text",value:Pe.jsonBodyLimit,onChange:t=>cs("jsonBodyLimit",t.target.value),placeholder:s("settings.jsonBodyLimitPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:()=>ge("jsonBodyLimit",Pe.jsonBodyLimit),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]})]})]})}),e.jsx(ae,{permissions:ne.SETTINGS_INSTALL_CONFIG,children:e.jsxs("div",{className:"hub-card mb-6 overflow-hidden",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] py-3 px-5",onClick:()=>Z("installConfig"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(sr,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("settings.installConfig")})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.installConfig?"−":"+"})]}),D.installConfig&&e.jsxs("div",{className:"space-y-4 pb-4 px-6 pt-4 border-t border-[var(--hub-line-2)]",children:[e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.baseUrl")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.baseUrlDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"text",value:S.baseUrl,onChange:t=>_e("baseUrl",t.target.value),placeholder:s("settings.baseUrlPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:()=>$e("baseUrl"),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.pythonIndexUrl")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.pythonIndexUrlDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"text",value:S.pythonIndexUrl,onChange:t=>_e("pythonIndexUrl",t.target.value),placeholder:s("settings.pythonIndexUrlPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:()=>$e("pythonIndexUrl"),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.npmRegistry")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.npmRegistryDescription")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"text",value:S.npmRegistry,onChange:t=>_e("npmRegistry",t.target.value),placeholder:s("settings.npmRegistryPlaceholder"),className:"flex-1 mt-1 block w-full py-2 px-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm form-input",disabled:i}),e.jsx("button",{onClick:()=>$e("npmRegistry"),disabled:i,className:"hub-btn primary",children:s("common.save")})]})]}),e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.clearCache")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.clearCacheDescription")})]}),e.jsxs("button",{onClick:()=>Be(!0),disabled:i||C,className:"hub-btn primary flex items-center gap-2",children:[e.jsx(ye,{size:14,className:C?"animate-spin":""}),C?s("settings.clearingCache")||"Clearing...":s("settings.clearCache")]})]})]})]})}),e.jsxs("div",{className:"hub-card mb-6 overflow-hidden","data-section":"password",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] py-3 px-5",onClick:()=>Z("password"),role:"button",children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(tr,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("auth.changePassword")})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.password?"−":"+"})]}),D.password&&e.jsx("div",{className:"max-w-lg pb-4 px-6 pt-4 border-t border-[var(--hub-line-2)]",children:e.jsx(dr,{onSuccess:ft})})]}),e.jsx(ae,{permissions:ne.SETTINGS_EXPORT_CONFIG,children:e.jsxs("div",{className:"hub-card mb-6 overflow-hidden",children:[e.jsxs("div",{className:"flex justify-between items-center cursor-pointer transition-colors hover:bg-[var(--hub-surface-hover)] py-3 px-5",onClick:()=>Z("exportConfig"),children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(rr,{size:15,className:"text-[var(--hub-ink-2)]"}),e.jsx("h2",{className:"font-medium text-[var(--hub-ink)]",children:s("settings.exportMcpSettings")})]}),e.jsx("span",{className:"text-[var(--hub-ink-3)]",children:D.exportConfig?"−":"+"})]}),D.exportConfig&&e.jsx("div",{className:"space-y-4 pb-4 px-6 pt-4 border-t border-[var(--hub-line-2)]",children:e.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-gray-800 rounded-md",children:[e.jsxs("div",{className:"mb-4",children:[e.jsx("h3",{className:"font-medium text-gray-700",children:s("settings.mcpSettingsJson")}),e.jsx("p",{className:"text-sm text-gray-500",children:s("settings.mcpSettingsJsonDescription")})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("button",{onClick:jt,disabled:!re,className:"hub-btn primary",children:[xs?e.jsx(Rs,{size:16}):e.jsx(ar,{size:16}),s(xs?"common.copied":"settings.copyToClipboard")]}),e.jsxs("button",{onClick:Nt,disabled:!re,className:"hub-btn",children:[e.jsx(nr,{size:16}),s("settings.downloadJson")]})]}),re&&e.jsx("div",{className:"mt-3",children:e.jsx("pre",{className:"bg-gray-900 text-gray-100 p-4 rounded-md overflow-x-auto text-xs max-h-96",children:re})})]})]})})]})}),e.jsx(as,{isOpen:Is,onClose:()=>Be(!1),onConfirm:()=>{Be(!1),it()},title:s("settings.clearCache"),message:s("settings.clearCacheConfirm")||"This will clear the npm and uv package caches. Servers may need to re-download packages on next start.",confirmText:s("settings.clearCache"),variant:"warning"})]})};export{Or as default};
|
|
14
|
-
//# sourceMappingURL=SettingsPage-BcpeHFR3.js.map
|