Add optional Nanobot plugin controls (#4396)

* feat: add optional nanobot features

* test: update azure install hint expectation

* fix: validate optional feature extras

maintainer edit: verify requested dependency extras before treating optional features as installed, propagate restart state from feature enablement, and align docs with the new plugins enable command.

* fix: bound optional feature installs

maintainer edit: make optional feature installs time out as a normal install failure instead of leaving the WebUI or CLI action waiting indefinitely.

* feat: slim optional channel dependencies

* fix: log optional install commands

* fix(webui): gate remote feature installs

* docs: clarify webhook plugin example

* fix(webui): harden optional feature installs

* fix: install optional deps without package fallback

* fix(cli): refine plugin feature controls

* fix(webui): count enabled nanobot features

* fix(webui): allow slow feature install routes

* fix(webui): allow disabling websocket channel

* fix(plugins): simplify optional feature controls

* fix(webui): polish apps catalog states

* fix(webui): confirm nanobot support installs

* fix(webui): polish nanobot install dialog

* fix(webui): suppress empty websocket handshakes

* fix(webui): clarify apps plugin summary

* fix(webui): localize workspace access copy

* fix(plugins): polish optional feature controls (#4691)

---------

Co-authored-by: Xubin Ren <52506698+Re-bin@users.noreply.github.com>
This commit is contained in:
chengyongru
2026-07-03 18:17:52 +08:00
committed by GitHub
co-authored by Xubin Ren
parent 00cc0da530
commit 5283ceae85
61 changed files with 3061 additions and 258 deletions
+22 -4
View File
@@ -458,18 +458,36 @@
"missingCredential": "Configure this provider before enabling image generation."
},
"apps": {
"description": "Add app CLIs and MCP services nanobot can use from chat.",
"description": "Enable plugins, local app adapters, and connected tool servers.",
"cliLabel": "CLI",
"mcpLabel": "MCP",
"channelLabel": "Channel",
"featureLabel": "Feature",
"filterAll": "All",
"filterPlugins": "Plugins",
"filterCli": "CLI apps",
"filterMcp": "MCP services",
"enabledSummary": "{{count}} enabled",
"caption": "{{cli}} CLI · {{mcp}} MCP",
"caption": "{{plugins}} Plugin · {{cli}} CLI · {{mcp}} MCP",
"searchPlaceholder": "Search Apps",
"featured": "Featured",
"featured": "Catalog",
"loading": "Loading Apps...",
"empty": "No apps match this filter."
"empty": "No apps match this filter.",
"restartRequired": "Restart nanobot to apply updated apps and features."
},
"nanobotFeatures": {
"enabled": "Enabled",
"enable": "Enable",
"disable": "Disable",
"ready": "Ready",
"missingDependency": "Support missing",
"installSupport": "Install support",
"installConfirmTitle": "Install support for {{name}}?",
"installConfirmDescription": "nanobot will add what {{name}} needs, then turn it on. Continue?",
"installConfirmAction": "Install and enable",
"websocketRequired": "Required for WebUI",
"channelDisabled": "Channel is disabled",
"notEnabled": "Not enabled"
},
"automations": {
"filters": {
+30 -12
View File
@@ -458,18 +458,36 @@
"thirdPartyBrands": "Los nombres, logotipos y marcas de productos pertenecen a sus respectivos propietarios. Su uso es solo identificativo y no implica respaldo."
},
"apps": {
"description": "Agrega CLI de apps y servicios MCP que nanobot puede usar desde el chat.",
"description": "Activa complementos, adaptadores locales de apps y servidores de herramientas conectados.",
"cliLabel": "CLI",
"mcpLabel": "MCP",
"channelLabel": "Canal",
"featureLabel": "Función",
"filterAll": "Todo",
"filterPlugins": "Complementos",
"filterCli": "Apps CLI",
"filterMcp": "Servicios MCP",
"enabledSummary": "{{count}} activados",
"caption": "{{cli}} CLI · {{mcp}} MCP",
"caption": "{{plugins}} complementos · {{cli}} CLI · {{mcp}} MCP",
"searchPlaceholder": "Buscar apps",
"featured": "Destacadas",
"featured": "Catálogo",
"loading": "Cargando apps...",
"empty": "Ninguna app coincide con este filtro."
"empty": "Ninguna app coincide con este filtro.",
"restartRequired": "Reinicia nanobot para aplicar apps y funciones actualizadas."
},
"nanobotFeatures": {
"enabled": "Activado",
"enable": "Activar",
"disable": "Desactivar",
"ready": "Listo",
"missingDependency": "Falta soporte",
"installSupport": "Instalar soporte",
"installConfirmTitle": "¿Instalar soporte para {{name}}?",
"installConfirmDescription": "nanobot añadirá lo que {{name}} necesita y luego lo activará. ¿Continuar?",
"installConfirmAction": "Instalar y activar",
"websocketRequired": "Requerido para WebUI",
"channelDisabled": "El canal está desactivado",
"notEnabled": "No activado"
},
"automations": {
"filters": {
@@ -965,11 +983,11 @@
"mcpDescription": "Usar @{{name}} como servidor MCP"
},
"workspace": {
"accessAria": "Workspace access mode",
"accessAria": "Modo de acceso al espacio de trabajo",
"projectAria": "Elegir proyecto",
"projectPlaceholder": "Seleccionar proyecto",
"default": "Default Permission",
"full": "Full Access"
"default": "Permiso predeterminado",
"full": "Acceso completo"
}
},
"scrollToBottom": "Desplazarse al final",
@@ -1053,17 +1071,17 @@
"body": "El servidor rechazó tu último mensaje por superar el tamaño permitido. Quita algunas imágenes o usa archivos más pequeños y vuelve a enviarlo."
},
"workspaceScopeRejected": {
"title": "Workspace was not changed",
"body": "Nanobot kept the previous workspace because the requested project or access mode was rejected by the gateway."
"title": "El espacio de trabajo no cambió",
"body": "El gateway rechazó el proyecto o modo de acceso solicitado, así que Nanobot conservó el espacio de trabajo anterior."
}
},
"workspace": {
"dialog": {
"defaultProject": "Default workspace",
"defaultProject": "Espacio de trabajo predeterminado",
"manual": "Pegar ruta",
"manualPlaceholder": "/Users/name/project",
"usePath": "Use Path",
"absolutePathRequired": "Enter an absolute folder path on this machine."
"usePath": "Usar ruta",
"absolutePathRequired": "Introduce una ruta absoluta de carpeta en esta máquina."
}
}
}
+30 -12
View File
@@ -458,18 +458,36 @@
"thirdPartyBrands": "Les noms, logos et marques de produits appartiennent à leurs propriétaires respectifs. Leur utilisation sert uniquement à l'identification et n'implique aucune approbation."
},
"apps": {
"description": "Ajoutez des CLI dapps et services MCP utilisables par nanobot depuis le chat.",
"description": "Activez des extensions, des adaptateurs dapps locales et des serveurs doutils connectés.",
"cliLabel": "CLI",
"mcpLabel": "MCP",
"channelLabel": "Canal",
"featureLabel": "Fonction",
"filterAll": "Tout",
"filterPlugins": "Extensions",
"filterCli": "Apps CLI",
"filterMcp": "Services MCP",
"enabledSummary": "{{count}} activés",
"caption": "{{cli}} CLI · {{mcp}} MCP",
"caption": "{{plugins}} extensions · {{cli}} CLI · {{mcp}} MCP",
"searchPlaceholder": "Rechercher des apps",
"featured": "À la une",
"featured": "Catalogue",
"loading": "Chargement des apps...",
"empty": "Aucune app ne correspond."
"empty": "Aucune app ne correspond.",
"restartRequired": "Redémarrez nanobot pour appliquer les apps et fonctions mises à jour."
},
"nanobotFeatures": {
"enabled": "Activé",
"enable": "Activer",
"disable": "Désactiver",
"ready": "Prêt",
"missingDependency": "Support manquant",
"installSupport": "Installer le support",
"installConfirmTitle": "Installer le support pour {{name}} ?",
"installConfirmDescription": "nanobot ajoutera ce dont {{name}} a besoin, puis l'activera. Continuer ?",
"installConfirmAction": "Installer et activer",
"websocketRequired": "Requis pour la WebUI",
"channelDisabled": "Canal désactivé",
"notEnabled": "Non activé"
},
"automations": {
"filters": {
@@ -965,11 +983,11 @@
"mcpDescription": "Utiliser @{{name}} comme serveur MCP"
},
"workspace": {
"accessAria": "Workspace access mode",
"accessAria": "Mode daccès à lespace de travail",
"projectAria": "Choisir un projet",
"projectPlaceholder": "Sélectionner un projet",
"default": "Default Permission",
"full": "Full Access"
"default": "Autorisation par défaut",
"full": "Accès complet"
}
},
"scrollToBottom": "Faire défiler vers le bas",
@@ -1053,17 +1071,17 @@
"body": "Le serveur a rejeté votre dernier message car il dépasse la taille autorisée. Retirez des images ou choisissez des fichiers plus légers, puis renvoyez-le."
},
"workspaceScopeRejected": {
"title": "Workspace was not changed",
"body": "Nanobot kept the previous workspace because the requested project or access mode was rejected by the gateway."
"title": "Lespace de travail na pas changé",
"body": "La passerelle a refusé le projet ou le mode daccès demandé ; Nanobot a conservé lespace de travail précédent."
}
},
"workspace": {
"dialog": {
"defaultProject": "Default workspace",
"defaultProject": "Espace de travail par défaut",
"manual": "Coller un chemin",
"manualPlaceholder": "/Users/name/project",
"usePath": "Use Path",
"absolutePathRequired": "Enter an absolute folder path on this machine."
"usePath": "Utiliser le chemin",
"absolutePathRequired": "Saisissez un chemin absolu de dossier sur cette machine."
}
}
}
+30 -12
View File
@@ -458,18 +458,36 @@
"thirdPartyBrands": "Nama produk, logo, dan merek adalah milik pemiliknya masing-masing. Penggunaan hanya untuk identifikasi dan tidak menyiratkan dukungan."
},
"apps": {
"description": "Tambahkan CLI aplikasi dan layanan MCP yang dapat digunakan nanobot dari chat.",
"description": "Aktifkan plugin, adaptor aplikasi lokal, dan server alat terhubung.",
"cliLabel": "CLI",
"mcpLabel": "MCP",
"channelLabel": "Kanal",
"featureLabel": "Fitur",
"filterAll": "Semua",
"filterPlugins": "Plugin",
"filterCli": "Aplikasi CLI",
"filterMcp": "Layanan MCP",
"enabledSummary": "{{count}} aktif",
"caption": "{{cli}} CLI · {{mcp}} MCP",
"caption": "{{plugins}} plugin · {{cli}} CLI · {{mcp}} MCP",
"searchPlaceholder": "Cari aplikasi",
"featured": "Unggulan",
"featured": "Katalog",
"loading": "Memuat aplikasi...",
"empty": "Tidak ada aplikasi yang cocok."
"empty": "Tidak ada aplikasi yang cocok.",
"restartRequired": "Mulai ulang nanobot untuk menerapkan aplikasi dan fitur yang diperbarui."
},
"nanobotFeatures": {
"enabled": "Aktif",
"enable": "Aktifkan",
"disable": "Nonaktifkan",
"ready": "Siap",
"missingDependency": "Dukungan belum terpasang",
"installSupport": "Instal dukungan",
"installConfirmTitle": "Instal dukungan untuk {{name}}?",
"installConfirmDescription": "nanobot akan menambahkan yang dibutuhkan {{name}}, lalu mengaktifkannya. Lanjutkan?",
"installConfirmAction": "Instal dan aktifkan",
"websocketRequired": "Wajib untuk WebUI",
"channelDisabled": "Kanal dinonaktifkan",
"notEnabled": "Belum aktif"
},
"automations": {
"filters": {
@@ -965,11 +983,11 @@
"mcpDescription": "Gunakan @{{name}} sebagai server MCP"
},
"workspace": {
"accessAria": "Workspace access mode",
"accessAria": "Mode akses workspace",
"projectAria": "Pilih proyek",
"projectPlaceholder": "Pilih proyek",
"default": "Default Permission",
"full": "Full Access"
"default": "Izin default",
"full": "Akses penuh"
}
},
"scrollToBottom": "Gulir ke bawah",
@@ -1053,17 +1071,17 @@
"body": "Server menolak pesan terakhir karena melebihi batas ukuran. Hapus beberapa gambar atau gunakan berkas yang lebih kecil, lalu coba lagi."
},
"workspaceScopeRejected": {
"title": "Workspace was not changed",
"body": "Nanobot kept the previous workspace because the requested project or access mode was rejected by the gateway."
"title": "Workspace tidak berubah",
"body": "Gateway menolak proyek atau mode akses yang diminta, jadi Nanobot tetap memakai workspace sebelumnya."
}
},
"workspace": {
"dialog": {
"defaultProject": "Default workspace",
"defaultProject": "Workspace default",
"manual": "Tempel path",
"manualPlaceholder": "/Users/name/project",
"usePath": "Use Path",
"absolutePathRequired": "Enter an absolute folder path on this machine."
"usePath": "Gunakan path",
"absolutePathRequired": "Masukkan path folder absolut di mesin ini."
}
}
}
+30 -12
View File
@@ -458,18 +458,36 @@
"thirdPartyBrands": "製品名、ロゴ、ブランドはそれぞれの所有者に帰属します。使用は識別のみを目的とし、承認を意味するものではありません。"
},
"apps": {
"description": "nanobot がチャットで使用できる App CLI と MCP サービスを追加します。",
"description": "プラグイン、ローカルアプリアダプター、接続済みツールサーバーを有効にします。",
"cliLabel": "CLI",
"mcpLabel": "MCP",
"channelLabel": "チャンネル",
"featureLabel": "機能",
"filterAll": "すべて",
"filterPlugins": "プラグイン",
"filterCli": "CLI アプリ",
"filterMcp": "MCP サービス",
"enabledSummary": "{{count}} 件有効",
"caption": "CLI {{cli}} 件 · MCP {{mcp}} 件",
"caption": "{{plugins}} 件のプラグイン · CLI {{cli}} 件 · MCP {{mcp}} 件",
"searchPlaceholder": "アプリを検索",
"featured": "注目",
"featured": "カタログ",
"loading": "アプリを読み込み中...",
"empty": "一致するアプリはありません。"
"empty": "一致するアプリはありません。",
"restartRequired": "更新したアプリと機能を反映するには nanobot を再起動してください。"
},
"nanobotFeatures": {
"enabled": "有効",
"enable": "有効化",
"disable": "無効化",
"ready": "準備完了",
"missingDependency": "サポート不足",
"installSupport": "サポートをインストール",
"installConfirmTitle": "{{name}} のサポートをインストールしますか?",
"installConfirmDescription": "nanobot が {{name}} に必要なものを追加し、その後有効化します。続けますか?",
"installConfirmAction": "インストールして有効化",
"websocketRequired": "WebUI に必須",
"channelDisabled": "チャンネルは無効",
"notEnabled": "未有効"
},
"automations": {
"filters": {
@@ -965,11 +983,11 @@
"mcpDescription": "@{{name}} を MCP サーバーとして使用"
},
"workspace": {
"accessAria": "Workspace access mode",
"accessAria": "ワークスペースのアクセスモード",
"projectAria": "プロジェクトを選択",
"projectPlaceholder": "プロジェクトを選択",
"default": "Default Permission",
"full": "Full Access"
"default": "既定の権限",
"full": "フルアクセス"
}
},
"scrollToBottom": "一番下へスクロール",
@@ -1053,17 +1071,17 @@
"body": "サイズ上限を超えたため、直前のメッセージはサーバーに拒否されました。画像を減らすか、より小さいファイルに差し替えて再送してください。"
},
"workspaceScopeRejected": {
"title": "Workspace was not changed",
"body": "Nanobot kept the previous workspace because the requested project or access mode was rejected by the gateway."
"title": "ワークスペースは変更されませんでした",
"body": "要求されたプロジェクトまたはアクセスモードがゲートウェイで拒否されたため、Nanobot は以前のワークスペースをそのまま使用しています。"
}
},
"workspace": {
"dialog": {
"defaultProject": "Default workspace",
"defaultProject": "既定のワークスペース",
"manual": "パスを貼り付け",
"manualPlaceholder": "/Users/name/project",
"usePath": "Use Path",
"absolutePathRequired": "Enter an absolute folder path on this machine."
"usePath": "パスを使用",
"absolutePathRequired": "このマシン上の絶対フォルダーパスを入力してください。"
}
}
}
+30 -12
View File
@@ -458,18 +458,36 @@
"thirdPartyBrands": "제품 이름, 로고 및 브랜드는 각 소유자의 자산입니다. 사용은 식별 목적일 뿐 보증이나 제휴를 의미하지 않습니다."
},
"apps": {
"description": "nanobot이 채팅에서 사용할 수 있는 App CLI와 MCP 서비스를 추가합니다.",
"description": "플러그인, 로컬 앱 어댑터, 연결된 도구 서버를 활성화합니다.",
"cliLabel": "CLI",
"mcpLabel": "MCP",
"channelLabel": "채널",
"featureLabel": "기능",
"filterAll": "전체",
"filterPlugins": "플러그인",
"filterCli": "CLI 앱",
"filterMcp": "MCP 서비스",
"enabledSummary": "{{count}}개 활성화됨",
"caption": "CLI {{cli}}개 · MCP {{mcp}}개",
"caption": "플러그인 {{plugins}}개 · CLI {{cli}}개 · MCP {{mcp}}개",
"searchPlaceholder": "앱 검색",
"featured": "추천",
"featured": "카탈로그",
"loading": "앱을 불러오는 중...",
"empty": "일치하는 앱이 없습니다."
"empty": "일치하는 앱이 없습니다.",
"restartRequired": "업데이트된 앱과 기능을 적용하려면 nanobot을 다시 시작하세요."
},
"nanobotFeatures": {
"enabled": "활성화됨",
"enable": "활성화",
"disable": "비활성화",
"ready": "준비됨",
"missingDependency": "지원 패키지 없음",
"installSupport": "지원 패키지 설치",
"installConfirmTitle": "{{name}} 지원을 설치할까요?",
"installConfirmDescription": "nanobot이 {{name}}에 필요한 것을 추가한 뒤 활성화합니다. 계속할까요?",
"installConfirmAction": "설치하고 활성화",
"websocketRequired": "WebUI 필수",
"channelDisabled": "채널이 비활성화됨",
"notEnabled": "비활성화됨"
},
"automations": {
"filters": {
@@ -965,11 +983,11 @@
"mcpDescription": "@{{name}}을 MCP 서버로 사용"
},
"workspace": {
"accessAria": "Workspace access mode",
"accessAria": "작업공간 접근 모드",
"projectAria": "프로젝트 선택",
"projectPlaceholder": "프로젝트 선택",
"default": "Default Permission",
"full": "Full Access"
"default": "기본 권한",
"full": "전체 접근 권한"
}
},
"scrollToBottom": "맨 아래로 스크롤",
@@ -1053,17 +1071,17 @@
"body": "마지막 메시지가 서버의 크기 제한을 초과하여 거부되었습니다. 이미지를 줄이거나 더 작은 파일로 바꿔서 다시 보내 주세요."
},
"workspaceScopeRejected": {
"title": "Workspace was not changed",
"body": "Nanobot kept the previous workspace because the requested project or access mode was rejected by the gateway."
"title": "작업공간이 변경되지 않았습니다",
"body": "요청한 프로젝트 또는 접근 모드가 게이트웨이에서 거부되어 Nanobot이 이전 작업공간을 계속 사용합니다."
}
},
"workspace": {
"dialog": {
"defaultProject": "Default workspace",
"defaultProject": "기본 작업공간",
"manual": "경로 붙여넣기",
"manualPlaceholder": "/Users/name/project",
"usePath": "Use Path",
"absolutePathRequired": "Enter an absolute folder path on this machine."
"usePath": "경로 사용",
"absolutePathRequired": "이 머신의 절대 폴더 경로를 입력하세요."
}
}
}
+30 -12
View File
@@ -458,18 +458,36 @@
"thirdPartyBrands": "Tên sản phẩm, logo và thương hiệu thuộc về chủ sở hữu tương ứng. Việc sử dụng chỉ nhằm nhận diện và không ngụ ý được xác nhận."
},
"apps": {
"description": "Thêm CLI ứng dụng và dịch vụ MCP mà nanobot có thể dùng trong chat.",
"description": "Bật plugin, bộ chuyển đổi ứng dụng cục bộ và máy chủ công cụ đã kết nối.",
"cliLabel": "CLI",
"mcpLabel": "MCP",
"channelLabel": "Kênh",
"featureLabel": "Tính năng",
"filterAll": "Tất cả",
"filterPlugins": "Plugin",
"filterCli": "Ứng dụng CLI",
"filterMcp": "Dịch vụ MCP",
"enabledSummary": "{{count}} đã bật",
"caption": "{{cli}} CLI · {{mcp}} MCP",
"caption": "{{plugins}} plugin · {{cli}} CLI · {{mcp}} MCP",
"searchPlaceholder": "Tìm ứng dụng",
"featured": "Nổi bật",
"featured": "Danh mục",
"loading": "Đang tải ứng dụng...",
"empty": "Không có ứng dụng phù hợp."
"empty": "Không có ứng dụng phù hợp.",
"restartRequired": "Khởi động lại nanobot để áp dụng ứng dụng và tính năng đã cập nhật."
},
"nanobotFeatures": {
"enabled": "Đã bật",
"enable": "Bật",
"disable": "Tắt",
"ready": "Sẵn sàng",
"missingDependency": "Thiếu gói hỗ trợ",
"installSupport": "Cài gói hỗ trợ",
"installConfirmTitle": "Cài hỗ trợ cho {{name}}?",
"installConfirmDescription": "nanobot sẽ thêm những gì {{name}} cần, rồi bật tính năng này. Tiếp tục?",
"installConfirmAction": "Cài và bật",
"websocketRequired": "Bắt buộc cho WebUI",
"channelDisabled": "Kênh đang tắt",
"notEnabled": "Chưa bật"
},
"automations": {
"filters": {
@@ -965,11 +983,11 @@
"mcpDescription": "Dùng @{{name}} như máy chủ MCP"
},
"workspace": {
"accessAria": "Workspace access mode",
"accessAria": "Chế độ truy cập workspace",
"projectAria": "Chọn dự án",
"projectPlaceholder": "Chọn dự án",
"default": "Default Permission",
"full": "Full Access"
"default": "Quyền mặc định",
"full": "Toàn quyền truy cập"
}
},
"scrollToBottom": "Cuộn xuống cuối",
@@ -1053,17 +1071,17 @@
"body": "Máy chủ đã từ chối tin nhắn trước vì vượt quá giới hạn kích thước. Hãy bớt ảnh hoặc chọn tệp nhỏ hơn rồi thử lại."
},
"workspaceScopeRejected": {
"title": "Workspace was not changed",
"body": "Nanobot kept the previous workspace because the requested project or access mode was rejected by the gateway."
"title": "Workspace không thay đổi",
"body": "Gateway đã từ chối dự án hoặc chế độ truy cập được yêu cầu, nên Nanobot giữ workspace trước đó."
}
},
"workspace": {
"dialog": {
"defaultProject": "Default workspace",
"defaultProject": "Workspace mặc định",
"manual": "Dán đường dẫn",
"manualPlaceholder": "/Users/name/project",
"usePath": "Use Path",
"absolutePathRequired": "Enter an absolute folder path on this machine."
"usePath": "Dùng đường dẫn",
"absolutePathRequired": "Nhập đường dẫn thư mục tuyệt đối trên máy này."
}
}
}
+22 -4
View File
@@ -458,18 +458,36 @@
"missingCredential": "启用图片生成前请先配置此提供商。"
},
"apps": {
"description": "添加 nanobot 可在聊天中使用的 App CLI 和 MCP 服务。",
"description": "启用插件、本地应用适配器和已连接的工具服务。",
"cliLabel": "CLI",
"mcpLabel": "MCP",
"channelLabel": "渠道",
"featureLabel": "能力",
"filterAll": "全部",
"filterPlugins": "插件",
"filterCli": "CLI 应用",
"filterMcp": "MCP 服务",
"enabledSummary": "已启用 {{count}} 个",
"caption": "{{cli}} 个 CLI · {{mcp}} 个 MCP",
"caption": "{{plugins}} 个插件 · {{cli}} 个 CLI · {{mcp}} 个 MCP",
"searchPlaceholder": "搜索应用",
"featured": "精选",
"featured": "应用目录",
"loading": "正在加载应用...",
"empty": "没有匹配的应用。"
"empty": "没有匹配的应用。",
"restartRequired": "重启 nanobot 以应用更新后的应用和能力。"
},
"nanobotFeatures": {
"enabled": "已启用",
"enable": "启用",
"disable": "禁用",
"ready": "就绪",
"missingDependency": "缺少支持包",
"installSupport": "安装支持包",
"installConfirmTitle": "安装 {{name}} 支持?",
"installConfirmDescription": "将安装并启用 {{name}} 支持。是否继续?",
"installConfirmAction": "安装并启用",
"websocketRequired": "WebUI 必需",
"channelDisabled": "渠道已禁用",
"notEnabled": "未启用"
},
"automations": {
"filters": {
+22 -4
View File
@@ -458,18 +458,36 @@
"thirdPartyBrands": "產品名稱、標誌與品牌均屬於其各自擁有者。使用僅為識別用途,並不代表背書。"
},
"apps": {
"description": "新增 nanobot 可在聊天中使用的 App CLI 和 MCP 服務。",
"description": "啟用插件、本機應用適配器和已連接的工具服務。",
"cliLabel": "CLI",
"mcpLabel": "MCP",
"channelLabel": "通道",
"featureLabel": "能力",
"filterAll": "全部",
"filterPlugins": "插件",
"filterCli": "CLI 應用",
"filterMcp": "MCP 服務",
"enabledSummary": "已啟用 {{count}} 個",
"caption": "{{cli}} 個 CLI · {{mcp}} 個 MCP",
"caption": "{{plugins}} 個插件 · {{cli}} 個 CLI · {{mcp}} 個 MCP",
"searchPlaceholder": "搜尋應用",
"featured": "精選",
"featured": "應用目錄",
"loading": "正在載入應用...",
"empty": "沒有符合的應用。"
"empty": "沒有符合的應用。",
"restartRequired": "重新啟動 nanobot 以套用更新後的應用和能力。"
},
"nanobotFeatures": {
"enabled": "已啟用",
"enable": "啟用",
"disable": "停用",
"ready": "就緒",
"missingDependency": "缺少支援套件",
"installSupport": "安裝支援套件",
"installConfirmTitle": "安裝 {{name}} 支援?",
"installConfirmDescription": "將安裝並啟用 {{name}} 支援。是否繼續?",
"installConfirmAction": "安裝並啟用",
"websocketRequired": "WebUI 必需",
"channelDisabled": "通道已停用",
"notEnabled": "未啟用"
},
"automations": {
"filters": {