diff --git a/apps/desktop/src/main/core/App.ts b/apps/desktop/src/main/core/App.ts index 103ba27400..21e040ff1e 100644 --- a/apps/desktop/src/main/core/App.ts +++ b/apps/desktop/src/main/core/App.ts @@ -18,6 +18,9 @@ import { browserAutomationDetectors, contentSearchDetectors, fileSearchDetectors, + type IToolDetector, + runtimeEnvironmentDetectors, + type ToolCategory, } from '@/modules/toolDetectors'; import type { IServiceModule } from '@/services'; import { createLogger } from '@/utils/logger'; @@ -187,24 +190,20 @@ export class App { private registerBuiltinToolDetectors() { logger.debug('Registering built-in tool detectors'); - // Register content search tools (rg, ag, grep) - for (const detector of contentSearchDetectors) { - this.toolDetectorManager.register(detector, 'content-search'); - } + const detectorCategories: Partial> = { + 'runtime-environment': runtimeEnvironmentDetectors, + 'ast-search': astSearchDetectors, + 'browser-automation': browserAutomationDetectors, + 'content-search': contentSearchDetectors, + 'file-search': fileSearchDetectors, + }; - // Register AST-based code search tools (ast-grep) - for (const detector of astSearchDetectors) { - this.toolDetectorManager.register(detector, 'ast-search'); - } - - // Register file search tools (mdfind, fd, find) - for (const detector of fileSearchDetectors) { - this.toolDetectorManager.register(detector, 'file-search'); - } - - // Register browser automation tools (agent-browser) - for (const detector of browserAutomationDetectors) { - this.toolDetectorManager.register(detector, 'browser-automation'); + for (const [category, detectors] of Object.entries(detectorCategories)) { + if (detectors) { + for (const detector of detectors) { + this.toolDetectorManager.register(detector, category as ToolCategory); + } + } } logger.info( diff --git a/apps/desktop/src/main/core/infrastructure/ToolDetectorManager.ts b/apps/desktop/src/main/core/infrastructure/ToolDetectorManager.ts index 3f11c655ea..3ff7aa1de6 100644 --- a/apps/desktop/src/main/core/infrastructure/ToolDetectorManager.ts +++ b/apps/desktop/src/main/core/infrastructure/ToolDetectorManager.ts @@ -40,6 +40,7 @@ export type ToolCategory = | 'ast-search' | 'file-search' | 'browser-automation' + | 'runtime-environment' | 'system' | 'custom'; diff --git a/apps/desktop/src/main/modules/toolDetectors/index.ts b/apps/desktop/src/main/modules/toolDetectors/index.ts index 09f5ebc63e..a661d3be01 100644 --- a/apps/desktop/src/main/modules/toolDetectors/index.ts +++ b/apps/desktop/src/main/modules/toolDetectors/index.ts @@ -8,6 +8,7 @@ export { browserAutomationDetectors } from './agentBrowserDetectors'; export { astSearchDetectors, contentSearchDetectors } from './contentSearchDetectors'; export { fileSearchDetectors } from './fileSearchDetectors'; +export { runtimeEnvironmentDetectors } from './runtimeEnvironmentDetectors'; // Re-export types for convenience export type { diff --git a/apps/desktop/src/main/modules/toolDetectors/runtimeEnvironmentDetectors.ts b/apps/desktop/src/main/modules/toolDetectors/runtimeEnvironmentDetectors.ts new file mode 100644 index 0000000000..1724e50dc0 --- /dev/null +++ b/apps/desktop/src/main/modules/toolDetectors/runtimeEnvironmentDetectors.ts @@ -0,0 +1,73 @@ +import { exec } from 'node:child_process'; +import { platform } from 'node:os'; +import { promisify } from 'node:util'; + +import type { IToolDetector, ToolStatus } from '@/core/infrastructure/ToolDetectorManager'; +import { createCommandDetector } from '@/core/infrastructure/ToolDetectorManager'; + +const execPromise = promisify(exec); + +/** + * Node.js runtime detector + */ +export const nodeDetector: IToolDetector = createCommandDetector('node', { + description: 'Node.js - JavaScript runtime', + priority: 1, +}); + +/** + * NPM package manager detector + */ +export const npmDetector: IToolDetector = createCommandDetector('npm', { + description: 'npm - Node.js package manager', + priority: 2, +}); + +/** + * Python runtime detector + * Tries python3 (Unix) first, then python (cross-platform) + */ +export const pythonDetector: IToolDetector = { + description: 'Python - programming language runtime', + async detect(): Promise { + const commands = platform() === 'win32' ? ['python', 'py'] : ['python3', 'python']; + + for (const cmd of commands) { + try { + const whichCmd = platform() === 'win32' ? 'where' : 'which'; + const { stdout: pathOut } = await execPromise(`${whichCmd} ${cmd}`, { timeout: 3000 }); + const toolPath = pathOut.trim().split('\n')[0]; + + // Must successfully invoke --version to confirm usable runtime (e.g. avoid + // Windows Microsoft Store alias which is found by where but fails to run) + const { stdout: versionOut } = await execPromise(`${cmd} --version`, { + timeout: 3000, + }); + const version = versionOut.trim().split('\n')[0]; + + return { + available: true, + path: toolPath, + version, + }; + } catch { + continue; + } + } + + return { + available: false, + }; + }, + name: 'python', + priority: 3, +}; + +/** + * All runtime environment detectors + */ +export const runtimeEnvironmentDetectors: IToolDetector[] = [ + nodeDetector, + npmDetector, + pythonDetector, +]; diff --git a/locales/ar/setting.json b/locales/ar/setting.json index 07f7c9d82b..6376a5a2fc 100644 --- a/locales/ar/setting.json +++ b/locales/ar/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "أدوات للبحث عن النصوص داخل الملفات", "settingSystemTools.category.fileSearch": "البحث عن الملفات", "settingSystemTools.category.fileSearch.desc": "أدوات للعثور على الملفات حسب الاسم أو النمط", + "settingSystemTools.category.runtimeEnvironment": "بيئة التشغيل", + "settingSystemTools.category.runtimeEnvironment.desc": "بيئات تشغيل لتشغيل السكربتات والحزم", "settingSystemTools.detecting": "جارٍ الكشف...", "settingSystemTools.redetect": "إعادة الكشف", "settingSystemTools.status.available": "متاح", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "أداة find في Unix - أمر قياسي للبحث عن الملفات", "settingSystemTools.tools.grep.desc": "GNU grep - أداة قياسية للبحث في النصوص", "settingSystemTools.tools.mdfind.desc": "بحث Spotlight في macOS (بحث مفهرس وسريع)", + "settingSystemTools.tools.node.desc": "Node.js - بيئة تشغيل JavaScript لـ JS/TS", + "settingSystemTools.tools.npm.desc": "npm - مدير حزم Node.js لتثبيت التبعيات", + "settingSystemTools.tools.python.desc": "Python - بيئة تشغيل لغة البرمجة", "settingSystemTools.tools.rg.desc": "ripgrep - أداة بحث نصي سريعة للغاية", "settingTTS.openai.sttModel": "نموذج OpenAI لتحويل الكلام إلى نص", "settingTTS.openai.title": "OpenAI", diff --git a/locales/bg-BG/setting.json b/locales/bg-BG/setting.json index 1a1957d2b6..d47124779a 100644 --- a/locales/bg-BG/setting.json +++ b/locales/bg-BG/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Инструменти за търсене на текстово съдържание във файлове", "settingSystemTools.category.fileSearch": "Търсене на файлове", "settingSystemTools.category.fileSearch.desc": "Инструменти за намиране на файлове по име или шаблон", + "settingSystemTools.category.runtimeEnvironment": "Среда за изпълнение", + "settingSystemTools.category.runtimeEnvironment.desc": "Среди за изпълнение на скриптове и пакети", "settingSystemTools.detecting": "Открива се...", "settingSystemTools.redetect": "Повторно откриване", "settingSystemTools.status.available": "Налично", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find - стандартна команда за търсене на файлове", "settingSystemTools.tools.grep.desc": "GNU grep - стандартен инструмент за търсене в текст", "settingSystemTools.tools.mdfind.desc": "macOS Spotlight търсене (бързо индексирано търсене)", + "settingSystemTools.tools.node.desc": "Node.js - JavaScript среда за изпълнение за JS/TS", + "settingSystemTools.tools.npm.desc": "npm - мениджър на пакети Node.js за инсталиране на зависимости", + "settingSystemTools.tools.python.desc": "Python - среда за изпълнение на езика за програмиране", "settingSystemTools.tools.rg.desc": "ripgrep - изключително бърз инструмент за търсене в текст", "settingTTS.openai.sttModel": "OpenAI модел за разпознаване на реч", "settingTTS.openai.title": "OpenAI", diff --git a/locales/de-DE/setting.json b/locales/de-DE/setting.json index 501175cbd4..887f972476 100644 --- a/locales/de-DE/setting.json +++ b/locales/de-DE/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Werkzeuge zum Durchsuchen von Textinhalten in Dateien", "settingSystemTools.category.fileSearch": "Dateisuche", "settingSystemTools.category.fileSearch.desc": "Werkzeuge zum Auffinden von Dateien nach Name oder Muster", + "settingSystemTools.category.runtimeEnvironment": "Laufzeitumgebung", + "settingSystemTools.category.runtimeEnvironment.desc": "Entwicklungslaufzeitumgebungen für die Ausführung von Skripten und Paketen", "settingSystemTools.detecting": "Erkennung läuft...", "settingSystemTools.redetect": "Erneut erkennen", "settingSystemTools.status.available": "Verfügbar", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find – Standardbefehl zur Dateisuche", "settingSystemTools.tools.grep.desc": "GNU grep – Standardwerkzeug zur Textsuche", "settingSystemTools.tools.mdfind.desc": "macOS Spotlight-Suche (schnelle indizierte Suche)", + "settingSystemTools.tools.node.desc": "Node.js - JavaScript-Laufzeitumgebung für JS/TS", + "settingSystemTools.tools.npm.desc": "npm - Node.js-Paketmanager für die Installation von Abhängigkeiten", + "settingSystemTools.tools.python.desc": "Python - Laufzeitumgebung für die Programmiersprache", "settingSystemTools.tools.rg.desc": "ripgrep – extrem schnelles Tool zur Textsuche", "settingTTS.openai.sttModel": "OpenAI Sprach-zu-Text-Modell", "settingTTS.openai.title": "OpenAI", diff --git a/locales/en-US/setting.json b/locales/en-US/setting.json index ac449ddbaa..c02aa452c7 100644 --- a/locales/en-US/setting.json +++ b/locales/en-US/setting.json @@ -573,6 +573,8 @@ "settingSystemTools.category.contentSearch.desc": "Tools for searching text content within files", "settingSystemTools.category.fileSearch": "File Search", "settingSystemTools.category.fileSearch.desc": "Tools for finding files by name or pattern", + "settingSystemTools.category.runtimeEnvironment": "Runtime Environment", + "settingSystemTools.category.runtimeEnvironment.desc": "Development runtime environments for executing scripts and packages", "settingSystemTools.detecting": "Detecting...", "settingSystemTools.redetect": "Re-detect", "settingSystemTools.status.available": "Available", @@ -585,6 +587,9 @@ "settingSystemTools.tools.find.desc": "Unix find - standard file search command", "settingSystemTools.tools.grep.desc": "GNU grep - standard text search tool", "settingSystemTools.tools.mdfind.desc": "macOS Spotlight search (fast indexed search)", + "settingSystemTools.tools.node.desc": "Node.js - JavaScript runtime for executing JS/TS", + "settingSystemTools.tools.npm.desc": "npm - Node.js package manager for installing dependencies", + "settingSystemTools.tools.python.desc": "Python - programming language runtime", "settingSystemTools.tools.rg.desc": "ripgrep - extremely fast text search tool", "settingTTS.openai.sttModel": "OpenAI Speech-to-Text Model", "settingTTS.openai.title": "OpenAI", diff --git a/locales/es-ES/setting.json b/locales/es-ES/setting.json index 92686031b6..923ef4bd83 100644 --- a/locales/es-ES/setting.json +++ b/locales/es-ES/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Herramientas para buscar texto dentro de archivos", "settingSystemTools.category.fileSearch": "Búsqueda de archivos", "settingSystemTools.category.fileSearch.desc": "Herramientas para encontrar archivos por nombre o patrón", + "settingSystemTools.category.runtimeEnvironment": "Entorno de ejecución", + "settingSystemTools.category.runtimeEnvironment.desc": "Entornos de ejecución para ejecutar scripts y paquetes", "settingSystemTools.detecting": "Detectando...", "settingSystemTools.redetect": "Volver a detectar", "settingSystemTools.status.available": "Disponible", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "find de Unix - comando estándar para búsqueda de archivos", "settingSystemTools.tools.grep.desc": "GNU grep - herramienta estándar para búsqueda de texto", "settingSystemTools.tools.mdfind.desc": "Búsqueda Spotlight de macOS (búsqueda indexada rápida)", + "settingSystemTools.tools.node.desc": "Node.js - entorno de ejecución JavaScript para JS/TS", + "settingSystemTools.tools.npm.desc": "npm - gestor de paquetes Node.js para instalar dependencias", + "settingSystemTools.tools.python.desc": "Python - entorno de ejecución del lenguaje de programación", "settingSystemTools.tools.rg.desc": "ripgrep - herramienta de búsqueda de texto extremadamente rápida", "settingTTS.openai.sttModel": "Modelo de Reconocimiento de Voz de OpenAI", "settingTTS.openai.title": "OpenAI", diff --git a/locales/fa-IR/setting.json b/locales/fa-IR/setting.json index c1d043ba4c..0a6225bc5e 100644 --- a/locales/fa-IR/setting.json +++ b/locales/fa-IR/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "ابزارهایی برای جستجوی محتوای متنی درون فایل‌ها", "settingSystemTools.category.fileSearch": "جستجوی فایل", "settingSystemTools.category.fileSearch.desc": "ابزارهایی برای یافتن فایل‌ها بر اساس نام یا الگو", + "settingSystemTools.category.runtimeEnvironment": "محیط اجرا", + "settingSystemTools.category.runtimeEnvironment.desc": "محیط‌های اجرا برای اجرای اسکریپت‌ها و بسته‌ها", "settingSystemTools.detecting": "در حال شناسایی...", "settingSystemTools.redetect": "شناسایی مجدد", "settingSystemTools.status.available": "در دسترس", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "دستور find در یونیکس - فرمان استاندارد جستجوی فایل", "settingSystemTools.tools.grep.desc": "GNU grep - ابزار استاندارد جستجوی متن", "settingSystemTools.tools.mdfind.desc": "جستجوی Spotlight در macOS (جستجوی سریع و ایندکس‌شده)", + "settingSystemTools.tools.node.desc": "Node.js - محیط اجرای JavaScript برای JS/TS", + "settingSystemTools.tools.npm.desc": "npm - مدیر بسته Node.js برای نصب وابستگی‌ها", + "settingSystemTools.tools.python.desc": "Python - محیط اجرای زبان برنامه‌نویسی", "settingSystemTools.tools.rg.desc": "ripgrep - ابزار بسیار سریع برای جستجوی متن", "settingTTS.openai.sttModel": "مدل تبدیل گفتار به متن OpenAI", "settingTTS.openai.title": "OpenAI", diff --git a/locales/fr-FR/setting.json b/locales/fr-FR/setting.json index 26ff2d7229..639c4e2f9d 100644 --- a/locales/fr-FR/setting.json +++ b/locales/fr-FR/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Outils pour rechercher du texte dans les fichiers", "settingSystemTools.category.fileSearch": "Recherche de fichiers", "settingSystemTools.category.fileSearch.desc": "Outils pour trouver des fichiers par nom ou motif", + "settingSystemTools.category.runtimeEnvironment": "Environnement d'exécution", + "settingSystemTools.category.runtimeEnvironment.desc": "Environnements d'exécution pour l'exécution de scripts et de paquets", "settingSystemTools.detecting": "Détection en cours...", "settingSystemTools.redetect": "Redétecter", "settingSystemTools.status.available": "Disponible", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "find d'Unix - commande standard de recherche de fichiers", "settingSystemTools.tools.grep.desc": "GNU grep - outil standard de recherche de texte", "settingSystemTools.tools.mdfind.desc": "Recherche Spotlight de macOS (recherche indexée rapide)", + "settingSystemTools.tools.node.desc": "Node.js - environnement d'exécution JavaScript pour JS/TS", + "settingSystemTools.tools.npm.desc": "npm - gestionnaire de paquets Node.js pour installer les dépendances", + "settingSystemTools.tools.python.desc": "Python - environnement d'exécution du langage de programmation", "settingSystemTools.tools.rg.desc": "ripgrep - outil de recherche de texte extrêmement rapide", "settingTTS.openai.sttModel": "Modèle de reconnaissance vocale OpenAI", "settingTTS.openai.title": "OpenAI", diff --git a/locales/it-IT/setting.json b/locales/it-IT/setting.json index 7a2e28df15..37f76f9055 100644 --- a/locales/it-IT/setting.json +++ b/locales/it-IT/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Strumenti per cercare contenuti testuali all'interno dei file", "settingSystemTools.category.fileSearch": "Ricerca File", "settingSystemTools.category.fileSearch.desc": "Strumenti per trovare file per nome o modello", + "settingSystemTools.category.runtimeEnvironment": "Ambiente di runtime", + "settingSystemTools.category.runtimeEnvironment.desc": "Ambienti di runtime per l'esecuzione di script e pacchetti", "settingSystemTools.detecting": "Rilevamento in corso...", "settingSystemTools.redetect": "Rileva di nuovo", "settingSystemTools.status.available": "Disponibile", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "find di Unix - comando standard per la ricerca di file", "settingSystemTools.tools.grep.desc": "GNU grep - strumento standard per la ricerca di testo", "settingSystemTools.tools.mdfind.desc": "Ricerca Spotlight di macOS (ricerca indicizzata veloce)", + "settingSystemTools.tools.node.desc": "Node.js - runtime JavaScript per l'esecuzione di JS/TS", + "settingSystemTools.tools.npm.desc": "npm - gestore di pacchetti Node.js per installare le dipendenze", + "settingSystemTools.tools.python.desc": "Python - runtime del linguaggio di programmazione", "settingSystemTools.tools.rg.desc": "ripgrep - strumento estremamente veloce per la ricerca di testo", "settingTTS.openai.sttModel": "Modello OpenAI per Riconoscimento Vocale", "settingTTS.openai.title": "OpenAI", diff --git a/locales/ja-JP/setting.json b/locales/ja-JP/setting.json index a2829ee07c..9db4f9697c 100644 --- a/locales/ja-JP/setting.json +++ b/locales/ja-JP/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "ファイル内のテキストコンテンツを検索するためのツール", "settingSystemTools.category.fileSearch": "ファイル検索", "settingSystemTools.category.fileSearch.desc": "名前やパターンでファイルを検索するためのツール", + "settingSystemTools.category.runtimeEnvironment": "ランタイム環境", + "settingSystemTools.category.runtimeEnvironment.desc": "スクリプトやパッケージを実行するための開発ランタイム環境", "settingSystemTools.detecting": "検出中...", "settingSystemTools.redetect": "再検出", "settingSystemTools.status.available": "利用可能", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find - 標準的なファイル検索コマンド", "settingSystemTools.tools.grep.desc": "GNU grep - 標準的なテキスト検索ツール", "settingSystemTools.tools.mdfind.desc": "macOS Spotlight 検索(高速なインデックス検索)", + "settingSystemTools.tools.node.desc": "Node.js - JavaScript/TypeScript を実行するランタイム", + "settingSystemTools.tools.npm.desc": "npm - Node.js パッケージマネージャー、依存関係のインストール用", + "settingSystemTools.tools.python.desc": "Python - プログラミング言語ランタイム", "settingSystemTools.tools.rg.desc": "ripgrep - 非常に高速なテキスト検索ツール", "settingTTS.openai.sttModel": "OpenAI 音声認識モデル", "settingTTS.openai.title": "OpenAI", diff --git a/locales/ko-KR/setting.json b/locales/ko-KR/setting.json index 44642614dd..d2385458b9 100644 --- a/locales/ko-KR/setting.json +++ b/locales/ko-KR/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "파일 내 텍스트 콘텐츠를 검색하는 도구", "settingSystemTools.category.fileSearch": "파일 검색", "settingSystemTools.category.fileSearch.desc": "이름이나 패턴으로 파일을 찾는 도구", + "settingSystemTools.category.runtimeEnvironment": "런타임 환경", + "settingSystemTools.category.runtimeEnvironment.desc": "스크립트 및 패키지 실행을 위한 개발 런타임 환경", "settingSystemTools.detecting": "감지 중...", "settingSystemTools.redetect": "다시 감지", "settingSystemTools.status.available": "사용 가능", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find - 표준 파일 검색 명령어", "settingSystemTools.tools.grep.desc": "GNU grep - 표준 텍스트 검색 도구", "settingSystemTools.tools.mdfind.desc": "macOS Spotlight 검색 (빠른 인덱스 기반 검색)", + "settingSystemTools.tools.node.desc": "Node.js - JavaScript/TypeScript 실행을 위한 런타임", + "settingSystemTools.tools.npm.desc": "npm - Node.js 패키지 매니저, 의존성 설치용", + "settingSystemTools.tools.python.desc": "Python - 프로그래밍 언어 런타임", "settingSystemTools.tools.rg.desc": "ripgrep - 매우 빠른 텍스트 검색 도구", "settingTTS.openai.sttModel": "OpenAI 음성 인식 모델", "settingTTS.openai.title": "OpenAI", diff --git a/locales/nl-NL/setting.json b/locales/nl-NL/setting.json index 57533e1a06..8616c9a301 100644 --- a/locales/nl-NL/setting.json +++ b/locales/nl-NL/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Hulpmiddelen voor het doorzoeken van tekstinhoud in bestanden", "settingSystemTools.category.fileSearch": "Bestandszoeker", "settingSystemTools.category.fileSearch.desc": "Hulpmiddelen voor het vinden van bestanden op naam of patroon", + "settingSystemTools.category.runtimeEnvironment": "Runtime-omgeving", + "settingSystemTools.category.runtimeEnvironment.desc": "Runtime-omgevingen voor het uitvoeren van scripts en pakketten", "settingSystemTools.detecting": "Detecteren...", "settingSystemTools.redetect": "Opnieuw detecteren", "settingSystemTools.status.available": "Beschikbaar", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find - standaardopdracht voor het zoeken naar bestanden", "settingSystemTools.tools.grep.desc": "GNU grep - standaardhulpmiddel voor tekstzoekopdrachten", "settingSystemTools.tools.mdfind.desc": "macOS Spotlight-zoekfunctie (snelle geïndexeerde zoekopdracht)", + "settingSystemTools.tools.node.desc": "Node.js - JavaScript-runtime voor JS/TS", + "settingSystemTools.tools.npm.desc": "npm - Node.js-pakketbeheerder voor het installeren van afhankelijkheden", + "settingSystemTools.tools.python.desc": "Python - runtime voor de programmeertaal", "settingSystemTools.tools.rg.desc": "ripgrep - extreem snelle tool voor tekstzoekopdrachten", "settingTTS.openai.sttModel": "OpenAI Spraak-naar-Tekst Model", "settingTTS.openai.title": "OpenAI", diff --git a/locales/pl-PL/setting.json b/locales/pl-PL/setting.json index 61a4b1afc4..f1adf51954 100644 --- a/locales/pl-PL/setting.json +++ b/locales/pl-PL/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Narzędzia do przeszukiwania treści tekstowych w plikach", "settingSystemTools.category.fileSearch": "Wyszukiwanie plików", "settingSystemTools.category.fileSearch.desc": "Narzędzia do znajdowania plików po nazwie lub wzorcu", + "settingSystemTools.category.runtimeEnvironment": "Środowisko uruchomieniowe", + "settingSystemTools.category.runtimeEnvironment.desc": "Środowiska uruchomieniowe do wykonywania skryptów i pakietów", "settingSystemTools.detecting": "Wykrywanie...", "settingSystemTools.redetect": "Wykryj ponownie", "settingSystemTools.status.available": "Dostępne", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find – standardowe polecenie do wyszukiwania plików", "settingSystemTools.tools.grep.desc": "GNU grep – standardowe narzędzie do wyszukiwania tekstu", "settingSystemTools.tools.mdfind.desc": "macOS Spotlight – szybkie wyszukiwanie z indeksowaniem", + "settingSystemTools.tools.node.desc": "Node.js - środowisko uruchomieniowe JavaScript dla JS/TS", + "settingSystemTools.tools.npm.desc": "npm - menedżer pakietów Node.js do instalacji zależności", + "settingSystemTools.tools.python.desc": "Python - środowisko uruchomieniowe języka programowania", "settingSystemTools.tools.rg.desc": "ripgrep – niezwykle szybkie narzędzie do wyszukiwania tekstu", "settingTTS.openai.sttModel": "Model rozpoznawania mowy OpenAI", "settingTTS.openai.title": "OpenAI", diff --git a/locales/pt-BR/setting.json b/locales/pt-BR/setting.json index f9b143e3f2..b925ef4722 100644 --- a/locales/pt-BR/setting.json +++ b/locales/pt-BR/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Ferramentas para buscar texto dentro de arquivos", "settingSystemTools.category.fileSearch": "Busca de Arquivos", "settingSystemTools.category.fileSearch.desc": "Ferramentas para encontrar arquivos por nome ou padrão", + "settingSystemTools.category.runtimeEnvironment": "Ambiente de execução", + "settingSystemTools.category.runtimeEnvironment.desc": "Ambientes de execução para scripts e pacotes", "settingSystemTools.detecting": "Detectando...", "settingSystemTools.redetect": "Redetectar", "settingSystemTools.status.available": "Disponível", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "find do Unix - comando padrão para busca de arquivos", "settingSystemTools.tools.grep.desc": "GNU grep - ferramenta padrão para busca de texto", "settingSystemTools.tools.mdfind.desc": "Busca do Spotlight do macOS (busca indexada e rápida)", + "settingSystemTools.tools.node.desc": "Node.js - runtime JavaScript para executar JS/TS", + "settingSystemTools.tools.npm.desc": "npm - gerenciador de pacotes Node.js para instalar dependências", + "settingSystemTools.tools.python.desc": "Python - runtime da linguagem de programação", "settingSystemTools.tools.rg.desc": "ripgrep - ferramenta extremamente rápida para busca de texto", "settingTTS.openai.sttModel": "Modelo de Reconhecimento de Voz da OpenAI", "settingTTS.openai.title": "OpenAI", diff --git a/locales/ru-RU/setting.json b/locales/ru-RU/setting.json index a21658b821..71d09f2528 100644 --- a/locales/ru-RU/setting.json +++ b/locales/ru-RU/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Инструменты для поиска текстового содержимого в файлах", "settingSystemTools.category.fileSearch": "Поиск файлов", "settingSystemTools.category.fileSearch.desc": "Инструменты для поиска файлов по имени или шаблону", + "settingSystemTools.category.runtimeEnvironment": "Среда выполнения", + "settingSystemTools.category.runtimeEnvironment.desc": "Среды выполнения для запуска скриптов и пакетов", "settingSystemTools.detecting": "Обнаружение...", "settingSystemTools.redetect": "Повторное обнаружение", "settingSystemTools.status.available": "Доступен", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find — стандартная команда для поиска файлов", "settingSystemTools.tools.grep.desc": "GNU grep — стандартный инструмент для поиска текста", "settingSystemTools.tools.mdfind.desc": "Поиск Spotlight в macOS (быстрый индексированный поиск)", + "settingSystemTools.tools.node.desc": "Node.js - среда выполнения JavaScript для JS/TS", + "settingSystemTools.tools.npm.desc": "npm - менеджер пакетов Node.js для установки зависимостей", + "settingSystemTools.tools.python.desc": "Python - среда выполнения языка программирования", "settingSystemTools.tools.rg.desc": "ripgrep — чрезвычайно быстрый инструмент для поиска текста", "settingTTS.openai.sttModel": "Модель распознавания речи OpenAI", "settingTTS.openai.title": "OpenAI", diff --git a/locales/tr-TR/setting.json b/locales/tr-TR/setting.json index 002abc33f7..4710f36f6f 100644 --- a/locales/tr-TR/setting.json +++ b/locales/tr-TR/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Dosyalar içinde metin içeriği aramak için araçlar", "settingSystemTools.category.fileSearch": "Dosya Arama", "settingSystemTools.category.fileSearch.desc": "Dosyaları ada veya desene göre bulmak için araçlar", + "settingSystemTools.category.runtimeEnvironment": "Çalışma Ortamı", + "settingSystemTools.category.runtimeEnvironment.desc": "Betik ve paket çalıştırmak için geliştirme çalışma ortamları", "settingSystemTools.detecting": "Tespit ediliyor...", "settingSystemTools.redetect": "Yeniden tespit et", "settingSystemTools.status.available": "Mevcut", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find - standart dosya arama komutu", "settingSystemTools.tools.grep.desc": "GNU grep - standart metin arama aracı", "settingSystemTools.tools.mdfind.desc": "macOS Spotlight araması (hızlı indeksli arama)", + "settingSystemTools.tools.node.desc": "Node.js - JS/TS çalıştırmak için JavaScript çalışma ortamı", + "settingSystemTools.tools.npm.desc": "npm - bağımlılıkları yüklemek için Node.js paket yöneticisi", + "settingSystemTools.tools.python.desc": "Python - programlama dili çalışma ortamı", "settingSystemTools.tools.rg.desc": "ripgrep - son derece hızlı metin arama aracı", "settingTTS.openai.sttModel": "OpenAI Konuşmadan Metne Modeli", "settingTTS.openai.title": "OpenAI", diff --git a/locales/vi-VN/setting.json b/locales/vi-VN/setting.json index 1eedb6b616..a5a59cb531 100644 --- a/locales/vi-VN/setting.json +++ b/locales/vi-VN/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "Công cụ để tìm kiếm nội dung văn bản trong tệp", "settingSystemTools.category.fileSearch": "Tìm kiếm tệp", "settingSystemTools.category.fileSearch.desc": "Công cụ để tìm tệp theo tên hoặc mẫu", + "settingSystemTools.category.runtimeEnvironment": "Môi trường chạy", + "settingSystemTools.category.runtimeEnvironment.desc": "Môi trường chạy để thực thi script và gói", "settingSystemTools.detecting": "Đang phát hiện...", "settingSystemTools.redetect": "Phát hiện lại", "settingSystemTools.status.available": "Sẵn sàng", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find - lệnh tìm kiếm tệp tiêu chuẩn", "settingSystemTools.tools.grep.desc": "GNU grep - công cụ tìm kiếm văn bản tiêu chuẩn", "settingSystemTools.tools.mdfind.desc": "Tìm kiếm Spotlight của macOS (tìm kiếm được lập chỉ mục nhanh)", + "settingSystemTools.tools.node.desc": "Node.js - môi trường chạy JavaScript cho JS/TS", + "settingSystemTools.tools.npm.desc": "npm - trình quản lý gói Node.js để cài đặt phụ thuộc", + "settingSystemTools.tools.python.desc": "Python - môi trường chạy ngôn ngữ lập trình", "settingSystemTools.tools.rg.desc": "ripgrep - công cụ tìm kiếm văn bản cực nhanh", "settingTTS.openai.sttModel": "Mô Hình Chuyển Giọng Nói Thành Văn Bản của OpenAI", "settingTTS.openai.title": "OpenAI", diff --git a/locales/zh-CN/setting.json b/locales/zh-CN/setting.json index 494667186e..0a38e2b9ec 100644 --- a/locales/zh-CN/setting.json +++ b/locales/zh-CN/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "用于在文件内搜索文本内容的工具", "settingSystemTools.category.fileSearch": "文件搜索", "settingSystemTools.category.fileSearch.desc": "用于按名称或模式查找文件的工具", + "settingSystemTools.category.runtimeEnvironment": "运行环境", + "settingSystemTools.category.runtimeEnvironment.desc": "用于执行脚本和安装依赖的开发运行环境", "settingSystemTools.detecting": "检测中...", "settingSystemTools.redetect": "重新检测", "settingSystemTools.status.available": "可用", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find - 标准文件搜索命令", "settingSystemTools.tools.grep.desc": "GNU grep - 标准文本搜索工具", "settingSystemTools.tools.mdfind.desc": "macOS 聚焦搜索(快速索引搜索)", + "settingSystemTools.tools.node.desc": "Node.js - 执行 JavaScript/TypeScript 的运行时", + "settingSystemTools.tools.npm.desc": "npm - Node.js 包管理器,用于安装依赖", + "settingSystemTools.tools.python.desc": "Python - 编程语言运行时", "settingSystemTools.tools.rg.desc": "ripgrep - 极快的文本搜索工具", "settingTTS.openai.sttModel": "OpenAI 语音识别模型", "settingTTS.openai.title": "OpenAI", diff --git a/locales/zh-TW/setting.json b/locales/zh-TW/setting.json index 1e5bd3d02a..66184dab84 100644 --- a/locales/zh-TW/setting.json +++ b/locales/zh-TW/setting.json @@ -571,6 +571,8 @@ "settingSystemTools.category.contentSearch.desc": "用於搜尋檔案內文字內容的工具", "settingSystemTools.category.fileSearch": "檔案搜尋", "settingSystemTools.category.fileSearch.desc": "用於依名稱或模式尋找檔案的工具", + "settingSystemTools.category.runtimeEnvironment": "執行環境", + "settingSystemTools.category.runtimeEnvironment.desc": "用於執行腳本與安裝依賴的開發執行環境", "settingSystemTools.detecting": "偵測中...", "settingSystemTools.redetect": "重新偵測", "settingSystemTools.status.available": "可用", @@ -582,6 +584,9 @@ "settingSystemTools.tools.find.desc": "Unix find - 標準檔案搜尋指令", "settingSystemTools.tools.grep.desc": "GNU grep - 標準文字搜尋工具", "settingSystemTools.tools.mdfind.desc": "macOS Spotlight 搜尋(快速的索引搜尋)", + "settingSystemTools.tools.node.desc": "Node.js - 執行 JavaScript/TypeScript 的執行環境", + "settingSystemTools.tools.npm.desc": "npm - Node.js 套件管理器,用於安裝依賴", + "settingSystemTools.tools.python.desc": "Python - 程式語言執行環境", "settingSystemTools.tools.rg.desc": "ripgrep - 極速的文字搜尋工具", "settingTTS.openai.sttModel": "OpenAI 語音識別模型", "settingTTS.openai.title": "OpenAI", diff --git a/src/locales/default/setting.ts b/src/locales/default/setting.ts index b29ee7aa13..3ccd28816e 100644 --- a/src/locales/default/setting.ts +++ b/src/locales/default/setting.ts @@ -648,6 +648,9 @@ export default { 'settingSystemTools.category.contentSearch.desc': 'Tools for searching text content within files', 'settingSystemTools.category.fileSearch': 'File Search', 'settingSystemTools.category.fileSearch.desc': 'Tools for finding files by name or pattern', + 'settingSystemTools.category.runtimeEnvironment': 'Runtime Environment', + 'settingSystemTools.category.runtimeEnvironment.desc': + 'Development runtime environments for executing scripts and packages', 'settingSystemTools.detecting': 'Detecting...', 'settingSystemTools.redetect': 'Re-detect', 'settingSystemTools.status.available': 'Available', @@ -661,6 +664,9 @@ export default { 'settingSystemTools.tools.find.desc': 'Unix find - standard file search command', 'settingSystemTools.tools.grep.desc': 'GNU grep - standard text search tool', 'settingSystemTools.tools.mdfind.desc': 'macOS Spotlight search (fast indexed search)', + 'settingSystemTools.tools.node.desc': 'Node.js - JavaScript runtime for executing JS/TS', + 'settingSystemTools.tools.npm.desc': 'npm - Node.js package manager for installing dependencies', + 'settingSystemTools.tools.python.desc': 'Python - programming language runtime', 'settingSystemTools.tools.rg.desc': 'ripgrep - extremely fast text search tool', 'settingTTS.openai.sttModel': 'OpenAI Speech-to-Text Model', 'settingTTS.openai.title': 'OpenAI', diff --git a/src/routes/(main)/settings/system-tools/features/ToolDetectorSection.tsx b/src/routes/(main)/settings/system-tools/features/ToolDetectorSection.tsx index 0c657bc102..d9fff1d619 100644 --- a/src/routes/(main)/settings/system-tools/features/ToolDetectorSection.tsx +++ b/src/routes/(main)/settings/system-tools/features/ToolDetectorSection.tsx @@ -15,6 +15,16 @@ import { toolDetectorService } from '@/services/electron/toolDetector'; * This allows us to always show all tools even if not detected */ const TOOL_CATEGORIES = { + 'runtime-environment': { + descKey: 'settingSystemTools.category.runtimeEnvironment.desc', + titleKey: 'settingSystemTools.category.runtimeEnvironment', + tools: [ + { descKey: 'settingSystemTools.tools.node.desc', name: 'node' }, + { descKey: 'settingSystemTools.tools.python.desc', name: 'python' }, + { descKey: 'settingSystemTools.tools.npm.desc', name: 'npm' }, + ], + }, + 'content-search': { descKey: 'settingSystemTools.category.contentSearch.desc', titleKey: 'settingSystemTools.category.contentSearch', @@ -66,40 +76,30 @@ const ToolStatusDisplay = memo(({ status, isDetecting }) ); } + if (!status.available) { + return ( + + + {t('settingSystemTools.status.unavailable')} + + ); + } + return ( - - {status.available ? ( - <> - - {t('settingSystemTools.status.available')} - {status.version && ( - - {status.version} - - )} - {status.path && ( - - - - {status.path} - - - - - )} - - ) : ( - <> - - {t('settingSystemTools.status.unavailable')} - {status.error && ( - - - ({status.error}) - - - )} - + + + + {t('settingSystemTools.status.available')} + + {status.path && ( + + + + {status.path} + + + + )} ); @@ -141,12 +141,25 @@ const ToolDetectorSection = memo(() => { const formItems: FormGroupItemType[] = Object.entries(TOOL_CATEGORIES).map( ([, categoryConfig]) => ({ - children: categoryConfig.tools.map((tool) => ({ - children: , - desc: t(tool.descKey), - label: tool.name, - minWidth: undefined, - })), + children: categoryConfig.tools.map((tool) => { + const status = toolStatuses[tool.name]; + const label = ( + + {tool.name} + {status?.version && ( + + {status.version} + + )} + + ); + return { + children: , + desc: t(tool.descKey), + label, + minWidth: undefined, + }; + }), desc: t(categoryConfig.descKey), title: t(categoryConfig.titleKey), }),