Repository navigation
Releases: KentoGasai/LexiQode
Release list
LexiQode 0.2.6
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
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
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
Строка коммита была подписью, а не кнопкой: список истории читался, но изменение
за каждой строкой — нет, а это единственное, для чего список коммитов существует.
- Клик по коммиту открывает заголовок (хеш, автор, когда, тема, тело) и
список файлов со статусом — добавлен, изменён, удалён, переименован. - Клик по файлу открывает его изменение, нарисованное
DiffEditorMonaco:
добавленная строка зелёная, удалённая красная — как в 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
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
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
- Добавлена кнопка "Настройки".
- Исправлено накладывание панели модели на панель инструментов.
- При получении обновления открывается страница релизов.
- Убрал автоматическое добавление контекста при открытии файла.