Releases: smixs/iva-agent
Releases · smixs/iva-agent
Release list
v0.3.28
- 🧹 Апдейт чистит за собой - на диске остаются текущая версия и одна для отката, всё остальное убирается. Перед сборкой новой версии остаётся только текущая: сборка занимает слот отката, и в пике на диске две версии (по ~400 МБ), а не три. В финише удаление старых версий идёт первым шагом - до
npm i -g @googleworkspace/cli@latest, который сам качает на тот же диск; упавший шаг уборки его больше не отменяет.iva doctorпод замком обновления сносит остатки прерванных сборок и лишние версии сам, без флага, и печатаетversions on disk: N (current …, rollback …) - X GB free; при живом обновлении говорит «version cleanup skipped», при повреждённомactive.jsonдокладывает и ничего не трогает. Уборка перед сборкой работает начиная со следующего обновления после этого:iva updateбежит на установленном CLI. Повод - тестовый дроплет на 8.7 ГБ, вставший на трёх копияхnode_modules(#194). Вdocs/troubleshooting.mdраздел «Disk full during update», в install - честная строка про диск. - 📦 Продвинутый runtime едет со всеми исходниками - стабильный снимок runtime копировал
agent/иscripts/руками,packages/в него не попадал, и на установке с непустым custom-слоем агент умирал с[UNRESOLVED_IMPORT]наagent/lib/data-dir.tsв цикле рестартов. Список деревьев теперь один -RUNTIME_SOURCE_TREES, снимок и replica-smoke берут его целиком, дайджест раскладки поднят до v3, так что уже подготовленный безpackages/runtime пересобирается сам. Тест-страж резолвит каждый импорт этих деревьев и падает на дереве, которое снимок бы потерял (#192, #191). - 🕒 Таймзона в каноническом написании -
europe/moscowв.envIntl принимал, а systemd вOnCalendar=*-*-* 05:00:00 europe/moscowотвергал, и ночной таймер не поднимался. Валидатор отдаёт то, во что Intl зону разрешает:Europe/Moscow, алиасы канонизируются (US/Pacific→America/Los_Angeles); property-тесты закрепляют идемпотентность и нечувствительность к регистру и пробелам (#190). - 👁️ Vision-модель на каждого провайдера - вместо константы в коде свои переменные в
.env, пустая = дефолт провайдера:OLLAMA_VISION_MODEL(gemma4:31b),OPENCODE_VISION_MODEL(qwen3.7-plus),OPENROUTER_VISION_MODEL(google/gemini-2.5-flash); у Codex переменной нет - подписка мультимодальна.iva configспрашивает vision-модель сразу после текстовой и пишет рядом с*_MODEL. Дефолт для OpenCode Go выбран по живым прогонам 18.08:gpt-5.6-lunaна любую картинку отвечает 400,minimax-m3заворачивает ответ в<think>прямо вcontent,qwen3.7-plusдаёт чистое описание с OCR за 4-6 секунд. - 💬 Три фикса Telegram - кнопка Stop только в личке: в группах её колбэк отвергается с прошлого релиза, а кнопка висела мёртвой. Сообщения, накопленные за время rolling-апдейта, проходят inbound-гейт с тем же предупреждением модели и той же строкой
[security] inbound flagged, что и свежие - раньше вердикт игнорировался. Проза, похожая на плейсхолдер кода (цена 50 долларов, таблицы с выровненными числами), больше не вырезается из HTML-ответа: плейсхолдер ушёл в Private Use Area, снаружи такие кодпоинты вычищаются, seeded property-тест гоняет цифры с пробелами и code-span вперемешку.
v0.3.27
- 🔌 MCP-серверы плагина, оба транспорта -
streamable-httpиsseизmcp.jsonпревращаются в сгенерированный connection evemcp-<имя>--<server>, а заголовки${VAR}подставляются в момент вызова изdata/custom/plugins/<имя>.env, так что токен в сборку не попадает.stdioподнимается юнитомiva-mcp-<имя>-<server>.service, а перед ним стоит свой MCP proxy Ивы (services/mcp-proxy/,@modelcontextprotocol/sdk): агент ходит на127.0.0.1:<порт>/mcpс bearer, токен лежит вdata/plugin-data/<имя>/mcp-<server>.tokenс режимом 0600. Сервер видит толькоPATH,HOME,PLUGIN_ROOT,PLUGIN_DATA, свой env изmcp.jsonи<имя>.env- из окружения агента ему не достаётся ничего. Появился второй тумблерtrusted:iva plugin trust | untrust, аaddпечатает процессы и спрашивает «Запускать эти процессы на этой машине? [y/N]» (--trustотвечает «да» сразу, запуск без терминала - «нет»). Порты выдаются от 8730, один раз и до удаления плагина. Проверено насквозь на настоящем stdio-сервере и настоящем клиенте из SDK, а не на заглушках. - 🧩 Сервисы плагина -
sh.iva/services/<svc>/service.jsonс{command,args,port}становится юнитомiva-plugin-<имя>-<svc>.service: envIVA_SERVICE_PORT,IVA_DATA_DIR,PLUGIN_ROOTиPLUGIN_DATA, рабочий каталог - папка сервиса, старт только при enabled и trusted.iva plugin updateперезапускает юниты плагина, у которого поменялась начинка;iva updateподнимает их сразу после переключения версии;iva doctorперечисляет юниты, показываетis-activeи стучитсяGET /healthв каждый MCP proxy.sh.iva/теперь двух видов: eve Extension (sh.iva/package.json, собирается в версию) и сервисы (версию не пересобирают никогда). - 🛒 Marketplace по умолчанию заработал:
smixs/iva-plugins- список живёт на github.com/smixs/iva-plugins, в нём два плагина.trace- вьюер журнала: схема Ивы с подсвеченным путём хода, лента ходов, повтор хода на скоростях ×1, ×2 и ×4, плитки за сегодня, 7 и 14 дней; слушает только loopback, аiva trace openпечатает готовую команду ssh-туннеля.hello- демо-плагин с кодом для авторов: один скилл, один тул. Ставится в три шага:iva plugin add trace,iva plugin trust trace,iva trace open. Проверено вживую по публичному списку:list --available,add traceс пином на sha,update,remove. - 📖 Дока про плагины -
docs/plugins.md(по-русскиdocs/ru/plugins.md): что такое плагин, как поставить (папка,owner/repo[/subdir][@ref], git-URL или имя из Marketplace), чем enabled отличается от trusted, что делает с плагинамиiva update, как написать свой (скиллы, Extension вsh.iva/,mcp.json, сервисы) и чем вы при этом рискуете; вSECURITY.mdпоявился раздел Plugins. Заодно: CLIiva pluginразложен по модулям, ни одна команда не изменилась, а на dev-чекаутеaddиremoveкодового плагина больше не обещают сборку, которой там не было, и честно говорят, что версию тут никто не собрал.
v0.3.26
- 🛒 Плагины по имени из Marketplace -
iva plugin add traceнаходит плагин в списке.agents/plugins/marketplace.json(конвенция Codex: строка-путь илиlocal | url | git-subdir,npmиpolicyпропускаются вслух) и ставит его тем же путём, что папку или git-URL.iva plugin marketplace add | remove | listведут свои списки,iva plugin list --availableпоказывает, что ещё не стоит; список по умолчанию -smixs/iva-plugins. Список кэшируется вdata/marketplace-cache/, без сети берётся кэш с пометкой «может быть устаревшим». Толькоhttps://,ssh://иgit@host:-file://и локальные пути из чужого списка не принимаются; git плагинов не ждёт пароль в терминале. Имя в двух списках - отказ с подсказкойadd <имя>@<список>. - 🧱 Код плагина собирается в версию - плагин с eve Extension под
sh.iva/теперь строится по рельсам обновления: копия в версию,npm ci,eve extension buildтем же eve, что запускает Иву, mount со своим namespace, проверка старта, переключение, рестарт. Конфиг плагина читается изdata/custom/plugins/<имя>.config.jsonна старте, не зашивается в сборку. Сборка не удалась приadd | update | enable- установка откатывается, работающая версия не тронута; приiva update- версия собирается без этого плагина, он выключается, приходит один Alert с командой, что делать.iva doctorговорит, собран ли код каждого плагина в текущую версию. Проверено на живом eve 0.30.8, не только на заглушках. - 🔎
iva traceчитает журнал хода -iva trace tailпоказывает события живьём (--since N- последние N строк),iva trace show- последние 20 ходов,iva trace show <turn_12 | tg:<чат>:<сообщение> | id сессии | last>- один ход с шагами, инструментами и субагентом (--fullбез обрезки,--jsonсырые строки),iva trace openпечатает адрес вьюера и готовую команду ssh-туннеля. Управляющие символы из содержимого в терминал не попадают. В контрактеdocs/trace.mdуточнено, как собирать ночные ходы: внутри одной сессии ходы делитturn_N, строка без ключа хода принадлежит последнему открытому ходу сессии.
v0.3.25
- 📰 Ива читает rich-посты Telegram - лонгриды из нового редактора (
rich_message: заголовки, списки, таблицы, цитаты, коллажи, подписи к медиа) раньше приходили пустыми: полеtextу них пустое, содержимое лежит в блоках. Теперь текст читается целиком и по порядку, фото и видео из любых блоков идут в обычный медиа-конвейер (не больше 10 за сообщение, остальное - явной строкой), усечение видно. Работает везде, где читается текст: одиночное сообщение, альбом, форвард, цитируемое сообщение, подпись к медиа. Обычные сообщения не тронуты. Дыру показал PR #189 контрибьютора Basilcheer. - 🧩 Плагины ставятся из терминала -
iva plugin add <папка | owner/repo[/subdir][@ref] | git URL>кладёт плагин формата Agent Plugins 1.0.0 вdata/custom/plugins/и записывает вdata/custom/plugins.json; его скиллы работают со следующего хода - без сборки и рестарта.iva plugin list | remove | update | enable | disable | syncими управляют, уiva doctorпоявился раздел Plugins. Ставит только владелец из терминала: ни команды в Telegram, ни инструмента у модели (ADR-0009). Обновление отказывает, если дерево плагина изменилось под ногами. Код плагина и MCP-серверы пока только читаются и показываются, сборка - следующим патчем. - 🧾 Журнал хода -
data/trace/YYYY-MM-DD.jsonl: каждый ход от моста до Outbox - allowlist, вердикты гейтов, части контекста, шаги модели, вызовы инструментов, субагенты, доставка - одна JSON-строка на событие. Хранится 14 дней, содержимое обрезается и выключается тумблеромcaptureContentвdata/settings.json. Формат описан вdocs/trace.md(RU:docs/ru/trace.md) и зафиксирован ADR-0010. Читалкаiva traceи вьюер-плагин идут следующим патчем.
v0.3.24
- 🛡 Обрыв в неудачный момент больше не портит данные - карточки памяти, настройки и служебное состояние пишутся атомарно и с fsync. Убитый процесс или пропавшее питание оставляют старый файл или новый, но никогда пустой или полубитый.
- 📨 Telegram-мост не теряет сообщения - у опроса один владелец, входящие переживают сбой в durable-очереди, кнопки не подтверждаются, пока действие реально не выполнено. Ложное «✅» невозможно.
- 🔄 Обновление можно убить в любой точке - установка либо остаётся на старой версии, либо доезжает до новой; следующий запуск дочищает хвосты. Откат - переключение символической ссылки, без сети и пересборки.
- 📂 У всех процессов один каталог данных - CLI, агент, мост, ночная обработка и их дочерние процессы считают путь одной формулой. Кривой конфиг - явная ошибка, а не тихое раздвоение памяти на два дерева.
- 🔒 Меню и настройки работают только в личном чате -
/menu,/model,/thinkи их кнопки в группе вежливо отказывают. - 🧾 Битый файл сохраняется, а не затирается - повреждённая история health и нечитаемая карточка остаются байт-в-байт на диске, приходит алерт. Таймзона и context window проверяются на входе; отсутствующий
CORE.md- нормальный старт, а не падение. - 📝 Инструкции агента переписаны - базовый английский текст вместо накопленной стены правил капсом. Все несущие правила сохранены, язык ответов агента настраивается как раньше.
v0.3.23
- ⏰ Разовое напоминание больше не теряется молча - напоминание идёт через новую команду
iva remind: в момент срабатывания агент проверяет по задачам, актуально ли оно ещё, и сам формулирует сообщение. Доставку делает код с повторными попытками при сбоях сети и Telegram. Мозг занят или недоступен - придёт исходный текст с ⏰. Ошибка доставки видна в журнале, а не проглатывается. - 🧩 Свой скилл работает сразу - файл, положенный в
data/custom/agent/skills/, агент видит со следующего хода: без пересборки и без рестарта. Убрали файл - скилл исчез. Накладные расходы - 26 мс на ход при 20 скиллах. - 📚 Термины записаны - Reminder описан в CONTEXT.md: это прямое исполнение просьбы пользователя, не Report и не Alert, тумблеры уведомлений его не выключают. Plugin описан в ADR-0008. Философия проекта переписана как рабочие инструкции для агентов.
v0.3.22
- 🔧
ivaбольше не переставляет PATH дочерним процессам - папка Node уже есть в PATH, значит второй раз она не дописывается. Раньше системный/usr/binвставал впереди путей вызывающего, и тест дотягивался до живогоsystemctlвместо своей заглушки. Взят PR #177 контрибьютора natakkapolet-hash, авторство сохранено. - 🧠 Мастер больше не записывает hybrid без ключа эмбеддингов - ключа нет и другого источника нет, значит поиск памяти остаётся на бесплатном BM25, а мастер говорит об этом одной строкой. Доктор берёт решение из того же резолвера, что и рантайм, и называет в предупреждении все три источника:
JINA_API_KEY,DEEPINFRA_API_KEY,MEMORY_EMBED_URL. Закрывает issue #180.
v0.3.21
- ⏹ Зависший ход можно остановить - кнопка «Стоп» работает через открытый интерфейс движка и снова работает в режиме webhook. Долгий ход больше не обрывается по таймауту: агент сообщает, что ещё работает. Бот отвечает на /start.
- ⚡ Поиск по памяти быстрее в 15 раз - индекс строится один раз и обновляется только при правках. Ночная обработка считает только изменённые карточки, а не весь архив. Карточка с необычными символами пропускается с предупреждением, а не портится.
- 🔧 Опечатка в
MODEL_PROVIDERбольше не включает чужой конфиг молча - агент отказывает одной строкой с четырьмя правильными именами. Мастер, доктор, меню и обновление ведут к починке. Пустое значение - тоже отказ. Взят PR #171, авторство сохранено. - 📦 Повторный запуск установщика стал дешёвым - готовые шаги пропускаются, падение откатывается на любом пути выхода. Копия
.envне попадает в /tmp. Правки пользователя не теряются. Два установщика разом не запускаются. - 🛡️ Описание присланной картинки проходит фильтр защиты - текст на картинке больше не идёт агенту как команда. Документация о защите приведена к правде: сказано прямо, что фильтруется, а что нет.
v0.3.20
- 🔔 Утренние отчёты памяти больше не приходят без спроса - ночная свёртка пишет vault молча. Отчёт в Telegram включается в
/menu→ 🔔 Уведомления. Там же тумблер утреннего дайджеста. Тумблер применяется той же ночью, без перезапуска. Установка, которая отчёт получала, один раз услышит, где его вернуть. Свежая установка не услышит ничего. Установка 0.3.9 и старше без следов прежних прогонов не услышит тоже - отчёты просто замолчат. - 🗣️ Iva больше не говорит наполовину по-английски - язык любого своего сообщения она берёт из одного места: настройка языка, потом
AGENT_LANGUAGE. Это касается ночного отчёта, алертов brain и предложения обновиться. Отчёт стал человеческой запиской на 3-5 строк. Внутренних слов вроде SUPERSEDE в нём больше нет. - 📨 Отчёт и дайджест приходят одним сообщением, а не двумя - плановый ход отдаёт текст, доставку делает код. Правило записано и в промптах обоих ходов, и в системном блоке инструкций: rich message в них запрещён.
- 🚨 Алерты стали полезными - каждый говорит, что сломалось, чем это грозит и что сделать. Одна и та же проблема не повторяется чаще раза в неделю. Изменилась проблема или вернулась после починки - алерт придёт сразу. Битое состояние дросселя алерт не заглушает, сломанное ядро - тоже.
- 🌐 Предложение обновиться по умолчанию приходит по-русски - раньше без настроек оно было английским, теперь язык берётся из общего резолвера: настройка языка, потом
AGENT_LANGUAGE, потом русский. - 📚 Термины записаны - Notice, Report и Alert описаны в CONTEXT.md. Решение записано в ADR-0007.
v0.3.19
- 🔔 «Собираю Iva» больше не висит навсегда - обновление через Telegram снова присылает «✅ Iva обновлена». Причина найдена живым прогоном: индикатор фазы уходил в сеть после финала и затирал его. Теперь фазовый статус ждёт отправки до начала сборки. Итог обновления доставляет мост после рестарта. Итог хранится в файле задания, а не в памяти умирающего процесса. Ложное «✅» невозможно: мост молчит, пока установка не завершила переезд. Провал редактирования сообщения пишется в журнал и уходит новым сообщением. Полная гарантия действует со следующего обновления: первую половину всегда выполняет код старой версии.