feat: finish the ai plugin (B18)

This commit is contained in:
LukeGus committed 2026-09-24 13:43:26 -05:00
1 parent 6b4d1432ab
commit 21937a6b02
193 files changed
+23429 -4244

No files matched your search

-1
View File
@@ -2494,7 +2494,6 @@ export function AppShell({
enableProxmoxStats: false,
enableTmuxMonitor: false,
enableTerminalToolbar: false,
enableAiAssistant: false,
enableSsh: false,
sshPort: 22,
serverTunnels: [],
-2
View File
@@ -139,8 +139,6 @@ export interface UserPreferences {
disableUpdateCheck?: boolean | null;
confirmTabClose?: boolean | null;
hiddenRailTabs?: string | null;
aiAssistantEnabled?: boolean | null;
aiReadOnlyCommands?: boolean | null;
compactHostView?: boolean | null;
statusColorScheme?: string | null;
customThemes?: string | null;
-1
View File
@@ -27,7 +27,6 @@ export function hostToSSHHost(h: Host): SSHHost {
enableTunnel: h.enableTunnel ?? false,
enableFileManager: h.enableFileManager ?? false,
enableTerminalToolbar: h.enableTerminalToolbar ?? true,
enableAiAssistant: h.enableAiAssistant ?? false,
enableWebUi: h.enableWebUi ?? false,
webUiConfig: (h.pluginSettings?.["web-endpoint"]?.webUiConfig as
SSHHost["webUiConfig"] | undefined) ?? { endpoints: [] },
+27
View File
@@ -20,6 +20,7 @@ import type { AxiosInstance } from "axios";
import { authApi, createRemoteOriginApiInstance } from "@/main-axios";
import { getBasePath } from "@/lib/base-path";
import { isElectron } from "@/lib/electron";
import { getDeviceId } from "@/lib/device-id";
import { websocketAuthProtocols } from "@/lib/ws-auth";
import {
buildOriginWsUrl,
@@ -75,6 +76,32 @@ export function createPluginApi(pluginId: string): AxiosInstance {
}) as AxiosInstance;
}
/**
* A raw fetch on this plugin's /plugin-api mount point, for a response the
* caller reads as a stream (server-sent events). axios buffers the whole
* body, so it cannot. Sends the same auth the shared client does.
*/
export function pluginFetch(
pluginId: string,
path: string,
init: RequestInit = {},
): Promise<Response> {
const base = (authApi.defaults.baseURL ?? "").replace(/\/+$/, "");
const headers = new Headers(init.headers);
const deviceId = getDeviceId();
if (deviceId) headers.set("X-Termix-Device-ID", deviceId);
if (isElectron()) {
headers.set("X-Electron-App", "true");
const jwt = localStorage.getItem("jwt");
if (jwt) headers.set("Authorization", `Bearer ${jwt}`);
}
return fetch(`${base}${pluginApiPath(pluginId, path)}`, {
credentials: "include",
...init,
headers,
});
}
const remotePluginApis = new Map<string, AxiosInstance>();
/**
-2
View File
@@ -1041,8 +1041,6 @@
"connectionToolbar": "Connection Toolbar",
"showConnectionToolbar": "Show connection toolbar",
"showConnectionToolbarDesc": "Show the toolbar in this host's SSH, RDP, VNC, and Telnet sessions. You can also hide it temporarily from the toolbar itself.",
"enableAiAssistant": "Enable AI Assistant",
"enableAiAssistantDesc": "Allow the AI assistant to help in this host's terminal. Off by default, and still needs AI enabled for your account.",
"proxmoxLastSyncStatus": {
"success": "Success"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Verbindingsnutsbalk",
"showConnectionToolbar": "Wys verbindingsbalk",
"showConnectionToolbarDesc": "Wys die nutsbalk in hierdie gasheer se SSH-, RDP-, VNC- en Telnet-sessies. Jy kan dit ook tydelik van die nutsbalk self versteek.",
"enableAiAssistant": "Aktiveer KI-assistent",
"enableAiAssistantDesc": "Laat die KI-assistent toe om in hierdie gasheer se terminaal te help. Standaard afgeskakel, en KI moet steeds vir jou rekening geaktiveer word.",
"proxmoxLastSyncStatus": {
"success": "Sukses"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "شريط أدوات الاتصال",
"showConnectionToolbar": "إظهار شريط أدوات الاتصال",
"showConnectionToolbarDesc": "يمكنك إظهار شريط الأدوات في جلسات SSH وRDP وVNC وTelnet الخاصة بهذا المضيف. كما يمكنك إخفاؤه مؤقتًا من شريط الأدوات نفسه.",
"enableAiAssistant": "تفعيل مساعد الذكاء الاصطناعي",
"enableAiAssistantDesc": "اسمح للمساعد الذكي بالمساعدة في طرفية هذا المضيف. هذه الميزة معطلة افتراضيًا، ولا يزال يتعين تفعيلها لحسابك.",
"proxmoxLastSyncStatus": {
"success": "نجاح"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Инструменти за свързване",
"showConnectionToolbar": "Показване на лентата с инструменти за връзки",
"showConnectionToolbarDesc": "Показване на лентата с инструменти в SSH, RDP, VNC и Telnet сесиите на този хост. Можете също така временно да я скриете от самата лента с инструменти.",
"enableAiAssistant": "Активиране на AI асистент",
"enableAiAssistantDesc": "Разрешете на AI асистента да помага в терминала на този хост. Изключено по подразбиране и все още изисква AI да е активиран за вашия акаунт.",
"proxmoxLastSyncStatus": {
"success": "Успех"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "সংযোগ টুলবার",
"showConnectionToolbar": "সংযোগ টুলবার দেখান",
"showConnectionToolbarDesc": "এই হোস্টের SSH, RDP, VNC, এবং Telnet সেশনগুলিতে টুলবারটি দেখান। আপনি টুলবারটি থেকেই এটিকে সাময়িকভাবে লুকাতেও পারেন।",
"enableAiAssistant": "এআই অ্যাসিস্ট্যান্ট সক্রিয় করুন",
"enableAiAssistantDesc": "এই হোস্টের টার্মিনালে সাহায্য করার জন্য এআই অ্যাসিস্ট্যান্টকে অনুমতি দিন। এটি ডিফল্টরূপে বন্ধ থাকে এবং আপনার অ্যাকাউন্টের জন্য এআই চালু করা প্রয়োজন।",
"proxmoxLastSyncStatus": {
"success": "সাফল্য"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Barra d'eines de connexió",
"showConnectionToolbar": "Mostra la barra d'eines de connexió",
"showConnectionToolbarDesc": "Mostra la barra d'eines a les sessions SSH, RDP, VNC i Telnet d'aquest amfitrió. També la pots ocultar temporalment des de la barra d'eines.",
"enableAiAssistant": "Activa l'Assistent d'IA",
"enableAiAssistantDesc": "Permet que l'assistent d'IA ajudi al terminal d'aquest amfitrió. Desactivat per defecte, però encara cal que la IA estigui activada per al teu compte.",
"proxmoxLastSyncStatus": {
"success": "Èxit"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Panel nástrojů pro připojení",
"showConnectionToolbar": "Zobrazit panel nástrojů pro připojení",
"showConnectionToolbarDesc": "Zobrazit panel nástrojů v relacích SSH, RDP, VNC a Telnet tohoto hostitele. Můžete jej také dočasně skrýt přímo v panelu nástrojů.",
"enableAiAssistant": "Povolit asistenta s umělou inteligencí",
"enableAiAssistantDesc": "Povolit asistentovi s umělou inteligencí pomáhat v terminálu tohoto hostitele. Ve výchozím nastavení vypnuto, ale stále vyžaduje, aby byla pro váš účet povolena umělá inteligence.",
"proxmoxLastSyncStatus": {
"success": "Úspěch"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Forbindelsesværktøjslinje",
"showConnectionToolbar": "Vis forbindelsesværktøjslinjen",
"showConnectionToolbarDesc": "Vis værktøjslinjen i denne værts SSH-, RDP-, VNC- og Telnet-sessioner. Du kan også skjule den midlertidigt fra selve værktøjslinjen.",
"enableAiAssistant": "Aktivér AI-assistent",
"enableAiAssistantDesc": "Tillad AI-assistenten at hjælpe i denne værts terminal. Deaktiveret som standard, og kræver stadig, at AI er aktiveret for din konto.",
"proxmoxLastSyncStatus": {
"success": "Succes"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Verbindungssymbolleiste",
"showConnectionToolbar": "Verbindungssymbolleiste anzeigen",
"showConnectionToolbarDesc": "Die Symbolleiste wird in den SSH-, RDP-, VNC- und Telnet-Sitzungen dieses Hosts angezeigt. Sie kann auch vorübergehend in der Symbolleiste selbst ausgeblendet werden.",
"enableAiAssistant": "KI-Assistent aktivieren",
"enableAiAssistantDesc": "Erlauben Sie dem KI-Assistenten, im Terminal dieses Hosts Hilfe zu leisten. Standardmäßig deaktiviert; die KI muss weiterhin für Ihr Konto aktiviert sein.",
"proxmoxLastSyncStatus": {
"success": "Erfolg"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Γραμμή εργαλείων σύνδεσης",
"showConnectionToolbar": "Εμφάνιση γραμμής εργαλείων σύνδεσης",
"showConnectionToolbarDesc": "Εμφάνιση της γραμμής εργαλείων στις συνεδρίες SSH, RDP, VNC και Telnet αυτού του κεντρικού υπολογιστή. Μπορείτε επίσης να την αποκρύψετε προσωρινά από την ίδια τη γραμμή εργαλείων.",
"enableAiAssistant": "Ενεργοποίηση Βοηθού Τεχνητής Νοημοσύνης",
"enableAiAssistantDesc": "Επιτρέψτε στον βοηθό τεχνητής νοημοσύνης να βοηθά στο τερματικό αυτού του κεντρικού υπολογιστή. Απενεργοποιημένο από προεπιλογή και εξακολουθεί να χρειάζεται ενεργοποιημένη την τεχνητή νοημοσύνη για τον λογαριασμό σας.",
"proxmoxLastSyncStatus": {
"success": "Επιτυχία"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Barra de herramientas de conexión",
"showConnectionToolbar": "Mostrar barra de herramientas de conexión",
"showConnectionToolbarDesc": "Muestra la barra de herramientas en las sesiones SSH, RDP, VNC y Telnet de este host. También puedes ocultarla temporalmente desde la propia barra de herramientas.",
"enableAiAssistant": "Habilitar el asistente de IA",
"enableAiAssistantDesc": "Permite que el asistente de IA te ayude en la terminal de este host. Está desactivado por defecto y aún así necesitas tener la IA habilitada para tu cuenta.",
"proxmoxLastSyncStatus": {
"success": "Correcto"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Yhteystyökalurivi",
"showConnectionToolbar": "Näytä yhteystyökalurivi",
"showConnectionToolbarDesc": "Näytä työkalupalkki tämän isännän SSH-, RDP-, VNC- ja Telnet-istunnoissa. Voit myös piilottaa sen tilapäisesti itse työkalupalkista.",
"enableAiAssistant": "Ota tekoälyavustaja käyttöön",
"enableAiAssistantDesc": "Salli tekoälyavustaja auttaa tämän isännän terminaalissa. Oletusarvoisesti pois päältä, mutta tekoälyn on silti oltava käytössä tililläsi.",
"proxmoxLastSyncStatus": {
"success": "Menestys"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Barre d'outils de connexion",
"showConnectionToolbar": "Afficher la barre d'outils de connexion",
"showConnectionToolbarDesc": "Afficher la barre d'outils dans les sessions SSH, RDP, VNC et Telnet de cet hôte. Vous pouvez également la masquer temporairement depuis la barre d'outils elle-même.",
"enableAiAssistant": "Activer l'assistant IA",
"enableAiAssistantDesc": "Autoriser l'assistant IA à vous aider dans le terminal de cet hôte. Désactivé par défaut ; l'IA doit être activée pour votre compte.",
"proxmoxLastSyncStatus": {
"success": "Succès"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "סרגל הכלים לחיבור",
"showConnectionToolbar": "הצג סרגל הכלים של החיבור",
"showConnectionToolbarDesc": "הצג את סרגל הכלים בהפעלות SSH, RDP, VNC ו-Telnet של מחשב מארח זה. ניתן גם להסתיר אותו באופן זמני מסרגל הכלים עצמו.",
"enableAiAssistant": "הפעל את עוזר הבינה המלאכותית",
"enableAiAssistantDesc": "אפשר לעוזר הבינה המלאכותית לסייע במסוף של מארח זה. כבוי כברירת מחדל, ועדיין נדרשת הפעלת בינה מלאכותית עבור חשבונך.",
"proxmoxLastSyncStatus": {
"success": "הַצלָחָה"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "कनेक्शन टूलबार",
"showConnectionToolbar": "कनेक्शन टूलबार दिखाएँ",
"showConnectionToolbarDesc": "इस होस्ट के SSH, RDP, VNC और Telnet सेशन में टूलबार दिखाएँ। आप इसे टूलबार से अस्थायी रूप से छिपा भी सकते हैं।",
"enableAiAssistant": "एआई असिस्टेंट को सक्षम करें",
"enableAiAssistantDesc": "इस होस्ट के टर्मिनल में एआई सहायक को मदद करने की अनुमति दें। यह डिफ़ॉल्ट रूप से बंद है, लेकिन आपके खाते के लिए एआई को सक्षम करना आवश्यक है।",
"proxmoxLastSyncStatus": {
"success": "सफलता"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Kapcsolat eszköztár",
"showConnectionToolbar": "Kapcsolat eszköztár megjelenítése",
"showConnectionToolbarDesc": "Eszköztár megjelenítése a gazdagép SSH, RDP, VNC és Telnet munkameneteiben. Ideiglenesen el is rejtheti magáról az eszköztárról.",
"enableAiAssistant": "AI asszisztens engedélyezése",
"enableAiAssistantDesc": "Engedélyezi a mesterséges intelligencia asszisztensének a gazdagép terminálján való segítséget. Alapértelmezés szerint ki van kapcsolva, de továbbra is engedélyeznie kell a mesterséges intelligenciát a fiókjában.",
"proxmoxLastSyncStatus": {
"success": "Siker"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Toolbar Koneksi",
"showConnectionToolbar": "Tampilkan bilah alat koneksi",
"showConnectionToolbarDesc": "Tampilkan toolbar di sesi SSH, RDP, VNC, dan Telnet host ini. Anda juga dapat menyembunyikannya sementara dari toolbar itu sendiri.",
"enableAiAssistant": "Aktifkan Asisten AI",
"enableAiAssistantDesc": "Izinkan asisten AI untuk membantu di terminal host ini. Secara default dinonaktifkan, dan AI tetap perlu diaktifkan untuk akun Anda.",
"proxmoxLastSyncStatus": {
"success": "Kesuksesan"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Barra degli strumenti di connessione",
"showConnectionToolbar": "Mostra la barra degli strumenti di connessione",
"showConnectionToolbarDesc": "Mostra la barra degli strumenti nelle sessioni SSH, RDP, VNC e Telnet di questo host. Puoi anche nasconderla temporaneamente dalla barra degli strumenti stessa.",
"enableAiAssistant": "Assistente AI per l'innovazione",
"enableAiAssistantDesc": "Consenti all'assistente IA di fornire assistenza nel terminale di questo host. Disattivato per impostazione predefinita, ma è necessario abilitare l'IA per il tuo account.",
"proxmoxLastSyncStatus": {
"success": "Riuscita"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "接続ツールバー",
"showConnectionToolbar": "接続ツールバーを表示する",
"showConnectionToolbarDesc": "このホストのSSH、RDP、VNC、およびTelnetセッションでツールバーを表示します。ツールバー自体から一時的に非表示にすることもできます。",
"enableAiAssistant": "AIアシスタントを有効にする",
"enableAiAssistantDesc": "このホストのターミナルでAIアシスタントによる支援を許可します。デフォルトでは無効になっており、アカウントでAIを有効にする必要があります。",
"proxmoxLastSyncStatus": {
"success": "成功"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "연결 도구 모음",
"showConnectionToolbar": "연결 도구 모음 표시",
"showConnectionToolbarDesc": "이 호스트의 SSH, RDP, VNC 및 Telnet 세션에 툴바를 표시합니다. 툴바 자체에서 툴바를 일시적으로 숨길 수도 있습니다.",
"enableAiAssistant": "AI 어시스턴트 활성화",
"enableAiAssistantDesc": "이 호스트의 터미널에서 AI 도우미의 도움을 받을 수 있도록 허용합니다. 기본적으로 비활성화되어 있으며, 계정에 AI 기능이 활성화되어 있어야 합니다.",
"proxmoxLastSyncStatus": {
"success": "성공"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Verbindingswerkbalk",
"showConnectionToolbar": "Verbindingswerkbalk weergeven",
"showConnectionToolbarDesc": "Toon de werkbalk in de SSH-, RDP-, VNC- en Telnet-sessies van deze host. Je kunt de werkbalk ook tijdelijk verbergen via de werkbalk zelf.",
"enableAiAssistant": "AI-assistent inschakelen",
"enableAiAssistantDesc": "Sta de AI-assistent toe om te helpen in de terminal van deze host. Standaard uitgeschakeld, maar AI moet nog steeds voor uw account zijn ingeschakeld.",
"proxmoxLastSyncStatus": {
"success": "Succes"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Tilkoblingsverktøylinje",
"showConnectionToolbar": "Vis tilkoblingsverktøylinjen",
"showConnectionToolbarDesc": "Vis verktøylinjen i denne vertens SSH-, RDP-, VNC- og Telnet-økter. Du kan også skjule den midlertidig fra selve verktøylinjen.",
"enableAiAssistant": "Aktiver AI-assistent",
"enableAiAssistantDesc": "Tillat at AI-assistenten hjelper til i denne vertens terminal. Av som standard, og krever fortsatt at AI er aktivert for kontoen din.",
"proxmoxLastSyncStatus": {
"success": "Suksess"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Pasek narzędzi połączenia",
"showConnectionToolbar": "Pokaż pasek narzędzi połączenia",
"showConnectionToolbarDesc": "Pokaż pasek narzędzi w sesjach SSH, RDP, VNC i Telnet tego hosta. Możesz go również tymczasowo ukryć na samym pasku narzędzi.",
"enableAiAssistant": "Włącz asystenta AI",
"enableAiAssistantDesc": "Zezwól asystentowi AI na pomoc w terminalu tego hosta. Domyślnie wyłączone, ale nadal wymaga włączenia AI na Twoim koncie.",
"proxmoxLastSyncStatus": {
"success": "Powodzenie"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Barra de ferramentas de conexão",
"showConnectionToolbar": "Mostrar barra de ferramentas de conexão",
"showConnectionToolbarDesc": "Exiba a barra de ferramentas nas sessões SSH, RDP, VNC e Telnet deste host. Você também pode ocultá-la temporariamente na própria barra de ferramentas.",
"enableAiAssistant": "Ativar o assistente de IA",
"enableAiAssistantDesc": "Permita que o assistente de IA ajude no terminal deste host. Desativado por padrão, mas ainda precisa que a IA esteja ativada para sua conta.",
"proxmoxLastSyncStatus": {
"success": "Sucesso"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Barra de ferramentas de ligação",
"showConnectionToolbar": "Mostrar barra de ferramentas de ligação",
"showConnectionToolbarDesc": "Apresente a barra de ferramentas nas sessões SSH, RDP, VNC e Telnet deste host. Também pode ocultá-la temporariamente na própria barra de ferramentas.",
"enableAiAssistant": "Ativar o assistente de IA",
"enableAiAssistantDesc": "Permita que o assistente de IA ajude no terminal deste host. Desativado por defeito, mas ainda precisa que a IA esteja ativada para a sua conta.",
"proxmoxLastSyncStatus": {
"success": "Sucesso"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Bara de instrumente Conexiune",
"showConnectionToolbar": "Afișează bara de instrumente pentru conexiuni",
"showConnectionToolbarDesc": "Afișează bara de instrumente în sesiunile SSH, RDP, VNC și Telnet ale acestei gazde. De asemenea, o poți ascunde temporar din bara de instrumente.",
"enableAiAssistant": "Activează Asistentul AI",
"enableAiAssistantDesc": "Permiteți asistentului AI să vă ajute în terminalul acestei gazde. Dezactivat în mod implicit, dar este nevoie ca AI să fie activat pentru contul dvs.",
"proxmoxLastSyncStatus": {
"success": "Succes"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Панель инструментов подключения",
"showConnectionToolbar": "Показать панель инструментов подключения",
"showConnectionToolbarDesc": "Отображать панель инструментов в сеансах SSH, RDP, VNC и Telnet этого хоста. Также можно временно скрыть её с самой панели инструментов.",
"enableAiAssistant": "Включить ИИ-помощника",
"enableAiAssistantDesc": "Разрешите помощнику с искусственным интеллектом помогать на терминале этого хоста. По умолчанию отключено, но для вашей учетной записи ИИ все равно должен быть включен.",
"proxmoxLastSyncStatus": {
"success": "Успешно"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Трака са алаткама за повезивање",
"showConnectionToolbar": "Прикажи траку са алаткама за повезивање",
"showConnectionToolbarDesc": "Прикажи траку са алаткама у SSH, RDP, VNC и Telnet сесијама овог хоста. Такође је можете привремено сакрити са саме траке са алаткама.",
"enableAiAssistant": "Омогући AI асистент",
"enableAiAssistantDesc": "Дозволите вештачкој интелигенцији да помогне у терминалу овог хоста. Искључено је подразумевано, а и даље је потребно да вештачка интелигенција буде омогућена за ваш налог.",
"proxmoxLastSyncStatus": {
"success": "Успех"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Anslutningsverktygsfält",
"showConnectionToolbar": "Visa anslutningsverktygsfältet",
"showConnectionToolbarDesc": "Visa verktygsfältet i den här värdens SSH-, RDP-, VNC- och Telnet-sessioner. Du kan också dölja det tillfälligt från själva verktygsfältet.",
"enableAiAssistant": "Aktivera AI-assistenten",
"enableAiAssistantDesc": "Tillåt AI-assistenten att hjälpa till i den här värdens terminal. Av som standard och kräver fortfarande att AI är aktiverat för ditt konto.",
"proxmoxLastSyncStatus": {
"success": "Framgång"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "แถบเครื่องมือการเชื่อมต่อ",
"showConnectionToolbar": "แสดงแถบเครื่องมือการเชื่อมต่อ",
"showConnectionToolbarDesc": "แสดงแถบเครื่องมือในเซสชัน SSH, RDP, VNC และ Telnet ของโฮสต์นี้ คุณยังสามารถซ่อนแถบเครื่องมือชั่วคราวได้จากแถบเครื่องมือโดยตรง",
"enableAiAssistant": "เปิดใช้งานผู้ช่วย AI",
"enableAiAssistantDesc": "อนุญาตให้ผู้ช่วย AI ช่วยเหลือในเทอร์มินัลของโฮสต์นี้ โดยค่าเริ่มต้นจะปิดอยู่ และยังคงต้องเปิดใช้งาน AI สำหรับบัญชีของคุณก่อน",
"proxmoxLastSyncStatus": {
"success": "ความสำเร็จ"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Bağlantı Araç Çubuğu",
"showConnectionToolbar": "Bağlantı araç çubuğunu göster",
"showConnectionToolbarDesc": "Bu sunucunun SSH, RDP, VNC ve Telnet oturumlarında araç çubuğunu gösterin. Ayrıca, araç çubuğundan geçici olarak gizleyebilirsiniz.",
"enableAiAssistant": "Yapay Zeka Asistanını Etkinleştir",
"enableAiAssistantDesc": "Bu sunucunun terminalinde yapay zeka asistanının yardımcı olmasına izin verin. Varsayılan olarak kapalıdır ve hesabınız için yapay zekanın etkinleştirilmiş olması gerekir.",
"proxmoxLastSyncStatus": {
"success": "Başarılı"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Панель інструментів з’єднання",
"showConnectionToolbar": "Показати панель інструментів з’єднань",
"showConnectionToolbarDesc": "Показувати панель інструментів у сеансах SSH, RDP, VNC та Telnet цього хоста. Ви також можете тимчасово приховати її з самої панелі інструментів.",
"enableAiAssistant": "Увімкнути помічника зі штучним інтелектом",
"enableAiAssistantDesc": "Дозволити помічнику зі штучним інтелектом допомагати в терміналі цього хоста. Вимкнено за замовчуванням, але все одно потребує ввімкнення штучного інтелекту для вашого облікового запису.",
"proxmoxLastSyncStatus": {
"success": "Успіх"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "Thanh công cụ kết nối",
"showConnectionToolbar": "Hiển thị thanh công cụ kết nối",
"showConnectionToolbarDesc": "Hiển thị thanh công cụ trong các phiên SSH, RDP, VNC và Telnet của máy chủ này. Bạn cũng có thể tạm thời ẩn nó từ chính thanh công cụ.",
"enableAiAssistant": "Kích hoạt Trợ lý AI",
"enableAiAssistantDesc": "Cho phép trợ lý AI hỗ trợ trong thiết bị đầu cuối của máy chủ này. Mặc định là tắt, nhưng bạn vẫn cần bật AI cho tài khoản của mình.",
"proxmoxLastSyncStatus": {
"success": "Thành công"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "连接工具栏",
"showConnectionToolbar": "显示连接工具栏",
"showConnectionToolbarDesc": "在主机的 SSH、RDP、VNC 和 Telnet 会话中显示工具栏。您也可以暂时将其从工具栏本身隐藏。",
"enableAiAssistant": "启用人工智能助手",
"enableAiAssistantDesc": "允许 AI 助手在此主机的终端上提供帮助。默认情况下处于关闭状态,但仍需在您的帐户中启用 AI 功能。",
"proxmoxLastSyncStatus": {
"success": "成功"
},
-2
View File
@@ -1046,8 +1046,6 @@
"connectionToolbar": "連接工具列",
"showConnectionToolbar": "顯示連接工具列",
"showConnectionToolbarDesc": "在主機的 SSH、RDP、VNC 和 Telnet 會話中顯示工具列。您也可以暫時將其從工具列本身隱藏。",
"enableAiAssistant": "啟用人工智慧助手",
"enableAiAssistantDesc": "允許 AI 助理在此主機的終端機上提供協助。預設為關閉狀態,但仍需在您的帳戶中啟用 AI 功能。",
"proxmoxLastSyncStatus": {
"success": "成功"
},
+2 -1
View File
@@ -31,7 +31,7 @@ import {
registerAction,
registerSlotContribution,
} from "@/shell/action-registry";
import { pluginApiFor, pluginWsUrl } from "@/lib/plugin-transport";
import { pluginApiFor, pluginFetch, pluginWsUrl } from "@/lib/plugin-transport";
import { registerPluginComponent } from "./component-registry";
import type { WidgetTypeDefinition } from "@/types/homepage-types";
import type { LucideIcon } from "lucide-react";
@@ -387,6 +387,7 @@ export function createPluginApp(
origin as never,
pluginHostBridge.getApi(pluginId) as never,
) as unknown as TermixApp["api"],
fetch: (path, init) => pluginFetch(pluginId, path, init),
wsUrl: (path, options) =>
pluginWsUrl(pluginId, path, options as never) as ReturnType<
TermixApp["wsUrl"]
-2
View File
@@ -165,7 +165,6 @@ export function createHostEditorForm(
scpLegacy: host?.scpLegacy ?? false,
enableTmuxMonitor: host?.enableTmuxMonitor ?? false,
enableTerminalToolbar: host?.enableTerminalToolbar ?? true,
enableAiAssistant: host?.enableAiAssistant ?? false,
enableProxmox: (proxmoxSettings.enableProxmox as boolean) ?? false,
// The proxmox tab fills in its own defaults when this is unset.
proxmoxConfig:
@@ -428,7 +427,6 @@ export function buildHostEditorPayload(
scpLegacy: form.scpLegacy,
enableTmuxMonitor: form.enableTmuxMonitor,
enableTerminalToolbar: form.enableTerminalToolbar,
enableAiAssistant: form.enableAiAssistant,
enableProxmox: form.enableProxmox,
proxmoxConfig:
form.enableProxmox || form.proxmoxConfig?.source
-9
View File
@@ -905,15 +905,6 @@ export function HostEditorGeneralTab({
onChange={(value) => setField("enableTerminalToolbar", value)}
/>
</SettingRow>
<SettingRow
label={t("hosts.enableAiAssistant")}
description={t("hosts.enableAiAssistantDesc")}
>
<FakeSwitch
checked={form.enableAiAssistant}
onChange={(value) => setField("enableAiAssistant", value)}
/>
</SettingRow>
</div>
</SectionCard>
</>
-1
View File
@@ -101,7 +101,6 @@ export function sshHostToHost(h: SSHHostWithStatus): Host {
(proxmoxSettings.enableProxmoxStats as boolean) ?? false,
enableTmuxMonitor: h.enableTmuxMonitor ?? false,
enableTerminalToolbar: h.enableTerminalToolbar ?? true,
enableAiAssistant: h.enableAiAssistant ?? false,
proxmoxConfig:
(proxmoxSettings.proxmoxConfig as Host["proxmoxConfig"]) ?? null,
proxmoxStatsConfig:
-2
View File
@@ -536,8 +536,6 @@ export function UserProfilePanel({
storageMode?: string | null;
commandAutocomplete?: boolean | null;
commandPaletteEnabled?: boolean | null;
aiAssistantEnabled?: boolean | null;
aiReadOnlyCommands?: boolean | null;
showHostTags?: boolean | null;
hostTrayOnClick?: boolean | null;
compactHostView?: boolean | null;
-1
View File
@@ -42,7 +42,6 @@ export const FIELD_GROUP_KEYS: Record<FieldGroup, string[]> = {
"enableTerminal",
"enableCommandHistory",
"enableTerminalToolbar",
"enableAiAssistant",
"enableFileManager",
"enableWebUi",
"enableProxmox",
-3
View File
@@ -35,7 +35,6 @@ export function createQuickConnectHost(input: QuickConnectInput): Host {
enableFileManager: false,
enableTunnel: false,
enableTerminalToolbar: false,
enableAiAssistant: false,
enableSsh: false,
domain: input.domain,
pluginSettings: {
@@ -74,7 +73,6 @@ export function createQuickConnectHost(input: QuickConnectInput): Host {
enableProxmoxStats: false,
enableTmuxMonitor: false,
enableTerminalToolbar: true,
enableAiAssistant: false,
enableSsh: true,
sshPort: input.port,
};
@@ -103,7 +101,6 @@ export function quickConnectHostToPayload(host: Host): SSHHostData {
enableProxmox: host.enableProxmox,
enableTmuxMonitor: host.enableTmuxMonitor,
enableTerminalToolbar: host.enableTerminalToolbar,
enableAiAssistant: host.enableAiAssistant,
showTerminalInSidebar: true,
showFileManagerInSidebar: true,
showTunnelInSidebar: true,
+63
View File
@@ -0,0 +1,63 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
const state = vi.hoisted(() => ({ electron: false }));
vi.mock("@/main-axios", () => ({
authApi: { defaults: { baseURL: "http://server:8080/" } },
createRemoteOriginApiInstance: vi.fn(),
}));
vi.mock("@/lib/electron", () => ({ isElectron: () => state.electron }));
vi.mock("@/lib/device-id", () => ({ getDeviceId: () => "device-1" }));
import { pluginFetch } from "@/lib/plugin-transport";
const fetchMock = vi.fn(async () => new Response("ok"));
beforeEach(() => {
state.electron = false;
fetchMock.mockClear();
vi.stubGlobal("fetch", fetchMock);
});
afterEach(() => {
vi.unstubAllGlobals();
localStorage.clear();
});
describe("pluginFetch", () => {
it("fetches the plugin's own mount point with the session cookie", async () => {
await pluginFetch("ai", "chat/stream", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: "{}",
});
const [url, init] = fetchMock.mock.calls[0] as unknown as [
string,
RequestInit,
];
expect(url).toBe("http://server:8080/plugin-api/ai/chat/stream");
expect(init.credentials).toBe("include");
expect(init.method).toBe("POST");
const headers = init.headers as Headers;
expect(headers.get("content-type")).toBe("application/json");
expect(headers.get("x-termix-device-id")).toBe("device-1");
expect(headers.get("authorization")).toBeNull();
});
it("sends the stored token in the desktop app, like the shared client", async () => {
state.electron = true;
localStorage.setItem("jwt", "token-1");
await pluginFetch("ai", "/status");
const [url, init] = fetchMock.mock.calls[0] as unknown as [
string,
RequestInit,
];
expect(url).toBe("http://server:8080/plugin-api/ai/status");
const headers = init.headers as Headers;
expect(headers.get("x-electron-app")).toBe("true");
expect(headers.get("authorization")).toBe("Bearer token-1");
});
});
@@ -44,7 +44,6 @@ function makeHost(overrides: Partial<Host>): Host {
authType: "credential",
enableTerminal: true,
enableTerminalToolbar: true,
enableAiAssistant: false,
enableCommandHistory: true,
enableTunnel: false,
serverTunnels: [],
@@ -52,7 +52,6 @@ function sshHost(
enableFileManager: false,
enableTmuxMonitor: false,
enableTerminalToolbar: true,
enableAiAssistant: false,
showTerminalInSidebar: true,
showFileManagerInSidebar: false,
showTunnelInSidebar: false,