diff --git a/apps/desktop/src/components/settings/McpAuthorizationStepper.vue b/apps/desktop/src/components/settings/McpAuthorizationStepper.vue
deleted file mode 100644
index 1b9f2d23c2..0000000000
--- a/apps/desktop/src/components/settings/McpAuthorizationStepper.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
-
-
-
-
- {{ index + 1 }}
-
- {{ step.title }}
- {{ step.description }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/desktop/src/components/settings/McpAuthorizationTabs.vue b/apps/desktop/src/components/settings/McpAuthorizationTabs.vue
new file mode 100644
index 0000000000..307354c105
--- /dev/null
+++ b/apps/desktop/src/components/settings/McpAuthorizationTabs.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+ {{ section.title }}
+
+
+
+
+
+
+
diff --git a/apps/desktop/src/components/settings/__tests__/McpAuthorizationStepper.spec.ts b/apps/desktop/src/components/settings/__tests__/McpAuthorizationStepper.spec.ts
deleted file mode 100644
index 1ffefa268a..0000000000
--- a/apps/desktop/src/components/settings/__tests__/McpAuthorizationStepper.spec.ts
+++ /dev/null
@@ -1,164 +0,0 @@
-// @vitest-environment happy-dom
-// MCP 授权步骤条回归测试(#9309):
-// 末步(第 4 步「汇总与确认」)没有下一页可去,右侧按钮不再显示可点的“下一步”。
-// 1) 第 1-3 步:右侧“下一步”可见可点,点击前进一格;左侧“上一步”第 1 步禁用、其后可点。
-// 2) 第 4 步:右侧按钮带 invisible 且 disabled,但仍留在 footer 中作同尺寸占位。
-// 3) 第 4 步点“上一步”回到第 3 步后,右侧按钮恢复可见。
-// 4) 顶部步骤条四个步骤都能直达,末步右侧按钮同样隐藏。
-// 5) 末步占位按钮不可聚焦。
-// 6) 正向对照:非末步的“下一步”按钮可以聚焦——证明这个环境能表达焦点,第 5 条才不是恒真。
-//
-// 哪些用例真正守住 #9309:第 2、4 条(断言 invisible 与 footer 计数)。把组件还原到修复前,
-// 恰好是这两条失败。第 5 条在修复前也通过——末步按钮本来就带 disabled,所以它是防止后人
-// 删掉 disabled 的前瞻守卫,而不是本次缺陷的回归守卫,勿误读。
-//
-// 说明:happy-dom 无排版引擎、不加载 Tailwind 样式表,因此“进度文案是否真的居中/不位移”
-// 这类几何断言在单测里无法表达,只以“占位仍留在 DOM 中”作为可证伪的替代断言。
-
-import { createApp, nextTick, type App } from "vue";
-import { afterEach, describe, expect, it, vi } from "vitest";
-
-vi.mock("vue-i18n", () => ({
- useI18n: () => ({
- t: (key: string, params?: Record
) => (params ? `${key}:${params.current}/${params.total}` : key),
- }),
-}));
-
-import McpAuthorizationStepper from "@/components/settings/McpAuthorizationStepper.vue";
-
-let harness: { app: App; root: HTMLElement } | null = null;
-
-function mountStepper() {
- const root = document.createElement("div");
- document.body.appendChild(root);
- const app = createApp(McpAuthorizationStepper);
- app.mount(root);
- harness = { app, root };
- return root;
-}
-
-afterEach(() => {
- harness?.app?.unmount();
- harness = null;
- document.body.innerHTML = "";
-});
-
-function buttonByText(root: HTMLElement, key: string): HTMLButtonElement {
- const button = Array.from(root.querySelectorAll("button")).find((el) => el.textContent?.trim() === key);
- if (!button) throw new Error(`button ${key} not found`);
- return button as HTMLButtonElement;
-}
-
-function nextButton(root: HTMLElement) {
- return buttonByText(root, "settings.mcpAuthNextStep");
-}
-
-function prevButton(root: HTMLElement) {
- return buttonByText(root, "settings.mcpAuthPreviousStep");
-}
-
-function navStep(root: HTMLElement, index: number) {
- const nav = root.querySelector("nav");
- if (!nav) throw new Error("step nav not found");
- const button = nav.querySelectorAll("button")[index];
- if (!button) throw new Error(`nav step ${index} not found`);
- return button as HTMLButtonElement;
-}
-
-function progress(root: HTMLElement) {
- return root.textContent?.match(/settings\.mcpAuthStepProgress:\d+\/\d+/)?.[0];
-}
-
-async function goToLastStep(root: HTMLElement) {
- for (let i = 0; i < 3; i += 1) {
- nextButton(root).click();
- await nextTick();
- }
-}
-
-describe("McpAuthorizationStepper", () => {
- it("第 1 步:右侧为可见可点的“下一步”,左侧“上一步”禁用", () => {
- const root = mountStepper();
-
- expect(progress(root)).toBe("settings.mcpAuthStepProgress:1/4");
- expect(nextButton(root).classList.contains("invisible")).toBe(false);
- expect(nextButton(root).disabled).toBe(false);
- expect(prevButton(root).disabled).toBe(true);
- });
-
- it("逐级前进:第 2、3 步右侧仍是可见可点的“下一步”,左侧“上一步”可点", async () => {
- const root = mountStepper();
-
- nextButton(root).click();
- await nextTick();
- expect(progress(root)).toBe("settings.mcpAuthStepProgress:2/4");
- expect(nextButton(root).classList.contains("invisible")).toBe(false);
- expect(nextButton(root).disabled).toBe(false);
- expect(prevButton(root).disabled).toBe(false);
-
- nextButton(root).click();
- await nextTick();
- expect(progress(root)).toBe("settings.mcpAuthStepProgress:3/4");
- expect(nextButton(root).classList.contains("invisible")).toBe(false);
- expect(nextButton(root).disabled).toBe(false);
- expect(prevButton(root).disabled).toBe(false);
- });
-
- it("第 4 步:右侧按钮隐藏且禁用,但仍留在 footer 中撑住布局", async () => {
- const root = mountStepper();
- await goToLastStep(root);
-
- expect(progress(root)).toBe("settings.mcpAuthStepProgress:4/4");
- // footer 仍是 [上一步][进度][占位] 三个子元素,即占位按钮没有被 v-if 摘掉——摘掉的话这里只剩 1 个。
- expect(root.querySelectorAll("footer button").length).toBe(2);
-
- const next = nextButton(root);
- expect(next.classList.contains("invisible")).toBe(true);
- expect(next.disabled).toBe(true);
- expect(prevButton(root).disabled).toBe(false);
- });
-
- it("第 4 步点“上一步”回到第 3 步后,右侧按钮恢复可见可点", async () => {
- const root = mountStepper();
- await goToLastStep(root);
-
- prevButton(root).click();
- await nextTick();
-
- expect(progress(root)).toBe("settings.mcpAuthStepProgress:3/4");
- expect(nextButton(root).classList.contains("invisible")).toBe(false);
- expect(nextButton(root).disabled).toBe(false);
- });
-
- it("顶部步骤条四个步骤均可直达,末步的右侧按钮同样隐藏", async () => {
- const root = mountStepper();
-
- for (let index = 0; index < 4; index += 1) {
- navStep(root, index).click();
- await nextTick();
- expect(progress(root)).toBe(`settings.mcpAuthStepProgress:${index + 1}/4`);
- expect(nextButton(root).classList.contains("invisible")).toBe(index === 3);
- }
- expect(nextButton(root).disabled).toBe(true);
- });
-
- // 正向对照:证明这个环境里 focus() 确实能生效,下面那条否定断言才不是恒真。
- it("正向对照:非末步的“下一步”按钮可以聚焦", () => {
- const root = mountStepper();
-
- nextButton(root).focus();
- expect(document.activeElement).toBe(nextButton(root));
- });
-
- // 每个用例独立挂载、起始焦点都不在任何按钮上——避免“元素已在焦点上、随后才被禁用”这种
- // 与断言无关的状态混进来(原生化不会因为元素被禁用就把已有焦点移走)。
- it("末步占位按钮不可聚焦", async () => {
- const root = mountStepper();
- await goToLastStep(root);
-
- const next = nextButton(root);
- next.focus();
- expect(document.activeElement).not.toBe(next);
- expect(next.disabled).toBe(true);
- });
-});
diff --git a/apps/desktop/src/components/settings/__tests__/McpAuthorizationTabs.spec.ts b/apps/desktop/src/components/settings/__tests__/McpAuthorizationTabs.spec.ts
new file mode 100644
index 0000000000..9df79d5265
--- /dev/null
+++ b/apps/desktop/src/components/settings/__tests__/McpAuthorizationTabs.spec.ts
@@ -0,0 +1,104 @@
+// @vitest-environment happy-dom
+// MCP 授权设置页签:四个区块是同一份暂存策略的独立视图,不是线性流程,
+// 因此不再有“上一步/下一步/第 N 步”,而是可直达的页签。
+// 1) 四个页签可直达,默认选中“默认权限”。
+// 2) 切换页签只改变可见面板;所有面板保持挂载(子组件的搜索/展开状态不丢)。
+// 3) 不再渲染流程式的上一步/下一步/进度控件。
+
+import { createApp, nextTick, type App } from "vue";
+import { afterEach, describe, expect, it, vi } from "vitest";
+
+vi.mock("vue-i18n", () => ({
+ useI18n: () => ({
+ t: (key: string) => key,
+ }),
+}));
+
+import McpAuthorizationTabs from "@/components/settings/McpAuthorizationTabs.vue";
+
+const SECTIONS = ["overrides", "connections", "databases", "capabilities"] as const;
+
+let harness: { app: App; root: HTMLElement } | null = null;
+
+function mountTabs() {
+ const root = document.createElement("div");
+ document.body.appendChild(root);
+ const app = createApp({
+ components: { McpAuthorizationTabs },
+ template: `
+
+ overrides
+ connections
+ databases
+ capabilities
+
+ `,
+ });
+ app.mount(root);
+ harness = { app, root };
+ return root;
+}
+
+afterEach(() => {
+ harness?.app?.unmount();
+ harness = null;
+ document.body.innerHTML = "";
+});
+
+function triggers(root: HTMLElement) {
+ return Array.from(root.querySelectorAll('[role="tab"]'));
+}
+
+function panelOf(root: HTMLElement, section: string) {
+ const content = root.querySelector(`[data-slot-content="${section}"]`);
+ const panel = content?.closest('[role="tabpanel"]');
+ if (!panel) throw new Error(`panel ${section} not found`);
+ return panel;
+}
+
+async function selectTab(tab: HTMLElement) {
+ // reka-ui 的触发器在 mousedown / focus 时激活,而不是 click。
+ tab.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, button: 0, ctrlKey: false }));
+ await nextTick();
+}
+
+describe("McpAuthorizationTabs", () => {
+ it("渲染四个页签,默认选中第一个", () => {
+ const root = mountTabs();
+
+ const tabs = triggers(root);
+ expect(tabs.map((tab) => tab.textContent?.trim())).toEqual(["settings.mcpAuthTabOverridesTitle", "settings.mcpAuthTabConnectionsTitle", "settings.mcpAuthTabDatabasesTitle", "settings.mcpAuthTabCapabilitiesTitle"]);
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
+ expect(panelOf(root, "overrides").hidden).toBe(false);
+ expect(panelOf(root, "databases").hidden).toBe(true);
+ });
+
+ it("每个页签都能直达,且只显示被选中的面板", async () => {
+ const root = mountTabs();
+
+ for (const [index, section] of SECTIONS.entries()) {
+ await selectTab(triggers(root)[index]);
+ expect(triggers(root)[index].getAttribute("aria-selected")).toBe("true");
+ for (const other of SECTIONS) {
+ // data-state 由选中态直接驱动;hidden 经由 Presence 判定,happy-dom 下没有动画事件,故不以它为准。
+ expect(panelOf(root, other).getAttribute("data-state"), `${section} selected, ${other}`).toBe(other === section ? "active" : "inactive");
+ }
+ }
+ });
+
+ it("所有面板始终保持挂载", async () => {
+ const root = mountTabs();
+ await selectTab(triggers(root)[2]);
+
+ for (const section of SECTIONS) {
+ expect(root.querySelector(`[data-slot-content="${section}"]`), section).not.toBeNull();
+ }
+ });
+
+ it("不再渲染上一步/下一步/进度等流程控件", () => {
+ const root = mountTabs();
+
+ expect(root.querySelector("footer")).toBeNull();
+ expect(root.textContent).not.toMatch(/PreviousStep|NextStep|StepProgress/);
+ });
+});
diff --git a/apps/desktop/src/i18n/locales/az.ts b/apps/desktop/src/i18n/locales/az.ts
index 3a44828f0b..c39d487cd7 100644
--- a/apps/desktop/src/i18n/locales/az.ts
+++ b/apps/desktop/src/i18n/locales/az.ts
@@ -8438,20 +8438,11 @@ export default withEnglishFallback({
mcpRefresh: "Yenidən yoxla",
mcpGuide: "MCP təlimatı",
mcpAuthTitle: "MCP səlahiyyətləndirməsi",
- mcpAuthDescription: "Səlahiyyətləndirməni ardıcıllıqla tamamlayın: qlobal standartı təyin edin, qrupları və əlaqələri seçin, verilənlər bazalarını məhdudlaşdırın, sonra yekun siyasəti nəzərdən keçirin.",
- mcpAuthStepsLabel: "MCP səlahiyyətləndirmə addımları",
- mcpAuthStepConnectionsTitle: "Qruplar və əlaqələr",
- mcpAuthStepConnectionsDescription: "MCP-nin nəyi görə biləcəyini seçin və əlaqə icazələrini təyin edin",
- mcpAuthStepDatabasesTitle: "Verilənlər bazası əhatəsi",
- mcpAuthStepDatabasesDescription: "Hər əlaqənin verilənlər bazalarını məhdudlaşdırın və verilənlər bazası icazələrini təyin edin",
- mcpAuthStepOverridesTitle: "Standart icazələr",
- mcpAuthStepOverridesDescription: "Bütün sonrakı əhatə dairələri üçün qlobal standartı təyin edin",
- mcpAuthStepCapabilitiesTitle: "Xülasə və baxış",
- mcpAuthStepCapabilitiesDescription: "Qüvvədə olan icazələri nəzərdən keçirin, alətləri seçin və təsdiqləyin",
- mcpAuthStepRegionLabel: "Addım {step}: {title}",
- mcpAuthPreviousStep: "Əvvəlki",
- mcpAuthNextStep: "Növbəti",
- mcpAuthStepProgress: "Addım {current}/{total}",
+ mcpAuthDescription: "İcazələr pilləli şəkildə üstələnir: verilənlər bazası › əlaqə › qrup › qlobal standart. Əhatə nə qədər dar olarsa, prioritet bir o qədər yüksəkdir.",
+ mcpAuthTabConnectionsTitle: "Qruplar və əlaqələr",
+ mcpAuthTabDatabasesTitle: "Verilənlər bazası əhatəsi",
+ mcpAuthTabOverridesTitle: "Standart icazələr",
+ mcpAuthTabCapabilitiesTitle: "Qüvvədə olan giriş və alətlər",
mcpPolicyExceptionsTitle: "Saxlanılmış icazə istisnaları",
mcpPolicyExceptionsDescription: "Bağlantı əhatəsinin dəyişdirilməsi icazə istisnalarını saxlayır. Əhatə daxilindəki istisnalar qüvvədə qalır; əhatədən kənardakı istisnalar bağlantı əhatəyə qayıtdıqda tətbiq olunur. Burada icra icazələrini dəyişə və ya irsi icazələri bərpa edə bilərsiniz.",
mcpPolicyExceptionInScope: "Cari əhatə daxilində",
diff --git a/apps/desktop/src/i18n/locales/en.ts b/apps/desktop/src/i18n/locales/en.ts
index 87b8387448..84e0f4cdf8 100644
--- a/apps/desktop/src/i18n/locales/en.ts
+++ b/apps/desktop/src/i18n/locales/en.ts
@@ -9956,20 +9956,11 @@ export default {
mcpRefresh: "Check again",
mcpGuide: "MCP guide",
mcpAuthTitle: "MCP authorization",
- mcpAuthDescription: "Complete authorization in order: set the global default, choose groups and connections, limit databases, then review the final policy.",
- mcpAuthStepsLabel: "MCP authorization steps",
- mcpAuthStepConnectionsTitle: "Groups and connections",
- mcpAuthStepConnectionsDescription: "Choose what MCP can see and set connection permissions",
- mcpAuthStepDatabasesTitle: "Database scope",
- mcpAuthStepDatabasesDescription: "Limit each connection's databases and set database permissions",
- mcpAuthStepOverridesTitle: "Default permissions",
- mcpAuthStepOverridesDescription: "Set the global default for all later scopes",
- mcpAuthStepCapabilitiesTitle: "Summary and review",
- mcpAuthStepCapabilitiesDescription: "Review effective permissions, choose tools, and confirm",
- mcpAuthStepRegionLabel: "Step {step}: {title}",
- mcpAuthPreviousStep: "Previous",
- mcpAuthNextStep: "Next",
- mcpAuthStepProgress: "Step {current} of {total}",
+ mcpAuthDescription: "Permissions are overridden level by level: database › connection › group › global default. The narrower the scope, the higher its priority.",
+ mcpAuthTabConnectionsTitle: "Groups and connections",
+ mcpAuthTabDatabasesTitle: "Database scope",
+ mcpAuthTabOverridesTitle: "Default permissions",
+ mcpAuthTabCapabilitiesTitle: "Effective access and tools",
mcpPolicyExceptionsTitle: "Saved permission exceptions",
mcpPolicyExceptionsDescription: "Changing the connection scope preserves permission exceptions. Exceptions inside the scope remain effective; those outside apply when the connection returns to the scope. You can edit execution permissions or restore inherited permissions here.",
mcpPolicyExceptionInScope: "Inside current scope",
diff --git a/apps/desktop/src/i18n/locales/es.ts b/apps/desktop/src/i18n/locales/es.ts
index 478ff92f33..4cfd257d11 100644
--- a/apps/desktop/src/i18n/locales/es.ts
+++ b/apps/desktop/src/i18n/locales/es.ts
@@ -8999,20 +8999,11 @@ export default withEnglishFallback({
mcpRefresh: "Comprobar de nuevo",
mcpGuide: "Guía MCP",
mcpAuthTitle: "Autorización de MCP",
- mcpAuthDescription: "Completa la autorización en orden: define el valor global, elige grupos y conexiones, limita las bases de datos y revisa la política final.",
- mcpAuthStepsLabel: "Pasos de autorización de MCP",
- mcpAuthStepConnectionsTitle: "Grupos y conexiones",
- mcpAuthStepConnectionsDescription: "Elige lo que MCP puede ver y configura los permisos",
- mcpAuthStepDatabasesTitle: "Alcance de bases de datos",
- mcpAuthStepDatabasesDescription: "Limita las bases de datos y configura permisos por base",
- mcpAuthStepOverridesTitle: "Permisos predeterminados",
- mcpAuthStepOverridesDescription: "Define el permiso global para los ámbitos posteriores",
- mcpAuthStepCapabilitiesTitle: "Resumen y confirmación",
- mcpAuthStepCapabilitiesDescription: "Revisa los permisos efectivos, elige herramientas y confirma",
- mcpAuthStepRegionLabel: "Paso {step}: {title}",
- mcpAuthPreviousStep: "Anterior",
- mcpAuthNextStep: "Siguiente",
- mcpAuthStepProgress: "Paso {current} de {total}",
+ mcpAuthDescription: "Los permisos se sobrescriben por niveles: base de datos › conexión › grupo › valor global. Cuanto más específico es el alcance, mayor es su prioridad.",
+ mcpAuthTabConnectionsTitle: "Grupos y conexiones",
+ mcpAuthTabDatabasesTitle: "Alcance de bases de datos",
+ mcpAuthTabOverridesTitle: "Permisos predeterminados",
+ mcpAuthTabCapabilitiesTitle: "Acceso efectivo y herramientas",
mcpPolicyExceptionsTitle: "Excepciones de permisos guardadas",
mcpPolicyExceptionsDescription: "Cambiar el ámbito de conexiones conserva las excepciones de permisos. Las excepciones dentro del ámbito siguen vigentes; las demás se aplican cuando la conexión vuelve al ámbito. Aquí puede editar los permisos de ejecución o restaurar los permisos heredados.",
mcpPolicyExceptionInScope: "Dentro del ámbito actual",
diff --git a/apps/desktop/src/i18n/locales/id.ts b/apps/desktop/src/i18n/locales/id.ts
index a1b2589e5a..0c3c5aa5a9 100644
--- a/apps/desktop/src/i18n/locales/id.ts
+++ b/apps/desktop/src/i18n/locales/id.ts
@@ -9254,20 +9254,11 @@ export default withEnglishFallback({
mcpRefresh: "Periksa lagi",
mcpGuide: "Panduan MCP",
mcpAuthTitle: "Otorisasi MCP",
- mcpAuthDescription: "Selesaikan otorisasi secara berurutan: atur default global, pilih grup dan koneksi, batasi database, lalu tinjau kebijakan akhir.",
- mcpAuthStepsLabel: "Langkah otorisasi MCP",
- mcpAuthStepConnectionsTitle: "Grup dan koneksi",
- mcpAuthStepConnectionsDescription: "Pilih apa yang dapat dilihat MCP dan atur izin koneksi",
- mcpAuthStepDatabasesTitle: "Cakupan database",
- mcpAuthStepDatabasesDescription: "Batasi database setiap koneksi dan atur izin database",
- mcpAuthStepOverridesTitle: "Izin default",
- mcpAuthStepOverridesDescription: "Atur default global untuk semua cakupan berikutnya",
- mcpAuthStepCapabilitiesTitle: "Ringkasan dan tinjauan",
- mcpAuthStepCapabilitiesDescription: "Tinjau izin efektif, pilih alat, dan konfirmasi",
- mcpAuthStepRegionLabel: "Langkah {step}: {title}",
- mcpAuthPreviousStep: "Sebelumnya",
- mcpAuthNextStep: "Berikutnya",
- mcpAuthStepProgress: "Langkah {current} dari {total}",
+ mcpAuthDescription: "Izin ditimpa secara bertingkat: database › koneksi › grup › default global. Semakin sempit cakupannya, semakin tinggi prioritasnya.",
+ mcpAuthTabConnectionsTitle: "Grup dan koneksi",
+ mcpAuthTabDatabasesTitle: "Cakupan database",
+ mcpAuthTabOverridesTitle: "Izin default",
+ mcpAuthTabCapabilitiesTitle: "Akses efektif dan alat",
mcpPolicyExceptionsTitle: "Pengecualian izin tersimpan",
mcpPolicyExceptionsDescription: "Mengubah cakupan koneksi mempertahankan pengecualian izin. Pengecualian dalam cakupan tetap berlaku; pengecualian di luar cakupan berlaku saat koneksi kembali ke cakupan. Anda dapat mengedit izin eksekusi atau memulihkan izin yang diwarisi di sini.",
mcpPolicyExceptionInScope: "Dalam cakupan saat ini",
diff --git a/apps/desktop/src/i18n/locales/it.ts b/apps/desktop/src/i18n/locales/it.ts
index 58f7497ee5..5db8a48446 100644
--- a/apps/desktop/src/i18n/locales/it.ts
+++ b/apps/desktop/src/i18n/locales/it.ts
@@ -8749,20 +8749,11 @@ export default withEnglishFallback({
mcpRefresh: "Verifica di nuovo",
mcpGuide: "Guida MCP",
mcpAuthTitle: "Autorizzazione MCP",
- mcpAuthDescription: "Completa l'autorizzazione in ordine: imposta il valore globale, scegli gruppi e connessioni, limita i database e rivedi la policy finale.",
- mcpAuthStepsLabel: "Passaggi di autorizzazione MCP",
- mcpAuthStepConnectionsTitle: "Gruppi e connessioni",
- mcpAuthStepConnectionsDescription: "Determina quali connessioni MCP può vedere",
- mcpAuthStepDatabasesTitle: "Ambito database",
- mcpAuthStepDatabasesDescription: "Limita i database accessibili per ogni connessione",
- mcpAuthStepOverridesTitle: "Permessi predefiniti",
- mcpAuthStepOverridesDescription: "Imposta il permesso globale per gli ambiti successivi",
- mcpAuthStepCapabilitiesTitle: "Riepilogo e conferma",
- mcpAuthStepCapabilitiesDescription: "Rivedi i permessi effettivi, scegli gli strumenti e conferma",
- mcpAuthStepRegionLabel: "Passaggio {step}: {title}",
- mcpAuthPreviousStep: "Indietro",
- mcpAuthNextStep: "Avanti",
- mcpAuthStepProgress: "Passaggio {current} di {total}",
+ mcpAuthDescription: "I permessi vengono sovrascritti per livelli: database › connessione › gruppo › valore globale. Più è ristretto l'ambito, più alta è la priorità.",
+ mcpAuthTabConnectionsTitle: "Gruppi e connessioni",
+ mcpAuthTabDatabasesTitle: "Ambito database",
+ mcpAuthTabOverridesTitle: "Permessi predefiniti",
+ mcpAuthTabCapabilitiesTitle: "Accesso effettivo e strumenti",
mcpPolicyExceptionsTitle: "Eccezioni ai permessi salvate",
mcpPolicyExceptionsDescription: "La modifica dell’ambito delle connessioni conserva le eccezioni ai permessi. Le eccezioni nell’ambito restano attive; le altre si applicano quando la connessione rientra nell’ambito. Qui puoi modificare i permessi di esecuzione o ripristinare quelli ereditati.",
mcpPolicyExceptionInScope: "Nell’ambito attuale",
diff --git a/apps/desktop/src/i18n/locales/ja.ts b/apps/desktop/src/i18n/locales/ja.ts
index 1900bef03b..aaddbad135 100644
--- a/apps/desktop/src/i18n/locales/ja.ts
+++ b/apps/desktop/src/i18n/locales/ja.ts
@@ -8736,20 +8736,11 @@ export default withEnglishFallback({
mcpRefresh: "再確認",
mcpGuide: "MCPガイド",
mcpAuthTitle: "MCP 権限設定",
- mcpAuthDescription: "順番に設定します:グローバル既定値、グループと接続、データベース範囲を設定し、最後に最終ポリシーを確認します。",
- mcpAuthStepsLabel: "MCP 権限設定の手順",
- mcpAuthStepConnectionsTitle: "グループと接続",
- mcpAuthStepConnectionsDescription: "MCP に公開する接続を決定します",
- mcpAuthStepDatabasesTitle: "データベース範囲",
- mcpAuthStepDatabasesDescription: "接続ごとにアクセス可能なデータベースを制限します",
- mcpAuthStepOverridesTitle: "既定の権限",
- mcpAuthStepOverridesDescription: "後続の範囲に適用するグローバル既定値を設定します",
- mcpAuthStepCapabilitiesTitle: "概要と確認",
- mcpAuthStepCapabilitiesDescription: "有効な権限を確認し、ツールを選択して確定します",
- mcpAuthStepRegionLabel: "ステップ {step}:{title}",
- mcpAuthPreviousStep: "前へ",
- mcpAuthNextStep: "次へ",
- mcpAuthStepProgress: "ステップ {current} / {total}",
+ mcpAuthDescription: "権限は範囲が狭いものが優先して上書きされます:データベース › 接続 › グループ › グローバル既定値。",
+ mcpAuthTabConnectionsTitle: "グループと接続",
+ mcpAuthTabDatabasesTitle: "データベース範囲",
+ mcpAuthTabOverridesTitle: "既定の権限",
+ mcpAuthTabCapabilitiesTitle: "有効な権限とツール",
mcpPolicyExceptionsTitle: "保存された権限の例外",
mcpPolicyExceptionsDescription: "接続範囲を変更しても権限の例外は保持されます。範囲内の例外は引き続き有効で、範囲外の例外は接続が範囲に戻ると適用されます。ここで実行権限を変更したり、継承する権限に戻したりできます。",
mcpPolicyExceptionInScope: "現在の範囲内",
diff --git a/apps/desktop/src/i18n/locales/ko.ts b/apps/desktop/src/i18n/locales/ko.ts
index 2002df83e3..3e7cb98107 100644
--- a/apps/desktop/src/i18n/locales/ko.ts
+++ b/apps/desktop/src/i18n/locales/ko.ts
@@ -8642,20 +8642,11 @@ export default withEnglishFallback({
mcpRefresh: "다시 확인",
mcpGuide: "MCP 가이드",
mcpAuthTitle: "MCP 권한 설정",
- mcpAuthDescription: "순서대로 권한을 설정하세요: 전역 기본값을 정하고 그룹과 연결, 데이터베이스 범위를 설정한 뒤 최종 정책을 확인합니다.",
- mcpAuthStepsLabel: "MCP 권한 설정 단계",
- mcpAuthStepConnectionsTitle: "그룹 및 연결",
- mcpAuthStepConnectionsDescription: "MCP에 노출할 연결을 결정합니다",
- mcpAuthStepDatabasesTitle: "데이터베이스 범위",
- mcpAuthStepDatabasesDescription: "연결별로 접근 가능한 데이터베이스를 제한합니다",
- mcpAuthStepOverridesTitle: "기본 권한",
- mcpAuthStepOverridesDescription: "이후 범위에 적용할 전역 기본 권한을 설정합니다",
- mcpAuthStepCapabilitiesTitle: "요약 및 확인",
- mcpAuthStepCapabilitiesDescription: "최종 권한을 검토하고 도구를 선택한 뒤 확인합니다",
- mcpAuthStepRegionLabel: "단계 {step}: {title}",
- mcpAuthPreviousStep: "이전",
- mcpAuthNextStep: "다음",
- mcpAuthStepProgress: "{total}단계 중 {current}단계",
+ mcpAuthDescription: "권한은 단계별로 덮어씁니다: 데이터베이스 › 연결 › 그룹 › 전역 기본값. 범위가 좁을수록 우선순위가 높습니다.",
+ mcpAuthTabConnectionsTitle: "그룹 및 연결",
+ mcpAuthTabDatabasesTitle: "데이터베이스 범위",
+ mcpAuthTabOverridesTitle: "기본 권한",
+ mcpAuthTabCapabilitiesTitle: "적용 권한 및 도구",
mcpPolicyExceptionsTitle: "저장된 권한 예외",
mcpPolicyExceptionsDescription: "연결 범위를 변경해도 권한 예외는 유지됩니다. 범위 안의 예외는 계속 유효하며, 범위 밖의 예외는 연결이 범위에 다시 포함되면 적용됩니다. 여기서 실행 권한을 수정하거나 상속된 권한으로 되돌릴 수 있습니다.",
mcpPolicyExceptionInScope: "현재 범위 안",
diff --git a/apps/desktop/src/i18n/locales/pt-BR.ts b/apps/desktop/src/i18n/locales/pt-BR.ts
index 540d496b1e..ea426ec818 100644
--- a/apps/desktop/src/i18n/locales/pt-BR.ts
+++ b/apps/desktop/src/i18n/locales/pt-BR.ts
@@ -8747,20 +8747,11 @@ export default withEnglishFallback({
mcpRefresh: "Verificar novamente",
mcpGuide: "Guia do MCP",
mcpAuthTitle: "Autorização do MCP",
- mcpAuthDescription: "Conclua a autorização em ordem: defina o padrão global, escolha grupos e conexões, limite os bancos e revise a política final.",
- mcpAuthStepsLabel: "Etapas de autorização do MCP",
- mcpAuthStepConnectionsTitle: "Grupos e conexões",
- mcpAuthStepConnectionsDescription: "Define quais conexões o MCP pode ver",
- mcpAuthStepDatabasesTitle: "Escopo de bancos de dados",
- mcpAuthStepDatabasesDescription: "Limita os bancos acessíveis por conexão",
- mcpAuthStepOverridesTitle: "Permissões padrão",
- mcpAuthStepOverridesDescription: "Defina a permissão global para os escopos seguintes",
- mcpAuthStepCapabilitiesTitle: "Resumo e confirmação",
- mcpAuthStepCapabilitiesDescription: "Revise as permissões efetivas, escolha as ferramentas e confirme",
- mcpAuthStepRegionLabel: "Etapa {step}: {title}",
- mcpAuthPreviousStep: "Voltar",
- mcpAuthNextStep: "Avançar",
- mcpAuthStepProgress: "Etapa {current} de {total}",
+ mcpAuthDescription: "As permissões são sobrescritas por níveis: banco › conexão › grupo › padrão global. Quanto mais específico o escopo, maior a prioridade.",
+ mcpAuthTabConnectionsTitle: "Grupos e conexões",
+ mcpAuthTabDatabasesTitle: "Escopo de bancos de dados",
+ mcpAuthTabOverridesTitle: "Permissões padrão",
+ mcpAuthTabCapabilitiesTitle: "Acesso efetivo e ferramentas",
mcpPolicyExceptionsTitle: "Exceções de permissões salvas",
mcpPolicyExceptionsDescription: "Alterar o escopo das conexões preserva as exceções de permissões. As exceções dentro do escopo continuam ativas; as demais se aplicam quando a conexão retorna ao escopo. Aqui você pode editar as permissões de execução ou restaurar as permissões herdadas.",
mcpPolicyExceptionInScope: "Dentro do escopo atual",
diff --git a/apps/desktop/src/i18n/locales/ru.ts b/apps/desktop/src/i18n/locales/ru.ts
index d3dc2e16fc..0b2b76acaf 100644
--- a/apps/desktop/src/i18n/locales/ru.ts
+++ b/apps/desktop/src/i18n/locales/ru.ts
@@ -10141,20 +10141,11 @@ export default withEnglishFallback({
mcpRefresh: "Проверить снова",
mcpGuide: "Руководство MCP",
mcpAuthTitle: "Авторизация MCP",
- mcpAuthDescription: "Выполните авторизацию по порядку: задайте глобальное значение по умолчанию, выберите группы и подключения, ограничьте базы данных, затем проверьте итоговую политику.",
- mcpAuthStepsLabel: "Шаги авторизации MCP",
- mcpAuthStepConnectionsTitle: "Группы и подключения",
- mcpAuthStepConnectionsDescription: "Выберите, что видит MCP, и задайте разрешения для подключений",
- mcpAuthStepDatabasesTitle: "Область баз данных",
- mcpAuthStepDatabasesDescription: "Ограничьте базы данных каждого подключения и задайте разрешения для баз данных",
- mcpAuthStepOverridesTitle: "Разрешения по умолчанию",
- mcpAuthStepOverridesDescription: "Задайте глобальное значение по умолчанию для всех последующих областей",
- mcpAuthStepCapabilitiesTitle: "Сводка и проверка",
- mcpAuthStepCapabilitiesDescription: "Проверьте действующие разрешения, выберите инструменты и подтвердите",
- mcpAuthStepRegionLabel: "Шаг {step}: {title}",
- mcpAuthPreviousStep: "Назад",
- mcpAuthNextStep: "Далее",
- mcpAuthStepProgress: "Шаг {current} из {total}",
+ mcpAuthDescription: "Права переопределяются по уровням: база данных › подключение › группа › глобальное значение по умолчанию. Чем уже область, тем выше приоритет.",
+ mcpAuthTabConnectionsTitle: "Группы и подключения",
+ mcpAuthTabDatabasesTitle: "Область баз данных",
+ mcpAuthTabOverridesTitle: "Разрешения по умолчанию",
+ mcpAuthTabCapabilitiesTitle: "Действующие права и инструменты",
mcpPolicyExceptionsTitle: "Сохранённые исключения разрешений",
mcpPolicyExceptionsDescription: "При изменении области подключений исключения разрешений сохраняются. Внутри области они остаются действующими; вне области они применяются при возвращении подключения. Здесь можно изменить разрешения на выполнение или восстановить наследуемые разрешения.",
mcpPolicyExceptionInScope: "В текущей области",
diff --git a/apps/desktop/src/i18n/locales/th.ts b/apps/desktop/src/i18n/locales/th.ts
index 08b5bf8ed3..202e8b15e9 100644
--- a/apps/desktop/src/i18n/locales/th.ts
+++ b/apps/desktop/src/i18n/locales/th.ts
@@ -10581,20 +10581,11 @@ export default withEnglishFallback({
mcpRefresh: "ตรวจสอบอีกครั้ง",
mcpGuide: "คู่มือ MCP",
mcpAuthTitle: "การอนุญาต MCP",
- mcpAuthDescription: "ทำการอนุญาตให้ครบตามลำดับ: ตั้งค่าเริ่มต้นรวม เลือกกลุ่มและการเชื่อมต่อ จำกัดฐานข้อมูล แล้วตรวจสอบนโยบายสุดท้าย",
- mcpAuthStepsLabel: "ขั้นตอนการอนุญาต MCP",
- mcpAuthStepConnectionsTitle: "กลุ่มและการเชื่อมต่อ",
- mcpAuthStepConnectionsDescription: "เลือกสิ่งที่ MCP มองเห็นและตั้งค่าสิทธิ์การเชื่อมต่อ",
- mcpAuthStepDatabasesTitle: "ขอบเขตฐานข้อมูล",
- mcpAuthStepDatabasesDescription: "จำกัดฐานข้อมูลของแต่ละการเชื่อมต่อและตั้งค่าสิทธิ์ฐานข้อมูล",
- mcpAuthStepOverridesTitle: "สิทธิ์เริ่มต้น",
- mcpAuthStepOverridesDescription: "ตั้งค่าเริ่มต้นรวมสำหรับขอบเขตถัดไปทั้งหมด",
- mcpAuthStepCapabilitiesTitle: "สรุปและตรวจสอบ",
- mcpAuthStepCapabilitiesDescription: "ตรวจสอบสิทธิ์ที่มีผล เลือกเครื่องมือ และยืนยัน",
- mcpAuthStepRegionLabel: "ขั้นตอน {step}: {title}",
- mcpAuthPreviousStep: "ก่อนหน้า",
- mcpAuthNextStep: "ถัดไป",
- mcpAuthStepProgress: "ขั้นตอน {current} จาก {total}",
+ mcpAuthDescription: "สิทธิ์จะถูกแทนที่ตามลำดับขั้น: ฐานข้อมูล › การเชื่อมต่อ › กลุ่ม › ค่าเริ่มต้นรวม ขอบเขตยิ่งแคบ ลำดับความสำคัญยิ่งสูง",
+ mcpAuthTabConnectionsTitle: "กลุ่มและการเชื่อมต่อ",
+ mcpAuthTabDatabasesTitle: "ขอบเขตฐานข้อมูล",
+ mcpAuthTabOverridesTitle: "สิทธิ์เริ่มต้น",
+ mcpAuthTabCapabilitiesTitle: "สิทธิ์ที่มีผลและเครื่องมือ",
mcpPolicyExceptionsTitle: "ข้อยกเว้นสิทธิ์ที่บันทึกไว้",
mcpPolicyExceptionsDescription: "การเปลี่ยนขอบเขตการเชื่อมต่อจะคงข้อยกเว้นสิทธิ์ไว้ ข้อยกเว้นภายในขอบเขตยังมีผล ส่วนภายนอกจะมีผลเมื่อการเชื่อมต่อกลับเข้าสู่ขอบเขต คุณแก้ไขสิทธิ์การเรียกใช้หรือคืนค่าสิทธิ์ที่สืบทอดได้ที่นี่",
mcpPolicyExceptionInScope: "ภายในขอบเขตปัจจุบัน",
diff --git a/apps/desktop/src/i18n/locales/tr.ts b/apps/desktop/src/i18n/locales/tr.ts
index 5094cdfc4d..c6e55b2ffd 100644
--- a/apps/desktop/src/i18n/locales/tr.ts
+++ b/apps/desktop/src/i18n/locales/tr.ts
@@ -8340,20 +8340,11 @@ export default withEnglishFallback({
mcpRefresh: "Yeniden denetle",
mcpGuide: "MCP kılavuzu",
mcpAuthTitle: "MCP yetkilendirmesi",
- mcpAuthDescription: "Yetkilendirmeyi sırayla tamamlayın: genel varsayılanı belirleyin, grup ve bağlantıları seçin, veritabanlarını sınırlayın ve son politikayı inceleyin.",
- mcpAuthStepsLabel: "MCP yetkilendirme adımları",
- mcpAuthStepConnectionsTitle: "Gruplar ve bağlantılar",
- mcpAuthStepConnectionsDescription: "MCP'nin hangi bağlantıları görebileceğini belirler",
- mcpAuthStepDatabasesTitle: "Veritabanı kapsamı",
- mcpAuthStepDatabasesDescription: "Her bağlantının erişebileceği veritabanlarını sınırlayın",
- mcpAuthStepOverridesTitle: "Varsayılan izinler",
- mcpAuthStepOverridesDescription: "Sonraki kapsamlar için genel varsayılan izni belirleyin",
- mcpAuthStepCapabilitiesTitle: "Özet ve onay",
- mcpAuthStepCapabilitiesDescription: "Etkin izinleri inceleyin, araçları seçin ve onaylayın",
- mcpAuthStepRegionLabel: "Adım {step}: {title}",
- mcpAuthPreviousStep: "Geri",
- mcpAuthNextStep: "İleri",
- mcpAuthStepProgress: "{total} adımdan {current}. adım",
+ mcpAuthDescription: "İzinler kademeli olarak geçersiz kılınır: veritabanı › bağlantı › grup › genel varsayılan. Kapsam ne kadar dar olursa öncelik o kadar yüksektir.",
+ mcpAuthTabConnectionsTitle: "Gruplar ve bağlantılar",
+ mcpAuthTabDatabasesTitle: "Veritabanı kapsamı",
+ mcpAuthTabOverridesTitle: "Varsayılan izinler",
+ mcpAuthTabCapabilitiesTitle: "Geçerli erişim ve araçlar",
mcpPolicyExceptionsTitle: "Kaydedilen izin istisnaları",
mcpPolicyExceptionsDescription: "Bağlantı kapsamını değiştirmek izin istisnalarını korur. Kapsamdaki istisnalar geçerli kalır; kapsam dışındakiler bağlantı kapsama döndüğünde uygulanır. Burada yürütme izinlerini düzenleyebilir veya devralınan izinleri geri yükleyebilirsiniz.",
mcpPolicyExceptionInScope: "Geçerli kapsam içinde",
diff --git a/apps/desktop/src/i18n/locales/zh-CN.ts b/apps/desktop/src/i18n/locales/zh-CN.ts
index b559081222..2f3ce039bb 100644
--- a/apps/desktop/src/i18n/locales/zh-CN.ts
+++ b/apps/desktop/src/i18n/locales/zh-CN.ts
@@ -9938,20 +9938,11 @@ export default withEnglishFallback({
mcpRefresh: "重新检查",
mcpGuide: "MCP 指南",
mcpAuthTitle: "MCP 授权设置",
- mcpAuthDescription: "按顺序完成授权:先设置全局默认权限,再选择分组与连接、限定数据库,最后确认最终策略。",
- mcpAuthStepsLabel: "MCP 授权步骤",
- mcpAuthStepConnectionsTitle: "分组与连接",
- mcpAuthStepConnectionsDescription: "决定哪些分组和连接可被 MCP 看见,并设置连接权限",
- mcpAuthStepDatabasesTitle: "数据库范围",
- mcpAuthStepDatabasesDescription: "为每个连接限定可访问的库,并设置单库权限",
- mcpAuthStepOverridesTitle: "默认权限",
- mcpAuthStepOverridesDescription: "设置全局默认权限,后续范围可按需覆盖",
- mcpAuthStepCapabilitiesTitle: "汇总与确认",
- mcpAuthStepCapabilitiesDescription: "查看最终生效权限、选择 MCP 工具并确认策略",
- mcpAuthStepRegionLabel: "第 {step} 步:{title}",
- mcpAuthPreviousStep: "上一步",
- mcpAuthNextStep: "下一步",
- mcpAuthStepProgress: "第 {current} 步,共 {total} 步",
+ mcpAuthDescription: "权限逐级覆盖:数据库 › 连接 › 分组 › 全局默认,范围越小优先级越高。",
+ mcpAuthTabConnectionsTitle: "分组与连接",
+ mcpAuthTabDatabasesTitle: "数据库范围",
+ mcpAuthTabOverridesTitle: "默认权限",
+ mcpAuthTabCapabilitiesTitle: "生效权限与工具",
mcpPolicyExceptionsTitle: "已保存的权限例外",
mcpPolicyExceptionsDescription: "切换连接范围会保留权限例外。范围内的例外仍然生效;范围外的例外会在连接重新进入范围后生效。可直接修改执行权限,或恢复继承上级权限。",
mcpPolicyExceptionInScope: "当前范围内",
diff --git a/apps/desktop/src/i18n/locales/zh-TW.ts b/apps/desktop/src/i18n/locales/zh-TW.ts
index a17333b6b3..e8a25f048d 100644
--- a/apps/desktop/src/i18n/locales/zh-TW.ts
+++ b/apps/desktop/src/i18n/locales/zh-TW.ts
@@ -8124,20 +8124,11 @@ export default withEnglishFallback({
mcpRefresh: "重新檢查",
mcpGuide: "MCP 指南",
mcpAuthTitle: "MCP 授權設定",
- mcpAuthDescription: "按順序完成授權:先設定全域預設權限,再選擇群組與連線、限定資料庫,最後確認最終策略。",
- mcpAuthStepsLabel: "MCP 授權步驟",
- mcpAuthStepConnectionsTitle: "群組與連線",
- mcpAuthStepConnectionsDescription: "決定哪些連線可被 MCP 看見",
- mcpAuthStepDatabasesTitle: "資料庫範圍",
- mcpAuthStepDatabasesDescription: "為每個連線限定可存取的庫",
- mcpAuthStepOverridesTitle: "預設權限",
- mcpAuthStepOverridesDescription: "設定套用至後續範圍的全域預設權限",
- mcpAuthStepCapabilitiesTitle: "摘要與確認",
- mcpAuthStepCapabilitiesDescription: "檢視最終權限、選擇工具並確認策略",
- mcpAuthStepRegionLabel: "第 {step} 步:{title}",
- mcpAuthPreviousStep: "上一步",
- mcpAuthNextStep: "下一步",
- mcpAuthStepProgress: "第 {current} 步,共 {total} 步",
+ mcpAuthDescription: "權限逐級覆蓋:資料庫 › 連線 › 群組 › 全域預設,範圍越小優先級越高。",
+ mcpAuthTabConnectionsTitle: "群組與連線",
+ mcpAuthTabDatabasesTitle: "資料庫範圍",
+ mcpAuthTabOverridesTitle: "預設權限",
+ mcpAuthTabCapabilitiesTitle: "生效權限與工具",
mcpPolicyExceptionsTitle: "已儲存的權限例外",
mcpPolicyExceptionsDescription: "切換連線範圍會保留權限例外。範圍內的例外仍然生效;範圍外的例外會在連線重新進入範圍後生效。可直接修改執行權限,或恢復繼承上層權限。",
mcpPolicyExceptionInScope: "目前範圍內",