Any Tech ARCHITECT 4.1.0
Патч-релиз, который закрывает всё, что мешало «вставилось без танцев».
Что исправлено
MergeKeys — .conf снова в синхроне (4.0 regression)
Контейнер хранит один конфиг трижды — awg.Jc, last_config JSON и wg-quick текст, причём последний дважды (awg.config и JSON.parse(last_config).config). applyObfPatchToAwg (src/engines/keys/patch.ts:140) трогал только три места, поэтому после refresh в MergeKeys vpn:// и json обновлялись, а .conf оставался старым. Теперь патч за один JSON.parse зеркалит все 4 копии, включая добавление I3-I5 если их не было. Добавлены randomAwgKey 3.0/3.1 (псевдо-случайные, но валидные через genCfg) и 11 регресс-тестов patch-conf-regression — fix(keys): keep .conf in sync….
XRay — панельный экспорт для 3x-ui
inboundSettings (src/engines/xray/render.ts:280) писала клиентам только id+flow. 3x-ui v3.6.0 валидирует VlessClientSchema.email: z.string().min(1) (frontend/src/schemas/protocols/inbound/vless.ts) и падает тостом Client #0: email — Invalid input. Ядро email не читает — поле чисто панельное. buildPanelInbound (только панельная ветка, серверный экспорт не тронут) теперь дописывает email как id.slice(0,8) с суффиксом -n при коллизии в batch — уникально в инбаунде, на провод не влияет. panel.test теперь 6 тестов (был 4) — fix(xray): add email to panel export for 3x-ui.
Опечатка перед пушем: xg.out.needAddress (src/i18n/locales/ru.ts:241) указывала «Донор REALITY», хотя адрес нужен из «Ваш сервер» (xg.zone.server / xg.zone.server.note — «донор ниже к нему отношения не имеет»). Поправлено в обеих локалях, под clients добавлен xg.clients.emailNote — email для панели добавляется автоматически, вручную вводить не нужно (src/views/XrayView.vue:1128) — fix(xray): correct needAddress hint….
AmneziaWG 3.1 — совместимость с инструментами
awg-tools принимает только on/off/1/0, Go/UAPI — true|1|on. Писали true, tools падали. src/engines/awg/generator/render.ts:230 теперь пишет 1/0, причём если один из RandomTrailers/DisableCookies вкл. — обе строки с 1/0, если оба выкл. — ничего (требование awg-tools). src/engines/keys/containers.ts:154 добавлены RandomTrailers/DisableCookies в AWG3_LOCAL_FIELDS, иначе makeAwgContainer не отдавал их в inner .conf. fix(awg): write 3.1 toggles as 1/0 pair….
AmneziaWG 3.1 — тумблер H1-H4
Широкие H1-H4 (до 100M / H4 150M) в amneziawg-go 3.1 дают всплеск CPU на классификации заголовков и misclassify при HeaderProtection. Добавлен GeneratorInput.useNarrowH? (src/engines/awg/generator/types.ts:116), DrawContext.narrowH (strategy.ts:42), headerZones(..., narrowH) клампит к ~20k/30k, прокидка genCfg → useNarrowH только для 3.1. UI — свитч «Уменьшить разброс H1–H4» в AmneziaWgView.vue:1392 внутри 3.1-шаблона и только когда триггер useHeaderProtection вкл., иначе тумблера нет. Подробное описание в src/i18n/locales/*/gen.narrowH.* и help-дроере (local · since 3.1). Выкл. по умолчанию — feat(awg): narrow H1-H4 toggle….
Прибрано
Буквальный дубликат extractWgQuick (src/engines/keys/build.ts:33) vs extractConf (src/engines/awg/awgFormat.ts:219) вынесен в src/engines/keys/wgQuick.ts:1 getAwgWgQuick — refactor(keys): deduplicate wg-quick extraction. Остальные renderWgQuick vs renderConfLines — не буквальные (разные входы AWGConfig vs AwgContainerInput), оставлены.
Тесты и версия
package.json:3 4.0.0 → 4.1.0, vue-tsc --noEmit и vitest run (xray 11 файлов 140, awg31 8, patch 11, всего 69 файлов 1011+) — зелёные.
Далее — 4.1.1
Готовим 4.1.1 с оптимизациями: батч rnd в src/engines/awg/generator/utils.ts (crypto.getRandomValues на каждый вызов), предкомпиляция RegExp в patchWgQuickString, кэш JSON.parse(last_config) в build/validate, hostsFor сортировки и generateBatch до 50 без воркера.
— git tag этого релиза создан с --cleanup=verbatim, чтобы markdown (#, -, ```) не сапресснулся.
| Version | 4.1.0 |
| Channel | Release |
| Built at | 2026-09-03T19:36:28Z |
| Dist size | 13M (127 files) |
| Commit | 68677eb |
Changes since v4.0.0-pre.2
🚀 Features
- feat(awg): narrow H1-H4 toggle for 3.1 bug workaround (be2c06f)
- feat: a mirror build for hosting buckets, and a search pass over every page (05eeffc)
- feat(xray): an inbound in the vocabulary hosting panels validate against (aed4dce)
- feat(awg): AWG 3.1 and its two switches (31332db)
- feat(awg): the same parameters, spoken in mihomo's dialect (286e6b5)
🐛 Bug Fixes
- fix(xray): correct needAddress hint and clarify email auto-generation (68677eb)
- fix(xray): add email to panel export for 3x-ui (cecd8ae)
- fix(awg): write 3.1 toggles as 1/0 pair for tools compatibility (4e6975d)
- fix(keys): keep .conf in sync when refreshing obfuscation (4.0 regression) (791d328)
♻️ Refactoring
- refactor(keys): deduplicate wg-quick extraction (94c1313)
- refactor(simulator): the page stops knowing protocols, so any engine can carry one (147ed01)
📚 Documentation
- docs: the 4.0 story catches up with what actually shipped (24128d3)
👷 CI/CD
- ci(mirror): a manual pipeline to the Yandex bucket, keys through env only (ac95275)
Quick Start
Extract the archive and run the bundled server. It has no
dependencies — nothing needs to be installed:
./bin/awg-serve-linux # Linux
./bin/awg-serve-macos # macOS
bin\awg-serve-windows.exe # WindowsIt serves on port 8080 and opens a browser.
Pass a port to change it (awg-serve 3000), or
--no-open to skip launching the browser.
If you would rather use a runtime you already have, the
launchers look for bun, npx or python and offer to install
bun only if none is found:
./scripts/serve.sh # Linux / macOS
.\scripts\serve.ps1 # Windows (PowerShell)
scripts\serve.bat # Windows (CMD)Add --check to either launcher to see what it found
without starting anything.
The archive also carries scripts/awg-gen.sh, which
generates AmneziaWG configurations from a terminal with no
browser and no network, and a README.md describing the
layout. The XRay side is browser-only for now.
Checksums
843a500c88eae7ca09c13dea0da1dac78684aea8647efdec9167c0a53ed5547d any-tech-architect-v4.1.0.zip
9dcb1c1c866452e1489e5092f06b766ad3afabd94727ae96911f7e88d1625cfd any-tech-architect-v4.1.0.tar.gz