diff --git a/app/src/lib/i18n/ar.ts b/app/src/lib/i18n/ar.ts
index f63c227e1..5e56d3751 100644
--- a/app/src/lib/i18n/ar.ts
+++ b/app/src/lib/i18n/ar.ts
@@ -353,9 +353,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'مثبت',
'skills.explorer.install': 'تثبيت',
'skills.explorer.installing': 'جارٍ التثبيت…',
- 'skills.integrations': 'التطبيقات',
+ 'skills.integrations': 'تكاملات Composio',
'skills.integrationsSubtitle':
- 'اتصالات OAuth السحابية — سجّل الدخول بحسابك وتُدار الرموز بأمان حتى يتمكن الوكلاء من القراءة والتصرف نيابةً عنك. لا حاجة لإدارة مفاتيح API.',
+ 'اتصالات OAuth السحابية — سجّل الدخول بحسابك ويتولى Composio إدارة الرموز حتى يتمكن الوكلاء من القراءة والتصرف نيابةً عنك. لا حاجة لإدارة مفاتيح API.',
'skills.composio.noApiKeyTitle': 'لم يتم إعداد مفتاح Composio API',
'skills.composio.noApiKeyDescription':
'يستخدم الوضع المحلي مفتاح Composio API الخاص بك. افتح الإعدادات ← الخيارات المتقدمة ← Composio لإضافته قبل توصيل التكاملات هنا.',
@@ -4167,7 +4167,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'الويب',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'مدعوم من Composio',
'skills.composio.staleStatusTitle': 'تظهر الاتصالات حالة قديمة',
'skills.create.allowedTools': 'الأدوات المسموح بها',
'skills.create.allowedToolsHelp': 'تم عرضها في المادة الأمامية SKILL.md كـ',
diff --git a/app/src/lib/i18n/bn.ts b/app/src/lib/i18n/bn.ts
index 433dcd3bb..1a9df1da5 100644
--- a/app/src/lib/i18n/bn.ts
+++ b/app/src/lib/i18n/bn.ts
@@ -358,9 +358,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'ইনস্টল করা হয়েছে',
'skills.explorer.install': 'ইনস্টল করুন',
'skills.explorer.installing': 'ইনস্টল হচ্ছে…',
- 'skills.integrations': 'অ্যাপস',
+ 'skills.integrations': 'Composio ইন্টিগ্রেশন',
'skills.integrationsSubtitle':
- 'ক্লাউড-ভিত্তিক OAuth সংযোগ — আপনার অ্যাকাউন্ট দিয়ে সাইন ইন করুন এবং টোকেন নিরাপদে পরিচালিত হয় যাতে এজেন্টরা আপনার পক্ষে পড়তে এবং কাজ করতে পারে। কোনো API কী পরিচালনা করতে হবে না।',
+ 'ক্লাউড-ভিত্তিক OAuth সংযোগ — আপনার অ্যাকাউন্ট দিয়ে সাইন ইন করুন এবং Composio টোকেন পরিচালনা করে যাতে এজেন্টরা আপনার পক্ষে পড়তে এবং কাজ করতে পারে। কোনো API কী পরিচালনা করতে হবে না।',
'skills.composio.noApiKeyTitle': 'কোনো Composio API Key কনফিগার করা নেই',
'skills.composio.noApiKeyDescription':
'লোকাল মোডে আপনার নিজের Composio API key ব্যবহার হয়। এখানে ইন্টিগ্রেশন যুক্ত করার আগে Settings → Advanced → Composio খুলে একটি key যোগ করুন।',
@@ -4251,7 +4251,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'ওয়েব',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Composio দ্বারা চালিত',
'skills.composio.staleStatusTitle': 'সংযোগগুলি পুরানো অবস্থা দেখাচ্ছে',
'skills.create.allowedTools': 'অনুমোদিত টুল',
'skills.create.allowedToolsHelp': 'হিসাবে SKILL.md ফ্রন্টম্যাটারে রেন্ডার করা হয়েছে',
diff --git a/app/src/lib/i18n/de.ts b/app/src/lib/i18n/de.ts
index 7cc6f7d1d..332857dc2 100644
--- a/app/src/lib/i18n/de.ts
+++ b/app/src/lib/i18n/de.ts
@@ -369,9 +369,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'Installiert',
'skills.explorer.install': 'Installieren',
'skills.explorer.installing': 'Wird installiert…',
- 'skills.integrations': 'Apps',
+ 'skills.integrations': 'Composio-Integrationen',
'skills.integrationsSubtitle':
- 'Cloud-basierte OAuth-Verbindungen – mit deinem Konto anmelden und Tokens werden sicher verwaltet, damit Agenten in deinem Namen lesen und handeln können. Keine API-Schlüssel notwendig.',
+ 'Cloud-basierte OAuth-Verbindungen – mit deinem Konto anmelden und Composio verwaltet die Tokens, damit Agenten in deinem Namen lesen und handeln können. Keine API-Schlüssel notwendig.',
'skills.composio.noApiKeyTitle': 'Kein Composio-API-Schlüssel konfiguriert',
'skills.composio.noApiKeyDescription':
'Im lokalen Modus wird dein eigener Composio-API-Schlüssel verwendet. Öffne Einstellungen → Erweitert → Composio, um einen Schlüssel hinzuzufügen, bevor du hier Integrationen verbindest.',
@@ -4364,7 +4364,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'Web',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Unterstützt von Composio',
'skills.composio.staleStatusTitle': 'Verbindungen zeigen den veralteten Status an',
'skills.create.allowedTools': 'Erlaubte Werkzeuge',
'skills.create.allowedToolsHelp': 'Im SKILL.md-Frontmatter gerendert als',
diff --git a/app/src/lib/i18n/en.ts b/app/src/lib/i18n/en.ts
index 278b4327c..7f8eb171c 100644
--- a/app/src/lib/i18n/en.ts
+++ b/app/src/lib/i18n/en.ts
@@ -397,9 +397,9 @@ const en: TranslationMap = {
'skills.explorer.installed': 'Installed',
'skills.explorer.install': 'Install',
'skills.explorer.installing': 'Installing…',
- 'skills.integrations': 'Apps',
+ 'skills.integrations': 'Composio Integrations',
'skills.integrationsSubtitle':
- 'Cloud-based OAuth connections — sign in with your account and tokens are brokered securely so agents can read and act on your behalf. No API keys to manage.',
+ 'Cloud-based OAuth connections — sign in with your account and Composio brokers the tokens so agents can read and act on your behalf. No API keys to manage.',
'skills.composio.noApiKeyTitle': 'No Composio API Key Configured',
'skills.composio.noApiKeyDescription':
'Local mode uses your own Composio API key. Open Settings → Advanced → Composio to add one before connecting integrations here.',
@@ -4796,7 +4796,7 @@ const en: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'Web',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Powered by Composio',
'skills.composio.staleStatusTitle': 'Connections are showing stale status',
'skills.create.allowedTools': 'Allowed tools',
'skills.create.allowedToolsHelp': 'Rendered into the SKILL.md frontmatter as',
diff --git a/app/src/lib/i18n/es.ts b/app/src/lib/i18n/es.ts
index d0b15be25..9f850d1c4 100644
--- a/app/src/lib/i18n/es.ts
+++ b/app/src/lib/i18n/es.ts
@@ -370,9 +370,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'Instalada',
'skills.explorer.install': 'Instalar',
'skills.explorer.installing': 'Instalando…',
- 'skills.integrations': 'Aplicaciones',
+ 'skills.integrations': 'Integraciones de Composio',
'skills.integrationsSubtitle':
- 'Conexiones OAuth en la nube: inicia sesión con tu cuenta y los tokens se gestionan de forma segura para que los agentes puedan leer y actuar en tu nombre. Sin claves de API que administrar.',
+ 'Conexiones OAuth en la nube: inicia sesión con tu cuenta y Composio gestiona los tokens para que los agentes puedan leer y actuar en tu nombre. Sin claves de API que administrar.',
'skills.composio.noApiKeyTitle': 'No hay una API key de Composio configurada',
'skills.composio.noApiKeyDescription':
'El modo local usa tu propia API key de Composio. Abre Ajustes → Avanzado → Composio para añadir una antes de conectar integraciones aquí.',
@@ -4336,7 +4336,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'Web',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Desarrollado por Composio',
'skills.composio.staleStatusTitle': 'Las conexiones muestran un estado obsoleto',
'skills.create.allowedTools': 'Herramientas permitidas',
'skills.create.allowedToolsHelp': 'Representado en el frontmatter de SKILL.md como',
diff --git a/app/src/lib/i18n/fr.ts b/app/src/lib/i18n/fr.ts
index a7e0a088e..a1f088e86 100644
--- a/app/src/lib/i18n/fr.ts
+++ b/app/src/lib/i18n/fr.ts
@@ -369,9 +369,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'Installée',
'skills.explorer.install': 'Installer',
'skills.explorer.installing': 'Installation…',
- 'skills.integrations': 'Applications',
+ 'skills.integrations': 'Intégrations Composio',
'skills.integrationsSubtitle':
- 'Connexions OAuth cloud — connectez-vous avec votre compte et les jetons sont gérés en toute sécurité pour que les agents puissent lire et agir en votre nom. Aucune clé API à gérer.',
+ 'Connexions OAuth cloud — connectez-vous avec votre compte et Composio gère les jetons pour que les agents puissent lire et agir en votre nom. Aucune clé API à gérer.',
'skills.composio.noApiKeyTitle': 'Aucune clé API Composio configurée',
'skills.composio.noApiKeyDescription':
'Le mode local utilise votre propre clé API Composio. Ouvrez Paramètres → Avancé → Composio pour en ajouter une avant de connecter des intégrations ici.',
@@ -4354,7 +4354,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'Web',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Propulsé par Composio',
'skills.composio.staleStatusTitle': 'Les connexions affichent un état obsolète',
'skills.create.allowedTools': 'Outils autorisés',
'skills.create.allowedToolsHelp': 'Rendu dans le frontmatter SKILL.md comme',
diff --git a/app/src/lib/i18n/hi.ts b/app/src/lib/i18n/hi.ts
index 3ffa949a4..a9718dade 100644
--- a/app/src/lib/i18n/hi.ts
+++ b/app/src/lib/i18n/hi.ts
@@ -357,9 +357,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'इंस्टॉल किया गया',
'skills.explorer.install': 'इंस्टॉल करें',
'skills.explorer.installing': 'इंस्टॉल हो रहा है…',
- 'skills.integrations': 'ऐप्स',
+ 'skills.integrations': 'Composio इंटीग्रेशन',
'skills.integrationsSubtitle':
- 'क्लाउड-आधारित OAuth कनेक्शन — अपने अकाउंट से साइन इन करें और टोकन सुरक्षित रूप से प्रबंधित होते हैं ताकि एजेंट आपकी ओर से पढ़ और कार्य कर सकें। कोई API कुंजी प्रबंधित नहीं करनी।',
+ 'क्लाउड-आधारित OAuth कनेक्शन — अपने अकाउंट से साइन इन करें और Composio टोकन ब्रोकर करता है ताकि एजेंट आपकी ओर से पढ़ और कार्य कर सकें। कोई API कुंजी प्रबंधित नहीं करनी।',
'skills.composio.noApiKeyTitle': 'कोई Composio API key कॉन्फ़िगर नहीं है',
'skills.composio.noApiKeyDescription':
'लोकल मोड आपकी अपनी Composio API key का उपयोग करता है। यहाँ integrations जोड़ने से पहले Settings → Advanced → Composio खोलकर key जोड़ें।',
@@ -4256,7 +4256,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'वेब',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Composio द्वारा संचालित',
'skills.composio.staleStatusTitle': 'कनेक्शन पुरानी स्थिति दिखा रहे हैं',
'skills.create.allowedTools': 'अनुमत टूल्स',
'skills.create.allowedToolsHelp': 'SKILL.md फ्रंटमैटर में प्रस्तुत किया गया',
diff --git a/app/src/lib/i18n/id.ts b/app/src/lib/i18n/id.ts
index 7c88baf81..9fb65bd72 100644
--- a/app/src/lib/i18n/id.ts
+++ b/app/src/lib/i18n/id.ts
@@ -361,9 +361,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'Terpasang',
'skills.explorer.install': 'Pasang',
'skills.explorer.installing': 'Memasang…',
- 'skills.integrations': 'Aplikasi',
+ 'skills.integrations': 'Integrasi Composio',
'skills.integrationsSubtitle':
- 'Koneksi OAuth berbasis cloud — masuk dengan akun Anda dan token dikelola dengan aman agar agen dapat membaca dan bertindak atas nama Anda. Tidak perlu mengelola API key.',
+ 'Koneksi OAuth berbasis cloud — masuk dengan akun Anda dan Composio mengelola token agar agen dapat membaca dan bertindak atas nama Anda. Tidak perlu mengelola API key.',
'skills.composio.noApiKeyTitle': 'Belum ada API key Composio yang dikonfigurasi',
'skills.composio.noApiKeyDescription':
'Mode lokal menggunakan API key Composio milik Anda sendiri. Buka Pengaturan → Lanjutan → Composio untuk menambahkannya sebelum menghubungkan integrasi di sini.',
@@ -4270,7 +4270,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'Web',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Didukung oleh Composio',
'skills.composio.staleStatusTitle': 'Koneksi menunjukkan status basi',
'skills.create.allowedTools': 'Tool yang diizinkan',
'skills.create.allowedToolsHelp': 'Dirender ke frontmatter SKILL.md sebagai',
diff --git a/app/src/lib/i18n/it.ts b/app/src/lib/i18n/it.ts
index 4505aa6af..b2f2d6b62 100644
--- a/app/src/lib/i18n/it.ts
+++ b/app/src/lib/i18n/it.ts
@@ -365,9 +365,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'Installata',
'skills.explorer.install': 'Installa',
'skills.explorer.installing': 'Installazione…',
- 'skills.integrations': 'App',
+ 'skills.integrations': 'Integrazioni Composio',
'skills.integrationsSubtitle':
- 'Connessioni OAuth basate su cloud — accedi con il tuo account e i token sono gestiti in modo sicuro affinché gli agenti possano leggere e agire per tuo conto. Nessuna chiave API da gestire.',
+ 'Connessioni OAuth basate su cloud — accedi con il tuo account e Composio gestisce i token affinché gli agenti possano leggere e agire per tuo conto. Nessuna chiave API da gestire.',
'skills.composio.noApiKeyTitle': 'Nessuna chiave API Composio configurata',
'skills.composio.noApiKeyDescription':
'La modalità locale usa la tua chiave API Composio. Apri Impostazioni → Avanzate → Composio per aggiungerne una prima di collegare le integrazioni qui.',
@@ -4329,7 +4329,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'Web',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Offerto da Composio',
'skills.composio.staleStatusTitle': 'Le connessioni mostrano uno stato obsoleto',
'skills.create.allowedTools': 'Strumenti consentiti',
'skills.create.allowedToolsHelp': 'Resi nel frontmatter SKILL.md come',
diff --git a/app/src/lib/i18n/ko.ts b/app/src/lib/i18n/ko.ts
index 4b63e0816..61391b856 100644
--- a/app/src/lib/i18n/ko.ts
+++ b/app/src/lib/i18n/ko.ts
@@ -358,9 +358,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': '설치됨',
'skills.explorer.install': '설치',
'skills.explorer.installing': '설치 중…',
- 'skills.integrations': '앱',
+ 'skills.integrations': 'Composio 통합',
'skills.integrationsSubtitle':
- '클라우드 기반 OAuth 연결 — 계정으로 로그인하면 토큰이 안전하게 관리되어 에이전트가 사용자를 대신해 읽고 작동할 수 있습니다. API 키 관리가 필요 없습니다.',
+ '클라우드 기반 OAuth 연결 — 계정으로 로그인하면 Composio가 토큰을 관리하여 에이전트가 사용자를 대신해 읽고 작동할 수 있습니다. API 키 관리가 필요 없습니다.',
'skills.composio.noApiKeyTitle': '아니요 Composio API 키가 구성됨',
'skills.composio.noApiKeyDescription':
'로컬 모드에서는 자체 Composio API 키를 사용합니다. 설정 → 고급 → Composio에서 키를 추가한 후 여기서 통합을 연결하세요.',
@@ -4210,7 +4210,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': '웹',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Composio 제공',
'skills.composio.staleStatusTitle': '연결이 오래된 상태를 표시합니다.',
'skills.create.allowedTools': '허용된 도구',
'skills.create.allowedToolsHelp': 'SKILL.md 앞부분에 다음과 같이 렌더링됩니다.',
diff --git a/app/src/lib/i18n/pl.ts b/app/src/lib/i18n/pl.ts
index 962a60bad..55fce1871 100644
--- a/app/src/lib/i18n/pl.ts
+++ b/app/src/lib/i18n/pl.ts
@@ -363,9 +363,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'Zainstalowano',
'skills.explorer.install': 'Zainstaluj',
'skills.explorer.installing': 'Instalowanie…',
- 'skills.integrations': 'Aplikacje',
+ 'skills.integrations': 'Integracje Composio',
'skills.integrationsSubtitle':
- 'Chmurowe połączenia OAuth — zaloguj się swoim kontem, a tokeny są bezpiecznie zarządzane, dzięki czemu agenci mogą czytać i działać w Twoim imieniu. Bez kluczy API do utrzymywania.',
+ 'Chmurowe połączenia OAuth — zaloguj się swoim kontem, a Composio pośredniczy w tokenach, dzięki czemu agenci mogą czytać i działać w Twoim imieniu. Bez kluczy API do utrzymywania.',
'skills.composio.noApiKeyTitle': 'Brak skonfigurowanego klucza API Composio',
'skills.composio.noApiKeyDescription':
'W trybie lokalnym używany jest Twój własny klucz API Composio. Otwórz Ustawienia → Zaawansowane → Composio, aby dodać klucz, zanim podłączysz tutaj integracje.',
@@ -4323,7 +4323,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'Sieć',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Napędzane przez Composio',
'skills.composio.staleStatusTitle': 'Połączenia pokazują nieaktualny status',
'skills.create.allowedTools': 'Dozwolone narzędzia',
'skills.create.allowedToolsHelp': 'Renderowane do nagłówka frontmatter SKILL.md jako',
diff --git a/app/src/lib/i18n/pt.ts b/app/src/lib/i18n/pt.ts
index f7aa78c03..3f4b345ee 100644
--- a/app/src/lib/i18n/pt.ts
+++ b/app/src/lib/i18n/pt.ts
@@ -369,9 +369,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'Instalada',
'skills.explorer.install': 'Instalar',
'skills.explorer.installing': 'Instalando…',
- 'skills.integrations': 'Aplicativos',
+ 'skills.integrations': 'Integrações do Composio',
'skills.integrationsSubtitle':
- 'Conexões OAuth baseadas em nuvem — faça login com sua conta e os tokens são gerenciados com segurança para que os agentes possam ler e agir em seu nome. Sem chaves de API para gerenciar.',
+ 'Conexões OAuth baseadas em nuvem — faça login com sua conta e o Composio gerencia os tokens para que os agentes possam ler e agir em seu nome. Sem chaves de API para gerenciar.',
'skills.composio.noApiKeyTitle': 'Nenhuma chave de API do Composio configurada',
'skills.composio.noApiKeyDescription':
'O modo local usa sua própria chave de API do Composio. Abra Configurações → Avançado → Composio para adicionar uma antes de conectar integrações aqui.',
@@ -4331,7 +4331,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'Web',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Desenvolvido por Composio',
'skills.composio.staleStatusTitle': 'As conexões estão mostrando status obsoleto',
'skills.create.allowedTools': 'Ferramentas permitidas',
'skills.create.allowedToolsHelp': 'Renderizado no frontmatter SKILL.md como',
diff --git a/app/src/lib/i18n/ru.ts b/app/src/lib/i18n/ru.ts
index 6820cbd18..53adb0511 100644
--- a/app/src/lib/i18n/ru.ts
+++ b/app/src/lib/i18n/ru.ts
@@ -363,9 +363,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': 'Установлено',
'skills.explorer.install': 'Установить',
'skills.explorer.installing': 'Установка…',
- 'skills.integrations': 'Приложения',
+ 'skills.integrations': 'Интеграции Composio',
'skills.integrationsSubtitle':
- 'Облачные OAuth-подключения — войдите в свой аккаунт, и токены управляются безопасно, чтобы агенты могли читать и действовать от вашего имени. Никаких API-ключей для управления.',
+ 'Облачные OAuth-подключения — войдите в свой аккаунт, и Composio управляет токенами, чтобы агенты могли читать и действовать от вашего имени. Никаких API-ключей для управления.',
'skills.composio.noApiKeyTitle': 'Ключ API Composio не настроен',
'skills.composio.noApiKeyDescription':
'Локальный режим использует ваш собственный ключ API Composio. Откройте Настройки → Дополнительно → Composio, чтобы добавить ключ перед подключением интеграций здесь.',
@@ -4295,7 +4295,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': 'Интернет',
'skills.channelIcon.yuanbao': 'Yuanbao',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': 'Работает на Composio',
'skills.composio.staleStatusTitle': 'Соединения показывают устаревший статус',
'skills.create.allowedTools': 'Разрешённые инструменты',
'skills.create.allowedToolsHelp': 'Отображается в SKILL.md как',
diff --git a/app/src/lib/i18n/zh-CN.ts b/app/src/lib/i18n/zh-CN.ts
index 2a3d0bbcf..0f21e5bbf 100644
--- a/app/src/lib/i18n/zh-CN.ts
+++ b/app/src/lib/i18n/zh-CN.ts
@@ -342,9 +342,9 @@ const messages: TranslationMap = {
'skills.explorer.installed': '已安装',
'skills.explorer.install': '安装',
'skills.explorer.installing': '安装中…',
- 'skills.integrations': '应用',
+ 'skills.integrations': 'Composio 集成',
'skills.integrationsSubtitle':
- '基于云端的 OAuth 连接——使用您的账户登录,令牌将被安全管理,让智能体能以您的名义读取数据并执行操作,无需管理 API 密钥。',
+ '基于云端的 OAuth 连接——使用您的账户登录,Composio 代管令牌,让智能体能以您的名义读取数据并执行操作,无需管理 API 密钥。',
'skills.composio.noApiKeyTitle': '尚未配置 Composio API 密钥',
'skills.composio.noApiKeyDescription':
'本地模式使用你自己的 Composio API 密钥。在此连接集成之前,请打开 设置 → 高级 → Composio 添加一个密钥。',
@@ -4043,7 +4043,7 @@ const messages: TranslationMap = {
'skills.channelIcon.telegram': 'Telegram',
'skills.channelIcon.web': '网络',
'skills.channelIcon.yuanbao': '元宝',
- 'skills.composio.poweredBy': 'OAuth',
+ 'skills.composio.poweredBy': '由 Composio 提供支持',
'skills.composio.staleStatusTitle': '连接显示陈旧状态',
'skills.create.allowedTools': '允许的工具',
'skills.create.allowedToolsHelp': '渲染到 SKILL.md frontmatter 中为',
diff --git a/app/src/pages/__tests__/Skills.channels-grid.test.tsx b/app/src/pages/__tests__/Skills.channels-grid.test.tsx
index 11c4b9ab3..912c3d844 100644
--- a/app/src/pages/__tests__/Skills.channels-grid.test.tsx
+++ b/app/src/pages/__tests__/Skills.channels-grid.test.tsx
@@ -152,7 +152,7 @@ describe('Skills page — Channels grid', () => {
fireEvent.click(screen.getByRole('tab', { name: 'Apps' }));
// The Apps tab owns the Integrations category filter.
- const integrationsHeading = screen.getByRole('heading', { name: 'Apps' });
+ const integrationsHeading = screen.getByRole('heading', { name: 'Composio Integrations' });
const integrationsCard = integrationsHeading.closest('.rounded-2xl');
expect(integrationsCard).not.toBeNull();
const filterTabs = within(integrationsCard as HTMLElement)
diff --git a/app/src/pages/__tests__/Skills.composio-catalog.test.tsx b/app/src/pages/__tests__/Skills.composio-catalog.test.tsx
index 37e5d67c2..513f3589f 100644
--- a/app/src/pages/__tests__/Skills.composio-catalog.test.tsx
+++ b/app/src/pages/__tests__/Skills.composio-catalog.test.tsx
@@ -86,7 +86,7 @@ describe('Skills page — Composio catalog fallback', () => {
renderWithProviders(, { initialEntries: ['/connections'] });
openAppsTab();
- expect(screen.getByRole('heading', { name: 'Apps' })).toBeInTheDocument();
+ expect(screen.getByRole('heading', { name: 'Composio Integrations' })).toBeInTheDocument();
expect(screen.getByText('Discord')).toBeInTheDocument();
expect(screen.getByText('Google Calendar')).toBeInTheDocument();
expect(screen.getByText('Google Drive')).toBeInTheDocument();
@@ -103,7 +103,7 @@ describe('Skills page — Composio catalog fallback', () => {
// missing Composio Zoom tile even though the Meeting bots card also
// renders a "Zoom" entry on the same page.
const integrationsSection = screen
- .getByRole('heading', { name: 'Apps' })
+ .getByRole('heading', { name: 'Composio Integrations' })
.closest('.rounded-2xl');
expect(integrationsSection).not.toBeNull();
expect(within(integrationsSection as HTMLElement).getByText('Zoom')).toBeInTheDocument();
@@ -120,7 +120,7 @@ describe('Skills page — Composio catalog fallback', () => {
expect(screen.getByText('Backend unavailable')).toBeInTheDocument();
const integrationsSection = screen
- .getByRole('heading', { name: 'Apps' })
+ .getByRole('heading', { name: 'Composio Integrations' })
.closest('.rounded-2xl');
expect(integrationsSection).not.toBeNull();
const gmailTile = within(integrationsSection as HTMLElement).getByRole('button', {
@@ -143,7 +143,7 @@ describe('Skills page — Composio catalog fallback', () => {
openAppsTab();
const integrationsSection = screen
- .getByRole('heading', { name: 'Apps' })
+ .getByRole('heading', { name: 'Composio Integrations' })
.closest('.rounded-2xl');
expect(integrationsSection).not.toBeNull();
const gmailTile = within(integrationsSection as HTMLElement).getByRole('button', {
@@ -178,7 +178,7 @@ describe('Skills page — Composio catalog fallback', () => {
openAppsTab();
const integrationsSection = screen
- .getByRole('heading', { name: 'Apps' })
+ .getByRole('heading', { name: 'Composio Integrations' })
.closest('.rounded-2xl');
expect(integrationsSection).not.toBeNull();
expect(within(integrationsSection as HTMLElement).getByText('2')).toBeInTheDocument();
@@ -198,7 +198,7 @@ describe('Skills page — Composio catalog fallback', () => {
openAppsTab();
const integrationsSection = screen
- .getByRole('heading', { name: 'Apps' })
+ .getByRole('heading', { name: 'Composio Integrations' })
.closest('.rounded-2xl');
expect(integrationsSection).not.toBeNull();
// No Preview badges anywhere in the integrations grid. The
@@ -222,7 +222,7 @@ describe('Skills page — Composio catalog fallback', () => {
openAppsTab();
const integrationsSection = screen
- .getByRole('heading', { name: 'Apps' })
+ .getByRole('heading', { name: 'Composio Integrations' })
.closest('.rounded-2xl');
expect(integrationsSection).not.toBeNull();
const zohoTile = within(integrationsSection as HTMLElement).getByRole('button', {
diff --git a/app/src/pages/__tests__/Skills.third-party-gmail-sync.test.tsx b/app/src/pages/__tests__/Skills.third-party-gmail-sync.test.tsx
index d2ad119b6..61c20c421 100644
--- a/app/src/pages/__tests__/Skills.third-party-gmail-sync.test.tsx
+++ b/app/src/pages/__tests__/Skills.third-party-gmail-sync.test.tsx
@@ -44,7 +44,7 @@ describe('Skills page — Gmail composio integration', () => {
fireEvent.click(screen.getByRole('tab', { name: 'Apps' }));
const integrationsSection = screen
- .getByRole('heading', { name: 'Apps' })
+ .getByRole('heading', { name: 'Composio Integrations' })
.closest('.rounded-2xl');
expect(integrationsSection).not.toBeNull();
expect(within(integrationsSection as HTMLElement).getByText('Gmail')).toBeInTheDocument();
diff --git a/app/src/pages/__tests__/Skills.third-party-notion-debug-tools.test.tsx b/app/src/pages/__tests__/Skills.third-party-notion-debug-tools.test.tsx
index d96e12c38..5ba2ae814 100644
--- a/app/src/pages/__tests__/Skills.third-party-notion-debug-tools.test.tsx
+++ b/app/src/pages/__tests__/Skills.third-party-notion-debug-tools.test.tsx
@@ -39,7 +39,7 @@ describe('Skills page — Notion composio integration', () => {
renderWithProviders(, { initialEntries: ['/connections'] });
fireEvent.click(screen.getByRole('tab', { name: 'Apps' }));
- expect(screen.getByRole('heading', { name: 'Apps' })).toBeInTheDocument();
+ expect(screen.getByRole('heading', { name: 'Composio Integrations' })).toBeInTheDocument();
const notionTile = screen.getByRole('button', { name: /Notion.*Connect/i });
expect(notionTile).toBeInTheDocument();
diff --git a/app/test/playwright/specs/composio-triggers-flow.spec.ts b/app/test/playwright/specs/composio-triggers-flow.spec.ts
index 7622d9052..dd1480e7e 100644
--- a/app/test/playwright/specs/composio-triggers-flow.spec.ts
+++ b/app/test/playwright/specs/composio-triggers-flow.spec.ts
@@ -84,10 +84,10 @@ async function bootSkillsPage(page: Page, userId: string) {
await dismissWalkthroughIfPresent(page);
// Phase 2: "Composio" tab renamed to "Apps"
await page.getByRole('tab', { name: 'Apps' }).click();
- // Phase 2: heading is now "Apps" (skills.integrations), "Composio Integrations" removed
- await expect(page.getByRole('heading', { name: 'Apps', exact: true })).toBeVisible({
- timeout: 20_000,
- });
+ // Heading reads "Composio Integrations" (skills.integrations); the tab is "Apps"
+ await expect(
+ page.getByRole('heading', { name: 'Composio Integrations', exact: true })
+ ).toBeVisible({ timeout: 20_000 });
}
async function openGmailManageModal(page: Page) {
@@ -186,11 +186,11 @@ test.describe('Composio triggers flow', () => {
await page.reload();
await waitForAppReady(page);
await dismissWalkthroughIfPresent(page);
- // Phase 2: "Composio" tab renamed to "Apps"; heading is now "Apps"
+ // Tab is "Apps"; heading reads "Composio Integrations"
await page.getByRole('tab', { name: 'Apps' }).click();
- await expect(page.getByRole('heading', { name: 'Apps', exact: true })).toBeVisible({
- timeout: 20_000,
- });
+ await expect(
+ page.getByRole('heading', { name: 'Composio Integrations', exact: true })
+ ).toBeVisible({ timeout: 20_000 });
const dialog = await openGmailManageModal(page);
await expect(dialog.getByTestId('trigger-toggles')).toBeVisible();
diff --git a/app/test/playwright/specs/connector-gmail-composio.spec.ts b/app/test/playwright/specs/connector-gmail-composio.spec.ts
index 0d86d8915..e0ce406f1 100644
--- a/app/test/playwright/specs/connector-gmail-composio.spec.ts
+++ b/app/test/playwright/specs/connector-gmail-composio.spec.ts
@@ -77,7 +77,7 @@ async function bootSkillsPage(page: Page, userId: string) {
await dismissWalkthroughIfPresent(page);
// Phase 2: "Composio" tab renamed to "Apps"
await page.getByRole('tab', { name: 'Apps' }).click();
- const heading = page.getByRole('heading', { name: 'Apps', exact: true });
+ const heading = page.getByRole('heading', { name: 'Composio Integrations', exact: true });
if (!(await heading.isVisible().catch(() => false))) {
const connectionsButton = page.getByRole('button', { name: 'Connections' });
if (await connectionsButton.isVisible().catch(() => false)) {
@@ -89,9 +89,9 @@ async function bootSkillsPage(page: Page, userId: string) {
await dismissWalkthroughIfPresent(page);
}
}
- await expect(page.getByRole('heading', { name: 'Apps', exact: true })).toBeVisible({
- timeout: 20_000,
- });
+ await expect(
+ page.getByRole('heading', { name: 'Composio Integrations', exact: true })
+ ).toBeVisible({ timeout: 20_000 });
}
async function reloadSkills(page: Page) {
@@ -100,7 +100,7 @@ async function reloadSkills(page: Page) {
async function ensureComposioSurface(page: Page) {
// Phase 2: /skills → /connections, "Composio" tab renamed to "Apps"
- const heading = page.getByRole('heading', { name: 'Apps', exact: true });
+ const heading = page.getByRole('heading', { name: 'Composio Integrations', exact: true });
for (let attempt = 0; attempt < 3; attempt++) {
await page.evaluate(() => {
window.location.hash = '/connections';
diff --git a/app/test/playwright/specs/connector-session-guard-matrix.spec.ts b/app/test/playwright/specs/connector-session-guard-matrix.spec.ts
index 32c3a50a6..4d7d2dcf2 100644
--- a/app/test/playwright/specs/connector-session-guard-matrix.spec.ts
+++ b/app/test/playwright/specs/connector-session-guard-matrix.spec.ts
@@ -74,9 +74,9 @@ async function bootSkills(page: Page, userId: string): Promise {
await waitForAppReady(page);
await dismissWalkthroughIfPresent(page);
await page.getByRole('tab', { name: 'Apps' }).click();
- await expect(page.getByRole('heading', { name: 'Apps', exact: true })).toBeVisible({
- timeout: 20_000,
- });
+ await expect(
+ page.getByRole('heading', { name: 'Composio Integrations', exact: true })
+ ).toBeVisible({ timeout: 20_000 });
}
async function assertSessionAlive(page: Page): Promise {
diff --git a/app/test/playwright/specs/gmail-flow.spec.ts b/app/test/playwright/specs/gmail-flow.spec.ts
index d37f10ada..d75afb9a0 100644
--- a/app/test/playwright/specs/gmail-flow.spec.ts
+++ b/app/test/playwright/specs/gmail-flow.spec.ts
@@ -70,10 +70,10 @@ async function bootSkillsPage(page: Page, userId: string) {
});
await waitForAppReady(page);
await dismissWalkthroughIfPresent(page);
- // Phase 2: "Composio" tab renamed to "Apps"; heading is now "Apps" (skills.integrations)
+ // Tab is "Apps"; the h2 heading reads "Composio Integrations" (skills.integrations)
await page.getByRole('tab', { name: 'Apps' }).click();
- // Wait for the Apps tab grid to be visible — the h2 heading text is now "Apps"
- const heading = page.getByRole('heading', { name: 'Apps', exact: true });
+ // Wait for the Apps tab grid to be visible — the h2 heading text is "Composio Integrations"
+ const heading = page.getByRole('heading', { name: 'Composio Integrations', exact: true });
await expect(heading).toBeVisible({ timeout: 20_000 });
}
@@ -141,9 +141,11 @@ test.describe('Gmail Integration Flows', () => {
test('execute and disconnect routes do not blank the skills page', async ({ page }) => {
await callCoreRpc('openhuman.composio_execute', { tool: ACTION, arguments: {} });
- // Phase 2: "Composio" tab renamed to "Apps"; heading is now "Apps" (skills.integrations)
+ // Tab is "Apps"; the h2 heading reads "Composio Integrations" (skills.integrations)
await page.getByRole('tab', { name: 'Apps' }).click();
- await expect(page.getByRole('heading', { name: 'Apps', exact: true })).toBeVisible();
+ await expect(
+ page.getByRole('heading', { name: 'Composio Integrations', exact: true })
+ ).toBeVisible();
await callCoreRpc('openhuman.composio_delete_connection', { connection_id: CONNECTION_ID });
const requests = await getRequestLog();
diff --git a/app/test/playwright/specs/skills-registry.spec.ts b/app/test/playwright/specs/skills-registry.spec.ts
index f5409f502..5dfa2f9a5 100644
--- a/app/test/playwright/specs/skills-registry.spec.ts
+++ b/app/test/playwright/specs/skills-registry.spec.ts
@@ -40,8 +40,10 @@ test.describe('Skills registry flow', () => {
await expect(page.getByRole('tab', { name: 'Messaging', exact: true })).toBeVisible();
await expect(page.getByRole('tab', { name: 'Tools', exact: true })).toBeVisible();
await page.getByRole('tab', { name: 'Apps', exact: true }).click();
- // Phase 2: heading is now "Apps" (skills.integrations), "Composio Integrations" removed
- await expect(page.getByRole('heading', { name: 'Apps', exact: true })).toBeVisible();
+ // Heading reads "Composio Integrations" (skills.integrations); the tab is "Apps"
+ await expect(
+ page.getByRole('heading', { name: 'Composio Integrations', exact: true })
+ ).toBeVisible();
await expect(
page.getByText(/Gmail|Notion|Telegram|GitHub|Google Drive/, { exact: false }).first()
).toBeVisible();