Skip to content

LexiQode 0.2.2

Choose a tag to compare

@KentoGasai KentoGasai released this 27 Oct 08:46
· 10 commits to main since this release

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 проверяет, что вывод запущенного файла не только
    доходит, но и нарисован. Замеры с окнами запускайте по одному: два окна
    перекрывают друг друга, и кадры в фоне тормозятся.