From 5ca9fd0b2e7d7f9fbf1d72b5dde9e453c801d59b Mon Sep 17 00:00:00 2001 From: xintaofei Date: Sat, 7 Mar 2026 11:07:06 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E7=AA=97=E5=8F=A3=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../settings/acp-agent-settings.tsx | 628 ++++++++++++------ src/components/settings/mcp-settings.tsx | 249 ++++--- src/components/settings/shortcut-settings.tsx | 35 +- src/components/settings/skills-settings.tsx | 190 +++--- src/i18n/messages/en.json | 396 +++++++++++ src/i18n/messages/zh-CN.json | 396 +++++++++++ src/i18n/messages/zh-TW.json | 396 +++++++++++ src/lib/keyboard-shortcuts.ts | 24 - 8 files changed, 1861 insertions(+), 453 deletions(-) diff --git a/src/components/settings/acp-agent-settings.tsx b/src/components/settings/acp-agent-settings.tsx index 55cf7c4..49c6ac4 100644 --- a/src/components/settings/acp-agent-settings.tsx +++ b/src/components/settings/acp-agent-settings.tsx @@ -10,6 +10,7 @@ import { type ReactNode, } from "react" import { Reorder, useDragControls } from "motion/react" +import { useTranslations } from "next-intl" import { useSearchParams } from "next/navigation" import { AlertCircle, @@ -145,6 +146,22 @@ interface UiCheckItem { fixes: UiFixAction[] } +type AcpTranslator = ( + key: string, + values?: Record +) => string + +let acpTranslator: AcpTranslator | null = null + +function acpText( + key: string, + fallback: string, + values?: Record +): string { + if (!acpTranslator) return fallback + return acpTranslator(key, values) +} + function statusTone(status: CheckStatus): string { if (status === "pass") return "text-green-500" if (status === "warn") return "text-yellow-500" @@ -282,12 +299,25 @@ function parseConfigJsonText(configText: string): ConfigParseResult { try { const parsed = JSON.parse(trimmed) as unknown if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { - return { config: {}, error: "原生 JSON 配置必须是对象" } + return { + config: {}, + error: acpText( + "errors.nativeJsonMustBeObject", + "Native JSON config must be an object" + ), + } } return { config: parsed as Record, error: null } } catch (err) { const message = err instanceof Error ? err.message : String(err) - return { config: {}, error: `原生 JSON 配置格式错误:${message}` } + return { + config: {}, + error: acpText( + "errors.nativeJsonInvalid", + "Native JSON config format error: {message}", + { message } + ), + } } } @@ -305,14 +335,24 @@ function parseOpenCodeAuthJsonText(authJsonText: string): { try { const parsed = JSON.parse(trimmed) as unknown if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { - return { authObject: null, error: "OpenCode auth.json 必须是 JSON 对象" } + return { + authObject: null, + error: acpText( + "errors.openCodeAuthMustBeObject", + "OpenCode auth.json must be a JSON object" + ), + } } return { authObject: parsed as Record, error: null } } catch (err) { const message = err instanceof Error ? err.message : String(err) return { authObject: null, - error: `OpenCode auth.json 格式错误:${message}`, + error: acpText( + "errors.openCodeAuthInvalid", + "OpenCode auth.json format error: {message}", + { message } + ), } } } @@ -713,31 +753,54 @@ function patchGeminiAuthMode( } function geminiAuthModeLabel(mode: GeminiAuthMode): string { - if (mode === "custom") return "自定义接口" - if (mode === "login_google") return "Google 登录(OAuth)" + if (mode === "custom") return acpText("gemini.mode.custom", "Custom Endpoint") + if (mode === "login_google") + return acpText("gemini.mode.loginGoogle", "Google Login (OAuth)") if (mode === "gemini_api_key") return "Gemini API Key" - if (mode === "vertex_adc") return "Vertex AI(ADC)" - if (mode === "vertex_service_account") return "Vertex AI(服务账号)" + if (mode === "vertex_adc") return "Vertex AI (ADC)" + if (mode === "vertex_service_account") + return acpText( + "gemini.mode.vertexServiceAccount", + "Vertex AI (Service Account)" + ) return "Vertex AI API Key" } function geminiAuthModeHint(mode: GeminiAuthMode): string { if (mode === "custom") { - return "填写 API URL、API Key 和 Model,分别映射到 GOOGLE_GEMINI_BASE_URL / GEMINI_API_KEY / GEMINI_MODEL。" + return acpText( + "gemini.hint.custom", + "Fill API URL, API Key and Model, mapped to GOOGLE_GEMINI_BASE_URL / GEMINI_API_KEY / GEMINI_MODEL." + ) } if (mode === "login_google") { - return "首次在终端运行 gemini 并完成 Google 登录;无需填写 API Key。" + return acpText( + "gemini.hint.loginGoogle", + "Run gemini in terminal and complete Google login first; API key is not required." + ) } if (mode === "gemini_api_key") { - return "使用 Gemini API 时填写 GEMINI_API_KEY。" + return acpText( + "gemini.hint.geminiApiKey", + "Fill GEMINI_API_KEY when using Gemini API." + ) } if (mode === "vertex_adc") { - return "使用 gcloud ADC,建议填写 GOOGLE_CLOUD_PROJECT 与 GOOGLE_CLOUD_LOCATION。" + return acpText( + "gemini.hint.vertexAdc", + "Use gcloud ADC; GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION are recommended." + ) } if (mode === "vertex_service_account") { - return "服务账号 JSON 路径写入 GOOGLE_APPLICATION_CREDENTIALS。" + return acpText( + "gemini.hint.vertexServiceAccount", + "Set service account JSON path to GOOGLE_APPLICATION_CREDENTIALS." + ) } - return "使用 Vertex AI API key 时填写 GOOGLE_API_KEY。" + return acpText( + "gemini.hint.vertexApiKey", + "Fill GOOGLE_API_KEY when using Vertex AI API key." + ) } function normalizeConfigText(configText: string): string { @@ -1192,12 +1255,27 @@ function parseCodexAuthJsonObject(authJsonText: string): { try { const parsed = JSON.parse(trimmed) as unknown if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { - return { authObject: null, error: "auth.json 必须是 JSON 对象" } + return { + authObject: null, + error: acpText( + "errors.authMustBeObject", + "auth.json must be a JSON object" + ), + } } return { authObject: parsed as Record, error: null } } catch (err) { const message = err instanceof Error ? err.message : String(err) - return { authObject: null, error: `auth.json 格式错误:${message}` } + return { + authObject: null, + error: acpText( + "errors.authInvalid", + "auth.json format error: {message}", + { + message, + } + ), + } } } @@ -1953,8 +2031,13 @@ function buildVersionCheck(agent: AcpAgentInfo): UiCheckItem | null { return null const remoteVersion = agent.registry_version ?? "unknown" - const localVersion = agent.installed_version ?? "未安装" - const versionText = `远程:${remoteVersion} · 本地:${localVersion}` + const localVersion = + agent.installed_version ?? acpText("version.notInstalled", "Not installed") + const versionText = acpText( + "version.remoteLocal", + "Remote: {remoteVersion} · Local: {localVersion}", + { remoteVersion, localVersion } + ) const installAction: RunningActionKind = agent.distribution_type === "binary" ? "download_binary" @@ -1977,9 +2060,13 @@ function buildVersionCheck(agent: AcpAgentInfo): UiCheckItem | null { if (!agent.available) { return { check_id: "version_status", - label: "版本状态", + label: acpText("version.statusLabel", "Version Status"), status: "fail", - message: `${versionText}。当前平台不支持该 Agent。`, + message: acpText( + "version.platformUnsupported", + "{versionText}. Current platform does not support this agent.", + { versionText } + ), fixes: [], } } @@ -1987,12 +2074,16 @@ function buildVersionCheck(agent: AcpAgentInfo): UiCheckItem | null { if (!agent.installed_version) { return { check_id: "version_status", - label: "版本状态", + label: acpText("version.statusLabel", "Version Status"), status: "fail", - message: `${versionText}。请点击右侧安装。`, + message: acpText( + "version.clickInstall", + "{versionText}. Click Install on the right.", + { versionText } + ), fixes: [ { - label: "安装", + label: acpText("actions.install", "Install"), kind: installAction, payload: agent.agent_type, }, @@ -2007,17 +2098,21 @@ function buildVersionCheck(agent: AcpAgentInfo): UiCheckItem | null { ) { return { check_id: "version_status", - label: "版本状态", + label: acpText("version.statusLabel", "Version Status"), status: "warn", - message: `${versionText}。本地版本无法识别,可尝试升级覆盖安装。`, + message: acpText( + "version.localUnrecognized", + "{versionText}. Local version is not comparable; try upgrade to overwrite install.", + { versionText } + ), fixes: [ { - label: "升级", + label: acpText("actions.upgrade", "Upgrade"), kind: upgradeAction, payload: agent.agent_type, }, { - label: "卸载", + label: acpText("actions.uninstall", "Uninstall"), kind: uninstallAction, payload: agent.agent_type, }, @@ -2032,17 +2127,21 @@ function buildVersionCheck(agent: AcpAgentInfo): UiCheckItem | null { ) { return { check_id: "version_status", - label: "版本状态", + label: acpText("version.statusLabel", "Version Status"), status: "warn", - message: `${versionText}。发现可升级版本。`, + message: acpText( + "version.upgradeAvailable", + "{versionText}. Upgrade available.", + { versionText } + ), fixes: [ { - label: "升级", + label: acpText("actions.upgrade", "Upgrade"), kind: upgradeAction, payload: agent.agent_type, }, { - label: "卸载", + label: acpText("actions.uninstall", "Uninstall"), kind: uninstallAction, payload: agent.agent_type, }, @@ -2053,12 +2152,16 @@ function buildVersionCheck(agent: AcpAgentInfo): UiCheckItem | null { if (!agent.registry_version) { return { check_id: "version_status", - label: "版本状态", + label: acpText("version.statusLabel", "Version Status"), status: "warn", - message: `${versionText}。远程版本暂不可用。`, + message: acpText( + "version.remoteUnavailable", + "{versionText}. Remote version is currently unavailable.", + { versionText } + ), fixes: [ { - label: "卸载", + label: acpText("actions.uninstall", "Uninstall"), kind: uninstallAction, payload: agent.agent_type, }, @@ -2068,12 +2171,14 @@ function buildVersionCheck(agent: AcpAgentInfo): UiCheckItem | null { return { check_id: "version_status", - label: "版本状态", + label: acpText("version.statusLabel", "Version Status"), status: "pass", - message: `${versionText}。已是最新版本。`, + message: acpText("version.latest", "{versionText}. Already latest.", { + versionText, + }), fixes: [ { - label: "卸载", + label: acpText("actions.uninstall", "Uninstall"), kind: uninstallAction, payload: agent.agent_type, }, @@ -2165,6 +2270,9 @@ function AgentReorderItem({ } export function AcpAgentSettings() { + const t = useTranslations("AcpAgentSettings") + const rawTranslator = t as unknown as AcpTranslator + acpTranslator = (key, values) => rawTranslator(key, values) const searchParams = useSearchParams() const [agents, setAgents] = useState([]) const [loadingAgents, setLoadingAgents] = useState(true) @@ -2498,17 +2606,25 @@ export function AcpAgentSettings() { ) ) toast.success( - `${agent.name}${mode === "upgrade" ? "升级" : "安装"}完成`, + t("toasts.agentActionCompleted", { + name: agent.name, + action: + mode === "upgrade" ? t("actions.upgrade") : t("actions.install"), + }), { description: detectedVersion - ? `本地版本:${detectedVersion}` - : "安装完成,版本将在下一次检测时更新", + ? t("toasts.localVersion", { version: detectedVersion }) + : t("toasts.installCompletedVersionLater"), } ) } catch (err) { const message = err instanceof Error ? err.message : String(err) toast.error( - `${agent.name}${mode === "upgrade" ? "升级" : "安装"}失败`, + t("toasts.agentActionFailed", { + name: agent.name, + action: + mode === "upgrade" ? t("actions.upgrade") : t("actions.install"), + }), { description: message, } @@ -2523,7 +2639,7 @@ export function AcpAgentSettings() { })) } }, - [runPreflight] + [runPreflight, t] ) const runNpxAction = useCallback( @@ -2562,17 +2678,25 @@ export function AcpAgentSettings() { } const finalVersion = detectedVersion ?? installedVersion toast.success( - `${agent.name}${mode === "upgrade" ? "升级" : "安装"}完成`, + t("toasts.agentActionCompleted", { + name: agent.name, + action: + mode === "upgrade" ? t("actions.upgrade") : t("actions.install"), + }), { description: finalVersion - ? `本地版本:${finalVersion}` - : "安装完成,版本将在下一次检测时更新", + ? t("toasts.localVersion", { version: finalVersion }) + : t("toasts.installCompletedVersionLater"), } ) } catch (err) { const message = err instanceof Error ? err.message : String(err) toast.error( - `${agent.name}${mode === "upgrade" ? "升级" : "安装"}失败`, + t("toasts.agentActionFailed", { + name: agent.name, + action: + mode === "upgrade" ? t("actions.upgrade") : t("actions.install"), + }), { description: message, } @@ -2587,7 +2711,7 @@ export function AcpAgentSettings() { })) } }, - [runPreflight] + [runPreflight, t] ) const runUvxAction = useCallback( @@ -2626,17 +2750,25 @@ export function AcpAgentSettings() { } const finalVersion = detectedVersion ?? installedVersion toast.success( - `${agent.name}${mode === "upgrade" ? "升级" : "安装"}完成`, + t("toasts.agentActionCompleted", { + name: agent.name, + action: + mode === "upgrade" ? t("actions.upgrade") : t("actions.install"), + }), { description: finalVersion - ? `本地版本:${finalVersion}` - : "安装完成,版本将在下一次检测时更新", + ? t("toasts.localVersion", { version: finalVersion }) + : t("toasts.installCompletedVersionLater"), } ) } catch (err) { const message = err instanceof Error ? err.message : String(err) toast.error( - `${agent.name}${mode === "upgrade" ? "升级" : "安装"}失败`, + t("toasts.agentActionFailed", { + name: agent.name, + action: + mode === "upgrade" ? t("actions.upgrade") : t("actions.install"), + }), { description: message, } @@ -2651,7 +2783,7 @@ export function AcpAgentSettings() { })) } }, - [runPreflight] + [runPreflight, t] ) const runUninstallAction = useCallback( @@ -2678,12 +2810,12 @@ export function AcpAgentSettings() { ) ) await runPreflight(agent.agent_type) - toast.success(`${agent.name}卸载完成`, { - description: "本地版本已移除", + toast.success(t("toasts.uninstallCompleted", { name: agent.name }), { + description: t("toasts.localVersionRemoved"), }) } catch (err) { const message = err instanceof Error ? err.message : String(err) - toast.error(`${agent.name}卸载失败`, { + toast.error(t("toasts.uninstallFailed", { name: agent.name }), { description: message, }) throw err @@ -2696,7 +2828,7 @@ export function AcpAgentSettings() { })) } }, - [runPreflight] + [runPreflight, t] ) const handleFixAction = async (agent: AcpAgentInfo, action: UiFixAction) => { @@ -2770,7 +2902,7 @@ export function AcpAgentSettings() { } catch (err) { console.error("[Settings] reorder agents failed:", err) const message = err instanceof Error ? err.message : String(err) - toast.error("保存 Agent 排序失败", { + toast.error(t("toasts.saveAgentOrderFailed"), { description: message, }) await refreshAgents() @@ -2778,7 +2910,7 @@ export function AcpAgentSettings() { setReordering(false) } }, - [refreshAgents] + [refreshAgents, t] ) const handleReorder = useCallback((next: AcpAgentInfo[]) => { @@ -3047,7 +3179,7 @@ export function AcpAgentSettings() { claudeDefaultOpusModel: important.claudeDefaultOpusModel, })) }, - [selectedAgent, selectedDraft, updateSelectedDraft] + [selectedAgent, selectedDraft, t, updateSelectedDraft] ) const handleImportantConfigChange = useCallback( @@ -3060,7 +3192,7 @@ export function AcpAgentSettings() { buildImportantPatchFromDraft(nextDraft) ) if (nextJson.recoveredFromInvalid) { - toast.warning("原生 JSON 配置格式无效,已重置为结构化配置") + toast.warning(t("warnings.nativeJsonRecoveredStructured")) } setConfigErrors((prev) => ({ ...prev, @@ -3130,7 +3262,7 @@ export function AcpAgentSettings() { normalizedValues.googleApplicationCredentials, }) if (nextConfig.recoveredFromInvalid) { - toast.warning("原生 JSON 配置格式无效,已重置为结构化配置") + toast.warning(t("warnings.nativeJsonRecoveredStructured")) } setConfigErrors((prev) => ({ ...prev, @@ -3203,7 +3335,7 @@ export function AcpAgentSettings() { googleApplicationCredentials: patched.googleApplicationCredentials, }) if (nextConfig.recoveredFromInvalid) { - toast.warning("原生 JSON 配置格式无效,已重置为结构化配置") + toast.warning(t("warnings.nativeJsonRecoveredStructured")) } setConfigErrors((prev) => ({ ...prev, @@ -3261,7 +3393,7 @@ export function AcpAgentSettings() { }), })) }, - [selectedAgent, selectedDraft, updateSelectedDraft] + [selectedAgent, selectedDraft, t, updateSelectedDraft] ) const handleOpenCodeConfigPatch = useCallback( @@ -3277,7 +3409,7 @@ export function AcpAgentSettings() { mutator ) if (nextConfig.recoveredFromInvalid) { - toast.warning("原生 JSON 配置格式无效,已重置为 OpenCode 结构化配置") + toast.warning(t("warnings.nativeJsonRecoveredOpenCode")) } setConfigErrors((prev) => ({ ...prev, @@ -3293,7 +3425,7 @@ export function AcpAgentSettings() { model: parsed.model, })) }, - [selectedAgent, selectedDraft, updateSelectedDraft] + [selectedAgent, selectedDraft, t, updateSelectedDraft] ) const handleOpenCodeFieldChange = useCallback( @@ -3315,11 +3447,11 @@ export function AcpAgentSettings() { const providerId = openCodeNewProviderId.trim() if (!providerId) return if (!/^[A-Za-z0-9_.-]+$/.test(providerId)) { - toast.error("Provider ID 仅支持字母、数字、下划线、点与中划线") + toast.error(t("errors.providerIdPattern")) return } if (selectedOpenCodeConfig.providerIds.includes(providerId)) { - toast.error(`Provider '${providerId}' 已存在`) + toast.error(t("errors.providerExists", { providerId })) return } handleOpenCodeConfigPatch((config) => { @@ -3334,7 +3466,12 @@ export function AcpAgentSettings() { }) setOpenCodeProviderId(providerId) setOpenCodeNewProviderId("") - }, [handleOpenCodeConfigPatch, openCodeNewProviderId, selectedOpenCodeConfig]) + }, [ + handleOpenCodeConfigPatch, + openCodeNewProviderId, + selectedOpenCodeConfig, + t, + ]) const handleOpenCodeRemoveProvider = useCallback( (providerId: string) => { @@ -3383,7 +3520,7 @@ export function AcpAgentSettings() { } ) if (nextConfig.recoveredFromInvalid) { - toast.warning("原生 JSON 配置格式无效,已重置为 OpenCode 结构化配置") + toast.warning(t("warnings.nativeJsonRecoveredOpenCode")) } const nextAuth = patchOpenCodeAuthJsonText( @@ -3393,7 +3530,7 @@ export function AcpAgentSettings() { } ) if (nextAuth.recoveredFromInvalid) { - toast.warning("OpenCode auth.json 格式无效,已重置为默认配置") + toast.warning(t("warnings.openCodeAuthRecovered")) } const nextOpenCode = extractOpenCodeConfigValues( @@ -3444,7 +3581,7 @@ export function AcpAgentSettings() { openCodeAuthJsonText: nextDraft.openCodeAuthJsonText, } }, - [selectedAgent, selectedDraft] + [selectedAgent, selectedDraft, t] ) const confirmOpenCodeProviderDelete = useCallback(() => { @@ -3469,14 +3606,14 @@ export function AcpAgentSettings() { } ) .then(() => { - toast.success(`Provider ${providerId} 已删除`, { - description: "OpenCode 配置与认证 JSON 已同步保存。", + toast.success(t("toasts.providerDeleted", { providerId }), { + description: t("toasts.openCodeConfigSynced"), }) }) .catch((err) => { console.error("[Settings] remove opencode provider failed:", err) const message = err instanceof Error ? err.message : String(err) - toast.error(`删除 Provider ${providerId} 失败`, { + toast.error(t("toasts.providerDeleteFailed", { providerId }), { description: message, }) }) @@ -3485,6 +3622,7 @@ export function AcpAgentSettings() { openCodeDeleteProviderId, persistPreferences, selectedAgent, + t, ]) const handleOpenCodeProviderStatusChange = useCallback( @@ -3624,7 +3762,7 @@ export function AcpAgentSettings() { const targetProvider = selectedOpenCodeConfig.providers[targetProviderId] if (!targetProvider) return if (targetProvider.modelIds.includes(nextModelId)) { - toast.error(`Model '${nextModelId}' 已存在`) + toast.error(t("errors.modelExists", { modelId: nextModelId })) return } handleOpenCodeConfigPatch((config) => { @@ -3652,7 +3790,7 @@ export function AcpAgentSettings() { [targetProviderId]: "", })) }, - [handleOpenCodeConfigPatch, openCodeNewModelIds, selectedOpenCodeConfig] + [handleOpenCodeConfigPatch, openCodeNewModelIds, selectedOpenCodeConfig, t] ) const handleOpenCodeRemoveModel = useCallback( @@ -3717,14 +3855,14 @@ export function AcpAgentSettings() { } if (!/^[A-Za-z0-9_.:-]+$/.test(nextModelId)) { - toast.error("模型 ID 仅支持字母、数字、下划线、点、冒号与中划线") + toast.error(t("errors.modelIdPattern")) return } const targetProvider = selectedOpenCodeConfig.providers[targetProviderId] if (!targetProvider) return if (targetProvider.modelIds.includes(nextModelId)) { - toast.error(`Model '${nextModelId}' 已存在`) + toast.error(t("errors.modelExists", { modelId: nextModelId })) return } @@ -3755,7 +3893,12 @@ export function AcpAgentSettings() { return next }) }, - [handleOpenCodeConfigPatch, openCodeModelIdDrafts, selectedOpenCodeConfig] + [ + handleOpenCodeConfigPatch, + openCodeModelIdDrafts, + selectedOpenCodeConfig, + t, + ] ) const handleOpenCodeModelFieldChange = useCallback( @@ -3813,7 +3956,7 @@ export function AcpAgentSettings() { codexSupportsWebsockets: important.supportsWebsockets, })) }, - [selectedAgent, selectedDraft, updateSelectedDraft] + [selectedAgent, selectedDraft, t, updateSelectedDraft] ) const handleCodexConfigTomlTextChange = useCallback( @@ -3871,7 +4014,7 @@ export function AcpAgentSettings() { codexConfigTomlText: nextToml, })) }, - [selectedAgent, selectedDraft, updateSelectedDraft] + [selectedAgent, selectedDraft, t, updateSelectedDraft] ) const handleCodexImportantConfigChange = useCallback( @@ -3912,7 +4055,7 @@ export function AcpAgentSettings() { }) : selectedDraft.codexConfigTomlText if (nextAuth.recoveredFromInvalid) { - toast.warning("auth.json 格式无效,已重置为结构化配置") + toast.warning(t("warnings.authRecoveredStructured")) } const synced = extractCodexImportantValues( nextAuth.authJsonText, @@ -3979,7 +4122,7 @@ export function AcpAgentSettings() { return (
- 加载 Agent 列表中... + {t("loadingAgents")}
) } @@ -3988,10 +4131,9 @@ export function AcpAgentSettings() {
-

Agent SDK管理

+

{t("title")}

- 统一管理 Agent - 的连接SDK、启用状态、环境变量、配置管理与版本预检信息。 + {t("description")}

@@ -4005,7 +4147,7 @@ export function AcpAgentSettings() {
- Agent 列表 + {t("agentList")}
{ event.stopPropagation() @@ -4091,8 +4235,10 @@ export function AcpAgentSettings() { {draft.enabled && ( )}
@@ -4113,8 +4259,10 @@ export function AcpAgentSettings() {
- +