Skip to content

Releases: smixs/iva-agent

v0.3.28

Choose a tag to compare

@smixs smixs released this 19 Aug 03:15
  • 🧹 Апдейт чистит за собой - на диске остаются текущая версия и одна для отката, всё остальное убирается. Перед сборкой новой версии остаётся только текущая: сборка занимает слот отката, и в пике на диске две версии (по ~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 в .env Intl принимал, а systemd в OnCalendar=*-*-* 05:00:00 europe/moscow отвергал, и ночной таймер не поднимался. Валидатор отдаёт то, во что Intl зону разрешает: Europe/Moscow, алиасы канонизируются (US/PacificAmerica/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

Choose a tag to compare

@smixs smixs released this 17 Aug 18:47
  • 🔌 MCP-серверы плагина, оба транспорта - streamable-http и sse из mcp.json превращаются в сгенерированный connection eve mcp-<имя>--<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: env IVA_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. Заодно: CLI iva plugin разложен по модулям, ни одна команда не изменилась, а на dev-чекауте add и remove кодового плагина больше не обещают сборку, которой там не было, и честно говорят, что версию тут никто не собрал.

v0.3.26

Choose a tag to compare

@smixs smixs released this 17 Aug 12:28
  • 🛒 Плагины по имени из 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

Choose a tag to compare

@smixs smixs released this 17 Aug 11:02
  • 📰 Ива читает 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

Choose a tag to compare

@smixs smixs released this 16 Aug 18:21
  • 🛡 Обрыв в неудачный момент больше не портит данные - карточки памяти, настройки и служебное состояние пишутся атомарно и с fsync. Убитый процесс или пропавшее питание оставляют старый файл или новый, но никогда пустой или полубитый.
  • 📨 Telegram-мост не теряет сообщения - у опроса один владелец, входящие переживают сбой в durable-очереди, кнопки не подтверждаются, пока действие реально не выполнено. Ложное «✅» невозможно.
  • 🔄 Обновление можно убить в любой точке - установка либо остаётся на старой версии, либо доезжает до новой; следующий запуск дочищает хвосты. Откат - переключение символической ссылки, без сети и пересборки.
  • 📂 У всех процессов один каталог данных - CLI, агент, мост, ночная обработка и их дочерние процессы считают путь одной формулой. Кривой конфиг - явная ошибка, а не тихое раздвоение памяти на два дерева.
  • 🔒 Меню и настройки работают только в личном чате - /menu, /model, /think и их кнопки в группе вежливо отказывают.
  • 🧾 Битый файл сохраняется, а не затирается - повреждённая история health и нечитаемая карточка остаются байт-в-байт на диске, приходит алерт. Таймзона и context window проверяются на входе; отсутствующий CORE.md - нормальный старт, а не падение.
  • 📝 Инструкции агента переписаны - базовый английский текст вместо накопленной стены правил капсом. Все несущие правила сохранены, язык ответов агента настраивается как раньше.

v0.3.23

Choose a tag to compare

@smixs smixs released this 16 Aug 06:54
  • Разовое напоминание больше не теряется молча - напоминание идёт через новую команду iva remind: в момент срабатывания агент проверяет по задачам, актуально ли оно ещё, и сам формулирует сообщение. Доставку делает код с повторными попытками при сбоях сети и Telegram. Мозг занят или недоступен - придёт исходный текст с ⏰. Ошибка доставки видна в журнале, а не проглатывается.
  • 🧩 Свой скилл работает сразу - файл, положенный в data/custom/agent/skills/, агент видит со следующего хода: без пересборки и без рестарта. Убрали файл - скилл исчез. Накладные расходы - 26 мс на ход при 20 скиллах.
  • 📚 Термины записаны - Reminder описан в CONTEXT.md: это прямое исполнение просьбы пользователя, не Report и не Alert, тумблеры уведомлений его не выключают. Plugin описан в ADR-0008. Философия проекта переписана как рабочие инструкции для агентов.

v0.3.22

Choose a tag to compare

@smixs smixs released this 15 Aug 07:51
  • 🔧 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

Choose a tag to compare

@smixs smixs released this 15 Aug 02:51
  • Зависший ход можно остановить - кнопка «Стоп» работает через открытый интерфейс движка и снова работает в режиме webhook. Долгий ход больше не обрывается по таймауту: агент сообщает, что ещё работает. Бот отвечает на /start.
  • Поиск по памяти быстрее в 15 раз - индекс строится один раз и обновляется только при правках. Ночная обработка считает только изменённые карточки, а не весь архив. Карточка с необычными символами пропускается с предупреждением, а не портится.
  • 🔧 Опечатка в MODEL_PROVIDER больше не включает чужой конфиг молча - агент отказывает одной строкой с четырьмя правильными именами. Мастер, доктор, меню и обновление ведут к починке. Пустое значение - тоже отказ. Взят PR #171, авторство сохранено.
  • 📦 Повторный запуск установщика стал дешёвым - готовые шаги пропускаются, падение откатывается на любом пути выхода. Копия .env не попадает в /tmp. Правки пользователя не теряются. Два установщика разом не запускаются.
  • 🛡️ Описание присланной картинки проходит фильтр защиты - текст на картинке больше не идёт агенту как команда. Документация о защите приведена к правде: сказано прямо, что фильтруется, а что нет.

v0.3.20

Choose a tag to compare

@smixs smixs released this 14 Aug 00:14
  • 🔔 Утренние отчёты памяти больше не приходят без спроса - ночная свёртка пишет 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

Choose a tag to compare

@smixs smixs released this 12 Aug 09:05
  • 🔔 «Собираю Iva» больше не висит навсегда - обновление через Telegram снова присылает «✅ Iva обновлена». Причина найдена живым прогоном: индикатор фазы уходил в сеть после финала и затирал его. Теперь фазовый статус ждёт отправки до начала сборки. Итог обновления доставляет мост после рестарта. Итог хранится в файле задания, а не в памяти умирающего процесса. Ложное «✅» невозможно: мост молчит, пока установка не завершила переезд. Провал редактирования сообщения пишется в журнал и уходит новым сообщением. Полная гарантия действует со следующего обновления: первую половину всегда выполняет код старой версии.