From f553352e2545380ab1633f2aaa0c08bed023ab30 Mon Sep 17 00:00:00 2001 From: Dushnilin Date: Tue, 1 Sep 2026 08:48:29 +0300 Subject: [PATCH] =?UTF-8?q?release:=201.3.9=20-=20=D0=9E=D0=BF=D1=82=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=B2=D0=BE=D0=B9=20=D0=B1=D0=B0=D0=B7=D1=8B=20(Ponytail?= =?UTF-8?q?=20Audit),=20=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D1=82=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0=20=D0=B8=20=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20Telegram-=D0=B1=D0=BE=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Frontend: полное удаление неиспользуемого renderAdvancedSettings.ts (-1354 строки), очистка каталогов локализации от фантомных ключей, инкапсуляция внутренних экспортов в runtimeTags и singBoxVariant - Backend: удаление неиспользуемого singbox/dns_prefetch.uc (-243 строки) и его вызова в lifecycle.uc, удаление устаревших заглушек Forkop-эпохи в service_check.uc - Telegram Bot: внедрение in-memory кэша cb_map_cache для устранения избыточных дисковых чтений/записей JSON при рендеринге inline-кнопок - Версия: bump версии до 1.3.9 в package.json и package-lock.json --- fe-app-tachyon/locales/calls.json | 404 +---- fe-app-tachyon/locales/tachyon.pot | 231 +-- fe-app-tachyon/locales/tachyon.ru.po | 274 ++-- fe-app-tachyon/package-lock.json | 4 +- fe-app-tachyon/package.json | 2 +- .../src/tachyon/helpers/singBoxVariant.ts | 6 +- fe-app-tachyon/src/tachyon/runtimeTags.ts | 2 +- .../partials/renderAdvancedSettings.ts | 1354 ----------------- luci-app-tachyon/po/ru/tachyon.po | 274 ++-- luci-app-tachyon/po/templates/tachyon.pot | 231 +-- .../usr/lib/diagnostics/service_check.uc | 60 - tachyon/files/usr/lib/service/lifecycle.uc | 2 - tachyon/files/usr/lib/service/telegram.uc | 23 +- tachyon/files/usr/lib/singbox/dns_prefetch.uc | 242 --- 14 files changed, 352 insertions(+), 2757 deletions(-) delete mode 100644 fe-app-tachyon/src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts delete mode 100644 tachyon/files/usr/lib/singbox/dns_prefetch.uc diff --git a/fe-app-tachyon/locales/calls.json b/fe-app-tachyon/locales/calls.json index 95da4e78..0818f490 100644 --- a/fe-app-tachyon/locales/calls.json +++ b/fe-app-tachyon/locales/calls.json @@ -64,27 +64,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8901" ] }, - { - "call": "⏹ Stop", - "key": "⏹ Stop", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:515" - ] - }, - { - "call": "▶ Start", - "key": "▶ Start", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:515" - ] - }, - { - "call": "⚙ Advanced Settings", - "key": "⚙ Advanced Settings", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1340" - ] - }, { "call": "⚠️ Benchmark completed. No working bypass found for this target.", "key": "⚠️ Benchmark completed. No working bypass found for this target.", @@ -194,8 +173,7 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:8357", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:8364", "src/tachyon/tabs/dashboard/initController.ts:1891", - "src/tachyon/tabs/dashboard/initController.ts:1900", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:505" + "src/tachyon/tabs/dashboard/initController.ts:1900" ] }, { @@ -213,8 +191,7 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:8357", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:8364", "src/tachyon/tabs/dashboard/initController.ts:1891", - "src/tachyon/tabs/dashboard/initController.ts:1900", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:505" + "src/tachyon/tabs/dashboard/initController.ts:1900" ] }, { @@ -297,13 +274,6 @@ "src/tachyon/tabs/diagnostic/partials/renderStrategyFuzzerModal.ts:248" ] }, - { - "call": "🔑 Generate", - "key": "🔑 Generate", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:760" - ] - }, { "call": "🗑️ Clear History", "key": "🗑️ Clear History", @@ -424,9 +394,9 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:16607", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:349", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:355", - "src/tachyon/tabs/dashboard/initController.ts:1127", "src/tachyon/tabs/monitoring/initController.ts:722", - "src/tachyon/tabs/monitoring/render.ts:20" + "src/tachyon/tabs/monitoring/render.ts:20", + "src/tachyon/tabs/dashboard/initController.ts:1127" ] }, { @@ -640,13 +610,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:85" ] }, - { - "call": "Advanced self-healing features. Requires Watchdog to be enabled.", - "key": "Advanced self-healing features. Requires Watchdog to be enabled.", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:627" - ] - }, { "call": "Advanced System", "key": "Advanced System", @@ -682,13 +645,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:822" ] }, - { - "call": "AI Agent REST API (12 Endpoints)", - "key": "AI Agent REST API (12 Endpoints)", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:722" - ] - }, { "call": "AI Agent REST API Bearer Token", "key": "AI Agent REST API Bearer Token", @@ -700,8 +656,7 @@ "call": "AI API Key", "key": "AI API Key", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1813", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1037" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1813" ] }, { @@ -728,13 +683,6 @@ "src/tachyon/tabs/diagnostic/partials/renderStrategyFuzzerModal.ts:1046" ] }, - { - "call": "AI Doctor (ChatGPT / DeepSeek API)", - "key": "AI Doctor (ChatGPT / DeepSeek API)", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:776" - ] - }, { "call": "AI Doctor Diagnosis", "key": "AI Doctor Diagnosis", @@ -759,8 +707,7 @@ "call": "AI Doctor Language", "key": "AI Doctor Language", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1800", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1004" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1800" ] }, { @@ -783,16 +730,14 @@ "call": "AI Model", "key": "AI Model", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1787", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:979" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1787" ] }, { "call": "AI Provider", "key": "AI Provider", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1770", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:901" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1770" ] }, { @@ -827,20 +772,6 @@ "src/tachyon/tabs/diagnostic/partials/renderStrategyFuzzerModal.ts:1690" ] }, - { - "call": "AI Watchdog", - "key": "AI Watchdog", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:622" - ] - }, - { - "call": "AI Watchdog settings saved. Restart watchdog to apply.", - "key": "AI Watchdog settings saved. Restart watchdog to apply.", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:449" - ] - }, { "call": "All", "key": "All", @@ -1281,8 +1212,7 @@ "call": "Auto-detects blocked domains from logs and adds them to the first section where they work via proxy.", "key": "Auto-detects blocked domains from logs and adds them to the first section where they work via proxy.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1976", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1197" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1976" ] }, { @@ -1423,13 +1353,6 @@ "src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:58" ] }, - { - "call": "Bearer Auth Token", - "key": "Bearer Auth Token", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:732" - ] - }, { "call": "Beginning of the schedule interval (e.g. 22:00)", "key": "Beginning of the schedule interval (e.g. 22:00)", @@ -2254,10 +2177,10 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10239", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1803", "src/partials/modal/renderModal.ts:263", - "src/tachyon/tabs/dashboard/initController.ts:1267", - "src/tachyon/tabs/diagnostic/initController.ts:1553", "src/tachyon/tabs/monitoring/initController.ts:893", "src/tachyon/tabs/monitoring/initController.ts:948", + "src/tachyon/tabs/dashboard/initController.ts:1267", + "src/tachyon/tabs/diagnostic/initController.ts:1553", "src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:227", "src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:178", "src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:871", @@ -2373,7 +2296,7 @@ "key": "compressed", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:6081", - "src/tachyon/helpers/singBoxVariant.ts:60" + "src/tachyon/helpers/singBoxVariant.ts:57" ] }, { @@ -2438,13 +2361,6 @@ "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:141" ] }, - { - "call": "Connect ChatGPT, DeepSeek or local LLM to get automated diagnostic reports and intelligent root-cause analysis.", - "key": "Connect ChatGPT, DeepSeek or local LLM to get automated diagnostic reports and intelligent root-cause analysis.", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:781" - ] - }, { "call": "Connect through", "key": "Connect through", @@ -2618,8 +2534,7 @@ "call": "Custom API Endpoint URL", "key": "Custom API Endpoint URL", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1824", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1059" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1824" ] }, { @@ -2672,13 +2587,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3497" ] }, - { - "call": "Custom interface/section", - "key": "Custom interface/section", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:884" - ] - }, { "call": "Custom OpenAI-Compatible API", "key": "Custom OpenAI-Compatible API", @@ -2772,8 +2680,7 @@ "key": "Default (Direct WAN / Default mixed proxy)", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1635", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1647", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:833" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1647" ] }, { @@ -2861,20 +2768,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:9486" ] }, - { - "call": "Device IPs (one per line):", - "key": "Device IPs (one per line):", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1270" - ] - }, - { - "call": "Device IPs saved", - "key": "Device IPs saved", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:305" - ] - }, { "call": "Device or IP", "key": "Device or IP", @@ -2897,13 +2790,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:236" ] }, - { - "call": "Devices listed here are always routed through the assigned section, regardless of global rules.", - "key": "Devices listed here are always routed through the assigned section, regardless of global rules.", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1308" - ] - }, { "call": "DHCP has DNS server", "key": "DHCP has DNS server", @@ -3206,15 +3092,7 @@ "call": "DNS Turbo Cache", "key": "DNS Turbo Cache", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:527" - ] - }, - { - "call": "DNS Turbo Cache saved", - "key": "DNS Turbo Cache saved", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:329" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995" ] }, { @@ -3612,13 +3490,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1758" ] }, - { - "call": "Enable AI Doctor (LLM Integration)", - "key": "Enable AI Doctor (LLM Integration)", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:796" - ] - }, { "call": "Enable Anomaly Detection", "key": "Enable Anomaly Detection", @@ -3677,13 +3548,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1888" ] }, - { - "call": "Enable DNS Turbo Cache", - "key": "Enable DNS Turbo Cache", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:546" - ] - }, { "call": "Enable Firewall Reload Dedup", "key": "Enable Firewall Reload Dedup", @@ -3744,8 +3608,7 @@ "call": "Enable RAG (Knowledge Base Retrieval)", "key": "Enable RAG (Knowledge Base Retrieval)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1840", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:810" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1840" ] }, { @@ -3759,8 +3622,7 @@ "call": "Enable Smart Detect", "key": "Enable Smart Detect", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1975", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1214" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1975" ] }, { @@ -4198,12 +4060,12 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19001", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19061", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19233", - "src/tachyon/methods/shell/index.ts:171", - "src/tachyon/methods/shell/index.ts:178", "src/tachyon/tabs/updates/initController.ts:661", "src/tachyon/tabs/updates/initController.ts:662", "src/tachyon/tabs/updates/initController.ts:739", - "src/tachyon/tabs/updates/initController.ts:953" + "src/tachyon/tabs/updates/initController.ts:953", + "src/tachyon/methods/shell/index.ts:171", + "src/tachyon/methods/shell/index.ts:178" ] }, { @@ -4347,27 +4209,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2434" ] }, - { - "call": "Failed to save AI Watchdog settings", - "key": "Failed to save AI Watchdog settings", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:453" - ] - }, - { - "call": "Failed to save device IPs", - "key": "Failed to save device IPs", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:313" - ] - }, - { - "call": "Failed to save DNS Turbo Cache", - "key": "Failed to save DNS Turbo Cache", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:331" - ] - }, { "call": "Failed to save fuzzer patterns", "key": "Failed to save fuzzer patterns", @@ -4384,13 +4225,6 @@ "src/tachyon/tabs/diagnostic/partials/renderStrategyFuzzerModal.ts:796" ] }, - { - "call": "Failed to save Smart Detect settings", - "key": "Failed to save Smart Detect settings", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:279" - ] - }, { "call": "Failed to save snapshot", "key": "Failed to save snapshot", @@ -4894,13 +4728,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:9248" ] }, - { - "call": "GET endpoints are open on LAN. POST endpoints require Authorization: Bearer .", - "key": "GET endpoints are open on LAN. POST endpoints require Authorization: Bearer .", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:767" - ] - }, { "call": "Get global check", "key": "Get global check", @@ -4963,13 +4790,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3237" ] }, - { - "call": "Health Checks", - "key": "Health Checks", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:630" - ] - }, { "call": "Hello! I am Tachyon AI Assistant. How can I help you today? Ask me about domain blocks, diagnostics, or router settings.", "key": "Hello! I am Tachyon AI Assistant. How can I help you today? Ask me about domain blocks, diagnostics, or router settings.", @@ -5234,13 +5054,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2977" ] }, - { - "call": "HTTP REST API for external AI agents (Claude, GPT, Open-WebUI) served at /cgi-bin/tachyon-agent/", - "key": "HTTP REST API for external AI agents (Claude, GPT, Open-WebUI) served at /cgi-bin/tachyon-agent/", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:727" - ] - }, { "call": "HWID", "key": "HWID", @@ -6398,8 +6211,7 @@ "call": "Keeps FakeIP cache persistent across reboots and pre-resolves popular blocked domains on startup so first-visit latency is 0 ms.", "key": "Keeps FakeIP cache persistent across reboots and pre-resolves popular blocked domains on startup so first-visit latency is 0 ms.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:532" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996" ] }, { @@ -6555,8 +6367,7 @@ "call": "LM Studio (Local PC / Server)", "key": "LM Studio (Local PC / Server)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1779", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:964" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1779" ] }, { @@ -6648,13 +6459,6 @@ "src/tachyon/tabs/updates/initController.ts:1276" ] }, - { - "call": "Loading…", - "key": "Loading…", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1318" - ] - }, { "call": "Local Address", "key": "Local Address", @@ -6674,7 +6478,7 @@ "key": "lx", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:6083", - "src/tachyon/helpers/singBoxVariant.ts:62" + "src/tachyon/helpers/singBoxVariant.ts:59" ] }, { @@ -6904,13 +6708,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:541" ] }, - { - "call": "Monitoring & Analytics", - "key": "Monitoring & Analytics", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:675" - ] - }, { "call": "Monitors sing-box reconnect frequency. Alerts if too many reconnects per hour.", "key": "Monitors sing-box reconnect frequency. Alerts if too many reconnects per hour.", @@ -6918,20 +6715,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1957" ] }, - { - "call": "Move down", - "key": "Move down", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1148" - ] - }, - { - "call": "Move up", - "key": "Move up", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1137" - ] - }, { "call": "MTU", "key": "MTU", @@ -7137,8 +6920,7 @@ "call": "No active routing sections found.", "key": "No active routing sections found.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:704", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1256" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:704" ] }, { @@ -7415,8 +7197,8 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19467", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19477", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19487", - "src/tachyon/helpers/singBoxVariant.ts:38", - "src/tachyon/helpers/singBoxVariant.ts:46", + "src/tachyon/helpers/singBoxVariant.ts:35", + "src/tachyon/helpers/singBoxVariant.ts:43", "src/tachyon/tabs/updates/initController.ts:1237", "src/tachyon/tabs/updates/initController.ts:1251", "src/tachyon/tabs/updates/initController.ts:1265", @@ -7585,8 +7367,7 @@ "call": "Ollama (Local PC / Server)", "key": "Ollama (Local PC / Server)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1778", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:956" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1778" ] }, { @@ -7687,13 +7468,6 @@ "src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31" ] }, - { - "call": "OpenWrt Network Interfaces", - "key": "OpenWrt Network Interfaces", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:860" - ] - }, { "call": "Operation completed successfully!", "key": "Operation completed successfully!", @@ -7756,13 +7530,6 @@ "src/tachyon/methods/shell/index.ts:577" ] }, - { - "call": "Optimization", - "key": "Optimization", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:704" - ] - }, { "call": "Optimize AWG MTU", "key": "Optimize AWG MTU", @@ -7802,13 +7569,6 @@ "src/tachyon/tabs/diagnostic/partials/renderStrategyFuzzerModal.ts:1018" ] }, - { - "call": "Optional for local LLM", - "key": "Optional for local LLM", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1045" - ] - }, { "call": "Optional tls-auth or tls-crypt key", "key": "Optional tls-auth or tls-crypt key", @@ -8088,14 +7848,6 @@ "src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:98" ] }, - { - "call": "Per-Device Routing", - "key": "Per-Device Routing", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1250", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1303" - ] - }, { "call": "Periodically check the current level and switch to a faster server even when the current one works.", "key": "Periodically check the current level and switch to a faster server even when the current one works.", @@ -8411,8 +8163,7 @@ "call": "Protection", "key": "Protection", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:291", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:657" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:291" ] }, { @@ -9317,8 +9068,7 @@ "key": "Save", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3669", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:673", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1295" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:673" ] }, { @@ -9328,20 +9078,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1721" ] }, - { - "call": "Save AI Watchdog Settings", - "key": "Save AI Watchdog Settings", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1097" - ] - }, - { - "call": "Save Smart Detect Settings", - "key": "Save Smart Detect Settings", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1235" - ] - }, { "call": "Save Snapshot", "key": "Save Snapshot", @@ -9350,16 +9086,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:645" ] }, - { - "call": "Saving…", - "key": "Saving…", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:550", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1095", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1235", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1295" - ] - }, { "call": "Schedule", "key": "Schedule", @@ -9429,13 +9155,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1746" ] }, - { - "call": "Secret token for WRITE requests", - "key": "Secret token for WRITE requests", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:738" - ] - }, { "call": "Section", "key": "Section", @@ -9458,13 +9177,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7262" ] }, - { - "call": "Section or network interface used for Cloudflare WARP API registration. Supports Tachyon sections (Connection, WireGuard, AmneziaWG, Interface) and OpenWrt system network devices/interfaces (awg0, wg0, tun0, etc.). Leave empty to use direct WAN / default mixed proxy.", - "key": "Section or network interface used for Cloudflare WARP API registration. Supports Tachyon sections (Connection, WireGuard, AmneziaWG, Interface) and OpenWrt system network devices/interfaces (awg0, wg0, tun0, etc.). Leave empty to use direct WAN / default mixed proxy.", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:894" - ] - }, { "call": "Section Rules Content", "key": "Section Rules Content", @@ -9472,13 +9184,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10231" ] }, - { - "call": "Section test order (checked = active, drag rows with △▽):", - "key": "Section test order (checked = active, drag rows with △▽):", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1222" - ] - }, { "call": "Section used for Cloudflare WARP API registration. If your ISP blocks Cloudflare API on WAN, select a proxy section (with Mixed proxy enabled) or a tunnel interface section (WireGuard / AmneziaWG / VPN). Leave empty to use direct WAN / default mixed proxy.", "key": "Section used for Cloudflare WARP API registration. If your ISP blocks Cloudflare API on WAN, select a proxy section (with Mixed proxy enabled) or a tunnel interface section (WireGuard / AmneziaWG / VPN). Leave empty to use direct WAN / default mixed proxy.", @@ -9970,9 +9675,9 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:3486", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:3505", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:14452", + "src/tachyon/tabs/diagnostic/initController.ts:609", "src/tachyon/methods/shell/index.ts:440", - "src/tachyon/methods/shell/index.ts:461", - "src/tachyon/tabs/diagnostic/initController.ts:609" + "src/tachyon/methods/shell/index.ts:461" ] }, { @@ -10248,20 +9953,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7638" ] }, - { - "call": "Smart Detect", - "key": "Smart Detect", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1192" - ] - }, - { - "call": "Smart Detect settings saved", - "key": "Smart Detect settings saved", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:277" - ] - }, { "call": "Snapshot name", "key": "Snapshot name", @@ -10554,13 +10245,6 @@ "src/tachyon/tabs/diagnostic/initController.ts:1082" ] }, - { - "call": "Start Watchdog first", - "key": "Start Watchdog first", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1098" - ] - }, { "call": "Starting…", "key": "Starting…", @@ -10585,7 +10269,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:11403", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:333", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:733", - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:497", "src/tachyon/tabs/dashboard/partials/renderSections.ts:670", "src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:481" ] @@ -10890,13 +10573,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6108" ] }, - { - "call": "Tachyon Sections", - "key": "Tachyon Sections", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:839" - ] - }, { "call": "Tachyon service is stopped. Start the service to display connections.", "key": "Tachyon service is stopped. Start the service to display connections.", @@ -11454,7 +11130,7 @@ "key": "tiny", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:6085", - "src/tachyon/helpers/singBoxVariant.ts:64" + "src/tachyon/helpers/singBoxVariant.ts:61" ] }, { @@ -11927,7 +11603,7 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:10170", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:10171", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:18827", - "src/tachyon/helpers/singBoxVariant.ts:37", + "src/tachyon/helpers/singBoxVariant.ts:34", "src/tachyon/services/systemInfo.service.ts:10", "src/tachyon/services/systemInfo.service.ts:12", "src/tachyon/services/systemInfo.service.ts:13", @@ -12615,20 +12291,6 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8430" ] }, - { - "call": "WARP Proxy Section", - "key": "WARP Proxy Section", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:814" - ] - }, - { - "call": "Watchdog", - "key": "Watchdog", - "places": [ - "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:494" - ] - }, { "call": "Watchdog probes every Connection section; when the active one fails several checks in a row, traffic switches to a healthy backup and Telegram is notified. Requires a config reload to take effect.", "key": "Watchdog probes every Connection section; when the active one fails several checks in a row, traffic switches to a healthy backup and Telegram is notified. Requires a config reload to take effect.", diff --git a/fe-app-tachyon/locales/tachyon.pot b/fe-app-tachyon/locales/tachyon.pot index 005532e1..ede07a91 100644 --- a/fe-app-tachyon/locales/tachyon.pot +++ b/fe-app-tachyon/locales/tachyon.pot @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: TACHYON\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-08-30 16:56+0300\n" -"PO-Revision-Date: 2026-08-30 16:56+0300\n" +"POT-Creation-Date: 2026-09-01 05:41+0300\n" +"PO-Revision-Date: 2026-09-01 05:41+0300\n" "Last-Translator: Dushnilin \n" "Language-Team: LANGUAGE \n" "Language: \n" @@ -57,18 +57,6 @@ msgstr "" msgid "+ Add URLTest" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:515 -msgid "⏹ Stop" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:515 -msgid "▶ Start" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1340 -msgid "⚙ Advanced Settings" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:13135 #: src/tachyon/tabs/diagnostic/partials/renderStrategyFuzzerModal.ts:1393 msgid "⚠️ Benchmark completed. No working bypass found for this target." @@ -136,7 +124,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:8364 #: src/tachyon/tabs/dashboard/initController.ts:1891 #: src/tachyon/tabs/dashboard/initController.ts:1900 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:505 msgid "✔ Running" msgstr "" @@ -149,7 +136,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:8364 #: src/tachyon/tabs/dashboard/initController.ts:1891 #: src/tachyon/tabs/dashboard/initController.ts:1900 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:505 msgid "✘ Stopped" msgstr "" @@ -203,10 +189,6 @@ msgstr "" msgid "🔍 Combinatorial Deep Fuzzing (~40-80+)" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:760 -msgid "🔑 Generate" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:12904 #: src/tachyon/tabs/diagnostic/partials/renderStrategyFuzzerModal.ts:1122 msgid "🗑️ Clear History" @@ -284,9 +266,9 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:16607 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:349 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:355 -#: src/tachyon/tabs/dashboard/initController.ts:1127 #: src/tachyon/tabs/monitoring/initController.ts:722 #: src/tachyon/tabs/monitoring/render.ts:20 +#: src/tachyon/tabs/dashboard/initController.ts:1127 msgid "Active" msgstr "" @@ -417,10 +399,6 @@ msgstr "" msgid "Adult content" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:627 -msgid "Advanced self-healing features. Requires Watchdog to be enabled." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:823 msgid "Advanced System" msgstr "" @@ -441,16 +419,11 @@ msgstr "" msgid "AI & Watchdog" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:722 -msgid "AI Agent REST API (12 Endpoints)" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1745 msgid "AI Agent REST API Bearer Token" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1813 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1037 msgid "AI API Key" msgstr "" @@ -469,10 +442,6 @@ msgstr "" msgid "AI Diagnostics & Strategy Rationale" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:776 -msgid "AI Doctor (ChatGPT / DeepSeek API)" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:15182 #: src/tachyon/tabs/diagnostic/initController.ts:1563 msgid "AI Doctor Diagnosis" @@ -488,7 +457,6 @@ msgid "AI Doctor failed" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1800 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1004 msgid "AI Doctor Language" msgstr "" @@ -503,12 +471,10 @@ msgid "AI DPI Engineer & Strategy Synthesizer" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1787 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:979 msgid "AI Model" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1770 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:901 msgid "AI Provider" msgstr "" @@ -532,14 +498,6 @@ msgstr "" msgid "AI synthesis failed" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:622 -msgid "AI Watchdog" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:449 -msgid "AI Watchdog settings saved. Restart watchdog to apply." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:12281 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:16041 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:16572 @@ -806,7 +764,6 @@ msgid "Auto-detected Domains" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1976 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1197 msgid "Auto-detects blocked domains from logs and adds them to the first section where they work via proxy." msgstr "" @@ -894,10 +851,6 @@ msgstr "" msgid "Basic connectivity" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:732 -msgid "Bearer Auth Token" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:875 msgid "Beginning of the schedule interval (e.g. 22:00)" msgstr "" @@ -1421,10 +1374,10 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10239 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1803 #: src/partials/modal/renderModal.ts:263 -#: src/tachyon/tabs/dashboard/initController.ts:1267 -#: src/tachyon/tabs/diagnostic/initController.ts:1553 #: src/tachyon/tabs/monitoring/initController.ts:893 #: src/tachyon/tabs/monitoring/initController.ts:948 +#: src/tachyon/tabs/dashboard/initController.ts:1267 +#: src/tachyon/tabs/diagnostic/initController.ts:1553 #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:227 #: src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:178 #: src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:871 @@ -1498,7 +1451,7 @@ msgid "Components" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:6081 -#: src/tachyon/helpers/singBoxVariant.ts:60 +#: src/tachyon/helpers/singBoxVariant.ts:57 msgid "compressed" msgstr "" @@ -1540,10 +1493,6 @@ msgstr "" msgid "Conflict" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:781 -msgid "Connect ChatGPT, DeepSeek or local LLM to get automated diagnostic reports and intelligent root-cause analysis." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:9031 msgid "Connect through" msgstr "" @@ -1651,7 +1600,6 @@ msgid "Custom" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1824 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1059 msgid "Custom API Endpoint URL" msgstr "" @@ -1684,10 +1632,6 @@ msgstr "" msgid "Custom header for handshake response" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:884 -msgid "Custom interface/section" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1780 msgid "Custom OpenAI-Compatible API" msgstr "" @@ -1742,7 +1686,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1635 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1647 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:833 msgid "Default (Direct WAN / Default mixed proxy)" msgstr "" @@ -1798,14 +1741,6 @@ msgstr "" msgid "Device filter" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1270 -msgid "Device IPs (one per line):" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:305 -msgid "Device IPs saved" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6970 msgid "Device or IP" msgstr "" @@ -1819,10 +1754,6 @@ msgstr "" msgid "Devices (MAC / IP)" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1308 -msgid "Devices listed here are always routed through the assigned section, regardless of global rules." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:9412 #: src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:37 msgid "DHCP has DNS server" @@ -2005,14 +1936,9 @@ msgid "DNS through section" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:527 msgid "DNS Turbo Cache" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:329 -msgid "DNS Turbo Cache saved" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:934 msgid "DNS Unavailability Timeout" msgstr "" @@ -2252,10 +2178,6 @@ msgstr "" msgid "Enable AI Doctor (ChatGPT / LLM Analysis)" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:796 -msgid "Enable AI Doctor (LLM Integration)" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1956 msgid "Enable Anomaly Detection" msgstr "" @@ -2290,10 +2212,6 @@ msgstr "" msgid "Enable DNS Continuous Check" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:546 -msgid "Enable DNS Turbo Cache" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1901 msgid "Enable Firewall Reload Dedup" msgstr "" @@ -2327,7 +2245,6 @@ msgid "Enable Proxy Health Monitor" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1840 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:810 msgid "Enable RAG (Knowledge Base Retrieval)" msgstr "" @@ -2336,7 +2253,6 @@ msgid "Enable Smart Cooldowns" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1975 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1214 msgid "Enable Smart Detect" msgstr "" @@ -2609,12 +2525,12 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19001 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19061 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19233 -#: src/tachyon/methods/shell/index.ts:171 -#: src/tachyon/methods/shell/index.ts:178 #: src/tachyon/tabs/updates/initController.ts:661 #: src/tachyon/tabs/updates/initController.ts:662 #: src/tachyon/tabs/updates/initController.ts:739 #: src/tachyon/tabs/updates/initController.ts:953 +#: src/tachyon/methods/shell/index.ts:171 +#: src/tachyon/methods/shell/index.ts:178 msgid "Failed to execute" msgstr "" @@ -2705,18 +2621,6 @@ msgstr "" msgid "Failed to run diagnostics — is the tachyon binary installed?" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:453 -msgid "Failed to save AI Watchdog settings" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:313 -msgid "Failed to save device IPs" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:331 -msgid "Failed to save DNS Turbo Cache" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:4145 #: src/tachyon/methods/shell/index.ts:1320 msgid "Failed to save fuzzer patterns" @@ -2727,10 +2631,6 @@ msgstr "" msgid "Failed to save patterns" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:279 -msgid "Failed to save Smart Detect settings" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:670 msgid "Failed to save snapshot" msgstr "" @@ -3039,10 +2939,6 @@ msgstr "" msgid "Germany (de)" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:767 -msgid "GET endpoints are open on LAN. POST endpoints require Authorization: Bearer ." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:10740 #: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:113 msgid "Get global check" @@ -3081,10 +2977,6 @@ msgstr "" msgid "Handshake timeout" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:630 -msgid "Health Checks" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:11750 #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:14 msgid "Hello! I am Tachyon AI Assistant. How can I help you today? Ask me about domain blocks, diagnostics, or router settings." @@ -3244,10 +3136,6 @@ msgstr "" msgid "HTTP hosts" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:727 -msgid "HTTP REST API for external AI agents (Claude, GPT, Open-WebUI) served at /cgi-bin/tachyon-agent/" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2473 msgid "HWID" msgstr "" @@ -3961,7 +3849,6 @@ msgid "Keep URLTest before latency-sorted servers" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:532 msgid "Keeps FakeIP cache persistent across reboots and pre-resolves popular blocked domains on startup so first-visit latency is 0 ms." msgstr "" @@ -4055,7 +3942,6 @@ msgid "Lists and rule sets successfully updated!" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1779 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:964 msgid "LM Studio (Local PC / Server)" msgstr "" @@ -4118,10 +4004,6 @@ msgstr "" msgid "Loading..." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1318 -msgid "Loading…" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8321 msgid "Local Address" msgstr "" @@ -4131,7 +4013,7 @@ msgid "Log Level" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:6083 -#: src/tachyon/helpers/singBoxVariant.ts:62 +#: src/tachyon/helpers/singBoxVariant.ts:59 msgid "lx" msgstr "" @@ -4269,22 +4151,10 @@ msgstr "" msgid "Monitoring" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:675 -msgid "Monitoring & Analytics" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1957 msgid "Monitors sing-box reconnect frequency. Alerts if too many reconnects per hour." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1148 -msgid "Move down" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1137 -msgid "Move up" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8384 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3379 msgid "MTU" @@ -4412,7 +4282,6 @@ msgid "No active DHCP clients found on local network." msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:704 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1256 msgid "No active routing sections found." msgstr "" @@ -4593,8 +4462,8 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19467 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19477 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19487 -#: src/tachyon/helpers/singBoxVariant.ts:38 -#: src/tachyon/helpers/singBoxVariant.ts:46 +#: src/tachyon/helpers/singBoxVariant.ts:35 +#: src/tachyon/helpers/singBoxVariant.ts:43 #: src/tachyon/tabs/updates/initController.ts:1237 #: src/tachyon/tabs/updates/initController.ts:1251 #: src/tachyon/tabs/updates/initController.ts:1265 @@ -4704,7 +4573,6 @@ msgid "Obfuscation password" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1778 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:956 msgid "Ollama (Local PC / Server)" msgstr "" @@ -4767,10 +4635,6 @@ msgstr "" msgid "Open Project Page" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:860 -msgid "OpenWrt Network Interfaces" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:18402 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:324 msgid "Operation completed successfully!" @@ -4812,10 +4676,6 @@ msgstr "" msgid "Operation timed out" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:704 -msgid "Optimization" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:14782 #: src/tachyon/tabs/diagnostic/initController.ts:1100 msgid "Optimize AWG MTU" @@ -4840,10 +4700,6 @@ msgstr "" msgid "Optional context (e.g. \"Rostelecom, YouTube 4K buffering is slow\")..." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1045 -msgid "Optional for local LLM" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8743 msgid "Optional tls-auth or tls-crypt key" msgstr "" @@ -5012,11 +4868,6 @@ msgstr "" msgid "Pending..." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1250 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1303 -msgid "Per-Device Routing" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3158 msgid "Periodically check the current level and switch to a faster server even when the current one works." msgstr "" @@ -5203,7 +5054,6 @@ msgid "Profile Name" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:291 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:657 msgid "Protection" msgstr "" @@ -5758,7 +5608,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3669 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:673 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1295 msgid "Save" msgstr "" @@ -5766,26 +5615,11 @@ msgstr "" msgid "Save a snapshot of the working config and restore it later if something breaks." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1097 -msgid "Save AI Watchdog Settings" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1235 -msgid "Save Smart Detect Settings" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:466 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:645 msgid "Save Snapshot" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:550 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1095 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1235 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1295 -msgid "Saving…" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:655 msgid "Schedule" msgstr "" @@ -5828,10 +5662,6 @@ msgstr "" msgid "Secret token for authorizing WRITE operations (POST/PUT) on /cgi-bin/tachyon-agent/. Leave empty if auth is not required." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:738 -msgid "Secret token for WRITE requests" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1654 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:437 msgid "Section" @@ -5845,18 +5675,10 @@ msgstr "" msgid "Section name" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:894 -msgid "Section or network interface used for Cloudflare WARP API registration. Supports Tachyon sections (Connection, WireGuard, AmneziaWG, Interface) and OpenWrt system network devices/interfaces (awg0, wg0, tun0, etc.). Leave empty to use direct WAN / default mixed proxy." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10231 msgid "Section Rules Content" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1222 -msgid "Section test order (checked = active, drag rows with △▽):" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1631 msgid "Section used for Cloudflare WARP API registration. If your ISP blocks Cloudflare API on WAN, select a proxy section (with Mixed proxy enabled) or a tunnel interface section (WireGuard / AmneziaWG / VPN). Leave empty to use direct WAN / default mixed proxy." msgstr "" @@ -6149,9 +5971,9 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:3486 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:3505 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:14452 +#: src/tachyon/tabs/diagnostic/initController.ts:609 #: src/tachyon/methods/shell/index.ts:440 #: src/tachyon/methods/shell/index.ts:461 -#: src/tachyon/tabs/diagnostic/initController.ts:609 msgid "Service action failed" msgstr "" @@ -6320,14 +6142,6 @@ msgstr "" msgid "Skipped loopback:" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1192 -msgid "Smart Detect" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:277 -msgid "Smart Detect settings saved" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:643 msgid "Snapshot name" msgstr "" @@ -6506,10 +6320,6 @@ msgstr "" msgid "Start watchdog" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1098 -msgid "Start Watchdog first" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:335 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2124 msgid "Starting…" @@ -6524,7 +6334,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:11403 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:333 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:733 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:497 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:670 #: src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:481 msgid "Status" @@ -6713,10 +6522,6 @@ msgstr "" msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:839 -msgid "Tachyon Sections" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:16822 #: src/tachyon/tabs/monitoring/initController.ts:991 msgid "Tachyon service is stopped. Start the service to display connections." @@ -7057,7 +6862,7 @@ msgid "Time skew tolerance" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:6085 -#: src/tachyon/helpers/singBoxVariant.ts:64 +#: src/tachyon/helpers/singBoxVariant.ts:61 msgid "tiny" msgstr "" @@ -7347,7 +7152,7 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:10170 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:10171 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:18827 -#: src/tachyon/helpers/singBoxVariant.ts:37 +#: src/tachyon/helpers/singBoxVariant.ts:34 #: src/tachyon/services/systemInfo.service.ts:10 #: src/tachyon/services/systemInfo.service.ts:12 #: src/tachyon/services/systemInfo.service.ts:13 @@ -7796,14 +7601,6 @@ msgstr "" msgid "WARP Private Key" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:814 -msgid "WARP Proxy Section" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:494 -msgid "Watchdog" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1516 msgid "Watchdog probes every Connection section; when the active one fails several checks in a row, traffic switches to a healthy backup and Telegram is notified. Requires a config reload to take effect." msgstr "" diff --git a/fe-app-tachyon/locales/tachyon.ru.po b/fe-app-tachyon/locales/tachyon.ru.po index e2ee7380..b7cadcae 100644 --- a/fe-app-tachyon/locales/tachyon.ru.po +++ b/fe-app-tachyon/locales/tachyon.ru.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: TACHYON\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-08-30 19:56+0300\n" -"PO-Revision-Date: 2026-08-30 19:56+0300\n" +"POT-Creation-Date: 2026-09-01 08:41+0300\n" +"PO-Revision-Date: 2026-09-01 08:41+0300\n" "Last-Translator: Dushnilin\n" "Language-Team: none\n" "Language: ru\n" @@ -41,15 +41,6 @@ msgstr "+ Добавить стратегию" msgid "+ Add URLTest" msgstr "+ Добавить URLTest" -msgid "⏹ Stop" -msgstr "⏹ Стоп" - -msgid "▶ Start" -msgstr "▶ Старт" - -msgid "⚙ Advanced Settings" -msgstr "⚙ Настройки" - msgid "⚠️ Benchmark completed. No working bypass found for this target." msgstr "⚠️ Бенчмарк завершен. Не найдено рабочих стратегий для данной цели." @@ -128,9 +119,6 @@ msgstr "🔄 Сбросить к заводским настройкам" msgid "🔍 Combinatorial Deep Fuzzing (~40-80+)" msgstr "🔍 Комбинаторный глубокий фаззинг (~40-80+)" -msgid "🔑 Generate" -msgstr "🔑 Сгенерировать" - msgid "🗑️ Clear History" msgstr "🗑️ Очистить историю" @@ -257,9 +245,6 @@ msgstr "Chat ID администраторов" msgid "Adult content" msgstr "Взрослый контент" -msgid "Advanced self-healing features. Requires Watchdog to be enabled." -msgstr "Расширенные функции самовосстановления. Требуется включённый Watchdog." - msgid "Advanced System" msgstr "Расширенные настройки" @@ -275,9 +260,6 @@ msgstr "Метод AEAD" msgid "AI & Watchdog" msgstr "ИИ и Watchdog" -msgid "AI Agent REST API (12 Endpoints)" -msgstr "HTTP REST API ИИ-агента (12 эндпоинтов)" - msgid "AI Agent REST API Bearer Token" msgstr "Токен Bearer для REST API ИИ-агента" @@ -293,9 +275,6 @@ msgstr "ИИ Чат-ассистент" msgid "AI Diagnostics & Strategy Rationale" msgstr "Диагностика ИИ и обоснование стратегий" -msgid "AI Doctor (ChatGPT / DeepSeek API)" -msgstr "AI Doctor (ChatGPT / DeepSeek API)" - msgid "AI Doctor Diagnosis" msgstr "Диагностика ИИ-доктора" @@ -329,12 +308,6 @@ msgstr "Ошибка генерации ИИ" msgid "AI synthesis failed" msgstr "Не удалось сгенерировать стратегии через ИИ" -msgid "AI Watchdog" -msgstr "ИИ Watchdog" - -msgid "AI Watchdog settings saved. Restart watchdog to apply." -msgstr "Настройки AI Watchdog сохранены. Перезапустите watchdog для применения." - msgid "All" msgstr "Все" @@ -563,9 +536,6 @@ msgstr "Ошибка проверки бэкенда: %s" msgid "Basic connectivity" msgstr "Базовая связность" -msgid "Bearer Auth Token" -msgstr "Токен авторизации (Bearer)" - msgid "Beginning of the schedule interval (e.g. 22:00)" msgstr "Начало интервала расписания (например, 22:00)" @@ -932,9 +902,6 @@ msgstr "Настройте User-Agent в параметрах элемента" msgid "Conflict" msgstr "Конфликт" -msgid "Connect ChatGPT, DeepSeek or local LLM to get automated diagnostic reports and intelligent root-cause analysis." -msgstr "Подключите ChatGPT, DeepSeek или локальную модель LLM для получения автоматических диагностических отчётов и умного анализа сетевых проблем." - msgid "Connect through" msgstr "Подключаться через" @@ -1022,9 +989,6 @@ msgstr "Пользовательский заголовок для инициа msgid "Custom header for handshake response" msgstr "Пользовательский заголовок для ответа рукопожатия" -msgid "Custom interface/section" -msgstr "Пользовательский интерфейс/секция" - msgid "Custom OpenAI-Compatible API" msgstr "Пользовательский OpenAI-совместимый API" @@ -1097,12 +1061,6 @@ msgstr "устр." msgid "Device filter" msgstr "Фильтр устройств" -msgid "Device IPs (one per line):" -msgstr "IP устройств (по одному на строку):" - -msgid "Device IPs saved" -msgstr "IP устройств сохранены" - msgid "Device or IP" msgstr "Устройство или IP" @@ -1112,9 +1070,6 @@ msgstr "Режим устройства обновлен" msgid "Devices (MAC / IP)" msgstr "Устройства (MAC / IP)" -msgid "Devices listed here are always routed through the assigned section, regardless of global rules." -msgstr "Устройства из этого списка всегда маршрутизируются через назначенную секцию, независимо от глобальных правил." - msgid "DHCP has DNS server" msgstr "DHCP содержит DNS сервер" @@ -1235,9 +1190,6 @@ msgstr "DNS через секцию" msgid "DNS Turbo Cache" msgstr "Быстрый DNS-кэш" -msgid "DNS Turbo Cache saved" -msgstr "DNS Turbo Cache сохранён" - msgid "DNS Unavailability Timeout" msgstr "Таймаут недоступности DNS" @@ -1394,9 +1346,6 @@ msgstr "Включить адаптивные интервалы" msgid "Enable AI Doctor (ChatGPT / LLM Analysis)" msgstr "Включить ИИ-доктора (анализ ChatGPT / LLM)" -msgid "Enable AI Doctor (LLM Integration)" -msgstr "Включить AI Doctor (интеграция с LLM)" - msgid "Enable Anomaly Detection" msgstr "Включить обнаружение аномалий" @@ -1421,9 +1370,6 @@ msgstr "Включить прямой обход WAN" msgid "Enable DNS Continuous Check" msgstr "Непрерывная проверка DNS" -msgid "Enable DNS Turbo Cache" -msgstr "Включить быстрый DNS-кэш" - msgid "Enable Firewall Reload Dedup" msgstr "Включить дедупликацию перезагрузки файрвола" @@ -1676,24 +1622,12 @@ msgstr "Не удалось восстановить снапшот" msgid "Failed to run diagnostics — is the tachyon binary installed?" msgstr "Не удалось запустить диагностику — установлен ли бинарник tachyon?" -msgid "Failed to save AI Watchdog settings" -msgstr "Ошибка сохранения настроек AI Watchdog" - -msgid "Failed to save device IPs" -msgstr "Ошибка сохранения IP устройств" - -msgid "Failed to save DNS Turbo Cache" -msgstr "Не удалось сохранить DNS Turbo Cache" - msgid "Failed to save fuzzer patterns" msgstr "Не удалось сохранить паттерны фаззера" msgid "Failed to save patterns" msgstr "Не удалось сохранить паттерны" -msgid "Failed to save Smart Detect settings" -msgstr "Ошибка сохранения настроек Smart Detect" - msgid "Failed to save snapshot" msgstr "Не удалось сохранить снапшот" @@ -1889,9 +1823,6 @@ msgstr "GeoSite / GeoIP" msgid "Germany (de)" msgstr "Германия (de)" -msgid "GET endpoints are open on LAN. POST endpoints require Authorization: Bearer ." -msgstr "GET-эндпоинты открыты в локальной сети. POST-эндпоинты требуют Authorization: Bearer ." - msgid "Get global check" msgstr "Получить глобальную проверку" @@ -1916,9 +1847,6 @@ msgstr "Сервис gRPC" msgid "Handshake timeout" msgstr "Таймаут рукопожатия" -msgid "Health Checks" -msgstr "Проверки здоровья" - msgid "Hello! I am Tachyon AI Assistant. How can I help you today? Ask me about domain blocks, diagnostics, or router settings." msgstr "Привет! Я ИИ-ассистент Tachyon. Чем могу помочь? Задайте вопрос о блокировках, диагностике или настройках роутера." @@ -2024,9 +1952,6 @@ msgstr "Ошибка HTTP" msgid "HTTP hosts" msgstr "HTTP хосты" -msgid "HTTP REST API for external AI agents (Claude, GPT, Open-WebUI) served at /cgi-bin/tachyon-agent/" -msgstr "HTTP REST API для внешних ИИ-агентов (Claude, GPT, Open-WebUI), доступен по адресу /cgi-bin/tachyon-agent/" - msgid "HWID" msgstr "HWID" @@ -2564,9 +2489,6 @@ msgstr "Получение списка сервисов..." msgid "Loading..." msgstr "Загрузка..." -msgid "Loading…" -msgstr "Загрузка…" - msgid "Local Address" msgstr "Локальный адрес" @@ -2669,18 +2591,9 @@ msgstr "Отслеживаемые интерфейсы" msgid "Monitoring" msgstr "Мониторинг" -msgid "Monitoring & Analytics" -msgstr "Мониторинг и аналитика" - msgid "Monitors sing-box reconnect frequency. Alerts if too many reconnects per hour." msgstr "Отслеживает частоту переподключений sing-box. Оповещает при слишком частых переподключениях." -msgid "Move down" -msgstr "Вниз" - -msgid "Move up" -msgstr "Вверх" - msgid "MTU" msgstr "MTU" @@ -2954,9 +2867,6 @@ msgstr "Откройте настройки приоритета и введит msgid "Open Project Page" msgstr "Открыть страницу проекта" -msgid "OpenWrt Network Interfaces" -msgstr "" - msgid "Operation completed successfully!" msgstr "Операция успешно завершена!" @@ -2978,9 +2888,6 @@ msgstr "Операция запущена. Ожидание вывода лог msgid "Operation timed out" msgstr "Время ожидания истекло" -msgid "Optimization" -msgstr "Оптимизация" - msgid "Optimize AWG MTU" msgstr "Оптимизировать MTU AWG" @@ -2996,9 +2903,6 @@ msgstr "Опционально — оставьте пустым для знач msgid "Optional context (e.g. \"Rostelecom, YouTube 4K buffering is slow\")..." msgstr "Дополнительный контекст (напр. «Ростелеком, YouTube 4K долго буферизуется»)..." -msgid "Optional for local LLM" -msgstr "Опционально для локальных LLM" - msgid "Optional tls-auth or tls-crypt key" msgstr "Опциональный ключ tls-auth или tls-crypt" @@ -3110,9 +3014,6 @@ msgstr "Ожидает запуска" msgid "Pending..." msgstr "Ожидание..." -msgid "Per-Device Routing" -msgstr "Маршрутизация по устройствам" - msgid "Periodically check the current level and switch to a faster server even when the current one works." msgstr "Периодически проверять текущий уровень и переключаться на более быстрый сервер, даже если текущий работает." @@ -3596,18 +3497,9 @@ msgstr "Сохранить" msgid "Save a snapshot of the working config and restore it later if something breaks." msgstr "Сохранить снапшот рабочей конфигурации, чтобы восстановить её позже, если что-то сломается." -msgid "Save AI Watchdog Settings" -msgstr "Сохранить настройки AI Watchdog" - -msgid "Save Smart Detect Settings" -msgstr "Сохранить настройки Smart Detect" - msgid "Save Snapshot" msgstr "Сохранить снапшот" -msgid "Saving…" -msgstr "Сохранение…" - msgid "Schedule" msgstr "Расписание" @@ -3635,9 +3527,6 @@ msgstr "Секретный ключ для аутентификации удал msgid "Secret token for authorizing WRITE operations (POST/PUT) on /cgi-bin/tachyon-agent/. Leave empty if auth is not required." msgstr "Секретный токен для авторизации операций записи (POST/PUT) на /cgi-bin/tachyon-agent/. Оставьте пустым, если аутентификация не требуется." -msgid "Secret token for WRITE requests" -msgstr "Секретный токен для POST/PUT запросов" - msgid "Section" msgstr "Секция" @@ -3647,15 +3536,9 @@ msgstr "Действие секции" msgid "Section name" msgstr "Имя секции" -msgid "Section or network interface used for Cloudflare WARP API registration. Supports Tachyon sections (Connection, WireGuard, AmneziaWG, Interface) and OpenWrt system network devices/interfaces (awg0, wg0, tun0, etc.). Leave empty to use direct WAN / default mixed proxy." -msgstr "" - msgid "Section Rules Content" msgstr "Содержимое правил секции" -msgid "Section test order (checked = active, drag rows with △▽):" -msgstr "Порядок проверки секций (галочка = активна, перетаскивайте △▽):" - msgid "Section used for Cloudflare WARP API registration. If your ISP blocks Cloudflare API on WAN, select a proxy section (with Mixed proxy enabled) or a tunnel interface section (WireGuard / AmneziaWG / VPN). Leave empty to use direct WAN / default mixed proxy." msgstr "Секция для регистрации Cloudflare WARP API. Если провайдер блокирует API Cloudflare на WAN, выберите секцию с прокси (с включённым смешанным прокси) или туннельный интерфейс (WireGuard / AmneziaWG / VPN). Оставьте пустым для прямого WAN / стандартного смешанного прокси." @@ -3962,12 +3845,6 @@ msgstr "Пропущены комментарии/невалидные:" msgid "Skipped loopback:" msgstr "Пропущены loopback:" -msgid "Smart Detect" -msgstr "Smart Detect" - -msgid "Smart Detect settings saved" -msgstr "Настройки Smart Detect сохранены" - msgid "Snapshot name" msgstr "Имя снапшота" @@ -4082,9 +3959,6 @@ msgstr "Время начала (ЧЧ:ММ)" msgid "Start watchdog" msgstr "Запустить watchdog" -msgid "Start Watchdog first" -msgstr "Сначала запустите Watchdog" - msgid "Starting…" msgstr "Запуск…" @@ -4211,9 +4085,6 @@ msgstr "Tachyon управляет жизненным циклом процес msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." msgstr "Tachyon управляет жизненным циклом процесса nfqws2 самостоятельно, поэтому режим daemon здесь не допускается." -msgid "Tachyon Sections" -msgstr "" - msgid "Tachyon service is stopped. Start the service to display connections." msgstr "Служба Tachyon остановлена. Запустите сервис для отображения подключений." @@ -4853,12 +4724,6 @@ msgstr "Секция прокси для генератора WARP" msgid "WARP Private Key" msgstr "Приватный ключ WARP" -msgid "WARP Proxy Section" -msgstr "Секция прокси WARP" - -msgid "Watchdog" -msgstr "Сторожевой таймер" - msgid "Watchdog probes every Connection section; when the active one fails several checks in a row, traffic switches to a healthy backup and Telegram is notified. Requires a config reload to take effect." msgstr "Watchdog проверяет каждую Connection-секцию; если активная падает несколько проверок подряд, трафик переключается на живую резервную, а Telegram получает уведомление. Нужен reload конфигурации." @@ -4958,6 +4823,141 @@ msgstr "sing-box outbound для Zapret2 настроен" msgid "Zapret2 sing-box outbound is not configured" msgstr "sing-box outbound для Zapret2 не настроен" +msgid "⏹ Stop" +msgstr "⏹ Стоп" + +msgid "▶ Start" +msgstr "▶ Старт" + +msgid "⚙ Advanced Settings" +msgstr "⚙ Настройки" + +msgid "🔑 Generate" +msgstr "🔑 Сгенерировать" + +msgid "Advanced self-healing features. Requires Watchdog to be enabled." +msgstr "Расширенные функции самовосстановления. Требуется включённый Watchdog." + +msgid "AI Agent REST API (12 Endpoints)" +msgstr "HTTP REST API ИИ-агента (12 эндпоинтов)" + +msgid "AI Doctor (ChatGPT / DeepSeek API)" +msgstr "AI Doctor (ChatGPT / DeepSeek API)" + +msgid "AI Watchdog" +msgstr "ИИ Watchdog" + +msgid "AI Watchdog settings saved. Restart watchdog to apply." +msgstr "Настройки AI Watchdog сохранены. Перезапустите watchdog для применения." + +msgid "Bearer Auth Token" +msgstr "Токен авторизации (Bearer)" + +msgid "Connect ChatGPT, DeepSeek or local LLM to get automated diagnostic reports and intelligent root-cause analysis." +msgstr "Подключите ChatGPT, DeepSeek или локальную модель LLM для получения автоматических диагностических отчётов и умного анализа сетевых проблем." + +msgid "Custom interface/section" +msgstr "Пользовательский интерфейс/секция" + +msgid "Device IPs (one per line):" +msgstr "IP устройств (по одному на строку):" + +msgid "Device IPs saved" +msgstr "IP устройств сохранены" + +msgid "Devices listed here are always routed through the assigned section, regardless of global rules." +msgstr "Устройства из этого списка всегда маршрутизируются через назначенную секцию, независимо от глобальных правил." + +msgid "DNS Turbo Cache saved" +msgstr "DNS Turbo Cache сохранён" + +msgid "Enable AI Doctor (LLM Integration)" +msgstr "Включить AI Doctor (интеграция с LLM)" + +msgid "Enable DNS Turbo Cache" +msgstr "Включить быстрый DNS-кэш" + +msgid "Failed to save AI Watchdog settings" +msgstr "Ошибка сохранения настроек AI Watchdog" + +msgid "Failed to save device IPs" +msgstr "Ошибка сохранения IP устройств" + +msgid "Failed to save DNS Turbo Cache" +msgstr "Не удалось сохранить DNS Turbo Cache" + +msgid "Failed to save Smart Detect settings" +msgstr "Ошибка сохранения настроек Smart Detect" + +msgid "GET endpoints are open on LAN. POST endpoints require Authorization: Bearer ." +msgstr "GET-эндпоинты открыты в локальной сети. POST-эндпоинты требуют Authorization: Bearer ." + +msgid "Health Checks" +msgstr "Проверки здоровья" + +msgid "HTTP REST API for external AI agents (Claude, GPT, Open-WebUI) served at /cgi-bin/tachyon-agent/" +msgstr "HTTP REST API для внешних ИИ-агентов (Claude, GPT, Open-WebUI), доступен по адресу /cgi-bin/tachyon-agent/" + +msgid "Loading…" +msgstr "Загрузка…" + +msgid "Monitoring & Analytics" +msgstr "Мониторинг и аналитика" + +msgid "Move down" +msgstr "Вниз" + +msgid "Move up" +msgstr "Вверх" + +msgid "OpenWrt Network Interfaces" +msgstr "" + +msgid "Optimization" +msgstr "Оптимизация" + +msgid "Optional for local LLM" +msgstr "Опционально для локальных LLM" + +msgid "Per-Device Routing" +msgstr "Маршрутизация по устройствам" + +msgid "Save AI Watchdog Settings" +msgstr "Сохранить настройки AI Watchdog" + +msgid "Save Smart Detect Settings" +msgstr "Сохранить настройки Smart Detect" + +msgid "Saving…" +msgstr "Сохранение…" + +msgid "Secret token for WRITE requests" +msgstr "Секретный токен для POST/PUT запросов" + +msgid "Section or network interface used for Cloudflare WARP API registration. Supports Tachyon sections (Connection, WireGuard, AmneziaWG, Interface) and OpenWrt system network devices/interfaces (awg0, wg0, tun0, etc.). Leave empty to use direct WAN / default mixed proxy." +msgstr "" + +msgid "Section test order (checked = active, drag rows with △▽):" +msgstr "Порядок проверки секций (галочка = активна, перетаскивайте △▽):" + +msgid "Smart Detect" +msgstr "Smart Detect" + +msgid "Smart Detect settings saved" +msgstr "Настройки Smart Detect сохранены" + +msgid "Start Watchdog first" +msgstr "Сначала запустите Watchdog" + +msgid "Tachyon Sections" +msgstr "" + +msgid "WARP Proxy Section" +msgstr "Секция прокси WARP" + +msgid "Watchdog" +msgstr "Сторожевой таймер" + msgid "Section or tunnel interface used for Cloudflare WARP API registration. Supports Connection, WireGuard, AmneziaWG, and Interface sections. Leave empty to use direct WAN / default mixed proxy." msgstr "Секция или туннельный интерфейс для регистрации Cloudflare WARP API. Поддерживает секции Connection, WireGuard, AmneziaWG и Interface. Оставьте пустым для прямого WAN / стандартного mixed proxy." diff --git a/fe-app-tachyon/package-lock.json b/fe-app-tachyon/package-lock.json index 4e85eae7..8a36c1f8 100644 --- a/fe-app-tachyon/package-lock.json +++ b/fe-app-tachyon/package-lock.json @@ -1,12 +1,12 @@ { "name": "fe-app-tachyon", - "version": "1.3.8", + "version": "1.3.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "fe-app-tachyon", - "version": "1.3.8", + "version": "1.3.9", "license": "MIT", "devDependencies": { "@babel/parser": "7.28.4", diff --git a/fe-app-tachyon/package.json b/fe-app-tachyon/package.json index 9c6ba1ab..65dd3415 100644 --- a/fe-app-tachyon/package.json +++ b/fe-app-tachyon/package.json @@ -1,6 +1,6 @@ { "name": "fe-app-tachyon", - "version": "1.3.8", + "version": "1.3.9", "license": "MIT", "type": "module", "scripts": { diff --git a/fe-app-tachyon/src/tachyon/helpers/singBoxVariant.ts b/fe-app-tachyon/src/tachyon/helpers/singBoxVariant.ts index ba136e18..5a454f22 100644 --- a/fe-app-tachyon/src/tachyon/helpers/singBoxVariant.ts +++ b/fe-app-tachyon/src/tachyon/helpers/singBoxVariant.ts @@ -8,17 +8,13 @@ type SingBoxVariantFields = { sing_box_repo_url?: string; }; -export function isExtendedSingBoxVersion(version?: string) { +function isExtendedSingBoxVersion(version?: string) { return ( String(version || '').includes('extended') || String(version || '').includes('-lx') ); } -export function isLxSingBoxVersion(version?: string) { - return String(version || '').includes('-lx'); -} - function isVersionPlaceholder(version?: string) { const normalized = String(version || '') .trim() diff --git a/fe-app-tachyon/src/tachyon/runtimeTags.ts b/fe-app-tachyon/src/tachyon/runtimeTags.ts index 2ec10617..25dfa2d6 100644 --- a/fe-app-tachyon/src/tachyon/runtimeTags.ts +++ b/fe-app-tachyon/src/tachyon/runtimeTags.ts @@ -13,7 +13,7 @@ const RESERVED_RUNTIME_TAGS = new Set([ 'bypass-out', ]); -export function allocateRuntimeTag(base: string, postfix: string): string { +function allocateRuntimeTag(base: string, postfix: string): string { let suffix = 1; let candidate = `${base}-${postfix}`; diff --git a/fe-app-tachyon/src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts b/fe-app-tachyon/src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts deleted file mode 100644 index 831646bd..00000000 --- a/fe-app-tachyon/src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts +++ /dev/null @@ -1,1354 +0,0 @@ -import { TachyonShellMethods } from '../../../methods'; -import { showToast } from '../../../../helpers/showToast'; -import { getConfigSections } from '../../../methods/custom/getConfigSections'; -import { - fetchNetworkInterfaces, - AdvNetworkDevice, -} from '../../../fetchers/fetchNetworkInterfaces'; -import { TACHYON_UCI_PACKAGE } from '../../../../constants'; - -// ─── Types ─────────────────────────────────────────────────────────────────── - -export interface AdvSectionOption { - id: string; - label: string; - action: string; - iface?: string; -} - -interface AdvancedSettingsState { - watchdogRunning: boolean; - watchdogLoading: boolean; - smartDetectEnabled: boolean; - smartDetectSections: string[]; - allSectionNames: string[]; - sectionOptions: AdvSectionOption[]; - networkDevices: AdvNetworkDevice[]; - deviceIpsPerSection: Record; - dnsTurboCache: boolean; - agentApiToken: string; - enableAiDoctor: boolean; - aiDoctorProvider: string; - aiDoctorModel: string; - aiDoctorLang: string; - aiDoctorApiKey: string; - aiDoctorCustomUrl: string; - enableRag: boolean; - warpProxySection: string; - aiWatchdog: { - proxyHealthEnabled: boolean; - proxyHealthInterval: string; - proxyHealthFailThreshold: string; - proxyHealthUrl: string; - dnsContinuousEnabled: boolean; - dnsInterval: string; - reloadDedupEnabled: boolean; - metricsEnabled: boolean; - metricsRetentionHours: string; - smartCooldownsEnabled: boolean; - configValidationEnabled: boolean; - gracefulDegradationEnabled: boolean; - persistentSmartDetect: boolean; - adaptiveIntervalsEnabled: boolean; - anomalyDetectionEnabled: boolean; - anomalyReconnectThreshold: string; - }; - saving: boolean; - loaded: boolean; -} - -let _state: AdvancedSettingsState = { - watchdogRunning: false, - watchdogLoading: false, - smartDetectEnabled: false, - smartDetectSections: [], - allSectionNames: [], - sectionOptions: [], - networkDevices: [], - deviceIpsPerSection: {}, - dnsTurboCache: false, - agentApiToken: '', - enableAiDoctor: false, - aiDoctorProvider: 'openai', - aiDoctorModel: '', - aiDoctorLang: 'ru', - aiDoctorApiKey: '', - aiDoctorCustomUrl: '', - enableRag: true, - warpProxySection: '', - aiWatchdog: { - proxyHealthEnabled: true, - proxyHealthInterval: '30', - proxyHealthFailThreshold: '3', - proxyHealthUrl: 'https://cp.cloudflare.com/generate_204', - dnsContinuousEnabled: true, - dnsInterval: '60', - reloadDedupEnabled: true, - metricsEnabled: true, - metricsRetentionHours: '24', - smartCooldownsEnabled: true, - configValidationEnabled: true, - gracefulDegradationEnabled: true, - persistentSmartDetect: true, - adaptiveIntervalsEnabled: true, - anomalyDetectionEnabled: true, - anomalyReconnectThreshold: '10', - }, - saving: false, - loaded: false, -}; - -// ─── Rerender ──────────────────────────────────────────────────────────────── - -function rerender() { - const el = document.getElementById('tachyon-advanced-settings'); - if (!el) return; - const inner = document.getElementById('tachyon-advanced-settings-inner'); - if (!inner) return; - const next = renderAdvancedSettingsBody(_state); - inner.replaceChildren(...(Array.isArray(next) ? next : [next])); -} - -// ─── Data loading ───────────────────────────────────────────────────────────── - -export async function loadAdvancedSettingsState() { - const [sections, networkDevices] = await Promise.all([ - getConfigSections(), - fetchNetworkInterfaces(), - ]); - - const settingsSec = sections.find((s) => s['.type'] === 'settings'); - const smartDetect = settingsSec?.smart_detect === '1'; - - const raw = settingsSec?.smart_detect_sections; - const smartDetectSections: string[] = Array.isArray(raw) - ? raw - : raw && typeof raw === 'string' && raw.trim() - ? [raw.trim()] - : []; - - const ruleSections = sections.filter( - (s) => - s['.type'] === 'section' && - s.enabled !== '0' && - (s.action as string) !== 'bypass' && - (s.action as string) !== 'block' && - (s.action as string) !== 'dns', - ); - const allSectionNames = ruleSections.map((s) => s['.name'] as string); - - const sectionOptions: AdvSectionOption[] = sections - .filter((s) => s['.type'] === 'section' && s.enabled !== '0') - .map((s) => { - const rawSec = s as unknown as Record; - return { - id: s['.name'] as string, - label: (s.label as string) || (s['.name'] as string), - action: (s.action as string) || 'section', - iface: - (rawSec.section_interface as string) || - (rawSec.interface as string) || - undefined, - }; - }); - - const deviceIpsPerSection: Record = {}; - for (const s of ruleSections) { - const name = s['.name'] as string; - const ips = s.fully_routed_ips; - deviceIpsPerSection[name] = Array.isArray(ips) - ? ips - : ips && typeof ips === 'string' && ips.trim() - ? [ips.trim()] - : []; - } - - const wdRes = await TachyonShellMethods.getWatchdogStatus(); - const watchdogRunning: boolean = wdRes.success - ? (wdRes as { data: { running: boolean } }).data.running - : false; - - _state = { - ..._state, - watchdogRunning, - smartDetectEnabled: smartDetect, - smartDetectSections: - smartDetectSections.length > 0 - ? smartDetectSections - : allSectionNames.slice(0, 1), - allSectionNames, - sectionOptions, - networkDevices, - deviceIpsPerSection, - dnsTurboCache: settingsSec?.dns_turbo_cache === '1', - agentApiToken: - ((settingsSec as unknown as Record) - ?.agent_api_token as string) || '', - enableAiDoctor: - (settingsSec as unknown as Record)?.enable_ai_doctor === - '1', - aiDoctorProvider: - ((settingsSec as unknown as Record) - ?.ai_doctor_provider as string) || 'openai', - aiDoctorModel: - ((settingsSec as unknown as Record) - ?.ai_doctor_model as string) || '', - aiDoctorLang: - ((settingsSec as unknown as Record) - ?.ai_doctor_lang as string) || 'ru', - aiDoctorApiKey: - ((settingsSec as unknown as Record) - ?.ai_doctor_api_key as string) || '', - aiDoctorCustomUrl: - ((settingsSec as unknown as Record) - ?.ai_doctor_custom_url as string) || '', - enableRag: - (settingsSec as unknown as Record)?.enable_rag !== '0', - warpProxySection: - ((settingsSec as unknown as Record) - ?.warp_proxy_section as string) || '', - aiWatchdog: { - proxyHealthEnabled: settingsSec?.ai_proxy_health_enabled !== '0', - proxyHealthInterval: - (settingsSec?.ai_proxy_health_interval as string) || '30', - proxyHealthFailThreshold: - (settingsSec?.ai_proxy_health_fail_threshold as string) || '3', - proxyHealthUrl: - (settingsSec?.ai_proxy_health_url as string) || - 'https://cp.cloudflare.com/generate_204', - dnsContinuousEnabled: settingsSec?.ai_dns_continuous_enabled !== '0', - dnsInterval: (settingsSec?.ai_dns_interval as string) || '60', - reloadDedupEnabled: settingsSec?.ai_reload_dedup_enabled !== '0', - metricsEnabled: settingsSec?.ai_metrics_enabled !== '0', - metricsRetentionHours: - (settingsSec?.ai_metrics_retention_hours as string) || '24', - smartCooldownsEnabled: settingsSec?.ai_smart_cooldowns_enabled !== '0', - configValidationEnabled: - settingsSec?.ai_config_validation_enabled !== '0', - gracefulDegradationEnabled: - settingsSec?.ai_graceful_degradation_enabled !== '0', - persistentSmartDetect: settingsSec?.ai_persistent_smart_detect !== '0', - adaptiveIntervalsEnabled: - settingsSec?.ai_adaptive_intervals_enabled !== '0', - anomalyDetectionEnabled: - settingsSec?.ai_anomaly_detection_enabled !== '0', - anomalyReconnectThreshold: - (settingsSec?.ai_anomaly_reconnect_threshold as string) || '10', - }, - loaded: true, - }; - rerender(); -} - -// ─── Actions ────────────────────────────────────────────────────────────────── - -async function toggleWatchdog() { - _state = { ..._state, watchdogLoading: true }; - rerender(); - if (_state.watchdogRunning) { - await TachyonShellMethods.watchdogStop(); - } else { - await TachyonShellMethods.watchdogStart(); - } - const wdRes = await TachyonShellMethods.getWatchdogStatus(); - const running = wdRes.success - ? (wdRes as { data: { running: boolean } }).data.running - : _state.watchdogRunning; - _state = { ..._state, watchdogRunning: running, watchdogLoading: false }; - rerender(); -} - -async function saveSmartDetect() { - _state = { ..._state, saving: true }; - rerender(); - try { - await TachyonShellMethods.uciRunCommand([ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.smart_detect=${_state.smartDetectEnabled ? '1' : '0'}`, - ]); - await TachyonShellMethods.uciRunCommand([ - 'delete', - `${TACHYON_UCI_PACKAGE}.settings.smart_detect_sections`, - ]); - for (const sec of _state.smartDetectSections) { - await TachyonShellMethods.uciRunCommand([ - 'add_list', - `${TACHYON_UCI_PACKAGE}.settings.smart_detect_sections=${sec}`, - ]); - } - await TachyonShellMethods.uciRunCommand(['commit', TACHYON_UCI_PACKAGE]); - showToast(_('Smart Detect settings saved'), 'success'); - } catch { - showToast(_('Failed to save Smart Detect settings'), 'error'); - } - _state = { ..._state, saving: false }; - rerender(); -} - -async function saveDeviceIps(sectionName: string, ipsText: string) { - _state = { ..._state, saving: true }; - rerender(); - try { - const ips = ipsText - .split('\n') - .map((l) => l.trim()) - .filter(Boolean); - await TachyonShellMethods.uciRunCommand([ - 'delete', - `${TACHYON_UCI_PACKAGE}.${sectionName}.fully_routed_ips`, - ]); - for (const ip of ips) { - await TachyonShellMethods.uciRunCommand([ - 'add_list', - `${TACHYON_UCI_PACKAGE}.${sectionName}.fully_routed_ips=${ip}`, - ]); - } - await TachyonShellMethods.uciRunCommand(['commit', TACHYON_UCI_PACKAGE]); - _state.deviceIpsPerSection[sectionName] = ips; - showToast(_('Device IPs saved'), 'success'); - // Reload tachyon async so UI stays responsive - void TachyonShellMethods.uciRunCommand([ - '-q', - 'commit', - TACHYON_UCI_PACKAGE, - ]); - } catch { - showToast(_('Failed to save device IPs'), 'error'); - } - _state = { ..._state, saving: false }; - rerender(); -} - -async function saveDnsTurboCache(enabled: boolean) { - _state = { ..._state, saving: true }; - rerender(); - try { - await TachyonShellMethods.uciRunCommand([ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.dns_turbo_cache=${enabled ? '1' : '0'}`, - ]); - await TachyonShellMethods.uciRunCommand(['commit', TACHYON_UCI_PACKAGE]); - _state = { ..._state, dnsTurboCache: enabled }; - showToast(_('DNS Turbo Cache saved'), 'success'); - } catch { - showToast(_('Failed to save DNS Turbo Cache'), 'error'); - } - _state = { ..._state, saving: false }; - rerender(); -} - -async function saveAiWatchdogSettings() { - _state = { ..._state, saving: true }; - rerender(); - try { - const ai = _state.aiWatchdog; - const cmds: string[][] = [ - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.agent_api_token=${_state.agentApiToken}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.enable_ai_doctor=${_state.enableAiDoctor ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_doctor_provider=${_state.aiDoctorProvider}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_doctor_model=${_state.aiDoctorModel}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_doctor_lang=${_state.aiDoctorLang}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_doctor_api_key=${_state.aiDoctorApiKey}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_doctor_custom_url=${_state.aiDoctorCustomUrl}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.enable_rag=${_state.enableRag ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.warp_proxy_section=${_state.warpProxySection}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_proxy_health_enabled=${ai.proxyHealthEnabled ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_proxy_health_interval=${ai.proxyHealthInterval}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_proxy_health_fail_threshold=${ai.proxyHealthFailThreshold}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_proxy_health_url=${ai.proxyHealthUrl}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_dns_continuous_enabled=${ai.dnsContinuousEnabled ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_dns_interval=${ai.dnsInterval}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_reload_dedup_enabled=${ai.reloadDedupEnabled ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_metrics_enabled=${ai.metricsEnabled ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_metrics_retention_hours=${ai.metricsRetentionHours}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_smart_cooldowns_enabled=${ai.smartCooldownsEnabled ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_config_validation_enabled=${ai.configValidationEnabled ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_graceful_degradation_enabled=${ai.gracefulDegradationEnabled ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_persistent_smart_detect=${ai.persistentSmartDetect ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_adaptive_intervals_enabled=${ai.adaptiveIntervalsEnabled ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_anomaly_detection_enabled=${ai.anomalyDetectionEnabled ? '1' : '0'}`, - ], - [ - 'set', - `${TACHYON_UCI_PACKAGE}.settings.ai_anomaly_reconnect_threshold=${ai.anomalyReconnectThreshold}`, - ], - ]; - for (const cmd of cmds) { - await TachyonShellMethods.uciRunCommand(cmd); - } - await TachyonShellMethods.uciRunCommand(['commit', TACHYON_UCI_PACKAGE]); - showToast( - _('AI Watchdog settings saved. Restart watchdog to apply.'), - 'success', - ); - } catch { - showToast(_('Failed to save AI Watchdog settings'), 'error'); - } - _state = { ..._state, saving: false }; - rerender(); -} - -function moveSectionUp(idx: number) { - if (idx <= 0) return; - const arr = [..._state.smartDetectSections]; - [arr[idx - 1], arr[idx]] = [arr[idx], arr[idx - 1]]; - _state = { ..._state, smartDetectSections: arr }; - rerender(); -} - -function moveSectionDown(idx: number) { - const arr = [..._state.smartDetectSections]; - if (idx >= arr.length - 1) return; - [arr[idx], arr[idx + 1]] = [arr[idx + 1], arr[idx]]; - _state = { ..._state, smartDetectSections: arr }; - rerender(); -} - -function toggleSectionInList(sectionName: string, checked: boolean) { - let arr = [..._state.smartDetectSections]; - if (checked && !arr.includes(sectionName)) { - arr.push(sectionName); - } else if (!checked) { - arr = arr.filter((s) => s !== sectionName); - } - _state = { ..._state, smartDetectSections: arr }; - rerender(); -} - -// ─── Render ─────────────────────────────────────────────────────────────────── - -function renderWatchdogSection(state: AdvancedSettingsState) { - const { watchdogRunning, watchdogLoading } = state; - - return E('div', { class: 'tachyon_adv__section' }, [ - E('div', { class: 'tachyon_adv__section-header' }, [ - E('span', { class: 'tachyon_adv__section-icon' }, '🐕'), - E('h3', { class: 'tachyon_adv__section-title' }, _('Watchdog')), - ]), - E('div', { class: 'tachyon_adv__row' }, [ - E('span', { class: 'tachyon_adv__label' }, _('Status')), - E( - 'span', - { - class: watchdogRunning - ? 'tachyon_adv__badge tachyon_adv__badge--ok' - : 'tachyon_adv__badge tachyon_adv__badge--err', - }, - watchdogRunning ? _('✔ Running') : _('✘ Stopped'), - ), - E( - 'button', - { - class: `btn cbi-button ${watchdogRunning ? 'cbi-button-negative' : 'cbi-button-action'} tachyon_adv__ctrl-btn`, - type: 'button', - disabled: watchdogLoading, - onclick: () => void toggleWatchdog(), - }, - watchdogLoading ? '…' : watchdogRunning ? _('⏹ Stop') : _('▶ Start'), - ), - ]), - ]); -} - -function renderDnsTurboCacheSection(state: AdvancedSettingsState) { - const { dnsTurboCache, saving } = state; - - return E('div', { class: 'tachyon_adv__section' }, [ - E('div', { class: 'tachyon_adv__section-header' }, [ - E('span', { class: 'tachyon_adv__section-icon' }, '⚡'), - E('h3', { class: 'tachyon_adv__section-title' }, _('DNS Turbo Cache')), - ]), - E( - 'p', - { class: 'tachyon_adv__hint' }, - _( - 'Keeps FakeIP cache persistent across reboots and pre-resolves popular blocked domains on startup so first-visit latency is 0\u00a0ms.', - ), - ), - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__toggle' }, [ - E('input', { - type: 'checkbox', - checked: dnsTurboCache, - onchange: (e: Event) => { - const enabled = (e.target as HTMLInputElement).checked; - void saveDnsTurboCache(enabled); - }, - }), - E('span', {}, _('Enable DNS Turbo Cache')), - ]), - ]), - saving - ? E('span', { class: 'tachyon_adv__hint' }, _('Saving…')) - : E('span', {}), - ]); -} - -function renderAiWatchdogSection(state: AdvancedSettingsState) { - const { aiWatchdog, saving, watchdogRunning } = state; - - const toggle = (key: keyof typeof aiWatchdog, label: string) => - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__toggle' }, [ - E('input', { - type: 'checkbox', - checked: Boolean(aiWatchdog[key]), - onchange: (e: Event) => { - const val = (e.target as HTMLInputElement).checked; - _state = { - ..._state, - aiWatchdog: { ..._state.aiWatchdog, [key]: val }, - }; - rerender(); - }, - }), - E('span', {}, _(label)), - ]), - ]); - - const numInput = ( - key: keyof typeof aiWatchdog, - label: string, - hint: string, - min: number, - ) => - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__label' }, _(label)), - E('input', { - type: 'number', - class: 'cbi-input-text', - value: aiWatchdog[key] as string, - min: String(min), - onchange: (e: Event) => { - const val = (e.target as HTMLInputElement).value; - _state = { - ..._state, - aiWatchdog: { ..._state.aiWatchdog, [key]: val }, - }; - }, - }), - E('span', { class: 'tachyon_adv__hint' }, _(hint)), - ]); - - const textInput = (key: keyof typeof aiWatchdog, label: string) => - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__label' }, _(label)), - E('input', { - type: 'text', - class: 'cbi-input-text', - value: aiWatchdog[key] as string, - style: 'width: 100%;', - onchange: (e: Event) => { - const val = (e.target as HTMLInputElement).value; - _state = { - ..._state, - aiWatchdog: { ..._state.aiWatchdog, [key]: val }, - }; - }, - }), - ]); - - return E('div', { class: 'tachyon_adv__section' }, [ - E('div', { class: 'tachyon_adv__section-header' }, [ - E('span', { class: 'tachyon_adv__section-icon' }, '🤖'), - E('h3', { class: 'tachyon_adv__section-title' }, _('AI Watchdog')), - ]), - E( - 'p', - { class: 'tachyon_adv__hint' }, - _('Advanced self-healing features. Requires Watchdog to be enabled.'), - ), - E('div', { class: 'tachyon_adv__group' }, [ - E('h4', { class: 'tachyon_adv__group-title' }, _('Health Checks')), - toggle('proxyHealthEnabled', 'Enable Proxy Health Monitor'), - aiWatchdog.proxyHealthEnabled - ? E('div', { class: 'tachyon_adv__subrows' }, [ - numInput( - 'proxyHealthInterval', - 'Check interval (s)', - 'Fast tier, 15-120s', - 15, - ), - numInput( - 'proxyHealthFailThreshold', - 'Fail threshold', - 'Consecutive fails before restart', - 1, - ), - textInput('proxyHealthUrl', 'Health Check URL'), - ]) - : E('span', {}), - toggle('dnsContinuousEnabled', 'Enable DNS Continuous Check'), - aiWatchdog.dnsContinuousEnabled - ? E('div', { class: 'tachyon_adv__subrows' }, [ - numInput('dnsInterval', 'DNS Check Interval (s)', '30-300s', 30), - ]) - : E('span', {}), - ]), - E('div', { class: 'tachyon_adv__group' }, [ - E('h4', { class: 'tachyon_adv__group-title' }, _('Protection')), - toggle( - 'reloadDedupEnabled', - 'Firewall Reload Dedup (prevents connection drops)', - ), - toggle( - 'configValidationEnabled', - 'Config Validation (validates before restart)', - ), - toggle( - 'gracefulDegradationEnabled', - 'Graceful Degradation (skip failed checks, continue)', - ), - ]), - E('div', { class: 'tachyon_adv__group' }, [ - E( - 'h4', - { class: 'tachyon_adv__group-title' }, - _('Monitoring & Analytics'), - ), - toggle('metricsEnabled', 'Health Metrics'), - aiWatchdog.metricsEnabled - ? E('div', { class: 'tachyon_adv__subrows' }, [ - numInput( - 'metricsRetentionHours', - 'Metrics Retention (hours)', - '1-168h', - 1, - ), - ]) - : E('span', {}), - toggle( - 'anomalyDetectionEnabled', - 'Anomaly Detection (reconnect frequency)', - ), - aiWatchdog.anomalyDetectionEnabled - ? E('div', { class: 'tachyon_adv__subrows' }, [ - numInput( - 'anomalyReconnectThreshold', - 'Reconnect Threshold', - 'Max reconnects/hour', - 1, - ), - ]) - : E('span', {}), - ]), - E('div', { class: 'tachyon_adv__group' }, [ - E('h4', { class: 'tachyon_adv__group-title' }, _('Optimization')), - toggle( - 'smartCooldownsEnabled', - 'Smart Cooldowns (15s/120s/300s tier intervals)', - ), - toggle( - 'adaptiveIntervalsEnabled', - 'Adaptive Intervals (longer when healthy)', - ), - toggle( - 'persistentSmartDetect', - 'Persistent Smart Detect (survive reboots)', - ), - ]), - E('div', { class: 'tachyon_adv__group' }, [ - E( - 'h4', - { class: 'tachyon_adv__group-title' }, - _('AI Agent REST API (12 Endpoints)'), - ), - E( - 'p', - { class: 'tachyon_adv__hint' }, - _( - 'HTTP REST API for external AI agents (Claude, GPT, Open-WebUI) served at /cgi-bin/tachyon-agent/', - ), - ), - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__label' }, _('Bearer Auth Token')), - E('div', { style: 'display: flex; gap: 8px; flex: 1;' }, [ - E('input', { - type: 'text', - class: 'cbi-input-text', - value: state.agentApiToken, - placeholder: _('Secret token for WRITE requests'), - style: 'flex: 1;', - onchange: (e: Event) => { - const val = (e.target as HTMLInputElement).value; - _state = { ..._state, agentApiToken: val.trim() }; - }, - }), - E( - 'button', - { - class: 'btn cbi-button cbi-button-action', - type: 'button', - onclick: () => { - const randomBytes = new Uint8Array(16); - crypto.getRandomValues(randomBytes); - const token = Array.from(randomBytes) - .map((b) => b.toString(16).padStart(2, '0')) - .join(''); - _state = { ..._state, agentApiToken: token }; - rerender(); - }, - }, - _('🔑 Generate'), - ), - ]), - ]), - E( - 'span', - { class: 'tachyon_adv__hint' }, - _( - 'GET endpoints are open on LAN. POST endpoints require Authorization: Bearer .', - ), - ), - ]), - E('div', { class: 'tachyon_adv__group' }, [ - E( - 'h4', - { class: 'tachyon_adv__group-title' }, - _('AI Doctor (ChatGPT / DeepSeek API)'), - ), - E( - 'p', - { class: 'tachyon_adv__hint' }, - _( - 'Connect ChatGPT, DeepSeek or local LLM to get automated diagnostic reports and intelligent root-cause analysis.', - ), - ), - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__toggle' }, [ - E('input', { - type: 'checkbox', - checked: state.enableAiDoctor, - onchange: (e: Event) => { - const enabled = (e.target as HTMLInputElement).checked; - _state = { ..._state, enableAiDoctor: enabled }; - rerender(); - }, - }), - E('span', {}, _('Enable AI Doctor (LLM Integration)')), - ]), - ]), - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__toggle' }, [ - E('input', { - type: 'checkbox', - checked: state.enableRag, - onchange: (e: Event) => { - const enabled = (e.target as HTMLInputElement).checked; - _state = { ..._state, enableRag: enabled }; - rerender(); - }, - }), - E('span', {}, _('Enable RAG (Knowledge Base Retrieval)')), - ]), - ]), - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__label' }, _('WARP Proxy Section')), - E( - 'select', - { - class: 'cbi-input-select', - onchange: (e: Event) => { - _state = { - ..._state, - warpProxySection: (e.target as HTMLSelectElement).value, - }; - }, - }, - [ - E( - 'option', - { - value: '', - selected: !state.warpProxySection, - }, - _('Default (Direct WAN / Default mixed proxy)'), - ), - ...(state.sectionOptions.length > 0 - ? [ - E( - 'optgroup', - { label: _('Tachyon Sections') }, - state.sectionOptions.map((sec) => { - const desc = sec.iface - ? ` (${sec.action}: ${sec.iface})` - : ` (${sec.action})`; - return E( - 'option', - { - value: sec.id, - selected: state.warpProxySection === sec.id, - }, - `${sec.label}${desc}`, - ); - }), - ), - ] - : []), - ...(state.networkDevices.length > 0 - ? [ - E( - 'optgroup', - { label: _('OpenWrt Network Interfaces') }, - state.networkDevices.map((dev) => - E( - 'option', - { - value: dev.id, - selected: state.warpProxySection === dev.id, - }, - dev.label, - ), - ), - ), - ] - : []), - ...(state.warpProxySection && - !state.sectionOptions.some( - (s) => s.id === state.warpProxySection, - ) && - !state.networkDevices.some((d) => d.id === state.warpProxySection) - ? [ - E( - 'option', - { - value: state.warpProxySection, - selected: true, - }, - `${state.warpProxySection} (${_('Custom interface/section')})`, - ), - ] - : []), - ], - ), - ]), - E( - 'div', - { class: 'tachyon_adv__hint' }, - _( - 'Section or network interface used for Cloudflare WARP API registration. Supports Tachyon sections (Connection, WireGuard, AmneziaWG, Interface) and OpenWrt system network devices/interfaces (awg0, wg0, tun0, etc.). Leave empty to use direct WAN / default mixed proxy.', - ), - ), - state.enableAiDoctor - ? E('div', { class: 'tachyon_adv__subrows' }, [ - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__label' }, _('AI Provider')), - E( - 'select', - { - class: 'cbi-input-select', - onchange: (e: Event) => { - const val = (e.target as HTMLSelectElement).value; - // Reset model when provider changes — defaults differ per provider - _state = { - ..._state, - aiDoctorProvider: val, - aiDoctorModel: '', - }; - rerender(); - }, - }, - [ - E( - 'option', - { - value: 'openai', - selected: state.aiDoctorProvider === 'openai', - }, - 'OpenAI (ChatGPT)', - ), - E( - 'option', - { - value: 'anthropic', - selected: state.aiDoctorProvider === 'anthropic', - }, - 'Anthropic (Claude API)', - ), - E( - 'option', - { - value: 'deepseek', - selected: state.aiDoctorProvider === 'deepseek', - }, - 'DeepSeek API', - ), - E( - 'option', - { - value: 'openrouter', - selected: state.aiDoctorProvider === 'openrouter', - }, - 'OpenRouter (openrouter.ai)', - ), - E( - 'option', - { - value: 'ollama', - selected: state.aiDoctorProvider === 'ollama', - }, - _('Ollama (Local PC / Server)'), - ), - E( - 'option', - { - value: 'lmstudio', - selected: state.aiDoctorProvider === 'lmstudio', - }, - _('LM Studio (Local PC / Server)'), - ), - E( - 'option', - { - value: 'custom', - selected: state.aiDoctorProvider === 'custom', - }, - 'Custom OpenAI-Compatible API', - ), - ], - ), - ]), - // ── Model selector ──────────────────────────────────────────────── - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__label' }, _('AI Model')), - E('input', { - type: 'text', - class: 'cbi-input-text', - value: state.aiDoctorModel, - placeholder: - { - openai: 'gpt-4o-mini', - anthropic: 'claude-3-5-haiku-20241022', - deepseek: 'deepseek-chat', - openrouter: 'openai/gpt-4o-mini', - ollama: 'llama3:latest', - lmstudio: 'local-model', - }[state.aiDoctorProvider] ?? 'gpt-4o-mini', - style: 'width: 100%;', - onchange: (e: Event) => { - const val = (e.target as HTMLInputElement).value; - _state = { ..._state, aiDoctorModel: val.trim() }; - }, - }), - ]), - E('div', { class: 'tachyon_adv__row' }, [ - E( - 'label', - { class: 'tachyon_adv__label' }, - _('AI Doctor Language'), - ), - E( - 'select', - { - class: 'cbi-input-select', - onchange: (e: Event) => { - const val = (e.target as HTMLSelectElement).value; - _state = { ..._state, aiDoctorLang: val }; - rerender(); - }, - }, - [ - E( - 'option', - { - value: 'ru', - selected: state.aiDoctorLang === 'ru', - }, - 'Русский (Russian)', - ), - E( - 'option', - { - value: 'en', - selected: state.aiDoctorLang === 'en', - }, - 'English', - ), - ], - ), - ]), - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__label' }, _('AI API Key')), - E('input', { - type: 'password', - class: 'cbi-input-text', - value: state.aiDoctorApiKey, - placeholder: ['ollama', 'lmstudio'].includes( - state.aiDoctorProvider, - ) - ? _('Optional for local LLM') - : 'sk-...', - style: 'width: 100%;', - onchange: (e: Event) => { - const val = (e.target as HTMLInputElement).value; - _state = { ..._state, aiDoctorApiKey: val.trim() }; - }, - }), - ]), - ['custom', 'ollama', 'lmstudio'].includes(state.aiDoctorProvider) - ? E('div', { class: 'tachyon_adv__row' }, [ - E( - 'label', - { class: 'tachyon_adv__label' }, - _('Custom API Endpoint URL'), - ), - E('input', { - type: 'text', - class: 'cbi-input-text', - value: state.aiDoctorCustomUrl, - placeholder: - { - ollama: - 'http://192.168.1.100:11434/v1/chat/completions', - lmstudio: - 'http://192.168.1.100:1234/v1/chat/completions', - custom: 'https://openrouter.ai/api/v1/chat/completions', - }[state.aiDoctorProvider] ?? - 'http://192.168.1.100:11434/v1/chat/completions', - style: 'width: 100%;', - onchange: (e: Event) => { - const val = (e.target as HTMLInputElement).value; - _state = { ..._state, aiDoctorCustomUrl: val.trim() }; - }, - }), - ]) - : E('span', {}), - ]) - : E('span', {}), - ]), - - E( - 'button', - { - class: 'btn cbi-button cbi-button-save tachyon_adv__save-btn', - type: 'button', - disabled: saving || !watchdogRunning, - onclick: () => void saveAiWatchdogSettings(), - }, - saving - ? _('Saving…') - : watchdogRunning - ? _('Save AI Watchdog Settings') - : _('Start Watchdog first'), - ), - ]); -} - -function renderSmartDetectSection(state: AdvancedSettingsState) { - const { smartDetectEnabled, smartDetectSections, allSectionNames, saving } = - state; - const unselected = allSectionNames.filter( - (s) => !smartDetectSections.includes(s), - ); - - const rows: Element[] = []; - - smartDetectSections.forEach((secName, idx) => { - rows.push( - E('div', { class: 'tachyon_adv__priority-row' }, [ - E('label', { class: 'tachyon_adv__priority-label' }, [ - E('input', { - type: 'checkbox', - checked: true, - onchange: (e: Event) => - toggleSectionInList( - secName, - (e.target as HTMLInputElement).checked, - ), - }), - E( - 'span', - { class: 'tachyon_adv__priority-name' }, - `${idx + 1}. ${secName}`, - ), - ]), - E('div', { class: 'tachyon_adv__arrows' }, [ - E( - 'button', - { - class: 'btn tachyon_adv__arrow', - type: 'button', - title: _('Move up'), - disabled: idx === 0, - onclick: () => moveSectionUp(idx), - }, - '△', - ), - E( - 'button', - { - class: 'btn tachyon_adv__arrow', - type: 'button', - title: _('Move down'), - disabled: idx === smartDetectSections.length - 1, - onclick: () => moveSectionDown(idx), - }, - '▽', - ), - ]), - ]), - ); - }); - - unselected.forEach((secName) => { - rows.push( - E( - 'div', - { class: 'tachyon_adv__priority-row tachyon_adv__priority-row--off' }, - [ - E('label', { class: 'tachyon_adv__priority-label' }, [ - E('input', { - type: 'checkbox', - checked: false, - onchange: (e: Event) => - toggleSectionInList( - secName, - (e.target as HTMLInputElement).checked, - ), - }), - E( - 'span', - { - class: - 'tachyon_adv__priority-name tachyon_adv__priority-name--off', - }, - secName, - ), - ]), - ], - ), - ); - }); - - return E('div', { class: 'tachyon_adv__section' }, [ - E('div', { class: 'tachyon_adv__section-header' }, [ - E('span', { class: 'tachyon_adv__section-icon' }, '🔍'), - E('h3', { class: 'tachyon_adv__section-title' }, _('Smart Detect')), - ]), - E( - 'p', - { class: 'tachyon_adv__hint' }, - _( - 'Auto-detects blocked domains from logs and adds them to the first section where they work via proxy.', - ), - ), - E('div', { class: 'tachyon_adv__row' }, [ - E('label', { class: 'tachyon_adv__toggle' }, [ - E('input', { - type: 'checkbox', - checked: smartDetectEnabled, - onchange: (e: Event) => { - _state = { - ..._state, - smartDetectEnabled: (e.target as HTMLInputElement).checked, - }; - rerender(); - }, - }), - E('span', {}, _('Enable Smart Detect')), - ]), - ]), - smartDetectEnabled && rows.length > 0 - ? E('div', { class: 'tachyon_adv__priority-list' }, [ - E( - 'p', - { class: 'tachyon_adv__sub-hint' }, - _('Section test order (checked = active, drag rows with △▽):'), - ), - ...rows, - ]) - : E('span', {}), - E( - 'button', - { - class: 'btn cbi-button cbi-button-save tachyon_adv__save-btn', - type: 'button', - disabled: saving, - onclick: () => void saveSmartDetect(), - }, - saving ? _('Saving…') : _('Save Smart Detect Settings'), - ), - ]); -} - -function renderDeviceRoutingSection(state: AdvancedSettingsState) { - const { allSectionNames, deviceIpsPerSection, saving } = state; - - if (allSectionNames.length === 0) { - return E('div', { class: 'tachyon_adv__section' }, [ - E('div', { class: 'tachyon_adv__section-header' }, [ - E('span', { class: 'tachyon_adv__section-icon' }, '🖥'), - E( - 'h3', - { class: 'tachyon_adv__section-title' }, - _('Per-Device Routing'), - ), - ]), - E( - 'p', - { class: 'tachyon_adv__hint' }, - _('No active routing sections found.'), - ), - ]); - } - - const editors = allSectionNames.map((secName) => { - const currentIps = (deviceIpsPerSection[secName] || []).join('\n'); - const taId = `tachyon-device-ips-${secName}`; - - return E('div', { class: 'tachyon_adv__device-block' }, [ - E('div', { class: 'tachyon_adv__device-name' }, secName), - E( - 'label', - { class: 'tachyon_adv__device-label' }, - _('Device IPs (one per line):'), - ), - E( - 'textarea', - { - id: taId, - class: 'cbi-input-textarea tachyon_adv__device-ta', - rows: 3, - placeholder: '192.168.1.100\n192.168.1.105', - }, - currentIps, - ), - E( - 'button', - { - class: 'btn cbi-button cbi-button-save tachyon_adv__save-btn', - type: 'button', - disabled: saving, - onclick: () => { - const ta = document.getElementById( - taId, - ) as HTMLTextAreaElement | null; - void saveDeviceIps(secName, ta ? ta.value : ''); - }, - }, - saving ? _('Saving…') : _('Save'), - ), - ]); - }); - - return E('div', { class: 'tachyon_adv__section' }, [ - E('div', { class: 'tachyon_adv__section-header' }, [ - E('span', { class: 'tachyon_adv__section-icon' }, '🖥'), - E('h3', { class: 'tachyon_adv__section-title' }, _('Per-Device Routing')), - ]), - E( - 'p', - { class: 'tachyon_adv__hint' }, - _( - 'Devices listed here are always routed through the assigned section, regardless of global rules.', - ), - ), - ...editors, - ]); -} - -function renderAdvancedSettingsBody(state: AdvancedSettingsState) { - if (!state.loaded) { - return E('div', { class: 'tachyon_adv__loading' }, _('Loading…')); - } - - return E('div', { class: 'tachyon_adv__body' }, [ - renderWatchdogSection(state), - E('hr', { class: 'tachyon_adv__divider' }), - renderAiWatchdogSection(state), - E('hr', { class: 'tachyon_adv__divider' }), - renderDnsTurboCacheSection(state), - E('hr', { class: 'tachyon_adv__divider' }), - renderSmartDetectSection(state), - E('hr', { class: 'tachyon_adv__divider' }), - renderDeviceRoutingSection(state), - ]); -} - -export function renderAdvancedSettingsPanel() { - return E('div', { id: 'tachyon-advanced-settings', class: 'tachyon_adv' }, [ - E('details', { class: 'tachyon_adv__details' }, [ - E( - 'summary', - { class: 'tachyon_adv__summary' }, - _('⚙ Advanced Settings'), - ), - E( - 'div', - { id: 'tachyon-advanced-settings-inner', class: 'tachyon_adv__inner' }, - [renderAdvancedSettingsBody(_state)], - ), - ]), - ]); -} diff --git a/luci-app-tachyon/po/ru/tachyon.po b/luci-app-tachyon/po/ru/tachyon.po index e2ee7380..b7cadcae 100644 --- a/luci-app-tachyon/po/ru/tachyon.po +++ b/luci-app-tachyon/po/ru/tachyon.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: TACHYON\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-08-30 19:56+0300\n" -"PO-Revision-Date: 2026-08-30 19:56+0300\n" +"POT-Creation-Date: 2026-09-01 08:41+0300\n" +"PO-Revision-Date: 2026-09-01 08:41+0300\n" "Last-Translator: Dushnilin\n" "Language-Team: none\n" "Language: ru\n" @@ -41,15 +41,6 @@ msgstr "+ Добавить стратегию" msgid "+ Add URLTest" msgstr "+ Добавить URLTest" -msgid "⏹ Stop" -msgstr "⏹ Стоп" - -msgid "▶ Start" -msgstr "▶ Старт" - -msgid "⚙ Advanced Settings" -msgstr "⚙ Настройки" - msgid "⚠️ Benchmark completed. No working bypass found for this target." msgstr "⚠️ Бенчмарк завершен. Не найдено рабочих стратегий для данной цели." @@ -128,9 +119,6 @@ msgstr "🔄 Сбросить к заводским настройкам" msgid "🔍 Combinatorial Deep Fuzzing (~40-80+)" msgstr "🔍 Комбинаторный глубокий фаззинг (~40-80+)" -msgid "🔑 Generate" -msgstr "🔑 Сгенерировать" - msgid "🗑️ Clear History" msgstr "🗑️ Очистить историю" @@ -257,9 +245,6 @@ msgstr "Chat ID администраторов" msgid "Adult content" msgstr "Взрослый контент" -msgid "Advanced self-healing features. Requires Watchdog to be enabled." -msgstr "Расширенные функции самовосстановления. Требуется включённый Watchdog." - msgid "Advanced System" msgstr "Расширенные настройки" @@ -275,9 +260,6 @@ msgstr "Метод AEAD" msgid "AI & Watchdog" msgstr "ИИ и Watchdog" -msgid "AI Agent REST API (12 Endpoints)" -msgstr "HTTP REST API ИИ-агента (12 эндпоинтов)" - msgid "AI Agent REST API Bearer Token" msgstr "Токен Bearer для REST API ИИ-агента" @@ -293,9 +275,6 @@ msgstr "ИИ Чат-ассистент" msgid "AI Diagnostics & Strategy Rationale" msgstr "Диагностика ИИ и обоснование стратегий" -msgid "AI Doctor (ChatGPT / DeepSeek API)" -msgstr "AI Doctor (ChatGPT / DeepSeek API)" - msgid "AI Doctor Diagnosis" msgstr "Диагностика ИИ-доктора" @@ -329,12 +308,6 @@ msgstr "Ошибка генерации ИИ" msgid "AI synthesis failed" msgstr "Не удалось сгенерировать стратегии через ИИ" -msgid "AI Watchdog" -msgstr "ИИ Watchdog" - -msgid "AI Watchdog settings saved. Restart watchdog to apply." -msgstr "Настройки AI Watchdog сохранены. Перезапустите watchdog для применения." - msgid "All" msgstr "Все" @@ -563,9 +536,6 @@ msgstr "Ошибка проверки бэкенда: %s" msgid "Basic connectivity" msgstr "Базовая связность" -msgid "Bearer Auth Token" -msgstr "Токен авторизации (Bearer)" - msgid "Beginning of the schedule interval (e.g. 22:00)" msgstr "Начало интервала расписания (например, 22:00)" @@ -932,9 +902,6 @@ msgstr "Настройте User-Agent в параметрах элемента" msgid "Conflict" msgstr "Конфликт" -msgid "Connect ChatGPT, DeepSeek or local LLM to get automated diagnostic reports and intelligent root-cause analysis." -msgstr "Подключите ChatGPT, DeepSeek или локальную модель LLM для получения автоматических диагностических отчётов и умного анализа сетевых проблем." - msgid "Connect through" msgstr "Подключаться через" @@ -1022,9 +989,6 @@ msgstr "Пользовательский заголовок для инициа msgid "Custom header for handshake response" msgstr "Пользовательский заголовок для ответа рукопожатия" -msgid "Custom interface/section" -msgstr "Пользовательский интерфейс/секция" - msgid "Custom OpenAI-Compatible API" msgstr "Пользовательский OpenAI-совместимый API" @@ -1097,12 +1061,6 @@ msgstr "устр." msgid "Device filter" msgstr "Фильтр устройств" -msgid "Device IPs (one per line):" -msgstr "IP устройств (по одному на строку):" - -msgid "Device IPs saved" -msgstr "IP устройств сохранены" - msgid "Device or IP" msgstr "Устройство или IP" @@ -1112,9 +1070,6 @@ msgstr "Режим устройства обновлен" msgid "Devices (MAC / IP)" msgstr "Устройства (MAC / IP)" -msgid "Devices listed here are always routed through the assigned section, regardless of global rules." -msgstr "Устройства из этого списка всегда маршрутизируются через назначенную секцию, независимо от глобальных правил." - msgid "DHCP has DNS server" msgstr "DHCP содержит DNS сервер" @@ -1235,9 +1190,6 @@ msgstr "DNS через секцию" msgid "DNS Turbo Cache" msgstr "Быстрый DNS-кэш" -msgid "DNS Turbo Cache saved" -msgstr "DNS Turbo Cache сохранён" - msgid "DNS Unavailability Timeout" msgstr "Таймаут недоступности DNS" @@ -1394,9 +1346,6 @@ msgstr "Включить адаптивные интервалы" msgid "Enable AI Doctor (ChatGPT / LLM Analysis)" msgstr "Включить ИИ-доктора (анализ ChatGPT / LLM)" -msgid "Enable AI Doctor (LLM Integration)" -msgstr "Включить AI Doctor (интеграция с LLM)" - msgid "Enable Anomaly Detection" msgstr "Включить обнаружение аномалий" @@ -1421,9 +1370,6 @@ msgstr "Включить прямой обход WAN" msgid "Enable DNS Continuous Check" msgstr "Непрерывная проверка DNS" -msgid "Enable DNS Turbo Cache" -msgstr "Включить быстрый DNS-кэш" - msgid "Enable Firewall Reload Dedup" msgstr "Включить дедупликацию перезагрузки файрвола" @@ -1676,24 +1622,12 @@ msgstr "Не удалось восстановить снапшот" msgid "Failed to run diagnostics — is the tachyon binary installed?" msgstr "Не удалось запустить диагностику — установлен ли бинарник tachyon?" -msgid "Failed to save AI Watchdog settings" -msgstr "Ошибка сохранения настроек AI Watchdog" - -msgid "Failed to save device IPs" -msgstr "Ошибка сохранения IP устройств" - -msgid "Failed to save DNS Turbo Cache" -msgstr "Не удалось сохранить DNS Turbo Cache" - msgid "Failed to save fuzzer patterns" msgstr "Не удалось сохранить паттерны фаззера" msgid "Failed to save patterns" msgstr "Не удалось сохранить паттерны" -msgid "Failed to save Smart Detect settings" -msgstr "Ошибка сохранения настроек Smart Detect" - msgid "Failed to save snapshot" msgstr "Не удалось сохранить снапшот" @@ -1889,9 +1823,6 @@ msgstr "GeoSite / GeoIP" msgid "Germany (de)" msgstr "Германия (de)" -msgid "GET endpoints are open on LAN. POST endpoints require Authorization: Bearer ." -msgstr "GET-эндпоинты открыты в локальной сети. POST-эндпоинты требуют Authorization: Bearer ." - msgid "Get global check" msgstr "Получить глобальную проверку" @@ -1916,9 +1847,6 @@ msgstr "Сервис gRPC" msgid "Handshake timeout" msgstr "Таймаут рукопожатия" -msgid "Health Checks" -msgstr "Проверки здоровья" - msgid "Hello! I am Tachyon AI Assistant. How can I help you today? Ask me about domain blocks, diagnostics, or router settings." msgstr "Привет! Я ИИ-ассистент Tachyon. Чем могу помочь? Задайте вопрос о блокировках, диагностике или настройках роутера." @@ -2024,9 +1952,6 @@ msgstr "Ошибка HTTP" msgid "HTTP hosts" msgstr "HTTP хосты" -msgid "HTTP REST API for external AI agents (Claude, GPT, Open-WebUI) served at /cgi-bin/tachyon-agent/" -msgstr "HTTP REST API для внешних ИИ-агентов (Claude, GPT, Open-WebUI), доступен по адресу /cgi-bin/tachyon-agent/" - msgid "HWID" msgstr "HWID" @@ -2564,9 +2489,6 @@ msgstr "Получение списка сервисов..." msgid "Loading..." msgstr "Загрузка..." -msgid "Loading…" -msgstr "Загрузка…" - msgid "Local Address" msgstr "Локальный адрес" @@ -2669,18 +2591,9 @@ msgstr "Отслеживаемые интерфейсы" msgid "Monitoring" msgstr "Мониторинг" -msgid "Monitoring & Analytics" -msgstr "Мониторинг и аналитика" - msgid "Monitors sing-box reconnect frequency. Alerts if too many reconnects per hour." msgstr "Отслеживает частоту переподключений sing-box. Оповещает при слишком частых переподключениях." -msgid "Move down" -msgstr "Вниз" - -msgid "Move up" -msgstr "Вверх" - msgid "MTU" msgstr "MTU" @@ -2954,9 +2867,6 @@ msgstr "Откройте настройки приоритета и введит msgid "Open Project Page" msgstr "Открыть страницу проекта" -msgid "OpenWrt Network Interfaces" -msgstr "" - msgid "Operation completed successfully!" msgstr "Операция успешно завершена!" @@ -2978,9 +2888,6 @@ msgstr "Операция запущена. Ожидание вывода лог msgid "Operation timed out" msgstr "Время ожидания истекло" -msgid "Optimization" -msgstr "Оптимизация" - msgid "Optimize AWG MTU" msgstr "Оптимизировать MTU AWG" @@ -2996,9 +2903,6 @@ msgstr "Опционально — оставьте пустым для знач msgid "Optional context (e.g. \"Rostelecom, YouTube 4K buffering is slow\")..." msgstr "Дополнительный контекст (напр. «Ростелеком, YouTube 4K долго буферизуется»)..." -msgid "Optional for local LLM" -msgstr "Опционально для локальных LLM" - msgid "Optional tls-auth or tls-crypt key" msgstr "Опциональный ключ tls-auth или tls-crypt" @@ -3110,9 +3014,6 @@ msgstr "Ожидает запуска" msgid "Pending..." msgstr "Ожидание..." -msgid "Per-Device Routing" -msgstr "Маршрутизация по устройствам" - msgid "Periodically check the current level and switch to a faster server even when the current one works." msgstr "Периодически проверять текущий уровень и переключаться на более быстрый сервер, даже если текущий работает." @@ -3596,18 +3497,9 @@ msgstr "Сохранить" msgid "Save a snapshot of the working config and restore it later if something breaks." msgstr "Сохранить снапшот рабочей конфигурации, чтобы восстановить её позже, если что-то сломается." -msgid "Save AI Watchdog Settings" -msgstr "Сохранить настройки AI Watchdog" - -msgid "Save Smart Detect Settings" -msgstr "Сохранить настройки Smart Detect" - msgid "Save Snapshot" msgstr "Сохранить снапшот" -msgid "Saving…" -msgstr "Сохранение…" - msgid "Schedule" msgstr "Расписание" @@ -3635,9 +3527,6 @@ msgstr "Секретный ключ для аутентификации удал msgid "Secret token for authorizing WRITE operations (POST/PUT) on /cgi-bin/tachyon-agent/. Leave empty if auth is not required." msgstr "Секретный токен для авторизации операций записи (POST/PUT) на /cgi-bin/tachyon-agent/. Оставьте пустым, если аутентификация не требуется." -msgid "Secret token for WRITE requests" -msgstr "Секретный токен для POST/PUT запросов" - msgid "Section" msgstr "Секция" @@ -3647,15 +3536,9 @@ msgstr "Действие секции" msgid "Section name" msgstr "Имя секции" -msgid "Section or network interface used for Cloudflare WARP API registration. Supports Tachyon sections (Connection, WireGuard, AmneziaWG, Interface) and OpenWrt system network devices/interfaces (awg0, wg0, tun0, etc.). Leave empty to use direct WAN / default mixed proxy." -msgstr "" - msgid "Section Rules Content" msgstr "Содержимое правил секции" -msgid "Section test order (checked = active, drag rows with △▽):" -msgstr "Порядок проверки секций (галочка = активна, перетаскивайте △▽):" - msgid "Section used for Cloudflare WARP API registration. If your ISP blocks Cloudflare API on WAN, select a proxy section (with Mixed proxy enabled) or a tunnel interface section (WireGuard / AmneziaWG / VPN). Leave empty to use direct WAN / default mixed proxy." msgstr "Секция для регистрации Cloudflare WARP API. Если провайдер блокирует API Cloudflare на WAN, выберите секцию с прокси (с включённым смешанным прокси) или туннельный интерфейс (WireGuard / AmneziaWG / VPN). Оставьте пустым для прямого WAN / стандартного смешанного прокси." @@ -3962,12 +3845,6 @@ msgstr "Пропущены комментарии/невалидные:" msgid "Skipped loopback:" msgstr "Пропущены loopback:" -msgid "Smart Detect" -msgstr "Smart Detect" - -msgid "Smart Detect settings saved" -msgstr "Настройки Smart Detect сохранены" - msgid "Snapshot name" msgstr "Имя снапшота" @@ -4082,9 +3959,6 @@ msgstr "Время начала (ЧЧ:ММ)" msgid "Start watchdog" msgstr "Запустить watchdog" -msgid "Start Watchdog first" -msgstr "Сначала запустите Watchdog" - msgid "Starting…" msgstr "Запуск…" @@ -4211,9 +4085,6 @@ msgstr "Tachyon управляет жизненным циклом процес msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." msgstr "Tachyon управляет жизненным циклом процесса nfqws2 самостоятельно, поэтому режим daemon здесь не допускается." -msgid "Tachyon Sections" -msgstr "" - msgid "Tachyon service is stopped. Start the service to display connections." msgstr "Служба Tachyon остановлена. Запустите сервис для отображения подключений." @@ -4853,12 +4724,6 @@ msgstr "Секция прокси для генератора WARP" msgid "WARP Private Key" msgstr "Приватный ключ WARP" -msgid "WARP Proxy Section" -msgstr "Секция прокси WARP" - -msgid "Watchdog" -msgstr "Сторожевой таймер" - msgid "Watchdog probes every Connection section; when the active one fails several checks in a row, traffic switches to a healthy backup and Telegram is notified. Requires a config reload to take effect." msgstr "Watchdog проверяет каждую Connection-секцию; если активная падает несколько проверок подряд, трафик переключается на живую резервную, а Telegram получает уведомление. Нужен reload конфигурации." @@ -4958,6 +4823,141 @@ msgstr "sing-box outbound для Zapret2 настроен" msgid "Zapret2 sing-box outbound is not configured" msgstr "sing-box outbound для Zapret2 не настроен" +msgid "⏹ Stop" +msgstr "⏹ Стоп" + +msgid "▶ Start" +msgstr "▶ Старт" + +msgid "⚙ Advanced Settings" +msgstr "⚙ Настройки" + +msgid "🔑 Generate" +msgstr "🔑 Сгенерировать" + +msgid "Advanced self-healing features. Requires Watchdog to be enabled." +msgstr "Расширенные функции самовосстановления. Требуется включённый Watchdog." + +msgid "AI Agent REST API (12 Endpoints)" +msgstr "HTTP REST API ИИ-агента (12 эндпоинтов)" + +msgid "AI Doctor (ChatGPT / DeepSeek API)" +msgstr "AI Doctor (ChatGPT / DeepSeek API)" + +msgid "AI Watchdog" +msgstr "ИИ Watchdog" + +msgid "AI Watchdog settings saved. Restart watchdog to apply." +msgstr "Настройки AI Watchdog сохранены. Перезапустите watchdog для применения." + +msgid "Bearer Auth Token" +msgstr "Токен авторизации (Bearer)" + +msgid "Connect ChatGPT, DeepSeek or local LLM to get automated diagnostic reports and intelligent root-cause analysis." +msgstr "Подключите ChatGPT, DeepSeek или локальную модель LLM для получения автоматических диагностических отчётов и умного анализа сетевых проблем." + +msgid "Custom interface/section" +msgstr "Пользовательский интерфейс/секция" + +msgid "Device IPs (one per line):" +msgstr "IP устройств (по одному на строку):" + +msgid "Device IPs saved" +msgstr "IP устройств сохранены" + +msgid "Devices listed here are always routed through the assigned section, regardless of global rules." +msgstr "Устройства из этого списка всегда маршрутизируются через назначенную секцию, независимо от глобальных правил." + +msgid "DNS Turbo Cache saved" +msgstr "DNS Turbo Cache сохранён" + +msgid "Enable AI Doctor (LLM Integration)" +msgstr "Включить AI Doctor (интеграция с LLM)" + +msgid "Enable DNS Turbo Cache" +msgstr "Включить быстрый DNS-кэш" + +msgid "Failed to save AI Watchdog settings" +msgstr "Ошибка сохранения настроек AI Watchdog" + +msgid "Failed to save device IPs" +msgstr "Ошибка сохранения IP устройств" + +msgid "Failed to save DNS Turbo Cache" +msgstr "Не удалось сохранить DNS Turbo Cache" + +msgid "Failed to save Smart Detect settings" +msgstr "Ошибка сохранения настроек Smart Detect" + +msgid "GET endpoints are open on LAN. POST endpoints require Authorization: Bearer ." +msgstr "GET-эндпоинты открыты в локальной сети. POST-эндпоинты требуют Authorization: Bearer ." + +msgid "Health Checks" +msgstr "Проверки здоровья" + +msgid "HTTP REST API for external AI agents (Claude, GPT, Open-WebUI) served at /cgi-bin/tachyon-agent/" +msgstr "HTTP REST API для внешних ИИ-агентов (Claude, GPT, Open-WebUI), доступен по адресу /cgi-bin/tachyon-agent/" + +msgid "Loading…" +msgstr "Загрузка…" + +msgid "Monitoring & Analytics" +msgstr "Мониторинг и аналитика" + +msgid "Move down" +msgstr "Вниз" + +msgid "Move up" +msgstr "Вверх" + +msgid "OpenWrt Network Interfaces" +msgstr "" + +msgid "Optimization" +msgstr "Оптимизация" + +msgid "Optional for local LLM" +msgstr "Опционально для локальных LLM" + +msgid "Per-Device Routing" +msgstr "Маршрутизация по устройствам" + +msgid "Save AI Watchdog Settings" +msgstr "Сохранить настройки AI Watchdog" + +msgid "Save Smart Detect Settings" +msgstr "Сохранить настройки Smart Detect" + +msgid "Saving…" +msgstr "Сохранение…" + +msgid "Secret token for WRITE requests" +msgstr "Секретный токен для POST/PUT запросов" + +msgid "Section or network interface used for Cloudflare WARP API registration. Supports Tachyon sections (Connection, WireGuard, AmneziaWG, Interface) and OpenWrt system network devices/interfaces (awg0, wg0, tun0, etc.). Leave empty to use direct WAN / default mixed proxy." +msgstr "" + +msgid "Section test order (checked = active, drag rows with △▽):" +msgstr "Порядок проверки секций (галочка = активна, перетаскивайте △▽):" + +msgid "Smart Detect" +msgstr "Smart Detect" + +msgid "Smart Detect settings saved" +msgstr "Настройки Smart Detect сохранены" + +msgid "Start Watchdog first" +msgstr "Сначала запустите Watchdog" + +msgid "Tachyon Sections" +msgstr "" + +msgid "WARP Proxy Section" +msgstr "Секция прокси WARP" + +msgid "Watchdog" +msgstr "Сторожевой таймер" + msgid "Section or tunnel interface used for Cloudflare WARP API registration. Supports Connection, WireGuard, AmneziaWG, and Interface sections. Leave empty to use direct WAN / default mixed proxy." msgstr "Секция или туннельный интерфейс для регистрации Cloudflare WARP API. Поддерживает секции Connection, WireGuard, AmneziaWG и Interface. Оставьте пустым для прямого WAN / стандартного mixed proxy." diff --git a/luci-app-tachyon/po/templates/tachyon.pot b/luci-app-tachyon/po/templates/tachyon.pot index 005532e1..ede07a91 100644 --- a/luci-app-tachyon/po/templates/tachyon.pot +++ b/luci-app-tachyon/po/templates/tachyon.pot @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: TACHYON\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-08-30 16:56+0300\n" -"PO-Revision-Date: 2026-08-30 16:56+0300\n" +"POT-Creation-Date: 2026-09-01 05:41+0300\n" +"PO-Revision-Date: 2026-09-01 05:41+0300\n" "Last-Translator: Dushnilin \n" "Language-Team: LANGUAGE \n" "Language: \n" @@ -57,18 +57,6 @@ msgstr "" msgid "+ Add URLTest" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:515 -msgid "⏹ Stop" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:515 -msgid "▶ Start" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1340 -msgid "⚙ Advanced Settings" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:13135 #: src/tachyon/tabs/diagnostic/partials/renderStrategyFuzzerModal.ts:1393 msgid "⚠️ Benchmark completed. No working bypass found for this target." @@ -136,7 +124,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:8364 #: src/tachyon/tabs/dashboard/initController.ts:1891 #: src/tachyon/tabs/dashboard/initController.ts:1900 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:505 msgid "✔ Running" msgstr "" @@ -149,7 +136,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:8364 #: src/tachyon/tabs/dashboard/initController.ts:1891 #: src/tachyon/tabs/dashboard/initController.ts:1900 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:505 msgid "✘ Stopped" msgstr "" @@ -203,10 +189,6 @@ msgstr "" msgid "🔍 Combinatorial Deep Fuzzing (~40-80+)" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:760 -msgid "🔑 Generate" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:12904 #: src/tachyon/tabs/diagnostic/partials/renderStrategyFuzzerModal.ts:1122 msgid "🗑️ Clear History" @@ -284,9 +266,9 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:16607 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:349 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:355 -#: src/tachyon/tabs/dashboard/initController.ts:1127 #: src/tachyon/tabs/monitoring/initController.ts:722 #: src/tachyon/tabs/monitoring/render.ts:20 +#: src/tachyon/tabs/dashboard/initController.ts:1127 msgid "Active" msgstr "" @@ -417,10 +399,6 @@ msgstr "" msgid "Adult content" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:627 -msgid "Advanced self-healing features. Requires Watchdog to be enabled." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:823 msgid "Advanced System" msgstr "" @@ -441,16 +419,11 @@ msgstr "" msgid "AI & Watchdog" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:722 -msgid "AI Agent REST API (12 Endpoints)" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1745 msgid "AI Agent REST API Bearer Token" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1813 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1037 msgid "AI API Key" msgstr "" @@ -469,10 +442,6 @@ msgstr "" msgid "AI Diagnostics & Strategy Rationale" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:776 -msgid "AI Doctor (ChatGPT / DeepSeek API)" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:15182 #: src/tachyon/tabs/diagnostic/initController.ts:1563 msgid "AI Doctor Diagnosis" @@ -488,7 +457,6 @@ msgid "AI Doctor failed" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1800 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1004 msgid "AI Doctor Language" msgstr "" @@ -503,12 +471,10 @@ msgid "AI DPI Engineer & Strategy Synthesizer" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1787 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:979 msgid "AI Model" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1770 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:901 msgid "AI Provider" msgstr "" @@ -532,14 +498,6 @@ msgstr "" msgid "AI synthesis failed" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:622 -msgid "AI Watchdog" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:449 -msgid "AI Watchdog settings saved. Restart watchdog to apply." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:12281 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:16041 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:16572 @@ -806,7 +764,6 @@ msgid "Auto-detected Domains" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1976 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1197 msgid "Auto-detects blocked domains from logs and adds them to the first section where they work via proxy." msgstr "" @@ -894,10 +851,6 @@ msgstr "" msgid "Basic connectivity" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:732 -msgid "Bearer Auth Token" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:875 msgid "Beginning of the schedule interval (e.g. 22:00)" msgstr "" @@ -1421,10 +1374,10 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10239 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1803 #: src/partials/modal/renderModal.ts:263 -#: src/tachyon/tabs/dashboard/initController.ts:1267 -#: src/tachyon/tabs/diagnostic/initController.ts:1553 #: src/tachyon/tabs/monitoring/initController.ts:893 #: src/tachyon/tabs/monitoring/initController.ts:948 +#: src/tachyon/tabs/dashboard/initController.ts:1267 +#: src/tachyon/tabs/diagnostic/initController.ts:1553 #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:227 #: src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:178 #: src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:871 @@ -1498,7 +1451,7 @@ msgid "Components" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:6081 -#: src/tachyon/helpers/singBoxVariant.ts:60 +#: src/tachyon/helpers/singBoxVariant.ts:57 msgid "compressed" msgstr "" @@ -1540,10 +1493,6 @@ msgstr "" msgid "Conflict" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:781 -msgid "Connect ChatGPT, DeepSeek or local LLM to get automated diagnostic reports and intelligent root-cause analysis." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:9031 msgid "Connect through" msgstr "" @@ -1651,7 +1600,6 @@ msgid "Custom" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1824 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1059 msgid "Custom API Endpoint URL" msgstr "" @@ -1684,10 +1632,6 @@ msgstr "" msgid "Custom header for handshake response" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:884 -msgid "Custom interface/section" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1780 msgid "Custom OpenAI-Compatible API" msgstr "" @@ -1742,7 +1686,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1635 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1647 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:833 msgid "Default (Direct WAN / Default mixed proxy)" msgstr "" @@ -1798,14 +1741,6 @@ msgstr "" msgid "Device filter" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1270 -msgid "Device IPs (one per line):" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:305 -msgid "Device IPs saved" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6970 msgid "Device or IP" msgstr "" @@ -1819,10 +1754,6 @@ msgstr "" msgid "Devices (MAC / IP)" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1308 -msgid "Devices listed here are always routed through the assigned section, regardless of global rules." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:9412 #: src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:37 msgid "DHCP has DNS server" @@ -2005,14 +1936,9 @@ msgid "DNS through section" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:527 msgid "DNS Turbo Cache" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:329 -msgid "DNS Turbo Cache saved" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:934 msgid "DNS Unavailability Timeout" msgstr "" @@ -2252,10 +2178,6 @@ msgstr "" msgid "Enable AI Doctor (ChatGPT / LLM Analysis)" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:796 -msgid "Enable AI Doctor (LLM Integration)" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1956 msgid "Enable Anomaly Detection" msgstr "" @@ -2290,10 +2212,6 @@ msgstr "" msgid "Enable DNS Continuous Check" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:546 -msgid "Enable DNS Turbo Cache" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1901 msgid "Enable Firewall Reload Dedup" msgstr "" @@ -2327,7 +2245,6 @@ msgid "Enable Proxy Health Monitor" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1840 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:810 msgid "Enable RAG (Knowledge Base Retrieval)" msgstr "" @@ -2336,7 +2253,6 @@ msgid "Enable Smart Cooldowns" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1975 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1214 msgid "Enable Smart Detect" msgstr "" @@ -2609,12 +2525,12 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19001 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19061 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19233 -#: src/tachyon/methods/shell/index.ts:171 -#: src/tachyon/methods/shell/index.ts:178 #: src/tachyon/tabs/updates/initController.ts:661 #: src/tachyon/tabs/updates/initController.ts:662 #: src/tachyon/tabs/updates/initController.ts:739 #: src/tachyon/tabs/updates/initController.ts:953 +#: src/tachyon/methods/shell/index.ts:171 +#: src/tachyon/methods/shell/index.ts:178 msgid "Failed to execute" msgstr "" @@ -2705,18 +2621,6 @@ msgstr "" msgid "Failed to run diagnostics — is the tachyon binary installed?" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:453 -msgid "Failed to save AI Watchdog settings" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:313 -msgid "Failed to save device IPs" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:331 -msgid "Failed to save DNS Turbo Cache" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:4145 #: src/tachyon/methods/shell/index.ts:1320 msgid "Failed to save fuzzer patterns" @@ -2727,10 +2631,6 @@ msgstr "" msgid "Failed to save patterns" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:279 -msgid "Failed to save Smart Detect settings" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:670 msgid "Failed to save snapshot" msgstr "" @@ -3039,10 +2939,6 @@ msgstr "" msgid "Germany (de)" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:767 -msgid "GET endpoints are open on LAN. POST endpoints require Authorization: Bearer ." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:10740 #: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:113 msgid "Get global check" @@ -3081,10 +2977,6 @@ msgstr "" msgid "Handshake timeout" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:630 -msgid "Health Checks" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:11750 #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:14 msgid "Hello! I am Tachyon AI Assistant. How can I help you today? Ask me about domain blocks, diagnostics, or router settings." @@ -3244,10 +3136,6 @@ msgstr "" msgid "HTTP hosts" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:727 -msgid "HTTP REST API for external AI agents (Claude, GPT, Open-WebUI) served at /cgi-bin/tachyon-agent/" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2473 msgid "HWID" msgstr "" @@ -3961,7 +3849,6 @@ msgid "Keep URLTest before latency-sorted servers" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:532 msgid "Keeps FakeIP cache persistent across reboots and pre-resolves popular blocked domains on startup so first-visit latency is 0 ms." msgstr "" @@ -4055,7 +3942,6 @@ msgid "Lists and rule sets successfully updated!" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1779 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:964 msgid "LM Studio (Local PC / Server)" msgstr "" @@ -4118,10 +4004,6 @@ msgstr "" msgid "Loading..." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1318 -msgid "Loading…" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8321 msgid "Local Address" msgstr "" @@ -4131,7 +4013,7 @@ msgid "Log Level" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:6083 -#: src/tachyon/helpers/singBoxVariant.ts:62 +#: src/tachyon/helpers/singBoxVariant.ts:59 msgid "lx" msgstr "" @@ -4269,22 +4151,10 @@ msgstr "" msgid "Monitoring" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:675 -msgid "Monitoring & Analytics" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1957 msgid "Monitors sing-box reconnect frequency. Alerts if too many reconnects per hour." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1148 -msgid "Move down" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1137 -msgid "Move up" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8384 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3379 msgid "MTU" @@ -4412,7 +4282,6 @@ msgid "No active DHCP clients found on local network." msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:704 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1256 msgid "No active routing sections found." msgstr "" @@ -4593,8 +4462,8 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19467 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19477 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:19487 -#: src/tachyon/helpers/singBoxVariant.ts:38 -#: src/tachyon/helpers/singBoxVariant.ts:46 +#: src/tachyon/helpers/singBoxVariant.ts:35 +#: src/tachyon/helpers/singBoxVariant.ts:43 #: src/tachyon/tabs/updates/initController.ts:1237 #: src/tachyon/tabs/updates/initController.ts:1251 #: src/tachyon/tabs/updates/initController.ts:1265 @@ -4704,7 +4573,6 @@ msgid "Obfuscation password" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1778 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:956 msgid "Ollama (Local PC / Server)" msgstr "" @@ -4767,10 +4635,6 @@ msgstr "" msgid "Open Project Page" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:860 -msgid "OpenWrt Network Interfaces" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:18402 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:324 msgid "Operation completed successfully!" @@ -4812,10 +4676,6 @@ msgstr "" msgid "Operation timed out" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:704 -msgid "Optimization" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:14782 #: src/tachyon/tabs/diagnostic/initController.ts:1100 msgid "Optimize AWG MTU" @@ -4840,10 +4700,6 @@ msgstr "" msgid "Optional context (e.g. \"Rostelecom, YouTube 4K buffering is slow\")..." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1045 -msgid "Optional for local LLM" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8743 msgid "Optional tls-auth or tls-crypt key" msgstr "" @@ -5012,11 +4868,6 @@ msgstr "" msgid "Pending..." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1250 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1303 -msgid "Per-Device Routing" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3158 msgid "Periodically check the current level and switch to a faster server even when the current one works." msgstr "" @@ -5203,7 +5054,6 @@ msgid "Profile Name" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:291 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:657 msgid "Protection" msgstr "" @@ -5758,7 +5608,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3669 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:673 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1295 msgid "Save" msgstr "" @@ -5766,26 +5615,11 @@ msgstr "" msgid "Save a snapshot of the working config and restore it later if something breaks." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1097 -msgid "Save AI Watchdog Settings" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1235 -msgid "Save Smart Detect Settings" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:466 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:645 msgid "Save Snapshot" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:550 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1095 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1235 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1295 -msgid "Saving…" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:655 msgid "Schedule" msgstr "" @@ -5828,10 +5662,6 @@ msgstr "" msgid "Secret token for authorizing WRITE operations (POST/PUT) on /cgi-bin/tachyon-agent/. Leave empty if auth is not required." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:738 -msgid "Secret token for WRITE requests" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1654 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:437 msgid "Section" @@ -5845,18 +5675,10 @@ msgstr "" msgid "Section name" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:894 -msgid "Section or network interface used for Cloudflare WARP API registration. Supports Tachyon sections (Connection, WireGuard, AmneziaWG, Interface) and OpenWrt system network devices/interfaces (awg0, wg0, tun0, etc.). Leave empty to use direct WAN / default mixed proxy." -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10231 msgid "Section Rules Content" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1222 -msgid "Section test order (checked = active, drag rows with △▽):" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1631 msgid "Section used for Cloudflare WARP API registration. If your ISP blocks Cloudflare API on WAN, select a proxy section (with Mixed proxy enabled) or a tunnel interface section (WireGuard / AmneziaWG / VPN). Leave empty to use direct WAN / default mixed proxy." msgstr "" @@ -6149,9 +5971,9 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:3486 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:3505 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:14452 +#: src/tachyon/tabs/diagnostic/initController.ts:609 #: src/tachyon/methods/shell/index.ts:440 #: src/tachyon/methods/shell/index.ts:461 -#: src/tachyon/tabs/diagnostic/initController.ts:609 msgid "Service action failed" msgstr "" @@ -6320,14 +6142,6 @@ msgstr "" msgid "Skipped loopback:" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1192 -msgid "Smart Detect" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:277 -msgid "Smart Detect settings saved" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:643 msgid "Snapshot name" msgstr "" @@ -6506,10 +6320,6 @@ msgstr "" msgid "Start watchdog" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1098 -msgid "Start Watchdog first" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:335 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2124 msgid "Starting…" @@ -6524,7 +6334,6 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:11403 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:333 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/parental.js:733 -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:497 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:670 #: src/tachyon/tabs/diagnostic/partials/renderServiceCheckModal.ts:481 msgid "Status" @@ -6713,10 +6522,6 @@ msgstr "" msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:839 -msgid "Tachyon Sections" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:16822 #: src/tachyon/tabs/monitoring/initController.ts:991 msgid "Tachyon service is stopped. Start the service to display connections." @@ -7057,7 +6862,7 @@ msgid "Time skew tolerance" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:6085 -#: src/tachyon/helpers/singBoxVariant.ts:64 +#: src/tachyon/helpers/singBoxVariant.ts:61 msgid "tiny" msgstr "" @@ -7347,7 +7152,7 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:10170 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:10171 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js:18827 -#: src/tachyon/helpers/singBoxVariant.ts:37 +#: src/tachyon/helpers/singBoxVariant.ts:34 #: src/tachyon/services/systemInfo.service.ts:10 #: src/tachyon/services/systemInfo.service.ts:12 #: src/tachyon/services/systemInfo.service.ts:13 @@ -7796,14 +7601,6 @@ msgstr "" msgid "WARP Private Key" msgstr "" -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:814 -msgid "WARP Proxy Section" -msgstr "" - -#: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:494 -msgid "Watchdog" -msgstr "" - #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1516 msgid "Watchdog probes every Connection section; when the active one fails several checks in a row, traffic switches to a healthy backup and Telegram is notified. Requires a config reload to take effect." msgstr "" diff --git a/tachyon/files/usr/lib/diagnostics/service_check.uc b/tachyon/files/usr/lib/diagnostics/service_check.uc index cfbe8d33..dadcaca8 100644 --- a/tachyon/files/usr/lib/diagnostics/service_check.uc +++ b/tachyon/files/usr/lib/diagnostics/service_check.uc @@ -22,8 +22,6 @@ const DEFAULT_SING_BOX_CONFIG = "/etc/sing-box/config.json"; const NETNS_NAME = "fkpsc"; const NETNS_VETH_HOST = "fkpsc0"; const NETNS_VETH_PEER = "fkpsc1"; -const XHTTP_PATCH = ""; -const ICMP_TPROXY_PATCH = ""; const CONFIG_DIR = "/etc/tachyon/servicecheck"; const GEMINI_API_KEY_FILE = CONFIG_DIR + "/gemini_api_key"; @@ -92,64 +90,6 @@ function write_json(value) { print(sprintf("%J", value), "\n"); } -function xhttp_patch() { - if (fs.stat(XHTTP_PATCH) == null) { - write_json({ success: false, message: "xHTTP-патч не установлен в пакет" }); - return 1; - } - let result = capture_args([ "sh", XHTTP_PATCH ], true); - write_json({ success: result.status == 0, code: result.status, output: trim(as_string(result.output)) }); - return result.status; -} - -function icmp_tproxy_patch() { - if (fs.stat(ICMP_TPROXY_PATCH) == null) { - write_json({ success: false, message: "ICMP/TProxy-патч не установлен в пакет" }); - return 1; - } - let result = capture_args([ "sh", ICMP_TPROXY_PATCH ], true); - write_json({ success: result.status == 0, code: result.status, output: trim(as_string(result.output)) }); - return result.status; -} - -function available_fixes() { - if (fs.stat(TACHYON_BIN) == null) - return []; - - return [ - { - id: "xhttp_import", - title: "Фикс xHTTP импорта подписок", - description: "Исправляет импорт дополнительных полей xHTTP из подписок в parser.uc Tachyon.", - risk: "Создаётся резервная копия parser.uc; патч проверяется через ucode до замены." - }, - { - id: "icmp_tproxy", - title: "Фикс ping/ICMP для правил подсетей", - description: "Ограничивает метку TProxy в priority_rules протоколами TCP и UDP, чтобы ICMP не уходил в локальный TProxy-сокет.", - risk: "Создаётся резервная копия nft/apply.uc; патч проверяется через ucode. Работающий Tachyon перезапускается, live-правила проверяются, а при ошибке выполняется откат." - } - ]; -} - -function list_fixes() { - write_json({ success: true, fixes: available_fixes() }); - return 0; -} - -function run_fix(id) { - if (fs.stat(TACHYON_BIN) == null) { - write_json({ success: false, message: "фиксы доступны только при установленном Tachyon" }); - return 1; - } - - if (as_string(id) == "xhttp_import") - return xhttp_patch(); - if (as_string(id) == "icmp_tproxy") - return icmp_tproxy_patch(); - write_json({ success: false, message: "неизвестный фикс Forkop" }); - return 1; -} function parse_json(value) { try { diff --git a/tachyon/files/usr/lib/service/lifecycle.uc b/tachyon/files/usr/lib/service/lifecycle.uc index e4e40118..9d56bdfc 100644 --- a/tachyon/files/usr/lib/service/lifecycle.uc +++ b/tachyon/files/usr/lib/service/lifecycle.uc @@ -124,7 +124,6 @@ const PARENTAL_QUOTA_UC = LIB_DIR + "/service/parental_quota.uc"; const PACKAGES_UC = LIB_DIR + "/core/packages.uc"; const WATCHDOG_UC = LIB_DIR + "/service/watchdog.uc"; const TELEGRAM_UC = LIB_DIR + "/service/telegram.uc"; -const DNS_PREFETCH_UC = LIB_DIR + "/singbox/dns_prefetch.uc"; let start_subscription_update_lock_held = false; let subscription_caches_prepared = getenv("TACHYON_SUBSCRIPTION_CACHES_PREPARED") || "0"; @@ -813,7 +812,6 @@ function start_main() { module_success(ZAPRET2_UC, [ "start-runtime" ]); module_background(UPDATES_UC, [ "list-update" ]); - module_background(DNS_PREFETCH_UC, [ "prefetch" ]); module_background(LIB_DIR + "/service/lifecycle.uc", [ "discover-awg-mtu" ]); return 0; } diff --git a/tachyon/files/usr/lib/service/telegram.uc b/tachyon/files/usr/lib/service/telegram.uc index 9094a140..10e531ad 100644 --- a/tachyon/files/usr/lib/service/telegram.uc +++ b/tachyon/files/usr/lib/service/telegram.uc @@ -35,41 +35,42 @@ let t = i18n.bind("en"); // the full payload in a small on-disk map and send a short opaque token. const CB_MAP_FILE = "/tmp/tg_cb_map.json"; const CB_MAP_MAX = 300; +let cb_map_cache = null; function cb_map_load() { + if (cb_map_cache != null) + return cb_map_cache; let data = fs.readfile(CB_MAP_FILE); if (data) { try { let obj = json(data); - if (type(obj) == "object") return obj; + if (type(obj) == "object") { + cb_map_cache = obj; + return cb_map_cache; + } } catch (e) { - // A truncated map is recoverable: the tokens in it are short-lived - // and the next store rewrites the file. Starting from empty costs - // the user a "кнопка устарела" on old keyboards, which is what the - // caller reports anyway when a token is missing. command_success_from_args([ "logger", "-t", "tachyon-telegram", "[warn] callback map is unparseable, starting from empty: " + as_string(e) ]); } } - return {}; + cb_map_cache = {}; + return cb_map_cache; } function cb_map_store(token, value) { let map = cb_map_load(); + if (map[token] == value) + return; let ks = keys(map); if (length(ks) >= CB_MAP_MAX) { - // Drop the oldest half so long-lived keyboards keep working for a while let pruned = {}; for (let i = int(length(ks) / 2); i < length(ks); i++) pruned[ks[i]] = map[ks[i]]; map = pruned; + cb_map_cache = map; } map[token] = value; - // The token has already been embedded in the keyboard by the time this runs, - // so a failed write hands the user a button that will answer "кнопка - // устарела" the moment they press it. Silently swallowing that made the - // keyboard look intermittently broken with nothing in the log. let stored = false; try { stored = fs.writefile(CB_MAP_FILE, sprintf("%J", map)) != null; diff --git a/tachyon/files/usr/lib/singbox/dns_prefetch.uc b/tachyon/files/usr/lib/singbox/dns_prefetch.uc deleted file mode 100644 index cb39ed83..00000000 --- a/tachyon/files/usr/lib/singbox/dns_prefetch.uc +++ /dev/null @@ -1,242 +0,0 @@ -#!/usr/bin/env ucode - -// DNS Turbo Cache prefetch worker. -// Resolves domains through the local DNS (127.0.0.1) to pre-populate the -// sing-box FakeIP cache so first-visit latency is 0 ms. -// -// Domain sources (in priority order): -// 1. user_domains / user_domains_text from every active tachyon section -// 2. domain / domain_suffix rule conditions from active sections -// 3. Built-in baseline list of commonly blocked services - -let common = require("core.common"); -let uci_core = require("core.uci"); - -const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; - -// ─── Fallback baseline list ─────────────────────────────────────────────────── -// Used when a user has no custom domains configured yet. Covers the most -// popular Russian-blocked services and their CDN / API subdomains. - -const BASELINE_DOMAINS = [ - // ── Telegram ────────────────────────────────────────────────────────────── - "t.me", "telegram.org", "web.telegram.org", "desktop.telegram.org", - "api.telegram.org", "core.telegram.org", "cdn.telegram.org", - "updates.telegram.org", "media.telegram.org", - - // ── YouTube ─────────────────────────────────────────────────────────────── - "youtube.com", "www.youtube.com", "youtu.be", "m.youtube.com", - "music.youtube.com", "studio.youtube.com", "ytimg.com", "s.ytimg.com", - "i.ytimg.com", "yt3.ggpht.com", "googlevideo.com", "yt.be", - "youtubei.googleapis.com", "youtube-nocookie.com", - - // ── Instagram / Meta ────────────────────────────────────────────────────── - "instagram.com", "www.instagram.com", "cdninstagram.com", - "i.instagram.com", "graph.instagram.com", - "facebook.com", "www.facebook.com", "m.facebook.com", "fbcdn.net", - "messenger.com", "www.messenger.com", "connect.facebook.net", - "whatsapp.com", "www.whatsapp.com", "web.whatsapp.com", - "media.whatsapp.net", "mmg.whatsapp.net", - - // ── Twitter / X ─────────────────────────────────────────────────────────── - "twitter.com", "www.twitter.com", "x.com", "www.x.com", - "t.co", "twimg.com", "abs.twimg.com", "pbs.twimg.com", - "video.twimg.com", "api.twitter.com", "api.x.com", - - // ── Discord ─────────────────────────────────────────────────────────────── - "discord.com", "www.discord.com", "discordapp.com", "discord.gg", - "cdn.discordapp.com", "media.discordapp.net", "gateway.discord.gg", - - // ── Reddit ──────────────────────────────────────────────────────────────── - "reddit.com", "www.reddit.com", "old.reddit.com", "redd.it", - "redditmedia.com", "redditstatic.com", "v.redd.it", "i.redd.it", - - // ── GitHub ──────────────────────────────────────────────────────────────── - "github.com", "api.github.com", "gist.github.com", - "raw.githubusercontent.com", "objects.githubusercontent.com", - "codeload.github.com", "avatars.githubusercontent.com", - "github.githubassets.com", - - // ── Google ──────────────────────────────────────────────────────────────── - "google.com", "www.google.com", "google.ru", "mail.google.com", - "drive.google.com", "docs.google.com", "meet.google.com", - "calendar.google.com", "photos.google.com", "accounts.google.com", - "translate.google.com", "maps.google.com", "lh3.googleusercontent.com", - - // ── Netflix ─────────────────────────────────────────────────────────────── - "netflix.com", "www.netflix.com", "nflxvideo.net", "nflximg.net", "nflxso.net", - - // ── Spotify ─────────────────────────────────────────────────────────────── - "spotify.com", "open.spotify.com", "api.spotify.com", "scdn.co", - - // ── TikTok ──────────────────────────────────────────────────────────────── - "tiktok.com", "www.tiktok.com", "m.tiktok.com", "tiktokcdn.com", - - // ── Twitch ──────────────────────────────────────────────────────────────── - "twitch.tv", "www.twitch.tv", "static-cdn.jtvnw.net", "api.twitch.tv", - - // ── Wikipedia ──────────────────────────────────────────────────────────── - "wikipedia.org", "ru.wikipedia.org", "en.wikipedia.org", - "upload.wikimedia.org", "wikimedia.org", - - // ── LinkedIn / Pinterest / Snapchat ─────────────────────────────────────── - "linkedin.com", "www.linkedin.com", - "pinterest.com", "www.pinterest.com", "i.pinimg.com", - "snapchat.com", "www.snapchat.com", - - // ── Signal ──────────────────────────────────────────────────────────────── - "signal.org", "www.signal.org", "cdn.signal.org", - - // ── Steam / Gaming ──────────────────────────────────────────────────────── - "steampowered.com", "store.steampowered.com", "steamcommunity.com", - "steamcdn-a.akamaihd.net", "cdn.cloudflare.steamstatic.com", - "epicgames.com", "www.epicgames.com", - "roblox.com", "www.roblox.com", - - // ── ProtonMail / Privacy ────────────────────────────────────────────────── - "proton.me", "mail.proton.me", "protonmail.com", - - // ── Medium / Substack ───────────────────────────────────────────────────── - "medium.com", "substack.com", - - // ── News ────────────────────────────────────────────────────────────────── - "bbc.com", "bbc.co.uk", "reuters.com", "theguardian.com", "nytimes.com", - - // ── Misc ────────────────────────────────────────────────────────────────── - "patreon.com", "canva.com", "notion.so", "figma.com", - "slack.com", "zoom.us", "dropbox.com", -]; - -// ─── Domain extraction from UCI sections ───────────────────────────────────── - -function list_to_array(value) { - if (type(value) == "array") - return value; - let s = trim(common.as_string(value)); - return s != "" ? [ s ] : []; -} - -function parse_text_domains(text) { - let result = []; - for (let line in split(common.as_string(text), /[\n\r]+/)) { - // Strip full-line comments (# or // style) - line = trim(line); - if (line == "" || substr(line, 0, 1) == "#" || substr(line, 0, 2) == "//") - continue; - // Strip inline comments - line = replace(line, /[ \t]+\/\/.*$/, ""); - line = replace(line, /[ \t]+#.*$/, ""); - for (let token in split(line, /[,\s]+/)) { - token = trim(token); - // Strip leading dots (domain_suffix style) and wildcards - token = replace(token, /^\*?\./, ""); - if (token != "" && substr(token, 0, 1) != "#" && substr(token, 0, 2) != "//") - push(result, token); - } - } - return result; -} - -function collect_section_domains(section) { - let result = []; - let list_type = common.as_string(section.user_domain_list_type || "disabled"); - - // user_domains (UCI list, type=dynamic) - if (list_type == "dynamic") { - for (let d in list_to_array(section.user_domains)) - for (let x in parse_text_domains(d)) - push(result, x); - } - - // user_domains_text (textarea, type=text) - if (list_type == "text") { - for (let x in parse_text_domains(common.as_string(section.user_domains_text || ""))) - push(result, x); - } - - // domain / domain_suffix rule conditions - for (let key in [ "domain", "domain_suffix" ]) { - for (let d in list_to_array(section[key])) - for (let x in parse_text_domains(d)) - push(result, x); - let text = common.as_string(section[key + "s"] || ""); // plural textarea - if (text != "") - for (let x in parse_text_domains(text)) - push(result, x); - } - - return result; -} - -function collect_user_domains() { - let seen = {}; - let result = []; - - uci_core.foreach(CONFIG_NAME, "section", function(section) { - if (section.enabled == "0") - return; - for (let domain in collect_section_domains(section)) { - domain = lc(trim(domain)); - if (domain != "" && !seen[domain]) { - seen[domain] = true; - push(result, domain); - } - } - }); - - return result; -} - -// ─── Prefetch ───────────────────────────────────────────────────────────────── - -function prefetch() { - let settings = common.object_or_empty(uci_core.get_all(CONFIG_NAME, "settings")); - if (!common.bool_option(settings, "dns_turbo_cache", true)) - return; - - // Give sing-box time to fully initialize — poll instead of blocking sleep - let ready = false; - for (let i = 0; i < 20; i++) { - if (common.command_success_from_args(["nslookup", "localhost", "127.0.0.1"])) { - ready = true; - break; - } - common.command_success_from_args(["sleep", "1"]); - } - if (!ready) return; - - // 1. Collect domains from user's actual sections (highest priority) - let seen = {}; - let domains = []; - - for (let d in collect_user_domains()) { - if (!seen[d]) { - seen[d] = true; - push(domains, d); - } - } - - // 2. Merge baseline list (skip already queued) - for (let d in BASELINE_DOMAINS) { - d = lc(d); - if (!seen[d]) { - seen[d] = true; - push(domains, d); - } - } - - // 3. Resolve all via local DNS to warm FakeIP cache (batched parallel) - let batch = []; - for (let i, domain in domains) { - push(batch, common.shell_quote(domain)); - if (length(batch) >= 15 || i == length(domains) - 1) { - let batch_cmd = "for d in " + join(" ", batch) + "; do nslookup \"$d\" 127.0.0.1 >/dev/null 2>&1; done &"; - common.command_success_from_args(["sh", "-c", batch_cmd]); - batch = []; - } - } -} - -let mode = ARGV[0]; -if (mode == "prefetch") - prefetch();