@blunderon/bot
v0.1.0
Published
Human-like chess opponent behind a transport-agnostic interface
Readme
@blunderon/bot
This package owns the human-like chess opponent: the rating-bucketed opening book,
the bundled Maia-3 model, and the Bot interface every caller depends on.
It does not own game rules, game state, matchmaking, ratings, rewards, or HTTP.
It ships TypeScript source and runs its engine in a Bun worker, so it requires Bun.
createBot() runs the engine in a worker thread. Inference blocks the thread it runs on — a single
predict call stalls an event loop for tens of milliseconds — so keeping it off the caller's thread
is the reason the worker exists, not an optimisation. Requests are correlated by id and time out
independently; a crashed worker fails only its in-flight requests and the next call spawns a
replacement.
Callers see nothing but Bot, so the same app runs against an in-process engine today and a
network-backed one later without touching game code.
The engine plays the opening book while it has an entry for the position and the bot's rating bucket, then defers to the model. Model moves are validated against the caller's legal move list before they are returned.
Terminating a worker that has loaded onnxruntime-node panics Bun 1.3.14, so close() releases the
worker without terminating it and the thread exits with the process. BotWorker therefore has no
terminate.
