Хроника изменений

Все значимые изменения в VelaTerm, от новейших к старым.

v0.1.91 — это первая публичная версия; более ранние номера версий были внутренними итерациями и не учитываются.

v0.1.108

Последние изменения
  • Экспериментальный режим диалога для Claude, Codex и OpenCode: потоковые ответы, ход рассуждений, подробности инструментов, разрешения и формы вопросов. При первоначальной настройке по умолчанию по-прежнему используется терминал.

  • В зависимости от возможностей движка доступны настройки модели, очередь сообщений, вмешательство в текущий ответ, дополнение путей файлов и вложения изображений.

  • Поиск по диалогу, ссылки на файлы, действия с изображениями и отдельные шрифты упрощают чтение длинных сеансов. Удалённая история загружается постепенно, подробности инструментов — по запросу.

  • Квитанции отправки помогают сверить результат после разрыва соединения. Отправки с неопределённым результатом ожидают подтверждения и не повторяются автоматически.

  • Новые команды vrefer и vsearch читают и ищут другие сеансы; vrefer --ask поручает чтение агенту. vorch и vstat добавляют координацию нескольких агентов и просмотр состояния.

  • Записи памяти поддерживают теги, прямое редактирование текста, защиту несохранённых изменений и настройки упорядочивания. Улучшены фильтры и выбор при импорте истории, а также навигация по графу.

  • Клиент публичного доступа поддерживает привязку учётной записи и устройства, ограниченный доступ к AI-сеансам и зашифрованные ретрансляционные соединения. Загрузка изображений гостями и сложные формы MCP пока не поддерживаются.

  • ID возобновления Codex проверяются по сохранённой истории. При подтверждённом отсутствии истории выводится явная ошибка вместо запуска пустого сеанса; к уже работающему терминалу можно подключиться повторно.

  • Откат зависит от возможностей движка: Codex восстанавливает только состояние диалога, но не файлы. Обработка области отката и предварительная проверка каталога в OpenCode остаются известными ограничениями.

  • Обновление номера выпуска сохраняет зафиксированные версии зависимостей. Проверка установки и обновления на всех платформах и приёмка реальной интеграции с AI ещё не выполнены; автоматические проверки их не заменяют.

v0.1.107

Последние изменения
  • 🧠 Глобальная память (экспериментальная функция): Claude или Codex превращает ваши диалоги в общую вики, разложенную по темам
  • 🕸️ Граф кода (экспериментальная функция): индексируйте рабочий каталог, изучайте связи между символами и связывайте их с памятью
  • 🔎 Агенты могут запрашивать код и память прямо в сессии командой vknowledge
  • 🖥️ SSH умеет зеркалировать удалённое десктопное приложение: одинаковые вкладки, разделения и активная сессия на обеих машинах
  • 🪟 Удалённой машиной для SSH теперь может быть Windows
  • 📥 Импорт существующих сессий Codex, Claude и OpenCode из папки проекта
  • 🤖 Новый агент: OMP
  • 🎚️ vspawn позволяет выбрать модель и глубину рассуждений для дочерней сессии
  • 🌿 vspawn-tree работает и в коллекциях, а у запущенных worktree-сессий появляется значок ветки
  • 🔤 Поиск сначала ищет совпадения по целым словам и подсвечивает именно то, что нашёл
  • 🖱️ Щелчок средней кнопкой мыши закрывает вкладку
  • ⌨️ Браузеры на macOS: ⌘D и ⌘⇧D делят панель
  • 💬 При наборе через IME изображение больше не смещается, а курсор виден прямо в наборной строке
  • 🪓 Разделение из меню применяется только к активному окну, и каждое разделение записывается в logs/split.log
  • 📁 Диалог выбора удалённой папки сохраняет введённый вами путь
  • ℹ️ Панель сведений: время запуска и время работы в одной строке, а на macOS показывается средняя нагрузка
  • 🔑 В полях пароля больше нет собственной кнопки показа от браузера

v0.1.106

Последние изменения

Рабочее пространство

  • В боковой панели появились коллекции: контейнеры верхнего уровня, не привязанные к папке на диске. Некоторые сессии изначально не относятся к репозиторию — например, удалённые сессии, страницы браузера или терминал, открытый для быстрой проверки. До сих пор их можно было разместить только внутри проекта, где они выглядели неуместно. Коллекция — это отдельная строка с именем, не привязанная к какой-либо папке на диске. Поскольку корня проекта здесь нет, неактуальные действия скрываются сразу, а не завершаются ошибкой после нажатия: для коллекций скрыты пункты «New Worktree Session», «Move to Worktree…» и выбор worktree в диалоге создания сессии, вместо того чтобы выдавать ошибку при клике. Вместо них диалог создания сессии содержит поле Working directory, в котором по умолчанию указан домашний каталог, а в десктопной версии доступен нативный выбор папки. Сессии, запущенные без явного указания директории, теперь открываются в домашнем каталоге, а не наследуют путь запуска приложения (в macOS это был /).

  • Панель ресурсов теперь показывает всю систему, а не только текущую сессию. Раньше панель отображала нагрузку на процессор и память только для дерева процессов самой сессии, из-за чего было невозможно понять, потребляет ли сессия все ресурсы или компьютер уже был перегружен. Теперь панель разделена на разделы THIS SESSION и SYSTEM. В секции SYSTEM отображаются индикаторы загрузки процессора, памяти и swap (становятся жёлтыми при нагрузке выше 70% и красными выше 90%), а также платформозависимая строка: нагрузка на память (memory pressure) в macOS, нормализованные по количеству ядер показатели средней нагрузки (load average) в Linux и ничего в Windows (где нет эквивалентной метрики). Если вас интересует только текущая сессия, снимите флажок «system» в заголовке панели — системные строки исчезнут, а фоновый сбор метрик полностью остановится. Эта настройка запоминается и применяется к панели каждой сессии.

  • В Windows и Linux появилась строка меню, вызываемая клавишей Alt. В macOS есть нативные системные меню, но в Windows и Linux настройки, проверка обновлений и разделение панелей ранее были доступны только через иконку в строке заголовка. Одиночное нажатие и отпускание клавиши Alt теперь открывает и скрывает строку меню. Комбинации с Alt не затронуты: поскольку в терминале Alt служит префиксом Meta, такие сочетания, как Alt+B и Alt+F, по-прежнему передаются в командную оболочку; меню открывается только одиночным нажатием Alt, которое не отправляет символов в терминал. Строка меню включает разделы File (настройки, проверка обновлений), Terminal (новый терминал, разделить вправо, разделить вниз) и Help (веб-сайт, обратная связь, поделиться), отображая подсказки горячих клавиш с учётом ваших пользовательских настроек. Поддерживается навигация как мышью, так и с клавиатуры: нажатие Esc закрывает открытое меню, затем скрывает строку меню и возвращает фокус в терминал.

  • Пункт меню «Clear notification badges» сбрасывает бейдж уведомлений, который ничем другим нельзя было убрать. Бейдж на значке в доке считает непрочитанные сессии и оставшиеся без ответа карточки подтверждения запуска. Однако кнопка очистки в боковой панели появлялась только при наличии непрочитанных сессий и сбрасывала только их. Если оставалась неотвеченная карточка с запросом — например, из закрытого окна или удалённой сессии, где карточку больше нельзя было отрисовать, — на бейдже в доке отображалась единица без возможности её убрать. Новый пункт меню помечает все сессии как прочитанные, отклоняет все ожидающие запросы на запуск и напрямую сбрасывает счётчик бейджа в ОС до нуля. Это особенно важно для macOS, где счётчик бейджа в доке сохраняется между перезапусками приложения.

  • Окно больше не зависает во время чтения файлов командами или ожидания ответа системы. Синхронные команды Tauri выполняются в главном потоке, замораживая пользовательский интерфейс на всё время своей работы. Аудит всех 43 команд выявил 13 операций ввода-вывода в главном потоке: запрос разрешений на уведомления в macOS мог блокировать интерфейс до одной минуты в ожидании подтверждения пользователя; чтение записей длительных сессий последовательно считывало десятки мегабайт блоками по 64 КБ; вставка скриншотов напрямую записывала данные на диск; а получение рабочей директории сессии запускало процесс lsof. Все 13 команд теперь выполняются вне главного потока. Обработка нажатий клавиш осталась на быстром пути выполнения без изменений.

Удалённый доступ

  • Хост теперь показывает, какие удалённые клиенты подключены. Поскольку зеркалирование сессий двунаправленное, удалённый клиент может изменить разметку хоста — при этом хост раньше никак не мог узнать, подключён ли кто-то, не говоря уже о том, кто именно. В строке заголовка теперь отображается бейдж «Mirrored by N»; по клику на него открывается список подключённых клиентов с их именами, IP-адресами и временем подключения. Имя клиента передаётся во время зашифрованного рукопожатия (если имя не указано, используется «Unnamed»).

ИИ-агенты

  • Статистика использования аккаунта теперь запрашивается один раз на всю машину, а не для каждой сессии по отдельности. Лимиты использования привязаны к аккаунту, но ранее панель информации каждой сессии запрашивала их независимо. При десяти открытых сессиях отправлялось десять дублирующих запросов за одними и теми же значениями, что нередко приводило к превышению строгих лимитов Claude (rate limits) и исчезновению данных из панели. Теперь централизованный фоновый опросчик хранит единый снимок данных, из которого читают все сессии, и рассылает обновления при любом изменении. Опрашиваются только те провайдеры, которыми вы активно пользуетесь (определяется по наличию путей ~/.claude, ~/.codex или ~/.grok/auth.json), без обращения к системной связке ключей, чтобы не вызывать лишних запросов разрешений. Снимки сохраняются на диск, поэтому панель сразу после перезапуска показывает кэшированные значения, не дожидаясь первого опроса. При выходе ноутбука из спящего режима данные также обновляются сразу, а не по наступлению следующего интервала. При повторных сбоях опроса интервал ожидания увеличивается до 8 раз. В настройках интервал обновления теперь дополнен явным переключателем включения/выключения рядом с полем ввода, заменившим неоднозначную настройку «0 секунд».

  • Ошибки обновления расхода теперь явно помечаются как устаревшие данные, а не выглядят актуальными. Ранее при сбое запроса на обновление клиент молча возвращал кэшированную копию, фиксируя при этом успешное обновление: метка времени сдвигалась вперёд, ошибки очищались, а таймер задержки сбрасывался. При попадании под ограничения частоты запросов панель выглядела нормально, хотя опрос продолжался каждые пять минут. Теперь при сбое запроса сохраняются кэшированные значения, но рядом с провайдером появляется жёлтый бейдж stale. При наведении на него отображается подсказка с временем сбоя, причиной ошибки и давностью отображаемых данных. Метка «Updated» показывает время последней успешной синхронизации, а заголовки retry-after от серверов с ограничением частоты запросов корректно учитываются, хотя ручное обновление по-прежнему срабатывает мгновенно.

  • В панели использования появились недельные квоты по отдельным моделям. Помимо общеаккаунтных 5-часовых и 7-дневных лимитов, эндпоинт статистики передаёт недельные квоты для конкретных моделей. Раньше они игнорировались, поэтому пользователи таких моделей, как Fable, видели только общий расход аккаунта, а не оставшуюся квоту для конкретной модели. Теперь эти строки с детализацией отображаются под общими итогами с группировкой по семействам моделей.

  • Повторное открытие сессии OpenCode восстанавливает историю чата. Ранее приложение проверяло существование сессии с помощью opencode session list, которая ищет сессии только в текущем рабочем каталоге. Поскольку десктопное приложение работает из директории своего запуска (в macOS это /), существующие идентификаторы сессий никогда не находились, из-за чего попытки возобновления молча открывали пустые сессии. Теперь проверка запрашивает конкретный ID сессии напрямую и считает её удалённой, только если команда явно это подтверждает. Другие ошибки считаются неопределёнными, и приложение продолжает восстановление, предотвращая случайную потерю истории сессии.

Интерфейс

  • При наборе текста через редактор метода ввода (IME) теперь отображается промежуточный текст. На всех трёх платформах текст, набираемый через IME (например, пиньинь или кана), ранее оставался невидимым до подтверждения клавишей Enter. Причиной было пользовательское правило CSS: xterm отображает набираемый текст в контейнере-оверлее без фиксированных границ, где наше ограничение right (предназначенное для переноса длинных строк в терминале) приводило к нулевой ширине, а overflow: hidden полностью обрезало текст. Это правило удалено, и теперь переопределяется только стандартная чёрно-белая цветовая схема оверлея, которая не соответствовала ни одной теме. Заодно была исправлена сопутствующая проблема: xterm растягивал скрытое поле textarea под размер оверлея для позиционирования списка кандидатов IME, но никогда не уменьшал его обратно, из-за чего оставался невидимый слой, блокировавший клики мыши и выделение текста на этой строке.

  • В macOS сочетания клавиш с Ctrl больше не вызывают действия для Command. Ранее проверка клавиш-модификаторов в macOS считала Cmd и Ctrl взаимозаменяемыми. В итоге стандартные сочетания терминала конфликтовали с горячими клавишами приложения: Ctrl+D (EOF) разделял панели, Ctrl+W (удаление слова) закрывал панели, а такие комбинации, как Ctrl+F, Ctrl+T и Ctrl+O, перехватывались приложением. Поскольку новые панели создаются без уведомлений, часто казалось, что они появляются сами по себе. Теперь десктопное приложение для macOS использует для горячих клавиш исключительно Cmd, тогда как другие платформы (а также веб-браузеры, подключённые к Mac) используют исключительно Ctrl.

  • Выпадающие меню больше не открываются повторно сразу после выбора пункта. Оборачивающий элемент <label> передавал клик по всей строке обратно на кнопку вызова, из-за чего выпадающее меню мгновенно открывалось снова сразу после выбора пункта.

Исправления

  • Linux: пакет AppImage снова запускается. В версии 0.1.105 AppImage завершался аварийно на Ubuntu 22.04 ещё до появления окна, не имея возможности запустить вспомогательные процессы WebKit. Инструменты упаковки AppImage переписывают литеральные пути /usr в исполняемых файлах на ././ (сохраняя длину строки для правки на месте), из-за чего скрипт запуска должен переходить в рабочий каталог $APPDIR/usr, чтобы эти пути корректно разрешались. В 0.1.105 наш пользовательский скрипт запуска, добавленный для предотвращения утечки переменных окружения в дочерние оболочки, передавал переменные окружения, но пропускал этот переход в нужный каталог. Теперь скрипт запуска корректно меняет директорию, а проверка на этапе сборки предотвращает появление подобных регрессий. Версии 0.1.104 и более ранние этой проблеме не были подвержены.

  • Windows: уведомления снова воспроизводят звук, а клик по ним переключает на нужную сессию. Ранее уведомления в Windows отправляли в плагин уведомлений идентификатор звука для macOS. Поскольку распознать такое имя было невозможно, оно превращалось в тишину, из-за чего уведомления в Windows никогда не воспроизводили звук независимо от настроек. Отправка уведомлений Windows через плагин была добавлена два релиза назад как временный обходной путь для проблемы, исправленной в том же релизе. Теперь этот обходной путь убран: уведомления снова идут через нативный канал, что восстанавливает как воспроизведение звука, так и переход к сессии по клику.

  • Windows: символы псевдографики и блочные элементы теперь выровнены. Ранее рамки в терминале отображались с использованием пропорционального резервного шрифта, что приводило к визуальному размытию. Даже после устранения этой проблемы блочные символы (используемые в индикаторах выполнения и маскоте Claude Code) по-прежнему имели едва заметный вертикальный зазор по правому краю каждого знакоместа, поскольку резервный шрифт был немного уже основного шрифта терминала. Теперь оба диапазона символов берутся из встроенного подмножества JetBrains Mono, гарантируя точное совпадение ширины глифов.

  • Windows: git работает в полной версии Git Bash. Хотя установка полной версии Git Bash проходила успешно, выполнение git в терминале возвращало ошибку «command not found», из-за чего пользователю снова и снова предлагалось установить полный Git Bash. Git Bash добавляет mingw64/bin в переменную PATH только тогда, когда ему указано, в каком дереве каталогов он запущен. Поскольку наш загрузчик оболочки опускал этот параметр, исполняемые файлы, находящиеся исключительно в этой директории (такие как git и curl), не находились. Кроме того, диалог скачивания теперь выбирает установщик, соответствующий архитектуре системы, а не предлагает по умолчанию 64-битную версию.

  • Windows: удаление worktree теперь работает, а переустановка хуков Kiro перестала их дублировать. Ранее команды удаления worktree выполнялись изнутри целевой директории worktree. Поскольку Windows запрещает удаление текущей рабочей директории активного процесса, операция постоянно завершалась ошибкой доступа; теперь команды Git выполняются из корня основного репозитория. Кроме того, логика обнаружения хуков сравнивала пути с прямым слешем с путями с обратным слешем в Windows, из-за чего проверка не срабатывала и при каждой переустановке добавлялись дубликаты записей хуков.

v0.1.105

Последние изменения

Рабочее пространство

  • Состояние сессии, отметки о непрочитанном и то, работает ли сессия до сих пор, теперь определяются на бэкенде, и все клиенты видят один и тот же ответ. Раньше каждый клиент выводил всё это из того, что случайно наблюдал сам, поэтому «непрочитано» на деле означало «не прочитано в этом окне»: сессия, прочитанная в браузере, оставалась непрочитанной в настольном приложении, а динамически расширяющийся фильтр по состоянию снова и снова возвращал эту строку в общий список, откуда её не убирало даже «Обновить состояние». События состояния к тому же регистрировались только после того, как клиент сам запускал хотя бы одну сессию, поэтому только что подключившийся браузер показывал точки у сессий, которые открыл сам, и ничего — у всех остальных. Теперь бэкенд держит по одной достоверной записи на сессию — агент, его состояние, жив ли процесс и признак непрочитанного, — отвечает на пакетный запрос, когда клиент подключается или переподключается, и рассылает каждое изменение всем. Клиенты сообщают, что они наблюдают; выводы делает бэкенд. Прочитанная на телефоне сессия снимает отметку и в настольном приложении, только что подключившийся браузер показывает правильные точки у сессий, которые он никогда не открывал, а правила арбитража, жившие раньше во фронтенде, переехали вместе со своими обоснованиями и своими тестами: хук, сообщивший о себе хотя бы раз, закрывает дорогу любым догадкам по сырому выводу; непрерывный вывод означает занятость только для сессии, у которой есть агент, которая не является Codex и по которой ещё нет достоверного сообщения; а удержание в 1200 мс не даёт только что начатой задаче быть отменённой событием завершения, пришедшим сразу следом. Исключение — чтение экрана: ему нужна отрисованная сетка, а она существует только в клиенте, поэтому прочитанное сообщает тот клиент, которому принадлежит размер терминала, а бэкенд решает, принимать ли это сообщение, — сообщение от любого другого клиента отклоняется. Если что-то из этого пойдёт не так, значение frontend у ключа vlx-arbitration в localStorage возвращает арбитраж прежней цепочке во фронтенде.

  • Перезапуск сессии больше не закрывает её вкладку на другом клиенте. Событие pty://killed не несло с собой никаких данных, поэтому другая сторона не могла отличить перезапуск от закрытия: она считала закрытием всё подряд, убирала панель, а потом отзеркаливала эту раскладку обратно. Теперь событие сообщает, какой клиент завершил процесс и почему, поэтому при перезапуске панель остаётся на месте и ждёт нового процесса. Отсутствующая или незнакомая причина по-прежнему считается закрытием: оставить панель открытой для сессии, которая уже не вернётся, — значит держать на экране мёртвый терминал, а это хуже, чем закрыть ту, что собиралась перезапуститься.

  • Браузер, подключившийся к настольному приложению сразу после восстановления рабочего пространства, больше не запускает все сессии по-настоящему. При восстановлении рабочего пространства вместо запуска процессов рисуются карточки-заглушки, но это решение существовало только в настольном приложении; браузер шёл за отзеркаленной раскладкой, не мог отличить «не работает» от «работает, просто здесь ни разу не открывалась» и монтировал терминалы — а смонтировать терминал значит его запустить. Лист, пришедший с чужой раскладкой, теперь рисуется заглушкой, если бэкенд говорит, что процесса за ним нет. Открыть сессию самому по-прежнему означает намерение её запустить, а терминал, на который вы смотрите прямо сейчас, при завершении процесса никогда не подменяется карточкой — вы ведь ещё можете захотеть прочитать то, что он вывел.

  • Изменение настройки немедленно доходит до остальных клиентов. Достоверные настройки всегда хранились на бэкенде, но менял он их молча, поэтому другой клиент узнавал об изменении только при следующем запуске. При удалённом подключении это не просто расхождение в отображении: выключить «динамически расширять фильтр по состоянию» на одном клиенте было бесполезно, пока другой продолжал добавлять строки в общий список, а клиент с меньшим лимитом живых вкладок выгружал фоновые вкладки у всех остальных. Теперь запись настройки рассылает всем, какой ключ изменился, и каждый клиент перечитывает его тем же путём, каким читает при старте, поэтому правила, скрывающие защищённые значения от удалённых вызывающих, продолжают действовать: рассылка несёт только имена ключей и никогда — значения. Телефоны, которые раньше настройки ни отправляли, ни получали, теперь тоже в этом участвуют.

  • Браузер дожидается отзеркаленной раскладки, прежде чем восстанавливать свою. У удалённого окна два источника раскладки — своя, из localStorage, и та, которую в зеркальном режиме присылает хост, — и та, что приходила первой, затиралась другой. Показать сначала локальную стоило дороже, чем мелькание на экране: смонтировать лист с терминалом значит запустить настоящий процесс, и для сессии, чей процесс уже завершился, это означало поднять оболочку, на которую никто никогда не посмотрит, — и она потом оставалась висеть, потому что браузер свои терминалы отсоединяет, а не завершает. Теперь браузер ждёт, пока пройдёт первое согласование, и только после этого что-то восстанавливает, но не дольше двух секунд; если бэкенд медлит или недоступен, он возвращается к локальной раскладке, а не сидит с пустым окном. Телефоны и любой клиент с выключенным зеркалированием проходят сразу.

Удалённый доступ

  • SSH-подключение может включить зеркальный режим для той службы, которую оно поднимает. Переключатель живёт в панели удалённого доступа, но SSH поднимает на дальней машине службу без интерфейса, и никакой панели там нет. Удерживайте Option при щелчке по «Connect remote» — и в форме SSH появится флажок «Mirror UI across clients», по умолчанию снятый. Значение едет вместе с подключением и живёт в памяти службы, а не записывается в базу данных дальней машины: когда вы вдобавок используете базу данных самого удалённого рабочего стола, одно SSH-подключение не должно незаметно переключать тумблер в чужой панели. Выбор запоминается отдельно для каждого хоста, поэтому та же машина, выбранная из истории, приходит вместе с ним. Чтобы переиспользовать уже работающую службу, теперь должны совпасть версия, режим данных и зеркальный режим — если различается хотя бы одно из трёх, старая служба заменяется, а это завершает работающие на ней сессии; поэтому эта настройка и спрятана за Option, рядом с переключателем базы данных.

  • Клиент, который повторяет чужую раскладку, теперь об этом сообщает. Раньше вкладки и разделения на ведомом клиенте перестраивались сами собой, и на экране ничто не объясняло, откуда взялось изменение. Теперь в заголовке окна есть значок «Mirrored», а при наведении показывается пояснение. У хоста такого значка нет — у него есть сам переключатель.

  • Файлы теперь можно переносить между вашей машиной и той, где работает терминал. Удалённый доступ показывал файлы удалённой машины, но забрать один или положить туда свой было нечем — оставалась только команда в терминале. В панели файлов появились «Скачать» в контекстном меню файла и «Загрузить» в заголовке, а перетаскивание файлов с рабочего стола на строку папки отправляет их туда. Оба направления идут по тому же аутентифицированному соединению, что и всё остальное, поэтому одинаково работают из браузера в локальной сети, с телефона и из окна удалённого подключения. Передача идёт частями, под деревом показывается очередь с прогрессом, и она продолжается, пока вы смотрите другую панель. «Скачать» — обычная ссылка на загрузку, которой занимается собственный менеджер загрузок браузера: он пишет на диск по мере получения, показывает скорость и оставшееся время, умеет ставить на паузу и продолжать — при любом размере файла и в любом браузере, включая телефон. В ссылке лежит билет, выписанный на один этот файл и действующий несколько минут: этот сервер держит учётные данные в заголовке, а браузер, открывающий ссылку, заголовков не отправляет. Загрузка сначала пишется под временным именем и переименовывается только после завершения, так что прерванная передача никогда не оставит наполовину записанный файл там, где должен быть целый; занятое имя отклоняется до того, как что-либо будет передано. Загрузки показывают скорость и оставшееся время и переживают обрыв связи: неудавшийся кусок ждёт и повторяется около минуты, каждый раз спрашивая у сервера, докуда на самом деле дошёл временный файл, вместо того чтобы слать заново кусок, который мог уже записаться. Даже сдавшись, эти байты сохраняются: перетащите тот же файл в ту же папку — и передача продолжится с места остановки, в том числе после перезагрузки страницы; частичный файл выбрасывается только при отмене.

ИИ-агенты

  • Сессии Antigravity и Copilot называются по своему первому сообщению. Оба агента отсутствовали в автоматическом переименовании, из-за чего в боковой панели выстраивались ряды «Antigravity 1, 2, 3». События хуков Antigravity вообще не несут пользовательского текста — только идентификатор беседы и путь к расшифровке, — поэтому первое сообщение читается из самой расшифровки; идущий за ним блок метаданных в заголовок не попадает. События Copilot к тому же не несут имени события и различаются по своей форме, поэтому тело с запросом и без имени инструмента теперь считается отправкой сообщения — а значит, промпт, с которым запускается сессия, и вызовы инструментов в заголовок справедливо не попадают.

  • Сессия Antigravity открывается заново вместе со своей историей. Для возобновления нужен идентификатор беседы, а разбор, который вытаскивает идентификатор сессии из аргументов запуска, не узнавал того написания, которое использует Antigravity, поэтому --conversation=<id> было не на что опереть и каждая переоткрытая сессия поднималась пустой.

  • vspawn --yes создаёт дочернюю сессию без карточки подтверждения. Тем, у кого включено подтверждение перед созданием дочерних задач, приходилось прощёлкивать карточку для каждой дочерней сессии подряд. Флаг — его же можно написать как -y или --no-confirm — пропускает карточку для этого одного вызова и запускает сессию с настройками по умолчанию. Саму настройку он не меняет, поэтому следующий запуск без него снова спросит.

  • Поле модели на карточке дочерней задачи принимает всё, что вы наберёте. Раньше это был обычный выпадающий список, поэтому выбрать можно было только модели из него, — а агент понимает куда больше идентификаторов: имена с датой вроде claude-opus-4-6, имена с префиксом поставщика, псевдонимы, настроенные локально. Теперь это текстовое поле, а известные модели висят рядом в выпадающем списке как быстрый выбор. Список — это подсказка, а не белый список: передаётся ровно то, что вы набрали, пустое поле означает, что --model не передаётся вовсе, а сам список фильтруется по мере набора и сворачивается, когда произвольный идентификатор не совпадает ни с чем.

Интерфейс

  • Один выпадающий список на всё приложение. Выпадающие списки по всему приложению были больше десятка раз скопированы с одного и того же кода, а потом разошлись между собой: три разных фона панели, четыре тени, три цвета подсветки под курсором, высота кнопки в 26, 28 и 32 пикселя и галочки у выбранных строк, которые нужны только списку с множественным выбором. Теперь на одном компоненте держатся выбор веток при слиянии, выбор языка, оболочки по умолчанию и шрифта в настройках, выбор агента, диалоги рабочих деревьев (worktree), выбор типа агента у новых и восстановленных сессий и последний нативный select в модальной форме. Вместе с ним появилось управление с клавиатуры, которого не было ни у одного из них: стрелки перемещают выбор, Enter выбирает, Escape закрывает список, не закрывая диалог за ним, Home и End прыгают в начало и конец. Два меню в строке состояния ведут себя как раньше, а фильтр по состоянию в боковой панели сохраняет свои галочки — он и правда с множественным выбором.

  • Пароль в панели удалённого доступа можно показать. Это было голое поле пароля, и набранное в нём было не разглядеть; кнопка с глазом существовала, но только внутри файла самой панели подключения. Теперь оба места используют один компонент, а показанное состояние сбрасывается при закрытии панели.

  • Селектор IP больше не выглядит как системный элемент управления. Это был нативный select, который WKWebView оформляет системным образом, и на тёмной панели это смотрелось плохо — та же претензия, что и к заменённым выше выпадающим спискам. Теперь он использует общий компонент, а его подпись сокращена до «IP»: соседний текст и так объясняет, зачем он нужен.

Исправления

  • Проверка обновлений каждый раз действительно спрашивает сервер. Клиент, оставленный работать надолго, залипал на первой увиденной версии: найдя 0.1.101, он продолжал предлагать 0.1.101 и после выхода 0.1.104, а «Проверить обновления» лишь открывало заново тот же диалог, потому что старый код выходил сразу, если уведомление уже висело. Теперь каждая проверка — настоящий запрос. Более новая версия заменяет уведомление на экране, та же самая версия или идущая загрузка оставляют его как есть, а сервер, который вообще не сообщает об обновлении, убирает устаревшее уведомление — версию отозвали или вы тем временем поставили её сами. Кнопка «Скачать вручную» теперь открывает страницу загрузки на сайте; раньше она отдавала собственный пакет механизма обновления, который распаковывается на месте и вручную не устанавливается.

  • Полноэкранный оверлей с ошибкой больше не появляется при быстром уничтожении терминалов. Область просмотра xterm планирует синхронизацию области прокрутки при создании и ещё одну при сбросе и ни ту ни другую не отменяет при уничтожении, поэтому терминал, открытый и закрытый в пределах одной задачи, — а именно это и происходит при перестройке дерева сессий во время удалённого подключения — всё равно выполнял эти callback, находил уже очищенный рендерер и падал с исключением. Исключение прилетает из таймера, куда не дотягиваются ни try/catch, ни граница ошибок, поэтому оно перехватывается глобально и распознаётся узко: проглатывается как безобидный и записывается в журнал запросов только тот стек или то сообщение, которые называют именно эту синхронизацию и вдобавок упоминают рендерер или его размеры. Настоящие сбои по-прежнему поднимают оверлей.

v0.1.104

Последние изменения

ИИ-агенты

  • Карточка дочерней задачи теперь предлагает настоящие модели каждого агента и тот флаг уровня усилий, который этот агент действительно понимает. Карточка собирала аргументы запуска с --model и --effort для всех подряд, но только Claude, Kiro и Antigravity записывают глубину рассуждений именно так — у Grok и Zoo это --reasoning-effort, у Cline — --thinking. Выбор уровня усилий для любого из остальных передавал CLI флаг, о котором тот никогда не слышал, и сессия не запускалась. Теперь каждый агент сам сообщает свои имена флагов и свои допустимые значения. Поле выбора модели следует за тем, что каждый CLI способен о себе рассказать: у тех, кто умеет перечислить свой каталог (OpenCode, Grok, Crush, Antigravity, Cursor, pi, Kiro), список запрашивается и показывается настоящим; у тех, у кого набор фиксирован (Claude, Codex, Kimi Code), показывается этот набор; остальные дают текстовое поле с примером ожидаемого формата. Агент, который не установлен или в котором вы не вошли в аккаунт, так и скажет, а не будет бесконечно крутить индикатор. Выбор «По умолчанию» теперь снимает унаследованное переопределение, а не оставляет прежнее значение на месте, а выбор уровня усилий больше не сбрасывает модель, унаследованную от родительской сессии.

  • Дочерняя задача, запущенная из сессии Kimi Code, остаётся Kimi Code. Kimi Code отсутствовал в списке, по которому при создании дочерней задачи наследуется агент родителя, поэтому её дочерние сессии незаметно поднимались с агентом по умолчанию.

Рабочее пространство

  • Группу можно перевести в рабочее дерево (worktree) уже после её создания. Рабочее дерево выбиралось при создании группы и дальше не менялось; если вы передумали, приходилось удалять группу и собирать её заново. Щёлкните по группе правой кнопкой и выберите «Move to Worktree…», чтобы создать новое рабочее дерево, привязать существующее или перенаправить группу, которая уже к чему-то привязана. Меняется только сама группа: сессии, уже находящиеся внутри, сохраняют тот каталог, с которым были созданы, — работающую сессию нельзя перенести в другой каталог у неё под ногами, — а сессии, созданные после, стартуют в рабочем дереве.

  • Зеркальный режим теперь охватывает всё дерево боковой панели. Раньше он передавал выделение и свёрнутые панели, а строка поиска и фильтры по состоянию и меткам оставались локальными — из тех соображений, что их синхронизация помешает тому, кто в этот момент что-то ищет. Рассуждение было перевёрнутым: зеркалирование означает, что оба окна держат одно и то же состояние, а не что одно повторяет нажатия клавиш другого — включённый здесь фильтр включён и там. По-настоящему мешает как раз то, что две стороны показывают разные деревья. Теперь передаётся каждая проекция боковой панели: раскладка разделения, имя каждой проекции, её строка поиска, её фильтры по состоянию и меткам и её собственное состояние свёрнутости. Формат снимка перешёл на версию 2, и клиент со старой версией прекращает зеркалирование, а не применяет половину кадра, поэтому перезагрузите те окна, которые вы оставили открытыми на время обновления.

Интерфейс

  • Закрытие окна в macOS задаёт тот же вопрос, что и выход из приложения. ⌘Q и пункт меню проходили через собственное подтверждение приложения, а красная кнопка закрытия уничтожала окно сразу — то самое окно, в веб-представлении которого живёт диалог подтверждения. В итоге вы либо не получали подтверждения вовсе, либо видели урезанный системный запасной вариант: без флажка «сохранить рабочее пространство» и с непереведённым текстом. Теперь на всех трёх платформах окно остаётся открытым, пока вы не ответите.

  • Флажок «сохранить рабочее пространство» включён по умолчанию и остаётся там, куда вы его поставили. Потерянная раскладка обходится дороже лишнего снимка, поэтому флажок изначально стоит. Раньше он ещё и забывался: настройка записывалась в базу данных через задержку в 400 мс, а выход убивал процесс внутри этого окна, поэтому следующий запуск сверялся со старым значением и возвращал ваше изменение обратно. Теперь запись сбрасывается на диск до выхода, с потолком в 600 мс, чтобы зависший бэкенд не оставил кнопку подтверждения крутиться. (Вклад FarhadGSRX.)

  • Пароли в панели удалённого подключения можно показать. И у пароля от URL, и у пароля SSH появилась кнопка с глазом, переключающая между скрытым и открытым текстом. Показанное состояние действует только для этого поля и сбрасывается при закрытии панели, поэтому пароль никогда не остаётся висеть на экране.

  • Значок фильтров в боковой панели считает все включённые фильтры. Фильтр по меткам только подсвечивал кнопку, ничего при этом не сообщая, поэтому значок мог показывать 1, когда активны два фильтра. Теперь он считает состояния и метки вместе и совпадает с галочками в выпадающем списке; одиночный фильтр по состоянию сохраняет свою цветную точку.

Исправления

  • Автоматическое обновление в macOS снова работает. Пакеты v0.1.103 несли в себе сопутствующие записи AppleDouble (._VelaTerm.app), у которых механизм обновления отрезает первый компонент пути — и остаётся пустой путь, — после чего он вообще отказывался распаковывать архив. Затронуты обе архитектуры, поэтому каждый пользователь macOS на v0.1.103 застревал на ней. При сборке пакетов такие записи больше не появляются.

  • Системные элементы управления следуют за темой приложения, когда она отличается от системной. Применение темы задавало собственные цвета приложения, но никогда не обновляло color-scheme: это значение один раз бралось при запуске из системной настройки и больше не менялось, поэтому флажки, выпадающие списки и полосы прокрутки оставались тёмными у светлого приложения в тёмной системе. (Вклад FarhadGSRX.)

  • Свежий клон снова собирается. Крейт на Rust встраивает ../dist во время компиляции, а команда для разработки этот каталог не создаёт, поэтому только что склонированный репозиторий не компилировался ещё до того, как его можно было запустить. Сборочный скрипт теперь создаёт каталог, если его нет. (Вклад FarhadGSRX.)

v0.1.103

Последние изменения

Исправления

  • Сессии Codex в Windows больше не отказываются запускаться. Каждая сессия Codex немедленно завершалась с ошибкой unexpected argument '--codex-hook', потому что TOML-таблица хуков жизненного цикла, передаваемая через командную строку, содержит пробелы и двойные кавычки, а установленный через npm codex.cmd повторно разбирает это через cmd.exe, который удаляет кавычки и разделяет значение на несколько аргументов. Теперь в Windows инъекция хуков пропускается; определение состояния возвращается к существующим эвристикам notify / screen / busy, которые по-прежнему сообщают состояния простоя и занятости, хотя и менее точно, чем хуки. macOS и Linux не затронуты и продолжают использовать хуки.

  • Откачено исправление предварительного редактирования IME для Windows из v0.1.102. Исправление, восстановившее оверлей композиции для ввода на китайском, японском и корейском, также добавило ему цвет фона, рамку в 1px и скруглённые углы, из-за чего при наборе в терминале появлялась небольшая рамка вокруг текста предварительного редактирования — чего в терминале быть не должно. Поскольку размеры оверлея, геометрия вспомогательного контейнера и очистка textarea были взаимозависимы, потребовалось откатить всё изменение целиком. Проблема слепого набора CJK в Windows остаётся открытой и отслеживается в issue #6.

v0.1.102

Последние изменения

ИИ-агенты

  • Пресеты агентов: несколько совместимых CLI бок о бок. Каждый тип агента был жёстко привязан к одному исполняемому файлу, поэтому форку, ночной сборке или второму CLI с тем же протоколом просто негде было появиться — приходилось править аргументы запуска у существующего типа и терять исходный. Теперь пресет задаёт собственный исполняемый файл, значок и аргументы запуска и появляется в меню создания сессии рядом со встроенными типами. Сессия запоминает, каким пресетом она создана, поэтому её форк запускается тем же исполняемым файлом, а пресет, созданный в настольном приложении, виден и в сопряжённых браузерах, и в удалённых клиентах — вместе со значком, потому что значок передаётся как данные, а не как путь на одной конкретной машине. Существующие сессии не затронуты: база данных от прежней версии запускается ровно так же, как и раньше.

  • Карточка дочерней задачи выбирает модель и уровень усилий, и один ответ закрывает её везде. Когда агент просит создать дочернюю задачу, карточка подтверждения теперь предлагает модель и — если агент это поддерживает — глубину рассуждений; оба поля заполнены значениями из аргументов запуска родителя, так что в обычном случае достаточно одного щелчка. Если переключить карточку на другого агента, оба значения выводятся заново, поэтому имя модели от одного CLI больше не может попасть в командную строку другого. Карточка появляется на всех подключённых клиентах, и ответ на одном теперь убирает её на остальных; первый ответ вдобавок закрепляет задачу за собой на сервере, так что подтверждение с телефона и с компьютера в одну и ту же секунду создаёт одно рабочее дерево (worktree) и одну дочернюю сессию, а не по два.

Рабочее пространство

  • Зеркальный режим: одна общая раскладка на всех клиентах. Поток терминала всегда был общим — один PTY, один поток байтов, — но всё, что вокруг него, хранилось только в браузерном хранилище каждого клиента, поэтому браузер, открытый по локальной сети, показывал свои собственные вкладки и разделения, а перестановка на одном экране ничего не меняла на другом. При включённом зеркальном режиме вкладки, разделения, активная сессия, выделение в боковой панели и свёрнутые панели публикуются всем клиентам, и все за ними следуют. Переключатель находится у хоста, в панели удалённого доступа. Перестановка с любой стороны действует и на другой; сессия, покидающая раскладку этого окна, отсоединяется, а не завершается, поэтому следование за соседним клиентом никогда не обрывает чужой процесс; а применение чужой раскладки не отбирает клавиатуру у того, кто печатает локально. Телефоны в этом не участвуют — двухуровневая навигация телефона устроена иначе, и переносить на неё дерево разделений с рабочего стола никому не нужно.

  • Вкладка Git в правой боковой панели стала полноценным Git-клиентом. Раньше она только перечисляла изменённые файлы. Теперь она добавляет в индекс и убирает из индекса отдельные файлы и целые группы, отменяет изменения, создаёт коммит (в том числе amend) и показывает историю коммитов с файлами и различиями каждого — всё это разложено по сворачиваемым разделам: в индексе, изменённые, неотслеживаемые и закоммиченные. Пути отсчитываются от корня репозитория, поэтому сессия, открытая в подкаталоге, работает именно с теми файлами, которые показывает, а отсоединённый HEAD так и подписан, вместо ветки с именем HEAD.

Интерфейс

  • ⌘Q теперь задаёт тот же вопрос, что и закрытие окна. Пункт Quit в меню приложения был системным и завершал процесс сразу: нажатие ⌘Q проскакивало мимо подтверждения «сохранить рабочее пространство», которое показывает кнопка закрытия, — одно и то же намерение вело себя по-разному в зависимости от того, как вы его выразили. Теперь оба пути проходят через одно подтверждение. Если окно, которое его показывает, к этому моменту перезагрузилось или упало, повторное нажатие ⌘Q спрашивает снова и переходит к системному диалогу, а не оставляет приложение незакрываемым.

  • Подсказки к горячим клавишам показывают те клавиши, которые действительно работают. Значения по умолчанию различаются от платформы к платформе, а браузер оставляет сочетания ⌘/Ctrl с буквой себе — ⌘D добавляет закладку, ⌘T открывает вкладку, — поэтому на macOS собственные ⌘-сочетания приложения вообще не доходили до страницы, когда VelaTerm открывали по URL. Обычные вкладки браузера теперь используют сочетания с Ctrl+Alt на всех операционных системах, а настольное приложение и окна удалённого подключения сохраняют ⌘. Всплывающие подсказки и подсказка на пустой вкладке показывают действующее сочетание, включая то, которое вы переназначили сами, а не жёстко зашитую комбинацию с ⌘; терминал же перехватывает ровно те сочетания, которые заняло приложение, поэтому при переназначении действия клавиша переезжает вместе с ним.

  • В наборе шрифтов появились Nerd Fonts и CJK, а про свой шрифт, которого нет в системе, приложение честно скажет. В список готовых вариантов добавлены распространённые семейства Nerd Font и CJK, а введённый вручную шрифт теперь отображается обратно и проверяется: если в системе его нет, страница настроек так и говорит, а не подставляет молча шрифт по умолчанию, ничем не похожий на запрошенный.

  • Поля ввода в macOS больше не меняют регистр и не исправляют набранное. Системные автоматическая заглавная буква, автозамена и проверка орфографии применялись ко всем полям приложения, включая имена сессий и поля с командами, где «npm» превращался в «Npm». Теперь всё это выключено везде.

Windows

  • При вводе на китайском, японском и корейском снова видно и предварительный текст, и окно вариантов. Раньше не было видно ни того, ни другого — вы печатали вслепую и видели результат только после Enter. Виноваты оказались два наших собственных правила CSS: контейнер с наложением предварительного ввода схлопывался до нулевой ширины, а смещение right у наложения внутри него превращалось в ничто. Окно вариантов исчезало следом, потому что операционная система располагает его по прямоугольнику наложения. Наложение снова рисуется и оформлено цветами приложения, а невидимое поле ввода, на котором оно держится, по завершении ввода отдаёт свою геометрию, поэтому щелчки и протягивание по этому участку попадают в терминал, а не в пустой элемент, который раньше продолжал его закрывать.

  • Системный заголовок окна следует за светлой и тёмной темой. Приложение оставляет системный заголовок окна, а Windows рисует его светлым, пока ему не скажут иначе, поэтому над тёмным интерфейсом висела белая полоса. Теперь заголовок совпадает с приложением, в том числе у окон, открытых позже, — например у окон SSH и удалённых подключений. Вариант «как в системе» возвращает управление операционной системе, а не закрепляет одно значение.

  • Посторонний квадрат при холодном старте исчез. Плагин единственного экземпляра создаёт скрытое окно для сообщений и никогда не давал ему той прозрачности, которую обещал его собственный стиль, поэтому Windows иногда растягивал окно нулевого размера до минимального и рисовал во время запуска небольшой квадрат. Теперь окно действительно прозрачно; поведение единственного экземпляра не изменилось.

Производительность

  • Удалённый доступ грузит гораздо меньше при первой отрисовке. Статические файлы теперь сжимаются по запросу и отдаются с валидаторами кэша, поэтому при повторном визите они проверяются, а не скачиваются заново, а языковые пакеты и необязательные рендереры терминала загружаются только тогда, когда действительно нужны, а не входят в первую загрузку. Вместе это уменьшает начальную передачу примерно до пятой части от прежней.

Исправления

  • Дочерняя сессия теперь запускается так же, как та, что её попросила. Дочерние сессии не наследовали ни режим разрешений родителя, ни его аргументы запуска, поэтому потомок сессии, работавшей с пропуском подтверждений, поднимался и всё-таки их спрашивал, а закреплённая у родителя модель терялась. Теперь наследуется и то и другое, а при отсутствии значений применяются глобальные настройки по умолчанию для этого типа агента — те же, что подставляет меню «новая сессия агента».

  • Переподключение удалённого окна больше не сообщает о ложной «ошибке аутентификации». При переподключении окна новое WebSocket-соединение и то, которое оно заменяло, состязались друг с другом; закрытие проигравшего подавалось как ошибка аутентификации, и баннер обвинял совершенно исправное сопряжение в том, что его отвергли.

  • Группу больше нельзя перетащить внутрь самой себя. Если бросить группу на один из её собственных потомков, вся эта ветка отрывалась от дерева, и сессии внутри неё пропадали из боковой панели, пока базу данных не чинили вручную. Теперь такое перемещение отклоняется.

  • Вывод агента сохраняет цвета, когда VelaTerm запущен из другого инструмента. Терминал наследует окружение того, кто его запустил, поэтому запуск из IDE или из агентской обвязки, экспортирующей NO_COLOR, CI или FORCE_COLOR=0, делал любой агентский TUI внутри VelaTerm чёрно-белым, хотя терминал заявляет полную поддержку цвета. Эти унаследованные значения теперь отбрасываются при старте сессии; те же переменные, экспортированные из вашего собственного профиля оболочки, по-прежнему действуют, потому что профиль выполняется уже внутри сессии.

v0.1.101

Последние изменения

Удалённый доступ

  • Выбирайте, какой адрес использует ссылка общего доступа — адреса Tailscale теперь отображаются. Список адресов принимал только классические частные диапазоны IPv4, поэтому VPN-сети вроде Tailscale, выдающие адреса из диапазона операторского NAT (100.64.0.0/10), молча выпадали из панели удалённого доступа и ссылки сопряжения — хотя сервер уже был доступен по ним. Теперь эти адреса перечисляются; VPN-туннели стоят в конце списка, чтобы никогда не становиться выбором по умолчанию. Новый селектор IP в панели — доступный до запуска и во время работы — показывает каждого кандидата с именем интерфейса и помечает VPN-туннели; выбор адреса перемещает его URL в начало и заново создаёт ссылку сопряжения именно с этим хостом, так что скопированная ссылка работает на устройстве, которое достигает этой машины только через VPN, без ручного редактирования URL. QR-код под ссылкой сопряжения можно отсканировать телефоном напрямую. Выбор запоминается; если выбранный интерфейс исчезает, панель возвращается к «Автоматически», не забывая его. Сам сервер не изменился и по-прежнему слушает на всех интерфейсах. Выбор адреса, появившегося только после запуска сервера — например, подключившегося позже VPN, — теперь сразу обновляет и копируемый URL, и QR-код, а не только ссылку сопряжения до следующего перезапуска; VPN-туннели на всех платформах стоят после LAN-адресов, адрес, выбранный при остановленном сервере, определяет самую первую ссылку сопряжения после запуска, а перекрывающиеся перегенерации ссылки больше не могут перезаписать более новую ссылку более старой.

  • Общий доступ теперь переживает перезапуск. Раньше токен сопряжения создавался заново при каждом запуске сервера: стоило закрыть и снова открыть VelaTerm, как все выданные ссылки незаметно становились недействительными, и каждый телефон приходилось сопрягать заново. Теперь токен, сопряжённые устройства и список заблокированных устройств сохраняются в файле в каталоге данных, доступном только владельцу: уже сопряжённое устройство после перезапуска подключается по сохранённому URL — пароль доступа остаётся обязательным вторым фактором, — а отозванное устройство остаётся отозванным. VelaTerm также помнит, что общий доступ был включён: закройте приложение при работающем сервере, и при следующем запуске он автоматически поднимется на том же порту — как в настольном приложении, так и на сервере без интерфейса с --serve; если остановить его вручную, ничего не запустится автоматически. Если автоматический запуск не удался, например порт занят, приложение запускается как обычно, а панель удалённого доступа показывает причину. Поле порта теперь запоминает фактически использованный порт вместо возврата к значению по умолчанию, а «Пересоздать ссылку» остаётся явным способом всё отозвать: команда сразу выдаёт новый токен, делает недействительными все старые ссылки и перезаписывает сохранённое состояние. Сам пароль доступа никогда не записывается на диск — хранится только требовательный к памяти хеш (Argon2id).

Безопасность

  • Сопряжённое устройство больше не может управлять самим общим доступом. Любой сопряжённый браузер мог вызывать те же команды управления, что и настольное приложение, — создать новую ссылку для сопряжения (это заодно очищает список заблокированных устройств), просмотреть и отозвать другие устройства, остановить или перенастроить сервер, — а хранилище настроек выдавало каждому клиенту полную карту настроек, включая требовательный к памяти хеш пароля доступа и настройки автозапуска, которые прочитает следующий запуск. Команды управления теперь доступны только настольному приложению и оболочке Electron; API настроек убирает ключи удалённого доступа и токен Gitea из каждого чтения с сопряжённого устройства и отклоняет запись в них. Сопряжённое устройство сохраняет то, ради чего существует сопряжение, — свои терминальные сессии с полным доступом к оболочке, — но больше не может прочитать проверочное значение пароля, пригласить или изгнать другие устройства или подменить порт, который использует следующий запуск. Команды, которые читают, записывают или удаляют сохранённые секреты — токен Gitea и запомненные пароли хостов, — теперь тоже отклоняются для сопряжённого устройства, а команды, принимающие путь, — чтение, предпросмотр, запись, создание, переименование и удаление, а также показ git-диффа файла и выбор папки для клонирования репозитория — сначала разрешают символические ссылки и отклоняют пути внутри собственного каталога данных VelaTerm, где хранятся состояние сопряжения и ключи; любые другие пути работают по-прежнему, так что удалённый просмотр и редактирование файлов остаются доступными. Тест перечисляет каждую удалённую команду, принимающую путь, поэтому новая команда не сможет незаметно обойти эту проверку. Когда одна из этих защит отклоняет запрос, браузер теперь показывает нормально переведённое сообщение вместо необработанной ошибки на английском.

  • Отзыв устройства или перевыпуск ссылки теперь переживает и конфигурацию с двумя экземплярами. На сервере без интерфейса (--serve) с включённым автозапуском два экземпляра сервера держали каждый свою копию сохранённого состояния сопряжения и записывали её целиком: отзыв или новая ссылка, сделанные через один, могли быть незаметно отменены другим. Все экземпляры одного процесса теперь используют единое состояние сопряжения на каталог данных: отзыв и ротация действуют всюду немедленно, и файл записывает ровно один писатель; файл остаётся источником истины между настоящими перезапусками.

  • Повторные неудачные входы ограничиваются. Проверка пароля доступа использует Argon2id — намеренно дорогой алгоритм, — и попытаться может любой, кто дотягивается до порта. После пяти неудачных попыток с одного адреса дальнейшие попытки отклоняются в течение минуты ещё до какой-либо работы с хешем, а само хеширование теперь выполняется вне цикла событий сервера с жёстким пределом одновременных проверок: поток неверных паролей больше не может ни насытить сервер требовательным к памяти хешированием, ни затормозить его для уже подключённых устройств. Ограничитель живёт в памяти и сбрасывается вместе с сервером; настоящей преградой остаются токен сопряжения и пароль. Лимит теперь общий для всех экземпляров сервера, использующих один каталог данных, — конфигурация с двумя экземплярами --serve больше не удваивает бюджет попыток, — а попытка резервируется до начала проверки пароля, поэтому параллельные запросы с одного адреса не могут проскользнуть под лимитом. Ограниченный браузер теперь видит на экране входа отдельное сообщение об ограничении частоты вместо сообщения о неверном пароле; кроме того, ограничение больше не запоминается как неверный пароль: когда пауза заканчивается, следующая попытка снова проходит без перезагрузки страницы. Попытка, брошенная на полпути — вкладка закрыта, пока пароль ещё проверялся, — теперь сразу освобождает свою резервацию, а не числится за адресом до конца минуты; успешный вход освобождает только собственную резервацию, а не стирает всю запись адреса: за общим сетевым адресом чей-то корректный вход больше не сбрасывает бюджет попыток атакующего, и записанные неудачи истекают только вместе со своей минутой.

  • С секретами на диске и в журналах обращение стало аккуратнее. Файл с состоянием сопряжения и ключ сквозного шифрования теперь создаются доступными для чтения только владельцу с самого начала, а не ограничиваются после первой записи; база данных сессий — в ней лежит хеш пароля — также ограничена владельцем. Сервер без интерфейса (--serve) больше не печатает долгоживущий секрет ссылки для сопряжения в журналы: если вывод не терминал, ссылка скрывается и вместо неё выводится подсказка; --print-pairing явно возвращает прежнее поведение. Реестр устройств ограничен 32 записями с именами ограниченной длины, чтобы сопряжённый клиент не мог безгранично раздувать сохранённый файл, а если сохранить отзыв или новую ссылку не удалось, ошибка теперь доходит до вызывающего, а не остаётся строкой в журнале. Автозапуск больше не подменяет сервер, уже запущенный вручную, а устаревшая ошибка автозапуска исчезает, как только вы сами останавливаете сервер.

Исправления

  • Сопряжением теперь можно управлять и из оболочки Electron. Создание ссылки сопряжения, список сопряжённых устройств и отзыв устройства существовали только как команды рабочего стола (Tauri); диспетчер WebSocket, которым пользуются оболочка Electron и браузерные клиенты, отвечал «Unknown command», поэтому панель удалённого доступа там не работала. Теперь все три команды на обоих транспортах проходят через одни и те же основные функции, так что они не могут разойтись, а регрессионные тесты покрывают новые маршруты диспетчера — включая создание настоящей ссылки сопряжения на запущенном локальном сервере.

v0.1.100

Последние изменения

ИИ-агенты

  • Kiro CLI стал полноценным типом сессии. У сессий Kiro появился собственный узел в дереве, достоверный индикатор состояния «работает / ожидает» на основе официальных lifecycle hooks самого Kiro, уведомления о завершении хода, автоматическое возобновление той же беседы при повторном открытии узла, аргументы запуска и переключатель пропуска подтверждений, а также запуск через vspawn — всё то, что уже было у остальных агентов. VelaTerm копирует ваш агент Kiro по умолчанию в собственный агент vlx-term, добавляет в копию lifecycle hooks только для наблюдения и запускает именно её: ваш собственный файл агента не изменяется, а промпт, инструменты и MCP-серверы переносятся без изменений. У Kiro нет hook для запроса разрешений, поэтому во время ожидания вашего подтверждения индикатор остаётся в состоянии «работает».

Исправления

  • Программы, запущенные из терминала, больше не наследуют собственное окружение AppImage (Linux). Загрузчик AppImage направляет PYTHONHOME, PYTHONPATH, PERLLIB, QT_PLUGIN_PATH и пути к плагинам GStreamer во временный каталог монтирования пакета, а каталоги пакета ставит впереди всего остального в PATH и LD_LIBRARY_PATH. Терминал передаёт всё своё окружение запускаемой оболочке, поэтому системный python3 искал стандартную библиотеку внутри пакета и вообще отказывался работать, а другие динамически связанные программы загружали библиотеку из пакета вместо системной. Теперь VelaTerm удаляет эти пути пакета перед запуском оболочки или внешнего инструмента и не трогает значения, заданные вами самими. APPDIR и APPIMAGE остаются видимыми, поэтому программы, проверяющие запуск из AppImage, по-прежнему получают ответ. Затронуты только сборки AppImage; пакет deb, macOS и Windows работают как прежде.

v0.1.99

Последние изменения

Терминал

  • Shift+Enter переносит строку, а не отправляет. В терминалах нет кодировки для Enter с модификатором, поэтому агентские CLI вроде Claude Code и Codex получали обычный возврат каретки и отправляли запрос, пока вы ещё его писали. Теперь VelaTerm передаёт ESC+CR — ту же последовательность, которую эти инструменты ожидают от раскладки iTerm2, поэтому многострочный ввод наконец работает, в том числе в macOS, где собственный обработчик клавиш вообще не устанавливался. Во время набора в методе ввода поведение не меняется: Enter по-прежнему подтверждает вариант.

Проекты и организация

  • Обновление состояния одной сессии. В панели с фильтром по состоянию у сессий появилось действие «Обновить состояние»: оно заново оценивает только эту сессию по условиям самой панели и добавляет либо убирает её, тогда как все остальные остаются на месте. Действие принадлежит той панели, из которой открыто меню, поэтому вложенные разделения никогда не берут фильтр соседней панели. Результат сохраняется отдельно для каждой панели и восстанавливается после перезапуска.
  • Снять метку можно одним щелчком. Повторный выбор уже установленного эмодзи снимает её, поэтому отдельный пункт для снятия и его разделитель убраны. Значок эмодзи с кнопки фильтра тоже убран: подсветка и так показывает, что фильтр по меткам включён, а какой именно эмодзи — видно в меню.

Исправления

  • Интеграция AppImage с рабочим столом Linux устанавливается на любой машине. Вложенный значок был символической ссылкой на абсолютный путь сборочной машины, поэтому Gear Lever, AppImageLauncher и подобные средства не могли его извлечь, хотя само приложение работало нормально. Теперь ссылка относительная. Заявленное требование к glibc также исправлено на 2.35 после измерения не только исполняемого файла, но и поставляемых вместе библиотек; таким образом, самый старый поддерживаемый дистрибутив для настольного приложения — Ubuntu 22.04.

v0.1.98

Последние изменения

ИИ-агенты

  • Grok Build стал полноценным агентом VelaTerm. Устанавливайте, запускайте и возобновляйте Grok 4.5 со стабильными идентификаторами сессий, официальными lifecycle hooks, точными состояниями работы и разрешений, объединёнными расшифровками, сведениями об использовании и официальным значком, который подстраивается под тему в настольном, браузерном и мобильном интерфейсе.

Проекты и организация

  • Разделяйте боковую панель проектов на независимые рабочие представления. Любую панель дерева можно снова разделить вниз; после перезапуска для каждой панели восстанавливаются собственный поиск, фильтры по состоянию и эмодзи, свёрнутые узлы и соотношение размеров. Все панели остаются представлениями одного дерева проектов под управлением backend, поэтому изменения синхронизируются без дублирования бизнес-данных.
  • Помечайте и фильтруйте узлы, не теряя контекст. Проектам, группам и сессиям можно назначать эмодзи-метки. Для помеченного контейнера сохраняется всё поддерево, принадлежность к состояниям остаётся стабильной во время работы, доступны динамическое добавление и ручное обновление, а условия по состоянию и эмодзи объединяются по принципу логического ИЛИ.
  • Создавайте пустой проект прямо на месте. Выберите родительский каталог, проверьте имя, а затем создайте и импортируйте папку в одном процессе. При частичном сбое повторяется только импорт, без создания дубликатов каталогов.

Интерфейс

  • Делитесь VelaTerm там, где находится ваше сообщество. Диалог публикации теперь поддерживает WeChat Moments, Weibo, Xiaohongshu, X, Reddit, Hacker News, LinkedIn, Facebook, Telegram и WhatsApp, включая QR-код для WeChat и предложение поделиться в окне обновления.
  • Даже мелкие действия стали удобнее. Временные вкладки терминала можно переименовать до их сохранения в качестве сессий. В обычных полях ввода отключена автоматическая заглавная буква мобильной клавиатуры, при этом ввод в терминале не изменился.

v0.1.97

Последние изменения

ИИ-агенты

  • Сессии больше не зависают в состоянии «работает». Codex сообщал об активности инструментов и о завершении хода через отдельные короткоживущие процессы, поэтому callback могли приходить в перепутанном порядке, и завершённый ход продолжал отображаться как выполняющийся. Теперь промежуточные сообщения, пришедшие после окончания собственного хода, отбрасываются, а новый hook завершения сессии закрывает случаи, когда сессия заканчивается без события завершения.
  • Прерванные ходы приходят в норму за считаные секунды. При нажатии Esc или ошибке потока ход Claude или Codex завершается вообще без callback о завершении. Теперь шесть секунд полной тишины в терминале тихо переводят такую сессию в состояние ожидания, не показывая уведомление «ответил».

Интерфейс

  • Надёжные сочетания клавиш для разделения в macOS. Разделение вправо (Cmd+D) и вниз (Cmd+Shift+D) теперь зарегистрированы и как команды нативного меню Terminal, поэтому macOS больше не перехватывает сочетание раньше VelaTerm.
  • Одно нажатие — одно сохранение. Cmd+S обрабатывался и глобальным сочетанием, и активным редактором, из-за чего один и тот же файл мог записываться дважды за одно нажатие.

v0.1.96

Последние изменения

ИИ-агенты

  • Состояние Codex определяется lifecycle hooks, а не догадками по терминалу. Современные сессии Codex теперь используют только официальные lifecycle hooks как источник состояния активности. Рукопожатие SessionStart проверяет канал связи, отсутствие callback отображается как «Статус недоступен», а текст или активность терминала больше не могут перезаписать состояния работы, подтверждения или завершения.
  • Более свежие данные об использовании Codex после каждого хода. Панель Info сразу показывает локальный rollout-снимок, сверяет его с актуальными лимитами, ещё раз обновляется после записи Codex итогового token-снимка и игнорирует запоздалые ответы от предыдущей сессии.

Интерфейс

  • Надёжный выбор строк в дереве проектов на macOS. Виртуальные строки больше не зависят от compositor transform, поэтому устаревшие hit-test-координаты WKWebView не направляют наведение, щелчок или перетаскивание на другую строку после прокрутки либо обновления дерева.

v0.1.95

Последние изменения

ИИ-агенты

  • Kimi Code и Zoo Code добавлены в дерево сессий. VelaTerm теперь умеет запускать, возобновлять, устанавливать и настраивать оба агента. Kimi сообщает состояния работы, разрешения и ожидания через официальные lifecycle hooks; Zoo Code сохраняет стабильный идентификатор задачи и использует распознавание терминала при отсутствии внешних hooks.
  • Живое обновление лимитов Codex. Панель Info запрашивает текущие ограничения у Codex app server, сохраняя локальный rollout-снимок как совместимый резервный вариант.

Проекты и терминалы

  • Открывайте проекты командой vela <path>. Пакетные сборки могут установить shell-команду в стиле VS Code. Повторный вызов передаёт проект существующему окну VelaTerm вместо запуска дубликата.
  • Наглядное и отменяемое клонирование Git. Clone Project показывает этап, процент и время, предупреждает о зависании и отменяет всё дерево процессов Git без недоклонированной папки. Учётные данные и query tokens скрываются в ошибках и аудит-логах.
  • WSL-терминалы в Windows. Все установленные дистрибутивы WSL доступны рядом с PowerShell, cmd и Git Bash для обычных терминалов. Сессии агентов остаются в Windows host shell ради надёжности hooks и путей к программам.

Интерфейс и надёжность

  • Более понятное управление фоновыми сессиями. Меню показывает состояние каждой сессии, а диалог превышения лимита позволяет завершить несколько выбранных вкладок сразу.
  • Безопасный жизненный цикл и многоязычные заметки. Перед остановкой активных сессий запрашивается подтверждение; точный lifecycle-ID Codex имеет приоритет над неоднозначным rollout-сканированием; заметки обновления доступны на всех встроенных языках.

v0.1.94

Последние изменения

Локализация

  • Интерфейс на вьетнамском языке. Язык Tiếng Việt теперь доступен в выборнике языков и автоматически выбирается для систем с локализацией на вьетнамский.

Браузер

  • Быстрее загружается встроенный браузер. Теперь у каждой вкладки браузера есть однокликовые ярлыки для ChatGPT, Claude, Gemini и Google. Контекстные меню проектов и групп также могут создавать постоянную страницу браузера непосредственно в той части дерева сессий.

Изображения и документы

  • Надежная вставка пути к изображению в macOS. Когда WebKit не выдает скопированное изображение в виде файла, VelaTerm теперь считывает его из нативной области копирования и всё равно загружает как путь к файлу, вместо того чтобы молча использовать нативный заменитель изображения агента. В удаленных окнах всегда отображается настройка вставки изображения, объясняется, почему требуется режим пути к файлу, и отключается недоступный нативный вариант.

  • Вставка изображений в исходные документы. Теперь исходный редактор принимает изображения из области копирования. Сохраненные Markdown документы хранят их рядом с документом в assets/ и вставляют портабельную Markdown синтаксис изображения; незаконченные черновики встраивают данные изображения, чтобы они не терялись при очистке временных файлов.

Интерфейс

  • Контекстные меню остаются видимыми и указывают на правильный элемент. Меню, открываемые близко к правому краю, корректно измеряются и смещаются. При щелчке правой кнопкой по узлу дерева теперь выделяется только цель меню без изменения существующего выбора, а меню групп включают терминал, ограниченный этой группой.

  • Более чистая обработка текста и метки статуса. Исходный текст больше не отображает шрифтовые лигатуры в виде стрелок для последовательностей, таких как комментарии HTML; проценты использования четко обозначаются как использовано, а нерелевантное нативное контекстное меню WebView хоста больше не появляется за собственными меню VelaTerm.

Исправления

  • Codex остается в обычной истории терминала. Сессии Codex, запускаемые VelaTerm, теперь используют режим встроенного терминала, поэтому нажатие Esc для прерывания или возврата больше не меняет буферы экрана терминала и не перемещает область прокрутки вверх. Ваша собственная Codex конфигурация остается нетронутой.

v0.1.93

Последние изменения

Обновления

  • Узнайте, что изменилось, прежде чем устанавливать. При появлении новой версии теперь в панели статуса и в специальном диалоговом окне отображаются примечания к выпуску этой версии. Вы можете установить обновление сейчас, пропустить эту версию, продолжить загрузку в фоновом режиме или вручную открыть загрузку установщика; прогресс отображается в реальном времени, а приложение перезагружается для завершения установки. Если вы пропустили несколько версий, примечания ко всем им показываются вместе, а не только к последней.

ИИ-агенты

  • Сессии Codex самостоятельно присваивают себе имя. Сессия Codex переименовывается с момента отправки вашего первого сообщения — так же, как это уже происходит с сессиями Claude — поэтому дерево больше не заполняется записями вида "Codex 1", "Codex 2". Имя, введенное вручную, никогда не перезаписывается.

  • vspawn и vopen теперь работают и в Codex. Встроенные навыки vspawn, vspawn-tree и vopen устанавливаются в каталог навыков Codex так же, как и в каталог Claude, поэтому $vspawn <task> и $vopen <file> могут работать из сессии Codex.

  • Более надежное возобновление работы Codex. Запись Codex разговора для последующего возобновления больше не зависит от фиксированного таймера, поэтому она всё равно работает, даже если вы сделаете паузу перед вводом первого сообщения; кроме того, две Codex сессии, запущенные в одной папке, больше не могут быть связаны между собой через общий разговор.

  • Использование модели и контекста для Codex. Панель информации теперь отображает текущую модель, объем использования окна контекста и инструмент, используемый в текущей Codex сессии, так же, как это уже делалось для Claude, с данными, получаемыми в реальном времени из информации сессии.

Удаленные сессии и терминал

  • Перепроектированный удаленный браузер файлов. Выборник папок для удаленных сессий теперь поддерживает поиск по мере ввода, переход по пути (с использованием ~), навигацию вверх/домой/последние папки и встроенную команду «Новая папка».

  • Ссылки открываются на вашем собственном компьютере. Щелчок по ссылке в терминале — включая ссылку на вход в агента — теперь открывается в вашем локальном браузере, включая удаленные окна.

  • Опция «Повторное использование удаленной базы данных» спрятана. Она появляется только при нажатии клавиш Option/Alt на кнопку «Подключиться к удаленному серверу»; обычный щелчок всегда подключается к независимой базе данных.

Исправления

  • Инструменты находятся при запуске из Dock. Запуск VelaTerm из Dock или Finder больше не оставляет его в упрощенном режиме PATH, поэтому git и другие инструменты, установленные через Homebrew и необходимые агентам, находятся в правильном месте.

  • Новые терминалы открываются в нужной папке. Создание терминала из проекта или группы в боковой панели теперь открывает его в каталоге этого узла, а не использует папку последней активной сессии.

v0.1.92

Последние изменения

Исправления

  • Больше нет ложных предупреждений о «потере связи SSH». Раньше монитор туннеля считал завершение дочернего процесса порт-форвардинга потерей связи, отображал красный баннер и восстанавливал туннель. На самом деле слушатель форвардинга находится в процессе ControlMaster, поэтому форвардинг продолжает работать даже после завершения дочернего процесса — терминал оставался полностью работоспособным, в то время как интерфейс сообщал о потере связи, а повторное создание туннеля бесполезно разрушало работающее соединение.

Теперь связь проверяется в два этапа: когда дочерний процесс завершается, VelaTerm сначала проверяет, есть ли слушатель на локальном порту форвардинга. Если он есть, ничего не происходит. Только когда порт тоже исчезает, связь считается потерянной и восстанавливается. Красный баннер также сглаживается — он появляется только после неудачной первой попытки восстановления, поэтому временные сбои, проходящие за несколько секунд, больше не вызывают предупреждений.

Настоящие разрывы соединения всё равно восстанавливаются автоматически. Если процесс ControlMaster завершается или сеть отсутствует в течение длительного времени, туннель воссоздаётся автоматически; после исчерпания попыток повторной связи на экране появляется сообщение "SSH link is down", и функция Reconnect восстанавливает сессию — удалённые процессы продолжают работу и продолжают выполнение с того места, где остановились.

v0.1.91

Последние изменения

Первая публичная версия. Всё, что указано ниже, входит в эту версию.

Агенты ИИ как полноценные компоненты

  • Встроенная поддержка девяти агентов — Claude Code, Codex, OpenCode, Copilot CLI, Cursor CLI, Cline, Pi, Antigravity (Gemini CLI) и crush. При создании сессии выбирается тип агента, и он запускается готовым к работе.

  • Статус агента сообщается напрямую, а не предполагается. VelaTerm при запуске встраивает официальные механизмы обратного вызова каждого поставщика (хуки для Claude, notify для Codex, плагин для OpenCode и т. д.), поэтому любое изменение состояния сразу же передаётся обратно. Дерево сессий показывает точку статуса для работающих сессий, сессий, ожидающих действий, и завершённых, но невидимых сессий; боковая панель позволяет фильтровать по статусу, а панель статуса отображает актуальную статистику.

  • Системные уведомления появляются, когда агенту требуется решение по разрешению или когда он завершает задачу, а нажатие на уведомление сразу переносит пользователя в соответствующую сессию. Обнаружение экрана служит альтернативой для случаев, когда нет механизма обратного вызова.

  • Беседы сохраняются при любых ситуациях. Собственный идентификатор сессии каждого агента сохраняется, поэтому закрытие сессии, перезапуск приложения или восстановление архивированной сессии позволяют возобновить первоначальную беседу — после проверки её существования. Claude Code, Codex и Pi также могут разделить текущую беседу на параллельную сессию.

  • Сессии могут создавать новые сессии. Подзадачи превращаются в дочерние сессии, создаваемые самим агентом или пользователем, при необходимости в изолированной рабочей деревушке git, что позволяет нескольким агентам одновременно работать над одним и тем же репозиторием. Графическое окно для слияния воссоединяет ветки после завершения работы.

  • Для отсутствующих агентов показывается карточка с инструкцией по установке, рекомендуемой командой и возможностью одним кликом установить их, после чего происходит автоматическое обнаружение пути. В боковой панели отображаются лимиты использования Claude и Codex, а любую беседу можно просматривать на месте или экспортировать в полный текстовый отчёт Markdown.

Организация сессий

  • Трёхуровневое дерево — проект, группа, сессия — с неограниченным вложением групп и дочерними сессиями внутри сессий. Узлы можно свободно перетаскивать, а сохранённое состояние сохраняется при перезапуске.

  • Любую поддерево можно архивировать: скрыть в панели архива без удаления данных, восстановить в любое время и продолжить беседу.

  • Поиск контента во всей системе (⌘⇧F) осуществляется с использованием индекса SQLite FTS5 и охватывает как текстовые записи агентов, так и вывод из терминала; слева отображается дерево результатов, справа — предварительный просмотр с ссылками, а также возможность навигации между сессиями.

Настоящий терминал в первую очередь

  • Настоящий PTYs (portable-pty, из wezterm), благодаря чему vim, htop и собственные интерфейсы TUI агентов работают именно так, как должны.

  • Множество вкладок с произвольным разделением экрана — каждая вкладка имеет собственное дерево разделения, которое можно разделить горизонтально или вертикально по желанию.

  • Цикл жизни вкладок в стиле браузера: вкладки на фоне остаются активными, их процессы продолжают работать; лимит активных вкладок можно настроить, и при его превышении удаляется старейшая неактивная сессия. Закрытие вкладки приводит к завершению процесса.

  • Ввод данных остаётся отзывчивым даже при высокой нагрузке благодаря расписанию ввода по приоритетам и объединению кадров вывода — агент, заполняющий экран, больше не занимает клавиши.

  • Поиск внутри терминала (⌘F), запись и воспроизведение сессий, возможность вставки или перетаскивания изображений непосредственно в агента, а также свободная переключаемость между cmd, PowerShell и Git Bash на Windows.

За пределами терминала

  • Можно запустить vopen <file> в любой сессии, чтобы открыть вкладку с документом рядом с терминалами: Markdown открывается как редактор WYSIWYG и экспортируется в векторный формат PDF, изображения открываются в встроенном просмотрщике, а исходные файлы получают подсветку синтаксиса.

  • Встроенная вкладка браузера может использоваться в качестве временной вкладки или закрепляться в дереве проекта в качестве постоянного узла.

Удалённая работа и многоканальность

  • Десктопное приложение предоставляет ту же интерфейс через веб, обмениваясь одним актуальным набором сессий. Выходные данные передаются всем клиентам в реальном времени, и любой из них может вводить данные — десктопная и браузерная версии видят и управляют одним и тем же терминалом.

  • Конечно-конечное шифрование с использованием алгоритма NaCl на уровне каждого кадра, парирование через QR-код или ссылку, а также управление по устройству, включая индивидуальное отзыв разрешений.

  • Режим без графического интерфейса: --serve запускает ту же службу на сервере без GUI, готовом к подключению браузера.

  • Удалённые подключения через SSH добавляют удалённые машины в ваше дерево. VelaTerm подключается напрямую с десктопа, разворачивает лёгкий сервер vela-server на удалённой стороне, и удалённые сессии ведут себя как локальные. Туннель сам восстанавливается и воссоединяется.

  • Мобильные устройства: приложение включает в себя мобильную версию веб-интерфейса, а также корневую оболочку нативного приложения (отрисовка с использованием xterm с нативным вводом и панелью функций).

Платформа и дизайн

  • macOS, Linux и Windows.

  • Автоматические обновления с сертифицированными версиями macOS.

  • Темы светлого и тёмного цвета автоматически подстраиваются под систему, а сессии агентов уведомляются о смене темы через стандартное уведомление терминала (DEC 2031) — цвета интерфейса TUI меняются мгновенно без необходимости перезапуска.

  • По умолчанию английский язык, плюс 10 языков, предустановленных в соответствии с настройками системы.

Каждая версия поставляется с автоматическими обновлениями — VelaTerm сама предложит самую новую версию. Скачайте её сами с страницы загрузки.