From 8ecc3ee685401752e77ee3b05f0a858f50c04dba Mon Sep 17 00:00:00 2001 From: Dushnilin Date: Fri, 14 Aug 2026 13:20:33 +0300 Subject: [PATCH] feat(updates): live operation log with page lock in progress modal The progress modal faked its steps on a timer because the worker only wrote to syslog. Now every updates_log line is appended to .log (UPDATES_JOB_LOG), the running state advertises log_path, the log survives job completion until the TTL sweep, and the new component_action_log CLI mode serves it from a byte offset. The UI polls it into a monospace panel with auto-scroll, exposes a Copy log button, and the modal cannot be closed while the job runs (only the disabled progress button is shown). --- fe-app-tachyon/fill-po-translations.js | 4 + fe-app-tachyon/locales/calls.json | 917 ++++++++++-------- fe-app-tachyon/locales/tachyon.pot | 788 ++++++++------- fe-app-tachyon/locales/tachyon.ru.po | 542 ++--------- .../src/tachyon/methods/shell/index.ts | 28 + .../tachyon/tabs/updates/initController.ts | 2 + .../partials/renderUpdateProgressModal.ts | 140 +++ .../src/tachyon/tabs/updates/styles.ts | 35 + .../updates/tests/updateProgressModal.test.ts | 91 +- fe-app-tachyon/src/tachyon/types.ts | 7 + .../resources/view/tachyon/main.js | 177 ++++ luci-app-tachyon/po/ru/tachyon.po | 542 ++--------- luci-app-tachyon/po/templates/tachyon.pot | 788 ++++++++------- tachyon/files/usr/bin/tachyon | 3 + tachyon/files/usr/lib/components/action.uc | 20 +- tachyon/files/usr/lib/components/updates.uc | 40 +- tests/component_action_log.sh | 115 +++ 17 files changed, 2159 insertions(+), 2080 deletions(-) create mode 100644 tests/component_action_log.sh diff --git a/fe-app-tachyon/fill-po-translations.js b/fe-app-tachyon/fill-po-translations.js index a382f55f..3b19925c 100644 --- a/fe-app-tachyon/fill-po-translations.js +++ b/fe-app-tachyon/fill-po-translations.js @@ -76,6 +76,10 @@ const dictionary = { "Reloading page in": "Перезагрузка страницы через", "Please wait, operation is running...": "Пожалуйста, подождите, выполняется операция...", "Operation failed": "Операция не выполнена", + "Operation log": "Лог операции", + "Copy log": "Копировать лог", + "Operation log is not available": "Лог операции недоступен", + "Failed to read operation log": "Не удалось прочитать лог операции", "Direct": "Напрямую", // === Новые UI-строки (settings.js, section.js) === diff --git a/fe-app-tachyon/locales/calls.json b/fe-app-tachyon/locales/calls.json index c889bfd4..4c0f646a 100644 --- a/fe-app-tachyon/locales/calls.json +++ b/fe-app-tachyon/locales/calls.json @@ -25,7 +25,7 @@ "call": "(provider default)", "key": "(provider default)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1375" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1665" ] }, { @@ -81,14 +81,14 @@ "call": "⚠️ If all Bootstrap DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss.", "key": "⚠️ If all Bootstrap DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:668" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:906" ] }, { "call": "⚠️ If all Main DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss.", "key": "⚠️ If all Main DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:659" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:897" ] }, { @@ -253,7 +253,7 @@ "call": "Administrator Chat IDs", "key": "Administrator Chat IDs", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1781" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2071" ] }, { @@ -267,7 +267,7 @@ "call": "Advanced System", "key": "Advanced System", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:584" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:822" ] }, { @@ -281,7 +281,7 @@ "call": "AI & Watchdog", "key": "AI & Watchdog", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:583" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:821" ] }, { @@ -295,14 +295,14 @@ "call": "AI Agent REST API Bearer Token", "key": "AI Agent REST API Bearer Token", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1327" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1617" ] }, { "call": "AI API Key", "key": "AI API Key", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1394", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1684", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:893" ] }, @@ -331,23 +331,23 @@ "call": "AI Doctor Diagnosis", "key": "AI Doctor Diagnosis", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1154" + "src/tachyon/tabs/diagnostic/initController.ts:1158" ] }, { "call": "AI Doctor failed", "key": "AI Doctor failed", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:843", - "src/tachyon/tabs/diagnostic/initController.ts:1160", - "src/tachyon/tabs/diagnostic/initController.ts:1168" + "src/tachyon/tabs/diagnostic/initController.ts:847", + "src/tachyon/tabs/diagnostic/initController.ts:1164", + "src/tachyon/tabs/diagnostic/initController.ts:1172" ] }, { "call": "AI Doctor Language", "key": "AI Doctor Language", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1381", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1671", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:860" ] }, @@ -355,7 +355,7 @@ "call": "AI Model", "key": "AI Model", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1368", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1658", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:836" ] }, @@ -363,7 +363,7 @@ "call": "AI Provider", "key": "AI Provider", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1352", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1642", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:766" ] }, @@ -464,7 +464,7 @@ "call": "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall.", "key": "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:959" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1197" ] }, { @@ -478,7 +478,7 @@ "call": "Allows Tachyon to send diagnostic snapshots to ChatGPT or DeepSeek API for intelligent root-cause analysis and auto-repair recommendations.", "key": "Allows Tachyon to send diagnostic snapshots to ChatGPT or DeepSeek API for intelligent root-cause analysis and auto-repair recommendations.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1341" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1631" ] }, { @@ -499,14 +499,14 @@ "call": "Another component action is already running", "key": "Another component action is already running", "places": [ - "src/tachyon/tabs/updates/initController.ts:835" + "src/tachyon/tabs/updates/initController.ts:836" ] }, { "call": "API Key for OpenAI (sk-...) or DeepSeek (optional for Ollama / LM Studio)", "key": "API Key for OpenAI (sk-...) or DeepSeek (optional for Ollama / LM Studio)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1395" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1685" ] }, { @@ -527,14 +527,14 @@ "call": "Applying changes & reloading services...", "key": "Applying changes & reloading services...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:133" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:138" ] }, { "call": "Applying fix", "key": "Applying fix", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:995" + "src/tachyon/tabs/diagnostic/initController.ts:999" ] }, { @@ -548,7 +548,7 @@ "call": "At least one Admin Chat ID is required", "key": "At least one Admin Chat ID is required", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1792" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2082" ] }, { @@ -583,7 +583,7 @@ "call": "Auto-detected domains", "key": "Auto-detected domains", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1584" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1874" ] }, { @@ -597,7 +597,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:1544", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1834", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1053" ] }, @@ -619,7 +619,7 @@ "call": "Automatic component update checks", "key": "Automatic component update checks", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1094" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1372" ] }, { @@ -640,7 +640,7 @@ "call": "Automatically check installed components for new versions", "key": "Automatically check installed components for new versions", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1095" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1373" ] }, { @@ -654,7 +654,7 @@ "call": "Automatically increase check intervals when healthy (to 5 min) and decrease on problems (to 120s).", "key": "Automatically increase check intervals when healthy (to 5 min) and decrease on problems (to 120s).", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1518" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1808" ] }, { @@ -721,14 +721,14 @@ "call": "Bootstrap DNS Servers", "key": "Bootstrap DNS Servers", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:622" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:860" ] }, { "call": "Bot Status", "key": "Bot Status", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1743" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2033" ] }, { @@ -757,7 +757,7 @@ "call": "Bug report downloaded", "key": "Bug report downloaded", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1258" + "src/tachyon/tabs/diagnostic/initController.ts:1262" ] }, { @@ -865,7 +865,7 @@ "call": "Bypasses UDP traffic for selected game consoles (PS5/Xbox) to achieve NAT Type 1 / 2 (Full Cone NAT) for P2P matchmaking, while keeping TCP (PSN/Auth) routed through the proxy.", "key": "Bypasses UDP traffic for selected game consoles (PS5/Xbox) to achieve NAT Type 1 / 2 (Full Cone NAT) for P2P matchmaking, while keeping TCP (PSN/Auth) routed through the proxy.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1008" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1286" ] }, { @@ -879,21 +879,21 @@ "call": "Cache all built-in lists and databases even if they are not currently selected in any section. Recommended if you have plenty of storage space or USB drive.", "key": "Cache all built-in lists and databases even if they are not currently selected in any section. Recommended if you have plenty of storage space or USB drive.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1082" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1360" ] }, { "call": "Cache File Path", "key": "Cache File Path", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1225" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1503" ] }, { "call": "Cache file path cannot be empty", "key": "Cache file path cannot be empty", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1239" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1517" ] }, { @@ -901,6 +901,9 @@ "key": "Cancel", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:434", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:575", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:607", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:655", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7712" ] }, @@ -937,7 +940,7 @@ "key": "Check completed!", "places": [ "src/tachyon/tabs/updates/initController.ts:498", - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:363" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:481" ] }, { @@ -975,7 +978,7 @@ "call": "Check update", "key": "Check update", "places": [ - "src/tachyon/tabs/updates/initController.ts:903" + "src/tachyon/tabs/updates/initController.ts:905" ] }, { @@ -1005,14 +1008,14 @@ "call": "Checking for updates...", "key": "Checking for updates...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:109" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:114" ] }, { "call": "Checking, please wait", "key": "Checking, please wait", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1552", + "src/tachyon/tabs/diagnostic/initController.ts:1556", "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:14", "src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:15", "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:15", @@ -1039,7 +1042,7 @@ "key": "Checking…", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:275", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1635" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1925" ] }, { @@ -1119,7 +1122,7 @@ "call": "Cleaning configuration & reloading...", "key": "Cleaning configuration & reloading...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:126" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:131" ] }, { @@ -1151,12 +1154,12 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10221", "src/partials/modal/renderModal.ts:263", "src/tachyon/tabs/dashboard/initController.ts:1085", + "src/tachyon/tabs/diagnostic/initController.ts:1148", "src/tachyon/tabs/monitoring/initController.ts:884", "src/tachyon/tabs/monitoring/initController.ts:934", - "src/tachyon/tabs/diagnostic/initController.ts:1144", "src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212", - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:416", - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:461" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:534", + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:580" ] }, { @@ -1215,7 +1218,7 @@ "call": "Comma-separated list of Telegram user IDs authorized to control the bot.", "key": "Comma-separated list of Telegram user IDs authorized to control the bot.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1782" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2072" ] }, { @@ -1229,7 +1232,7 @@ "call": "Comparing versions & fingerprint check...", "key": "Comparing versions & fingerprint check...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:120" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:125" ] }, { @@ -1243,7 +1246,7 @@ "call": "Component update check interval", "key": "Component update check interval", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1104" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1382" ] }, { @@ -1264,7 +1267,14 @@ "call": "Config File Path", "key": "Config File Path", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1211" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1489" + ] + }, + { + "call": "Config Snapshots", + "key": "Config Snapshots", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1592" ] }, { @@ -1308,7 +1318,7 @@ "call": "Connecting to update server...", "key": "Connecting to update server...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:118" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:123" ] }, { @@ -1346,6 +1356,13 @@ "src/partials/modal/renderModal.ts:258" ] }, + { + "call": "Copy log", + "key": "Copy log", + "places": [ + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:235" + ] + }, { "call": "Copy proxy link", "key": "Copy proxy link", @@ -1373,7 +1390,7 @@ "call": "Current Diagnosis", "key": "Current Diagnosis", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1110" + "src/tachyon/tabs/diagnostic/initController.ts:1114" ] }, { @@ -1401,7 +1418,7 @@ "call": "Custom API Endpoint URL", "key": "Custom API Endpoint URL", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1405", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1695", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:915" ] }, @@ -1423,14 +1440,14 @@ "call": "Custom OpenAI-Compatible API (OpenRouter)", "key": "Custom OpenAI-Compatible API (OpenRouter)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1361" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1651" ] }, { "call": "Custom OpenAI-compatible API endpoint URL (e.g. http://192.168.1.100:11434/v1/chat/completions)", "key": "Custom OpenAI-compatible API endpoint URL (e.g. http://192.168.1.100:11434/v1/chat/completions)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1406" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1696" ] }, { @@ -1451,28 +1468,50 @@ "call": "Default (auto)", "key": "Default (auto)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1908" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2198" ] }, { "call": "Default address for checking server availability and latency. URLTest uses its own address.", "key": "Default address for checking server availability and latency. URLTest uses its own address.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1141" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1419" ] }, { "call": "Delay in milliseconds before reloading Tachyon after interface UP", "key": "Delay in milliseconds before reloading Tachyon after interface UP", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:932" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1170" ] }, { "call": "Delay value cannot be empty", "key": "Delay value cannot be empty", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:939" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1177" + ] + }, + { + "call": "Delete", + "key": "Delete", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:615", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:621" + ] + }, + { + "call": "Delete Snapshot", + "key": "Delete Snapshot", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:597" + ] + }, + { + "call": "Delete the snapshot", + "key": "Delete the snapshot", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:599" ] }, { @@ -1488,7 +1527,7 @@ "call": "Detects and drops STUN/TURN packets in nftables to prevent real IP leaks via WebRTC.", "key": "Detects and drops STUN/TURN packets in nftables to prevent real IP leaks via WebRTC.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1281" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1559" ] }, { @@ -1572,14 +1611,14 @@ "call": "Disable QUIC", "key": "Disable QUIC", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:983" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1221" ] }, { "call": "Disable the QUIC protocol to improve compatibility or fix issues with video streaming", "key": "Disable the QUIC protocol to improve compatibility or fix issues with video streaming", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:984" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1222" ] }, { @@ -1609,21 +1648,21 @@ "call": "DNS Check Interval", "key": "DNS Check Interval", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:677" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:915" ] }, { "call": "DNS Check Interval (s)", "key": "DNS Check Interval (s)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1462" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1752" ] }, { "call": "DNS Failures Before Switching", "key": "DNS Failures Before Switching", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:706" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:944" ] }, { @@ -1637,7 +1676,7 @@ "call": "DNS over HTTPS (DoH)", "key": "DNS over HTTPS (DoH)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:595", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:833", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1814" ] }, @@ -1645,7 +1684,7 @@ "call": "DNS over QUIC (DoQ)", "key": "DNS over QUIC (DoQ)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:597", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:835", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1816" ] }, @@ -1653,7 +1692,7 @@ "call": "DNS over TLS (DoT)", "key": "DNS over TLS (DoT)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:596", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:834", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1815" ] }, @@ -1669,7 +1708,7 @@ "call": "DNS Protocol Type", "key": "DNS Protocol Type", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:592" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:830" ] }, { @@ -1684,7 +1723,7 @@ "call": "DNS requests through section", "key": "DNS requests through section", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:787", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1025", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7357" ] }, @@ -1692,7 +1731,7 @@ "call": "DNS Rewrite TTL", "key": "DNS Rewrite TTL", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:734" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:972" ] }, { @@ -1722,42 +1761,42 @@ "call": "DNS server used to obtain IP addresses for upstream DNS and proxies. If multiple servers are selected, a timeout switches to a backup.", "key": "DNS server used to obtain IP addresses for upstream DNS and proxies. If multiple servers are selected, a timeout switches to a backup.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:623" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:861" ] }, { "call": "DNS Servers", "key": "DNS Servers", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:608" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:846" ] }, { "call": "DNS Settings", "key": "DNS Settings", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:579" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:817" ] }, { "call": "DNS Strategy", "key": "DNS Strategy", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:766" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1004" ] }, { "call": "DNS Successful Checks Before Recovery", "key": "DNS Successful Checks Before Recovery", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:720" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:958" ] }, { "call": "DNS through proxy", "key": "DNS through proxy", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:778" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1016" ] }, { @@ -1771,7 +1810,7 @@ "call": "DNS Turbo Cache", "key": "DNS Turbo Cache", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:756", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:994", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:479" ] }, @@ -1786,7 +1825,7 @@ "call": "DNS Unavailability Timeout", "key": "DNS Unavailability Timeout", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:695" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:933" ] }, { @@ -1843,8 +1882,8 @@ "key": "Doctor failed", "places": [ "src/tachyon/tabs/diagnostic/initController.ts:721", - "src/tachyon/tabs/diagnostic/initController.ts:759", - "src/tachyon/tabs/diagnostic/initController.ts:767" + "src/tachyon/tabs/diagnostic/initController.ts:763", + "src/tachyon/tabs/diagnostic/initController.ts:771" ] }, { @@ -1852,7 +1891,8 @@ "key": "Doctor repair", "places": [ "src/tachyon/tabs/diagnostic/initController.ts:737", - "src/tachyon/tabs/diagnostic/initController.ts:746" + "src/tachyon/tabs/diagnostic/initController.ts:749", + "src/tachyon/tabs/diagnostic/initController.ts:750" ] }, { @@ -1887,7 +1927,7 @@ "call": "Domain test sections", "key": "Domain test sections", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1556" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1846" ] }, { @@ -1916,7 +1956,7 @@ "call": "Dont Touch My DHCP!", "key": "Dont Touch My DHCP!", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1201" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1479" ] }, { @@ -1938,42 +1978,42 @@ "call": "Download component packages via the selected section", "key": "Download component packages via the selected section", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1180" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1458" ] }, { "call": "Download components through", "key": "Download components through", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1188" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1466" ] }, { "call": "Download components through a section", "key": "Download components through a section", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1179" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1457" ] }, { "call": "Download lists through", "key": "Download lists through", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1166" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1444" ] }, { "call": "Download lists through a section", "key": "Download lists through a section", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1157" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1435" ] }, { "call": "Download remote lists and rule sets via the selected section", "key": "Download remote lists and rule sets via the selected section", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1158" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1436" ] }, { @@ -2009,7 +2049,7 @@ "call": "Downloading package from repository...", "key": "Downloading package from repository...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:130" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:135" ] }, { @@ -2055,6 +2095,13 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8687" ] }, + { + "call": "Each entry must be \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp), e.g. tcp:6881,udp:6881-6889", + "key": "Each entry must be \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp), e.g. tcp:6881,udp:6881-6889", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1260" + ] + }, { "call": "Enable", "key": "Enable", @@ -2066,14 +2113,14 @@ "call": "Enable Adaptive Intervals", "key": "Enable Adaptive Intervals", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1517" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1807" ] }, { "call": "Enable AI Doctor (ChatGPT / LLM Analysis)", "key": "Enable AI Doctor (ChatGPT / LLM Analysis)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1340" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1630" ] }, { @@ -2087,14 +2134,14 @@ "call": "Enable Anomaly Detection", "key": "Enable Anomaly Detection", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1524" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1814" ] }, { "call": "Enable automatic updates for remote lists and rule sets", "key": "Enable automatic updates for remote lists and rule sets", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1035" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1313" ] }, { @@ -2115,14 +2162,14 @@ "call": "Enable Config Validation", "key": "Enable Config Validation", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1496" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1786" ] }, { "call": "Enable DNS Continuous Check", "key": "Enable DNS Continuous Check", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1456" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1746" ] }, { @@ -2136,28 +2183,28 @@ "call": "Enable Firewall Reload Dedup", "key": "Enable Firewall Reload Dedup", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1469" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1759" ] }, { "call": "Enable Graceful Degradation", "key": "Enable Graceful Degradation", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1503" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1793" ] }, { "call": "Enable Health Metrics", "key": "Enable Health Metrics", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1476" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1766" ] }, { "call": "Enable list updates", "key": "Enable list updates", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1034" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1312" ] }, { @@ -2178,28 +2225,28 @@ "call": "Enable Output Network Interface", "key": "Enable Output Network Interface", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:834" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1072" ] }, { "call": "Enable Proxy Health Monitor", "key": "Enable Proxy Health Monitor", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1432" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1722" ] }, { "call": "Enable Smart Cooldowns", "key": "Enable Smart Cooldowns", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1489" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1779" ] }, { "call": "Enable Smart Detect", "key": "Enable Smart Detect", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1543", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1833", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1070" ] }, @@ -2207,56 +2254,56 @@ "call": "Enable Telegram Bot", "key": "Enable Telegram Bot", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1753" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2043" ] }, { "call": "Enable WAN DNS Fallback for Bootstrap DNS", "key": "Enable WAN DNS Fallback for Bootstrap DNS", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:667" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:905" ] }, { "call": "Enable WAN DNS Fallback for Main DNS", "key": "Enable WAN DNS Fallback for Main DNS", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:658" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:896" ] }, { "call": "Enable Watchdog", "key": "Enable Watchdog", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1314" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1604" ] }, { "call": "Enable YACD", "key": "Enable YACD", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:948" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1186" ] }, { "call": "Enable YACD WAN Access", "key": "Enable YACD WAN Access", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:958" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1196" ] }, { "call": "Enables the background daemon that polls Telegram for commands and sends notifications.", "key": "Enables the background daemon that polls Telegram for commands and sends notifications.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1754" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2044" ] }, { "call": "Enables the background watchdog process to monitor services and auto-recover on failures.", "key": "Enables the background watchdog process to monitor services and auto-recover on failures.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1315" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1605" ] }, { @@ -2295,7 +2342,7 @@ "call": "Enter the API token obtained from @BotFather.", "key": "Enter the API token obtained from @BotFather.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1765" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2055" ] }, { @@ -2316,7 +2363,7 @@ "call": "Environment preparation & dependency check...", "key": "Environment preparation & dependency check...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:129" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:134" ] }, { @@ -2467,7 +2514,7 @@ "call": "Failed to apply fix", "key": "Failed to apply fix", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1015" + "src/tachyon/tabs/diagnostic/initController.ts:1019" ] }, { @@ -2493,23 +2540,30 @@ "src/helpers/copyToClipboard.ts:12" ] }, + { + "call": "Failed to delete snapshot", + "key": "Failed to delete snapshot", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:527" + ] + }, { "call": "Failed to execute", "key": "Failed to execute", "places": [ - "src/tachyon/methods/shell/index.ts:171", - "src/tachyon/methods/shell/index.ts:178", + "src/tachyon/methods/shell/index.ts:172", + "src/tachyon/methods/shell/index.ts:179", "src/tachyon/tabs/updates/initController.ts:616", "src/tachyon/tabs/updates/initController.ts:617", - "src/tachyon/tabs/updates/initController.ts:690", - "src/tachyon/tabs/updates/initController.ts:881" + "src/tachyon/tabs/updates/initController.ts:691", + "src/tachyon/tabs/updates/initController.ts:883" ] }, { "call": "Failed to generate bug report", "key": "Failed to generate bug report", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1261" + "src/tachyon/tabs/diagnostic/initController.ts:1265" ] }, { @@ -2520,6 +2574,13 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8094" ] }, + { + "call": "Failed to load snapshots", + "key": "Failed to load snapshots", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:630" + ] + }, { "call": "Failed to parse file:", "key": "Failed to parse file:", @@ -2534,6 +2595,13 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8148" ] }, + { + "call": "Failed to read operation log", + "key": "Failed to read operation log", + "places": [ + "src/tachyon/methods/shell/index.ts:626" + ] + }, { "call": "Failed to receive response from AI service.", "key": "Failed to receive response from AI service.", @@ -2548,6 +2616,13 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:417" ] }, + { + "call": "Failed to restore snapshot", + "key": "Failed to restore snapshot", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:516" + ] + }, { "call": "Failed to save AI Watchdog settings", "key": "Failed to save AI Watchdog settings", @@ -2576,11 +2651,18 @@ "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:239" ] }, + { + "call": "Failed to save snapshot", + "key": "Failed to save snapshot", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:669" + ] + }, { "call": "Failed to start bot", "key": "Failed to start bot", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1699" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1989" ] }, { @@ -2594,7 +2676,7 @@ "call": "Failed to stop bot", "key": "Failed to stop bot", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1713" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2003" ] }, { @@ -2642,7 +2724,7 @@ "call": "Faster DNS health monitoring than the default cycle. Switches bootstrap DNS on failure.", "key": "Faster DNS health monitoring than the default cycle. Switches bootstrap DNS on failure.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1457" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1747" ] }, { @@ -2664,7 +2746,7 @@ "call": "Fetching release & commit metadata...", "key": "Fetching release & commit metadata...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:119" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:124" ] }, { @@ -2692,7 +2774,7 @@ "call": "Fix applied", "key": "Fix applied", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1010" + "src/tachyon/tabs/diagnostic/initController.ts:1014" ] }, { @@ -2707,7 +2789,7 @@ "key": "Fixed", "places": [ "src/tachyon/tabs/diagnostic/initController.ts:743", - "src/tachyon/tabs/diagnostic/initController.ts:1006" + "src/tachyon/tabs/diagnostic/initController.ts:1010" ] }, { @@ -2721,7 +2803,7 @@ "call": "Forces sing-box to tunnel DNS requests via DoQ with Encrypted Client Hello (ECH) for SNI hiding.", "key": "Forces sing-box to tunnel DNS requests via DoQ with Encrypted Client Hello (ECH) for SNI hiding.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1291" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1569" ] }, { @@ -2749,14 +2831,14 @@ "call": "Game Console IPs", "key": "Game Console IPs", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1017" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1295" ] }, { "call": "Game Console Optimizer (NAT Type 1)", "key": "Game Console Optimizer (NAT Type 1)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1007" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1285" ] }, { @@ -2860,6 +2942,13 @@ "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:109" ] }, + { + "call": "Give the snapshot a name. It is saved with the current date and can be restored from this list later.", + "key": "Give the snapshot a name. It is saved with the current date and can be restored from this list later.", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:646" + ] + }, { "call": "Global check", "key": "Global check", @@ -2977,14 +3066,14 @@ "call": "Higher-priority DNS Check", "key": "Higher-priority DNS Check", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:686" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:924" ] }, { "call": "History", "key": "History", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1122" + "src/tachyon/tabs/diagnostic/initController.ts:1126" ] }, { @@ -3013,7 +3102,7 @@ "call": "How many hours of metrics to keep (default 24).", "key": "How many hours of metrics to keep (default 24).", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1483" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1773" ] }, { @@ -3034,35 +3123,35 @@ "call": "How often to check DNS health in seconds (default 60).", "key": "How often to check DNS health in seconds (default 60).", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1463" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1753" ] }, { "call": "How often to check proxy health in seconds (fast tier, default 30).", "key": "How often to check proxy health in seconds (fast tier, default 30).", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1439" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1729" ] }, { "call": "How often to check Telegram for new messages (default: 5).", "key": "How often to check Telegram for new messages (default: 5).", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1805" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2095" ] }, { "call": "How often to check the active DNS servers.", "key": "How often to check the active DNS servers.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:678" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:916" ] }, { "call": "How often to check whether a higher-priority DNS server has recovered.", "key": "How often to check whether a higher-priority DNS server has recovered.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:687" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:925" ] }, { @@ -3106,7 +3195,7 @@ "call": "If one health check fails with an error, continue running other checks instead of stopping.", "key": "If one health check fails with an error, continue running other checks instead of stopping.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1504" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1794" ] }, { @@ -3257,22 +3346,22 @@ "call": "Install", "key": "Install", "places": [ - "src/tachyon/tabs/updates/initController.ts:917", - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:405" + "src/tachyon/tabs/updates/initController.ts:919", + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:523" ] }, { "call": "Install another build:", "key": "Install another build:", "places": [ - "src/tachyon/tabs/updates/initController.ts:1411" + "src/tachyon/tabs/updates/initController.ts:1413" ] }, { "call": "Installed build → Available build", "key": "Installed build → Available build", "places": [ - "src/tachyon/tabs/updates/initController.ts:1269" + "src/tachyon/tabs/updates/initController.ts:1271" ] }, { @@ -3280,28 +3369,28 @@ "key": "Installed version is newer than release", "places": [ "src/tachyon/tabs/updates/initController.ts:341", - "src/tachyon/tabs/updates/initController.ts:1277" + "src/tachyon/tabs/updates/initController.ts:1279" ] }, { "call": "Interface Monitoring", "key": "Interface Monitoring", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:897" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1135" ] }, { "call": "Interface Monitoring Delay", "key": "Interface Monitoring Delay", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:931" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1169" ] }, { "call": "Interface monitoring for Bad WAN", "key": "Interface monitoring for Bad WAN", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:898" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1136" ] }, { @@ -3836,21 +3925,21 @@ "call": "IPv4 only", "key": "IPv4 only", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:768" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1006" ] }, { "call": "IPv6 only", "key": "IPv6 only", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:770" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1008" ] }, { "call": "Isolate BitTorrent traffic and force it direct to prevent VPN bans", "key": "Isolate BitTorrent traffic and force it direct to prevent VPN bans", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1234" ] }, { @@ -3966,7 +4055,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:757", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:484" ] }, @@ -3988,22 +4077,22 @@ "call": "Language for AI Doctor diagnosis responses", "key": "Language for AI Doctor diagnosis responses", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1382" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1672" ] }, { "call": "Latency test failed", "key": "Latency test failed", "places": [ - "src/tachyon/methods/shell/index.ts:480", - "src/tachyon/methods/shell/index.ts:501" + "src/tachyon/methods/shell/index.ts:481", + "src/tachyon/methods/shell/index.ts:502" ] }, { "call": "Latency test URL", "key": "Latency test URL", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1140" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1418" ] }, { @@ -4011,14 +4100,14 @@ "key": "Latest version is installed", "places": [ "src/tachyon/tabs/updates/initController.ts:344", - "src/tachyon/tabs/updates/initController.ts:1275" + "src/tachyon/tabs/updates/initController.ts:1277" ] }, { "call": "Latest version:", "key": "Latest version:", "places": [ - "src/tachyon/tabs/updates/initController.ts:1277" + "src/tachyon/tabs/updates/initController.ts:1279" ] }, { @@ -4053,14 +4142,14 @@ "call": "List of domains automatically detected and the section they were added to. To edit or remove them, open the routing rules of the respective section.", "key": "List of domains automatically detected and the section they were added to. To edit or remove them, open the routing rules of the respective section.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1585" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1875" ] }, { "call": "List Update Frequency", "key": "List Update Frequency", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1044" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1322" ] }, { @@ -4074,7 +4163,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:1360", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1650", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:821" ] }, @@ -4126,11 +4215,11 @@ "call": "Loading...", "key": "Loading...", "places": [ - "src/tachyon/tabs/updates/initController.ts:1119", - "src/tachyon/tabs/updates/initController.ts:1134", - "src/tachyon/tabs/updates/initController.ts:1152", - "src/tachyon/tabs/updates/initController.ts:1166", - "src/tachyon/tabs/updates/initController.ts:1180" + "src/tachyon/tabs/updates/initController.ts:1121", + "src/tachyon/tabs/updates/initController.ts:1136", + "src/tachyon/tabs/updates/initController.ts:1154", + "src/tachyon/tabs/updates/initController.ts:1168", + "src/tachyon/tabs/updates/initController.ts:1182" ] }, { @@ -4151,7 +4240,7 @@ "call": "Log Level", "key": "Log Level", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1262" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1540" ] }, { @@ -4172,7 +4261,7 @@ "call": "Main DNS server. If multiple servers are selected, a timeout switches to a backup.", "key": "Main DNS server. If multiple servers are selected, a timeout switches to a backup.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:609" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:847" ] }, { @@ -4228,14 +4317,14 @@ "call": "Max reconnects per hour before alert (default 10).", "key": "Max reconnects per hour before alert (default 10).", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1531" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1821" ] }, { "call": "Maximum time to wait for example.com to resolve during a DNS health check.", "key": "Maximum time to wait for example.com to resolve during a DNS health check.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:696" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:934" ] }, { @@ -4249,7 +4338,7 @@ "call": "Metrics Retention (hours)", "key": "Metrics Retention (hours)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1482" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1772" ] }, { @@ -4284,14 +4373,14 @@ "call": "Model name to use. Leave empty to use default (gpt-4o-mini / claude-3-5-haiku / deepseek-chat / llama3:latest).", "key": "Model name to use. Leave empty to use default (gpt-4o-mini / claude-3-5-haiku / deepseek-chat / llama3:latest).", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1369" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1659" ] }, { "call": "Monitored Interfaces", "key": "Monitored Interfaces", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:907" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1145" ] }, { @@ -4305,7 +4394,7 @@ "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.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1525" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1815" ] }, { @@ -4333,7 +4422,7 @@ "call": "Must be a comma-separated list of numeric IDs", "key": "Must be a comma-separated list of numeric IDs", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1795" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2085" ] }, { @@ -4370,7 +4459,7 @@ "call": "Network & Interfaces", "key": "Network & Interfaces", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:580" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:818" ] }, { @@ -4474,7 +4563,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:465", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:703", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1112" ] }, @@ -4503,14 +4592,14 @@ "call": "No diagnostic history available yet.", "key": "No diagnostic history available yet.", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1042" + "src/tachyon/tabs/diagnostic/initController.ts:1046" ] }, { "call": "No domains detected yet", "key": "No domains detected yet", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1600" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1890" ] }, { @@ -4531,7 +4620,7 @@ "call": "No issues found", "key": "No issues found", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:746" + "src/tachyon/tabs/diagnostic/initController.ts:750" ] }, { @@ -4552,7 +4641,7 @@ "call": "No quick fix required", "key": "No quick fix required", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1032" + "src/tachyon/tabs/diagnostic/initController.ts:1036" ] }, { @@ -4576,6 +4665,13 @@ "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:82" ] }, + { + "call": "No snapshots yet", + "key": "No snapshots yet", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:545" + ] + }, { "call": "Node list is empty", "key": "Node list is empty", @@ -4628,9 +4724,9 @@ "places": [ "src/tachyon/helpers/singBoxVariant.ts:38", "src/tachyon/helpers/singBoxVariant.ts:46", - "src/tachyon/tabs/updates/initController.ts:1155", - "src/tachyon/tabs/updates/initController.ts:1169", - "src/tachyon/tabs/updates/initController.ts:1183" + "src/tachyon/tabs/updates/initController.ts:1157", + "src/tachyon/tabs/updates/initController.ts:1171", + "src/tachyon/tabs/updates/initController.ts:1185" ] }, { @@ -4679,70 +4775,70 @@ "call": "Notify on Certificate Warnings", "key": "Notify on Certificate Warnings", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1877" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2167" ] }, { "call": "Notify on Core Crashes", "key": "Notify on Core Crashes", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1825" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2115" ] }, { "call": "Notify on DNS Leaks", "key": "Notify on DNS Leaks", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1890" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2180" ] }, { "call": "Notify on Server Switches", "key": "Notify on Server Switches", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1851" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2141" ] }, { "call": "Notify on Service Restarts", "key": "Notify on Service Restarts", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1838" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2128" ] }, { "call": "Notify on Subscription Updates", "key": "Notify on Subscription Updates", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1864" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2154" ] }, { "call": "Number of consecutive failed checks required before switching DNS servers.", "key": "Number of consecutive failed checks required before switching DNS servers.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:707" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:945" ] }, { "call": "Number of consecutive failures before restarting (default 3).", "key": "Number of consecutive failures before restarting (default 3).", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1445" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1735" ] }, { "call": "Number of consecutive successful checks required before returning to a higher-priority DNS server.", "key": "Number of consecutive successful checks required before returning to a higher-priority DNS server.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:721" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:959" ] }, { "call": "Ollama (Local PC / Server)", "key": "Ollama (Local PC / Server)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1359", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1649", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:813" ] }, @@ -4815,8 +4911,8 @@ "call": "Open", "key": "Open", "places": [ - "src/tachyon/tabs/updates/initController.ts:1251", - "src/tachyon/tabs/updates/initController.ts:1290" + "src/tachyon/tabs/updates/initController.ts:1253", + "src/tachyon/tabs/updates/initController.ts:1292" ] }, { @@ -4837,15 +4933,29 @@ "call": "Operation failed", "key": "Operation failed", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:455" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:574" ] }, { "call": "Operation in progress...", "key": "Operation in progress...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:107", - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:220" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:112", + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:248" + ] + }, + { + "call": "Operation log", + "key": "Operation log", + "places": [ + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:232" + ] + }, + { + "call": "Operation log is not available", + "key": "Operation log is not available", + "places": [ + "src/tachyon/methods/shell/index.ts:625" ] }, { @@ -4853,8 +4963,8 @@ "key": "Operation timed out", "places": [ "src/helpers/withTimeout.ts:7", - "src/tachyon/methods/shell/index.ts:450", - "src/tachyon/methods/shell/index.ts:538" + "src/tachyon/methods/shell/index.ts:451", + "src/tachyon/methods/shell/index.ts:539" ] }, { @@ -4925,7 +5035,7 @@ "call": "Output Network Interface", "key": "Output Network Interface", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:844" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1082" ] }, { @@ -4942,25 +5052,18 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7705" ] }, - { - "call": "P2P Leak Protection", - "key": "P2P Leak Protection", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995" - ] - }, { "call": "P2P Client Ports", "key": "P2P Client Ports", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1245" ] }, { - "call": "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct.", - "key": "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct.", + "call": "P2P Leak Protection", + "key": "P2P Leak Protection", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:997" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1233" ] }, { @@ -5004,21 +5107,21 @@ "call": "Path must be absolute (start with /)", "key": "Path must be absolute (start with /)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1243" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1521" ] }, { "call": "Path must contain at least one directory (like /tmp/cache.db)", "key": "Path must contain at least one directory (like /tmp/cache.db)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1252" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1530" ] }, { "call": "Path must end with cache.db", "key": "Path must end with cache.db", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1247" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1525" ] }, { @@ -5084,7 +5187,7 @@ "call": "Periodically checks if the proxy is responding. Restarts Tachyon after consecutive failures.", "key": "Periodically checks if the proxy is responding. Restarts Tachyon after consecutive failures.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1433" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1723" ] }, { @@ -5098,7 +5201,7 @@ "call": "Persistent Smart Detect", "key": "Persistent Smart Detect", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1510" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1800" ] }, { @@ -5109,25 +5212,32 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3184" ] }, + { + "call": "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct.", + "key": "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct.", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1246" + ] + }, { "call": "Please wait, operation is running...", "key": "Please wait, operation is running...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:212" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:217" ] }, { "call": "Polling Interval (seconds)", "key": "Polling Interval (seconds)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1804" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2094" ] }, { "call": "Polling interval must be at least 1 second", "key": "Polling interval must be at least 1 second", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1817" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2107" ] }, { @@ -5165,6 +5275,13 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5463" ] }, + { + "call": "Port range start must not exceed its end", + "key": "Port range start must not exceed its end", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1274" + ] + }, { "call": "Ports", "key": "Ports", @@ -5173,11 +5290,18 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10208" ] }, + { + "call": "Ports must be between 1 and 65535", + "key": "Ports must be between 1 and 65535", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1270" + ] + }, { "call": "Pre-download all preset lists", "key": "Pre-download all preset lists", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1081" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1359" ] }, { @@ -5191,14 +5315,14 @@ "call": "Prefer IPv4", "key": "Prefer IPv4", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:767" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1005" ] }, { "call": "Prefer IPv6", "key": "Prefer IPv6", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:769" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1007" ] }, { @@ -5219,7 +5343,7 @@ "call": "Prevents multiple reload_firewall calls within 120 seconds to avoid connection drops.", "key": "Prevents multiple reload_firewall calls within 120 seconds to avoid connection drops.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1470" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1760" ] }, { @@ -5296,21 +5420,21 @@ "call": "Proxy Fail Threshold", "key": "Proxy Fail Threshold", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1444" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1734" ] }, { "call": "Proxy Health Check Interval (s)", "key": "Proxy Health Check Interval (s)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1438" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1728" ] }, { "call": "Proxy Health Check URL", "key": "Proxy Health Check URL", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1450" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1740" ] }, { @@ -5324,7 +5448,7 @@ "call": "Proxy Section for Bot", "key": "Proxy Section for Bot", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1901" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2191" ] }, { @@ -5375,28 +5499,28 @@ "call": "Rebuilt release", "key": "Rebuilt release", "places": [ - "src/tachyon/tabs/updates/initController.ts:1271" + "src/tachyon/tabs/updates/initController.ts:1273" ] }, { "call": "Recommended Quick Fixes:", "key": "Recommended Quick Fixes:", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:979" + "src/tachyon/tabs/diagnostic/initController.ts:983" ] }, { "call": "Reconnect Threshold", "key": "Reconnect Threshold", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1530" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1820" ] }, { "call": "Records proxy/DNS latency and health status in hourly buckets for analysis.", "key": "Records proxy/DNS latency and health status in hourly buckets for analysis.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1477" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1767" ] }, { @@ -5431,14 +5555,14 @@ "call": "Reinstall", "key": "Reinstall", "places": [ - "src/tachyon/tabs/updates/initController.ts:1031" + "src/tachyon/tabs/updates/initController.ts:1033" ] }, { "call": "Reloading page in", "key": "Reloading page in", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:378" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:496" ] }, { @@ -5452,7 +5576,7 @@ "call": "Removal completed successfully!", "key": "Removal completed successfully!", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:365" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:483" ] }, { @@ -5460,7 +5584,7 @@ "key": "Remove", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7918", - "src/tachyon/tabs/updates/initController.ts:987" + "src/tachyon/tabs/updates/initController.ts:989" ] }, { @@ -5488,14 +5612,14 @@ "call": "Removing", "key": "Removing", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:111" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:116" ] }, { "call": "Removing binaries & package files...", "key": "Removing binaries & package files...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:125" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:130" ] }, { @@ -5518,7 +5642,7 @@ "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:389", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:424", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1300" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1578" ] }, { @@ -5598,11 +5722,26 @@ "src/tachyon/tabs/dashboard/partials/renderSections.ts:651" ] }, + { + "call": "Restore", + "key": "Restore", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:583", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:589" + ] + }, + { + "call": "Restore Snapshot", + "key": "Restore Snapshot", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:565" + ] + }, { "call": "Restores the Tachyon factory defaults: all rules, subscriptions, custom DNS servers and other options will be lost.", "key": "Restores the Tachyon factory defaults: all rules, subscriptions, custom DNS servers and other options will be lost.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1301" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1579" ] }, { @@ -5624,14 +5763,14 @@ "call": "Route bot API requests through this section. Leave empty to use the default mixed proxy.", "key": "Route bot API requests through this section. Leave empty to use the default mixed proxy.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1902" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2192" ] }, { "call": "Route main DNS requests through the selected section.", "key": "Route main DNS requests through the selected section.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:779" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1017" ] }, { @@ -5761,8 +5900,8 @@ "key": "Running", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:301", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1663", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1664", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1953", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1954", "src/tachyon/methods/custom/getDashboardSections.ts:1567", "src/tachyon/tabs/dashboard/partials/renderSections.ts:581", "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:135" @@ -5779,10 +5918,18 @@ "call": "Save", "key": "Save", "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:672", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3660", "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1151" ] }, + { + "call": "Save a snapshot of the working config and restore it later if something breaks.", + "key": "Save a snapshot of the working config and restore it later if something breaks.", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1593" + ] + }, { "call": "Save AI Watchdog Settings", "key": "Save AI Watchdog Settings", @@ -5797,6 +5944,14 @@ "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1091" ] }, + { + "call": "Save Snapshot", + "key": "Save Snapshot", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:644" + ] + }, { "call": "Saving…", "key": "Saving…", @@ -5818,14 +5973,14 @@ "call": "Secret key for authenticating remote access to YACD when WAN access is enabled.", "key": "Secret key for authenticating remote access to YACD when WAN access is enabled.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:972" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1210" ] }, { "call": "Secret token for authorizing WRITE operations (POST/PUT) on /cgi-bin/tachyon-agent/. Leave empty if auth is not required.", "key": "Secret token for authorizing WRITE operations (POST/PUT) on /cgi-bin/tachyon-agent/. Leave empty if auth is not required.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1328" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1618" ] }, { @@ -5924,7 +6079,7 @@ "call": "Select AI LLM provider for diagnostics", "key": "Select AI LLM provider for diagnostics", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1353" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1643" ] }, { @@ -5952,14 +6107,14 @@ "call": "Select and order the sections through which blocked domains are tested. Checked sections are tried top-to-bottom.", "key": "Select and order the sections through which blocked domains are tested. Checked sections are tried top-to-bottom.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1557" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1847" ] }, { "call": "Select DNS protocol to use", "key": "Select DNS protocol to use", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:593" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:831" ] }, { @@ -5987,21 +6142,21 @@ "call": "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing", "key": "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1226" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1504" ] }, { "call": "Select or enter the IP addresses of your game consoles.", "key": "Select or enter the IP addresses of your game consoles.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1018" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1296" ] }, { "call": "Select path for sing-box config file. Change this ONLY if you know what you are doing", "key": "Select path for sing-box config file. Change this ONLY if you know what you are doing", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1212" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1490" ] }, { @@ -6016,28 +6171,28 @@ "call": "Select the log level for sing-box", "key": "Select the log level for sing-box", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1263" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1541" ] }, { "call": "Select the network interface from which the traffic will originate", "key": "Select the network interface from which the traffic will originate", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:797" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1035" ] }, { "call": "Select the network interface to which the traffic will originate", "key": "Select the network interface to which the traffic will originate", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:845" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1083" ] }, { "call": "Select the WAN interfaces to be monitored", "key": "Select the WAN interfaces to be monitored", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:908" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1146" ] }, { @@ -6066,42 +6221,42 @@ "call": "Send a Telegram notification if a potential DNS leak is detected.", "key": "Send a Telegram notification if a potential DNS leak is detected.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1891" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2181" ] }, { "call": "Send a Telegram notification if sing-box or nftables rules crash and get auto-restored.", "key": "Send a Telegram notification if sing-box or nftables rules crash and get auto-restored.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1826" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2116" ] }, { "call": "Send a Telegram notification if SSL/TLS certificates are close to expiration.", "key": "Send a Telegram notification if SSL/TLS certificates are close to expiration.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1878" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2168" ] }, { "call": "Send a Telegram notification if the Tachyon service is restarted by the watchdog.", "key": "Send a Telegram notification if the Tachyon service is restarted by the watchdog.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1839" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2129" ] }, { "call": "Send a Telegram notification when a URLTest group switches to a new server.", "key": "Send a Telegram notification when a URLTest group switches to a new server.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1852" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2142" ] }, { "call": "Send a Telegram notification when proxy subscriptions are successfully updated.", "key": "Send a Telegram notification when proxy subscriptions are successfully updated.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1865" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2155" ] }, { @@ -6196,8 +6351,8 @@ "call": "Service action failed", "key": "Service action failed", "places": [ - "src/tachyon/methods/shell/index.ts:401", - "src/tachyon/methods/shell/index.ts:422", + "src/tachyon/methods/shell/index.ts:402", + "src/tachyon/methods/shell/index.ts:423", "src/tachyon/tabs/diagnostic/initController.ts:605" ] }, @@ -6212,7 +6367,7 @@ "call": "Services & Access", "key": "Services & Access", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:581" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:819" ] }, { @@ -6297,7 +6452,7 @@ "call": "Show sing-box config", "key": "Show sing-box config", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:1194", + "src/tachyon/tabs/diagnostic/initController.ts:1198", "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:166" ] }, @@ -6413,6 +6568,20 @@ "src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:237" ] }, + { + "call": "Snapshot name", + "key": "Snapshot name", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:642" + ] + }, + { + "call": "Snapshot restored. The service restarts and the page will reload.", + "key": "Snapshot restored. The service restarts and the page will reload.", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:508" + ] + }, { "call": "Snell Version", "key": "Snell Version", @@ -6461,7 +6630,7 @@ "call": "Source Network Interface", "key": "Source Network Interface", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:796" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1034" ] }, { @@ -6560,7 +6729,7 @@ "call": "Start bot", "key": "Start bot", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1645" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1935" ] }, { @@ -6582,7 +6751,7 @@ "key": "Starting…", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:334", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1692" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1982" ] }, { @@ -6604,7 +6773,7 @@ "call": "Stop bot", "key": "Stop bot", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1652" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1942" ] }, { @@ -6626,7 +6795,7 @@ "key": "Stopped", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:307", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1669", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1959", "src/tachyon/methods/custom/getDashboardSections.ts:1571", "src/tachyon/tabs/dashboard/partials/renderSections.ts:585", "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:147" @@ -6636,7 +6805,7 @@ "call": "Stopping active services...", "key": "Stopping active services...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:124" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:129" ] }, { @@ -6644,21 +6813,21 @@ "key": "Stopping…", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:348", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1706" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1996" ] }, { "call": "Store auto-detected domains in /etc instead of /tmp to survive reboots.", "key": "Store auto-detected domains in /etc instead of /tmp to survive reboots.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1511" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1801" ] }, { "call": "Strict ECH + DoQ DNS Enforcer", "key": "Strict ECH + DoQ DNS Enforcer", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1290" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1568" ] }, { @@ -6694,8 +6863,8 @@ "call": "Subscription update failed", "key": "Subscription update failed", "places": [ - "src/tachyon/methods/shell/index.ts:746", - "src/tachyon/methods/shell/index.ts:766" + "src/tachyon/methods/shell/index.ts:900", + "src/tachyon/methods/shell/index.ts:920" ] }, { @@ -6817,11 +6986,18 @@ "src/tachyon/tabs/dashboard/render.ts:17" ] }, + { + "call": "Tachyon update did not complete within the timeout", + "key": "Tachyon update did not complete within the timeout", + "places": [ + "src/tachyon/methods/shell/index.ts:770" + ] + }, { "call": "Tachyon will not modify your DHCP configuration", "key": "Tachyon will not modify your DHCP configuration", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1202" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1480" ] }, { @@ -6905,7 +7081,7 @@ "call": "Telegram Bot Token", "key": "Telegram Bot Token", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1764" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2054" ] }, { @@ -7082,6 +7258,13 @@ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:426" ] }, + { + "call": "This will replace the current Tachyon settings with the snapshot", + "key": "This will replace the current Tachyon settings with the snapshot", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:567" + ] + }, { "call": "Time", "key": "Time", @@ -7094,7 +7277,7 @@ "call": "Time in seconds for DNS record caching (default: 60)", "key": "Time in seconds for DNS record caching (default: 60)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:735" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:973" ] }, { @@ -7130,7 +7313,7 @@ "call": "Token is required when the bot is enabled", "key": "Token is required when the bot is enabled", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1773" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2063" ] }, { @@ -7223,7 +7406,7 @@ "call": "Transient connection error", "key": "Transient connection error", "places": [ - "src/tachyon/tabs/updates/initController.ts:851" + "src/tachyon/tabs/updates/initController.ts:852" ] }, { @@ -7259,14 +7442,14 @@ "call": "TTL must be a positive number", "key": "TTL must be a positive number", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:746" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:984" ] }, { "call": "TTL value cannot be empty", "key": "TTL value cannot be empty", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:741" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:979" ] }, { @@ -7288,7 +7471,7 @@ "call": "UDP (Unprotected DNS)", "key": "UDP (Unprotected DNS)", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:598" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:836" ] }, { @@ -7431,7 +7614,7 @@ "key": "Unknown", "places": [ "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:328", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1686", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1976", "src/tachyon/methods/custom/getDashboardSections.ts:1573" ] }, @@ -7457,9 +7640,9 @@ "places": [ "src/tachyon/api.ts:40", "src/tachyon/tabs/diagnostic/initController.ts:721", - "src/tachyon/tabs/diagnostic/initController.ts:758", - "src/tachyon/tabs/diagnostic/initController.ts:843", - "src/tachyon/tabs/diagnostic/initController.ts:1159" + "src/tachyon/tabs/diagnostic/initController.ts:762", + "src/tachyon/tabs/diagnostic/initController.ts:847", + "src/tachyon/tabs/diagnostic/initController.ts:1163" ] }, { @@ -7480,7 +7663,7 @@ "call": "Unpacking & installing binaries...", "key": "Unpacking & installing binaries...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:131" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:136" ] }, { @@ -7497,18 +7680,25 @@ "src/tachyon/tabs/dashboard/partials/renderSections.ts:675" ] }, + { + "call": "Up to 10 snapshots are kept; the oldest ones are removed automatically.", + "key": "Up to 10 snapshots are kept; the oldest ones are removed automatically.", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:684" + ] + }, { "call": "Update", "key": "Update", "places": [ - "src/tachyon/tabs/updates/initController.ts:917" + "src/tachyon/tabs/updates/initController.ts:919" ] }, { "call": "Update completed successfully!", "key": "Update completed successfully!", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:366" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:484" ] }, { @@ -7522,14 +7712,14 @@ "call": "Update is available for current release", "key": "Update is available for current release", "places": [ - "src/tachyon/tabs/updates/initController.ts:1258" + "src/tachyon/tabs/updates/initController.ts:1260" ] }, { "call": "Update is available:", "key": "Update is available:", "places": [ - "src/tachyon/tabs/updates/initController.ts:1237" + "src/tachyon/tabs/updates/initController.ts:1239" ] }, { @@ -7559,21 +7749,21 @@ "call": "Updates & Downloads", "key": "Updates & Downloads", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:582" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:820" ] }, { "call": "Updating", "key": "Updating", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:113" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:118" ] }, { "call": "Updating configuration & access permissions...", "key": "Updating configuration & access permissions...", "places": [ - "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:132" + "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:137" ] }, { @@ -7610,7 +7800,7 @@ "call": "URL to test through the proxy (default: Cloudflare 204).", "key": "URL to test through the proxy (default: Cloudflare 204).", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1451" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1741" ] }, { @@ -7669,7 +7859,7 @@ "call": "Use 3-tier check intervals: fast (15s), normal (120s), slow (300s) instead of a single interval.", "key": "Use 3-tier check intervals: fast (15s), normal (120s), slow (300s) instead of a single interval.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1490" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1780" ] }, { @@ -7690,11 +7880,11 @@ "call": "Use sing-box duration format like 1d, 12h or 30m", "key": "Use sing-box duration format like 1d, 12h or 30m", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1045", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1067", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1074", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1105", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1133", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1323", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1345", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1352", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1383", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1411", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2377", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2637", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3160", @@ -7767,7 +7957,7 @@ "call": "Validates sing-box config before restart to prevent boot loops on broken configs.", "key": "Validates sing-box config before restart to prevent boot loops on broken configs.", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1497" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1787" ] }, { @@ -7802,7 +7992,7 @@ "call": "View logs", "key": "View logs", "places": [ - "src/tachyon/tabs/diagnostic/initController.ts:817", + "src/tachyon/tabs/diagnostic/initController.ts:821", "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:157" ] }, @@ -7873,14 +8063,14 @@ "call": "Watchdog Status", "key": "Watchdog Status", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1421" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1711" ] }, { "call": "WebRTC Leak Protection", "key": "WebRTC Leak Protection", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1280" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1558" ] }, { @@ -7922,7 +8112,7 @@ "call": "YACD Secret Key", "key": "YACD Secret Key", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:971" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1209" ] }, { @@ -7936,7 +8126,7 @@ "call": "You can select Output Network Interface, by default autodetect", "key": "You can select Output Network Interface, by default autodetect", "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:835" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1073" ] }, { @@ -8036,118 +8226,5 @@ "places": [ "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:107" ] - }, - { - "call": "Save Snapshot", - "key": "Save Snapshot", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465", - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:644" - ] - }, - { - "call": "Snapshot name", - "key": "Snapshot name", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:642" - ] - }, - { - "call": "Config Snapshots", - "key": "Config Snapshots", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1592" - ] - }, - { - "call": "Save a snapshot of the working config and restore it later if something breaks.", - "key": "Save a snapshot of the working config and restore it later if something breaks.", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1593" - ] - }, - { - "call": "Give the snapshot a name. It is saved with the current date and can be restored from this list later.", - "key": "Give the snapshot a name. It is saved with the current date and can be restored from this list later.", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:646" - ] - }, - { - "call": "No snapshots yet", - "key": "No snapshots yet", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:545" - ] - }, - { - "call": "Failed to load snapshots", - "key": "Failed to load snapshots", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:630" - ] - }, - { - "call": "Failed to save snapshot", - "key": "Failed to save snapshot", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:669" - ] - }, - { - "call": "Failed to delete snapshot", - "key": "Failed to delete snapshot", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:527" - ] - }, - { - "call": "Failed to restore snapshot", - "key": "Failed to restore snapshot", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:516" - ] - }, - { - "call": "Restore Snapshot", - "key": "Restore Snapshot", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:565" - ] - }, - { - "call": "Delete Snapshot", - "key": "Delete Snapshot", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:597" - ] - }, - { - "call": "This will replace the current Tachyon settings with the snapshot", - "key": "This will replace the current Tachyon settings with the snapshot", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:567" - ] - }, - { - "call": "Delete the snapshot", - "key": "Delete the snapshot", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:599" - ] - }, - { - "call": "Up to 10 snapshots are kept; the oldest ones are removed automatically.", - "key": "Up to 10 snapshots are kept; the oldest ones are removed automatically.", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:684" - ] - }, - { - "call": "Snapshot restored. The service restarts and the page will reload.", - "key": "Snapshot restored. The service restarts and the page will reload.", - "places": [ - "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:508" - ] } ] \ No newline at end of file diff --git a/fe-app-tachyon/locales/tachyon.pot b/fe-app-tachyon/locales/tachyon.pot index 75b475c8..1e05e816 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-13 17:10+0300\n" -"PO-Revision-Date: 2026-08-13 17:10+0300\n" +"POT-Creation-Date: 2026-08-14 10:16+0300\n" +"PO-Revision-Date: 2026-08-14 10:16+0300\n" "Last-Translator: Dushnilin \n" "Language-Team: LANGUAGE \n" "Language: \n" @@ -32,7 +32,7 @@ msgstr "" msgid ".lst Lists" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1375 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1665 msgid "(provider default)" msgstr "" @@ -64,11 +64,11 @@ msgstr "" msgid "⚙ Advanced Settings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:668 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:906 msgid "⚠️ If all Bootstrap DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:659 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:897 msgid "⚠️ If all Main DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss." msgstr "" @@ -167,7 +167,7 @@ msgstr "" msgid "Additionally show servers by protocol, transport, and security. Add only servers matching the specified parameters." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1781 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2071 msgid "Administrator Chat IDs" msgstr "" @@ -175,7 +175,7 @@ msgstr "" msgid "Advanced self-healing features. Requires Watchdog to be enabled." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:584 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:822 msgid "Advanced System" msgstr "" @@ -183,7 +183,7 @@ msgstr "" msgid "AEAD Method" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:583 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:821 msgid "AI & Watchdog" msgstr "" @@ -191,11 +191,11 @@ msgstr "" msgid "AI Agent REST API (12 Endpoints)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1327 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1617 msgid "AI Agent REST API Bearer Token" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1394 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1684 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:893 msgid "AI API Key" msgstr "" @@ -212,27 +212,27 @@ msgstr "" msgid "AI Doctor (ChatGPT / DeepSeek API)" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1154 +#: src/tachyon/tabs/diagnostic/initController.ts:1158 msgid "AI Doctor Diagnosis" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:843 -#: src/tachyon/tabs/diagnostic/initController.ts:1160 -#: src/tachyon/tabs/diagnostic/initController.ts:1168 +#: src/tachyon/tabs/diagnostic/initController.ts:847 +#: src/tachyon/tabs/diagnostic/initController.ts:1164 +#: src/tachyon/tabs/diagnostic/initController.ts:1172 msgid "AI Doctor failed" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1381 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1671 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:860 msgid "AI Doctor Language" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1368 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1658 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:836 msgid "AI Model" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1352 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1642 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:766 msgid "AI Provider" msgstr "" @@ -291,7 +291,7 @@ msgstr "" msgid "Allowed domain prefixes are full:, keyword:, and regex:" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:959 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1197 msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall." msgstr "" @@ -299,7 +299,7 @@ msgstr "" msgid "Allows limiting the list of servers for URLTest" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1341 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1631 msgid "Allows Tachyon to send diagnostic snapshots to ChatGPT or DeepSeek API for intelligent root-cause analysis and auto-repair recommendations." msgstr "" @@ -311,11 +311,11 @@ msgstr "" msgid "AmneziaWG Generator" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:835 +#: src/tachyon/tabs/updates/initController.ts:836 msgid "Another component action is already running" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1395 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1685 msgid "API Key for OpenAI (sk-...) or DeepSeek (optional for Ollama / LM Studio)" msgstr "" @@ -327,11 +327,11 @@ msgstr "" msgid "Apply section rules only to the specified local IP addresses" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:133 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:138 msgid "Applying changes & reloading services..." msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:995 +#: src/tachyon/tabs/diagnostic/initController.ts:999 msgid "Applying fix" msgstr "" @@ -339,7 +339,7 @@ msgstr "" msgid "Ask Tachyon AI Assistant a question..." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1792 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2082 msgid "At least one Admin Chat ID is required" msgstr "" @@ -359,7 +359,7 @@ msgstr "" msgid "Auto refresh" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1584 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1874 msgid "Auto-detected domains" msgstr "" @@ -367,7 +367,7 @@ msgstr "" msgid "Auto-detected Domains" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1544 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1834 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1053 msgid "Auto-detects blocked domains from logs and adds them to the first section where they work via proxy." msgstr "" @@ -380,7 +380,7 @@ msgstr "" msgid "Auto-update Hosts Lists" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1094 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1372 msgid "Automatic component update checks" msgstr "" @@ -392,7 +392,7 @@ msgstr "" msgid "Automatically add text to the name of each server from this subscription for convenient filtering." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1095 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1373 msgid "Automatically check installed components for new versions" msgstr "" @@ -400,7 +400,7 @@ msgstr "" msgid "Automatically generate a Cloudflare WARP account and configure all AmneziaWG settings." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1518 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1808 msgid "Automatically increase check intervals when healthy (to 5 min) and decrease on problems (to 120s)." msgstr "" @@ -440,11 +440,11 @@ msgstr "" msgid "Bootstrap DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:622 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:860 msgid "Bootstrap DNS Servers" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1743 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2033 msgid "Bot Status" msgstr "" @@ -461,7 +461,7 @@ msgstr "" msgid "Browser is using FakeIP correctly" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1258 +#: src/tachyon/tabs/diagnostic/initController.ts:1262 msgid "Bug report downloaded" msgstr "" @@ -524,7 +524,7 @@ msgstr "" msgid "ByeDPI strategy cannot be empty" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1008 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1286 msgid "Bypasses UDP traffic for selected game consoles (PS5/Xbox) to achieve NAT Type 1 / 2 (Full Cone NAT) for P2P matchmaking, while keeping TCP (PSN/Auth) routed through the proxy." msgstr "" @@ -532,19 +532,22 @@ msgstr "" msgid "CA Certificate" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1082 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1360 msgid "Cache all built-in lists and databases even if they are not currently selected in any section. Recommended if you have plenty of storage space or USB drive." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1225 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1503 msgid "Cache File Path" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1239 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1517 msgid "Cache file path cannot be empty" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:434 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:575 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:607 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:655 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7712 msgid "Cancel" msgstr "" @@ -569,7 +572,7 @@ msgid "Cascade connection" msgstr "" #: src/tachyon/tabs/updates/initController.ts:498 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:363 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:481 msgid "Check completed!" msgstr "" @@ -592,7 +595,7 @@ msgstr "" msgid "Check timeout after which the server is considered dead" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:903 +#: src/tachyon/tabs/updates/initController.ts:905 msgid "Check update" msgstr "" @@ -610,11 +613,11 @@ msgstr "" msgid "Checking Connection..." msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:109 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:114 msgid "Checking for updates..." msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1552 +#: src/tachyon/tabs/diagnostic/initController.ts:1556 #: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:14 #: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:15 #: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:15 @@ -635,7 +638,7 @@ msgid "Checking..." msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:275 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1635 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1925 msgid "Checking…" msgstr "" @@ -682,7 +685,7 @@ msgstr "" msgid "Clean Comments" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:126 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:131 msgid "Cleaning configuration & reloading..." msgstr "" @@ -702,12 +705,12 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10221 #: src/partials/modal/renderModal.ts:263 #: src/tachyon/tabs/dashboard/initController.ts:1085 +#: src/tachyon/tabs/diagnostic/initController.ts:1148 #: src/tachyon/tabs/monitoring/initController.ts:884 #: src/tachyon/tabs/monitoring/initController.ts:934 -#: src/tachyon/tabs/diagnostic/initController.ts:1144 #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:416 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:461 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:534 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:580 msgid "Close" msgstr "" @@ -742,7 +745,7 @@ msgstr "" msgid "Cloudflare WARP API access token" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1782 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2072 msgid "Comma-separated list of Telegram user IDs authorized to control the bot." msgstr "" @@ -750,7 +753,7 @@ msgstr "" msgid "Community Lists" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:120 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:125 msgid "Comparing versions & fingerprint check..." msgstr "" @@ -758,7 +761,7 @@ msgstr "" msgid "Component update available" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1104 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1382 msgid "Component update check interval" msgstr "" @@ -770,10 +773,14 @@ msgstr "" msgid "Conditions" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1211 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1489 msgid "Config File Path" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1592 +msgid "Config Snapshots" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4749 msgid "Configure User-Agent in the item settings" msgstr "" @@ -796,7 +803,7 @@ msgstr "" msgid "Connected" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:118 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:123 msgid "Connecting to update server..." msgstr "" @@ -820,6 +827,10 @@ msgstr "" msgid "Copy" msgstr "" +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:235 +msgid "Copy log" +msgstr "" + #: src/tachyon/tabs/dashboard/initController.ts:1055 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:476 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:477 @@ -834,7 +845,7 @@ msgstr "" msgid "Country code (e.g. ru, us, de)" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1110 +#: src/tachyon/tabs/diagnostic/initController.ts:1114 msgid "Current Diagnosis" msgstr "" @@ -850,7 +861,7 @@ msgstr "" msgid "Currently unavailable" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1405 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1695 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:915 msgid "Custom API Endpoint URL" msgstr "" @@ -863,11 +874,11 @@ msgstr "" msgid "Custom DNS Records (Hosts)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1361 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1651 msgid "Custom OpenAI-Compatible API (OpenRouter)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1406 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1696 msgid "Custom OpenAI-compatible API endpoint URL (e.g. http://192.168.1.100:11434/v1/chat/completions)" msgstr "" @@ -879,29 +890,42 @@ msgstr "" msgid "Dashboard currently unavailable" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1908 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2198 msgid "Default (auto)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1141 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1419 msgid "Default address for checking server availability and latency. URLTest uses its own address." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:932 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1170 msgid "Delay in milliseconds before reloading Tachyon after interface UP" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:939 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1177 msgid "Delay value cannot be empty" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:615 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:621 +msgid "Delete" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:597 +msgid "Delete Snapshot" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:599 +msgid "Delete the snapshot" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2718 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2927 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3323 msgid "Detect server country" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1281 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1559 msgid "Detects and drops STUN/TURN packets in nftables to prevent real IP leaks via WebRTC." msgstr "" @@ -949,11 +973,11 @@ msgstr "" msgid "Disable autostart" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:983 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1221 msgid "Disable QUIC" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:984 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1222 msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming" msgstr "" @@ -971,15 +995,15 @@ msgstr "" msgid "DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:677 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:915 msgid "DNS Check Interval" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1462 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1752 msgid "DNS Check Interval (s)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:706 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:944 msgid "DNS Failures Before Switching" msgstr "" @@ -987,17 +1011,17 @@ msgstr "" msgid "DNS on router" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:595 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:833 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1814 msgid "DNS over HTTPS (DoH)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:597 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:835 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1816 msgid "DNS over QUIC (DoQ)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:596 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:834 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1815 msgid "DNS over TLS (DoT)" msgstr "" @@ -1007,7 +1031,7 @@ msgstr "" msgid "DNS protocol" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:592 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:830 msgid "DNS Protocol Type" msgstr "" @@ -1016,12 +1040,12 @@ msgstr "" msgid "DNS protocol used by the resolver" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:787 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1025 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7357 msgid "DNS requests through section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:734 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:972 msgid "DNS Rewrite TTL" msgstr "" @@ -1039,27 +1063,27 @@ msgstr "" msgid "DNS server used by the resolver" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:623 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:861 msgid "DNS server used to obtain IP addresses for upstream DNS and proxies. If multiple servers are selected, a timeout switches to a backup." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:608 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:846 msgid "DNS Servers" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:579 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:817 msgid "DNS Settings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:766 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1004 msgid "DNS Strategy" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:720 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:958 msgid "DNS Successful Checks Before Recovery" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:778 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1016 msgid "DNS through proxy" msgstr "" @@ -1067,7 +1091,7 @@ msgstr "" msgid "DNS through section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:756 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:994 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:479 msgid "DNS Turbo Cache" msgstr "" @@ -1076,7 +1100,7 @@ msgstr "" msgid "DNS Turbo Cache saved" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:695 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:933 msgid "DNS Unavailability Timeout" msgstr "" @@ -1109,13 +1133,14 @@ msgid "Do not test specified servers." msgstr "" #: src/tachyon/tabs/diagnostic/initController.ts:721 -#: src/tachyon/tabs/diagnostic/initController.ts:759 -#: src/tachyon/tabs/diagnostic/initController.ts:767 +#: src/tachyon/tabs/diagnostic/initController.ts:763 +#: src/tachyon/tabs/diagnostic/initController.ts:771 msgid "Doctor failed" msgstr "" #: src/tachyon/tabs/diagnostic/initController.ts:737 -#: src/tachyon/tabs/diagnostic/initController.ts:746 +#: src/tachyon/tabs/diagnostic/initController.ts:749 +#: src/tachyon/tabs/diagnostic/initController.ts:750 msgid "Doctor repair" msgstr "" @@ -1135,7 +1160,7 @@ msgstr "" msgid "Domain Resolver" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1556 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1846 msgid "Domain test sections" msgstr "" @@ -1152,7 +1177,7 @@ msgstr "" msgid "Done" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1201 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1479 msgid "Dont Touch My DHCP!" msgstr "" @@ -1165,27 +1190,27 @@ msgstr "" msgid "Download" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1180 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1458 msgid "Download component packages via the selected section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1188 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1466 msgid "Download components through" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1179 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1457 msgid "Download components through a section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1166 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1444 msgid "Download lists through" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1157 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1435 msgid "Download lists through a section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1158 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1436 msgid "Download remote lists and rule sets via the selected section" msgstr "" @@ -1206,7 +1231,7 @@ msgstr "" msgid "Downloaded" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:130 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:135 msgid "Downloading package from repository..." msgstr "" @@ -1235,15 +1260,19 @@ msgstr "" msgid "e.g. SHA256 — leave empty for default" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1260 +msgid "Each entry must be \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp), e.g. tcp:6881,udp:6881-6889" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7226 msgid "Enable" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1517 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1807 msgid "Enable Adaptive Intervals" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1340 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1630 msgid "Enable AI Doctor (ChatGPT / LLM Analysis)" msgstr "" @@ -1251,11 +1280,11 @@ msgstr "" msgid "Enable AI Doctor (LLM Integration)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1524 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1814 msgid "Enable Anomaly Detection" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1035 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1313 msgid "Enable automatic updates for remote lists and rule sets" msgstr "" @@ -1267,11 +1296,11 @@ msgstr "" msgid "Enable built-in DNS resolver for domains handled by this section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1496 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1786 msgid "Enable Config Validation" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1456 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1746 msgid "Enable DNS Continuous Check" msgstr "" @@ -1279,19 +1308,19 @@ msgstr "" msgid "Enable DNS Turbo Cache" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1469 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1759 msgid "Enable Firewall Reload Dedup" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1503 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1793 msgid "Enable Graceful Degradation" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1476 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1766 msgid "Enable Health Metrics" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1034 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1312 msgid "Enable list updates" msgstr "" @@ -1303,52 +1332,52 @@ msgstr "" msgid "Enable Mixed Proxy Authentication" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:834 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1072 msgid "Enable Output Network Interface" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1432 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1722 msgid "Enable Proxy Health Monitor" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1489 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1779 msgid "Enable Smart Cooldowns" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1543 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1833 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1070 msgid "Enable Smart Detect" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1753 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2043 msgid "Enable Telegram Bot" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:667 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:905 msgid "Enable WAN DNS Fallback for Bootstrap DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:658 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:896 msgid "Enable WAN DNS Fallback for Main DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1314 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1604 msgid "Enable Watchdog" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:948 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1186 msgid "Enable YACD" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:958 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1196 msgid "Enable YACD WAN Access" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1754 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2044 msgid "Enables the background daemon that polls Telegram for commands and sends notifications." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1315 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1605 msgid "Enables the background watchdog process to monitor services and auto-recover on failures." msgstr "" @@ -1372,7 +1401,7 @@ msgstr "" msgid "Enter HWID" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1765 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2055 msgid "Enter the API token obtained from @BotFather." msgstr "" @@ -1384,7 +1413,7 @@ msgstr "" msgid "Enter the subscription URL" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:129 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:134 msgid "Environment preparation & dependency check..." msgstr "" @@ -1478,7 +1507,7 @@ msgstr "" msgid "External nfqws2 config files bypass Tachyon queue management and explicit validation." msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1015 +#: src/tachyon/tabs/diagnostic/initController.ts:1019 msgid "Failed to apply fix" msgstr "" @@ -1496,16 +1525,20 @@ msgstr "" msgid "Failed to copy!" msgstr "" -#: src/tachyon/methods/shell/index.ts:171 -#: src/tachyon/methods/shell/index.ts:178 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:527 +msgid "Failed to delete snapshot" +msgstr "" + +#: src/tachyon/methods/shell/index.ts:172 +#: src/tachyon/methods/shell/index.ts:179 #: src/tachyon/tabs/updates/initController.ts:616 #: src/tachyon/tabs/updates/initController.ts:617 -#: src/tachyon/tabs/updates/initController.ts:690 -#: src/tachyon/tabs/updates/initController.ts:881 +#: src/tachyon/tabs/updates/initController.ts:691 +#: src/tachyon/tabs/updates/initController.ts:883 msgid "Failed to execute" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1261 +#: src/tachyon/tabs/diagnostic/initController.ts:1265 msgid "Failed to generate bug report" msgstr "" @@ -1514,6 +1547,10 @@ msgstr "" msgid "Failed to generate WARP config:" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:630 +msgid "Failed to load snapshots" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8246 msgid "Failed to parse file:" msgstr "" @@ -1522,6 +1559,10 @@ msgstr "" msgid "Failed to parse WARP config:" msgstr "" +#: src/tachyon/methods/shell/index.ts:626 +msgid "Failed to read operation log" +msgstr "" + #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:106 msgid "Failed to receive response from AI service." msgstr "" @@ -1530,6 +1571,10 @@ msgstr "" msgid "Failed to reset settings" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:516 +msgid "Failed to restore snapshot" +msgstr "" + #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:405 msgid "Failed to save AI Watchdog settings" msgstr "" @@ -1546,7 +1591,11 @@ msgstr "" msgid "Failed to save Smart Detect settings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1699 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:669 +msgid "Failed to save snapshot" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1989 msgid "Failed to start bot" msgstr "" @@ -1554,7 +1603,7 @@ msgstr "" msgid "Failed to start watchdog" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1713 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2003 msgid "Failed to stop bot" msgstr "" @@ -1584,7 +1633,7 @@ msgstr "" msgid "FakeIP works; public IP comparison is inconclusive" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1457 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1747 msgid "Faster DNS health monitoring than the default cycle. Switches bootstrap DNS on failure." msgstr "" @@ -1597,7 +1646,7 @@ msgstr "" msgid "Fastest" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:119 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:124 msgid "Fetching release & commit metadata..." msgstr "" @@ -1613,7 +1662,7 @@ msgstr "" msgid "Firewall WAN port" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1010 +#: src/tachyon/tabs/diagnostic/initController.ts:1014 msgid "Fix applied" msgstr "" @@ -1622,7 +1671,7 @@ msgid "Fix the highlighted fields and save again." msgstr "" #: src/tachyon/tabs/diagnostic/initController.ts:743 -#: src/tachyon/tabs/diagnostic/initController.ts:1006 +#: src/tachyon/tabs/diagnostic/initController.ts:1010 msgid "Fixed" msgstr "" @@ -1630,7 +1679,7 @@ msgstr "" msgid "Forced device routing" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1291 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1569 msgid "Forces sing-box to tunnel DNS requests via DoQ with Encrypted Client Hello (ECH) for SNI hiding." msgstr "" @@ -1646,11 +1695,11 @@ msgstr "" msgid "Fuzzing is not supported here because Tachyon needs deterministic runtime validation." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1017 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1295 msgid "Game Console IPs" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1007 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1285 msgid "Game Console Optimizer (NAT Type 1)" msgstr "" @@ -1713,6 +1762,10 @@ msgstr "" msgid "Get global check" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:646 +msgid "Give the snapshot a name. It is saved with the current date and can be restored from this list later." +msgstr "" + #: src/tachyon/tabs/diagnostic/initController.ts:697 msgid "Global check" msgstr "" @@ -1778,11 +1831,11 @@ msgstr "" msgid "Higher-level check interval" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:686 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:924 msgid "Higher-priority DNS Check" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1122 +#: src/tachyon/tabs/diagnostic/initController.ts:1126 msgid "History" msgstr "" @@ -1799,7 +1852,7 @@ msgstr "" msgid "Hosts Lists Update Interval" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1483 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1773 msgid "How many hours of metrics to keep (default 24)." msgstr "" @@ -1811,23 +1864,23 @@ msgstr "" msgid "How often the currently selected server is checked" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1463 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1753 msgid "How often to check DNS health in seconds (default 60)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1439 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1729 msgid "How often to check proxy health in seconds (fast tier, default 30)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1805 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2095 msgid "How often to check Telegram for new messages (default: 5)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:678 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:916 msgid "How often to check the active DNS servers." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:687 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:925 msgid "How often to check whether a higher-priority DNS server has recovered." msgstr "" @@ -1853,7 +1906,7 @@ msgstr "" msgid "Idle timeout" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1504 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1794 msgid "If one health check fails with an error, continue running other checks instead of stopping." msgstr "" @@ -1944,33 +1997,33 @@ msgstr "" msgid "Init Packet Payload (I5)" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:917 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:405 +#: src/tachyon/tabs/updates/initController.ts:919 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:523 msgid "Install" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1411 +#: src/tachyon/tabs/updates/initController.ts:1413 msgid "Install another build:" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1269 +#: src/tachyon/tabs/updates/initController.ts:1271 msgid "Installed build → Available build" msgstr "" #: src/tachyon/tabs/updates/initController.ts:341 -#: src/tachyon/tabs/updates/initController.ts:1277 +#: src/tachyon/tabs/updates/initController.ts:1279 msgid "Installed version is newer than release" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:897 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1135 msgid "Interface Monitoring" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:931 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1169 msgid "Interface Monitoring Delay" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:898 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1136 msgid "Interface monitoring for Bad WAN" msgstr "" @@ -2280,15 +2333,15 @@ msgstr "" msgid "IPs" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:768 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1006 msgid "IPv4 only" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:770 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1008 msgid "IPv6 only" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1234 msgid "Isolate BitTorrent traffic and force it direct to prevent VPN bans" msgstr "" @@ -2356,7 +2409,7 @@ msgstr "" msgid "Keep URLTest before latency-sorted servers" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:757 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:484 msgid "Keeps FakeIP cache persistent across reboots and pre-resolves popular blocked domains on startup so first-visit latency is 0 ms." msgstr "" @@ -2369,25 +2422,25 @@ msgstr "" msgid "Keyword must not contain spaces or commas" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1382 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1672 msgid "Language for AI Doctor diagnosis responses" msgstr "" -#: src/tachyon/methods/shell/index.ts:480 -#: src/tachyon/methods/shell/index.ts:501 +#: src/tachyon/methods/shell/index.ts:481 +#: src/tachyon/methods/shell/index.ts:502 msgid "Latency test failed" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1140 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1418 msgid "Latency test URL" msgstr "" #: src/tachyon/tabs/updates/initController.ts:344 -#: src/tachyon/tabs/updates/initController.ts:1275 +#: src/tachyon/tabs/updates/initController.ts:1277 msgid "Latest version is installed" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1277 +#: src/tachyon/tabs/updates/initController.ts:1279 msgid "Latest version:" msgstr "" @@ -2407,11 +2460,11 @@ msgstr "" msgid "List must be an HTTP(S) URL or a local .lst path" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1585 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1875 msgid "List of domains automatically detected and the section they were added to. To edit or remove them, open the routing rules of the respective section." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1044 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1322 msgid "List Update Frequency" msgstr "" @@ -2419,7 +2472,7 @@ msgstr "" msgid "Listening port" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1360 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1650 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:821 msgid "LM Studio (Local PC / Server)" msgstr "" @@ -2450,11 +2503,11 @@ msgstr "" msgid "Loading connections" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1119 -#: src/tachyon/tabs/updates/initController.ts:1134 -#: src/tachyon/tabs/updates/initController.ts:1152 -#: src/tachyon/tabs/updates/initController.ts:1166 -#: src/tachyon/tabs/updates/initController.ts:1180 +#: src/tachyon/tabs/updates/initController.ts:1121 +#: src/tachyon/tabs/updates/initController.ts:1136 +#: src/tachyon/tabs/updates/initController.ts:1154 +#: src/tachyon/tabs/updates/initController.ts:1168 +#: src/tachyon/tabs/updates/initController.ts:1182 msgid "Loading..." msgstr "" @@ -2466,7 +2519,7 @@ msgstr "" msgid "Local Address" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1262 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1540 msgid "Log Level" msgstr "" @@ -2478,7 +2531,7 @@ msgstr "" msgid "Main DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:609 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:847 msgid "Main DNS server. If multiple servers are selected, a timeout switches to a backup." msgstr "" @@ -2510,11 +2563,11 @@ msgstr "" msgid "Match traffic by packet DSCP mark (assigned in Windows via Policy-Based QoS). Examples: 46 (EF), 0x2e, 34 (AF41)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1531 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1821 msgid "Max reconnects per hour before alert (default 10)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:696 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:934 msgid "Maximum time to wait for example.com to resolve during a DNS health check." msgstr "" @@ -2522,7 +2575,7 @@ msgstr "" msgid "Memory Usage" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1482 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1772 msgid "Metrics Retention (hours)" msgstr "" @@ -2542,11 +2595,11 @@ msgstr "" msgid "Mixed Proxy Username" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1369 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1659 msgid "Model name to use. Leave empty to use default (gpt-4o-mini / claude-3-5-haiku / deepseek-chat / llama3:latest)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:907 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1145 msgid "Monitored Interfaces" msgstr "" @@ -2554,7 +2607,7 @@ msgstr "" msgid "Monitoring & Analytics" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1525 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1815 msgid "Monitors sing-box reconnect frequency. Alerts if too many reconnects per hour." msgstr "" @@ -2570,7 +2623,7 @@ msgstr "" msgid "MTU" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1795 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2085 msgid "Must be a comma-separated list of numeric IDs" msgstr "" @@ -2592,7 +2645,7 @@ msgstr "" msgid "Netherlands (nl)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:580 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:818 msgid "Network & Interfaces" msgstr "" @@ -2654,7 +2707,7 @@ msgstr "" msgid "No active connections" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:703 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1112 msgid "No active routing sections found." msgstr "" @@ -2671,11 +2724,11 @@ msgstr "" msgid "No Custom Rules Matched" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1042 +#: src/tachyon/tabs/diagnostic/initController.ts:1046 msgid "No diagnostic history available yet." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1600 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1890 msgid "No domains detected yet" msgstr "" @@ -2687,7 +2740,7 @@ msgstr "" msgid "No file selected" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:746 +#: src/tachyon/tabs/diagnostic/initController.ts:750 msgid "No issues found" msgstr "" @@ -2699,7 +2752,7 @@ msgstr "" msgid "No public firewall port required" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1032 +#: src/tachyon/tabs/diagnostic/initController.ts:1036 msgid "No quick fix required" msgstr "" @@ -2715,6 +2768,10 @@ msgstr "" msgid "No rules use Zapret2" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:545 +msgid "No snapshots yet" +msgstr "" + #: src/tachyon/tabs/dashboard/initController.ts:1070 msgid "Node list is empty" msgstr "" @@ -2745,9 +2802,9 @@ msgstr "" #: src/tachyon/helpers/singBoxVariant.ts:38 #: src/tachyon/helpers/singBoxVariant.ts:46 -#: src/tachyon/tabs/updates/initController.ts:1155 -#: src/tachyon/tabs/updates/initController.ts:1169 -#: src/tachyon/tabs/updates/initController.ts:1183 +#: src/tachyon/tabs/updates/initController.ts:1157 +#: src/tachyon/tabs/updates/initController.ts:1171 +#: src/tachyon/tabs/updates/initController.ts:1185 msgid "Not installed" msgstr "" @@ -2778,43 +2835,43 @@ msgstr "" msgid "Not set" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1877 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2167 msgid "Notify on Certificate Warnings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1825 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2115 msgid "Notify on Core Crashes" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1890 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2180 msgid "Notify on DNS Leaks" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1851 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2141 msgid "Notify on Server Switches" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1838 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2128 msgid "Notify on Service Restarts" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1864 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2154 msgid "Notify on Subscription Updates" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:707 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:945 msgid "Number of consecutive failed checks required before switching DNS servers." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1445 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1735 msgid "Number of consecutive failures before restarting (default 3)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:721 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:959 msgid "Number of consecutive successful checks required before returning to a higher-priority DNS server." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1359 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1649 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:813 msgid "Ollama (Local PC / Server)" msgstr "" @@ -2857,8 +2914,8 @@ msgstr "" msgid "Only the specified servers." msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1251 -#: src/tachyon/tabs/updates/initController.ts:1290 +#: src/tachyon/tabs/updates/initController.ts:1253 +#: src/tachyon/tabs/updates/initController.ts:1292 msgid "Open" msgstr "" @@ -2870,18 +2927,26 @@ msgstr "" msgid "Open Project Page" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:455 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:574 msgid "Operation failed" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:107 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:220 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:112 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:248 msgid "Operation in progress..." msgstr "" +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:232 +msgid "Operation log" +msgstr "" + +#: src/tachyon/methods/shell/index.ts:625 +msgid "Operation log is not available" +msgstr "" + #: src/helpers/withTimeout.ts:7 -#: src/tachyon/methods/shell/index.ts:450 -#: src/tachyon/methods/shell/index.ts:538 +#: src/tachyon/methods/shell/index.ts:451 +#: src/tachyon/methods/shell/index.ts:539 msgid "Operation timed out" msgstr "" @@ -2922,7 +2987,7 @@ msgstr "" msgid "outbounds must be a non-empty array of strings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:844 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1082 msgid "Output Network Interface" msgstr "" @@ -2934,16 +2999,12 @@ msgstr "" msgid "Overwrite existing records (if unchecked, merge with existing records)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995 -msgid "P2P Leak Protection" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1245 msgid "P2P Client Ports" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:997 -msgid "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1233 +msgid "P2P Leak Protection" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7628 @@ -2968,15 +3029,15 @@ msgstr "" msgid "Path cannot be empty" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1243 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1521 msgid "Path must be absolute (start with /)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1252 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1530 msgid "Path must contain at least one directory (like /tmp/cache.db)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1247 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1525 msgid "Path must end with cache.db" msgstr "" @@ -3015,7 +3076,7 @@ msgstr "" msgid "Periodically check the current level and switch to a faster server even when the current one works." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1433 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1723 msgid "Periodically checks if the proxy is responding. Restarts Tachyon after consecutive failures." msgstr "" @@ -3023,7 +3084,7 @@ msgstr "" msgid "Persistent Keepalive" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1510 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1800 msgid "Persistent Smart Detect" msgstr "" @@ -3032,15 +3093,19 @@ msgstr "" msgid "Pin on dashboard" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:212 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1246 +msgid "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct." +msgstr "" + +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:217 msgid "Please wait, operation is running..." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1804 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2094 msgid "Polling Interval (seconds)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1817 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2107 msgid "Polling interval must be at least 1 second" msgstr "" @@ -3064,12 +3129,20 @@ msgstr "" msgid "Port range start must be less than or equal to end" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1274 +msgid "Port range start must not exceed its end" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:9506 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10208 msgid "Ports" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1081 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1270 +msgid "Ports must be between 1 and 65535" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1359 msgid "Pre-download all preset lists" msgstr "" @@ -3077,11 +3150,11 @@ msgstr "" msgid "Pre-shared key" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:767 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1005 msgid "Prefer IPv4" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:769 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1007 msgid "Prefer IPv6" msgstr "" @@ -3093,7 +3166,7 @@ msgstr "" msgid "Preshared Key" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1470 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1760 msgid "Prevents multiple reload_firewall calls within 120 seconds to avoid connection drops." msgstr "" @@ -3140,15 +3213,15 @@ msgstr "" msgid "Protocol" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1444 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1734 msgid "Proxy Fail Threshold" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1438 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1728 msgid "Proxy Health Check Interval (s)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1450 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1740 msgid "Proxy Health Check URL" msgstr "" @@ -3156,7 +3229,7 @@ msgstr "" msgid "Proxy link is unavailable" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1901 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2191 msgid "Proxy Section for Bot" msgstr "" @@ -3186,19 +3259,19 @@ msgstr "" msgid "Read error" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1271 +#: src/tachyon/tabs/updates/initController.ts:1273 msgid "Rebuilt release" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:979 +#: src/tachyon/tabs/diagnostic/initController.ts:983 msgid "Recommended Quick Fixes:" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1530 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1820 msgid "Reconnect Threshold" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1477 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1767 msgid "Records proxy/DNS latency and health status in hourly buckets for analysis." msgstr "" @@ -3218,11 +3291,11 @@ msgstr "" msgid "Regular expression must not contain spaces or commas" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1031 +#: src/tachyon/tabs/updates/initController.ts:1033 msgid "Reinstall" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:378 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:496 msgid "Reloading page in" msgstr "" @@ -3230,12 +3303,12 @@ msgstr "" msgid "Remote Hosts Lists" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:365 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:483 msgid "Removal completed successfully!" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7918 -#: src/tachyon/tabs/updates/initController.ts:987 +#: src/tachyon/tabs/updates/initController.ts:989 msgid "Remove" msgstr "" @@ -3251,11 +3324,11 @@ msgstr "" msgid "Remove the specified servers from this level." msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:111 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:116 msgid "Removing" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:125 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:130 msgid "Removing binaries & package files..." msgstr "" @@ -3269,7 +3342,7 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:389 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:424 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1300 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1578 msgid "Reset Settings" msgstr "" @@ -3317,7 +3390,16 @@ msgstr "" msgid "Restarts" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1301 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:583 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:589 +msgid "Restore" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:565 +msgid "Restore Snapshot" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1579 msgid "Restores the Tachyon factory defaults: all rules, subscriptions, custom DNS servers and other options will be lost." msgstr "" @@ -3330,11 +3412,11 @@ msgstr "" msgid "Route" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1902 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2192 msgid "Route bot API requests through this section. Leave empty to use the default mixed proxy." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:779 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1017 msgid "Route main DNS requests through the selected section." msgstr "" @@ -3410,8 +3492,8 @@ msgid "Run doctor repair" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:301 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1663 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1664 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1953 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1954 #: src/tachyon/methods/custom/getDashboardSections.ts:1567 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:581 #: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:135 @@ -3422,11 +3504,16 @@ msgstr "" msgid "Russia (ru)" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:672 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3660 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1151 msgid "Save" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1593 +msgid "Save a snapshot of the working config and restore it later if something breaks." +msgstr "" + #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:953 msgid "Save AI Watchdog Settings" msgstr "" @@ -3435,6 +3522,11 @@ msgstr "" msgid "Save Smart Detect Settings" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:644 +msgid "Save Snapshot" +msgstr "" + #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:502 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:951 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1091 @@ -3446,11 +3538,11 @@ msgstr "" msgid "Search" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:972 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1210 msgid "Secret key for authenticating remote access to YACD when WAN access is enabled." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1328 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1618 msgid "Secret token for authorizing WRITE operations (POST/PUT) on /cgi-bin/tachyon-agent/. Leave empty if auth is not required." msgstr "" @@ -3507,7 +3599,7 @@ msgstr "" msgid "Select a transit section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1353 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1643 msgid "Select AI LLM provider for diagnostics" msgstr "" @@ -3523,11 +3615,11 @@ msgstr "" msgid "Select an intermediate section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1557 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1847 msgid "Select and order the sections through which blocked domains are tested. Checked sections are tried top-to-bottom." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:593 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:831 msgid "Select DNS protocol to use" msgstr "" @@ -3543,15 +3635,15 @@ msgstr "" msgid "Select or enter a User-Agent" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1226 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1504 msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1018 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1296 msgid "Select or enter the IP addresses of your game consoles." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1212 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1490 msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing" msgstr "" @@ -3560,19 +3652,19 @@ msgstr "" msgid "Select the fastest node" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1263 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1541 msgid "Select the log level for sing-box" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:797 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1035 msgid "Select the network interface from which the traffic will originate" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:845 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1083 msgid "Select the network interface to which the traffic will originate" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:908 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1146 msgid "Select the WAN interfaces to be monitored" msgstr "" @@ -3589,27 +3681,27 @@ msgstr "" msgid "Send" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1891 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2181 msgid "Send a Telegram notification if a potential DNS leak is detected." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1826 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2116 msgid "Send a Telegram notification if sing-box or nftables rules crash and get auto-restored." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1878 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2168 msgid "Send a Telegram notification if SSL/TLS certificates are close to expiration." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1839 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2129 msgid "Send a Telegram notification if the Tachyon service is restarted by the watchdog." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1852 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2142 msgid "Send a Telegram notification when a URLTest group switches to a new server." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1865 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2155 msgid "Send a Telegram notification when proxy subscriptions are successfully updated." msgstr "" @@ -3668,8 +3760,8 @@ msgstr "" msgid "Servers on dashboard" msgstr "" -#: src/tachyon/methods/shell/index.ts:401 -#: src/tachyon/methods/shell/index.ts:422 +#: src/tachyon/methods/shell/index.ts:402 +#: src/tachyon/methods/shell/index.ts:423 #: src/tachyon/tabs/diagnostic/initController.ts:605 msgid "Service action failed" msgstr "" @@ -3678,7 +3770,7 @@ msgstr "" msgid "Service list" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:581 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:819 msgid "Services & Access" msgstr "" @@ -3727,7 +3819,7 @@ msgstr "" msgid "Show servers whose names match the expression." msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1194 +#: src/tachyon/tabs/diagnostic/initController.ts:1198 #: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:166 msgid "Show sing-box config" msgstr "" @@ -3796,6 +3888,14 @@ msgstr "" msgid "Smart Detect settings saved" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:642 +msgid "Snapshot name" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:508 +msgid "Snapshot restored. The service restarts and the page will reload." +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8533 msgid "Snell Version" msgstr "" @@ -3822,7 +3922,7 @@ msgstr "" msgid "Source Devices" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:796 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1034 msgid "Source Network Interface" msgstr "" @@ -3879,7 +3979,7 @@ msgstr "" msgid "Start" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1645 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1935 msgid "Start bot" msgstr "" @@ -3892,7 +3992,7 @@ msgid "Start Watchdog first" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:334 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1692 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1982 msgid "Starting…" msgstr "" @@ -3905,7 +4005,7 @@ msgstr "" msgid "Stop" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1652 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1942 msgid "Stop bot" msgstr "" @@ -3918,27 +4018,27 @@ msgid "Stop Tachyon" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:307 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1669 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1959 #: src/tachyon/methods/custom/getDashboardSections.ts:1571 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:585 #: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:147 msgid "Stopped" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:124 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:129 msgid "Stopping active services..." msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:348 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1706 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1996 msgid "Stopping…" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1511 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1801 msgid "Store auto-detected domains in /etc instead of /tmp to survive reboots." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1290 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1568 msgid "Strict ECH + DoQ DNS Enforcer" msgstr "" @@ -3959,8 +4059,8 @@ msgstr "" msgid "Subscription info:" msgstr "" -#: src/tachyon/methods/shell/index.ts:746 -#: src/tachyon/methods/shell/index.ts:766 +#: src/tachyon/methods/shell/index.ts:900 +#: src/tachyon/methods/shell/index.ts:920 msgid "Subscription update failed" msgstr "" @@ -4032,7 +4132,11 @@ msgstr "" msgid "Tachyon service is stopped. Start the service to display the dashboard." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1202 +#: src/tachyon/methods/shell/index.ts:770 +msgid "Tachyon update did not complete within the timeout" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1480 msgid "Tachyon will not modify your DHCP configuration" msgstr "" @@ -4080,7 +4184,7 @@ msgstr "" msgid "Tailscale endpoint" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1764 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2054 msgid "Telegram Bot Token" msgstr "" @@ -4186,12 +4290,16 @@ msgstr "" msgid "This will erase all Tachyon settings and restore the factory defaults. The service will restart. This action cannot be undone." msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:567 +msgid "This will replace the current Tachyon settings with the snapshot" +msgstr "" + #: src/tachyon/tabs/monitoring/initController.ts:874 #: src/tachyon/tabs/monitoring/initController.ts:930 msgid "Time" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:735 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:973 msgid "Time in seconds for DNS record caching (default: 60)" msgstr "" @@ -4212,7 +4320,7 @@ msgstr "" msgid "TLS SNI" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1773 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2063 msgid "Token is required when the bot is enabled" msgstr "" @@ -4266,7 +4374,7 @@ msgstr "" msgid "Traffic will go through the default route (Direct/Default)." msgstr "" -#: src/tachyon/tabs/updates/initController.ts:851 +#: src/tachyon/tabs/updates/initController.ts:852 msgid "Transient connection error" msgstr "" @@ -4287,11 +4395,11 @@ msgstr "" msgid "Try compatible User-Agent profiles automatically when downloading this subscription" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:746 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:984 msgid "TTL must be a positive number" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:741 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:979 msgid "TTL value cannot be empty" msgstr "" @@ -4304,7 +4412,7 @@ msgstr "" msgid "Type" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:598 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:836 msgid "UDP (Unprotected DNS)" msgstr "" @@ -4393,7 +4501,7 @@ msgid "unknown" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:328 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1686 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1976 #: src/tachyon/methods/custom/getDashboardSections.ts:1573 msgid "Unknown" msgstr "" @@ -4410,9 +4518,9 @@ msgstr "" #: src/tachyon/api.ts:40 #: src/tachyon/tabs/diagnostic/initController.ts:721 -#: src/tachyon/tabs/diagnostic/initController.ts:758 -#: src/tachyon/tabs/diagnostic/initController.ts:843 -#: src/tachyon/tabs/diagnostic/initController.ts:1159 +#: src/tachyon/tabs/diagnostic/initController.ts:762 +#: src/tachyon/tabs/diagnostic/initController.ts:847 +#: src/tachyon/tabs/diagnostic/initController.ts:1163 msgid "Unknown error" msgstr "" @@ -4424,7 +4532,7 @@ msgstr "" msgid "Unknown NFQWS2 flag." msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:131 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:136 msgid "Unpacking & installing binaries..." msgstr "" @@ -4436,11 +4544,15 @@ msgstr "" msgid "Unstable" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:917 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:684 +msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." +msgstr "" + +#: src/tachyon/tabs/updates/initController.ts:919 msgid "Update" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:366 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:484 msgid "Update completed successfully!" msgstr "" @@ -4448,11 +4560,11 @@ msgstr "" msgid "Update is available" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1258 +#: src/tachyon/tabs/updates/initController.ts:1260 msgid "Update is available for current release" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1237 +#: src/tachyon/tabs/updates/initController.ts:1239 msgid "Update is available:" msgstr "" @@ -4470,15 +4582,15 @@ msgstr "" msgid "Updated/duplicates:" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:582 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:820 msgid "Updates & Downloads" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:113 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:118 msgid "Updating" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:132 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:137 msgid "Updating configuration & access permissions..." msgstr "" @@ -4500,7 +4612,7 @@ msgstr "" msgid "URL must use one of the following protocols:" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1451 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1741 msgid "URL to test through the proxy (default: Cloudflare 204)." msgstr "" @@ -4535,7 +4647,7 @@ msgstr "" msgid "URLTest settings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1490 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1780 msgid "Use 3-tier check intervals: fast (15s), normal (120s), slow (300s) instead of a single interval." msgstr "" @@ -4547,11 +4659,11 @@ msgstr "" msgid "Use sing-box duration format like 10s, 1m or 2m30s" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1045 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1067 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1074 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1105 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1133 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1323 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1345 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1352 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1383 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1411 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2377 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2637 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3160 @@ -4603,7 +4715,7 @@ msgstr "" msgid "Valid" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1497 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1787 msgid "Validates sing-box config before restart to prevent boot loops on broken configs." msgstr "" @@ -4623,7 +4735,7 @@ msgstr "" msgid "Via country.is" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:817 +#: src/tachyon/tabs/diagnostic/initController.ts:821 #: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:157 msgid "View logs" msgstr "" @@ -4664,11 +4776,11 @@ msgstr "" msgid "Watchdog" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1421 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1711 msgid "Watchdog Status" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1280 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1558 msgid "WebRTC Leak Protection" msgstr "" @@ -4692,7 +4804,7 @@ msgstr "" msgid "WireGuard private key from your Cloudflare WARP account" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:971 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1209 msgid "YACD Secret Key" msgstr "" @@ -4700,7 +4812,7 @@ msgstr "" msgid "Yes" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:835 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1073 msgid "You can select Output Network Interface, by default autodetect" msgstr "" @@ -4759,69 +4871,3 @@ msgstr "" #: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:107 msgid "Zapret2 sing-box outbound is not configured" msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:644 -msgid "Save Snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:642 -msgid "Snapshot name" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1592 -msgid "Config Snapshots" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1593 -msgid "Save a snapshot of the working config and restore it later if something breaks." -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:646 -msgid "Give the snapshot a name. It is saved with the current date and can be restored from this list later." -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:545 -msgid "No snapshots yet" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:630 -msgid "Failed to load snapshots" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:669 -msgid "Failed to save snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:527 -msgid "Failed to delete snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:516 -msgid "Failed to restore snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:565 -msgid "Restore Snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:597 -msgid "Delete Snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:567 -msgid "This will replace the current Tachyon settings with the snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:599 -msgid "Delete the snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:684 -msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:508 -msgid "Snapshot restored. The service restarts and the page will reload." -msgstr "" - diff --git a/fe-app-tachyon/locales/tachyon.ru.po b/fe-app-tachyon/locales/tachyon.ru.po index fd54f1e0..ef711cca 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-13 20:17+0300\n" -"PO-Revision-Date: 2026-08-13 20:17+0300\n" +"POT-Creation-Date: 2026-08-14 13:16+0300\n" +"PO-Revision-Date: 2026-08-14 13:16+0300\n" "Last-Translator: Dushnilin\n" "Language-Team: none\n" "Language: ru\n" @@ -527,6 +527,9 @@ msgstr "Условия" msgid "Config File Path" msgstr "Путь к файлу конфигурации" +msgid "Config Snapshots" +msgstr "Снапшоты конфигурации" + msgid "Configure User-Agent in the item settings" msgstr "Настройте User-Agent в параметрах элемента" @@ -560,6 +563,9 @@ msgstr "Скопировано" msgid "Copy" msgstr "Копировать" +msgid "Copy log" +msgstr "Копировать лог" + msgid "Copy proxy link" msgstr "Скопировать ссылку прокси" @@ -614,6 +620,15 @@ msgstr "Задержка в миллисекундах перед перезаг msgid "Delay value cannot be empty" msgstr "Значение задержки не может быть пустым" +msgid "Delete" +msgstr "Удалить" + +msgid "Delete Snapshot" +msgstr "Удалить снапшот" + +msgid "Delete the snapshot" +msgstr "Удалить снапшот" + msgid "Detect server country" msgstr "Определять страну сервера" @@ -854,6 +869,9 @@ msgstr "напр. google.com, 1.1.1.1, 443" msgid "e.g. SHA256 — leave empty for default" msgstr "напр. SHA256 — оставьте пустым для значения по умолчанию" +msgid "Each entry must be \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp), e.g. tcp:6881,udp:6881-6889" +msgstr "" + msgid "Enable" msgstr "Включить" @@ -1031,6 +1049,9 @@ msgstr "Не удалось закрыть подключения" msgid "Failed to copy!" msgstr "Не удалось скопировать!" +msgid "Failed to delete snapshot" +msgstr "Не удалось удалить снапшот" + msgid "Failed to execute" msgstr "Не удалось выполнить" @@ -1040,18 +1061,27 @@ msgstr "Не удалось создать отчёт об ошибке" msgid "Failed to generate WARP config:" msgstr "Не удалось сгенерировать конфигурацию WARP:" +msgid "Failed to load snapshots" +msgstr "Не удалось загрузить снапшоты" + msgid "Failed to parse file:" msgstr "Ошибка разбора файла:" msgid "Failed to parse WARP config:" msgstr "Не удалось разобрать конфигурацию WARP:" +msgid "Failed to read operation log" +msgstr "Не удалось прочитать лог операции" + msgid "Failed to receive response from AI service." msgstr "Не удалось получить ответ от ИИ-сервиса." msgid "Failed to reset settings" msgstr "Не удалось сбросить настройки" +msgid "Failed to restore snapshot" +msgstr "Не удалось восстановить снапшот" + msgid "Failed to save AI Watchdog settings" msgstr "Ошибка сохранения настроек AI Watchdog" @@ -1064,6 +1094,9 @@ msgstr "Не удалось сохранить DNS Turbo Cache" msgid "Failed to save Smart Detect settings" msgstr "Ошибка сохранения настроек Smart Detect" +msgid "Failed to save snapshot" +msgstr "Не удалось сохранить снапшот" + msgid "Failed to start bot" msgstr "Не удалось запустить бота" @@ -1181,6 +1214,9 @@ msgstr "GET-эндпоинты открыты в локальной сети. PO msgid "Get global check" msgstr "Получить глобальную проверку" +msgid "Give the snapshot a name. It is saved with the current date and can be restored from this list later." +msgstr "Дайте снапшоту имя. Он сохраняется с текущей датой, и его можно будет восстановить из этого списка позже." + msgid "Global check" msgstr "Глобальная проверка" @@ -1895,6 +1931,9 @@ msgstr "Нет правил, использующих Zapret" msgid "No rules use Zapret2" msgstr "Нет правил, использующих Zapret2" +msgid "No snapshots yet" +msgstr "Снапшотов пока нет" + msgid "Node list is empty" msgstr "Список узлов пуст" @@ -2003,6 +2042,12 @@ msgstr "Операция не выполнена" msgid "Operation in progress..." msgstr "Выполняется операция..." +msgid "Operation log" +msgstr "Лог операции" + +msgid "Operation log is not available" +msgstr "Лог операции недоступен" + msgid "Operation timed out" msgstr "Время ожидания истекло" @@ -2042,14 +2087,11 @@ msgstr "Переопределить стандартные заголовки msgid "Overwrite existing records (if unchecked, merge with existing records)" msgstr "Перезаписать существующие записи (если снято — объединить с существующими)" -msgid "P2P Leak Protection" -msgstr "Защита от утечек P2P" - msgid "P2P Client Ports" msgstr "Порты P2P-клиента" -msgid "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct." -msgstr "Закрепить изоляцию P2P за портами торрент-клиента, через запятую. Каждая запись — \"протокол\", \"протокол:порт\" или \"протокол:порт-порт\" (tcp/udp). Без порта весь протокол уходит напрямую." +msgid "P2P Leak Protection" +msgstr "Защита от утечек P2P" msgid "Parsed records:" msgstr "Обработанные записи:" @@ -2111,6 +2153,9 @@ msgstr "Постоянное умное определение" msgid "Pin on dashboard" msgstr "Закрепить на дашборде" +msgid "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct." +msgstr "Закрепить изоляцию P2P за портами торрент-клиента, через запятую. Каждая запись — \"протокол\", \"протокол:порт\" или \"протокол:порт-порт\" (tcp/udp). Без порта весь протокол уходит напрямую." + msgid "Please wait, operation is running..." msgstr "Пожалуйста, подождите, выполняется операция..." @@ -2135,9 +2180,15 @@ msgstr "Порт должен быть от 1 до 65535" msgid "Port range start must be less than or equal to end" msgstr "Начало диапазона портов должно быть меньше или равно концу" +msgid "Port range start must not exceed its end" +msgstr "" + msgid "Ports" msgstr "Порты" +msgid "Ports must be between 1 and 65535" +msgstr "" + msgid "Pre-download all preset lists" msgstr "Предзагрузить все предустановленные списки" @@ -2315,6 +2366,12 @@ msgstr "Перезапустить Tachyon" msgid "Restarts" msgstr "Перезапуски" +msgid "Restore" +msgstr "" + +msgid "Restore Snapshot" +msgstr "Восстановить снапшот" + msgid "Restores the Tachyon factory defaults: all rules, subscriptions, custom DNS servers and other options will be lost." msgstr "Восстанавливает заводские настройки Tachyon: все правила, подписки, пользовательские DNS-серверы и другие параметры будут удалены." @@ -2390,12 +2447,18 @@ msgstr "Россия (ru)" msgid "Save" 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 "Сохранение…" @@ -2651,6 +2714,12 @@ msgstr "Smart Detect" msgid "Smart Detect settings saved" msgstr "Настройки Smart Detect сохранены" +msgid "Snapshot name" +msgstr "Имя снапшота" + +msgid "Snapshot restored. The service restarts and the page will reload." +msgstr "Снапшот восстановлен. Сервис перезапускается, страница будет перезагружена." + msgid "Snell Version" msgstr "Версия Snell" @@ -2819,6 +2888,9 @@ msgstr "Служба Tachyon остановлена. Запустите серв msgid "Tachyon service is stopped. Start the service to display the dashboard." msgstr "Служба Tachyon остановлена. Запустите сервис для отображения дашборда." +msgid "Tachyon update did not complete within the timeout" +msgstr "" + msgid "Tachyon will not modify your DHCP configuration" msgstr "Tachyon не будет изменять вашу конфигурацию DHCP" @@ -2930,6 +3002,9 @@ msgstr "Этот параметр требует значение." msgid "This will erase all Tachyon settings and restore the factory defaults. The service will restart. This action cannot be undone." msgstr "Все настройки Tachyon будут удалены и восстановлены заводские значения. Сервис будет перезапущен. Это действие нельзя отменить." +msgid "This will replace the current Tachyon settings with the snapshot" +msgstr "Это заменит текущие настройки Tachyon на снапшот" + msgid "Time" msgstr "Время" @@ -3095,6 +3170,9 @@ msgstr "Неуказанный IP-адрес не разрешён" msgid "Unstable" msgstr "Нестабильно" +msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." +msgstr "Хранится до 10 снапшотов; самые старые удаляются автоматически." + msgid "Update" msgstr "Обновить" @@ -3310,453 +3388,3 @@ msgstr "sing-box outbound для Zapret2 настроен" msgid "Zapret2 sing-box outbound is not configured" msgstr "sing-box outbound для Zapret2 не настроен" - -msgid "Service Health Check" -msgstr "Проверка доступности сервисов" - -msgid "Total Targets" -msgstr "Всего целей" - -msgid "Passed" -msgstr "Успешно" - -msgid "Failed" -msgstr "Ошибки" - -msgid "Avg Latency" -msgstr "Ср. задержка" - -msgid "Search domain..." -msgstr "Поиск домена..." - -msgid "Section / Target" -msgstr "Секция / Цель" - -msgid "Outbound Route" -msgstr "Маршрут" - -msgid "Resolved IP / DNS" -msgstr "IP / DNS" - -msgid "Verdict" -msgstr "Статус" - -msgid "Check domain or IP (e.g. example.com)..." -msgstr "Проверить домен или IP (напр. example.com)..." - -msgid "Check Custom" -msgstr "Проверить свой" - -msgid "Check All" -msgstr "Проверить все" - -msgid "Check Again" -msgstr "Проверить снова" - -msgid "Testing..." -msgstr "Тестирование..." - -msgid "Fetching service targets..." -msgstr "Получение списка сервисов..." - -msgid "Failed to run service check." -msgstr "Не удалось выполнить проверку сервисов." - -msgid "Failed to parse target list." -msgstr "Ошибка обработки списка целей." - -msgid "No targets found in section configs." -msgstr "Цели в конфигурациях секций не найдены." - -msgid "Check YouTube availability" -msgstr "Проверить доступность YouTube" - -msgid "Check Mode:" -msgstr "Режим проверки:" - -msgid "Active Sections" -msgstr "Активные секции" - -msgid "All Profiles" -msgstr "Все сервисы и профили" - -msgid "Sections" -msgstr "Секции" - -msgid "Servers" -msgstr "Серверы" - -msgid "Monitoring" -msgstr "Мониторинг" - -msgid "Components" -msgstr "Компоненты" - -msgid "Drag rows to change priority. The rule at the top is checked first." -msgstr "Перетащите строки для изменения приоритета. Правило вверху проверяется первым." - -msgid "Rules" -msgstr "Правила" - -msgid "Edit" -msgstr "Редактировать" - -msgid "Connection" -msgstr "Соединение" - -msgid "Add a section" -msgstr "Добавить секцию" - -msgid "Add a server inbound" -msgstr "Добавить серверный инбаунд" - -msgid "Accept external proxy connections and route them with sing-box." -msgstr "Принимать внешние прокси-подключения и маршрутизировать их через sing-box." - -msgid "Section" -msgstr "Секция" - -msgid "Server" -msgstr "Сервер" - -msgid "Installing" -msgstr "Установка" - -msgid "Initializing operation..." -msgstr "Инициализация операции..." - -msgid "Installing package & updating configurations..." -msgstr "Установка пакета и обновление настроек..." - -msgid "Installation completed successfully!" -msgstr "Установка успешно завершена!" - -msgid "Direct" -msgstr "Напрямую" - -msgid "Tachyon Settings" -msgstr "Настройки Tachyon" - -msgid "All Services" -msgstr "Все сервисы" - -msgid "Service Availability Check" -msgstr "Проверка доступности сервисов" - -msgid "Filter by service:" -msgstr "Фильтр по сервису:" - -msgid "Search domain or service..." -msgstr "Поиск домена или сервиса..." - -msgid "Service / Target" -msgstr "Сервис / Цель" - -msgid "Route Type" -msgstr "Тип маршрута" - -msgid "Active Routes" -msgstr "Активные маршруты" - -msgid "Custom Domains" -msgstr "Свои домены" - -msgid "Unavailable" -msgstr "Недоступно" - -msgid "Available" -msgstr "Доступно" - -msgid "Auto" -msgstr "Авто" - -msgid "Proxy" -msgstr "Прокси" - -msgid "TCP" -msgstr "TCP" - -msgid "TLS" -msgstr "TLS" - -msgid "Method" -msgstr "Метод" - -msgid "ALPN" -msgstr "ALPN" - -msgid "VLESS flow" -msgstr "VLESS flow" - -msgid "FakeTLS host" -msgstr "FakeTLS host" - -msgid "Concurrency" -msgstr "Параллелизм" - -msgid "Delete" -msgstr "Удалить" - -msgid "Information" -msgstr "Информация" - -msgid "Saving..." -msgstr "Сохранение..." - -msgid "Generating..." -msgstr "Генерация..." - -msgid "Starting..." -msgstr "Запуск..." - -msgid "Stopping..." -msgstr "Остановка..." - -msgid "None" -msgstr "Нет" - -msgid "Enabled" -msgstr "Включено" - -msgid "Disabled" -msgstr "Отключено" - -msgid "Configuration for Tachyon service" -msgstr "Конфигурация сервиса Tachyon" - -msgid "Only the specified servers" -msgstr "Только указанные серверы" - -msgid "Select all" -msgstr "Выбрать все" - -msgid "Routing mode" -msgstr "Режим маршрутизации" - -msgid "Routing section" -msgstr "Секция маршрутизации" - -msgid "Keeps FakeIP cache persistent across reboots and pre-resolves popular blocked domains on startup so first-visit latency is 0 ms." -msgstr "Сохраняет кэш FakeIP между перезагрузками и предварительно разрешает популярные заблокированные домены при запуске, чтобы задержка первого обращения была 0 мс." - -msgid "Configure User-Agent в the item settings" -msgstr "Настройте User-Agent в параметрах элемента" - -msgid "Client link" -msgstr "Клиентская ссылка" - -msgid "Client link QR code" -msgstr "QR-код клиентской ссылки" - -msgid "Client link is not available yet" -msgstr "Клиентская ссылка пока недоступна" - -msgid "Loading client link..." -msgstr "Загрузка клиентской ссылки..." - -msgid "Secret" -msgstr "Секрет" - -msgid "Public Key" -msgstr "Публичный ключ" - -msgid "Certificate path" -msgstr "Путь к сертификату" - -msgid "Key path" -msgstr "Путь к ключу" - -msgid "Specify a file path" -msgstr "Укажите путь к файлу" - -msgid "Specify different files" -msgstr "Укажите разные файлы" - -msgid "Selected section" -msgstr "Выбранная секция" - -msgid "Inbound JSON" -msgstr "Inbound JSON" - -msgid "Inbound JSON cannot be empty" -msgstr "Inbound JSON не может быть пустым" - -msgid "Inbound JSON must be an object with a type field" -msgstr "Inbound JSON должен быть объектом с полем type" - -msgid "Server information" -msgstr "Информация о сервере" - -msgid "Server name" -msgstr "Имя сервера" - -msgid "Server name / SNI" -msgstr "Имя сервера / SNI" - -msgid "Reality fake site" -msgstr "Фейковый сайт Reality" - -msgid "Reality fake site port" -msgstr "Порт фейкового сайта Reality" - -msgid "Reality max time difference" -msgstr "Макс. разница времени Reality" - -msgid "Reality private key" -msgstr "Приватный ключ Reality" - -msgid "Reality public key" -msgstr "Публичный ключ Reality" - -msgid "Reality short ID" -msgstr "Короткий ID Reality" - -msgid "Reality short ID must contain 1-8 hex digits" -msgstr "Короткий ID Reality должен содержать 1-8 шестнадцатеричных цифр" - -msgid "Fronting IP" -msgstr "Fronting IP" - -msgid "Fronting port" -msgstr "Fronting порт" - -msgid "Fronting proxy protocol" -msgstr "Протокол Fronting прокси" - -msgid "gRPC service" -msgstr "Сервис gRPC" - -msgid "Transport host" -msgstr "Хост транспорта" - -msgid "Transport path" -msgstr "Путь транспорта" - -msgid "Transport path must start with /" -msgstr "Путь транспорта должен начинаться с /" - -msgid "HTTP hosts" -msgstr "HTTP хосты" - -msgid "XHTTP mode" -msgstr "Режим XHTTP" - -msgid "Fallback on unknown DC" -msgstr "Fallback при неизвестном DC" - -msgid "Padding" -msgstr "Padding" - -msgid "Handshake timeout" -msgstr "Таймаут рукопожатия" - -msgid "Time skew tolerance" -msgstr "Допуск отклонения времени" - -msgid "Invalid NFQWS strategy" -msgstr "Неверная стратегия NFQWS" - -msgid "Invalid NFQWS2 strategy" -msgstr "Неверная стратегия NFQWS2" - -msgid "Installed build \\u2192 Available build" -msgstr "Установленная сборка \\u2192 Доступная сборка" - -msgid "Prevent multiple reload_firewall calls within 120 seconds to avoid connection drops." -msgstr "Предотвращать множественные вызовы reload_firewall в течение 120 секунд для избежания разрыва соединений." - -msgid "Obfuscation" -msgstr "Обфускация" - -msgid "Obfuscation password" -msgstr "Пароль обфускации" - -msgid "Auto update" -msgstr "Автообновление" - -msgid "Use CIDR prefixes like 192.168.1.0/24 or 2001:db8::/32" -msgstr "Используйте CIDR-префиксы, например 192.168.1.0/24 или 2001:db8::/32" - -msgid "Use an IP address" -msgstr "Используйте IP-адрес" - -msgid "Use an IP listen address" -msgstr "Используйте IP-адрес прослушивания" - -msgid "Use a domain name or IP address" -msgstr "Используйте имя домена или IP-адрес" - -msgid "Use an HTTP or HTTPS URL" -msgstr "Используйте HTTP или HTTPS URL" - -msgid "Use letters, digits, dots, underscores, or hyphens" -msgstr "Используйте буквы, цифры, точки, подчёркивания или дефисы" - -msgid "Use a non-negative integer" -msgstr "Используйте неотрицательное целое число" - -msgid "Use a non-zero secret" -msgstr "Используйте ненулевой секрет" - -msgid "Use 32 hex characters" -msgstr "Используйте 32 шестнадцатеричных символа" - -msgid "Use a duration like 30s, 5m, or 1h30m" -msgstr "Используйте длительность, например 30s, 5m или 1h30m" - -msgid "Expecting: %s" -msgstr "Ожидалось: %s" - -msgid "Cannot save server" -msgstr "Не удалось сохранить сервер" - -msgid "QR code is too large" -msgstr "QR-код слишком большой" - -msgid "Save Snapshot" -msgstr "Сохранить снапшот" - -msgid "Snapshot name" -msgstr "Имя снапшота" - -msgid "Config Snapshots" -msgstr "Снапшоты конфигурации" - -msgid "Save a snapshot of the working config and restore it later if something breaks." -msgstr "Сохранить снапшот рабочей конфигурации, чтобы восстановить её позже, если что-то сломается." - -msgid "Give the snapshot a name. It is saved with the current date and can be restored from this list later." -msgstr "Дайте снапшоту имя. Он сохраняется с текущей датой, и его можно будет восстановить из этого списка позже." - -msgid "No snapshots yet" -msgstr "Снапшотов пока нет" - -msgid "Failed to load snapshots" -msgstr "Не удалось загрузить снапшоты" - -msgid "Failed to save snapshot" -msgstr "Не удалось сохранить снапшот" - -msgid "Failed to delete snapshot" -msgstr "Не удалось удалить снапшот" - -msgid "Failed to restore snapshot" -msgstr "Не удалось восстановить снапшот" - -msgid "Restore Snapshot" -msgstr "Восстановить снапшот" - -msgid "Delete Snapshot" -msgstr "Удалить снапшот" - -msgid "This will replace the current Tachyon settings with the snapshot" -msgstr "Это заменит текущие настройки Tachyon на снапшот" - -msgid "Delete the snapshot" -msgstr "Удалить снапшот" - -msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." -msgstr "Хранится до 10 снапшотов; самые старые удаляются автоматически." - -msgid "Snapshot restored. The service restarts and the page will reload." -msgstr "Снапшот восстановлен. Сервис перезапускается, страница будет перезагружена." diff --git a/fe-app-tachyon/src/tachyon/methods/shell/index.ts b/fe-app-tachyon/src/tachyon/methods/shell/index.ts index 7238437c..a88431f9 100644 --- a/fe-app-tachyon/src/tachyon/methods/shell/index.ts +++ b/fe-app-tachyon/src/tachyon/methods/shell/index.ts @@ -604,6 +604,34 @@ export const TachyonShellMethods = { data: parsedResponse, } as Tachyon.MethodSuccessResponse; }, + componentActionLog: async (jobId: string, offset = 0) => { + const response = await executeShellCommand({ + command: '/usr/bin/tachyon', + args: [ + Tachyon.AvailableMethods.COMPONENT_ACTION_LOG, + jobId, + String(Math.max(0, Math.floor(offset))), + ], + timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS, + }); + const parsedResponse = + parseJsonObjectOutput(response.stdout); + + if ((response.code ?? 0) !== 0 || !parsedResponse) { + return { + success: false, + error: + parsedResponse?.success === false + ? _('Operation log is not available') + : response.stderr || _('Failed to read operation log'), + } as Tachyon.MethodFailureResponse; + } + + return { + success: true, + data: parsedResponse, + } as Tachyon.MethodSuccessResponse; + }, componentUpdateCheckCache: async () => callBaseMethod( Tachyon.AvailableMethods.COMPONENT_UPDATE_CHECK_CACHE, diff --git a/fe-app-tachyon/src/tachyon/tabs/updates/initController.ts b/fe-app-tachyon/src/tachyon/tabs/updates/initController.ts index 41eadca0..97b55cd2 100644 --- a/fe-app-tachyon/src/tachyon/tabs/updates/initController.ts +++ b/fe-app-tachyon/src/tachyon/tabs/updates/initController.ts @@ -668,6 +668,7 @@ async function followComponentActionState( targetVersion: state.latest_version, }); } + getActiveProgressModalController()?.startLogTracking(jobId); } try { @@ -860,6 +861,7 @@ async function handleComponentAction(button: ComponentActionButton) { jobId = startResponse.data.job_id; setActiveProgressModalJobId(jobId); markUiActionOwned('component', jobId); + modalController.startLogTracking(jobId); if (followedComponentJobs.has(jobId)) { return; } diff --git a/fe-app-tachyon/src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts b/fe-app-tachyon/src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts index 780518f2..18e9dd77 100644 --- a/fe-app-tachyon/src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts +++ b/fe-app-tachyon/src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts @@ -1,5 +1,7 @@ import { renderCheckIcon24, renderXIcon24 } from '../../../../icons'; import { renderButton } from '../../../../partials'; +import { copyToClipboard } from '../../../../helpers/copyToClipboard'; +import { TachyonShellMethods } from '../../../methods'; import { Tachyon } from '../../../types'; export interface UpdateProgressModalOptions { @@ -30,6 +32,9 @@ export interface UpdateProgressModalController { }) => void; completeSuccess: (message?: string, options?: CompleteSuccessOptions) => void; completeError: (errorMessage: string) => void; + startLogTracking: (jobId: string) => void; + stopLogTracking: () => void; + getLogText: () => string; close: () => void; } @@ -212,6 +217,29 @@ export function showUpdateProgressModal( steps[0] || _('Please wait, operation is running...'), ); + const logPreEl = E('pre', { + class: 'tachyon-update-modal__log', + }) as HTMLPreElement; + + const logPanelEl = E( + 'div', + { + class: 'tachyon-update-modal__log-panel', + style: 'display: none;', + }, + [ + E('div', { class: 'tachyon-update-modal__log-header' }, [ + E('b', {}, _('Operation log')), + renderButton({ + classNames: ['cbi-button-action', 'tachyon-update-modal__log-copy'], + text: _('Copy log'), + onClick: copyLog, + }), + ]), + logPreEl, + ], + ); + const actionButtonContainer = E( 'div', { class: 'tachyon-update-modal__actions' }, @@ -230,6 +258,7 @@ export function showUpdateProgressModal( progressBarTrackEl, stepListEl, statusMsgEl, + logPanelEl, actionButtonContainer, ]) as HTMLElement; @@ -322,6 +351,94 @@ export function showUpdateProgressModal( } } + let logTrackingJobId: string | null = null; + let logTrackingOffset = 0; + let logFullText = ''; + let logPollTimer: ReturnType | null = null; + let logPollStopped = true; + + function appendLogText(text: string) { + if (!text) { + return; + } + logFullText += text; + logPreEl.textContent = logFullText; + logPreEl.scrollTop = logPreEl.scrollHeight; + } + + async function pollLog() { + if (logPollStopped || !logTrackingJobId) { + return; + } + + const jobId = logTrackingJobId; + const offset = logTrackingOffset; + + try { + const response = await TachyonShellMethods.componentActionLog( + jobId, + offset, + ); + if (logPollStopped || logTrackingJobId !== jobId) { + return; + } + if (response.success && response.data) { + logTrackingOffset = response.data.offset; + appendLogText(response.data.log); + } + } catch (_error) { + // A transient RPC failure must not stop the polling; the next tick retries. + } finally { + if (!logPollStopped && logTrackingJobId === jobId) { + logPollTimer = setTimeout(pollLog, 1500); + } + } + } + + function stopLogTracking() { + logPollStopped = true; + if (logPollTimer) { + clearTimeout(logPollTimer); + logPollTimer = null; + } + logTrackingJobId = null; + } + + function finishLogTracking() { + if (logPollStopped || !logTrackingJobId) { + stopLogTracking(); + return; + } + + const jobId = logTrackingJobId; + const offset = logTrackingOffset; + logPollStopped = true; + if (logPollTimer) { + clearTimeout(logPollTimer); + logPollTimer = null; + } + + void TachyonShellMethods.componentActionLog(jobId, offset) + .then((response) => { + if (response.success && response.data) { + logTrackingOffset = response.data.offset; + appendLogText(response.data.log); + } + }) + .catch(() => {}) + .finally(() => { + logTrackingJobId = null; + }); + } + + function copyLog() { + if (!logFullText) { + return; + } + + copyToClipboard(logFullText); + } + const controller: UpdateProgressModalController = { updateStep: (stepIndex: number, statusText?: string) => { setStep(stepIndex, statusText); @@ -344,6 +461,7 @@ export function showUpdateProgressModal( completeSuccess: (message?: string, opts?: CompleteSuccessOptions) => { isCompleted = true; cleanupTimers(); + finishLogTracking(); progressBarFillEl.style.width = '100%'; progressBarFillEl.classList.add( @@ -443,6 +561,7 @@ export function showUpdateProgressModal( completeError: (errorMessage: string) => { isCompleted = true; cleanupTimers(); + finishLogTracking(); progressBarFillEl.style.width = '100%'; progressBarFillEl.classList.add( @@ -466,8 +585,29 @@ export function showUpdateProgressModal( actionButtonContainer.replaceChildren(closeBtn); }, + startLogTracking: (jobId: string) => { + if (!jobId || logTrackingJobId === jobId) { + return; + } + + logTrackingJobId = jobId; + logTrackingOffset = 0; + logPollStopped = false; + logPanelEl.style.display = ''; + + if (logPollTimer) { + clearTimeout(logPollTimer); + logPollTimer = null; + } + void pollLog(); + }, + stopLogTracking: () => { + stopLogTracking(); + }, + getLogText: () => logFullText, close: () => { cleanupTimers(); + stopLogTracking(); if (activeModalController === controller) { activeModalController = null; activeModalJobId = null; diff --git a/fe-app-tachyon/src/tachyon/tabs/updates/styles.ts b/fe-app-tachyon/src/tachyon/tabs/updates/styles.ts index c9d1cedb..73e9f954 100644 --- a/fe-app-tachyon/src/tachyon/tabs/updates/styles.ts +++ b/fe-app-tachyon/src/tachyon/tabs/updates/styles.ts @@ -363,4 +363,39 @@ export const styles = ` border-top: 1px solid var(--border-color, rgba(255,255,255,0.12)); padding-top: 10px; } + +.tachyon-update-modal__log-panel { + margin-top: 10px; + border-top: 1px solid var(--border-color, rgba(255,255,255,0.12)); + padding-top: 10px; +} + +.tachyon-update-modal__log-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: 8px; + margin-bottom: 6px; +} + +.tachyon-update-modal__log-copy { + padding: 2px 8px; + font-size: 12px; +} + +.tachyon-update-modal__log { + margin: 0; + max-height: 200px; + overflow-y: auto; + white-space: pre-wrap; + word-break: break-all; + font-family: monospace; + font-size: 11px; + line-height: 1.5; + color: var(--text-color, #ddd); + background: rgba(0, 0, 0, 0.35); + border: 1px solid var(--border-color, rgba(255,255,255,0.12)); + border-radius: 4px; + padding: 8px; +} `; diff --git a/fe-app-tachyon/src/tachyon/tabs/updates/tests/updateProgressModal.test.ts b/fe-app-tachyon/src/tachyon/tabs/updates/tests/updateProgressModal.test.ts index c852ee0d..a35752da 100644 --- a/fe-app-tachyon/src/tachyon/tabs/updates/tests/updateProgressModal.test.ts +++ b/fe-app-tachyon/src/tachyon/tabs/updates/tests/updateProgressModal.test.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { describe, expect, it, vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; class MockMutationObserver { observe() {} @@ -72,6 +72,11 @@ const mockUi = { (globalThis as any)._ = (str: string) => str; describe('renderUpdateProgressModal', () => { + beforeEach(() => { + vi.useRealTimers(); + vi.restoreAllMocks(); + }); + it('renders install button and does not auto-close when onInstall is provided', async () => { vi.useFakeTimers(); mockUi.showModal.mockReset(); @@ -128,4 +133,88 @@ describe('renderUpdateProgressModal', () => { vi.useRealTimers(); }); + + it('polls the operation log while the job runs and stops after completion', async () => { + vi.useFakeTimers(); + mockUi.showModal.mockReset(); + mockUi.hideModal.mockReset(); + + const { TachyonShellMethods } = await import('../../../methods'); + const { showUpdateProgressModal } = await import( + '../partials/renderUpdateProgressModal' + ); + + let nextOffset = 0; + const logSpy = vi + .spyOn(TachyonShellMethods, 'componentActionLog') + .mockImplementation(async (_jobId: string, offset: number = 0) => { + nextOffset = offset + 5; + return { + success: true, + data: { success: true, log: 'chunk', offset: nextOffset }, + } as never; + }); + + const controller = showUpdateProgressModal({ + component: 'sing_box', + action: 'install', + componentTitle: 'sing-box', + }); + + // The first poll runs immediately, the following ones on the 1500ms timer. + controller.startLogTracking('job-123'); + await vi.advanceTimersByTimeAsync(1500); + await vi.advanceTimersByTimeAsync(1500); + + expect(logSpy).toHaveBeenCalledWith('job-123', 0); + expect(logSpy).toHaveBeenCalledWith('job-123', 5); + expect(logSpy).toHaveBeenCalledWith('job-123', 10); + expect(controller.getLogText()).toBe('chunkchunkchunk'); + + controller.completeSuccess('done'); + await vi.advanceTimersByTimeAsync(0); + + // A final read drains the remaining log, then polling stops. + expect(logSpy).toHaveBeenCalledWith('job-123', 15); + expect(controller.getLogText()).toBe('chunkchunkchunkchunk'); + + const callsAfterCompletion = logSpy.mock.calls.length; + await vi.advanceTimersByTimeAsync(5000); + expect(logSpy.mock.calls.length).toBe(callsAfterCompletion); + + controller.close(); + vi.useRealTimers(); + }); + + it('does not poll the log when no job id was provided', async () => { + vi.useFakeTimers(); + mockUi.showModal.mockReset(); + mockUi.hideModal.mockReset(); + + const { TachyonShellMethods } = await import('../../../methods'); + const { showUpdateProgressModal } = await import( + '../partials/renderUpdateProgressModal' + ); + + const logSpy = vi + .spyOn(TachyonShellMethods, 'componentActionLog') + .mockResolvedValue({ + success: true, + data: { success: true, log: 'x', offset: 1 }, + } as never); + + const controller = showUpdateProgressModal({ + component: 'sing_box', + action: 'install', + componentTitle: 'sing-box', + }); + + controller.startLogTracking(''); + await vi.advanceTimersByTimeAsync(1500); + expect(logSpy).not.toHaveBeenCalled(); + expect(controller.getLogText()).toBe(''); + + controller.close(); + vi.useRealTimers(); + }); }); diff --git a/fe-app-tachyon/src/tachyon/types.ts b/fe-app-tachyon/src/tachyon/types.ts index 5d643701..0b1e0f3b 100644 --- a/fe-app-tachyon/src/tachyon/types.ts +++ b/fe-app-tachyon/src/tachyon/types.ts @@ -90,6 +90,7 @@ export namespace Tachyon { UI_ACTION_ACK = 'ui_action_ack', COMPONENT_ACTION_ASYNC = 'component_action_async', COMPONENT_ACTION_STATUS = 'component_action_status', + COMPONENT_ACTION_LOG = 'component_action_log', COMPONENT_UPDATE_CHECK_CACHE = 'component_update_check_cache', SUBSCRIPTION_UPDATE_ASYNC = 'subscription_update_async', SUBSCRIPTION_UPDATE_STATUS = 'subscription_update_status', @@ -648,6 +649,12 @@ export namespace Tachyon { results: ComponentActionResult[]; } + export interface ComponentActionLogResult { + success: boolean; + log: string; + offset: number; + } + export type ComponentActionStartResult = UiActionStartResult; export type SubscriptionUpdateStartResult = UiActionStartResult; diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js index cdc408ba..882c9d3b 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js @@ -3053,6 +3053,7 @@ var Tachyon; AvailableMethods2["UI_ACTION_ACK"] = "ui_action_ack"; AvailableMethods2["COMPONENT_ACTION_ASYNC"] = "component_action_async"; AvailableMethods2["COMPONENT_ACTION_STATUS"] = "component_action_status"; + AvailableMethods2["COMPONENT_ACTION_LOG"] = "component_action_log"; AvailableMethods2["COMPONENT_UPDATE_CHECK_CACHE"] = "component_update_check_cache"; AvailableMethods2["SUBSCRIPTION_UPDATE_ASYNC"] = "subscription_update_async"; AvailableMethods2["SUBSCRIPTION_UPDATE_STATUS"] = "subscription_update_status"; @@ -3548,6 +3549,28 @@ var TachyonShellMethods = { data: parsedResponse }; }, + componentActionLog: async (jobId, offset = 0) => { + const response = await executeShellCommand({ + command: "/usr/bin/tachyon", + args: [ + Tachyon.AvailableMethods.COMPONENT_ACTION_LOG, + jobId, + String(Math.max(0, Math.floor(offset))) + ], + timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS + }); + const parsedResponse = parseJsonObjectOutput(response.stdout); + if ((response.code ?? 0) !== 0 || !parsedResponse) { + return { + success: false, + error: parsedResponse?.success === false ? _("Operation log is not available") : response.stderr || _("Failed to read operation log") + }; + } + return { + success: true, + data: parsedResponse + }; + }, componentUpdateCheckCache: async () => callBaseMethod( Tachyon.AvailableMethods.COMPONENT_UPDATE_CHECK_CACHE ), @@ -15383,6 +15406,27 @@ function showUpdateProgressModal(options) { { class: "tachyon-update-modal__status-msg" }, steps[0] || _("Please wait, operation is running...") ); + const logPreEl = E("pre", { + class: "tachyon-update-modal__log" + }); + const logPanelEl = E( + "div", + { + class: "tachyon-update-modal__log-panel", + style: "display: none;" + }, + [ + E("div", { class: "tachyon-update-modal__log-header" }, [ + E("b", {}, _("Operation log")), + renderButton({ + classNames: ["cbi-button-action", "tachyon-update-modal__log-copy"], + text: _("Copy log"), + onClick: copyLog + }) + ]), + logPreEl + ] + ); const actionButtonContainer = E( "div", { class: "tachyon-update-modal__actions" }, @@ -15401,6 +15445,7 @@ function showUpdateProgressModal(options) { progressBarTrackEl, stepListEl, statusMsgEl, + logPanelEl, actionButtonContainer ]); const updateTimerDisplay = () => { @@ -15481,6 +15526,80 @@ function showUpdateProgressModal(options) { autoAdvanceTimer = null; } } + let logTrackingJobId = null; + let logTrackingOffset = 0; + let logFullText = ""; + let logPollTimer = null; + let logPollStopped = true; + function appendLogText(text) { + if (!text) { + return; + } + logFullText += text; + logPreEl.textContent = logFullText; + logPreEl.scrollTop = logPreEl.scrollHeight; + } + async function pollLog() { + if (logPollStopped || !logTrackingJobId) { + return; + } + const jobId = logTrackingJobId; + const offset = logTrackingOffset; + try { + const response = await TachyonShellMethods.componentActionLog( + jobId, + offset + ); + if (logPollStopped || logTrackingJobId !== jobId) { + return; + } + if (response.success && response.data) { + logTrackingOffset = response.data.offset; + appendLogText(response.data.log); + } + } catch (_error) { + } finally { + if (!logPollStopped && logTrackingJobId === jobId) { + logPollTimer = setTimeout(pollLog, 1500); + } + } + } + function stopLogTracking() { + logPollStopped = true; + if (logPollTimer) { + clearTimeout(logPollTimer); + logPollTimer = null; + } + logTrackingJobId = null; + } + function finishLogTracking() { + if (logPollStopped || !logTrackingJobId) { + stopLogTracking(); + return; + } + const jobId = logTrackingJobId; + const offset = logTrackingOffset; + logPollStopped = true; + if (logPollTimer) { + clearTimeout(logPollTimer); + logPollTimer = null; + } + void TachyonShellMethods.componentActionLog(jobId, offset).then((response) => { + if (response.success && response.data) { + logTrackingOffset = response.data.offset; + appendLogText(response.data.log); + } + }).catch(() => { + }).finally(() => { + logTrackingJobId = null; + }); + } + function copyLog() { + if (!logFullText) { + return; + } + copyToClipboard(logFullText); + } const controller = { updateStep: (stepIndex, statusText) => { setStep(stepIndex, statusText); @@ -15498,6 +15617,7 @@ function showUpdateProgressModal(options) { completeSuccess: (message, opts) => { isCompleted = true; cleanupTimers(); + finishLogTracking(); progressBarFillEl.style.width = "100%"; progressBarFillEl.classList.add( "tachyon-update-modal__progress-fill--success" @@ -15571,6 +15691,7 @@ function showUpdateProgressModal(options) { completeError: (errorMessage) => { isCompleted = true; cleanupTimers(); + finishLogTracking(); progressBarFillEl.style.width = "100%"; progressBarFillEl.classList.add( "tachyon-update-modal__progress-fill--error" @@ -15590,8 +15711,27 @@ function showUpdateProgressModal(options) { }); actionButtonContainer.replaceChildren(closeBtn); }, + startLogTracking: (jobId) => { + if (!jobId || logTrackingJobId === jobId) { + return; + } + logTrackingJobId = jobId; + logTrackingOffset = 0; + logPollStopped = false; + logPanelEl.style.display = ""; + if (logPollTimer) { + clearTimeout(logPollTimer); + logPollTimer = null; + } + void pollLog(); + }, + stopLogTracking: () => { + stopLogTracking(); + }, + getLogText: () => logFullText, close: () => { cleanupTimers(); + stopLogTracking(); if (activeModalController === controller) { activeModalController = null; activeModalJobId = null; @@ -16040,6 +16180,7 @@ async function followComponentActionState(state) { targetVersion: state.latest_version }); } + getActiveProgressModalController()?.startLogTracking(jobId); } try { const response = state.running ? await TachyonShellMethods.waitComponentActionJob( @@ -16195,6 +16336,7 @@ async function handleComponentAction(button) { jobId = startResponse.data.job_id; setActiveProgressModalJobId(jobId); markUiActionOwned("component", jobId); + modalController.startLogTracking(jobId); if (followedComponentJobs.has(jobId)) { return; } @@ -17146,6 +17288,41 @@ var styles6 = ` border-top: 1px solid var(--border-color, rgba(255,255,255,0.12)); padding-top: 10px; } + +.tachyon-update-modal__log-panel { + margin-top: 10px; + border-top: 1px solid var(--border-color, rgba(255,255,255,0.12)); + padding-top: 10px; +} + +.tachyon-update-modal__log-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: 8px; + margin-bottom: 6px; +} + +.tachyon-update-modal__log-copy { + padding: 2px 8px; + font-size: 12px; +} + +.tachyon-update-modal__log { + margin: 0; + max-height: 200px; + overflow-y: auto; + white-space: pre-wrap; + word-break: break-all; + font-family: monospace; + font-size: 11px; + line-height: 1.5; + color: var(--text-color, #ddd); + background: rgba(0, 0, 0, 0.35); + border: 1px solid var(--border-color, rgba(255,255,255,0.12)); + border-radius: 4px; + padding: 8px; +} `; // src/tachyon/tabs/updates/index.ts diff --git a/luci-app-tachyon/po/ru/tachyon.po b/luci-app-tachyon/po/ru/tachyon.po index fd54f1e0..ef711cca 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-13 20:17+0300\n" -"PO-Revision-Date: 2026-08-13 20:17+0300\n" +"POT-Creation-Date: 2026-08-14 13:16+0300\n" +"PO-Revision-Date: 2026-08-14 13:16+0300\n" "Last-Translator: Dushnilin\n" "Language-Team: none\n" "Language: ru\n" @@ -527,6 +527,9 @@ msgstr "Условия" msgid "Config File Path" msgstr "Путь к файлу конфигурации" +msgid "Config Snapshots" +msgstr "Снапшоты конфигурации" + msgid "Configure User-Agent in the item settings" msgstr "Настройте User-Agent в параметрах элемента" @@ -560,6 +563,9 @@ msgstr "Скопировано" msgid "Copy" msgstr "Копировать" +msgid "Copy log" +msgstr "Копировать лог" + msgid "Copy proxy link" msgstr "Скопировать ссылку прокси" @@ -614,6 +620,15 @@ msgstr "Задержка в миллисекундах перед перезаг msgid "Delay value cannot be empty" msgstr "Значение задержки не может быть пустым" +msgid "Delete" +msgstr "Удалить" + +msgid "Delete Snapshot" +msgstr "Удалить снапшот" + +msgid "Delete the snapshot" +msgstr "Удалить снапшот" + msgid "Detect server country" msgstr "Определять страну сервера" @@ -854,6 +869,9 @@ msgstr "напр. google.com, 1.1.1.1, 443" msgid "e.g. SHA256 — leave empty for default" msgstr "напр. SHA256 — оставьте пустым для значения по умолчанию" +msgid "Each entry must be \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp), e.g. tcp:6881,udp:6881-6889" +msgstr "" + msgid "Enable" msgstr "Включить" @@ -1031,6 +1049,9 @@ msgstr "Не удалось закрыть подключения" msgid "Failed to copy!" msgstr "Не удалось скопировать!" +msgid "Failed to delete snapshot" +msgstr "Не удалось удалить снапшот" + msgid "Failed to execute" msgstr "Не удалось выполнить" @@ -1040,18 +1061,27 @@ msgstr "Не удалось создать отчёт об ошибке" msgid "Failed to generate WARP config:" msgstr "Не удалось сгенерировать конфигурацию WARP:" +msgid "Failed to load snapshots" +msgstr "Не удалось загрузить снапшоты" + msgid "Failed to parse file:" msgstr "Ошибка разбора файла:" msgid "Failed to parse WARP config:" msgstr "Не удалось разобрать конфигурацию WARP:" +msgid "Failed to read operation log" +msgstr "Не удалось прочитать лог операции" + msgid "Failed to receive response from AI service." msgstr "Не удалось получить ответ от ИИ-сервиса." msgid "Failed to reset settings" msgstr "Не удалось сбросить настройки" +msgid "Failed to restore snapshot" +msgstr "Не удалось восстановить снапшот" + msgid "Failed to save AI Watchdog settings" msgstr "Ошибка сохранения настроек AI Watchdog" @@ -1064,6 +1094,9 @@ msgstr "Не удалось сохранить DNS Turbo Cache" msgid "Failed to save Smart Detect settings" msgstr "Ошибка сохранения настроек Smart Detect" +msgid "Failed to save snapshot" +msgstr "Не удалось сохранить снапшот" + msgid "Failed to start bot" msgstr "Не удалось запустить бота" @@ -1181,6 +1214,9 @@ msgstr "GET-эндпоинты открыты в локальной сети. PO msgid "Get global check" msgstr "Получить глобальную проверку" +msgid "Give the snapshot a name. It is saved with the current date and can be restored from this list later." +msgstr "Дайте снапшоту имя. Он сохраняется с текущей датой, и его можно будет восстановить из этого списка позже." + msgid "Global check" msgstr "Глобальная проверка" @@ -1895,6 +1931,9 @@ msgstr "Нет правил, использующих Zapret" msgid "No rules use Zapret2" msgstr "Нет правил, использующих Zapret2" +msgid "No snapshots yet" +msgstr "Снапшотов пока нет" + msgid "Node list is empty" msgstr "Список узлов пуст" @@ -2003,6 +2042,12 @@ msgstr "Операция не выполнена" msgid "Operation in progress..." msgstr "Выполняется операция..." +msgid "Operation log" +msgstr "Лог операции" + +msgid "Operation log is not available" +msgstr "Лог операции недоступен" + msgid "Operation timed out" msgstr "Время ожидания истекло" @@ -2042,14 +2087,11 @@ msgstr "Переопределить стандартные заголовки msgid "Overwrite existing records (if unchecked, merge with existing records)" msgstr "Перезаписать существующие записи (если снято — объединить с существующими)" -msgid "P2P Leak Protection" -msgstr "Защита от утечек P2P" - msgid "P2P Client Ports" msgstr "Порты P2P-клиента" -msgid "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct." -msgstr "Закрепить изоляцию P2P за портами торрент-клиента, через запятую. Каждая запись — \"протокол\", \"протокол:порт\" или \"протокол:порт-порт\" (tcp/udp). Без порта весь протокол уходит напрямую." +msgid "P2P Leak Protection" +msgstr "Защита от утечек P2P" msgid "Parsed records:" msgstr "Обработанные записи:" @@ -2111,6 +2153,9 @@ msgstr "Постоянное умное определение" msgid "Pin on dashboard" msgstr "Закрепить на дашборде" +msgid "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct." +msgstr "Закрепить изоляцию P2P за портами торрент-клиента, через запятую. Каждая запись — \"протокол\", \"протокол:порт\" или \"протокол:порт-порт\" (tcp/udp). Без порта весь протокол уходит напрямую." + msgid "Please wait, operation is running..." msgstr "Пожалуйста, подождите, выполняется операция..." @@ -2135,9 +2180,15 @@ msgstr "Порт должен быть от 1 до 65535" msgid "Port range start must be less than or equal to end" msgstr "Начало диапазона портов должно быть меньше или равно концу" +msgid "Port range start must not exceed its end" +msgstr "" + msgid "Ports" msgstr "Порты" +msgid "Ports must be between 1 and 65535" +msgstr "" + msgid "Pre-download all preset lists" msgstr "Предзагрузить все предустановленные списки" @@ -2315,6 +2366,12 @@ msgstr "Перезапустить Tachyon" msgid "Restarts" msgstr "Перезапуски" +msgid "Restore" +msgstr "" + +msgid "Restore Snapshot" +msgstr "Восстановить снапшот" + msgid "Restores the Tachyon factory defaults: all rules, subscriptions, custom DNS servers and other options will be lost." msgstr "Восстанавливает заводские настройки Tachyon: все правила, подписки, пользовательские DNS-серверы и другие параметры будут удалены." @@ -2390,12 +2447,18 @@ msgstr "Россия (ru)" msgid "Save" 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 "Сохранение…" @@ -2651,6 +2714,12 @@ msgstr "Smart Detect" msgid "Smart Detect settings saved" msgstr "Настройки Smart Detect сохранены" +msgid "Snapshot name" +msgstr "Имя снапшота" + +msgid "Snapshot restored. The service restarts and the page will reload." +msgstr "Снапшот восстановлен. Сервис перезапускается, страница будет перезагружена." + msgid "Snell Version" msgstr "Версия Snell" @@ -2819,6 +2888,9 @@ msgstr "Служба Tachyon остановлена. Запустите серв msgid "Tachyon service is stopped. Start the service to display the dashboard." msgstr "Служба Tachyon остановлена. Запустите сервис для отображения дашборда." +msgid "Tachyon update did not complete within the timeout" +msgstr "" + msgid "Tachyon will not modify your DHCP configuration" msgstr "Tachyon не будет изменять вашу конфигурацию DHCP" @@ -2930,6 +3002,9 @@ msgstr "Этот параметр требует значение." msgid "This will erase all Tachyon settings and restore the factory defaults. The service will restart. This action cannot be undone." msgstr "Все настройки Tachyon будут удалены и восстановлены заводские значения. Сервис будет перезапущен. Это действие нельзя отменить." +msgid "This will replace the current Tachyon settings with the snapshot" +msgstr "Это заменит текущие настройки Tachyon на снапшот" + msgid "Time" msgstr "Время" @@ -3095,6 +3170,9 @@ msgstr "Неуказанный IP-адрес не разрешён" msgid "Unstable" msgstr "Нестабильно" +msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." +msgstr "Хранится до 10 снапшотов; самые старые удаляются автоматически." + msgid "Update" msgstr "Обновить" @@ -3310,453 +3388,3 @@ msgstr "sing-box outbound для Zapret2 настроен" msgid "Zapret2 sing-box outbound is not configured" msgstr "sing-box outbound для Zapret2 не настроен" - -msgid "Service Health Check" -msgstr "Проверка доступности сервисов" - -msgid "Total Targets" -msgstr "Всего целей" - -msgid "Passed" -msgstr "Успешно" - -msgid "Failed" -msgstr "Ошибки" - -msgid "Avg Latency" -msgstr "Ср. задержка" - -msgid "Search domain..." -msgstr "Поиск домена..." - -msgid "Section / Target" -msgstr "Секция / Цель" - -msgid "Outbound Route" -msgstr "Маршрут" - -msgid "Resolved IP / DNS" -msgstr "IP / DNS" - -msgid "Verdict" -msgstr "Статус" - -msgid "Check domain or IP (e.g. example.com)..." -msgstr "Проверить домен или IP (напр. example.com)..." - -msgid "Check Custom" -msgstr "Проверить свой" - -msgid "Check All" -msgstr "Проверить все" - -msgid "Check Again" -msgstr "Проверить снова" - -msgid "Testing..." -msgstr "Тестирование..." - -msgid "Fetching service targets..." -msgstr "Получение списка сервисов..." - -msgid "Failed to run service check." -msgstr "Не удалось выполнить проверку сервисов." - -msgid "Failed to parse target list." -msgstr "Ошибка обработки списка целей." - -msgid "No targets found in section configs." -msgstr "Цели в конфигурациях секций не найдены." - -msgid "Check YouTube availability" -msgstr "Проверить доступность YouTube" - -msgid "Check Mode:" -msgstr "Режим проверки:" - -msgid "Active Sections" -msgstr "Активные секции" - -msgid "All Profiles" -msgstr "Все сервисы и профили" - -msgid "Sections" -msgstr "Секции" - -msgid "Servers" -msgstr "Серверы" - -msgid "Monitoring" -msgstr "Мониторинг" - -msgid "Components" -msgstr "Компоненты" - -msgid "Drag rows to change priority. The rule at the top is checked first." -msgstr "Перетащите строки для изменения приоритета. Правило вверху проверяется первым." - -msgid "Rules" -msgstr "Правила" - -msgid "Edit" -msgstr "Редактировать" - -msgid "Connection" -msgstr "Соединение" - -msgid "Add a section" -msgstr "Добавить секцию" - -msgid "Add a server inbound" -msgstr "Добавить серверный инбаунд" - -msgid "Accept external proxy connections and route them with sing-box." -msgstr "Принимать внешние прокси-подключения и маршрутизировать их через sing-box." - -msgid "Section" -msgstr "Секция" - -msgid "Server" -msgstr "Сервер" - -msgid "Installing" -msgstr "Установка" - -msgid "Initializing operation..." -msgstr "Инициализация операции..." - -msgid "Installing package & updating configurations..." -msgstr "Установка пакета и обновление настроек..." - -msgid "Installation completed successfully!" -msgstr "Установка успешно завершена!" - -msgid "Direct" -msgstr "Напрямую" - -msgid "Tachyon Settings" -msgstr "Настройки Tachyon" - -msgid "All Services" -msgstr "Все сервисы" - -msgid "Service Availability Check" -msgstr "Проверка доступности сервисов" - -msgid "Filter by service:" -msgstr "Фильтр по сервису:" - -msgid "Search domain or service..." -msgstr "Поиск домена или сервиса..." - -msgid "Service / Target" -msgstr "Сервис / Цель" - -msgid "Route Type" -msgstr "Тип маршрута" - -msgid "Active Routes" -msgstr "Активные маршруты" - -msgid "Custom Domains" -msgstr "Свои домены" - -msgid "Unavailable" -msgstr "Недоступно" - -msgid "Available" -msgstr "Доступно" - -msgid "Auto" -msgstr "Авто" - -msgid "Proxy" -msgstr "Прокси" - -msgid "TCP" -msgstr "TCP" - -msgid "TLS" -msgstr "TLS" - -msgid "Method" -msgstr "Метод" - -msgid "ALPN" -msgstr "ALPN" - -msgid "VLESS flow" -msgstr "VLESS flow" - -msgid "FakeTLS host" -msgstr "FakeTLS host" - -msgid "Concurrency" -msgstr "Параллелизм" - -msgid "Delete" -msgstr "Удалить" - -msgid "Information" -msgstr "Информация" - -msgid "Saving..." -msgstr "Сохранение..." - -msgid "Generating..." -msgstr "Генерация..." - -msgid "Starting..." -msgstr "Запуск..." - -msgid "Stopping..." -msgstr "Остановка..." - -msgid "None" -msgstr "Нет" - -msgid "Enabled" -msgstr "Включено" - -msgid "Disabled" -msgstr "Отключено" - -msgid "Configuration for Tachyon service" -msgstr "Конфигурация сервиса Tachyon" - -msgid "Only the specified servers" -msgstr "Только указанные серверы" - -msgid "Select all" -msgstr "Выбрать все" - -msgid "Routing mode" -msgstr "Режим маршрутизации" - -msgid "Routing section" -msgstr "Секция маршрутизации" - -msgid "Keeps FakeIP cache persistent across reboots and pre-resolves popular blocked domains on startup so first-visit latency is 0 ms." -msgstr "Сохраняет кэш FakeIP между перезагрузками и предварительно разрешает популярные заблокированные домены при запуске, чтобы задержка первого обращения была 0 мс." - -msgid "Configure User-Agent в the item settings" -msgstr "Настройте User-Agent в параметрах элемента" - -msgid "Client link" -msgstr "Клиентская ссылка" - -msgid "Client link QR code" -msgstr "QR-код клиентской ссылки" - -msgid "Client link is not available yet" -msgstr "Клиентская ссылка пока недоступна" - -msgid "Loading client link..." -msgstr "Загрузка клиентской ссылки..." - -msgid "Secret" -msgstr "Секрет" - -msgid "Public Key" -msgstr "Публичный ключ" - -msgid "Certificate path" -msgstr "Путь к сертификату" - -msgid "Key path" -msgstr "Путь к ключу" - -msgid "Specify a file path" -msgstr "Укажите путь к файлу" - -msgid "Specify different files" -msgstr "Укажите разные файлы" - -msgid "Selected section" -msgstr "Выбранная секция" - -msgid "Inbound JSON" -msgstr "Inbound JSON" - -msgid "Inbound JSON cannot be empty" -msgstr "Inbound JSON не может быть пустым" - -msgid "Inbound JSON must be an object with a type field" -msgstr "Inbound JSON должен быть объектом с полем type" - -msgid "Server information" -msgstr "Информация о сервере" - -msgid "Server name" -msgstr "Имя сервера" - -msgid "Server name / SNI" -msgstr "Имя сервера / SNI" - -msgid "Reality fake site" -msgstr "Фейковый сайт Reality" - -msgid "Reality fake site port" -msgstr "Порт фейкового сайта Reality" - -msgid "Reality max time difference" -msgstr "Макс. разница времени Reality" - -msgid "Reality private key" -msgstr "Приватный ключ Reality" - -msgid "Reality public key" -msgstr "Публичный ключ Reality" - -msgid "Reality short ID" -msgstr "Короткий ID Reality" - -msgid "Reality short ID must contain 1-8 hex digits" -msgstr "Короткий ID Reality должен содержать 1-8 шестнадцатеричных цифр" - -msgid "Fronting IP" -msgstr "Fronting IP" - -msgid "Fronting port" -msgstr "Fronting порт" - -msgid "Fronting proxy protocol" -msgstr "Протокол Fronting прокси" - -msgid "gRPC service" -msgstr "Сервис gRPC" - -msgid "Transport host" -msgstr "Хост транспорта" - -msgid "Transport path" -msgstr "Путь транспорта" - -msgid "Transport path must start with /" -msgstr "Путь транспорта должен начинаться с /" - -msgid "HTTP hosts" -msgstr "HTTP хосты" - -msgid "XHTTP mode" -msgstr "Режим XHTTP" - -msgid "Fallback on unknown DC" -msgstr "Fallback при неизвестном DC" - -msgid "Padding" -msgstr "Padding" - -msgid "Handshake timeout" -msgstr "Таймаут рукопожатия" - -msgid "Time skew tolerance" -msgstr "Допуск отклонения времени" - -msgid "Invalid NFQWS strategy" -msgstr "Неверная стратегия NFQWS" - -msgid "Invalid NFQWS2 strategy" -msgstr "Неверная стратегия NFQWS2" - -msgid "Installed build \\u2192 Available build" -msgstr "Установленная сборка \\u2192 Доступная сборка" - -msgid "Prevent multiple reload_firewall calls within 120 seconds to avoid connection drops." -msgstr "Предотвращать множественные вызовы reload_firewall в течение 120 секунд для избежания разрыва соединений." - -msgid "Obfuscation" -msgstr "Обфускация" - -msgid "Obfuscation password" -msgstr "Пароль обфускации" - -msgid "Auto update" -msgstr "Автообновление" - -msgid "Use CIDR prefixes like 192.168.1.0/24 or 2001:db8::/32" -msgstr "Используйте CIDR-префиксы, например 192.168.1.0/24 или 2001:db8::/32" - -msgid "Use an IP address" -msgstr "Используйте IP-адрес" - -msgid "Use an IP listen address" -msgstr "Используйте IP-адрес прослушивания" - -msgid "Use a domain name or IP address" -msgstr "Используйте имя домена или IP-адрес" - -msgid "Use an HTTP or HTTPS URL" -msgstr "Используйте HTTP или HTTPS URL" - -msgid "Use letters, digits, dots, underscores, or hyphens" -msgstr "Используйте буквы, цифры, точки, подчёркивания или дефисы" - -msgid "Use a non-negative integer" -msgstr "Используйте неотрицательное целое число" - -msgid "Use a non-zero secret" -msgstr "Используйте ненулевой секрет" - -msgid "Use 32 hex characters" -msgstr "Используйте 32 шестнадцатеричных символа" - -msgid "Use a duration like 30s, 5m, or 1h30m" -msgstr "Используйте длительность, например 30s, 5m или 1h30m" - -msgid "Expecting: %s" -msgstr "Ожидалось: %s" - -msgid "Cannot save server" -msgstr "Не удалось сохранить сервер" - -msgid "QR code is too large" -msgstr "QR-код слишком большой" - -msgid "Save Snapshot" -msgstr "Сохранить снапшот" - -msgid "Snapshot name" -msgstr "Имя снапшота" - -msgid "Config Snapshots" -msgstr "Снапшоты конфигурации" - -msgid "Save a snapshot of the working config and restore it later if something breaks." -msgstr "Сохранить снапшот рабочей конфигурации, чтобы восстановить её позже, если что-то сломается." - -msgid "Give the snapshot a name. It is saved with the current date and can be restored from this list later." -msgstr "Дайте снапшоту имя. Он сохраняется с текущей датой, и его можно будет восстановить из этого списка позже." - -msgid "No snapshots yet" -msgstr "Снапшотов пока нет" - -msgid "Failed to load snapshots" -msgstr "Не удалось загрузить снапшоты" - -msgid "Failed to save snapshot" -msgstr "Не удалось сохранить снапшот" - -msgid "Failed to delete snapshot" -msgstr "Не удалось удалить снапшот" - -msgid "Failed to restore snapshot" -msgstr "Не удалось восстановить снапшот" - -msgid "Restore Snapshot" -msgstr "Восстановить снапшот" - -msgid "Delete Snapshot" -msgstr "Удалить снапшот" - -msgid "This will replace the current Tachyon settings with the snapshot" -msgstr "Это заменит текущие настройки Tachyon на снапшот" - -msgid "Delete the snapshot" -msgstr "Удалить снапшот" - -msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." -msgstr "Хранится до 10 снапшотов; самые старые удаляются автоматически." - -msgid "Snapshot restored. The service restarts and the page will reload." -msgstr "Снапшот восстановлен. Сервис перезапускается, страница будет перезагружена." diff --git a/luci-app-tachyon/po/templates/tachyon.pot b/luci-app-tachyon/po/templates/tachyon.pot index 75b475c8..1e05e816 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-13 17:10+0300\n" -"PO-Revision-Date: 2026-08-13 17:10+0300\n" +"POT-Creation-Date: 2026-08-14 10:16+0300\n" +"PO-Revision-Date: 2026-08-14 10:16+0300\n" "Last-Translator: Dushnilin \n" "Language-Team: LANGUAGE \n" "Language: \n" @@ -32,7 +32,7 @@ msgstr "" msgid ".lst Lists" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1375 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1665 msgid "(provider default)" msgstr "" @@ -64,11 +64,11 @@ msgstr "" msgid "⚙ Advanced Settings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:668 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:906 msgid "⚠️ If all Bootstrap DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:659 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:897 msgid "⚠️ If all Main DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss." msgstr "" @@ -167,7 +167,7 @@ msgstr "" msgid "Additionally show servers by protocol, transport, and security. Add only servers matching the specified parameters." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1781 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2071 msgid "Administrator Chat IDs" msgstr "" @@ -175,7 +175,7 @@ msgstr "" msgid "Advanced self-healing features. Requires Watchdog to be enabled." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:584 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:822 msgid "Advanced System" msgstr "" @@ -183,7 +183,7 @@ msgstr "" msgid "AEAD Method" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:583 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:821 msgid "AI & Watchdog" msgstr "" @@ -191,11 +191,11 @@ msgstr "" msgid "AI Agent REST API (12 Endpoints)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1327 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1617 msgid "AI Agent REST API Bearer Token" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1394 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1684 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:893 msgid "AI API Key" msgstr "" @@ -212,27 +212,27 @@ msgstr "" msgid "AI Doctor (ChatGPT / DeepSeek API)" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1154 +#: src/tachyon/tabs/diagnostic/initController.ts:1158 msgid "AI Doctor Diagnosis" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:843 -#: src/tachyon/tabs/diagnostic/initController.ts:1160 -#: src/tachyon/tabs/diagnostic/initController.ts:1168 +#: src/tachyon/tabs/diagnostic/initController.ts:847 +#: src/tachyon/tabs/diagnostic/initController.ts:1164 +#: src/tachyon/tabs/diagnostic/initController.ts:1172 msgid "AI Doctor failed" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1381 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1671 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:860 msgid "AI Doctor Language" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1368 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1658 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:836 msgid "AI Model" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1352 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1642 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:766 msgid "AI Provider" msgstr "" @@ -291,7 +291,7 @@ msgstr "" msgid "Allowed domain prefixes are full:, keyword:, and regex:" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:959 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1197 msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall." msgstr "" @@ -299,7 +299,7 @@ msgstr "" msgid "Allows limiting the list of servers for URLTest" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1341 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1631 msgid "Allows Tachyon to send diagnostic snapshots to ChatGPT or DeepSeek API for intelligent root-cause analysis and auto-repair recommendations." msgstr "" @@ -311,11 +311,11 @@ msgstr "" msgid "AmneziaWG Generator" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:835 +#: src/tachyon/tabs/updates/initController.ts:836 msgid "Another component action is already running" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1395 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1685 msgid "API Key for OpenAI (sk-...) or DeepSeek (optional for Ollama / LM Studio)" msgstr "" @@ -327,11 +327,11 @@ msgstr "" msgid "Apply section rules only to the specified local IP addresses" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:133 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:138 msgid "Applying changes & reloading services..." msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:995 +#: src/tachyon/tabs/diagnostic/initController.ts:999 msgid "Applying fix" msgstr "" @@ -339,7 +339,7 @@ msgstr "" msgid "Ask Tachyon AI Assistant a question..." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1792 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2082 msgid "At least one Admin Chat ID is required" msgstr "" @@ -359,7 +359,7 @@ msgstr "" msgid "Auto refresh" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1584 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1874 msgid "Auto-detected domains" msgstr "" @@ -367,7 +367,7 @@ msgstr "" msgid "Auto-detected Domains" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1544 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1834 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1053 msgid "Auto-detects blocked domains from logs and adds them to the first section where they work via proxy." msgstr "" @@ -380,7 +380,7 @@ msgstr "" msgid "Auto-update Hosts Lists" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1094 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1372 msgid "Automatic component update checks" msgstr "" @@ -392,7 +392,7 @@ msgstr "" msgid "Automatically add text to the name of each server from this subscription for convenient filtering." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1095 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1373 msgid "Automatically check installed components for new versions" msgstr "" @@ -400,7 +400,7 @@ msgstr "" msgid "Automatically generate a Cloudflare WARP account and configure all AmneziaWG settings." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1518 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1808 msgid "Automatically increase check intervals when healthy (to 5 min) and decrease on problems (to 120s)." msgstr "" @@ -440,11 +440,11 @@ msgstr "" msgid "Bootstrap DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:622 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:860 msgid "Bootstrap DNS Servers" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1743 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2033 msgid "Bot Status" msgstr "" @@ -461,7 +461,7 @@ msgstr "" msgid "Browser is using FakeIP correctly" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1258 +#: src/tachyon/tabs/diagnostic/initController.ts:1262 msgid "Bug report downloaded" msgstr "" @@ -524,7 +524,7 @@ msgstr "" msgid "ByeDPI strategy cannot be empty" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1008 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1286 msgid "Bypasses UDP traffic for selected game consoles (PS5/Xbox) to achieve NAT Type 1 / 2 (Full Cone NAT) for P2P matchmaking, while keeping TCP (PSN/Auth) routed through the proxy." msgstr "" @@ -532,19 +532,22 @@ msgstr "" msgid "CA Certificate" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1082 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1360 msgid "Cache all built-in lists and databases even if they are not currently selected in any section. Recommended if you have plenty of storage space or USB drive." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1225 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1503 msgid "Cache File Path" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1239 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1517 msgid "Cache file path cannot be empty" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:434 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:575 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:607 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:655 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7712 msgid "Cancel" msgstr "" @@ -569,7 +572,7 @@ msgid "Cascade connection" msgstr "" #: src/tachyon/tabs/updates/initController.ts:498 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:363 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:481 msgid "Check completed!" msgstr "" @@ -592,7 +595,7 @@ msgstr "" msgid "Check timeout after which the server is considered dead" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:903 +#: src/tachyon/tabs/updates/initController.ts:905 msgid "Check update" msgstr "" @@ -610,11 +613,11 @@ msgstr "" msgid "Checking Connection..." msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:109 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:114 msgid "Checking for updates..." msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1552 +#: src/tachyon/tabs/diagnostic/initController.ts:1556 #: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:14 #: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:15 #: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:15 @@ -635,7 +638,7 @@ msgid "Checking..." msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:275 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1635 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1925 msgid "Checking…" msgstr "" @@ -682,7 +685,7 @@ msgstr "" msgid "Clean Comments" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:126 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:131 msgid "Cleaning configuration & reloading..." msgstr "" @@ -702,12 +705,12 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10221 #: src/partials/modal/renderModal.ts:263 #: src/tachyon/tabs/dashboard/initController.ts:1085 +#: src/tachyon/tabs/diagnostic/initController.ts:1148 #: src/tachyon/tabs/monitoring/initController.ts:884 #: src/tachyon/tabs/monitoring/initController.ts:934 -#: src/tachyon/tabs/diagnostic/initController.ts:1144 #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:416 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:461 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:534 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:580 msgid "Close" msgstr "" @@ -742,7 +745,7 @@ msgstr "" msgid "Cloudflare WARP API access token" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1782 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2072 msgid "Comma-separated list of Telegram user IDs authorized to control the bot." msgstr "" @@ -750,7 +753,7 @@ msgstr "" msgid "Community Lists" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:120 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:125 msgid "Comparing versions & fingerprint check..." msgstr "" @@ -758,7 +761,7 @@ msgstr "" msgid "Component update available" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1104 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1382 msgid "Component update check interval" msgstr "" @@ -770,10 +773,14 @@ msgstr "" msgid "Conditions" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1211 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1489 msgid "Config File Path" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1592 +msgid "Config Snapshots" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4749 msgid "Configure User-Agent in the item settings" msgstr "" @@ -796,7 +803,7 @@ msgstr "" msgid "Connected" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:118 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:123 msgid "Connecting to update server..." msgstr "" @@ -820,6 +827,10 @@ msgstr "" msgid "Copy" msgstr "" +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:235 +msgid "Copy log" +msgstr "" + #: src/tachyon/tabs/dashboard/initController.ts:1055 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:476 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:477 @@ -834,7 +845,7 @@ msgstr "" msgid "Country code (e.g. ru, us, de)" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1110 +#: src/tachyon/tabs/diagnostic/initController.ts:1114 msgid "Current Diagnosis" msgstr "" @@ -850,7 +861,7 @@ msgstr "" msgid "Currently unavailable" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1405 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1695 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:915 msgid "Custom API Endpoint URL" msgstr "" @@ -863,11 +874,11 @@ msgstr "" msgid "Custom DNS Records (Hosts)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1361 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1651 msgid "Custom OpenAI-Compatible API (OpenRouter)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1406 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1696 msgid "Custom OpenAI-compatible API endpoint URL (e.g. http://192.168.1.100:11434/v1/chat/completions)" msgstr "" @@ -879,29 +890,42 @@ msgstr "" msgid "Dashboard currently unavailable" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1908 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2198 msgid "Default (auto)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1141 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1419 msgid "Default address for checking server availability and latency. URLTest uses its own address." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:932 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1170 msgid "Delay in milliseconds before reloading Tachyon after interface UP" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:939 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1177 msgid "Delay value cannot be empty" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:615 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:621 +msgid "Delete" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:597 +msgid "Delete Snapshot" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:599 +msgid "Delete the snapshot" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2718 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2927 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3323 msgid "Detect server country" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1281 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1559 msgid "Detects and drops STUN/TURN packets in nftables to prevent real IP leaks via WebRTC." msgstr "" @@ -949,11 +973,11 @@ msgstr "" msgid "Disable autostart" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:983 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1221 msgid "Disable QUIC" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:984 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1222 msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming" msgstr "" @@ -971,15 +995,15 @@ msgstr "" msgid "DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:677 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:915 msgid "DNS Check Interval" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1462 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1752 msgid "DNS Check Interval (s)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:706 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:944 msgid "DNS Failures Before Switching" msgstr "" @@ -987,17 +1011,17 @@ msgstr "" msgid "DNS on router" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:595 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:833 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1814 msgid "DNS over HTTPS (DoH)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:597 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:835 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1816 msgid "DNS over QUIC (DoQ)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:596 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:834 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1815 msgid "DNS over TLS (DoT)" msgstr "" @@ -1007,7 +1031,7 @@ msgstr "" msgid "DNS protocol" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:592 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:830 msgid "DNS Protocol Type" msgstr "" @@ -1016,12 +1040,12 @@ msgstr "" msgid "DNS protocol used by the resolver" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:787 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1025 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7357 msgid "DNS requests through section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:734 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:972 msgid "DNS Rewrite TTL" msgstr "" @@ -1039,27 +1063,27 @@ msgstr "" msgid "DNS server used by the resolver" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:623 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:861 msgid "DNS server used to obtain IP addresses for upstream DNS and proxies. If multiple servers are selected, a timeout switches to a backup." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:608 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:846 msgid "DNS Servers" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:579 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:817 msgid "DNS Settings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:766 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1004 msgid "DNS Strategy" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:720 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:958 msgid "DNS Successful Checks Before Recovery" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:778 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1016 msgid "DNS through proxy" msgstr "" @@ -1067,7 +1091,7 @@ msgstr "" msgid "DNS through section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:756 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:994 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:479 msgid "DNS Turbo Cache" msgstr "" @@ -1076,7 +1100,7 @@ msgstr "" msgid "DNS Turbo Cache saved" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:695 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:933 msgid "DNS Unavailability Timeout" msgstr "" @@ -1109,13 +1133,14 @@ msgid "Do not test specified servers." msgstr "" #: src/tachyon/tabs/diagnostic/initController.ts:721 -#: src/tachyon/tabs/diagnostic/initController.ts:759 -#: src/tachyon/tabs/diagnostic/initController.ts:767 +#: src/tachyon/tabs/diagnostic/initController.ts:763 +#: src/tachyon/tabs/diagnostic/initController.ts:771 msgid "Doctor failed" msgstr "" #: src/tachyon/tabs/diagnostic/initController.ts:737 -#: src/tachyon/tabs/diagnostic/initController.ts:746 +#: src/tachyon/tabs/diagnostic/initController.ts:749 +#: src/tachyon/tabs/diagnostic/initController.ts:750 msgid "Doctor repair" msgstr "" @@ -1135,7 +1160,7 @@ msgstr "" msgid "Domain Resolver" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1556 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1846 msgid "Domain test sections" msgstr "" @@ -1152,7 +1177,7 @@ msgstr "" msgid "Done" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1201 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1479 msgid "Dont Touch My DHCP!" msgstr "" @@ -1165,27 +1190,27 @@ msgstr "" msgid "Download" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1180 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1458 msgid "Download component packages via the selected section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1188 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1466 msgid "Download components through" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1179 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1457 msgid "Download components through a section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1166 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1444 msgid "Download lists through" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1157 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1435 msgid "Download lists through a section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1158 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1436 msgid "Download remote lists and rule sets via the selected section" msgstr "" @@ -1206,7 +1231,7 @@ msgstr "" msgid "Downloaded" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:130 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:135 msgid "Downloading package from repository..." msgstr "" @@ -1235,15 +1260,19 @@ msgstr "" msgid "e.g. SHA256 — leave empty for default" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1260 +msgid "Each entry must be \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp), e.g. tcp:6881,udp:6881-6889" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7226 msgid "Enable" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1517 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1807 msgid "Enable Adaptive Intervals" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1340 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1630 msgid "Enable AI Doctor (ChatGPT / LLM Analysis)" msgstr "" @@ -1251,11 +1280,11 @@ msgstr "" msgid "Enable AI Doctor (LLM Integration)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1524 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1814 msgid "Enable Anomaly Detection" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1035 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1313 msgid "Enable automatic updates for remote lists and rule sets" msgstr "" @@ -1267,11 +1296,11 @@ msgstr "" msgid "Enable built-in DNS resolver for domains handled by this section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1496 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1786 msgid "Enable Config Validation" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1456 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1746 msgid "Enable DNS Continuous Check" msgstr "" @@ -1279,19 +1308,19 @@ msgstr "" msgid "Enable DNS Turbo Cache" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1469 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1759 msgid "Enable Firewall Reload Dedup" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1503 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1793 msgid "Enable Graceful Degradation" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1476 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1766 msgid "Enable Health Metrics" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1034 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1312 msgid "Enable list updates" msgstr "" @@ -1303,52 +1332,52 @@ msgstr "" msgid "Enable Mixed Proxy Authentication" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:834 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1072 msgid "Enable Output Network Interface" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1432 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1722 msgid "Enable Proxy Health Monitor" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1489 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1779 msgid "Enable Smart Cooldowns" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1543 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1833 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1070 msgid "Enable Smart Detect" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1753 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2043 msgid "Enable Telegram Bot" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:667 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:905 msgid "Enable WAN DNS Fallback for Bootstrap DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:658 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:896 msgid "Enable WAN DNS Fallback for Main DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1314 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1604 msgid "Enable Watchdog" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:948 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1186 msgid "Enable YACD" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:958 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1196 msgid "Enable YACD WAN Access" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1754 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2044 msgid "Enables the background daemon that polls Telegram for commands and sends notifications." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1315 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1605 msgid "Enables the background watchdog process to monitor services and auto-recover on failures." msgstr "" @@ -1372,7 +1401,7 @@ msgstr "" msgid "Enter HWID" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1765 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2055 msgid "Enter the API token obtained from @BotFather." msgstr "" @@ -1384,7 +1413,7 @@ msgstr "" msgid "Enter the subscription URL" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:129 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:134 msgid "Environment preparation & dependency check..." msgstr "" @@ -1478,7 +1507,7 @@ msgstr "" msgid "External nfqws2 config files bypass Tachyon queue management and explicit validation." msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1015 +#: src/tachyon/tabs/diagnostic/initController.ts:1019 msgid "Failed to apply fix" msgstr "" @@ -1496,16 +1525,20 @@ msgstr "" msgid "Failed to copy!" msgstr "" -#: src/tachyon/methods/shell/index.ts:171 -#: src/tachyon/methods/shell/index.ts:178 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:527 +msgid "Failed to delete snapshot" +msgstr "" + +#: src/tachyon/methods/shell/index.ts:172 +#: src/tachyon/methods/shell/index.ts:179 #: src/tachyon/tabs/updates/initController.ts:616 #: src/tachyon/tabs/updates/initController.ts:617 -#: src/tachyon/tabs/updates/initController.ts:690 -#: src/tachyon/tabs/updates/initController.ts:881 +#: src/tachyon/tabs/updates/initController.ts:691 +#: src/tachyon/tabs/updates/initController.ts:883 msgid "Failed to execute" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1261 +#: src/tachyon/tabs/diagnostic/initController.ts:1265 msgid "Failed to generate bug report" msgstr "" @@ -1514,6 +1547,10 @@ msgstr "" msgid "Failed to generate WARP config:" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:630 +msgid "Failed to load snapshots" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8246 msgid "Failed to parse file:" msgstr "" @@ -1522,6 +1559,10 @@ msgstr "" msgid "Failed to parse WARP config:" msgstr "" +#: src/tachyon/methods/shell/index.ts:626 +msgid "Failed to read operation log" +msgstr "" + #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:106 msgid "Failed to receive response from AI service." msgstr "" @@ -1530,6 +1571,10 @@ msgstr "" msgid "Failed to reset settings" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:516 +msgid "Failed to restore snapshot" +msgstr "" + #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:405 msgid "Failed to save AI Watchdog settings" msgstr "" @@ -1546,7 +1591,11 @@ msgstr "" msgid "Failed to save Smart Detect settings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1699 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:669 +msgid "Failed to save snapshot" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1989 msgid "Failed to start bot" msgstr "" @@ -1554,7 +1603,7 @@ msgstr "" msgid "Failed to start watchdog" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1713 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2003 msgid "Failed to stop bot" msgstr "" @@ -1584,7 +1633,7 @@ msgstr "" msgid "FakeIP works; public IP comparison is inconclusive" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1457 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1747 msgid "Faster DNS health monitoring than the default cycle. Switches bootstrap DNS on failure." msgstr "" @@ -1597,7 +1646,7 @@ msgstr "" msgid "Fastest" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:119 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:124 msgid "Fetching release & commit metadata..." msgstr "" @@ -1613,7 +1662,7 @@ msgstr "" msgid "Firewall WAN port" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1010 +#: src/tachyon/tabs/diagnostic/initController.ts:1014 msgid "Fix applied" msgstr "" @@ -1622,7 +1671,7 @@ msgid "Fix the highlighted fields and save again." msgstr "" #: src/tachyon/tabs/diagnostic/initController.ts:743 -#: src/tachyon/tabs/diagnostic/initController.ts:1006 +#: src/tachyon/tabs/diagnostic/initController.ts:1010 msgid "Fixed" msgstr "" @@ -1630,7 +1679,7 @@ msgstr "" msgid "Forced device routing" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1291 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1569 msgid "Forces sing-box to tunnel DNS requests via DoQ with Encrypted Client Hello (ECH) for SNI hiding." msgstr "" @@ -1646,11 +1695,11 @@ msgstr "" msgid "Fuzzing is not supported here because Tachyon needs deterministic runtime validation." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1017 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1295 msgid "Game Console IPs" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1007 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1285 msgid "Game Console Optimizer (NAT Type 1)" msgstr "" @@ -1713,6 +1762,10 @@ msgstr "" msgid "Get global check" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:646 +msgid "Give the snapshot a name. It is saved with the current date and can be restored from this list later." +msgstr "" + #: src/tachyon/tabs/diagnostic/initController.ts:697 msgid "Global check" msgstr "" @@ -1778,11 +1831,11 @@ msgstr "" msgid "Higher-level check interval" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:686 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:924 msgid "Higher-priority DNS Check" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1122 +#: src/tachyon/tabs/diagnostic/initController.ts:1126 msgid "History" msgstr "" @@ -1799,7 +1852,7 @@ msgstr "" msgid "Hosts Lists Update Interval" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1483 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1773 msgid "How many hours of metrics to keep (default 24)." msgstr "" @@ -1811,23 +1864,23 @@ msgstr "" msgid "How often the currently selected server is checked" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1463 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1753 msgid "How often to check DNS health in seconds (default 60)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1439 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1729 msgid "How often to check proxy health in seconds (fast tier, default 30)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1805 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2095 msgid "How often to check Telegram for new messages (default: 5)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:678 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:916 msgid "How often to check the active DNS servers." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:687 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:925 msgid "How often to check whether a higher-priority DNS server has recovered." msgstr "" @@ -1853,7 +1906,7 @@ msgstr "" msgid "Idle timeout" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1504 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1794 msgid "If one health check fails with an error, continue running other checks instead of stopping." msgstr "" @@ -1944,33 +1997,33 @@ msgstr "" msgid "Init Packet Payload (I5)" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:917 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:405 +#: src/tachyon/tabs/updates/initController.ts:919 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:523 msgid "Install" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1411 +#: src/tachyon/tabs/updates/initController.ts:1413 msgid "Install another build:" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1269 +#: src/tachyon/tabs/updates/initController.ts:1271 msgid "Installed build → Available build" msgstr "" #: src/tachyon/tabs/updates/initController.ts:341 -#: src/tachyon/tabs/updates/initController.ts:1277 +#: src/tachyon/tabs/updates/initController.ts:1279 msgid "Installed version is newer than release" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:897 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1135 msgid "Interface Monitoring" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:931 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1169 msgid "Interface Monitoring Delay" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:898 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1136 msgid "Interface monitoring for Bad WAN" msgstr "" @@ -2280,15 +2333,15 @@ msgstr "" msgid "IPs" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:768 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1006 msgid "IPv4 only" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:770 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1008 msgid "IPv6 only" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1234 msgid "Isolate BitTorrent traffic and force it direct to prevent VPN bans" msgstr "" @@ -2356,7 +2409,7 @@ msgstr "" msgid "Keep URLTest before latency-sorted servers" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:757 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:484 msgid "Keeps FakeIP cache persistent across reboots and pre-resolves popular blocked domains on startup so first-visit latency is 0 ms." msgstr "" @@ -2369,25 +2422,25 @@ msgstr "" msgid "Keyword must not contain spaces or commas" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1382 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1672 msgid "Language for AI Doctor diagnosis responses" msgstr "" -#: src/tachyon/methods/shell/index.ts:480 -#: src/tachyon/methods/shell/index.ts:501 +#: src/tachyon/methods/shell/index.ts:481 +#: src/tachyon/methods/shell/index.ts:502 msgid "Latency test failed" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1140 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1418 msgid "Latency test URL" msgstr "" #: src/tachyon/tabs/updates/initController.ts:344 -#: src/tachyon/tabs/updates/initController.ts:1275 +#: src/tachyon/tabs/updates/initController.ts:1277 msgid "Latest version is installed" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1277 +#: src/tachyon/tabs/updates/initController.ts:1279 msgid "Latest version:" msgstr "" @@ -2407,11 +2460,11 @@ msgstr "" msgid "List must be an HTTP(S) URL or a local .lst path" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1585 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1875 msgid "List of domains automatically detected and the section they were added to. To edit or remove them, open the routing rules of the respective section." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1044 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1322 msgid "List Update Frequency" msgstr "" @@ -2419,7 +2472,7 @@ msgstr "" msgid "Listening port" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1360 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1650 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:821 msgid "LM Studio (Local PC / Server)" msgstr "" @@ -2450,11 +2503,11 @@ msgstr "" msgid "Loading connections" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1119 -#: src/tachyon/tabs/updates/initController.ts:1134 -#: src/tachyon/tabs/updates/initController.ts:1152 -#: src/tachyon/tabs/updates/initController.ts:1166 -#: src/tachyon/tabs/updates/initController.ts:1180 +#: src/tachyon/tabs/updates/initController.ts:1121 +#: src/tachyon/tabs/updates/initController.ts:1136 +#: src/tachyon/tabs/updates/initController.ts:1154 +#: src/tachyon/tabs/updates/initController.ts:1168 +#: src/tachyon/tabs/updates/initController.ts:1182 msgid "Loading..." msgstr "" @@ -2466,7 +2519,7 @@ msgstr "" msgid "Local Address" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1262 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1540 msgid "Log Level" msgstr "" @@ -2478,7 +2531,7 @@ msgstr "" msgid "Main DNS" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:609 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:847 msgid "Main DNS server. If multiple servers are selected, a timeout switches to a backup." msgstr "" @@ -2510,11 +2563,11 @@ msgstr "" msgid "Match traffic by packet DSCP mark (assigned in Windows via Policy-Based QoS). Examples: 46 (EF), 0x2e, 34 (AF41)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1531 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1821 msgid "Max reconnects per hour before alert (default 10)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:696 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:934 msgid "Maximum time to wait for example.com to resolve during a DNS health check." msgstr "" @@ -2522,7 +2575,7 @@ msgstr "" msgid "Memory Usage" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1482 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1772 msgid "Metrics Retention (hours)" msgstr "" @@ -2542,11 +2595,11 @@ msgstr "" msgid "Mixed Proxy Username" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1369 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1659 msgid "Model name to use. Leave empty to use default (gpt-4o-mini / claude-3-5-haiku / deepseek-chat / llama3:latest)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:907 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1145 msgid "Monitored Interfaces" msgstr "" @@ -2554,7 +2607,7 @@ msgstr "" msgid "Monitoring & Analytics" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1525 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1815 msgid "Monitors sing-box reconnect frequency. Alerts if too many reconnects per hour." msgstr "" @@ -2570,7 +2623,7 @@ msgstr "" msgid "MTU" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1795 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2085 msgid "Must be a comma-separated list of numeric IDs" msgstr "" @@ -2592,7 +2645,7 @@ msgstr "" msgid "Netherlands (nl)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:580 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:818 msgid "Network & Interfaces" msgstr "" @@ -2654,7 +2707,7 @@ msgstr "" msgid "No active connections" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:703 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1112 msgid "No active routing sections found." msgstr "" @@ -2671,11 +2724,11 @@ msgstr "" msgid "No Custom Rules Matched" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1042 +#: src/tachyon/tabs/diagnostic/initController.ts:1046 msgid "No diagnostic history available yet." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1600 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1890 msgid "No domains detected yet" msgstr "" @@ -2687,7 +2740,7 @@ msgstr "" msgid "No file selected" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:746 +#: src/tachyon/tabs/diagnostic/initController.ts:750 msgid "No issues found" msgstr "" @@ -2699,7 +2752,7 @@ msgstr "" msgid "No public firewall port required" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1032 +#: src/tachyon/tabs/diagnostic/initController.ts:1036 msgid "No quick fix required" msgstr "" @@ -2715,6 +2768,10 @@ msgstr "" msgid "No rules use Zapret2" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:545 +msgid "No snapshots yet" +msgstr "" + #: src/tachyon/tabs/dashboard/initController.ts:1070 msgid "Node list is empty" msgstr "" @@ -2745,9 +2802,9 @@ msgstr "" #: src/tachyon/helpers/singBoxVariant.ts:38 #: src/tachyon/helpers/singBoxVariant.ts:46 -#: src/tachyon/tabs/updates/initController.ts:1155 -#: src/tachyon/tabs/updates/initController.ts:1169 -#: src/tachyon/tabs/updates/initController.ts:1183 +#: src/tachyon/tabs/updates/initController.ts:1157 +#: src/tachyon/tabs/updates/initController.ts:1171 +#: src/tachyon/tabs/updates/initController.ts:1185 msgid "Not installed" msgstr "" @@ -2778,43 +2835,43 @@ msgstr "" msgid "Not set" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1877 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2167 msgid "Notify on Certificate Warnings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1825 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2115 msgid "Notify on Core Crashes" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1890 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2180 msgid "Notify on DNS Leaks" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1851 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2141 msgid "Notify on Server Switches" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1838 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2128 msgid "Notify on Service Restarts" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1864 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2154 msgid "Notify on Subscription Updates" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:707 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:945 msgid "Number of consecutive failed checks required before switching DNS servers." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1445 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1735 msgid "Number of consecutive failures before restarting (default 3)." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:721 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:959 msgid "Number of consecutive successful checks required before returning to a higher-priority DNS server." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1359 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1649 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:813 msgid "Ollama (Local PC / Server)" msgstr "" @@ -2857,8 +2914,8 @@ msgstr "" msgid "Only the specified servers." msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1251 -#: src/tachyon/tabs/updates/initController.ts:1290 +#: src/tachyon/tabs/updates/initController.ts:1253 +#: src/tachyon/tabs/updates/initController.ts:1292 msgid "Open" msgstr "" @@ -2870,18 +2927,26 @@ msgstr "" msgid "Open Project Page" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:455 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:574 msgid "Operation failed" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:107 -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:220 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:112 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:248 msgid "Operation in progress..." msgstr "" +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:232 +msgid "Operation log" +msgstr "" + +#: src/tachyon/methods/shell/index.ts:625 +msgid "Operation log is not available" +msgstr "" + #: src/helpers/withTimeout.ts:7 -#: src/tachyon/methods/shell/index.ts:450 -#: src/tachyon/methods/shell/index.ts:538 +#: src/tachyon/methods/shell/index.ts:451 +#: src/tachyon/methods/shell/index.ts:539 msgid "Operation timed out" msgstr "" @@ -2922,7 +2987,7 @@ msgstr "" msgid "outbounds must be a non-empty array of strings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:844 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1082 msgid "Output Network Interface" msgstr "" @@ -2934,16 +2999,12 @@ msgstr "" msgid "Overwrite existing records (if unchecked, merge with existing records)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:995 -msgid "P2P Leak Protection" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:996 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1245 msgid "P2P Client Ports" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:997 -msgid "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1233 +msgid "P2P Leak Protection" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7628 @@ -2968,15 +3029,15 @@ msgstr "" msgid "Path cannot be empty" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1243 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1521 msgid "Path must be absolute (start with /)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1252 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1530 msgid "Path must contain at least one directory (like /tmp/cache.db)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1247 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1525 msgid "Path must end with cache.db" msgstr "" @@ -3015,7 +3076,7 @@ msgstr "" msgid "Periodically check the current level and switch to a faster server even when the current one works." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1433 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1723 msgid "Periodically checks if the proxy is responding. Restarts Tachyon after consecutive failures." msgstr "" @@ -3023,7 +3084,7 @@ msgstr "" msgid "Persistent Keepalive" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1510 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1800 msgid "Persistent Smart Detect" msgstr "" @@ -3032,15 +3093,19 @@ msgstr "" msgid "Pin on dashboard" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:212 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1246 +msgid "Pin P2P isolation to the torrent client's own ports, comma separated. Each entry is \"proto\", \"proto:port\" or \"proto:port-port\" (tcp/udp). Without a port the whole protocol is routed direct." +msgstr "" + +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:217 msgid "Please wait, operation is running..." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1804 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2094 msgid "Polling Interval (seconds)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1817 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2107 msgid "Polling interval must be at least 1 second" msgstr "" @@ -3064,12 +3129,20 @@ msgstr "" msgid "Port range start must be less than or equal to end" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1274 +msgid "Port range start must not exceed its end" +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:9506 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10208 msgid "Ports" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1081 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1270 +msgid "Ports must be between 1 and 65535" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1359 msgid "Pre-download all preset lists" msgstr "" @@ -3077,11 +3150,11 @@ msgstr "" msgid "Pre-shared key" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:767 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1005 msgid "Prefer IPv4" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:769 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1007 msgid "Prefer IPv6" msgstr "" @@ -3093,7 +3166,7 @@ msgstr "" msgid "Preshared Key" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1470 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1760 msgid "Prevents multiple reload_firewall calls within 120 seconds to avoid connection drops." msgstr "" @@ -3140,15 +3213,15 @@ msgstr "" msgid "Protocol" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1444 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1734 msgid "Proxy Fail Threshold" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1438 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1728 msgid "Proxy Health Check Interval (s)" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1450 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1740 msgid "Proxy Health Check URL" msgstr "" @@ -3156,7 +3229,7 @@ msgstr "" msgid "Proxy link is unavailable" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1901 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2191 msgid "Proxy Section for Bot" msgstr "" @@ -3186,19 +3259,19 @@ msgstr "" msgid "Read error" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1271 +#: src/tachyon/tabs/updates/initController.ts:1273 msgid "Rebuilt release" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:979 +#: src/tachyon/tabs/diagnostic/initController.ts:983 msgid "Recommended Quick Fixes:" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1530 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1820 msgid "Reconnect Threshold" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1477 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1767 msgid "Records proxy/DNS latency and health status in hourly buckets for analysis." msgstr "" @@ -3218,11 +3291,11 @@ msgstr "" msgid "Regular expression must not contain spaces or commas" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1031 +#: src/tachyon/tabs/updates/initController.ts:1033 msgid "Reinstall" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:378 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:496 msgid "Reloading page in" msgstr "" @@ -3230,12 +3303,12 @@ msgstr "" msgid "Remote Hosts Lists" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:365 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:483 msgid "Removal completed successfully!" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7918 -#: src/tachyon/tabs/updates/initController.ts:987 +#: src/tachyon/tabs/updates/initController.ts:989 msgid "Remove" msgstr "" @@ -3251,11 +3324,11 @@ msgstr "" msgid "Remove the specified servers from this level." msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:111 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:116 msgid "Removing" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:125 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:130 msgid "Removing binaries & package files..." msgstr "" @@ -3269,7 +3342,7 @@ msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:389 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:424 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1300 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1578 msgid "Reset Settings" msgstr "" @@ -3317,7 +3390,16 @@ msgstr "" msgid "Restarts" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1301 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:583 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:589 +msgid "Restore" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:565 +msgid "Restore Snapshot" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1579 msgid "Restores the Tachyon factory defaults: all rules, subscriptions, custom DNS servers and other options will be lost." msgstr "" @@ -3330,11 +3412,11 @@ msgstr "" msgid "Route" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1902 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2192 msgid "Route bot API requests through this section. Leave empty to use the default mixed proxy." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:779 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1017 msgid "Route main DNS requests through the selected section." msgstr "" @@ -3410,8 +3492,8 @@ msgid "Run doctor repair" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:301 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1663 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1664 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1953 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1954 #: src/tachyon/methods/custom/getDashboardSections.ts:1567 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:581 #: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:135 @@ -3422,11 +3504,16 @@ msgstr "" msgid "Russia (ru)" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:672 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3660 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1151 msgid "Save" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1593 +msgid "Save a snapshot of the working config and restore it later if something breaks." +msgstr "" + #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:953 msgid "Save AI Watchdog Settings" msgstr "" @@ -3435,6 +3522,11 @@ msgstr "" msgid "Save Smart Detect Settings" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:644 +msgid "Save Snapshot" +msgstr "" + #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:502 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:951 #: src/tachyon/tabs/dashboard/partials/renderAdvancedSettings.ts:1091 @@ -3446,11 +3538,11 @@ msgstr "" msgid "Search" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:972 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1210 msgid "Secret key for authenticating remote access to YACD when WAN access is enabled." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1328 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1618 msgid "Secret token for authorizing WRITE operations (POST/PUT) on /cgi-bin/tachyon-agent/. Leave empty if auth is not required." msgstr "" @@ -3507,7 +3599,7 @@ msgstr "" msgid "Select a transit section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1353 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1643 msgid "Select AI LLM provider for diagnostics" msgstr "" @@ -3523,11 +3615,11 @@ msgstr "" msgid "Select an intermediate section" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1557 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1847 msgid "Select and order the sections through which blocked domains are tested. Checked sections are tried top-to-bottom." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:593 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:831 msgid "Select DNS protocol to use" msgstr "" @@ -3543,15 +3635,15 @@ msgstr "" msgid "Select or enter a User-Agent" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1226 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1504 msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1018 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1296 msgid "Select or enter the IP addresses of your game consoles." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1212 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1490 msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing" msgstr "" @@ -3560,19 +3652,19 @@ msgstr "" msgid "Select the fastest node" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1263 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1541 msgid "Select the log level for sing-box" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:797 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1035 msgid "Select the network interface from which the traffic will originate" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:845 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1083 msgid "Select the network interface to which the traffic will originate" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:908 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1146 msgid "Select the WAN interfaces to be monitored" msgstr "" @@ -3589,27 +3681,27 @@ msgstr "" msgid "Send" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1891 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2181 msgid "Send a Telegram notification if a potential DNS leak is detected." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1826 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2116 msgid "Send a Telegram notification if sing-box or nftables rules crash and get auto-restored." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1878 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2168 msgid "Send a Telegram notification if SSL/TLS certificates are close to expiration." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1839 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2129 msgid "Send a Telegram notification if the Tachyon service is restarted by the watchdog." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1852 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2142 msgid "Send a Telegram notification when a URLTest group switches to a new server." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1865 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2155 msgid "Send a Telegram notification when proxy subscriptions are successfully updated." msgstr "" @@ -3668,8 +3760,8 @@ msgstr "" msgid "Servers on dashboard" msgstr "" -#: src/tachyon/methods/shell/index.ts:401 -#: src/tachyon/methods/shell/index.ts:422 +#: src/tachyon/methods/shell/index.ts:402 +#: src/tachyon/methods/shell/index.ts:423 #: src/tachyon/tabs/diagnostic/initController.ts:605 msgid "Service action failed" msgstr "" @@ -3678,7 +3770,7 @@ msgstr "" msgid "Service list" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:581 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:819 msgid "Services & Access" msgstr "" @@ -3727,7 +3819,7 @@ msgstr "" msgid "Show servers whose names match the expression." msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:1194 +#: src/tachyon/tabs/diagnostic/initController.ts:1198 #: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:166 msgid "Show sing-box config" msgstr "" @@ -3796,6 +3888,14 @@ msgstr "" msgid "Smart Detect settings saved" msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:642 +msgid "Snapshot name" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:508 +msgid "Snapshot restored. The service restarts and the page will reload." +msgstr "" + #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8533 msgid "Snell Version" msgstr "" @@ -3822,7 +3922,7 @@ msgstr "" msgid "Source Devices" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:796 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1034 msgid "Source Network Interface" msgstr "" @@ -3879,7 +3979,7 @@ msgstr "" msgid "Start" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1645 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1935 msgid "Start bot" msgstr "" @@ -3892,7 +3992,7 @@ msgid "Start Watchdog first" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:334 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1692 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1982 msgid "Starting…" msgstr "" @@ -3905,7 +4005,7 @@ msgstr "" msgid "Stop" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1652 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1942 msgid "Stop bot" msgstr "" @@ -3918,27 +4018,27 @@ msgid "Stop Tachyon" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:307 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1669 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1959 #: src/tachyon/methods/custom/getDashboardSections.ts:1571 #: src/tachyon/tabs/dashboard/partials/renderSections.ts:585 #: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:147 msgid "Stopped" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:124 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:129 msgid "Stopping active services..." msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:348 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1706 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1996 msgid "Stopping…" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1511 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1801 msgid "Store auto-detected domains in /etc instead of /tmp to survive reboots." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1290 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1568 msgid "Strict ECH + DoQ DNS Enforcer" msgstr "" @@ -3959,8 +4059,8 @@ msgstr "" msgid "Subscription info:" msgstr "" -#: src/tachyon/methods/shell/index.ts:746 -#: src/tachyon/methods/shell/index.ts:766 +#: src/tachyon/methods/shell/index.ts:900 +#: src/tachyon/methods/shell/index.ts:920 msgid "Subscription update failed" msgstr "" @@ -4032,7 +4132,11 @@ msgstr "" msgid "Tachyon service is stopped. Start the service to display the dashboard." msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1202 +#: src/tachyon/methods/shell/index.ts:770 +msgid "Tachyon update did not complete within the timeout" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1480 msgid "Tachyon will not modify your DHCP configuration" msgstr "" @@ -4080,7 +4184,7 @@ msgstr "" msgid "Tailscale endpoint" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1764 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2054 msgid "Telegram Bot Token" msgstr "" @@ -4186,12 +4290,16 @@ msgstr "" msgid "This will erase all Tachyon settings and restore the factory defaults. The service will restart. This action cannot be undone." msgstr "" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:567 +msgid "This will replace the current Tachyon settings with the snapshot" +msgstr "" + #: src/tachyon/tabs/monitoring/initController.ts:874 #: src/tachyon/tabs/monitoring/initController.ts:930 msgid "Time" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:735 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:973 msgid "Time in seconds for DNS record caching (default: 60)" msgstr "" @@ -4212,7 +4320,7 @@ msgstr "" msgid "TLS SNI" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1773 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:2063 msgid "Token is required when the bot is enabled" msgstr "" @@ -4266,7 +4374,7 @@ msgstr "" msgid "Traffic will go through the default route (Direct/Default)." msgstr "" -#: src/tachyon/tabs/updates/initController.ts:851 +#: src/tachyon/tabs/updates/initController.ts:852 msgid "Transient connection error" msgstr "" @@ -4287,11 +4395,11 @@ msgstr "" msgid "Try compatible User-Agent profiles automatically when downloading this subscription" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:746 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:984 msgid "TTL must be a positive number" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:741 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:979 msgid "TTL value cannot be empty" msgstr "" @@ -4304,7 +4412,7 @@ msgstr "" msgid "Type" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:598 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:836 msgid "UDP (Unprotected DNS)" msgstr "" @@ -4393,7 +4501,7 @@ msgid "unknown" msgstr "" #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:328 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1686 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1976 #: src/tachyon/methods/custom/getDashboardSections.ts:1573 msgid "Unknown" msgstr "" @@ -4410,9 +4518,9 @@ msgstr "" #: src/tachyon/api.ts:40 #: src/tachyon/tabs/diagnostic/initController.ts:721 -#: src/tachyon/tabs/diagnostic/initController.ts:758 -#: src/tachyon/tabs/diagnostic/initController.ts:843 -#: src/tachyon/tabs/diagnostic/initController.ts:1159 +#: src/tachyon/tabs/diagnostic/initController.ts:762 +#: src/tachyon/tabs/diagnostic/initController.ts:847 +#: src/tachyon/tabs/diagnostic/initController.ts:1163 msgid "Unknown error" msgstr "" @@ -4424,7 +4532,7 @@ msgstr "" msgid "Unknown NFQWS2 flag." msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:131 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:136 msgid "Unpacking & installing binaries..." msgstr "" @@ -4436,11 +4544,15 @@ msgstr "" msgid "Unstable" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:917 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:684 +msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." +msgstr "" + +#: src/tachyon/tabs/updates/initController.ts:919 msgid "Update" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:366 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:484 msgid "Update completed successfully!" msgstr "" @@ -4448,11 +4560,11 @@ msgstr "" msgid "Update is available" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1258 +#: src/tachyon/tabs/updates/initController.ts:1260 msgid "Update is available for current release" msgstr "" -#: src/tachyon/tabs/updates/initController.ts:1237 +#: src/tachyon/tabs/updates/initController.ts:1239 msgid "Update is available:" msgstr "" @@ -4470,15 +4582,15 @@ msgstr "" msgid "Updated/duplicates:" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:582 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:820 msgid "Updates & Downloads" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:113 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:118 msgid "Updating" msgstr "" -#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:132 +#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:137 msgid "Updating configuration & access permissions..." msgstr "" @@ -4500,7 +4612,7 @@ msgstr "" msgid "URL must use one of the following protocols:" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1451 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1741 msgid "URL to test through the proxy (default: Cloudflare 204)." msgstr "" @@ -4535,7 +4647,7 @@ msgstr "" msgid "URLTest settings" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1490 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1780 msgid "Use 3-tier check intervals: fast (15s), normal (120s), slow (300s) instead of a single interval." msgstr "" @@ -4547,11 +4659,11 @@ msgstr "" msgid "Use sing-box duration format like 10s, 1m or 2m30s" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1045 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1067 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1074 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1105 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1133 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1323 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1345 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1352 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1383 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1411 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2377 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2637 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3160 @@ -4603,7 +4715,7 @@ msgstr "" msgid "Valid" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1497 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1787 msgid "Validates sing-box config before restart to prevent boot loops on broken configs." msgstr "" @@ -4623,7 +4735,7 @@ msgstr "" msgid "Via country.is" msgstr "" -#: src/tachyon/tabs/diagnostic/initController.ts:817 +#: src/tachyon/tabs/diagnostic/initController.ts:821 #: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:157 msgid "View logs" msgstr "" @@ -4664,11 +4776,11 @@ msgstr "" msgid "Watchdog" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1421 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1711 msgid "Watchdog Status" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1280 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1558 msgid "WebRTC Leak Protection" msgstr "" @@ -4692,7 +4804,7 @@ msgstr "" msgid "WireGuard private key from your Cloudflare WARP account" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:971 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1209 msgid "YACD Secret Key" msgstr "" @@ -4700,7 +4812,7 @@ msgstr "" msgid "Yes" msgstr "" -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:835 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1073 msgid "You can select Output Network Interface, by default autodetect" msgstr "" @@ -4759,69 +4871,3 @@ msgstr "" #: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:107 msgid "Zapret2 sing-box outbound is not configured" msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465 -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:644 -msgid "Save Snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:642 -msgid "Snapshot name" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1592 -msgid "Config Snapshots" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:1593 -msgid "Save a snapshot of the working config and restore it later if something breaks." -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:646 -msgid "Give the snapshot a name. It is saved with the current date and can be restored from this list later." -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:545 -msgid "No snapshots yet" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:630 -msgid "Failed to load snapshots" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:669 -msgid "Failed to save snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:527 -msgid "Failed to delete snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:516 -msgid "Failed to restore snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:565 -msgid "Restore Snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:597 -msgid "Delete Snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:567 -msgid "This will replace the current Tachyon settings with the snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:599 -msgid "Delete the snapshot" -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:684 -msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." -msgstr "" - -#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:508 -msgid "Snapshot restored. The service restarts and the page will reload." -msgstr "" - diff --git a/tachyon/files/usr/bin/tachyon b/tachyon/files/usr/bin/tachyon index 78fc6735..c6ba235d 100755 --- a/tachyon/files/usr/bin/tachyon +++ b/tachyon/files/usr/bin/tachyon @@ -125,6 +125,8 @@ function show_help() { print(" component_action Manage Tachyon, sing-box, zapret, zapret2, and ByeDPI components\n"); print(" component_action_async Start a component action in the background\n"); print(" component_action_status Get background component action status\n"); + print(" component_action_log [job_id] [offset]\n"); + print(" Get background component action log from offset\n"); print(" component_updates_if_due Check installed components for updates when due\n"); print(" component_update_check_cache Get cached component update check results\n"); print(" hosts_list_update [url] Update custom hosts lists (all or specific URL)\n"); @@ -218,6 +220,7 @@ function command_spec(command) { component_action: [ "components/action.uc", "component-action", 2 ], component_action_async: [ "components/updates.uc", "component-action-async", 2 ], component_action_status: [ "components/updates.uc", "component-action-status", 1 ], + component_action_log: [ "components/updates.uc", "component-action-log", 2 ], component_updates_if_due: [ "components/updates.uc", "component-updates-if-due", 0 ], component_update_check_cache: [ "components/updates.uc", "component-update-check-cache", 0 ], hosts_list_update: [ "components/hosts.uc", "list-update", 1 ], diff --git a/tachyon/files/usr/lib/components/action.uc b/tachyon/files/usr/lib/components/action.uc index f7f0a31d..509f23a3 100644 --- a/tachyon/files/usr/lib/components/action.uc +++ b/tachyon/files/usr/lib/components/action.uc @@ -172,8 +172,26 @@ function log_message(message, level) { command_success_from_args([ "logger", "-t", "tachyon", "[" + level + "] " + as_string(message) ]); } +function job_log_time() { + let seconds = int(clock()[0]); + return sprintf("%02d:%02d:%02d", int(seconds / 3600) % 24, int(seconds / 60) % 60, seconds % 60); +} + +function job_log_append(message, level) { + let path = getenv("UPDATES_JOB_LOG"); + if (path == "") + return; + let file = fs.open(path, "a"); + if (!file) + return; + file.write(sprintf("[%s] [%s] %s\n", job_log_time(), as_string(level), as_string(message))); + file.close(); +} + function updates_log(message, level) { - log_message("Updates: " + as_string(message), level || "info"); + level = as_string(level || "info"); + log_message("Updates: " + as_string(message), level); + job_log_append(message, level); } function module_command(args) { diff --git a/tachyon/files/usr/lib/components/updates.uc b/tachyon/files/usr/lib/components/updates.uc index 7ba8ee65..864ef03b 100644 --- a/tachyon/files/usr/lib/components/updates.uc +++ b/tachyon/files/usr/lib/components/updates.uc @@ -1587,6 +1587,10 @@ function component_job_output_path(job_id) { return COMPONENT_JOB_DIR + "/" + as_string(job_id) + ".out"; } +function component_job_log_path(job_id) { + return COMPONENT_JOB_DIR + "/" + as_string(job_id) + ".log"; +} + function component_job_output_path_from_state(path) { path = as_string(path); if (length(path) >= 5 && substr(path, length(path) - 5) == ".json") @@ -1692,6 +1696,14 @@ function component_cleanup_jobs() { "-mmin", "+" + as_string(COMPONENT_JOB_ORPHAN_OUTPUT_TTL_MINUTES), "-delete" ]); + command_success_from_args([ + "find", + COMPONENT_JOB_DIR, + "-type", "f", + "-name", "*.log", + "-mmin", "+" + as_string(COMPONENT_JOB_ORPHAN_OUTPUT_TTL_MINUTES), + "-delete" + ]); command_success_from_args([ "find", COMPONENT_JOB_DIR, @@ -1849,7 +1861,9 @@ function component_action_worker(state_file, output_file, component, action) { // the JSON result - the whole-file parse then failed, the line scan found no // object, and a successful action was reported to the UI as "Failed to // execute" with the tail of a log as its message. - let command = command_env(component_worker_env()) + " " + + let worker_env = component_worker_env(); + worker_env.UPDATES_JOB_LOG = output_file + ".log"; + let command = command_env(worker_env) + " " + command_from_args([ "ucode", "-L", LIB_DIR, @@ -1879,7 +1893,9 @@ function component_action_async(component, action) { exit(1); } - if (!write_state_file(state_file, component_running_job_state_value(component, action, now_seconds()))) { + let running_state = component_running_job_state_value(component, action, now_seconds()); + running_state.log_path = component_job_log_path(job_id); + if (!write_state_file(state_file, running_state)) { component_job_json_response(false, "", "Failed to write component action state"); exit(1); } @@ -1918,6 +1934,24 @@ function component_action_status(job_id) { print(as_string(fs.readfile(state_file))); } +function component_action_log(job_id, offset) { + let log_path = component_job_log_path(job_id); + let data = fs.readfile(log_path); + if (data == null) { + write_json({ success: false, log: "", offset: 0 }); + exit(1); + } + + let start = int(offset || 0); + if (start < 0) + start = 0; + data = as_string(data); + if (start > length(data)) + start = length(data); + + write_json({ success: true, log: substr(data, start), offset: length(data) }); +} + function automatic_component_check_names() { let result = [ "tachyon" ]; @@ -3300,6 +3334,8 @@ else if (mode == "component-action-async") component_action_async(ARGV[1], ARGV[2]); else if (mode == "component-action-status") component_action_status(ARGV[1]); +else if (mode == "component-action-log") + component_action_log(ARGV[1], ARGV[2]); else if (mode == "component-updates-if-due") component_updates_if_due(); else if (mode == "component-update-check-cache") diff --git a/tests/component_action_log.sh b/tests/component_action_log.sh new file mode 100644 index 00000000..18fce819 --- /dev/null +++ b/tests/component_action_log.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash +set -eo pipefail + +# The UI shows a live log of a running component action. The worker's progress +# messages used to go to syslog only, so the modal had nothing real to display +# and faked its steps on a timer. The contract: the worker appends every +# progress line to .log (UPDATES_JOB_LOG), the running state advertises the +# path, the log outlives the job (only the age-based sweep removes it), and the +# component-action-log CLI mode serves it from an arbitrary byte offset. + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +UPDATES_UC="$ROOT_DIR/tachyon/files/usr/lib/components/updates.uc" +ACTION_UC="$ROOT_DIR/tachyon/files/usr/lib/components/action.uc" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" + +fail() { + printf 'FAIL: %s\n' "$1" >&2 + exit 1 +} + +code_only() { + sed 's://.*::' +} + +# The worker must hand the action module a dedicated log file path. +worker="$(sed -n '/^function component_action_worker/,/^}/p' "$UPDATES_UC" | code_only)" +[ -n "$worker" ] || fail "components/updates.uc must define component_action_worker" +grep -Fq 'UPDATES_JOB_LOG' <<<"$worker" || + fail "component_action_worker must set UPDATES_JOB_LOG for the action module" +grep -Eq 'UPDATES_JOB_LOG[^=]*=\s*.*\.log' <<<"$worker" || + fail "component_action_worker must point UPDATES_JOB_LOG at a .log file" + +# The log path must be derived from the job id, the same way the .out file is. +grep -Fq 'function component_job_log_path' "$UPDATES_UC" || + fail "components/updates.uc must define component_job_log_path" +grep -Fq '.log' "$UPDATES_UC" || + fail "component_job_log_path must produce a .log path" + +# The running state must carry the log path so the UI can find the file. +grep -Fq 'log_path' "$UPDATES_UC" || + fail "the component job state must expose log_path" + +# finish_component_job removes the result channel and stderr, but the log is the +# UI's evidence of what happened: it must survive until the TTL sweep. +finish="$(sed -n '/^function finish_component_job/,/^}/p' "$UPDATES_UC" | code_only)" +[ -n "$finish" ] || fail "components/updates.uc must define finish_component_job" +grep -Fq 'remove_file(output_file + ".stderr")' <<<"$finish" || + fail "finish_component_job must still remove the .stderr file" +if grep -Fq '"log"' <<<"$finish"; then + fail "finish_component_job must not remove the job .log file" +fi + +# Only the age-based orphan sweep may drop .log files. +grep -Fq '"*.log"' "$UPDATES_UC" || + fail "the age-based orphan cleanup must cover *.log" + +# The progress line must reach both syslog and the job log file. +updates_log="$(sed -n '/^function updates_log/,/^}/p' "$ACTION_UC" | code_only)" +[ -n "$updates_log" ] || fail "components/action.uc must define updates_log" +grep -Fq 'log_message(' <<<"$updates_log" || + fail "updates_log must keep writing to syslog" +grep -Fq 'job_log_append(' <<<"$updates_log" || + fail "updates_log must append to the job log file" +grep -Fq 'getenv("UPDATES_JOB_LOG")' "$ACTION_UC" || + fail "action.uc must read the UPDATES_JOB_LOG env var" + +# The CLI must expose the log mode. +grep -Fq 'component_action_log' "$TACHYON_BIN" || + fail "/usr/bin/tachyon must declare component_action_log" + +# --- behavioural: offset reads, clamping, missing file ----------------------- + +if command -v ucode >/dev/null 2>&1; then + WORK_DIR="$(mktemp -d)" + trap 'rm -rf "$WORK_DIR"' EXIT + + mkdir -p "$WORK_DIR/jobs" + printf 'line1\nline2\nline3\n' >"$WORK_DIR/jobs/abc-1_2.log" + + run_log() { + UPDATES_JOB_DIR="$WORK_DIR/jobs" \ + ucode -L "$ROOT_DIR/tachyon/files/usr/lib" \ + "$UPDATES_UC" component-action-log "$@" + } + + full="$(run_log abc-1_2 0)" + grep -Fq '"success": true' <<<"$full" || + fail "component-action-log must report success for an existing log: $full" + grep -Fq '"log": "line1\nline2\nline3\n"' <<<"$full" || + fail "component-action-log offset 0 must return the whole file: $full" + grep -Fq '"offset": 18' <<<"$full" || + fail "component-action-log must report the total byte length: $full" + + tail="$(run_log abc-1_2 12)" + grep -Fq '"log": "line3\n"' <<<"$tail" || + fail "component-action-log must read from the requested byte offset: $tail" + grep -Fq '"offset": 18' <<<"$tail" || + fail "component-action-log must report the new offset after a partial read: $tail" + + clamped="$(run_log abc-1_2 999)" + grep -Fq '"log": ""' <<<"$clamped" || + fail "component-action-log must clamp an offset past the end of the file: $clamped" + grep -Fq '"offset": 18' <<<"$clamped" || + fail "component-action-log must clamp the reported offset to the file length: $clamped" + + set +e + missing="$(run_log nope 0 2>/dev/null)" + status=$? + set -e + [ "$status" -ne 0 ] || fail "component-action-log must exit non-zero for a missing log file" + grep -Fq '"success": false' <<<"$missing" || + fail "component-action-log must report failure for a missing log file: $missing" +fi + +printf 'component action log checks passed\n'