Unlaw 3.12.3: ul zip сжимает лучше, плюс аудит безопасности
Что я сделал в Unlaw 3.12.3. Ужал архивы в ul zip и добавил флаг --best, закрыл дыры в агенте, desk и сервере моделей, исправил почти сорок ошибок.
原文语言:俄语
Вышел Unlaw 3.12.3. Обновиться можно командой ul update.
ul zip: меньше архивы, проще выбор
Сначала я ничего не менял, а замерил каждый вариант на папке исходников в 30 МБ. В релиз попало только то, что на замере реально помогло.
- tar.zst стал на 7–9% меньше при той же скорости. Я разрешил zstd искать повторы на расстоянии до 128 МБ. Распаковать такой архив можно любым zstd, лишние флаги не нужны.
- tar.xz теперь сжимается внешним многопоточным
xz, если он установлен, а на максимальном уровне я включил-9e. На обычном уровне вышло примерно на 12% быстрее, на максимальном архив чуть меньше. - tar.gz на уровне
--ultraя перевёл на deflate из 7-Zip: архив на 5% меньше, но заметно медленнее, поэтому только на этом уровне. - zip через 7-Zip теперь грузит все ядра.
- 7z я оставил как был. Попробовал «продвинутые» флаги из интернета, и на замере они только ухудшили результат. Настройки 7-Zip по умолчанию и так лучшие, это было для меня главным открытием этого релиза.
- Добавил флаг
--bestдля тех, кто не хочет разбираться в форматах:ul zip project --bestделает 7z на максимальном уровне (или tar.xz, если 7-Zip нет). - Починил распаковку
.tar.zstс очень большим окном сжатия, раньше она падала с ошибкой. - В справку дописал, какой формат когда брать: zip открывается везде, 7z на тексте и коде обычно в два раза меньше, tar.zst быстрее всех.
Безопасность
Я прошёл весь проект по частям: ядро, сервер моделей, команды на Python, игры с редактором и отдельно безопасность. Вот что нашёл и закрыл.
- Агент. Диск на Mac не различает регистр букв, а моя проверка защищённых путей различала, так что
.SSHвместо.sshпроходил мимо неё. Теперь сравнение идёт без учёта регистра. Вывод себе на будущее: на macOS любые проверки путей надо делать именно так. Ещё я закрыл агенту токены GitHub CLI, Hugging Face, cargo, Docker и npm, SSH-ключи в любой папке и истории команд оболочки. - ul desk. Запрос с полным адресом в первой строке проходил без токена. Закрыл.
- ul lm serve. Любой сайт, открытый в браузере, мог незаметно запускать локальные модели. Теперь запросы с чужих сайтов отклоняются, если явно не включить
--cors.
Исправления
ul doctor --fixбольше не может затереть~/.zshrc, если не смог его прочитать, и не превращает символическую ссылку на dotfiles в обычный файл.--dry-runтеперь правда ничего не выполняет. Раньшеul --dry-run removeудалял по-настоящему, и это, пожалуй, самый неприятный баг из всех.ul config set telegram.chat_id 123456789работает без кавычек вокруг числа.ul removeудаляет токен из Keychain, даже если конфиг сломан.- Сломанный шаблон проекта больше не роняет
ul listи подсказки для неизвестных команд: он пропускается с предупреждением. - Агент: обрыв Wi-Fi больше не останавливает
ula serverи не теряет напоминания. На слишком большой срок агент отвечает понятной ошибкой, а «через 700 дней» работает. Записи расписания, которые агент не смог прочитать, больше не стираются. - todo и desk: архив доски из Obsidian Kanban не ломается при перемещении карточек, переводы строк Windows и права файла сохраняются.
ul tg setupбольше не стирает комментарии вconfig.toml. - ul lm: если клиент Ollama просит выгрузить модель, она больше не загружается. После аварийного завершения сервера не остаётся висящих процессов моделей. Два аудиофайла, загруженные одновременно, больше не путаются.
- Редактор ule: очищенный файл сохраняется пустым, Ctrl-A на огромном числе не превращает его в 1, правки от языкового сервера применяются в правильном порядке.
- Игры: повреждённый файл рекордов я теперь откладываю в сторону, а не перезаписываю.
На каждое исправление я написал тест: 516 тестов на Python и около 285 на Rust, все зелёные.
Что не изменилось
Я ничего не удалял, старые команды и конфиги работают. Команды, которые вы отредактировали вручную, обновление не трогает.
Дальше
В планах по-прежнему локальная модель ul lm laya и память агента.