Skip to content

Releases: KentoGasai/LexiQode

LexiQode 0.2.6

Choose a tag to compare

@KentoGasai KentoGasai released this 29 Oct 08:11

LexiQode 0.2.6

Скачайте LexiQode-0.2.6-win32-x64.zip, распакуйте куда угодно и запустите
LexiQode.exe. Ничего не устанавливается, права администратора не нужны. Сверьте
скачанное с файлом .sha256, приложенным рядом. Настройки и данные лежат вне папки
программы, поэтому распаковка поверх прежней версии их не трогает.

Это патч к 0.2.5: два способа, которыми ход заканчивался без единого слова на экране,
и цикл, который защита перестала замечать. Все три найдены в сохранённых разговорах,
а не предположены.

Что исправлено

Зацикливание перестало замечаться: считались только вызовы подряд

В 0.2.5 защита была намеренно сужена до подряд идущих одинаковых вызовов, чтобы не
останавливать ходы, которые действительно работают: тест → правка → тест. Сужение
оставило без защиты ровно тот цикл, на который вы жалуетесь, и это видно в
сохранённых разговорах: в одном чате cd core && python -m pytest tests -q
встречается 23 раза, а cd app && node --test test/*.test.js — 14 раз, и ни
одной остановки. Причина в том, что у модели, которая делает между одинаковыми
вызовами что-то другое, никогда не набирается трёх одинаковых вызовов подряд.

Теперь измеряется не повтор вызова, а отсутствие прогресса: тот же вызов, вернувший
тот же результат. Результат изменился — счётчик сбрасывается, потому что
изменившийся результат и есть работа. Порог взят из ваших же чатов: в 65 ходах
остальных разговоров одинаковых пар «вызов+результат» больше двух раз не встречается
ни разу, а в зацикленном чате пять ходов доходят до трёх.

Модели говорится, почему повтор бесполезен — «результат не менялся столько-то раз,
значит то, что вы правите, до этого вызова не доходит». Уведомление в окне и две
попытки исправиться остались как были; если и они не помогли, ход заканчивается и
говорит об этом.

Пустой ответ заканчивал ход молча

Разговоры останавливались на пустом сообщении.
В записанной истории два последних ответа — assistant без текста и без единого
вызова инструмента: на «Продолжай работу» — пусто, на «ау» — снова пусто. Ни ошибки,
ни ответа, ни объяснения: пустой ответ считался ответом.

Теперь пустой ответ ответом не считается: модель получает ограниченное число
напоминаний (два), после чего ход заканчивается, а окно называет причину и говорит,
что с этим делать. Отдельно назван случай, когда ответ обрывается на пределе вывода,
— с подсказкой увеличить «ответ не более» в профиле или выключить рассуждения: так
бывает, когда рассуждения модели занимают весь предел вывода, и напоминание этого не
исправит.

Обрыв потока уходил наружу из цикла

Тест test_cut_off_stream.py был написан на этот случай и падал: при обрыве
соединения httpx.ReadError вылетал из цикла наружу, поэтому не было ни события о
конце хода, ни сообщения об ошибке. Со стороны это тот же симптом — чат просто
останавливается. Теперь обрыв потока сообщается как ошибка провайдера и виден в
разговоре; оба теста этого случая проходят.

Что ещё стоит знать

  • 235 тестов окна, 221 тест ядра. Замеры, открывающие окно, запускайте по одному:
    два окна перекрывают друг друга, и кадры у фонового окна тормозятся.
  • Новый замер probe-chat-recovery.cjs проверяет исправленное в живом окне: цикл
    замечается ровно на третьем одинаковом результате и ход заканчивается как
    repeated, а пустой ответ получает два напоминания и заканчивается как
    empty_answer — с надписью на экране в обоих случаях.
  • Если у вас включены рассуждения, а ответы и раньше обрывались пустыми, начните с
    двух настроек профиля: «ответ не более» (предел вывода) и кнопка рассуждений рядом
    с выбором модели.

LexiQode 0.2.5

Choose a tag to compare

@KentoGasai KentoGasai released this 29 Oct 03:01

LexiQode 0.2.5

Скачайте LexiQode-0.2.5-win32-x64.zip, распакуйте куда угодно и запустите
LexiQode.exe. Ничего не устанавливается, права администратора не нужны. Сверьте
скачанное с файлом .sha256, приложенным рядом. Настройки и данные лежат вне папки
программы, поэтому распаковка поверх прежней версии их не трогает.

Это выпуск с новой возможностью и с исправлением того, что мешало работать:
ассистент теперь умеет спрашивать, а не догадываться, и перестал останавливаться
там, где он на самом деле работал.

Что нового

Ассистент спрашивает, когда решение за вами

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

  • Инструмент ask_user. Агент задаёт вопрос и ждёт ответа: ход
    останавливается и продолжается с вашим ответом, как с результатом вызова.
    Таймаута нет — вопрос не имеет безопасного ответа по умолчанию, а придумать
    ответ за вас значит вернуться к тому же угадыванию.
  • Варианты ответа — кнопки, как в Cursor. Один клик отвечает. Рядом — поле
    для своего ответа, если ни один вариант не подходит; Enter отправляет.
  • Вопрос виден в ленте чата отдельной карточкой, синей, а не жёлтой: жёлтая
    карточка — это запрос разрешения на действие, и путать их нельзя.
  • Инструмент выдан трём режимам: Agent, Plan и Debug. В Ask и Review его нет
    намеренно: эти режимы существуют, чтобы отвечать по прочитанному коду, и вопрос
    там был бы способом уйти от ответа.
  • Отмена хода освобождает ожидание. Раз таймаута нет, отмена — единственное,
    что может закончить ожидание, и она это делает.
  • Если пользователя нет — например, при запуске без окна — инструмент
    сообщает об этом как о результате, а не висит вечно.

Что исправлено

Ассистент останавливался там, где он работал

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

  • Считаются только подряд идущие одинаковые вызовы. Любой другой вызов
    разрывает цепочку: «тесты → правка → тесты» — это работа, а «тесты → тесты →
    тесты» без ничего между ними — по-прежнему зацикливание.

Ассистент не знал, что его остановили

Сообщение «ход остановлен: агент повторил вызов» рисовалось в окне и не
попадало в разговор
. Модель не видела причины остановки, поэтому в следующем
ходу повторяла то же самое, и вы видели одно и то же сообщение снова и снова.

  • Причина остановки записывается в разговор. Модель читает, какой именно
    вызов повторился, сколько раз и что делать вместо этого.
  • Одно автоматическое продолжение. Получив объяснение, агент продолжает ход
    сам, без вашего участия, и может сменить подход.
  • Бюджет попыток — четыре на ход. Он считает попытки, а не неудачи: отличить
    вылеченный эпизод от невылеченного по одному вызову между ними невозможно, и
    притворяться, что можно, значит либо обрывать здоровый ход, либо позволить
    крутиться вечно. Четыре — достаточно, чтобы ход, который действительно
    исправлялся несколько раз, не обрывался рано, и мало, чтобы зацикливание
    закончилось, а не тянулось до предела шагов.
  • В окне видно, что происходит: «Агент повторил один и тот же вызов. Ему
    сказано об этом, и он пробует другой подход».

Карточка вопроса не помещалась в панель чата

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

Что ещё стоит знать

  • 226 тестов окна и 204 теста ядра.
  • Новые тесты ядра: test_ask.py (8) — вопрос блокирует ход, ответ доходит до
    модели, отмена освобождает ожидание, без пользователя инструмент не висит;
    test_repeat_recovery.py (8) — модель получает объяснение, автопродолжение
    работает, бюджет конечен; test_repeat_with_work.py (3) — работа между
    вызовами не считается зацикливанием; test_episode_budget.py (2) — вылеченные
    эпизоды не обрывают ход, но бюджет всё равно конечен.
  • Новые тесты окна: question-style.test.js (6) — карточку нельзя распереть
    текстом, вариант переносится, текст читается при наведении, все CSS-переменные
    определены; два теста в core-routes.test.js — имена полей /api/answer
    совпадают с тем, что читает ядро, и событие question_request действительно
    пересылается и обрабатывается.
  • Три теста в test_server.py проверяют вопрос через настоящий HTTP: вопрос
    блокирует ход, ответ доходит до модели, отмена освобождает ожидание.
  • Проверено на живом окне: вопрос задан, ход ждал ответа, ответ вернулся как
    результат инструмента, работа продолжилась. Детектор повторов проверен там же:
    три одинаковых вызова подряд останавливают ход, а шесть вызовов с чередованием —
    нет.

LexiQode 0.2.4

Choose a tag to compare

@KentoGasai KentoGasai released this 28 Oct 06:47

LexiQode 0.2.4

Скачайте LexiQode-0.2.4-win32-x64.zip, распакуйте куда угодно и запустите
LexiQode.exe. Ничего не устанавливается, права администратора не нужны. Сверьте
скачанное с файлом .sha256, приложенным рядом. Настройки и данные лежат вне папки
программы, поэтому распаковка поверх прежней версии их не трогает.

Это патч к 0.2.3: пять вещей, которые в панели системы контроля версий, в подсказках
редактора и в показе работы ассистента не работали так, как задумано, и которые
нельзя было починить настройкой.

Что исправлено

Коммит нельзя было отправить, а удалённый репозиторий — получить

git push не вызывался ниоткуда: в службе git не было такого метода, в списке
каналов — такого канала, в панели — такой кнопки. Коммит делался и оставался
локальным, и ничто на экране не говорило, что дальше нужен терминал. То же с
pull и fetch: удалённый репозиторий не читался вообще.

  • Под веткой стоит строка из трёх кнопок — «Проверить удалённый», «Забрать
    изменения», «Отправить изменения». Каждая называет себя, пока работает, и
    отказывается нажиматься второй раз, поэтому медленная сеть не выглядит как
    мёртвая кнопка. У каждой есть подсказка: fetch узнаёт, что нового на сервере, и
    не трогает файлы; pull приносит коммиты в текущую ветку; push отправляет
    ваши.
  • Ветка без upstream отправляется и начинает отслеживать удалённую. Первая
    отправка новой ветки иначе падала бы с сообщением про upstream, которое
    читается как отказ.
  • git pull идёт только fast-forward. Слияние или rebase, запущенные кнопкой,
    без возможности увидеть конфликт, — это способ оставить рабочую копию в
    состоянии, которого никто не просил. Всё, что не fast-forward, сообщается
    словами git, чтобы это можно было сделать в терминале, где конфликт виден.
  • git fetch --prune убирает ветки, которых на сервере больше нет, и делает
    счётчики «впереди/позади» правдой.
  • Отказ не проглатывается: «нет upstream», «rejected», «authentication failed» —
    это и есть ответ на вопрос, почему отправка не прошла.

Коммит открывается как список файлов, а файл — как цветной diff

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

  • Клик по коммиту открывает заголовок (хеш, автор, когда, тема, тело) и
    список файлов
    со статусом — добавлен, изменён, удалён, переименован.
  • Клик по файлу открывает его изменение, нарисованное DiffEditor Monaco:
    добавленная строка зелёная, удалённая красная — как в VSCode. Это два документа,
    которые сравниваются, а не один документ из строк + и -.
  • Стороны берутся из git show <rev>:<path> и <rev>^:<path>: у первого коммита
    родителя нет, и «до» там пусто, а не ошибка.

Видно, что ассистент меняет в коде.

Строка вызова говорила «write_file src/app.js» и всё: единственное, что хочется
проверить перед тем, как доверять ходу, — что именно изменилось, — на экране не
было.

  • Инструмент, меняющий файл, сообщает обе стороны изменения. write_file и
    edit_file кладут в результат содержимое файла до и после, ядро передаёт его в
    событии tool_end, а окно показывает изменение.
  • Изменение — отдельный блок в чате, а не строка внутри «Действий». Первая
    версия прятала его в строку вызова, а та лежит за двумя раскрытиями — список
    действий шага и сама строка, — поэтому человеку нужно было открыть две вещи,
    чтобы найти одну. Это и читалось как «ты спрятал изменённый файл под
    „Действия“». Теперь блок стоит в ленте сам по себе, между действиями и ответом.
  • Блок раскрывается прямо в чате и показывает только изменённые строки.
    Добавленная строка зелёная, удалённая красная, вокруг — несколько строк
    контекста. Весь файл намеренно не рисуется: это похоронило бы изменение в файле.
  • Рядом — кнопка «открыть файл», которая открывает тот же файл в редакторе,
    где его можно прочитать целиком.
  • Строка файла говорит, сколько изменилось (+5 −1), ещё до раскрытия.
  • Почему это делает ядро, а не окно. Окно не может прочитать файл «до»: оно
    узнаёт о вызове из события tool_start, а локальная запись завершается раньше,
    чем такой чтение вернётся. Первая версия читала файл сама и получала пустой
    diff, потому что «до» уже содержало новое содержимое. Обе стороны знает только
    инструмент, поэтому он их и сообщает.
  • Запись, ничего не изменившая, не предлагает diff — блока нет.

Подсказки в редакторе не помещались и последней не было видно

Monaco даёт списку подсказок фиксированную ширину 430 px и, с
fixedOverflowWidgets, ставит его относительно окна, а не редактора: его
собственная раскладка ограничивает размер окном. В окне, где редактор уже 430 px —
открыты и панель ассистента, и боковая панель, — список уходит за правый край
редактора и под панель ассистента, и закрытой оказывается как раз сигнатура, ради
которой список и открыт. Замер probe-suggest-fit.cjs: в окне 900 px редактор был
168 px, а список уходил на 372 px за его край.

  • Высота была второй половиной той же ошибки. Список ограничивался долей
    окна, а не редактора, поэтому при открытой панели терминала редактор короткий,
    а список выше него: Monaco прижимал его к нижнему краю, и последняя строка
    вставала вплотную к панели, которая начинается ровно там. Это и читалось как
    «внизу какая-то маленькая панель её закрывает». Теперь высота ограничена высотой
    редактора, и Monaco может перевернуть список вверх от курсора.
  • Список держится в нескольких пикселях от нижнего края. Вплотную — это и было
    то, что видел человек: собственная рамка последней строки лежала на границе, а
    панель ниже рисовалась поверх неё.
  • Ширина и высота списка ограничены редактором. Процентом это не выразить —
    содержащий блок виджета это окно, поэтому editor.js измеряет редактор и
    публикует --editor-width и --editor-height, а правило читает их.
  • Список сдвигается внутрь, если позиция выводит его наружу. Одного размера
    мало: Monaco ставит список у курсора и разрешает ему выходить за редактор.
    Наблюдатель за стилем виджета возвращает его внутрь — размер при этом остаётся
    решением Monaco.

Что ещё стоит знать

  • 214 тестов окна и 175 тестов ядра. Замеры, открывающие окно, запускайте по
    одному: два окна перекрывают друг друга, и кадры у фонового окна тормозятся.
  • Семь тестов работают с настоящим репозиторием и настоящим удалённым: отправка
    доходит до удалённого (проверяется его git log, а не ответ команды), ветка без
    upstream начинает его отслеживать, pull приносит коммит с удалённого в рабочую
    копию, fetch сообщает расхождение и не трогает рабочую копию, show показывает
    изменение коммита и умеет первый коммит без родителя, а отправка без удалённого —
    отказ со словами git, а не падение.
  • Замер probe-commit-view.cjs открывает настоящий репозиторий, кликает коммит,
    читает список файлов со статусами и открывает файл, проверяя, что diff сравнивает
    две разные версии и что в нём есть и добавленные, и удалённые строки.
  • Замер probe-agent-change.cjs доводит ход до конца против заглушки, которая
    просит write_file: блок изменений появляется вне списка действий, называет
    файл и счётчик (+5 −1), раскрывается прямо в чате и показывает только
    изменённые строки с контекстом, а кнопка «открыть файл» открывает тот же файл в
    редакторе. Файл на диске совпадает с тем, что записал инструмент.
  • Замер probe-suggest-fit.cjs проверяет, что список подсказок остаётся внутри
    редактора и в обычном окне, и в узком.

LexiQode 0.2.3

Choose a tag to compare

@KentoGasai KentoGasai released this 27 Oct 11:22

LexiQode 0.2.3

Скачайте LexiQode-0.2.3-win32-x64.zip, распакуйте куда угодно и запустите
LexiQode.exe. Ничего не устанавливается, права администратора не нужны. Сверьте
скачанное с файлом .sha256, приложенным рядом. Настройки и данные лежат вне папки
программы, поэтому распаковка поверх прежней версии их не трогает.

Это патч к 0.2.2: три вещи, которые в ней не могли работать ни при каких
настройках, и инструмент, которым это измеряется.

Что исправлено

window.prompt не существует — из-за него четыре кнопки молчали

Electron не реализует window.prompt: он возвращает null, ничего не показывая.
Четыре места в окне спрашивали имя именно так — создание файла, создание папки,
переименование и переключение ветки, — поэтому «+» в проводнике, «Переименовать» и
выбор ветки не делали ничего вообще: ни окна, ни поля, ни ошибки. Читалось это как
четыре несвязанные сломанные кнопки, а причина была одна строка кода в четырёх
местах.

  • Имя вводится в дереве, рядом с тем, что называется. «+» кладёт в нужную папку
    строку с полем (папку при этом раскрывает — новое внутри закрытой папки выглядит
    как «ничего не произошло»), а переименование подменяет собой подпись строки.
    Enter принимает имя, Escape отменяет, уход фокуса считается отменой. Замер
    probe-explorer-create.cjs печатает имя, нажимает Enter и ищет результат на
    диске
    .
  • Перерисовка больше не стирает поле. Дерево перерисовывается на каждое
    изменение на диске — включая то, которое вызвано только что созданным файлом, —
    и первая версия правки теряла из-за этого поле переименования: оно появлялось и
    исчезало вместе со своим же событием. Пока имя набирают, перерисовка
    откладывается и выполняется сразу после: ничего не теряется, только опаздывает.
    Это и поймал замер — без отсрочки поле переименования не переживало создания
    папки, сделанного секундой раньше.
  • Переключатель ветки вместо списка с номерами показывает ветки меню; текущая
    помечена словами, а не звёздочкой, которой в шрифте окна тоже нет.
  • Тест читает исходники окна и падает, если window.prompt появится снова: эту же
    ошибку уже сделали четыре раза.

Папки были помечены квадратами, потому что шрифт не знает этих знаков

  • Значок раскрытия был символом ▸/▾, а папка — ▣. Ни одного из трёх знаков в
    шрифте, которым окно рисует дерево, нет, и все они выводились пустыми квадратами:
    «какие-то квадраты» в отчёте — это отсутствующие глифы, а не украшение.
  • Теперь и то, и другое нарисовано: папка — тот же контур, что у вкладки
    проводника, а стрелка — шеврон, который повёрнут вправо у закрытой папки и вниз у
    открытой, как в VSCode. Направление говорит, куда папка двинется. Замер
    probe-explorer-create.cjs читает вычисленную трансформацию: у закрытой
    matrix(0, -1, 1, 0, 0, 0), у открытой matrix(1, 0, 0, 1, 0, 0).

Что ещё стоит знать

  • 196 тестов окна и 170 тестов ядра. Замеры, открывающие окно, запускайте по
    одному: два окна перекрывают друг друга, и кадры у фонового окна тормозятся.
  • Кроме этого замера поведение окна проверяют probe-explorer-live.cjs (дерево
    следует за диском, правый клик открывает меню), probe-run.cjs (вывод
    запущенного файла не только доходит, но и нарисован) и probe-chat-window.cjs
    (ассистент: шаги, предел с продолжением, остановка, переключатель рассуждений).

LexiQode 0.2.2

Choose a tag to compare

@KentoGasai KentoGasai released this 27 Oct 08:46

LexiQode 0.2.2

Скачайте LexiQode-0.2.2-win32-x64.zip, распакуйте куда угодно и запустите
LexiQode.exe. Ничего не устанавливается, права администратора не нужны. Сверьте
скачанное с файлом .sha256, приложенным рядом. Настройки и данные лежат вне
папки программы, поэтому распаковка поверх прежней версии их не трогает.

Всё ниже измерено на работающем окне; ассистенту нужен Python 3.11 или новее в
PATH, редактор работает и без него.

Что внутри

Кнопка ▶ действительно запускает файл

  • Панель терминала оставалась пустой, а запуск не делал ничего — и это была одна
    ошибка.
    Terminal.open() в xterm 6 выходит сразу, если родитель уже в
    документе: библиотека считает терминал открытым и не строит свой DOM. Код
    вставлял <div class="terminal"> в панель и только потом вызывал open, поэтому
    на экране оставалась пустая рамка, а вывод команды приходил в буфер терминала, у
    которого не было ни одного узла. Замер probe-run.cjs показывает это число в
    число: до правки — 154-пиксельная рамка без .xterm-screen внутри, после — текст
    команды и её вывод на экране.
  • Кнопка в правом верхнем углу редактора (то же делает F5 и пункт меню «Запуск ▸
    Запустить открытый файл…») сохраняет файл и отдаёт его в оболочку нижней панели,
    которая открывается сама. .js, .mjs и .cjs — через node, .py — через
    python, .ps1, .bat, .cmd и .sh — своим интерпретатором. Для остальных
    файлов запуска нет, и приложение говорит об этом, а не гадает.

Ассистент отвечает по шагам, и промежуточный ответ больше не исчезает

  • Ядро работает шагами: подумал, ответил, вызвал инструменты, снова подумал, снова
    ответил. Окно держало один блок на весь ход, поэтому полный текст второго шага
    заменял собой ответ первого — ответ исчезал ровно тогда, когда модель продолжала
    работу. Теперь у каждого шага свой блок, и «Думаю…» следующего шага идёт после
    ответа предыдущего, а не переоткрывается над ним.
  • Действия шага — одна строка, раскрывающаяся в прокручиваемый список (не выше
    320 px): шаг на дюжину вызовов больше не выталкивает остаток хода за пределы
    панели, а список сам следит за новой строкой.
  • У завершённых шагов не остаётся крутилки «работаю», в том числе если шаг прервали
    на середине.

Рассуждения выключаются кнопкой рядом с моделью

  • У моделей, которые думают по умолчанию (реассонер DeepSeek, серия o), это одна
    кнопка: включено — в запрос не добавляется ничего; выключено — уходит
    reasoning_effort: "none", как и требует DeepSeek. Если прокси не знает этого
    поля, клиент отбрасывает его и повторяет запрос: переключатель не может сломать
    работающий адрес. Замер probe-chat-window.cjs доводит это до провода — видит
    поле в запросе после нажатия и его отсутствие до него.

Ход, остановка и бюджет шагов

  • «Шаг 12 из 12» приходило из формы настроек, а не из ядра. Поле «шагов не
    более» подставляло 12, тогда как в ядре по умолчанию 40: форму открыли, числа от
    ядра не дождались, сохранили 12 — и агент заканчивал каждый ход на двенадцатом
    шаге, что читается как «модель останавливается сама». Форма больше не придумывает
    числа, которыми владеет ядро.
  • Ход, израсходовавший запас шагов, говорит об этом в ленте и предлагает
    «Продолжить»: это потолок, а не ошибка, и продолжение — одна кнопка.
  • «Остановить» стало видно. Кнопка сразу говорит «Останавливаю…» и становится
    недоступной, пока ядро доходит до безопасного места; когда ход закончен, в ленте
    появляется пометка «Остановлено вами», кнопка исчезает, а поле ввода снова
    доступно. Раньше нажатие не меняло на экране ничего.
  • Кнопка «Остановить» появляется только во время хода: правило [hidden] в таблице
    стилей было слабее правил, задающих display, и не работало ни для неё, ни для
    крутилки.

Контекст: сжатие перестало срабатывать на каждом ходу

  • Сжимало не окно модели, а потолок в 60 сообщений. Один ход агента пишет сообщение
    на шаг плюс по одному на каждый вызов инструмента, то есть двенадцать шагов
    расходуют больше сотни сообщений: запас срабатывал в конце почти каждого хода и
    отбрасывал только что сделанную работу. Потолок поднят до 2000, и файл настроек с
    прежним значением по умолчанию переносится в новое (версия настроек 2); число,
    которое ввели вы сами, не трогается.
  • За один ход оплачивается не больше одной сводки: остальные сжатия просто
    отбрасывают самые старые сообщения. Пометка в ленте теперь одна на ход и считает,
    сколько раз сжимали и сколько сообщений ушло.

Открыть файл — не значит отправить его ассистенту

  • Контекст сообщения — ровно то, что вы положили туда сами: кнопка над полем ввода
    добавляет открытый файл, меню дерева — любой другой, крестик на чипе убирает.
    Раньше открытый файл попадал в следующее сообщение сам.

scripts\run-app.ps1: запуск без сборки наконец работает

  • Скрипт предпочитал старую сборку из dist\, поэтому правки в исходниках он не
    показывал: выглядело так, будто изменение не применилось. Теперь по умолчанию
    запускаются исходники; -Bundle запускает собранную папку, -Deploy кладёт её
    в %LOCALAPPDATA%\Programs\LexiQode и запускает уже оттуда.
  • Запуск без папки падал: Start-Process -ArgumentList @() не проходит проверку
    параметров Windows PowerShell. Список аргументов теперь передаётся только когда он
    не пуст.
  • Скрипт не возвращал управление: Electron вызывался оператором &, который ждёт
    закрытия окна. Процесс запускается, а скрипт сразу возвращается.

Проверка обновлений ведёт на страницу выпуска

  • Если выпуск новее, окно называет его номер, показывает заметки и даёт одну
    кнопку — «Страница выпуска». Она открывается в браузере, и архив с его
    контрольной суммой лежит там же.

Приложение перестало обновлять себя само

  • Это исправление, а не упрощение. Прежняя версия скачивала архив в
    %APPDATA%\LexiQode\updates, распаковывала его целиком и передавала
    apply-update.ps1 замену папки приложения после исчезновения процесса. На живом
    окне это выглядело как «нажал „Закрыть и установить“, и ничего не произошло»:
    приложение, запущенное из исходников, заменять себя отказывается, а сообщение об
    отказе показывалось строкой, которую легко пропустить.
  • Вместе с механизмом удалены и его следы: скрипт apply-update.ps1, каналы
    update:download и update:install, полоса загрузки и обе кнопки. Тест читает
    update-service.js и проверяет, что в нём не осталось ни запуска процессов, ни
    записи на диск.
  • Обновиться — значит закрыть приложение и распаковать новый архив на место текущей
    папки.

Версия объявлена в одном месте

  • Она записана дважды — в app/package.json и в core/lexiqode/version.py, — и эти
    два места расходились дважды, оба раза незаметно. Теперь сборка с расхождением
    падает: 0.2.2 в обоих файлах, и тест это сверяет.

Подсказки при написании кода

  • Языковая служба Monaco заработала по-настоящему: для JavaScript, TypeScript, JSON,
    CSS и HTML — члены, сигнатуры, подсказки параметров и подчёркнутые ошибки; для
    остальных языков — слова из открытого файла. Прежняя версия задавала адрес
    воркера, которого в этой сборке Monaco нет, и служба падала через раз, ничего об
    этом не сообщая.

Что ещё стоит знать

  • У версии 0.2.1 архив приложен позже, чем поставлен тег, и контрольной суммы рядом
    с ним нет; 0.2.2 — первый выпуск, где к архиву приложен ещё и .sha256.
  • 194 теста окна и 170 тестов ядра. Замер probe-chat-window.cjs проверяет
    ассистента в живом окне: два шага как два блока, «Думаю…» второго после ответа
    первого, дюжину действий в прокручиваемом списке, пометку о пределе шагов с
    кнопкой продолжения, остановку хода и переключатель рассуждений до самого
    запроса. Замер probe-run.cjs проверяет, что вывод запущенного файла не только
    доходит, но и нарисован. Замеры с окнами запускайте по одному: два окна
    перекрывают друг друга, и кадры в фоне тормозятся.

v0.2.1

Choose a tag to compare

@KentoGasai KentoGasai released this 27 Oct 03:03
  • Добавлена кнопка "Настройки".
  • Исправлено накладывание панели модели на панель инструментов.
  • При получении обновления открывается страница релизов.
  • Убрал автоматическое добавление контекста при открытии файла.

LexiQode AI IDE v0.2.0

Choose a tag to compare

@KentoGasai KentoGasai released this 27 Oct 01:56
LexiQode 0.2.0