[codex] fix MCP management lifecycle (#1144)

* feat(mcp): add MCP server management UI

- Server CRUD: add/edit/remove with YAML/JSON Monaco editor
- raw_config passthrough: zero field loss on edit/toggle
- tool_details embedding: single-request card data (1+N → 1)
- Auto-retry exponential backoff (2s→32s, max 5 retries)
- Route safety guards (hasRoute) for dynamic sidebar
- i18n: 9 languages (de/en/es/fr/ja/ko/pt/zh/zh-TW)
- 19 unit tests + 8 UX browser tests
- 35 files, +2933 lines

* fix mcp management lifecycle

---------

Co-authored-by: Crafter-feng <succeed_happu@163.com>
This commit is contained in:
ekko
2026-05-30 11:06:08 +08:00
committed by GitHub
parent 675ddb8282
commit b015e70b9d
37 changed files with 2717 additions and 7 deletions
+56
View File
@@ -105,6 +105,60 @@ export default {
expired: 'Abgelaufen',
},
// MCP-Verwaltung
mcp: {
title: 'MCP-Server',
loadFailed: 'MCP-Server konnten nicht geladen werden',
reloadAll: 'Alle neu laden',
refresh: 'Aktualisieren',
total: 'Gesamt',
connected: 'Verbunden',
disconnected: 'Getrennt',
tools: 'werkzeuge',
tool: 'Werkzeuge',
searchPlaceholder: 'Server suchen...',
addServer: '+ Server hinzufuegen',
zeroTools: '0 Werkzeuge',
loading: 'Wird geladen...',
empty: 'Keine MCP-Server konfiguriert',
reloaded: '{server} neu geladen',
reloadedAll: 'Alle MCP-Server neu geladen',
reloadFailed: 'Neuladen fehlgeschlagen',
serverAdded: 'Server "{name}" hinzugefuegt',
addFailed: 'Server konnte nicht hinzugefuegt werden',
serverUpdated: 'Server "{name}" aktualisiert',
updateFailed: 'Server konnte nicht aktualisiert werden',
saveFailed: 'Speichern fehlgeschlagen',
serverRemoved: '"{name}" entfernt',
enabled: "Aktiviert: {name}",
disabled: "Deaktiviert: {name}",
connectedStatus: 'Verbunden',
disconnectedStatus: 'Getrennt',
disabledStatus: 'Deaktiviert',
toolList: 'Werkzeugliste',
count: ' ',
more: 'mehr',
removeFailed: 'Server konnte nicht entfernt werden',
testOk: 'Test OK — {count} Werkzeuge verfuegbar',
testEmpty: 'Test lieferte keine Werkzeuge',
testFailed: 'Test fehlgeschlagen',
edit: 'Bearbeiten',
test: 'Testen',
reload: 'Neu laden',
remove: 'Entfernen',
confirmRemove: 'Server "{name}" entfernen?',
cancel: 'Abbrechen',
add: 'Hinzufuegen',
save: 'Speichern',
addTitle: 'MCP-Server hinzufuegen',
editTitle: 'MCP-Server bearbeiten',
invalidJson: 'Ungültiges JSON',
invalidYaml: 'Ungültiges YAML-Format',
invalidConfig: 'Ungültige Konfiguration',
invalidServerConfig: 'Ungültige Serverkonfiguration',
missingCommandOrUrl: 'Muss command oder url enthalten',
},
// Sidebar
sidebar: {
chat: 'Chat',
@@ -115,6 +169,7 @@ export default {
models: 'Modelle',
profiles: 'Profile',
plugins: 'Plugins',
mcp: 'MCP',
skills: 'Fahigkeiten',
memory: 'Gedachtnis',
logs: 'Protokolle',
@@ -235,6 +290,7 @@ export default {
compress: 'Kontextkomprimierung im Leerlauf ausführen',
steer: 'Steuertext an den aktiven Bridge-Lauf senden',
destroy: 'Bridge-Agent für diese Sitzung freigeben',
reloadMcp: 'MCP-Server neu laden',
},
attachFiles: 'Dateien anhangen',
showToolCalls: 'Tool-Aufrufe anzeigen',
+56
View File
@@ -105,6 +105,60 @@ export default {
stop: 'Stop',
},
// MCP Management
mcp: {
title: 'MCP Servers',
loadFailed: 'Failed to load MCP servers',
reloadAll: 'Reload All',
refresh: 'Refresh',
total: 'Total',
connected: 'Connected',
disconnected: 'Disconnected',
tools: 'tools',
tool: 'Tools',
searchPlaceholder: 'Search servers...',
addServer: '+ Add Server',
zeroTools: '0 tools',
loading: 'Loading...',
empty: 'No MCP servers configured',
reloaded: 'Reloaded {server}',
reloadedAll: 'All MCP servers reloaded',
reloadFailed: 'Reload failed',
serverAdded: 'Server "{name}" added',
addFailed: 'Failed to add server',
serverUpdated: 'Server "{name}" updated',
updateFailed: 'Failed to update server',
saveFailed: 'Save failed',
serverRemoved: 'Removed "{name}"',
enabled: "Enabled {name}",
disabled: "Disabled {name}",
connectedStatus: 'Connected',
disconnectedStatus: 'Disconnected',
disabledStatus: 'Disabled',
toolList: 'Tool List',
count: ' ',
more: 'more',
removeFailed: 'Failed to remove server',
testOk: 'Test OK — {count} tools available',
testEmpty: 'Test returned no tools',
testFailed: 'Test failed',
edit: 'Edit',
test: 'Test',
reload: 'Reload',
remove: 'Remove',
confirmRemove: 'Remove server "{name}"?',
cancel: 'Cancel',
add: 'Add',
save: 'Save',
addTitle: 'Add MCP Server',
editTitle: 'Edit MCP Server',
invalidJson: 'Invalid JSON format',
invalidYaml: 'Invalid YAML format',
invalidConfig: 'Invalid configuration',
invalidServerConfig: 'Invalid server configuration',
missingCommandOrUrl: 'Must have command or url',
},
// Sidebar
sidebar: {
chat: 'Chat',
@@ -117,6 +171,7 @@ export default {
profiles: 'Profiles',
skills: 'Skills',
plugins: 'Plugins',
mcp: 'MCP',
memory: 'Memory',
logs: 'Logs',
usage: 'Usage',
@@ -236,6 +291,7 @@ export default {
compress: 'Run context compression while idle',
steer: 'Send steering text to the active bridge run',
destroy: 'Release the bridge agent for this session',
reloadMcp: 'Reload MCP servers',
},
attachFiles: 'Attach files',
autoPlaySpeech: 'Auto-play voice',
+56
View File
@@ -105,6 +105,60 @@ export default {
expired: 'Expirado',
},
// Gestion de MCP
mcp: {
title: 'Servidores MCP',
loadFailed: 'Error al cargar servidores MCP',
reloadAll: 'Recargar todos',
refresh: 'Actualizar',
total: 'Total',
connected: 'Conectado',
disconnected: 'Desconectado',
tools: 'herramientas',
tool: 'Herramientas',
searchPlaceholder: 'Buscar servidores...',
addServer: '+ Agregar servidor',
zeroTools: '0 herramientas',
loading: 'Cargando...',
empty: 'No hay servidores MCP configurados',
reloaded: '{server} recargado',
reloadedAll: 'Todos los servidores MCP recargados',
reloadFailed: 'Error al recargar',
serverAdded: 'Servidor "{name}" agregado',
addFailed: 'Error al agregar servidor',
serverUpdated: 'Servidor "{name}" actualizado',
updateFailed: 'Error al actualizar servidor',
saveFailed: 'Error al guardar',
serverRemoved: '"{name}" eliminado',
enabled: "Habilitado: {name}",
disabled: "Deshabilitado: {name}",
connectedStatus: 'Conectado',
disconnectedStatus: 'Desconectado',
disabledStatus: 'Deshabilitado',
toolList: 'Lista de herramientas',
count: ' ',
more: 'más',
removeFailed: 'Error al eliminar servidor',
testOk: 'Prueba OK — {count} herramientas disponibles',
testEmpty: 'La prueba no devolvio herramientas',
testFailed: 'Error en la prueba',
edit: 'Editar',
test: 'Probar',
reload: 'Recargar',
remove: 'Eliminar',
confirmRemove: '¿Eliminar servidor "{name}"?',
cancel: 'Cancelar',
add: 'Agregar',
save: 'Guardar',
addTitle: 'Agregar servidor MCP',
editTitle: 'Editar servidor MCP',
invalidJson: 'JSON inválido',
invalidYaml: 'Formato YAML no válido',
invalidConfig: 'Configuración no válida',
invalidServerConfig: 'Configuración del servidor no válida',
missingCommandOrUrl: 'Debe incluir command o url',
},
// Sidebar
sidebar: {
chat: 'Chat',
@@ -115,6 +169,7 @@ export default {
models: 'Modelos',
profiles: 'Perfiles',
plugins: 'Plugins',
mcp: 'MCP',
skills: 'Habilidades',
memory: 'Memoria',
logs: 'Registros',
@@ -235,6 +290,7 @@ export default {
compress: 'Ejecutar compresión de contexto cuando esté inactiva',
steer: 'Enviar texto de guía a la ejecución activa de Bridge',
destroy: 'Liberar el agente Bridge de esta sesión',
reloadMcp: 'Recargar servidores MCP',
},
attachFiles: 'Adjuntar archivos',
showToolCalls: 'Mostrar llamadas de herramientas',
+56
View File
@@ -105,6 +105,60 @@ export default {
expired: 'Expiré',
},
// Gestion de MCP
mcp: {
title: 'Serveurs MCP',
loadFailed: 'Echec du chargement des serveurs MCP',
reloadAll: 'Tout recharger',
refresh: 'Rafraichir',
total: 'Total',
connected: 'Connecte',
disconnected: 'Deconnecte',
tools: 'outils',
tool: 'Outils',
searchPlaceholder: 'Rechercher des serveurs...',
addServer: '+ Ajouter un serveur',
zeroTools: '0 outils',
loading: 'Chargement...',
empty: 'Aucun serveur MCP configure',
reloaded: '{server} recharge',
reloadedAll: 'Tous les serveurs MCP recharges',
reloadFailed: 'Echec du rechargement',
serverAdded: 'Serveur "{name}" ajoute',
addFailed: 'Echec de l ajout du serveur',
serverUpdated: 'Serveur "{name}" mis a jour',
updateFailed: 'Echec de la mise a jour du serveur',
saveFailed: 'Echec de la sauvegarde',
serverRemoved: '"{name}" supprime',
enabled: "Activé : {name}",
disabled: "Désactivé : {name}",
connectedStatus: 'Connecté',
disconnectedStatus: 'Déconnecté',
disabledStatus: 'Désactivé',
toolList: 'Liste des outils',
count: ' ',
more: 'de plus',
removeFailed: 'Echec de la suppression du serveur',
testOk: 'Test OK — {count} outils disponibles',
testEmpty: 'Le test n a retourne aucun outil',
testFailed: 'Echec du test',
edit: 'Modifier',
test: 'Tester',
reload: 'Recharger',
remove: 'Supprimer',
confirmRemove: 'Supprimer le serveur "{name}" ?',
cancel: 'Annuler',
add: 'Ajouter',
save: 'Enregistrer',
addTitle: 'Ajouter un serveur MCP',
editTitle: 'Modifier le serveur MCP',
invalidJson: 'JSON invalide',
invalidYaml: 'Format YAML invalide',
invalidConfig: 'Configuration invalide',
invalidServerConfig: 'Configuration du serveur invalide',
missingCommandOrUrl: 'Doit contenir command ou url',
},
// Sidebar
sidebar: {
chat: 'Discussion',
@@ -115,6 +169,7 @@ export default {
models: 'Modeles',
profiles: 'Profils',
plugins: 'Plugins',
mcp: 'MCP',
skills: 'Competences',
memory: 'Memoire',
logs: 'Journaux',
@@ -235,6 +290,7 @@ export default {
compress: 'Lancer la compression du contexte au repos',
steer: 'Envoyer un guidage à lexécution Bridge active',
destroy: 'Libérer lagent Bridge de cette session',
reloadMcp: 'Recharger les serveurs MCP',
},
attachFiles: 'Joindre des fichiers',
showToolCalls: 'Afficher les appels doutils',
+56
View File
@@ -106,6 +106,60 @@ export default {
},
// サイドバー
// MCP 管理
mcp: {
title: 'MCP サーバー',
loadFailed: 'MCP サーバーの読み込みに失敗しました',
reloadAll: 'すべて再読み込み',
refresh: '更新',
total: '合計',
connected: '接続済み',
disconnected: '未接続',
tools: 'ツール',
tool: 'ツール',
searchPlaceholder: 'サーバーを検索...',
addServer: '+ サーバーを追加',
zeroTools: '0 個のツール',
loading: '読み込み中...',
empty: 'MCP サーバーが設定されていません',
reloaded: '{server} を再読み込みしました',
reloadedAll: 'すべての MCP サーバーを再読み込みしました',
reloadFailed: '再読み込みに失敗しました',
serverAdded: 'サーバー "{name}" を追加しました',
addFailed: 'サーバーの追加に失敗しました',
serverUpdated: 'サーバー "{name}" を更新しました',
updateFailed: 'サーバーの更新に失敗しました',
saveFailed: '保存に失敗しました',
serverRemoved: '"{name}" を削除しました',
enabled: "有効化: {name}",
disabled: "無効化: {name}",
connectedStatus: '接続済み',
disconnectedStatus: '未接続',
disabledStatus: '無効',
toolList: 'ツール一覧',
count: ' ',
more: '件',
removeFailed: 'サーバーの削除に失敗しました',
testOk: 'テスト成功 — {count} 個のツールが利用可能',
testEmpty: 'テスト結果にツールがありません',
testFailed: 'テストに失敗しました',
edit: '編集',
test: 'テスト',
reload: '再読み込み',
remove: '削除',
confirmRemove: 'サーバー "{name}" を削除しますか?',
cancel: 'キャンセル',
add: '追加',
save: '保存',
addTitle: 'MCP サーバーを追加',
editTitle: 'MCP サーバーを編集',
invalidJson: 'JSON形式エラー',
invalidYaml: 'YAML 形式が無効です',
invalidConfig: '設定形式が無効です',
invalidServerConfig: 'サーバー設定が無効です',
missingCommandOrUrl: 'command または url が必要です',
},
sidebar: {
chat: 'チャット',
search: '検索',
@@ -115,6 +169,7 @@ export default {
models: 'モデル',
profiles: 'プロファイル',
plugins: 'プラグイン',
mcp: 'MCP',
skills: 'スキル',
memory: 'メモリ',
logs: 'ログ',
@@ -235,6 +290,7 @@ export default {
compress: 'アイドル時にコンテキスト圧縮を実行',
steer: '実行中の Bridge に誘導テキストを送信',
destroy: 'このセッションの Bridge Agent を解放',
reloadMcp: 'MCP サーバーを再読み込み',
},
attachFiles: 'ファイルを添付',
showToolCalls: 'ツール呼び出しを表示',
+56
View File
@@ -106,6 +106,60 @@ export default {
},
// 사이드바
// MCP 관리
mcp: {
title: 'MCP 서버',
loadFailed: 'MCP 서버를 불러오지 못했습니다',
reloadAll: '모두 다시 로드',
refresh: '새로고침',
total: '합계',
connected: '연결됨',
disconnected: '연결 끊김',
tools: '도구',
tool: '도구',
searchPlaceholder: '서버 검색...',
addServer: '+ 서버 추가',
zeroTools: '0개 도구',
loading: '로딩...',
empty: 'MCP 서버가 설정되지 않았습니다',
reloaded: '{server} 다시 로드됨',
reloadedAll: '모든 MCP 서버가 다시 로드되었습니다',
reloadFailed: '다시 로드 실패',
serverAdded: '서버 "{name}" 추가됨',
addFailed: '서버 추가 실패',
serverUpdated: '서버 "{name}" 업데이트됨',
updateFailed: '서버 업데이트 실패',
saveFailed: '저장 실패',
serverRemoved: '"{name}" 제거됨',
enabled: "{name} 활성화됨",
disabled: "{name} 비활성화됨",
connectedStatus: '연결됨',
disconnectedStatus: '연결 끊김',
disabledStatus: '비활성화됨',
toolList: '도구 목록',
count: ' ',
more: '개 더보기',
removeFailed: '서버 제거 실패',
testOk: '테스트 성공 — {count}개 도구 사용 가능',
testEmpty: '테스트에서 도구가 반환되지 않았습니다',
testFailed: '테스트 실패',
edit: '편집',
test: '테스트',
reload: '다시 로드',
remove: '제거',
confirmRemove: '서버 "{name}"을(를) 제거하시겠습니까?',
cancel: '취소',
add: '추가',
save: '저장',
addTitle: 'MCP 서버 추가',
editTitle: 'MCP 서버 편집',
invalidJson: 'JSON 형식 오류',
invalidYaml: 'YAML 형식이 올바르지 않습니다',
invalidConfig: '올바르지 않은 설정',
invalidServerConfig: '서버 설정이 올바르지 않습니다',
missingCommandOrUrl: 'command 또는 url이 필요합니다',
},
sidebar: {
chat: '채팅',
search: '검색',
@@ -115,6 +169,7 @@ export default {
models: '모델',
profiles: '프로필',
plugins: '플러그인',
mcp: 'MCP',
skills: '스킬',
memory: '메모리',
logs: '로그',
@@ -235,6 +290,7 @@ export default {
compress: '유휴 상태에서 컨텍스트 압축 실행',
steer: '활성 Bridge 실행에 지시 텍스트 보내기',
destroy: '이 세션의 Bridge Agent 해제',
reloadMcp: 'MCP 서버 다시 로드',
},
attachFiles: '파일 첨부',
showToolCalls: '도구 호출 표시',
+56
View File
@@ -105,6 +105,60 @@ export default {
expired: 'Expirado',
},
// Gestao de MCP
mcp: {
title: 'Servidores MCP',
loadFailed: 'Falha ao carregar servidores MCP',
reloadAll: 'Recarregar todos',
refresh: 'Atualizar',
total: 'Total',
connected: 'Conectado',
disconnected: 'Desconectado',
tools: 'ferramentas',
tool: 'Ferramentas',
searchPlaceholder: 'Pesquisar servidores...',
addServer: '+ Adicionar servidor',
zeroTools: '0 ferramentas',
loading: 'Carregando...',
empty: 'Nenhum servidor MCP configurado',
reloaded: '{server} recarregado',
reloadedAll: 'Todos os servidores MCP recarregados',
reloadFailed: 'Falha ao recarregar',
serverAdded: 'Servidor "{name}" adicionado',
addFailed: 'Falha ao adicionar servidor',
serverUpdated: 'Servidor "{name}" atualizado',
updateFailed: 'Falha ao atualizar servidor',
saveFailed: 'Falha ao salvar',
serverRemoved: '"{name}" removido',
enabled: "Habilitado: {name}",
disabled: "Desabilitado: {name}",
connectedStatus: 'Conectado',
disconnectedStatus: 'Desconectado',
disabledStatus: 'Desativado',
toolList: 'Lista de ferramentas',
count: ' ',
more: 'mais',
removeFailed: 'Falha ao remover servidor',
testOk: 'Teste OK — {count} ferramentas disponiveis',
testEmpty: 'O teste nao retornou ferramentas',
testFailed: 'Falha no teste',
edit: 'Editar',
test: 'Testar',
reload: 'Recarregar',
remove: 'Remover',
confirmRemove: 'Remover servidor "{name}"?',
cancel: 'Cancelar',
add: 'Adicionar',
save: 'Salvar',
addTitle: 'Adicionar servidor MCP',
editTitle: 'Editar servidor MCP',
invalidJson: 'JSON inválido',
invalidYaml: 'Formato YAML inválido',
invalidConfig: 'Configuração inválida',
invalidServerConfig: 'Configuração do servidor inválida',
missingCommandOrUrl: 'Deve conter command ou url',
},
// Sidebar
sidebar: {
chat: 'Chat',
@@ -115,6 +169,7 @@ export default {
models: 'Modelos',
profiles: 'Perfis',
plugins: 'Plugins',
mcp: 'MCP',
skills: 'Habilidades',
memory: 'Memoria',
logs: 'Logs',
@@ -235,6 +290,7 @@ export default {
compress: 'Executar compressão de contexto quando ocioso',
steer: 'Enviar texto de orientação para a execução ativa do Bridge',
destroy: 'Liberar o Bridge Agent desta sessão',
reloadMcp: 'Recarregar servidores MCP',
},
attachFiles: 'Anexar arquivos',
showToolCalls: 'Mostrar chamadas de ferramentas',
+56
View File
@@ -106,6 +106,60 @@ export default {
},
// 側邊欄
// MCP 管理
mcp: {
title: 'MCP 伺服器',
loadFailed: '載入 MCP 伺服器失敗',
reloadAll: '全部重載',
refresh: '重新整理',
total: '總計',
connected: '已連線',
disconnected: '未連線',
tools: '工具',
tool: '工具',
searchPlaceholder: '搜尋伺服器...',
addServer: '+ 新增伺服器',
zeroTools: '0 個工具',
loading: '載入中...',
empty: '暫無 MCP 伺服器設定',
reloaded: '已重載 {server}',
reloadedAll: '所有 MCP 伺服器已重載',
reloadFailed: '重載失敗',
serverAdded: '伺服器 "{name}" 已新增',
addFailed: '新增伺服器失敗',
serverUpdated: '伺服器 "{name}" 已更新',
updateFailed: '更新伺服器失敗',
saveFailed: '儲存失敗',
serverRemoved: '已移除 "{name}"',
enabled: "已啟用 {name}",
disabled: "已禁用 {name}",
connectedStatus: '已連線',
disconnectedStatus: '未連線',
disabledStatus: '已停用',
toolList: '工具列表',
count: '個',
more: '更多',
removeFailed: '移除伺服器失敗',
testOk: '測試成功 — {count} 個工具可用',
testEmpty: '測試未回傳工具',
testFailed: '測試失敗',
edit: '編輯',
test: '測試',
reload: '重載',
remove: '移除',
confirmRemove: '確認刪除伺服器 "{name}"',
cancel: '取消',
add: '新增',
save: '儲存',
addTitle: '新增 MCP 伺服器',
editTitle: '編輯 MCP 伺服器',
invalidJson: 'JSON 格式錯誤',
invalidYaml: 'YAML 格式錯誤',
invalidConfig: '配置格式錯誤',
invalidServerConfig: '伺服器配置無效',
missingCommandOrUrl: '必須包含 command 或 url',
},
sidebar: {
chat: '對話',
search: '搜尋',
@@ -116,6 +170,7 @@ export default {
models: '模型',
profiles: '使用者',
plugins: '插件',
mcp: 'MCP',
skills: '技能',
memory: '記憶',
logs: '日誌',
@@ -235,6 +290,7 @@ export default {
compress: '空閒時觸發上下文壓縮',
steer: '向目前 Bridge 執行傳送引導文字',
destroy: '釋放目前會話的 Bridge Agent',
reloadMcp: '重載 MCP 伺服器',
},
attachFiles: '新增附件',
autoPlaySpeech: '自動播放語音',
+56
View File
@@ -106,6 +106,60 @@ export default {
},
// 侧边栏
// MCP 管理
mcp: {
title: 'MCP 服务器',
loadFailed: '加载 MCP 服务器失败',
reloadAll: '全部重载',
refresh: '刷新',
total: '总计',
connected: '已连接',
disconnected: '未连接',
tools: '工具',
tool: '工具',
searchPlaceholder: '搜索服务器...',
addServer: '+ 添加服务器',
zeroTools: '0 个工具',
loading: '加载中...',
empty: '暂无 MCP 服务器配置',
reloaded: '已重载 {server}',
reloadedAll: '所有 MCP 服务器已重载',
reloadFailed: '重载失败',
serverAdded: '服务器 "{name}" 已添加',
addFailed: '添加服务器失败',
serverUpdated: '服务器 "{name}" 已更新',
updateFailed: '更新服务器失败',
saveFailed: '保存失败',
serverRemoved: '已移除 "{name}"',
enabled: "已启用 {name}",
disabled: "已禁用 {name}",
connectedStatus: '已连接',
disconnectedStatus: '未连接',
disabledStatus: '已禁用',
toolList: '工具列表',
count: '个',
more: '更多',
removeFailed: '移除服务器失败',
testOk: '测试成功 — {count} 个工具可用',
testEmpty: '测试未返回工具',
testFailed: '测试失败',
edit: '编辑',
test: '测试',
reload: '重载',
remove: '移除',
confirmRemove: '确认删除服务器 "{name}"',
cancel: '取消',
add: '添加',
save: '保存',
addTitle: '添加 MCP 服务器',
editTitle: '编辑 MCP 服务器',
invalidJson: 'JSON 格式错误',
invalidYaml: 'YAML 格式错误',
invalidConfig: '配置格式错误',
invalidServerConfig: '服务器配置无效',
missingCommandOrUrl: '必须包含 command 或 url',
},
sidebar: {
chat: '对话',
search: '搜索',
@@ -116,6 +170,7 @@ export default {
models: '模型',
profiles: '用户',
plugins: '插件',
mcp: 'MCP',
skills: '技能',
memory: '记忆',
logs: '日志',
@@ -236,6 +291,7 @@ export default {
compress: '空闲时触发上下文压缩',
steer: '向当前 Bridge 运行发送引导文本',
destroy: '释放当前会话的 Bridge Agent',
reloadMcp: '重载 MCP 服务器',
},
attachFiles: '添加附件',
autoPlaySpeech: '自动播放语音',
+1 -1
View File
@@ -37,7 +37,7 @@ const rawMessages: Record<string, LocaleMessages> = { en, zh, 'zh-TW': zhTW, ja,
export const messages: Record<string, LocaleMessages> = {}
for (const [locale, msg] of Object.entries(rawMessages)) {
messages[locale] = locale === 'en' ? msg : mergeMessagesWithFallback(en, msg)
messages[locale] = locale === 'en' ? msg : mergeMessagesWithFallback({ ...en }, { ...msg })
}
export { en }