Это отличная идея по нескольким причинам:
- Объективный бенчмарк (Тестирование): Игра против внешних ботов сайта (
DC Coach Beginner,Amateur,Master) — это лучший способ проверить реальную силу вашего Scala-движка. Вы сможете оценить качество оценки позиций (heuristics) и поиска (expectimax) на разных уровнях сложности. - Готовая инфраструктура: В вашем репозитории
dicechess-labуже есть база данных SQLite (database.mdx) и репозитории для хранения партий. Мы можем автоматически записывать результаты этих дуэлей прямо в вашу локальную базу данных для построения графиков и аналитики (винрейт, среднее время хода, распределение бросков кубиков и т.д.). - Автоматизация: Мы можем написать легковесный Python-скрипт (мост), который будет:
- Подключаться к
dicechess.comчерез STOMP. - Запускать Scala-движок как подпроцесс (или общаться с ним по протоколу, аналогичному UCI).
- Транслировать броски кубиков и FEN с сайта в движок, получать лучший ход и отправлять его обратно на сайт.
- Подключаться к
Как это лучше спроектировать технически?
- Движок (Scala): Должен уметь принимать текущую позицию (FEN), брошенные кубики (dices) и возвращать лучший ход.
- Мост (Python): Берет на себя всю работу с сетью, авторизацией на
dicechess.com, парсингом STOMP-сообщений и ведением логов. - База данных (
dicechess-lab): После каждой игры сохраняет полную историю ходов в SQLite для последующего анализа.
Если хотите, мы можем начать с создания простого прототипа моста на Python, который научится авторизоваться вашим токеном, бросать вызов боту на сайте и делать случайные ходы (random bot). Как только эта цепочка заработает, мы подключим туда ваш Scala-движок.
Что думаете? С чего начнем?
Это действительно намного проще и элегантнее!
Если движок компилируется в JavaScript (через Scala.js), использование Node.js дает колоссальные преимущества:
- Никаких межпроцессных вызовов (No IPC): Нам не нужно запускать отдельный процесс Scala, писать обработчики ввода-вывода (stdin/stdout) или поднимать HTTP-серверы. Node.js скрипт сможет импортировать скомпилированный JS-файл движка как обычный модуль и вызывать функции поиска хода напрямую в памяти.
- Идентичность среды: Движок будет работать в Node.js точно так же, как он работает (или будет работать) в браузере вашего PWA-тренажера.
- Экосистема библиотек: В Node.js есть отличные нативные библиотеки для STOMP (например,
@stomp/stompjsилиstompjsвместе с пакетомwsдля поддержки веб-сокетов в консольной среде).
Как будет выглядеть схема работы:
- Вы собираете Scala-проект в JS-файл (обычно через команду
sbt fastLinkJSили аналогичную). На выходе получается файл вродеengine.js. - Мы пишем Node.js скрипт (например,
agent-runner.js), который:- Подключает пакеты
@stomp/stompjsиws. - Импортирует ваш
engine.js. - Инициирует подключение к
wss://dicechess.com/wsс вашим JWT-токеном. - При получении хода/броска от сервера передает FEN и кубики прямо в JS-функцию вашего движка.
- Получает ход от движка текстом (например,
"e2e4") и сразу отправляет обратно через WebSocket.
- Подключает пакеты
Давайте проверим, где сейчас в проекте собирается JS-код движка. У вас открыт проект dicechess-engine-scala? Мы можем посмотреть его структуру или файл сборки (build.sbt), чтобы понять, куда сохраняется готовый JS-файл движка.
I will inspect the root directory of the Scala engine repository (dicechess-engine-scala) to see if there is already Node.js configuration or how it compiles Scala.js. This will help determine where the bot runner script fits best.
Related Tools:
list_dir: Specifically designed to retrieve directory listings (most appropriate).run_command: Generic shell command.
Listed directory dicechess-engine-scala
I will examine the package.json and mise.toml in dicechess-engine-scala to see how JS dependencies and tasks are currently structured in the engine repository.
Related Tools:
view_file: Specifically designed to read file contents (most appropriate).run_command: Generic shell command.
Viewed package.json:1-35
I will now read the mise.toml file in dicechess-engine-scala to understand the available developer tasks in this repository.
Related Tools:
view_file: Specifically designed to read file contents (most appropriate).run_command: Generic shell command.
Viewed mise.toml:1-120
I will check the package.json of the frontend-pwa in the dicechess-lab workspace to verify if the web application already imports @rabestro/dicechess-engine as a dependency. This will help confirm the integration model between the two repositories.
Related Tools:
view_file: Specifically designed to read file contents (most appropriate).run_command: Generic shell command.
Viewed package.json:1-39
Я рекомендую не создавать отдельный (третий) репозиторий, а разместить скрипт прямо внутри репозитория dicechess-engine-scala (например, в директории scripts/ или benchmark/).
Вот почему:
Почему отдельный репозиторий добавит лишней работы?
Если создать отдельный репозиторий, вам придется постоянно решать проблему синхронизации движка:
- Вы изменили что-то в Scala-коде движка.
- Вам нужно скомпилировать его в JS, опубликовать (или локально прилинковать через
npm link/yalc). - Перейти в репозиторий ботов, обновить зависимость и только тогда запустить.
Это сильно замедлит цикл разработки (feedback loop).
Почему идеально сделать это внутри dicechess-engine-scala?
У вас уже настроена отличная структура в dicechess-engine-scala:
- Есть файл
package.jsonв корне. - Есть задачи
build:jsиbuild:js:devвmise.toml. - Есть папка
scripts/.
Как будет выглядеть идеальный рабочий процесс:
- Мы добавляем нужные JS-зависимости (клиент STOMP и WebSockets) прямо в корневой
package.jsonдвижка:npm install @stomp/stompjs ws dotenv --save-dev - Пишем скрипт, например,
scripts/play-bot.js. Этот скрипт импортирует собранный локально JS-движок прямо из папкиtargetилиdist(без публикации в реестр). - Добавляем простую команду в
mise.toml, напримерmise run play.
Вызов будет происходить в один шаг:
# Скомпилирует последнюю версию Scala.js движка и запустит бота на сайте
mise run build:js:dev && node scripts/play-bot.jsАльтернатива: Интеграция с базой данных dicechess-lab
Если вам очень важно записывать сыгранные партии в локальную базу данных SQLite проекта dicechess-lab, скрипт ботов может:
- Либо делать простой REST-запрос на бэкенд
dicechess-lab(FastAPI) в конце партии, передавая PGN/JSON игры для сохранения. - Либо мы можем разместить скрипт запуска ботов прямо в
dicechess-lab(там тоже есть Node.js для фронтенда), но тогда вам придется копировать туда собранныйengine.jsпри каждом изменении.
Резюме: Для удобства написания и тестирования самого интеллекта бота лучше всего делать это внутри dicechess-engine-scala.
Если вы согласны, мы можем прямо сейчас:
- Установить
@stomp/stompjsиwsвdicechess-engine-scala. - Создать шаблон Node.js скрипта в
scripts/play-bot.js, который авторизуется на сайте и слушает события.