Commit Graph
100 Commits
Author SHA1 Message Date
Dushnilin e4e2d19c6d fix(runtime): устранение сбоев запуска sing-box, исправление правил nftables и защита от гонок вочдога
- Восстановление кэша правил: восстановление .srs, .lst, .json файлов из постоянного каталога /etc/tachyon/rulesets/ при старте; защита от удаления кэша при остановке; добавление фоллбэка пустых ruleset в runtime.uc перед валидацией
- nftables: удаление невалидного auto-merge для интервальных составных сетов (ipv4_addr/ipv6_addr . inet_service)
- core/ip: исправление нормализации IPv6-адреса и порта для TPROXY без дублирования скобок
- dns block: исправление возвращаемого статуса nft_add_dns_block_rules_from_schedules при отсутствии правил блокировки
- watchdog & lifecycle: добавление флага блокировки /var/run/tachyon/starting для исключения сброса правил вочдогом во время старта
- ui & i18n: форматирование бейджей устройств в родительском контроле и обновление переводов
2026-08-21 08:52:23 +03:00
Dushnilin adf5c7a22f i18n: добавить русские переводы для content blocking и telegram diagnose 2026-08-21 07:50:11 +03:00
Dushnilin bd083cc5d3 feat: content blocking в родительском контроле (блокировка доменов на устройство)
Новые опции config schedule:
- blocked_domains: домены для блокировки (full:/keyword:/regex: префиксы)
- mode: block (список) | allow (whitelist — всё кроме списка)
- dns_level: блокировка на DNS-уровне (NXDOMAIN через dns-block-in)
- notify: уведомление в Telegram при попытке доступа

Механизм:
- sing-box: новый dns-block-in inbound (127.0.0.43:1053) с reject-правилами
  для заблокированных доменов; source_ip_cidr для IP-устройств;
  invert для whitelist-режима
- nftables: nat chain dns_block — REDIRECT DNS-запросов устройств на
  dns-block-in; time-based через meta hour для расписаний; MAC-устройства
  матчатся по ether saddr (DHCP-динамические IP поддерживаются)
- route rules reject для always-on расписаний (fallback при обходе DNS)
- telegram worker: проверка nft counters каждые 60s, уведомление о
  заблокированной активности

UI (parental.js):
- колонка Blocked Sites в таблице
- textarea с пресетами: соцсети, видео, игры, взрослый контент,
  мессенджеры, магазины
- mode / dns_level / notify переключатели

Валидация: домены, mode, dns_level, notify в validator.uc
Тесты: tests/content_blocking.sh (98/98 backend, 522/522 frontend)
2026-08-21 05:11:39 +03:00
Dushnilin 7084b9ba3d chore: sync localization catalogs after telegram_diagnose strings 2026-08-20 22:28:27 +03:00
Dushnilin 83e1a82e71 feat: add telegram_diagnose backend command and connection test button
Backend: telegram_diagnose returns JSON with 8 checks (token, admin_ids,
sing-box, port, DNS with FakeIP support, direct API, proxy API, send
test message). Registered in CLI dispatcher.

Frontend: Test Connection button in Telegram settings calls
telegram_diagnose and renders results with check/cross icons.

DNS check accepts sing-box FakeIP range (198.18.x.x/198.19.x.x).
2026-08-20 22:17:09 +03:00
Dushnilin 66ffb50a1a feat: add Telegram API connection test button to settings
Runs 7-step diagnostic: token check, sing-box running, port 4534
listening, DNS resolution, direct IPv4 API, proxy API, send test
message. Shows green/red indicators with actionable advice for each.
2026-08-20 21:56:12 +03:00
Dushnilin d6df03e1f2 fix: prevent double update modal after Tachyon self-update page reload
After a self-update completes and the page reloads, the state watcher
finds the old action and opens a second modal. Save the job_id to
sessionStorage before reload, and restore it into handledComponentJobs
on page load so the watcher skips it.
2026-08-20 20:00:39 +03:00
Dushnilin b53b93786a chore: sync locales after adding enable_rag and warp_proxy_section 2026-08-20 19:48:24 +03:00
Dushnilin 2a87db172b fix: add missing enable_rag and warp_proxy_section to LuCI settings form
The custom renderAdvancedSettings panel was never connected to the UI.
Added enable_rag checkbox to AI tab and warp_proxy_section dropdown
to Advanced tab in the standard LuCI settings.js form.

Also fixed warp_proxy_section load function to use map data instead of
uci.sections() which returns an array (for...in iterated indices).

Added Russian translations for new strings.
2026-08-20 19:39:39 +03:00
Dushnilin a9790f5638 fix: remove premature version check during tachyon self-update
The version-based early exit in waitComponentActionJob fired while
the state file still showed running: true and RPC was healthy. This
caused the frontend to declare install complete while the backend
was still restarting services, triggering a page reload before the
install finished.

Now version detection only fires when RPC fails (backend unreachable)
or when state is done with success=false. Normal installs always wait
for the state file to confirm completion.
2026-08-20 17:39:36 +03:00
Dushnilin 364b79ee27 fix: loop unknown inbound field stripping in sing-box config check
The graceful degradation for unknown sing-box inbound fields (e.g.
prefer_ip, tolerate_time_skewness) only retried once. When an older
sing-box version doesn't support multiple new fields, the first
unknown field gets stripped and the retry fails on the second one.

Now loops the check-strip-retry cycle until either:
- sing-box check passes
- no more unknown inbound fields are detected
- no stripping occurred (break to avoid infinite loop)

Fixes: 'Generated sing-box configuration is invalid: inbounds[8].
tolerate_time_skewness: json: unknown field' on older sing-box versions.
2026-08-20 13:57:11 +03:00
Dushnilin c6104289c7 fix: WARP generator proxy-first mode + helpful error message
call_api():
- If warp_proxy_section is set: try proxy FIRST, skip direct entirely
  (saves 32s when CF API is only reachable via tunnel)
- If no section: try direct first, then fallback to proxy (as before)
- Error hint: 'Cloudflare API may be blocked on WAN. Try setting
  warp_proxy_section in Advanced Settings to route through a tunnel.'

Addresses GitHub issue #39 requirements:
- Section/outbound selection for WARP registration: DONE
- No hardcoded Clash API IP: DONE
- Quick fail on dead WAN IPs: DONE (proxy-first mode)
- Helpful error message: DONE
2026-08-20 10:58:41 +03:00
Dushnilin 162171e692 fix: remove hardcoded 192.168.2.1, add WARP proxy section, simplify dashboard
warp_generator.uc:
- Replace hardcoded 192.168.2.1:9090 with dynamic Clash API URL
  (reads /etc/sing-box/config.json external_controller)
- Add warp_proxy_section UCI option for registration proxy routing
- Reduce curl timeouts: connect 3s, max 8s (was 6s/12s)
- Only try socks5 proxy if it's actually reachable (2s probe)
- Total worst-case: 4 direct attempts (32s) vs old 8 attempts (96s)

renderSections.ts:
- Revert connection node display from latency numbers to simple
  'Connected' / 'Not connected' (user: 'какой нахуй там пинг')

renderAdvancedSettings.ts:
- Add WARP Proxy Section text input (UCI: warp_proxy_section)
- Section name for WARP registration proxy routing

UCI config:
- Add warp_proxy_section option (commented out by default)

623 tests pass
2026-08-20 10:51:12 +03:00
Dushnilin 421a4fd796 feat: add RAG (Retrieval-Augmented Generation) for AI Doctor
New files:
- tools/rag_build_index.sh: build-time ingestion pipeline
  Chunks docs/knowledge-base/*.md into 2000-char chunks with 200-char overlap
  Produces rag_index.json (39 chunks, ~74KB) for runtime embedding
- tachyon/files/usr/lib/diagnostics/rag.uc: runtime RAG module
  Embeds chunks via same LLM provider API (OpenAI-compatible /v1/embeddings)
  Cosine similarity search, top-3 retrieval, 24h cache in /tmp
  Graceful fallback if embedding API unavailable
- tachyon/files/usr/lib/tachyon/rag_index.json: pre-built chunk index

Modified files:
- runtime.uc: integrated RAG into ai_doctor() function
  Retrieves relevant docs based on user query or diagnostic context
  Injects 'Relevant Documentation' section into LLM prompt
- renderAdvancedSettings.ts: added 'Enable RAG' toggle in AI Doctor settings
- tachyon config: added enable_rag option (default '1')
- build.sh: added rag_build_index.sh step

Architecture:
- Provider-agnostic: uses same API key/provider as LLM for embeddings
- Embedding model: text-embedding-3-small (OpenAI), nomic-embed-text (Ollama),
  local-model (LMStudio), deepseek-embedding (DeepSeek)
- Cache: embeddings cached in /tmp/tachyon_rag_embeddings.json (24h TTL)
- Fallback: if embedding fails, AI Doctor works without RAG (as before)
- 39 chunks from 14 docs, ~66K chars, cosine search <1ms

623 tests pass (101 backend + 522 frontend)
2026-08-20 10:27:56 +03:00
Dushnilin 1137e96b0d de-AI phase 3: inline redundant variables and null checks
TypeScript:
- getDashboardSections.ts: value === undefined || value === null -> value == null
- renderAdvancedSettings.ts: remove redundant Boolean() on boolean

ucode (10 inlined variables):
- helpers.uc: inline trailing_dot
- runtime.uc: inline ping_ok, enable_watchdog
- nft/apply.uc: inline rtmtu_ok, qos_enabled
- byedpi/runtime.uc: inline matched
- api.uc: inline deleted, added
- subscription.uc: inline has_source_markers
- watchdog.uc: inline is_healthy

522 frontend tests pass
2026-08-19 22:38:26 +03:00
Dushnilin 4094a41b5d de-AI: remove AI comments and boolean theater across TypeScript + ucode 2026-08-19 18:15:35 +03:00
Dushnilin 0964b79171 fix(ai-chat): fix AI Chat and Assistant to work with LM Studio
- Fix response parsing: check report field, not just message
- Pass user query text to LLM instead of ignoring it
- Append user question to diagnostic prompt with system context
- Increase timeout to 120s for LM Studio responses
- Add command_status_from_args to core/common.uc exports

Closes #38
2026-08-19 15:57:42 +03:00
Dushnilin a161ae4845 feat(subscription): добавлена поддержка пользовательских заголовков устройства и генератор HWID 2026-08-18 14:40:25 +03:00
Dushnilin bc10fff538 fix(i18n): синхронизировать fe-app и luci-app каталоги русской локализации 2026-08-18 14:25:45 +03:00
Dushnilin 3fb6a4b643 fix(nft): разрешать TPROXY-трафик с меткой в цепочке input fw4 для работы в изолированных зонах (Guest/VLAN) 2026-08-18 14:22:38 +03:00
Dushnilin 5fc9dda229 fix(i18n): fix corrupted Bad WAN Russian translation string 2026-08-18 12:55:14 +03:00
Dushnilin e325ac0092 feat(settings): add manual list update button to LuCI settings tab 2026-08-18 12:54:21 +03:00
Dushnilin 49dab2b8b9 fix(singbox): включать inet6_range в fakeip при prefer_ipv6, ipv6_only или ipv6_enabled 2026-08-18 08:09:52 +03:00
Dushnilin fe74578158 fix(singbox): добавлять inet6_range в fakeip только при включенном ipv6_enabled 2026-08-18 08:00:22 +03:00
Dushnilin fe0099a32a fix(singbox): использовать password вместо secret в объектах пользователей inbounds и расширить fallback неизвестных полей 2026-08-18 07:36:03 +03:00
Dushnilin 6a5ae8e692 fix(validator): исправить вызов valid_ip_or_cidr в validate_schedule 2026-08-18 07:02:41 +03:00
Dushnilin e695da1fb7 feat(parental): добавить поддержку фильтрации как по IP, так и по MAC-адресам 2026-08-17 21:52:28 +03:00
Dushnilin 7a9c87622e fix(parental): исправить рендеринг ячеек таблицы через cfgvalue/textvalue в form.DummyValue 2026-08-17 21:42:48 +03:00
Dushnilin d034c78b20 fix(nft): удалить конфликтную цепочку dstnat и предотвратить дублирование правил fw4 forward 2026-08-17 21:27:19 +03:00
Dushnilin fa9d294991 fix(dns): использовать полноценный рестарт dnsmasq при применении настроек 2026-08-17 21:11:19 +03:00
Dushnilin a4bb9d060d fix(watchdog): исправить вызов json-парсера в probe_wan 2026-08-17 21:09:22 +03:00
Dushnilin 6324d001cf ci: добавить allowUpdates в action-gh-release для корректного перевыпуска релизов 2026-08-17 20:52:28 +03:00
Dushnilin 47b10d8932 ci: убрать кастомный codeql.yml в пользу стандартного сканирования 2026-08-17 20:45:13 +03:00
Dushnilin 5f143f92dc ci: добавить явный CodeQL workflow для JavaScript/TypeScript 2026-08-17 20:42:26 +03:00
Dushnilin b435d965ed fix(parental): исправление отображения HTML-тегов в таблице и кнопок действий 2026-08-17 20:38:16 +03:00
Dushnilin 1f116e571d feat: родительский контроль по расписанию, мультивыбор секций, перехват DNS и обновление локализации (1.2.86) 2026-08-17 20:34:42 +03:00
Dushnilin c35380200f fix(tailscale, ai): исправить скрытие полей Tailscale-сервера и добавить готовый пресет провайдера OpenRouter 2026-08-17 11:18:36 +03:00
Dushnilin bca948947e fix(updates): предотвратить повторные модальные окна и добавить активную проверку готовности сервисов роутера перед перезагрузкой страницы 2026-08-17 10:27:16 +03:00
Dushnilin beb132690e fix(server): добавить валидатор validatePositiveInteger для полей MTU и Keepalive сервера AWG 2026-08-16 20:35:23 +03:00
Dushnilin 9b5707982c feat(servers): полная поддержка генератора конфигураций AmneziaWG, QR-кода, скачивания .conf и расширенных настроек сервера 2026-08-16 19:37:14 +03:00
Dushnilin 1062982070 fix(ui): отображение всех условий маршрутизации (списки сообщества, IP, устройства, порты) для секций AWG, WARP и расширенных прокси 2026-08-16 17:50:58 +03:00
Dushnilin 5adda4bba7 fix(i18n,watchdog): полная актуализация русской локализации интерфейса и исправление детекции WAN в Watchdog 2026-08-16 16:01:37 +03:00
Dushnilin 61b34bb949 feat(diagnostics): автоматическая загрузка и обновление профилей сервисов из репозитория с зеркалами и правами доступа 2026-08-16 15:07:07 +03:00
Dushnilin 18be28ec03 fix(singbox): исправление генерации inbound для сервера AWG и диагностических проверок сервисов 2026-08-16 14:34:23 +03:00
Dushnilin a323d8c45f fix(tests): устранение SIGPIPE broken pipe при проверках пайплайнов под set -eo pipefail 2026-08-16 14:24:49 +03:00
Dushnilin fc45498a8b feat(singbox): поддержка составных длительностей и автоподнятие urltest idle_timeout, зеркала gh-proxy в README и расширение Knowledge Base 2026-08-16 10:56:27 +03:00
Dushnilin 7b215e5792 feat(uninstall): скрипт чистого удаления uninstall.sh с сохранением бэкапа конфигурации и документация 2026-08-15 21:31:56 +03:00
Dushnilin b1c336ccad docs(readme): единая визуальная система Tachyon с анимированными баннерами для Telegram-бота, Watchdog, LuCI UI, CLI API и футера 2026-08-15 20:33:15 +03:00
Dushnilin 954596c26f docs(readme): анимированные лазерные разделители разделов, ЭКГ-монитор AI Doctor и интерактивный терминал установки 2026-08-15 20:30:11 +03:00
Dushnilin 9280708363 fix(svg): исправление фильтров userSpaceOnUse для горизонтальных линий потоков Zapret v2 и LAN 2026-08-15 20:29:27 +03:00
Dushnilin 983c81b1e1 docs(readme): раздельные анимированные каналы для Zapret v1, Zapret v2 и ByeDPI в диаграмме архитектуры 2026-08-15 20:28:52 +03:00
Dushnilin d4121b191b docs(readme): анимированный SVG hero-баннер и диаграмма архитектуры, актуализация возможностей AI Doctor v2.5 и аварийного восстановления 2026-08-15 20:28:10 +03:00
Dushnilin 91c7d5f8ee fix(updates): стабильный диалог установки, сохранение баннеров и логов без паразитных автозакрытий 2026-08-15 20:07:21 +03:00
Dushnilin d2a4243aa2 feat(ui): постоянная кнопка аварийного возврата прямого интернета в окне AI Doctor и действиях диагностики 2026-08-15 19:24:44 +03:00
Dushnilin 528bc7b9db feat(doctor): расширенная офлайн-диагностика (NTP, conntrack, deadlock, MTU) и аварийный возврат интернета 2026-08-15 17:18:23 +03:00
Dushnilin 56e847eceb fix(ui): корректный выбор сервера в модальных окнах и скрытие недоступного выбора для URLTest 2026-08-15 16:18:34 +03:00
Dushnilin 3425ef77f7 fix(core): восстановление дефолта hide_urltest_group_outbounds и ассертов urltest_groups 2026-08-15 16:07:54 +03:00
Dushnilin 4dd882f276 fix(core): объявление default_gateway_exists до wan_has_ip и видимость URLTest по умолчанию 2026-08-15 16:06:22 +03:00
Dushnilin e02e9169d4 fix(core): исправление forward-reference в AI Doctor и фильтрации селектора 2026-08-15 16:02:31 +03:00
Dushnilin 85ae733787 feat(doctor): расширенная локальная диагностика DPI, нод, конфликтов и фикс зависимостей CI 2026-08-15 15:58:40 +03:00
Dushnilin 1437997153 fix(core): повышение стабильности, фоновый поиск MTU AWG, zero-fork проверка WAN и защита от OOM 2026-08-15 15:51:10 +03:00
Dushnilin 381ae6580c fix(dashboard): fix URLTest details modal layout and server selection actions 2026-08-15 13:27:06 +03:00
Dushnilin 95a209adc9 feat(dashboard): show active server on URLTest cards and allow manual server selection with reset to auto 2026-08-15 13:00:39 +03:00
Dushnilin d81d9fd077 fix(ci): fix forward function declaration in runtime.uc and harden tests for multi-call coreutils/alpine 2026-08-15 12:28:49 +03:00
Dushnilin e0828eb53a fix(diagnostics): fix false-positive sing-box DNS check on busybox nslookup and auto-fetch LAN clients in support report 2026-08-15 12:12:59 +03:00
Dushnilin 3c5108b26b fix(i18n): translate all AI Doctor and LAN inspector strings to Russian and fix diagnostic banner status logic 2026-08-15 12:00:28 +03:00
Dushnilin 2bafb334c0 chore: trigger fresh package rebuild for release 1.2.82 2026-08-15 11:44:19 +03:00
Dushnilin 01cb9e8285 fix(updates): auto-complete modal and trigger reload when Tachyon update finishes in log 2026-08-15 11:17:54 +03:00
Dushnilin 7ff42e61c7 fix(nft): add meta l4proto tcp/udp restriction to priority proxy IP rules to avoid ICMP/ping drops 2026-08-15 11:09:46 +03:00
Dushnilin 6fdf24723e fix(diagnostics): use core.uci for WAN interface detection instead of shell uci 2026-08-15 10:58:20 +03:00
Dushnilin 57c04c71e8 feat(doctor): add 1-click anonymized support report and LAN device inspector 2026-08-15 10:05:09 +03:00
Dushnilin 315cf63238 Сделать интерфейс ИИ-Доктора нативным и лаконичным по стандартам LuCI 2026-08-15 09:49:43 +03:00
Dushnilin c8d02a917e Улучшение ИИ-Доктора: экспертная скриптовая система диагностики и самовосстановления 2026-08-15 09:48:40 +03:00
Dushnilin 1e406c3e06 fix(updates): предотвратить повторное открытие и зависание модального окна обновления
- Исключить повторное открытие окна прогресса для уже завершенных задач (handledComponentJobs)

- Актуализировать состояние фоновых задач в get_ui_state и нормализовать таймаут stale PID

- Исправить определение WAN интерфейса в event_controller во избежание ложного перезапуска (#31)

- Улучшить сверку версий при самообновлении
2026-08-15 09:23:07 +03:00
Dushnilin d6c4f81daf Revert "refactor(ui): диагностика и AI-чат на нативных LuCI CSS классах"
This reverts commit e1c6a9aba8.
2026-08-14 21:52:55 +03:00
Dushnilin e1c6a9aba8 refactor(ui): диагностика и AI-чат на нативных LuCI CSS классах 2026-08-14 17:30:45 +03:00
Dushnilin b9c0f72518 fix(doctor): вернуть require core.common и порядок функций в runtime.uc 2026-08-14 17:30:39 +03:00
Dushnilin 7ef5d542fd feat(mcp): MCP-сервер с 13 tools и 6 resources + команда tachyon mcp 2026-08-14 17:30:34 +03:00
Dushnilin 455c67c0a7 fix(diagnostic): install servicecheck_profiles.json + guard doctor/ai_doctor (#33)
Makefile was missing the install rule for servicecheck_profiles.json — the community service probe profiles were never copied to /usr/share/tachyon/ on the router, so Service Health Check had zero targets to probe and showed an empty modal.
2026-08-14 16:06:48 +03:00
Dushnilin 4cd4fe6193 fix: operation log path mismatch + AmneziaWG server support (#32)
fix(updates): component_action_worker wrote UPDATES_JOB_LOG to job_id.out.log but component_action_log reads from job_id.log — the two paths never matched so the modal log was always empty. Now derives the log path from the output path by stripping the .out suffix.
2026-08-14 15:52:40 +03:00
Dushnilin af541bc4bd fix(updates): log as primary modal content + fix ru.po regression
The progress modal showed fake step indicators that auto-advanced on a timer, hiding the real operation log behind a small panel. Now the modal is just header + full-size log (350px) + action buttons. Steps, progress bar, and status message removed; updateStep/updateStatus become no-ops.\n\ngenerate-po.js silently dropped every ru.po entry not present in calls.json, wiping ~100 manual translations. It now preserves existing entries. All empty msgstr filled (operation log, port validation, restore).\n\nStyles: removed step/progress bar CSS, enlarged log panel, modal max-width 640px.
2026-08-14 14:46:51 +03:00
Dushnilin 8ecc3ee685 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 <job>.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).
2026-08-14 13:20:33 +03:00
Dushnilin 5d8e0bbfcc fix(smart-detect): маршрутизировать user_domains через прокси секции 2026-08-14 12:39:42 +03:00
Dushnilin f91a99f8e1 chore: удалить мусорный uc.out от локального ucode 2026-08-14 11:48:35 +03:00
Dushnilin 478b99170c fix(snapshots): починка restore и валидации снапшотов под реальным ucode 2026-08-14 11:48:27 +03:00
Dushnilin 85ce7f98c7 feat(snapshots): сохранение и восстановление рабочих конфигов из расширенных настроек 2026-08-14 11:36:48 +03:00
Dushnilin 18bd271bef fix(tests): keep stale-pid test alive when a parallel job wipes /tmp/tmp.* dirs 2026-08-14 10:52:57 +03:00
Dushnilin 5be411994c fix(migration): declare write_cache_format_file before ensure_runtime_cache_format (no hoisting in ucode) 2026-08-14 10:41:00 +03:00
Dushnilin 464dcebc50 fix(ci): harden stale-pid test and cache format writes against parallel test races 2026-08-14 10:37:27 +03:00
Dushnilin 65b216b6a2 feat(p2p): поле портов торрент-клиента для изоляции P2P (issue #31) 2026-08-14 09:46:15 +03:00
Dushnilin 7bd373c392 fix(diagnostics): убрать крокозябры в Глобальной проверке и разорвать цикл повторных фиксов AI Doctor (issue #31) 2026-08-14 09:31:31 +03:00
Dushnilin 2f6941b102 fix(updates): не вешать окно обновления при неизменной версии и мёртвом RPC (issue #31) 2026-08-13 23:11:44 +03:00
Dushnilin 4bc68d7e8e fix(build): пересобрать main.js с фиксом завершения self-update (issue #31) 2026-08-13 22:51:56 +03:00
Dushnilin c1a21ef97b fix(updates): корректно завершать self-update при переиспользовании pid воркера (issue #31) 2026-08-13 22:44:06 +03:00
Dushnilin 25c9160b38 fix(watchdog): не проверять прокси без http/mixed-инбаунда (issue #31) 2026-08-13 22:44:03 +03:00
Dushnilin b099b26a68 feat(doctor): режим восстановления при остановленном сервисе и реальная верификация AI Doctor 2026-08-13 21:59:54 +03:00
Dushnilin ac3fbc90fc fix(watchdog): не перезапускать WAN по одиночному сбою пробы (issue #31) 2026-08-13 21:24:43 +03:00
Dushnilin 305e14d44e feat(reset): кнопка сброса настроек в LuCI и дефолтное состояние при чистой установке
- новый модуль service/reset.uc (режим reset-settings, флаг no-start): остановка сервиса, чистка runtime/кэшей, сохранение tailscale, запись дефолтного конфига
2026-08-13 21:06:39 +03:00
Dushnilin 9b4767a5af fix(tests): убрать повторную декларацию seen_domains и добавить ключ локализации 2026-08-13 09:07:55 +03:00
Dushnilin 4f9bf7153d fix(subscription): использовать синтаксис /[\x01-\x1f\x7f]/ без искажения букв 2026-08-13 09:01:48 +03:00