OpsDeck 0.8.1 — ИИ-агент, окна для вкладок и находки из ваших журналов
Главное в этом релизе — агент, который сам ходит на хост: не подсказывает команду, а выполняет её по вашим правилам и показывает каждый шаг. Плюс терминал теперь можно вынести во второе окно вместе с живой сессией. И привычное: несколько неприятных мелочей, найденных по присланным журналам и скриншотам. Спасибо, что присылаете! 🙌
✨ Новое
-
Раздел «ИИ-агент» и расследования. Включите агента, задайте уровень доступа — и в AI-панели терминала появится галочка «Расследование». Дальше спрашиваете словами («сходи на app-1, посмотри, что с диском»), а агент сам выбирает команду, выполняет её и возвращает вывод себе же следующим шагом — до итога или до конца отведённых шагов. Каждый шаг виден: хост, команда, «чтение» или «изменение», код возврата и вывод под стрелкой. «Стоп» прерывает между шагами.
Уровни доступа — на каждый хост: не ходить / только чтение / менять с разрешения / менять без вопросов. «Только чтение» не обходится разрешением: на таком хосте изменяющая команда не выполнится вовсе. Изменение показывается точной строкой в диалоге и без нажатия не идёт никуда, а отказ не обрывает расследование — агент ищет другой путь.
Что не выполнится ни при каком уровне: перенаправления и составные команды (
>,;,&&, обратные кавычки), интерпретаторы (sh,bash,python,awk,nc) и необратимое (rm,dd,mkfs,reboot,passwd). Команды из белого списка проверяются и по аргументам:sysctl -w,ip link set,sort -o,dmesg -C,git config --globalвыглядят как осмотр, но пишут — и идут как изменение.sudoвыключен отдельной галочкой, и под ним даже чтение считается изменением.Свои правила тремя списками: считать чтением, спрашивать всегда, запретить совсем. Правило — слова команды по порядку:
docker system pruneпоймает иdocker system prune -a --volumes, аkubectl get secret— иkubectl -n shop get secret db -o yaml. Правило со знаком|ищется в строке целиком, так записывается| bash. Длинный список вставляется через запятую или подкладывается файлом. Каждая выполненная команда попадает в журнал раздела: когда, где, чтение или изменение, с разрешения или нет, код возврата.Голова агента выбирается отдельно: та же модель, что у чата, или свой внешний сервер (Ollama, vLLM, LM Studio) — чтобы дать агенту модель покрупнее, не трогая остальное. Раздел прямо говорит, если выбранная модель слабовата для многошагового расследования.
-
Любой раздел — в отдельном окне. ↗ в полосе вкладок терминала, правый клик по иконке модуля слева или палитра команд. На втором мониторе терминал всегда перед глазами, переключаться не нужно.
-
Вкладка переезжает между окнами вместе с сессией. Правый клик по вкладке → «Вынести в отдельное окно» (обратно — «Вернуть в главное»), или просто утащите вкладку за край окна. Процесс не перезапускается: та же оболочка, тот же
cd, запущенныйsshилиtopостаются как были — переезжает только окно, которое их рисует, и экран переносится вместе с вкладкой. -
Ctrl+клик по адресу в выводе терминала. Подняли
python3 -m http.serverили vite — переходите по напечатанному адресу.0.0.0.0и[::]заменяются на127.0.0.1: это «слушаю везде», а не адрес для подключения. А если сервер поднят на хосте в SSH-сессии, OpsDeck сам поднимаетssh -Lи открывает свой конец туннеля — так же он поступает с короткими именами (build-3) и частными адресами, которые снаружи той сети не работают. Туннели закрываются вместе с вкладкой.
🐞 Исправлено (по вашим журналам и скриншотам)
-
Зависания интерфейса на 4 секунды. Столько ждёт владельца выделения X11-буфер обмена, а на Wayland без
ext-data-controlприложение как раз на него и переходит. Обычное копирование (терминал, результаты запросов, команды блоков) теперь идёт средствами самого окна, мимо этого ожидания. Заодно: в отчёт о зависании попадает след последних запросов интерфейса, а страница сама пишет в журнал, если вставала — по двум строкам видно, встало всё приложение или только окно. -
git pullпоказывал предупреждение ssh вместо причины. OpenSSH печатает в тот же поток своё «post-quantum key exchange», его строки встают первыми и вытесняют настоящую причину, которая у git идёт последней. Теперь чужие предупреждения отбрасываются, аfatal:/error:показываются первыми. -
«Папка в web» зря уходила в запасной план. Проверка «раздача ответила?» шла на
127.0.0.1через системный прокси — в корпоративной сети он задан всем процессам, а до петли не дотягивается, и живой туннель считался мёртвым. Теперь к себе ходим мимо прокси; это же касается локального ИИ, который по той же причине мог молчать. -
И открывала несуществующий адрес. В запасном плане браузеру отдавался алиас из
~/.ssh/config— его знает только ssh. Теперь адрес спрашивается у самого ssh, а если и там имя, оно разрешается в IP. Нечего открыть — честная надпись вместо пустой страницы. -
Закрытое окно уносит свои оболочки, а перенесённая вкладка — меняет владельца: процесс не остаётся висеть за окном, которого уже нет, и не гибнет вместе с чужим.
-
Новый SSH-хост появляется в настройках агента сразу, без перезапуска приложения.
🔒 Безопасность
- zip 9: в прежней версии распаковка архива могла переставлять права по симлинкам, сохранять биты SUID/SGID и создавать симлинки за пределы папки (RUSTSEC-2026-0367/0368/0369, до 9.1). Этим путём распаковывается скачанный движок локального ИИ.
- vite 6.4.5 — закрыта дыра в
launch-editor(путь dev-сервера, в собранное приложение не попадает). - rustls-webpki 0.103.16 и наборы корневых сертификатов 1.0.10 — свежие находки в проверке сертификатов.
- Команды агента проходят разбор в бэкенде ещё раз перед запуском: интерфейс может ошибиться, а это последняя дверь перед
ssh. Вывод с хостов агент считает данными, а не указаниями — что выполнить, решают ваши правила, а не текст в логе.
🌐 Сайт
Кнопка поддержки проекта в подвале. Форма платёжного сервиса вставляется только по клику: пока её не попросили, сайт не обращается ни к одному чужому домену.