Это отличная идея по нескольким причинам:

  1. Объективный бенчмарк (Тестирование): Игра против внешних ботов сайта (DC Coach Beginner, Amateur, Master) — это лучший способ проверить реальную силу вашего Scala-движка. Вы сможете оценить качество оценки позиций (heuristics) и поиска (expectimax) на разных уровнях сложности.
  2. Готовая инфраструктура: В вашем репозитории dicechess-lab уже есть база данных SQLite (database.mdx) и репозитории для хранения партий. Мы можем автоматически записывать результаты этих дуэлей прямо в вашу локальную базу данных для построения графиков и аналитики (винрейт, среднее время хода, распределение бросков кубиков и т.д.).
  3. Автоматизация: Мы можем написать легковесный 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 дает колоссальные преимущества:

  1. Никаких межпроцессных вызовов (No IPC): Нам не нужно запускать отдельный процесс Scala, писать обработчики ввода-вывода (stdin/stdout) или поднимать HTTP-серверы. Node.js скрипт сможет импортировать скомпилированный JS-файл движка как обычный модуль и вызывать функции поиска хода напрямую в памяти.
  2. Идентичность среды: Движок будет работать в Node.js точно так же, как он работает (или будет работать) в браузере вашего PWA-тренажера.
  3. Экосистема библиотек: В Node.js есть отличные нативные библиотеки для STOMP (например, @stomp/stompjs или stompjs вместе с пакетом ws для поддержки веб-сокетов в консольной среде).

Как будет выглядеть схема работы:

  1. Вы собираете Scala-проект в JS-файл (обычно через команду sbt fastLinkJS или аналогичную). На выходе получается файл вроде engine.js.
  2. Мы пишем 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.

  • 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.

  • 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.

  • 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.

  • 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/).

Вот почему:

Почему отдельный репозиторий добавит лишней работы?

Если создать отдельный репозиторий, вам придется постоянно решать проблему синхронизации движка:

  1. Вы изменили что-то в Scala-коде движка.
  2. Вам нужно скомпилировать его в JS, опубликовать (или локально прилинковать через npm link / yalc).
  3. Перейти в репозиторий ботов, обновить зависимость и только тогда запустить.

Это сильно замедлит цикл разработки (feedback loop).


Почему идеально сделать это внутри dicechess-engine-scala?

У вас уже настроена отличная структура в dicechess-engine-scala:

  • Есть файл package.json в корне.
  • Есть задачи build:js и build:js:dev в mise.toml.
  • Есть папка scripts/.

Как будет выглядеть идеальный рабочий процесс:

  1. Мы добавляем нужные JS-зависимости (клиент STOMP и WebSockets) прямо в корневой package.json движка:
    npm install @stomp/stompjs ws dotenv --save-dev
  2. Пишем скрипт, например, scripts/play-bot.js. Этот скрипт импортирует собранный локально JS-движок прямо из папки target или dist (без публикации в реестр).
  3. Добавляем простую команду в 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.

Если вы согласны, мы можем прямо сейчас:

  1. Установить @stomp/stompjs и ws в dicechess-engine-scala.
  2. Создать шаблон Node.js скрипта в scripts/play-bot.js, который авторизуется на сайте и слушает события.