Each CPU now thinks with one of four engines, each backed by a different
published library (pinned versions):
- montecarlo (@pokertools/evaluator): the existing balanced Monte Carlo
equity player, moved to server/bots/montecarlo.js.
- calculator (poker-calculations): the library's decideAction over the
table state; push/fold below 12BB via its jam breakeven equity.
Skipped automatically if the native addon cannot load.
- range (poker-utils): tight player; preflop by hand-strength percentile,
postflop equity vs an estimated opponent range, bluffs only when
alpha/bluffEV say they pay.
- madehand (pokersolver): loose, sticky player that only looks at the
made hand and draws.
server/ai.js assigns a mix of engines per table (makeStyles), falls back
to the Monte Carlo engine on errors, and legalizes every decision.
The engine and its parameters stay server-side; players cannot tell
which library a CPU uses. Tests cover every engine and the no-leak rule.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>