@holdem-api/holdem-sdk 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +156 -2
- package/dist/history/index.d.ts +22 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +115 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/vendor/buckets.d.ts +8 -0
- package/dist/history/vendor/buckets.d.ts.map +1 -0
- package/dist/history/vendor/buckets.js +72 -0
- package/dist/history/vendor/buckets.js.map +1 -0
- package/dist/history/vendor/handEvidence.d.ts +39 -0
- package/dist/history/vendor/handEvidence.d.ts.map +1 -0
- package/dist/history/vendor/handEvidence.js +85 -0
- package/dist/history/vendor/handEvidence.js.map +1 -0
- package/dist/history/vendor/rawHand.d.ts +31 -0
- package/dist/history/vendor/rawHand.d.ts.map +1 -0
- package/dist/history/vendor/rawHand.js +163 -0
- package/dist/history/vendor/rawHand.js.map +1 -0
- package/dist/history/vendor/replay.d.ts +51 -0
- package/dist/history/vendor/replay.d.ts.map +1 -0
- package/dist/history/vendor/replay.js +174 -0
- package/dist/history/vendor/replay.js.map +1 -0
- package/dist/history/vendor/types.d.ts +24 -0
- package/dist/history/vendor/types.d.ts.map +1 -0
- package/dist/history/vendor/types.js +2 -0
- package/dist/history/vendor/types.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -2,6 +2,69 @@
|
|
|
2
2
|
|
|
3
3
|
Server-side JavaScript/TypeScript client for Node.js 20+. Zero runtime dependencies, ESM and TypeScript declarations. All requests use `POST /api/actions`.
|
|
4
4
|
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
In your **backend/server project** (for Blitzfold, use `blitzfold-server`):
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @holdem-api/holdem-sdk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
No repository clone, local archive, or SDK build step is required. Node.js 20+ is required. The package is ESM-only. JavaScript `.mjs` files can import it directly. CommonJS applications can use native `await import('@holdem-api/holdem-sdk')` inside an async function; TypeScript compiling to CommonJS must preserve that native import rather than rewriting it to require().
|
|
14
|
+
|
|
15
|
+
Verify installation without an API key or network request:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
node --input-type=module -e "import { HoldemClient, RangeStore } from '@holdem-api/holdem-sdk'; console.log('SDK ready:', typeof HoldemClient, typeof RangeStore)"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Expected output: `SDK ready: function function`.
|
|
22
|
+
|
|
23
|
+
## Configure your API access
|
|
24
|
+
|
|
25
|
+
Obtain a Holdem API key and the origin of the API deployment you are authorized to use. Installing this package does not create an API account, provision a server, or include credentials. Configure these variables on your backend:
|
|
26
|
+
|
|
27
|
+
```dotenv
|
|
28
|
+
HOLDEM_API_KEY=your_api_key
|
|
29
|
+
HOLDEM_API_URL=https://your-api-host.example
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Replace the example host with your actual deployment origin, without `/api`. Keep `.env` out of version control. Node 20.6+ can load it using `node --env-file=.env your-script.mjs`; on earlier Node 20 versions set environment variables in your shell or use your application's environment loader. Never put the key in browser code.
|
|
33
|
+
|
|
34
|
+
## First live request
|
|
35
|
+
|
|
36
|
+
Save this as `holdem-smoke.mjs` in the project where you installed the SDK:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
import { readFile } from 'node:fs/promises'
|
|
40
|
+
import { HoldemClient } from '@holdem-api/holdem-sdk'
|
|
41
|
+
|
|
42
|
+
const { HOLDEM_API_KEY: apiKey, HOLDEM_API_URL: baseUrl } = process.env
|
|
43
|
+
if (!apiKey || !baseUrl || !process.argv[2]) {
|
|
44
|
+
throw new Error('Set HOLDEM_API_KEY and HOLDEM_API_URL; supply a request JSON file')
|
|
45
|
+
}
|
|
46
|
+
const client = new HoldemClient({ apiKey, baseUrl })
|
|
47
|
+
const request = JSON.parse(await readFile(process.argv[2], 'utf8'))
|
|
48
|
+
const result = await client.actions(request)
|
|
49
|
+
console.log({
|
|
50
|
+
chosenAction: result.chosenAction,
|
|
51
|
+
probabilities: result.output,
|
|
52
|
+
equity: result.equity,
|
|
53
|
+
expectedValues: result.expectedValues,
|
|
54
|
+
rangeCount: Object.keys(result.range).length,
|
|
55
|
+
})
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Export a real pre-decision game state using the policy encoding below into `actions-request.json`, with top-level `{ "hand": "AsAh", "policy": { "schemaVersion": "holdem-public-board-joint-v1", "context": [...], "history": [...], "legalMask": [0,1,1] } }`. The ellipses describe encoder output; replace them with actual arrays. Do not use made-up features or an empty context. Then run:
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
node --env-file=.env holdem-smoke.mjs actions-request.json
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
This makes one live request and may consume API quota. It does not execute an action in your game. If this fails, 401/403 indicates an access/authentication issue; 400 indicates invalid input; 502/503 can indicate unavailable equity/model services. Inspect the SDK error status and your API configuration.
|
|
65
|
+
|
|
66
|
+
## Integrate decisions and track ranges
|
|
67
|
+
|
|
5
68
|
```ts
|
|
6
69
|
import { HoldemClient, RangeStore } from '@holdem-api/holdem-sdk'
|
|
7
70
|
import type { PublicPolicy } from '@holdem-api/holdem-sdk'
|
|
@@ -51,7 +114,7 @@ Supply the exact public encoder output as `policy`: schemaVersion `holdem-public
|
|
|
51
114
|
|
|
52
115
|
`HoldemValidationError` rejects local invalid input before sending. `HoldemApiError` includes status and body. `HoldemResponseError` rejects malformed successful responses. `HoldemTransportError` wraps network, timeout and cancellation failures. Methods accept `{signal}` as the second argument. Default timeout is 60 seconds and covers body reading. No automatic retries. Keys use `x-api-key`; keep credentials on your backend.
|
|
53
116
|
|
|
54
|
-
##
|
|
117
|
+
## SDK maintainers: build and publish
|
|
55
118
|
|
|
56
119
|
```sh
|
|
57
120
|
npm ci
|
|
@@ -69,4 +132,95 @@ The package is configured for public publication as `@holdem-api/holdem-sdk` und
|
|
|
69
132
|
|
|
70
133
|
Do not put credentials in source or the package. Before publishing another release, bump the version with `npm version patch` (requires a clean git checkout) or edit the version and update the lockfile.
|
|
71
134
|
|
|
72
|
-
|
|
135
|
+
## Public policy encoding reference
|
|
136
|
+
|
|
137
|
+
The SDK accepts encoded public features; it does not reconstruct betting state. Use consistent seat IDs 0�8 throughout a hand. Cards are indexed by `rankIndex * 4 + suitIndex`, ranks `23456789TJQKA`, suits `cdhs`. Street indexes are preflop=0, flop=1, turn=2, river=3. A one-hot block has exactly one 1; an empty board slot is all zeros. Board slots retain deal order. All amounts below are BB unless a count is specified; scale amounts/counts using `log1p(max(0,x))/log1p(400)`.
|
|
138
|
+
|
|
139
|
+
| Context indexes | Encoding |
|
|
140
|
+
| --- | --- |
|
|
141
|
+
| 0�259 | Five ordered 52-value board one-hot slots |
|
|
142
|
+
| 260�268 | Actor seat one-hot |
|
|
143
|
+
| 269�272 | Street one-hot |
|
|
144
|
+
| 273�278 | Scaled pot, facing amount, call payment, min raise-to, max raise-to, number of seats |
|
|
145
|
+
| 279�314 | Nine seat records: present flag, scaled remaining stack, scaled current-street contribution, active flag; absent seats have four zeros |
|
|
146
|
+
| 315 | Remaining active opponent count divided by 9 |
|
|
147
|
+
|
|
148
|
+
Each history event has 32 values: actor seat one-hot (9), street one-hot (4), action one-hot (6, ordered posts/folds/checks/calls/bets/raises), four scaled values (payment added, raise-to or 0, live post or 0, dead post or 0), and nine scaled refund amounts indexed by seat. Sum multiple refunds to the same seat after the event before scaling. History must contain all actual preceding events in order, across streets, excluding the current decision. Send no artificial padding; empty history is supported. Maximum history length is 512. LegalMask is `[fold, passive, aggressive]` derived from actual engine legality, with only 0/1 values and at least one allowed action. Do not include opponents' private cards or future events. Encode call payment, contributions, and raise limits from actual engine state; do not infer them from incomplete logs.
|
|
149
|
+
|
|
150
|
+
## Blitzfold migration checklist
|
|
151
|
+
|
|
152
|
+
Install in the server. Replace the `/api/equity_actions` request with `client.actions(payload)` using the existing public encoder. Preserve the full response, including `range`; remove any code deleting it. Use `chosenAction` directly instead of sampling the action category a second time. Sample only the conditional size after aggression and enforce engine legality. Commit the actor range only after that same category executes successfully; reject stale hand/turn responses and clear completed hands. Select optional player styles locally and send them with the request, so decisions need only `/api/actions`. Keep error/cooldown handling and the game's timeout budget. Verify both the development runner and the compiled server can load this ESM package.
|
|
153
|
+
|
|
154
|
+
## Convert hand-history files
|
|
155
|
+
|
|
156
|
+
### Request a live decision from text
|
|
157
|
+
|
|
158
|
+
`client.actionsFromHistory()` sends an unfinished hand to `POST /api/actions`.
|
|
159
|
+
The API parses the text, replays actions, identifies the next actor, and builds
|
|
160
|
+
the public policy. Callers do not construct numeric feature arrays.
|
|
161
|
+
Requires an API deployment with live-history input support.
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
const result = await client.actionsFromHistory({
|
|
165
|
+
handHistory: `PokerStars Hand #123: Hold'em No Limit ($0.10/$0.25 USD) - 2026/11/05 20:00:00 ET
|
|
166
|
+
Table 'Blitzfold' 2-max Seat #1 is the button
|
|
167
|
+
Seat 1: Hero ($25 in chips)
|
|
168
|
+
Seat 2: Opponent ($25 in chips)
|
|
169
|
+
Hero: posts small blind $0.10
|
|
170
|
+
Opponent: posts big blind $0.25
|
|
171
|
+
*** HOLE CARDS ***
|
|
172
|
+
Dealt to Hero [As Ah]`,
|
|
173
|
+
player: 'Hero', // optional assertion of whose turn it is
|
|
174
|
+
style: 'tight-aggressive',
|
|
175
|
+
// hand: 'AsAh', // required if the actor has no Dealt to line
|
|
176
|
+
// range: ranges.get(handId, playerId),
|
|
177
|
+
})
|
|
178
|
+
console.log(result.chosenAction, result.equity)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Append executed actions and dealt street markers, then send the full prefix again
|
|
182
|
+
at each decision. The API is stateless: include the header, seats, starting stacks,
|
|
183
|
+
button, blinds, and all preceding actions every time. Stop before the pending
|
|
184
|
+
action; omit showdown, collection, and summary lines. For a closed betting round,
|
|
185
|
+
include the next dealt street before requesting. Headers alone do not describe
|
|
186
|
+
a later decision.
|
|
187
|
+
|
|
188
|
+
Supports ordinary PokerStars USD No Limit Hold'em cash text, up to 100 KB and
|
|
189
|
+
512 preceding events. Arbitrary prose and other sites' formats are rejected.
|
|
190
|
+
Optional `range`, `opponentRanges`, `style`, `gateSlope`, `policyVersion`, and
|
|
191
|
+
cancellation work as with `actions()`. Track ranges explicitly and record them
|
|
192
|
+
only after executing the returned action. This method reads text, not filesystem
|
|
193
|
+
paths, and does not execute game actions. The structured `actions({ policy, hand })`
|
|
194
|
+
entry point remains available.
|
|
195
|
+
|
|
196
|
+
### Parse complete files locally
|
|
197
|
+
|
|
198
|
+
`parseHandHistories(text)` locally converts one or more complete PokerStars USD
|
|
199
|
+
No Limit Hold'em regular cash histories into decisions. Unsupported formats,
|
|
200
|
+
incomplete hands, and inconsistent settlement totals throw an error.
|
|
201
|
+
|
|
202
|
+
```ts
|
|
203
|
+
import { readFile } from 'node:fs/promises'
|
|
204
|
+
import { HoldemClient, parseHandHistories } from '@holdem-api/holdem-sdk'
|
|
205
|
+
|
|
206
|
+
const client = new HoldemClient({
|
|
207
|
+
apiKey: process.env.HOLDEM_API_KEY!,
|
|
208
|
+
baseUrl: process.env.HOLDEM_API_URL!,
|
|
209
|
+
})
|
|
210
|
+
const hands = parseHandHistories(await readFile('history.txt', 'utf8'))
|
|
211
|
+
for (const hand of hands) {
|
|
212
|
+
for (const decision of hand.decisions) {
|
|
213
|
+
if (decision.player !== 'YourPlayerName' || !decision.hand) continue
|
|
214
|
+
const result = await client.actions({ policy: decision.policy, hand: decision.hand })
|
|
215
|
+
console.log(hand.handId, decision.street, result.chosenAction)
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Decisions include actionIndex, player, street, observedAction, policy, optional
|
|
221
|
+
hand and optional cardSource. Unknown cards remain absent. Revealed actor cards
|
|
222
|
+
may be used for retrospective analysis; private cards, future board cards and
|
|
223
|
+
future actions never enter earlier public policies. The helper makes no API calls.
|
|
224
|
+
It returns recorded decisions, not pending decisions from unfinished live hands.
|
|
225
|
+
It does not infer reached ranges. Omitted ranges use uniform defaults; do not
|
|
226
|
+
carry a sampled-action posterior through a history that took a different action.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type DecisionState } from './vendor/replay.js';
|
|
2
|
+
import type { RawHandV2 } from './vendor/rawHand.js';
|
|
3
|
+
import type { PublicPolicy as PublicPolicyInput } from '../types.js';
|
|
4
|
+
/** Exact public-board training encoder contract; no private cards or future events. */
|
|
5
|
+
export declare function encodePoint(raw: RawHandV2, decisions: DecisionState[], state: DecisionState): PublicPolicyInput;
|
|
6
|
+
/** Convert complete PokerStars cash histories into pre-action decision inputs.
|
|
7
|
+
* Reads text, not filesystem paths. No API requests are made.
|
|
8
|
+
* Unknown private cards remain absent; revealed cards are never policy features.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseHandHistories(text: string): {
|
|
11
|
+
handId: string;
|
|
12
|
+
decisions: {
|
|
13
|
+
actionIndex: number;
|
|
14
|
+
player: string;
|
|
15
|
+
street: import("./vendor/types.js").Street;
|
|
16
|
+
observedAction: string;
|
|
17
|
+
policy: PublicPolicyInput;
|
|
18
|
+
hand: string | undefined;
|
|
19
|
+
cardSource: "dealt-to-hero" | "showdown-show" | "voluntary-show" | "fold-reveal" | "summary-show" | "summary-muck" | undefined;
|
|
20
|
+
}[];
|
|
21
|
+
}[];
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAQpE,uFAAuF;AACvF,wBAAgB,WAAW,CACzB,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,aAAa,EAAE,EAC1B,KAAK,EAAE,aAAa,GACnB,iBAAiB,CAkEnB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM;;;;;;;;;;;IAiC9C"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { parseRawHandV2 } from './vendor/rawHand.js';
|
|
2
|
+
import { createHandEvidence } from './vendor/handEvidence.js';
|
|
3
|
+
import { replayHand } from './vendor/replay.js';
|
|
4
|
+
import { validateActions } from '../validation.js';
|
|
5
|
+
const streets = ['preflop', 'flop', 'turn', 'river'];
|
|
6
|
+
const hot = (index, width) => Array.from({ length: width }, (_, i) => Number(i === index));
|
|
7
|
+
const amount = (n) => Math.log1p(Math.max(0, n)) / Math.log1p(400);
|
|
8
|
+
/** Exact public-board training encoder contract; no private cards or future events. */
|
|
9
|
+
export function encodePoint(raw, decisions, state) {
|
|
10
|
+
const { hand, annotations } = raw;
|
|
11
|
+
const bb = hand.bigBlindSize;
|
|
12
|
+
const seats = [...hand.players].sort((a, b) => a.seat - b.seat);
|
|
13
|
+
const button = seats.findIndex((p) => p.seat === hand.buttonSeat);
|
|
14
|
+
const relative = (name) => (seats.findIndex((p) => p.name === name) - button + seats.length) % seats.length;
|
|
15
|
+
const cardIndex = (card) => '23456789TJQKA'.indexOf(card[0]) * 4 + 'cdhs'.indexOf(card[1]);
|
|
16
|
+
const board = Array.from({ length: 5 }, (_, i) => hot(state.board[i] ? cardIndex(state.board[i]) : -1, 52)).flat();
|
|
17
|
+
const players = Array.from({ length: 9 }, (_, index) => {
|
|
18
|
+
const player = seats.find((p) => relative(p.name) === index);
|
|
19
|
+
return player
|
|
20
|
+
? [
|
|
21
|
+
1,
|
|
22
|
+
amount(state.stacks[player.name] / bb),
|
|
23
|
+
amount(state.contributions[player.name] / bb),
|
|
24
|
+
Number(state.active.includes(player.name)),
|
|
25
|
+
]
|
|
26
|
+
: [0, 0, 0, 0];
|
|
27
|
+
}).flat();
|
|
28
|
+
const context = [
|
|
29
|
+
...board,
|
|
30
|
+
...hot(relative(state.player), 9),
|
|
31
|
+
...hot(streets.indexOf(state.street), 4),
|
|
32
|
+
...[
|
|
33
|
+
state.pot / bb,
|
|
34
|
+
state.facing / bb,
|
|
35
|
+
state.callAmount / bb,
|
|
36
|
+
state.minRaiseTo / bb,
|
|
37
|
+
state.maxRaiseTo / bb,
|
|
38
|
+
seats.length,
|
|
39
|
+
].map(amount),
|
|
40
|
+
...players,
|
|
41
|
+
(state.active.length - 1) / 9,
|
|
42
|
+
];
|
|
43
|
+
const history = hand.actions.slice(0, state.actionIndex).map((action, index) => {
|
|
44
|
+
const past = decisions.find((d) => d.actionIndex === index);
|
|
45
|
+
const post = annotations.posts[index];
|
|
46
|
+
const refunds = Array(9).fill(0);
|
|
47
|
+
annotations.refunds
|
|
48
|
+
.filter((r) => r.afterActionIndex === index)
|
|
49
|
+
.forEach((r) => {
|
|
50
|
+
refunds[relative(r.player)] += r.amount / bb;
|
|
51
|
+
});
|
|
52
|
+
return [
|
|
53
|
+
...hot(relative(action.player), 9),
|
|
54
|
+
...hot(streets.indexOf(action.street), 4),
|
|
55
|
+
...hot(['posts', 'folds', 'checks', 'calls', 'bets', 'raises'].indexOf(action.action), 6),
|
|
56
|
+
...[
|
|
57
|
+
past ? past.observed.amountAdded / bb : post ? (post.live + post.dead) / bb : 0,
|
|
58
|
+
(past?.observed.raiseTo ?? 0) / bb,
|
|
59
|
+
(post?.live ?? 0) / bb,
|
|
60
|
+
(post?.dead ?? 0) / bb,
|
|
61
|
+
].map(amount),
|
|
62
|
+
...refunds.map(amount),
|
|
63
|
+
];
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
schemaVersion: 'holdem-public-board-joint-v1',
|
|
67
|
+
context,
|
|
68
|
+
history,
|
|
69
|
+
legalMask: state.legal.map(Number),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** Convert complete PokerStars cash histories into pre-action decision inputs.
|
|
73
|
+
* Reads text, not filesystem paths. No API requests are made.
|
|
74
|
+
* Unknown private cards remain absent; revealed cards are never policy features.
|
|
75
|
+
*/
|
|
76
|
+
export function parseHandHistories(text) {
|
|
77
|
+
if (typeof text !== 'string' || !text.trim())
|
|
78
|
+
throw new Error('Hand-history text is required');
|
|
79
|
+
const chunks = text.replace(/^\uFEFF/, '').trim().split(/(?=^PokerStars Hand #)/m).filter(chunk => chunk.trim());
|
|
80
|
+
return chunks.map(chunk => {
|
|
81
|
+
const raw = parseRawHandV2(chunk.trim());
|
|
82
|
+
if (raw.provenance.currency !== 'USD')
|
|
83
|
+
throw new Error('Only PokerStars USD cash histories are supported');
|
|
84
|
+
createHandEvidence(raw.hand, { namespace: 'sdk', file: 'input.txt', line: 1 });
|
|
85
|
+
const replay = replayHand(raw.hand, raw.annotations);
|
|
86
|
+
if (!raw.settlement)
|
|
87
|
+
throw new Error('Expected a complete hand with a total-pot summary');
|
|
88
|
+
if (Math.abs(raw.settlement.totalPot - replay.finalPot) > 1e-6)
|
|
89
|
+
throw new Error('Summary pot disagrees with replay');
|
|
90
|
+
return {
|
|
91
|
+
handId: raw.hand.handId,
|
|
92
|
+
decisions: replay.decisions.map(state => {
|
|
93
|
+
const policy = encodePoint(raw, replay.decisions, state);
|
|
94
|
+
const cards = raw.observations.find(o => o.player === state.player);
|
|
95
|
+
const hand = cards?.cards.join('');
|
|
96
|
+
// Validate the encoder contract even when this player's cards are unknown.
|
|
97
|
+
if (policy.context.length !== 316 || policy.history.length > 512 || policy.history.some(row => row.length !== 32)) {
|
|
98
|
+
throw new Error('Hand exceeds the public policy contract');
|
|
99
|
+
}
|
|
100
|
+
if (hand)
|
|
101
|
+
validateActions({ policy, hand });
|
|
102
|
+
return {
|
|
103
|
+
actionIndex: state.actionIndex,
|
|
104
|
+
player: state.player,
|
|
105
|
+
street: state.street,
|
|
106
|
+
observedAction: state.observed.action,
|
|
107
|
+
policy,
|
|
108
|
+
hand,
|
|
109
|
+
cardSource: cards?.kind,
|
|
110
|
+
};
|
|
111
|
+
}),
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const RS_BUCKET_BOUNDARIES: readonly number[];
|
|
2
|
+
export declare const RS_STANDARD_BET_SIZES: readonly number[];
|
|
3
|
+
export declare const SIZE_BUCKET_LABELS: readonly ["22%", "34%", "47%", "63%", "85%", "112%", "147%", "200%", "shove"];
|
|
4
|
+
export declare const bucketToPotRatio: (index: number) => number;
|
|
5
|
+
export declare const getStandardRsSize: (bucketIndex: number) => number;
|
|
6
|
+
export declare const RS_BUCKET_COUNT: 9;
|
|
7
|
+
export declare const bucketiseBetToPotRatio: (ratio: number) => number;
|
|
8
|
+
//# sourceMappingURL=buckets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buckets.d.ts","sourceRoot":"","sources":["../../../src/history/vendor/buckets.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EASjD,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAUlD,CAAA;AAED,eAAO,MAAM,kBAAkB,+EAUrB,CAAA;AAEV,eAAO,MAAM,gBAAgB,UAAW,MAAM,KAAG,MAehD,CAAA;AAED,eAAO,MAAM,iBAAiB,gBAAiB,MAAM,KAAG,MAsBvD,CAAA;AAED,eAAO,MAAM,eAAe,GAA4B,CAAA;AAExD,eAAO,MAAM,sBAAsB,UAAW,MAAM,KAAG,MAItD,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export const RS_BUCKET_BOUNDARIES = [
|
|
2
|
+
0.28,
|
|
3
|
+
0.405,
|
|
4
|
+
0.55,
|
|
5
|
+
0.74,
|
|
6
|
+
0.985,
|
|
7
|
+
1.295,
|
|
8
|
+
1.735,
|
|
9
|
+
2.4,
|
|
10
|
+
];
|
|
11
|
+
export const RS_STANDARD_BET_SIZES = [
|
|
12
|
+
0.22,
|
|
13
|
+
0.34,
|
|
14
|
+
0.47,
|
|
15
|
+
0.63,
|
|
16
|
+
0.85,
|
|
17
|
+
1.12,
|
|
18
|
+
1.47,
|
|
19
|
+
2,
|
|
20
|
+
2.8,
|
|
21
|
+
];
|
|
22
|
+
export const SIZE_BUCKET_LABELS = [
|
|
23
|
+
'22%',
|
|
24
|
+
'34%',
|
|
25
|
+
'47%',
|
|
26
|
+
'63%',
|
|
27
|
+
'85%',
|
|
28
|
+
'112%',
|
|
29
|
+
'147%',
|
|
30
|
+
'200%',
|
|
31
|
+
'shove',
|
|
32
|
+
];
|
|
33
|
+
export const bucketToPotRatio = (index) => {
|
|
34
|
+
if (!Number.isFinite(index)) {
|
|
35
|
+
return RS_STANDARD_BET_SIZES[0] ?? 0;
|
|
36
|
+
}
|
|
37
|
+
const idx = Math.trunc(index);
|
|
38
|
+
if (idx < 0) {
|
|
39
|
+
return RS_STANDARD_BET_SIZES[0] ?? 0;
|
|
40
|
+
}
|
|
41
|
+
if (idx >= RS_STANDARD_BET_SIZES.length) {
|
|
42
|
+
return RS_STANDARD_BET_SIZES[RS_STANDARD_BET_SIZES.length - 1] ?? 0;
|
|
43
|
+
}
|
|
44
|
+
return RS_STANDARD_BET_SIZES[idx] ?? 0;
|
|
45
|
+
};
|
|
46
|
+
export const getStandardRsSize = (bucketIndex) => {
|
|
47
|
+
if (!Number.isFinite(bucketIndex)) {
|
|
48
|
+
if (Number.isNaN(bucketIndex)) {
|
|
49
|
+
return RS_STANDARD_BET_SIZES[0] ?? 0;
|
|
50
|
+
}
|
|
51
|
+
return bucketIndex > 0
|
|
52
|
+
? RS_STANDARD_BET_SIZES[RS_STANDARD_BET_SIZES.length - 1] ?? 0
|
|
53
|
+
: RS_STANDARD_BET_SIZES[0] ?? 0;
|
|
54
|
+
}
|
|
55
|
+
const index = Math.trunc(bucketIndex);
|
|
56
|
+
if (index < 0) {
|
|
57
|
+
return RS_STANDARD_BET_SIZES[0] ?? 0;
|
|
58
|
+
}
|
|
59
|
+
if (index >= RS_STANDARD_BET_SIZES.length) {
|
|
60
|
+
const last = RS_STANDARD_BET_SIZES[RS_STANDARD_BET_SIZES.length - 1];
|
|
61
|
+
return last ?? 0;
|
|
62
|
+
}
|
|
63
|
+
return RS_STANDARD_BET_SIZES[index] ?? 0;
|
|
64
|
+
};
|
|
65
|
+
export const RS_BUCKET_COUNT = SIZE_BUCKET_LABELS.length;
|
|
66
|
+
export const bucketiseBetToPotRatio = (ratio) => {
|
|
67
|
+
if (!Number.isFinite(ratio) || ratio < 0)
|
|
68
|
+
throw new Error('Bet/pot ratio must be finite and non-negative.');
|
|
69
|
+
const index = RS_BUCKET_BOUNDARIES.findIndex((boundary) => ratio <= boundary);
|
|
70
|
+
return index < 0 ? RS_BUCKET_COUNT - 1 : index;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=buckets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buckets.js","sourceRoot":"","sources":["../../../src/history/vendor/buckets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ParsedHand, Street, Action } from './types.js';
|
|
2
|
+
export declare const HAND_EVIDENCE_SCHEMA: "holdem-hand-evidence-v2-experimental";
|
|
3
|
+
export type HandEvidence = {
|
|
4
|
+
schemaVersion: typeof HAND_EVIDENCE_SCHEMA;
|
|
5
|
+
source: {
|
|
6
|
+
namespace: string;
|
|
7
|
+
file: string;
|
|
8
|
+
line: number;
|
|
9
|
+
};
|
|
10
|
+
key: string;
|
|
11
|
+
fingerprint: string;
|
|
12
|
+
hand: ParsedHand;
|
|
13
|
+
/** Offline evidence only. Legacy parsed files do not record reveal reasons. */
|
|
14
|
+
visibility: Record<string, 'known-origin-unrecorded' | 'unknown'>;
|
|
15
|
+
decisions: {
|
|
16
|
+
actionIndex: number;
|
|
17
|
+
player: string;
|
|
18
|
+
street: Street;
|
|
19
|
+
action: Action['action'];
|
|
20
|
+
}[];
|
|
21
|
+
};
|
|
22
|
+
export declare function createHandEvidence(input: ParsedHand, source: HandEvidence['source']): HandEvidence;
|
|
23
|
+
/** Deliberately excludes all private-card evidence and future public cards. */
|
|
24
|
+
export declare function publicDecisionContext(evidence: HandEvidence, actionIndex: number): {
|
|
25
|
+
handId: string;
|
|
26
|
+
actor: string;
|
|
27
|
+
street: Street;
|
|
28
|
+
bigBlindSize: number;
|
|
29
|
+
players: import("./types.js").Player[];
|
|
30
|
+
buttonSeat: number;
|
|
31
|
+
board: string[];
|
|
32
|
+
history: Action[];
|
|
33
|
+
};
|
|
34
|
+
/** Exact duplicates are skipped. Different evidence for the same hand needs reconciliation. */
|
|
35
|
+
export declare class EvidenceIndex {
|
|
36
|
+
private fingerprints;
|
|
37
|
+
accept(evidence: HandEvidence): boolean;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=handEvidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handEvidence.d.ts","sourceRoot":"","sources":["../../../src/history/vendor/handEvidence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAE5D,eAAO,MAAM,oBAAoB,EAAG,sCAA+C,CAAA;AAKnF,MAAM,MAAM,YAAY,GAAG;IACzB,aAAa,EAAE,OAAO,oBAAoB,CAAA;IAC1C,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACzD,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,SAAS,CAAC,CAAA;IACjE,SAAS,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;KAAE,EAAE,CAAA;CAC/F,CAAA;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,YAAY,CA0ClG;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM;;;;;;;;;EAQhF;AAED,+FAA+F;AAC/F,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAA2B;IAC/C,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;CAOxC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export const HAND_EVIDENCE_SCHEMA = 'holdem-hand-evidence-v2-experimental';
|
|
3
|
+
const streets = ['preflop', 'flop', 'turn', 'river'];
|
|
4
|
+
const boardLengths = [0, 3, 4, 5];
|
|
5
|
+
const cardPattern = /^[2-9TJQKA][cdhs]$/;
|
|
6
|
+
export function createHandEvidence(input, source) {
|
|
7
|
+
// Own the data so later caller mutations cannot alter the saved evidence.
|
|
8
|
+
const hand = structuredClone(input);
|
|
9
|
+
if (!source.namespace || !source.file || !Number.isInteger(source.line) || source.line < 1 || !hand.handId)
|
|
10
|
+
throw new Error('Missing hand/source identity');
|
|
11
|
+
if (!(hand.bigBlindSize > 0) || !Number.isFinite(hand.bigBlindSize))
|
|
12
|
+
throw new Error('Invalid big blind');
|
|
13
|
+
if (!Array.isArray(hand.players) || hand.players.length < 2)
|
|
14
|
+
throw new Error('Missing players');
|
|
15
|
+
const names = new Set(hand.players.map(p => p.name));
|
|
16
|
+
const seats = new Set(hand.players.map(p => p.seat));
|
|
17
|
+
if (names.size !== hand.players.length || seats.size !== hand.players.length || !seats.has(hand.buttonSeat))
|
|
18
|
+
throw new Error('Invalid player/seat identity');
|
|
19
|
+
for (const player of hand.players)
|
|
20
|
+
if (!player.name || !Number.isInteger(player.seat) || player.seat < 1 || !Number.isFinite(player.stack) || player.stack < 0)
|
|
21
|
+
throw new Error('Invalid player');
|
|
22
|
+
if (![0, 3, 4, 5].includes(hand.board.length))
|
|
23
|
+
throw new Error('Invalid board length');
|
|
24
|
+
const occupied = new Set();
|
|
25
|
+
const addCard = (card) => {
|
|
26
|
+
if (!cardPattern.test(card) || occupied.has(card))
|
|
27
|
+
throw new Error(`Invalid/colliding card: ${card}`);
|
|
28
|
+
occupied.add(card);
|
|
29
|
+
};
|
|
30
|
+
hand.board.forEach(addCard);
|
|
31
|
+
for (const [player, cards] of Object.entries(hand.knownCards)) {
|
|
32
|
+
if (!names.has(player) || cards.length !== 2)
|
|
33
|
+
throw new Error('Invalid known-card evidence');
|
|
34
|
+
cards.forEach(addCard);
|
|
35
|
+
}
|
|
36
|
+
let previousStreet = 0;
|
|
37
|
+
const decisions = [];
|
|
38
|
+
hand.actions.forEach((action, actionIndex) => {
|
|
39
|
+
const streetIndex = streets.indexOf(action.street);
|
|
40
|
+
if (!names.has(action.player) || streetIndex < previousStreet || streetIndex < 0 || hand.board.length < boardLengths[streetIndex])
|
|
41
|
+
throw new Error('Invalid action ordering/actor/board');
|
|
42
|
+
if (!['posts', 'folds', 'checks', 'calls', 'bets', 'raises'].includes(action.action) || !Number.isFinite(action.pot) || action.pot < 0 || (action.size !== null && (!Number.isFinite(action.size) || action.size < 0)))
|
|
43
|
+
throw new Error('Invalid action amount/type');
|
|
44
|
+
previousStreet = streetIndex;
|
|
45
|
+
if (action.action !== 'posts')
|
|
46
|
+
decisions.push({ actionIndex, player: action.player, street: action.street, action: action.action });
|
|
47
|
+
});
|
|
48
|
+
// Sort unordered maps/players for repeatable duplicate detection. Preserve action order.
|
|
49
|
+
const canonical = { handId: hand.handId, bigBlindSize: hand.bigBlindSize, buttonSeat: hand.buttonSeat,
|
|
50
|
+
players: [...hand.players].sort((a, b) => a.seat - b.seat), actions: hand.actions, board: hand.board,
|
|
51
|
+
knownCards: Object.fromEntries(Object.entries(hand.knownCards).sort(([a], [b]) => a.localeCompare(b)).map(([name, cards]) => [name, [...cards].sort()])),
|
|
52
|
+
returnedBets: Object.fromEntries(streets.filter(street => hand.returnedBets?.[street]).map(street => [street, Object.fromEntries(Object.entries(hand.returnedBets[street]).sort(([a], [b]) => a.localeCompare(b)))])),
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
schemaVersion: HAND_EVIDENCE_SCHEMA, source: { ...source },
|
|
56
|
+
key: JSON.stringify([source.namespace, hand.handId]),
|
|
57
|
+
fingerprint: createHash('sha256').update(JSON.stringify(canonical)).digest('hex'),
|
|
58
|
+
hand, visibility: Object.fromEntries(hand.players.map(p => [p.name, hand.knownCards[p.name] ? 'known-origin-unrecorded' : 'unknown'])), decisions,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Deliberately excludes all private-card evidence and future public cards. */
|
|
62
|
+
export function publicDecisionContext(evidence, actionIndex) {
|
|
63
|
+
if (!evidence.decisions.some(d => d.actionIndex === actionIndex))
|
|
64
|
+
throw new Error('Not a decision index');
|
|
65
|
+
const action = evidence.hand.actions[actionIndex];
|
|
66
|
+
return structuredClone({ handId: evidence.hand.handId, actor: action.player, street: action.street,
|
|
67
|
+
bigBlindSize: evidence.hand.bigBlindSize, players: evidence.hand.players, buttonSeat: evidence.hand.buttonSeat,
|
|
68
|
+
board: evidence.hand.board.slice(0, boardLengths[streets.indexOf(action.street)]),
|
|
69
|
+
history: evidence.hand.actions.slice(0, actionIndex),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/** Exact duplicates are skipped. Different evidence for the same hand needs reconciliation. */
|
|
73
|
+
export class EvidenceIndex {
|
|
74
|
+
fingerprints = new Map();
|
|
75
|
+
accept(evidence) {
|
|
76
|
+
const previous = this.fingerprints.get(evidence.key);
|
|
77
|
+
if (previous && previous !== evidence.fingerprint)
|
|
78
|
+
throw new Error(`Conflicting duplicate hand: ${evidence.key}`);
|
|
79
|
+
if (previous)
|
|
80
|
+
return false;
|
|
81
|
+
this.fingerprints.set(evidence.key, evidence.fingerprint);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=handEvidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handEvidence.js","sourceRoot":"","sources":["../../../src/history/vendor/handEvidence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,MAAM,CAAC,MAAM,oBAAoB,GAAG,sCAA+C,CAAA;AACnF,MAAM,OAAO,GAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;AAC9D,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AACjC,MAAM,WAAW,GAAG,oBAAoB,CAAA;AAaxC,MAAM,UAAU,kBAAkB,CAAC,KAAiB,EAAE,MAA8B;IAClF,0EAA0E;IAC1E,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACnC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAC3J,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACzG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAC/F,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACpD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACpD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAC5J,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO;QAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACjM,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACnF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;QAC/B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;QACrG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC,CAAA;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAC5F,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,MAAM,SAAS,GAA8B,EAAE,CAAA;IAC/C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;QAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,WAAW,GAAG,cAAc,IAAI,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,WAAW,CAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QAC1L,IAAI,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAChQ,cAAc,GAAG,WAAW,CAAA;QAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;YAAE,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IACrI,CAAC,CAAC,CAAA;IACF,yFAAyF;IACzF,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU;QACnG,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjG,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrJ,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAa,CAAC,MAAM,CAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAC,EAAE,CAAA,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACpN,CAAA;IACD,OAAO;QACL,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAC,GAAG,MAAM,EAAC;QACxD,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACjF,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS;KAClJ,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB,CAAC,QAAsB,EAAE,WAAmB;IAC/E,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACzG,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAE,CAAA;IAClD,OAAO,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM;QAChG,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU;QAC9G,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;KACrD,CAAC,CAAA;AACJ,CAAC;AAED,+FAA+F;AAC/F,MAAM,OAAO,aAAa;IAChB,YAAY,GAAG,IAAI,GAAG,EAAiB,CAAA;IAC/C,MAAM,CAAC,QAAsB;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACpD,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;QACjH,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAA;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACxD,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ParsedHand } from './types.js';
|
|
2
|
+
import type { ReplayAnnotations } from './replay.js';
|
|
3
|
+
export type RawHandV2 = {
|
|
4
|
+
hand: ParsedHand;
|
|
5
|
+
annotations: ReplayAnnotations;
|
|
6
|
+
settlement: {
|
|
7
|
+
totalPot: number;
|
|
8
|
+
rake: number | null;
|
|
9
|
+
} | null;
|
|
10
|
+
provenance: {
|
|
11
|
+
site: 'PokerStars';
|
|
12
|
+
format: 'regular-cash';
|
|
13
|
+
currency: string;
|
|
14
|
+
localTimestamp: string;
|
|
15
|
+
timezone: 'ET';
|
|
16
|
+
smallBlind: number;
|
|
17
|
+
sha256: string;
|
|
18
|
+
};
|
|
19
|
+
observations: {
|
|
20
|
+
player: string;
|
|
21
|
+
cards: readonly [string, string];
|
|
22
|
+
kind: 'dealt-to-hero' | 'showdown-show' | 'voluntary-show' | 'fold-reveal' | 'summary-show' | 'summary-muck';
|
|
23
|
+
afterActionIndex: number;
|
|
24
|
+
}[];
|
|
25
|
+
};
|
|
26
|
+
/** Strict V2 reader for ordinary PokerStars NL Hold'em cash text. Unsupported
|
|
27
|
+
* game/post/action syntax is rejected, not silently converted into training data.
|
|
28
|
+
* V1 parsing and existing datasets are unchanged.
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseRawHandV2(raw: string): RawHandV2;
|
|
31
|
+
//# sourceMappingURL=rawHand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawHand.d.ts","sourceRoot":"","sources":["../../../src/history/vendor/rawHand.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,iBAAiB,CAAA;IAChD,UAAU,EAAE;QAAC,QAAQ,EAAC,MAAM,CAAC;QAAA,IAAI,EAAC,MAAM,GAAC,IAAI,CAAA;KAAC,GAAC,IAAI,CAAA;IACnD,UAAU,EAAE;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACxJ,YAAY,EAAE;QAAC,MAAM,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,SAAS,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;QAAA,IAAI,EAAC,eAAe,GAAC,eAAe,GAAC,gBAAgB,GAAC,aAAa,GAAC,cAAc,GAAC,cAAc,CAAC;QAAA,gBAAgB,EAAC,MAAM,CAAA;KAAC,EAAE,CAAA;CACzL,CAAA;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CA8FrD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const money = (raw) => Number(raw.replace(/[$,]/g, ''));
|
|
3
|
+
const clean = (x) => Math.round(x * 1e8) / 1e8;
|
|
4
|
+
/** Strict V2 reader for ordinary PokerStars NL Hold'em cash text. Unsupported
|
|
5
|
+
* game/post/action syntax is rejected, not silently converted into training data.
|
|
6
|
+
* V1 parsing and existing datasets are unchanged.
|
|
7
|
+
*/
|
|
8
|
+
export function parseRawHandV2(raw) {
|
|
9
|
+
const lines = raw.replaceAll('\r', '').split('\n');
|
|
10
|
+
const header = (lines.find(line => line.trim()) ?? '').trim();
|
|
11
|
+
const match = header.match(/^PokerStars Hand #(\d+):\s+Hold'em No Limit \(\$([\d.]+)\/\$([\d.]+) (\w+)\) - (\d{4}\/\d{2}\/\d{2} \d{1,2}:\d{2}:\d{2}) ET$/);
|
|
12
|
+
if (!match)
|
|
13
|
+
throw new Error('Unsupported header: expected ordinary PokerStars USD-style NL cash with ET timestamp');
|
|
14
|
+
const smallBlind = money(match[2]), bigBlindSize = money(match[3]);
|
|
15
|
+
if (!(smallBlind > 0 && bigBlindSize >= smallBlind))
|
|
16
|
+
throw new Error('Invalid stakes');
|
|
17
|
+
const hand = { handId: match[1], bigBlindSize, buttonSeat: 0, players: [], actions: [], board: [], knownCards: {} };
|
|
18
|
+
const annotations = { posts: {}, refunds: [] };
|
|
19
|
+
const observations = [];
|
|
20
|
+
let settlement = null;
|
|
21
|
+
let street = 'preflop', pot = 0, summary = false, showdown = false;
|
|
22
|
+
const contributions = new Map();
|
|
23
|
+
const observe = (player, cards, kind) => {
|
|
24
|
+
if (!hand.players.some(p => p.name === player))
|
|
25
|
+
throw new Error('Card reveal for unknown player');
|
|
26
|
+
const previous = hand.knownCards[player];
|
|
27
|
+
if (previous && previous.some(card => !cards.includes(card)))
|
|
28
|
+
throw new Error('Conflicting card reveal');
|
|
29
|
+
hand.knownCards[player] = [...cards];
|
|
30
|
+
observations.push({ player, cards, kind, afterActionIndex: kind === 'dealt-to-hero' ? -1 : hand.actions.length - 1 });
|
|
31
|
+
};
|
|
32
|
+
for (const line of lines.slice(1)) {
|
|
33
|
+
if (line.startsWith('*** SUMMARY ***')) {
|
|
34
|
+
summary = true;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (line.startsWith('*** SHOW DOWN ***')) {
|
|
38
|
+
showdown = true;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (!summary) {
|
|
42
|
+
const table = line.match(/^Table .+ (\d+)-max Seat #(\d+) is the button$/);
|
|
43
|
+
if (table) {
|
|
44
|
+
hand.buttonSeat = Number(table[2]);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const seat = line.match(/^Seat (\d+): (.+) \(\$([\d.,]+) in chips\)/);
|
|
48
|
+
if (seat) {
|
|
49
|
+
hand.players.push({ seat: Number(seat[1]), name: seat[2], stack: money(seat[3]) });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const next = line.startsWith('*** FLOP ***') ? 'flop' : line.startsWith('*** TURN ***') ? 'turn' : line.startsWith('*** RIVER ***') ? 'river' : null;
|
|
53
|
+
if (next) {
|
|
54
|
+
street = next;
|
|
55
|
+
contributions.clear();
|
|
56
|
+
const groups = [...line.matchAll(/\[([^\]]+)\]/g)];
|
|
57
|
+
if (next === 'flop')
|
|
58
|
+
hand.board = groups[0][1].split(' ');
|
|
59
|
+
else
|
|
60
|
+
hand.board.push(groups.at(-1)[1]);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const dealt = line.match(/^Dealt to (.+) \[(\w\w) (\w\w)\]/);
|
|
64
|
+
if (dealt) {
|
|
65
|
+
observe(dealt[1], [dealt[2], dealt[3]], 'dealt-to-hero');
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const returned = line.match(/^Uncalled bet \(\$([\d.,]+)\) returned to (.+)$/);
|
|
69
|
+
if (returned) {
|
|
70
|
+
const amount = money(returned[1]), player = returned[2];
|
|
71
|
+
annotations.refunds.push({ afterActionIndex: hand.actions.length - 1, player, amount });
|
|
72
|
+
hand.returnedBets ??= {};
|
|
73
|
+
hand.returnedBets[street] ??= {};
|
|
74
|
+
hand.returnedBets[street][player] = clean((hand.returnedBets[street][player] ?? 0) + amount);
|
|
75
|
+
contributions.set(player, clean((contributions.get(player) ?? 0) - amount));
|
|
76
|
+
pot = clean(pot - amount);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const posted = line.match(/^(.+): posts (.+) \$([\d.,]+)(?: and is all-in)?$/);
|
|
80
|
+
if (posted) {
|
|
81
|
+
const player = posted[1], kind = posted[2], amount = money(posted[3]);
|
|
82
|
+
let live, dead;
|
|
83
|
+
let annotationKind = kind;
|
|
84
|
+
if (kind === 'small blind') {
|
|
85
|
+
const seated = [...hand.players].sort((a, b) => a.seat - b.seat);
|
|
86
|
+
const button = seated.findIndex(p => p.seat === hand.buttonSeat);
|
|
87
|
+
if (button < 0)
|
|
88
|
+
throw new Error('Cannot identify small-blind seat');
|
|
89
|
+
const smallBlindPlayer = seated[(button + (seated.length === 2 ? 0 : 1)) % seated.length].name;
|
|
90
|
+
if (player === smallBlindPlayer) {
|
|
91
|
+
live = amount;
|
|
92
|
+
dead = 0;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
live = 0;
|
|
96
|
+
dead = amount;
|
|
97
|
+
annotationKind = 'dead-small-blind';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else if (kind === 'big blind') {
|
|
101
|
+
live = amount;
|
|
102
|
+
dead = 0;
|
|
103
|
+
}
|
|
104
|
+
else if (kind === 'small & big blinds') {
|
|
105
|
+
live = bigBlindSize;
|
|
106
|
+
dead = clean(amount - live);
|
|
107
|
+
if (Math.abs(dead - smallBlind) > 1e-6)
|
|
108
|
+
throw new Error('Unexpected combined blind');
|
|
109
|
+
}
|
|
110
|
+
else if (kind === 'the ante' || kind === 'ante' || kind === 'dead blind') {
|
|
111
|
+
live = 0;
|
|
112
|
+
dead = amount;
|
|
113
|
+
}
|
|
114
|
+
else
|
|
115
|
+
throw new Error(`Unsupported forced post: ${kind}`);
|
|
116
|
+
annotations.posts[hand.actions.length] = { live, dead, kind: annotationKind };
|
|
117
|
+
hand.actions.push({ street, player, action: 'posts', size: amount, pot });
|
|
118
|
+
pot = clean(pot + amount);
|
|
119
|
+
contributions.set(player, clean((contributions.get(player) ?? 0) + live));
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const action = line.match(/^(.+): (folds|checks|calls|bets|raises)(?: \$([\d.,]+))?(?: to \$([\d.,]+))?(?: and is all-in)?(?: \[(\w\w) (\w\w)\])?\s*$/);
|
|
123
|
+
if (action) {
|
|
124
|
+
const player = action[1], type = action[2];
|
|
125
|
+
const size = action[4] ? money(action[4]) : action[3] ? money(action[3]) : null;
|
|
126
|
+
if (type === 'raises' && !action[4])
|
|
127
|
+
throw new Error('Raise missing explicit raise-to amount');
|
|
128
|
+
if (type === 'raises' && action[3]) {
|
|
129
|
+
const highest = Math.max(street === 'preflop' ? bigBlindSize : 0, ...contributions.values());
|
|
130
|
+
if (Math.abs(money(action[3]) - (size - highest)) > 1e-6)
|
|
131
|
+
throw new Error('Declared raise increment disagrees with raise-to amount');
|
|
132
|
+
}
|
|
133
|
+
const before = contributions.get(player) ?? 0;
|
|
134
|
+
const added = type === 'raises' ? (size ?? 0) - before : type === 'calls' || type === 'bets' ? (size ?? 0) : 0;
|
|
135
|
+
hand.actions.push({ street, player, action: type, size, pot });
|
|
136
|
+
pot = clean(pot + added);
|
|
137
|
+
if (action[5] && action[6])
|
|
138
|
+
observe(player, [action[5], action[6]], type === 'folds' ? 'fold-reveal' : 'voluntary-show');
|
|
139
|
+
contributions.set(player, clean(before + added));
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const show = line.match(/^(.+): shows \[(\w\w) (\w\w)\]/);
|
|
143
|
+
if (show) {
|
|
144
|
+
observe(show[1], [show[2], show[3]], showdown ? 'showdown-show' : 'voluntary-show');
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (/^.+: (posts|calls|bets|raises|folds|checks)\b/.test(line))
|
|
148
|
+
throw new Error(`Unrecognized betting line: ${line}`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const total = line.match(/^Total pot \$([\d.,]+).*?(?:\| Rake \$([\d.,]+))?$/);
|
|
152
|
+
if (total)
|
|
153
|
+
settlement = { totalPot: money(total[1]), rake: line.match(/\| Rake \$([\d.,]+)/)?.[1] ? money(line.match(/\| Rake \$([\d.,]+)/)[1]) : null };
|
|
154
|
+
const shown = line.match(/^Seat \d+: (.+?)(?: \([^)]*\))* (showed|mucked) \[(\w\w) (\w\w)\]/);
|
|
155
|
+
if (shown)
|
|
156
|
+
observe(shown[1], [shown[3], shown[4]], shown[2] === 'mucked' ? 'summary-muck' : 'summary-show');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (hand.players.length < 2 || hand.players.length > 9 || !hand.buttonSeat)
|
|
160
|
+
throw new Error('Unsupported/missing table setup');
|
|
161
|
+
return { hand, annotations, settlement, observations, provenance: { site: 'PokerStars', format: 'regular-cash', currency: match[4], localTimestamp: match[5].replace(/ (\d):/, ' 0$1:'), timezone: 'ET', smallBlind, sha256: createHash('sha256').update(raw).digest('hex') } };
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=rawHand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawHand.js","sourceRoot":"","sources":["../../../src/history/vendor/rawHand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAUxC,MAAM,KAAK,GAAG,CAAC,GAAU,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAC,EAAE,CAAC,CAAC,CAAA;AAC7D,MAAM,KAAK,GAAG,CAAC,CAAQ,EAAC,EAAE,CAAA,IAAI,CAAC,KAAK,CAAC,CAAC,GAAC,GAAG,CAAC,GAAC,GAAG,CAAA;AAE/C;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,KAAK,GAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,CAAC,IAAI,EAAE,CAAC,IAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACvD,MAAM,KAAK,GAAC,MAAM,CAAC,KAAK,CAAC,8HAA8H,CAAC,CAAA;IACxJ,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAA;IACnH,MAAM,UAAU,GAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAC,YAAY,GAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;IAC/D,IAAI,CAAC,CAAC,UAAU,GAAC,CAAC,IAAE,YAAY,IAAE,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAChF,MAAM,IAAI,GAAY,EAAC,MAAM,EAAC,KAAK,CAAC,CAAC,CAAE,EAAC,YAAY,EAAC,UAAU,EAAC,CAAC,EAAC,OAAO,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,UAAU,EAAC,EAAE,EAAC,CAAA;IAC/G,MAAM,WAAW,GAAmB,EAAC,KAAK,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,CAAA;IACzD,MAAM,YAAY,GAA2B,EAAE,CAAA;IAC/C,IAAI,UAAU,GAAyB,IAAI,CAAA;IAC3C,IAAI,MAAM,GAAQ,SAAS,EAAC,GAAG,GAAC,CAAC,EAAC,OAAO,GAAC,KAAK,EAAC,QAAQ,GAAC,KAAK,CAAA;IAC9D,MAAM,aAAa,GAAC,IAAI,GAAG,EAAiB,CAAA;IAC5C,MAAM,OAAO,GAAC,CAAC,MAAa,EAAC,KAA8B,EAAC,IAA8C,EAAC,EAAE;QAC3G,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,KAAG,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QAC7F,MAAM,QAAQ,GAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,QAAQ,IAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAA,EAAE,CAAA,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QACpG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAC,CAAC,GAAG,KAAK,CAAC,CAAA;QAClC,YAAY,CAAC,IAAI,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,IAAI,EAAC,gBAAgB,EAAC,IAAI,KAAG,eAAe,CAAA,CAAC,CAAA,CAAC,CAAC,CAAA,CAAC,CAAA,IAAI,CAAC,OAAO,CAAC,MAAM,GAAC,CAAC,EAAC,CAAC,CAAA;IACzG,CAAC,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAAA,OAAO,GAAC,IAAI,CAAC;YAAA,SAAQ;QAAA,CAAC;QAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAAA,QAAQ,GAAC,IAAI,CAAC;YAAA,SAAQ;QAAA,CAAC;QAClE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAA;YACxE,IAAI,KAAK,EAAE,CAAC;gBAAA,IAAI,CAAC,UAAU,GAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAA,SAAQ;YAAA,CAAC;YACtD,MAAM,IAAI,GAAC,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAA;YACnE,IAAI,IAAI,EAAE,CAAC;gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,IAAI,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,CAAE,EAAC,KAAK,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAC,CAAC,CAAC;gBAAA,SAAQ;YAAA,CAAC;YAClG,MAAM,IAAI,GAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA,CAAC,CAAA,OAAO,CAAA,CAAC,CAAA,IAAI,CAAA;YACtI,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,GAAC,IAAI,CAAC;gBAAA,aAAa,CAAC,KAAK,EAAE,CAAA;gBACjC,MAAM,MAAM,GAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAA;gBAChD,IAAI,IAAI,KAAG,MAAM;oBAAE,IAAI,CAAC,KAAK,GAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;;oBAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,CAAA;gBACxC,SAAQ;YACV,CAAC;YACD,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;YAC1D,IAAI,KAAK,EAAE,CAAC;gBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,EAAC,CAAC,KAAK,CAAC,CAAC,CAAE,EAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAC,eAAe,CAAC,CAAC;gBAAA,SAAQ;YAAA,CAAC;YAC9E,MAAM,QAAQ,GAAC,IAAI,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAA;YAC5E,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,MAAM,GAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,EAAC,MAAM,GAAC,QAAQ,CAAC,CAAC,CAAE,CAAA;gBACpD,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,gBAAgB,EAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAC,CAAC,EAAC,MAAM,EAAC,MAAM,EAAC,CAAC,CAAA;gBAChF,IAAI,CAAC,YAAY,KAAG,EAAE,CAAC;gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAG,EAAE,CAAA;gBACrD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAE,CAAC,MAAM,CAAC,GAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAE,CAAC,MAAM,CAAC,IAAE,CAAC,CAAC,GAAC,MAAM,CAAC,CAAA;gBACxF,aAAa,CAAC,GAAG,CAAC,MAAM,EAAC,KAAK,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAE,CAAC,CAAC,GAAC,MAAM,CAAC,CAAC,CAAC;gBAAA,GAAG,GAAC,KAAK,CAAC,GAAG,GAAC,MAAM,CAAC,CAAC;gBAAA,SAAQ;YACvG,CAAC;YACD,MAAM,MAAM,GAAC,IAAI,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAA;YAC5E,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GAAC,MAAM,CAAC,CAAC,CAAE,EAAC,IAAI,GAAC,MAAM,CAAC,CAAC,CAAE,EAAC,MAAM,GAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAA;gBAChE,IAAI,IAAW,EAAC,IAAW,CAAA;gBAC3B,IAAI,cAAc,GAAC,IAAI,CAAA;gBACvB,IAAI,IAAI,KAAG,aAAa,EAAE,CAAC;oBACzB,MAAM,MAAM,GAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAA,CAAC,CAAC,IAAI,GAAC,CAAC,CAAC,IAAI,CAAC,CAAA;oBACzD,MAAM,MAAM,GAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,KAAG,IAAI,CAAC,UAAU,CAAC,CAAA;oBAC1D,IAAG,MAAM,GAAC,CAAC;wBAAC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;oBAC/D,MAAM,gBAAgB,GAAC,MAAM,CAAC,CAAC,MAAM,GAAC,CAAC,MAAM,CAAC,MAAM,KAAG,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,MAAM,CAAE,CAAC,IAAI,CAAA;oBACnF,IAAG,MAAM,KAAG,gBAAgB,EAAE,CAAC;wBAAA,IAAI,GAAC,MAAM,CAAC;wBAAA,IAAI,GAAC,CAAC,CAAA;oBAAA,CAAC;yBAC7C,CAAC;wBAAA,IAAI,GAAC,CAAC,CAAC;wBAAA,IAAI,GAAC,MAAM,CAAC;wBAAA,cAAc,GAAC,kBAAkB,CAAA;oBAAA,CAAC;gBAC7D,CAAC;qBACI,IAAI,IAAI,KAAG,WAAW,EAAE,CAAC;oBAAA,IAAI,GAAC,MAAM,CAAC;oBAAA,IAAI,GAAC,CAAC,CAAA;gBAAA,CAAC;qBAC5C,IAAI,IAAI,KAAG,oBAAoB,EAAE,CAAC;oBAAA,IAAI,GAAC,YAAY,CAAC;oBAAA,IAAI,GAAC,KAAK,CAAC,MAAM,GAAC,IAAI,CAAC,CAAC;oBAAA,IAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAC,UAAU,CAAC,GAAC,IAAI;wBAAC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;gBAAA,CAAC;qBAC3J,IAAI,IAAI,KAAG,UAAU,IAAE,IAAI,KAAG,MAAM,IAAE,IAAI,KAAG,YAAY,EAAE,CAAC;oBAAA,IAAI,GAAC,CAAC,CAAC;oBAAA,IAAI,GAAC,MAAM,CAAA;gBAAA,CAAC;;oBAC/E,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAA;gBACxD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAC,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,cAAc,EAAC,CAAA;gBACtE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,GAAG,EAAC,CAAC,CAAC;gBAAA,GAAG,GAAC,KAAK,CAAC,GAAG,GAAC,MAAM,CAAC,CAAA;gBACvF,aAAa,CAAC,GAAG,CAAC,MAAM,EAAC,KAAK,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAE,CAAC,CAAC,GAAC,IAAI,CAAC,CAAC,CAAC;gBAAA,SAAQ;YAC/E,CAAC;YACD,MAAM,MAAM,GAAC,IAAI,CAAC,KAAK,CAAC,4HAA4H,CAAC,CAAA;YACrJ,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GAAC,MAAM,CAAC,CAAC,CAAE,EAAC,IAAI,GAAC,MAAM,CAAC,CAAC,CAAqB,CAAA;gBAC1D,MAAM,IAAI,GAAC,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,IAAI,CAAA;gBACrE,IAAI,IAAI,KAAG,QAAQ,IAAE,CAAC,MAAM,CAAC,CAAC,CAAC;oBAAC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;gBACzF,IAAG,IAAI,KAAG,QAAQ,IAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9B,MAAM,OAAO,GAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,YAAY,CAAA,CAAC,CAAA,CAAC,EAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAA;oBACnF,IAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,IAAK,GAAC,OAAO,CAAC,CAAC,GAAC,IAAI;wBAAC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;gBAC/H,CAAC;gBACD,MAAM,MAAM,GAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAE,CAAC,CAAA;gBACzC,MAAM,KAAK,GAAC,IAAI,KAAG,QAAQ,CAAA,CAAC,CAAA,CAAC,IAAI,IAAE,CAAC,CAAC,GAAC,MAAM,CAAA,CAAC,CAAA,IAAI,KAAG,OAAO,IAAE,IAAI,KAAG,MAAM,CAAA,CAAC,CAAA,CAAC,IAAI,IAAE,CAAC,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA;gBACtF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,CAAC,CAAC;gBAAA,GAAG,GAAC,KAAK,CAAC,GAAG,GAAC,KAAK,CAAC,CAAA;gBAC5E,IAAI,MAAM,CAAC,CAAC,CAAC,IAAE,MAAM,CAAC,CAAC,CAAC;oBAAE,OAAO,CAAC,MAAM,EAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAC,IAAI,KAAG,OAAO,CAAA,CAAC,CAAA,aAAa,CAAA,CAAC,CAAA,gBAAgB,CAAC,CAAA;gBAC7G,aAAa,CAAC,GAAG,CAAC,MAAM,EAAC,KAAK,CAAC,MAAM,GAAC,KAAK,CAAC,CAAC,CAAC;gBAAA,SAAQ;YACxD,CAAC;YACD,MAAM,IAAI,GAAC,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAA;YACvD,IAAI,IAAI,EAAE,CAAC;gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAC,CAAC,IAAI,CAAC,CAAC,CAAE,EAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAC,QAAQ,CAAA,CAAC,CAAA,eAAe,CAAA,CAAC,CAAA,gBAAgB,CAAC,CAAC;gBAAA,SAAQ;YAAA,CAAC;YACpG,IAAI,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAA;QACtH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAA;YAC5E,IAAG,KAAK;gBAAC,UAAU,GAAC,EAAC,QAAQ,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAC,IAAI,EAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAE,CAAC,CAAC,CAAE,CAAC,CAAA,CAAC,CAAA,IAAI,EAAC,CAAA;YAC9I,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAA;YAC3F,IAAI,KAAK;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,EAAC,CAAC,KAAK,CAAC,CAAC,CAAE,EAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAC,KAAK,CAAC,CAAC,CAAC,KAAG,QAAQ,CAAA,CAAC,CAAA,cAAc,CAAA,CAAC,CAAA,cAAc,CAAC,CAAA;QACvG,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAC,CAAC,IAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAC,CAAC,IAAE,CAAC,IAAI,CAAC,UAAU;QAAC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACrH,OAAO,EAAC,IAAI,EAAC,WAAW,EAAC,UAAU,EAAC,YAAY,EAAC,UAAU,EAAC,EAAC,IAAI,EAAC,YAAY,EAAC,MAAM,EAAC,cAAc,EAAC,QAAQ,EAAC,KAAK,CAAC,CAAC,CAAE,EAAC,cAAc,EAAC,KAAK,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,QAAQ,EAAC,OAAO,CAAC,EAAC,QAAQ,EAAC,IAAI,EAAC,UAAU,EAAC,MAAM,EAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAC,EAAC,CAAA;AAC7P,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ParsedHand, Street } from './types.js';
|
|
2
|
+
export type ReplayAnnotations = {
|
|
3
|
+
posts: Record<number, {
|
|
4
|
+
live: number;
|
|
5
|
+
dead: number;
|
|
6
|
+
kind: string;
|
|
7
|
+
}>;
|
|
8
|
+
refunds: {
|
|
9
|
+
afterActionIndex: number;
|
|
10
|
+
player: string;
|
|
11
|
+
amount: number;
|
|
12
|
+
}[];
|
|
13
|
+
};
|
|
14
|
+
export type DecisionState = {
|
|
15
|
+
actionIndex: number;
|
|
16
|
+
player: string;
|
|
17
|
+
street: Street;
|
|
18
|
+
board: string[];
|
|
19
|
+
pot: number;
|
|
20
|
+
stack: number;
|
|
21
|
+
contribution: number;
|
|
22
|
+
currentBet: number;
|
|
23
|
+
facing: number;
|
|
24
|
+
callAmount: number;
|
|
25
|
+
minRaiseTo: number;
|
|
26
|
+
maxRaiseTo: number;
|
|
27
|
+
raiseReopened: boolean;
|
|
28
|
+
legal: readonly [boolean, boolean, boolean];
|
|
29
|
+
stacks: Record<string, number>;
|
|
30
|
+
contributions: Record<string, number>;
|
|
31
|
+
active: string[];
|
|
32
|
+
observed: {
|
|
33
|
+
action: string;
|
|
34
|
+
amountAdded: number;
|
|
35
|
+
raiseTo: number | null;
|
|
36
|
+
allIn: boolean;
|
|
37
|
+
addedToPot: number | null;
|
|
38
|
+
raiseToPot: number | null;
|
|
39
|
+
legacyBucket: number | null;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
/** No-limit full-bet reopening, including cumulative short all-ins. Not side-pot settlement.
|
|
43
|
+
* Strict mode requires raw forced-post and refund annotations; legacy parsed files
|
|
44
|
+
* cannot distinguish live and dead blind money. Unsupported states fail closed.
|
|
45
|
+
*/
|
|
46
|
+
export declare function replayHand(hand: ParsedHand, annotations: ReplayAnnotations): {
|
|
47
|
+
decisions: DecisionState[];
|
|
48
|
+
finalPot: number;
|
|
49
|
+
finalStacks: Record<string, number>;
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../../src/history/vendor/replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAMpD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnE,OAAO,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACxE,CAAA;AACD,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;IACpE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;IACpE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;IAC1E,aAAa,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,CAAC,CAAA;IACjE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;IACrF,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QACtF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CACtF,CAAA;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,GAAG;IAAC,SAAS,EAAE,aAAa,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAA;CAAC,CA6G/J"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { bucketiseBetToPotRatio } from './buckets.js';
|
|
2
|
+
const streets = ['preflop', 'flop', 'turn', 'river'];
|
|
3
|
+
const EPS = 1e-6;
|
|
4
|
+
const clean = (x) => Math.round(x * 1e8) / 1e8;
|
|
5
|
+
/** No-limit full-bet reopening, including cumulative short all-ins. Not side-pot settlement.
|
|
6
|
+
* Strict mode requires raw forced-post and refund annotations; legacy parsed files
|
|
7
|
+
* cannot distinguish live and dead blind money. Unsupported states fail closed.
|
|
8
|
+
*/
|
|
9
|
+
export function replayHand(hand, annotations) {
|
|
10
|
+
const stacks = new Map(hand.players.map(p => [p.name, p.stack]));
|
|
11
|
+
const contributions = new Map(hand.players.map(p => [p.name, 0]));
|
|
12
|
+
const active = new Set(hand.players.map(p => p.name));
|
|
13
|
+
const actedAt = new Map();
|
|
14
|
+
const seats = [...hand.players].sort((a, b) => a.seat - b.seat).map(p => p.name);
|
|
15
|
+
const button = hand.players.find(p => p.seat === hand.buttonSeat)?.name;
|
|
16
|
+
if (!button || seats.length < 2)
|
|
17
|
+
throw new Error('Invalid table setup');
|
|
18
|
+
let pending, cursor = 0;
|
|
19
|
+
const beginRound = () => {
|
|
20
|
+
pending = new Set([...active].filter(name => stacks.get(name) > EPS));
|
|
21
|
+
const buttonIndex = seats.indexOf(button);
|
|
22
|
+
cursor = (buttonIndex + (street === 'preflop' ? (seats.length === 2 ? 0 : 3) : 1)) % seats.length;
|
|
23
|
+
// No betting round exists when nobody can respond to the sole live stack.
|
|
24
|
+
if (pending.size === 1) {
|
|
25
|
+
const name = [...pending][0];
|
|
26
|
+
if (contributions.get(name) + EPS >= currentBet)
|
|
27
|
+
pending.clear();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
let street = 'preflop', currentBet = hand.bigBlindSize, fullRaise = hand.bigBlindSize, pot = 0;
|
|
31
|
+
const decisions = [];
|
|
32
|
+
const fail = (index, message) => { throw new Error(`${hand.handId} action ${index}: ${message}`); };
|
|
33
|
+
const refunds = new Map();
|
|
34
|
+
for (const refund of annotations.refunds) {
|
|
35
|
+
if (!Number.isInteger(refund.afterActionIndex) || refund.afterActionIndex < 0 || refund.afterActionIndex >= hand.actions.length || !stacks.has(refund.player) || !(refund.amount > 0) || !Number.isFinite(refund.amount))
|
|
36
|
+
throw new Error('Invalid refund annotation');
|
|
37
|
+
const entries = refunds.get(refund.afterActionIndex) ?? [];
|
|
38
|
+
entries.push(refund);
|
|
39
|
+
refunds.set(refund.afterActionIndex, entries);
|
|
40
|
+
}
|
|
41
|
+
hand.actions.forEach((action, index) => {
|
|
42
|
+
if (streets.indexOf(action.street) < streets.indexOf(street))
|
|
43
|
+
fail(index, 'street order reversed');
|
|
44
|
+
if (action.street !== street) {
|
|
45
|
+
if (pending && [...pending].some(name => active.has(name) && stacks.get(name) > EPS) && active.size > 1)
|
|
46
|
+
fail(index, 'street advanced before action closed');
|
|
47
|
+
// A completed street cannot leave a live player with an unmatched wager.
|
|
48
|
+
for (const name of active)
|
|
49
|
+
if (stacks.get(name) > EPS && contributions.get(name) + EPS < currentBet && active.size > 1)
|
|
50
|
+
fail(index, 'street advanced with outstanding call');
|
|
51
|
+
street = action.street;
|
|
52
|
+
contributions.forEach((_, name) => contributions.set(name, 0));
|
|
53
|
+
currentBet = 0;
|
|
54
|
+
fullRaise = hand.bigBlindSize;
|
|
55
|
+
actedAt.clear();
|
|
56
|
+
pending = undefined;
|
|
57
|
+
}
|
|
58
|
+
if (!active.has(action.player))
|
|
59
|
+
fail(index, 'folded or unknown actor');
|
|
60
|
+
const stack = stacks.get(action.player), contribution = contributions.get(action.player);
|
|
61
|
+
if (stack <= EPS)
|
|
62
|
+
fail(index, 'all-in player acted again');
|
|
63
|
+
if (Math.abs(action.pot - pot) > EPS)
|
|
64
|
+
fail(index, `pot mismatch: history ${action.pot}, replay ${pot}`);
|
|
65
|
+
const facing = clean(Math.max(0, currentBet - contribution)), callAmount = Math.min(stack, facing);
|
|
66
|
+
const previous = actedAt.get(action.player);
|
|
67
|
+
const raiseReopened = previous === undefined || currentBet - previous + EPS >= fullRaise;
|
|
68
|
+
const responders = [...active].filter(name => name !== action.player && stacks.get(name) > EPS);
|
|
69
|
+
const canRaise = responders.length > 0 && stack > facing + EPS && raiseReopened;
|
|
70
|
+
const legal = [facing > EPS, true, canRaise];
|
|
71
|
+
const maxRaiseTo = clean(contribution + stack);
|
|
72
|
+
const minRaiseTo = clean(currentBet + fullRaise);
|
|
73
|
+
let added = 0, liveAdded = 0, raiseTo = null;
|
|
74
|
+
const activeBefore = [...active];
|
|
75
|
+
if (action.action === 'posts') {
|
|
76
|
+
if (pending)
|
|
77
|
+
fail(index, 'forced post after voluntary action unsupported');
|
|
78
|
+
const post = annotations.posts[index];
|
|
79
|
+
if (street !== 'preflop' || !post || post.live < 0 || post.dead < 0 || Math.abs(post.live + post.dead - (action.size ?? -1)) > EPS)
|
|
80
|
+
fail(index, 'missing/invalid forced-post annotation');
|
|
81
|
+
added = post.live + post.dead;
|
|
82
|
+
liveAdded = post.live;
|
|
83
|
+
if (post.live > hand.bigBlindSize + EPS)
|
|
84
|
+
fail(index, 'straddle/oversized live post unsupported');
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
if (active.size < 2)
|
|
88
|
+
fail(index, 'decision after hand ended');
|
|
89
|
+
if (!pending)
|
|
90
|
+
beginRound();
|
|
91
|
+
let next;
|
|
92
|
+
for (let offset = 0; offset < seats.length; offset++) {
|
|
93
|
+
const candidate = seats[(cursor + offset) % seats.length];
|
|
94
|
+
if (pending.has(candidate) && active.has(candidate) && stacks.get(candidate) > EPS) {
|
|
95
|
+
next = candidate;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (next !== action.player)
|
|
100
|
+
fail(index, `out-of-turn action: expected ${next ?? 'round closed'}`);
|
|
101
|
+
pending.delete(action.player);
|
|
102
|
+
cursor = (seats.indexOf(action.player) + 1) % seats.length;
|
|
103
|
+
if (action.action === 'folds') {
|
|
104
|
+
if (!legal[0])
|
|
105
|
+
fail(index, 'fold with no wager');
|
|
106
|
+
active.delete(action.player);
|
|
107
|
+
}
|
|
108
|
+
else if (action.action === 'checks') {
|
|
109
|
+
if (facing > EPS)
|
|
110
|
+
fail(index, 'check facing wager');
|
|
111
|
+
}
|
|
112
|
+
else if (action.action === 'calls') {
|
|
113
|
+
added = action.size ?? callAmount;
|
|
114
|
+
liveAdded = added;
|
|
115
|
+
if (Math.abs(added - callAmount) > EPS || facing <= EPS)
|
|
116
|
+
fail(index, 'incorrect call amount');
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
if (!canRaise || action.size === null)
|
|
120
|
+
fail(index, 'aggression not legal/reopened');
|
|
121
|
+
if (action.action === 'bets' && currentBet > EPS)
|
|
122
|
+
fail(index, 'bet facing existing wager');
|
|
123
|
+
if (action.action === 'raises' && currentBet <= EPS)
|
|
124
|
+
fail(index, 'raise without existing wager');
|
|
125
|
+
raiseTo = action.action === 'raises' ? action.size : contribution + action.size;
|
|
126
|
+
added = clean(raiseTo - contribution);
|
|
127
|
+
liveAdded = added;
|
|
128
|
+
if (raiseTo <= currentBet + EPS)
|
|
129
|
+
fail(index, 'aggression does not increase wager');
|
|
130
|
+
if (raiseTo + EPS < minRaiseTo && Math.abs(added - stack) > EPS)
|
|
131
|
+
fail(index, 'under-minimum aggression is not all-in');
|
|
132
|
+
}
|
|
133
|
+
decisions.push({ actionIndex: index, player: action.player, street, board: hand.board.slice(0, [0, 3, 4, 5][streets.indexOf(street)]),
|
|
134
|
+
pot, stack, contribution, currentBet, facing, callAmount, minRaiseTo, maxRaiseTo, raiseReopened, legal,
|
|
135
|
+
stacks: Object.fromEntries(stacks), contributions: Object.fromEntries(contributions), active: activeBefore,
|
|
136
|
+
observed: { action: action.action, amountAdded: added, raiseTo, allIn: added > 0 && Math.abs(added - stack) <= EPS,
|
|
137
|
+
addedToPot: raiseTo !== null && pot > 0 ? added / pot : null, raiseToPot: raiseTo !== null && pot > 0 ? raiseTo / pot : null,
|
|
138
|
+
legacyBucket: raiseTo !== null ? bucketiseBetToPotRatio(raiseTo / (pot > 0 ? pot : hand.bigBlindSize)) : null } });
|
|
139
|
+
actedAt.set(action.player, Math.max(currentBet, contribution + liveAdded));
|
|
140
|
+
}
|
|
141
|
+
if (!Number.isFinite(added) || added < 0 || added > stack + EPS)
|
|
142
|
+
fail(index, 'amount exceeds remaining stack');
|
|
143
|
+
pot = clean(pot + added);
|
|
144
|
+
stacks.set(action.player, clean(stack - added));
|
|
145
|
+
contributions.set(action.player, clean(contribution + liveAdded));
|
|
146
|
+
const wager = contributions.get(action.player);
|
|
147
|
+
if (action.action !== 'posts' && wager > currentBet + EPS) {
|
|
148
|
+
const increment = clean(wager - currentBet);
|
|
149
|
+
if (increment + EPS >= fullRaise)
|
|
150
|
+
fullRaise = increment;
|
|
151
|
+
currentBet = wager;
|
|
152
|
+
for (const name of active)
|
|
153
|
+
if (name !== action.player && stacks.get(name) > EPS && contributions.get(name) + EPS < currentBet)
|
|
154
|
+
pending.add(name);
|
|
155
|
+
}
|
|
156
|
+
for (const refund of refunds.get(index) ?? []) {
|
|
157
|
+
const own = contributions.get(refund.player);
|
|
158
|
+
const otherMax = Math.max(0, ...[...contributions].filter(([name]) => name !== refund.player).map(([, value]) => value));
|
|
159
|
+
if (refund.amount > own - otherMax + EPS || refund.amount > pot + EPS)
|
|
160
|
+
fail(index, 'refund exceeds unmatched contribution');
|
|
161
|
+
contributions.set(refund.player, clean(own - refund.amount));
|
|
162
|
+
stacks.set(refund.player, clean(stacks.get(refund.player) + refund.amount));
|
|
163
|
+
pot = clean(pot - refund.amount);
|
|
164
|
+
currentBet = Math.max(0, ...contributions.values());
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
if (active.size > 1 && pending && [...pending].some(name => active.has(name) && stacks.get(name) > EPS))
|
|
168
|
+
throw new Error(`${hand.handId}: incomplete final betting round`);
|
|
169
|
+
const total = hand.players.reduce((sum, p) => sum + p.stack, 0);
|
|
170
|
+
if (Math.abs([...stacks.values()].reduce((sum, x) => sum + x, 0) + pot - total) > EPS)
|
|
171
|
+
throw new Error('Chip conservation failed');
|
|
172
|
+
return { decisions, finalPot: pot, finalStacks: Object.fromEntries(stacks) };
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../../src/history/vendor/replay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,OAAO,GAAa,CAAC,SAAS,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,CAAC,CAAA;AAC3D,MAAM,GAAG,GAAG,IAAI,CAAA;AAChB,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;AAetD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,WAA8B;IACzE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,CAAC,IAAI,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC7D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,CAAC,IAAI,EAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAA;IACxC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAA,CAAC,CAAC,IAAI,GAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,CAAC,CAAA;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,KAAG,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAA;IACnE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACrE,IAAI,OAA8B,EAAE,MAAM,GAAC,CAAC,CAAA;IAC5C,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA,EAAE,CAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,GAAC,GAAG,CAAC,CAAC,CAAA;QAClE,MAAM,WAAW,GAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,GAAC,CAAC,WAAW,GAAC,CAAC,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,CAAC,KAAK,CAAC,MAAM,KAAG,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,CAAC,GAAC,KAAK,CAAC,MAAM,CAAA;QAC/E,0EAA0E;QAC1E,IAAI,OAAO,CAAC,IAAI,KAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAE,CAAA;YAC3B,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,GAAC,GAAG,IAAE,UAAU;gBAAE,OAAO,CAAC,KAAK,EAAE,CAAA;QAC/D,CAAC;IACH,CAAC,CAAA;IACD,IAAI,MAAM,GAAW,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,CAAA;IACtG,MAAM,SAAS,GAAoB,EAAE,CAAA;IACrC,MAAM,IAAI,GAAG,CAAC,KAAY,EAAC,OAAc,EAAS,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,WAAW,KAAK,KAAK,OAAO,EAAE,CAAC,CAAA,CAAC,CAAC,CAAA;IACtH,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuC,CAAA;IAC9D,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC,IAAI,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QACpQ,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAC,OAAO,CAAC,CAAA;IAChI,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,KAAK,EAAC,EAAE;QACnC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,KAAK,EAAC,uBAAuB,CAAC,CAAA;QACjG,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,IAAI,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA,EAAE,CAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,GAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,EAAC,sCAAsC,CAAC,CAAA;YACpJ,yEAAyE;YACzE,KAAK,MAAM,IAAI,IAAI,MAAM;gBAAE,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,GAAG,GAAG,GAAG,UAAU,IAAI,MAAM,CAAC,IAAI,GAAC,CAAC;oBAAE,IAAI,CAAC,KAAK,EAAC,uCAAuC,CAAC,CAAA;YAC3K,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,IAAI,EAAC,EAAE,CAAA,aAAa,CAAC,GAAG,CAAC,IAAI,EAAC,CAAC,CAAC,CAAC,CAAA;YAClF,UAAU,GAAG,CAAC,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;YAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,GAAC,SAAS,CAAA;QACnF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,KAAK,EAAC,yBAAyB,CAAC,CAAA;QACrE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAE,EAAE,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAE,CAAA;QAC1F,IAAI,KAAK,IAAI,GAAG;YAAE,IAAI,CAAC,KAAK,EAAC,2BAA2B,CAAC,CAAA;QACzD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAC,GAAG,CAAC,GAAC,GAAG;YAAE,IAAI,CAAC,KAAK,EAAC,yBAAyB,MAAM,CAAC,GAAG,YAAY,GAAG,EAAE,CAAC,CAAA;QAClG,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,UAAU,GAAC,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAC,MAAM,CAAC,CAAA;QAC9F,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3C,MAAM,aAAa,GAAG,QAAQ,KAAK,SAAS,IAAI,UAAU,GAAC,QAAQ,GAAC,GAAG,IAAI,SAAS,CAAA;QACpF,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,KAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,GAAC,GAAG,CAAC,CAAA;QAC1F,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAC,CAAC,IAAI,KAAK,GAAC,MAAM,GAAC,GAAG,IAAI,aAAa,CAAA;QACzE,MAAM,KAAK,GAAG,CAAC,MAAM,GAAC,GAAG,EAAC,IAAI,EAAC,QAAQ,CAAU,CAAA;QACjD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,GAAC,KAAK,CAAC,CAAA;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,GAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,KAAK,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,OAAO,GAAgB,IAAI,CAAA;QACzD,MAAM,YAAY,GAAC,CAAC,GAAG,MAAM,CAAC,CAAA;QAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,IAAG,OAAO;gBAAC,IAAI,CAAC,KAAK,EAAC,gDAAgD,CAAC,CAAA;YACvE,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACrC,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAC,IAAI,CAAC,IAAI,GAAC,CAAC,MAAM,CAAC,IAAI,IAAE,CAAC,CAAC,CAAC,CAAC,GAAC,GAAG;gBAAE,IAAI,CAAC,KAAK,EAAC,wCAAwC,CAAC,CAAA;YAC5K,KAAK,GAAG,IAAI,CAAC,IAAI,GAAC,IAAI,CAAC,IAAI,CAAC;YAAC,SAAS,GAAC,IAAI,CAAC,IAAI,CAAA;YAChD,IAAI,IAAI,CAAC,IAAI,GAAC,IAAI,CAAC,YAAY,GAAC,GAAG;gBAAE,IAAI,CAAC,KAAK,EAAC,0CAA0C,CAAC,CAAA;QAC7F,CAAC;aAAM,CAAC;YACN,IAAI,MAAM,CAAC,IAAI,GAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,EAAC,2BAA2B,CAAC,CAAA;YAC1D,IAAI,CAAC,OAAO;gBAAE,UAAU,EAAE,CAAA;YAC1B,IAAI,IAAqB,CAAA;YACzB,KAAK,IAAI,MAAM,GAAC,CAAC,EAAC,MAAM,GAAC,KAAK,CAAC,MAAM,EAAC,MAAM,EAAE,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAC,KAAK,CAAC,CAAC,MAAM,GAAC,MAAM,CAAC,GAAC,KAAK,CAAC,MAAM,CAAE,CAAA;gBACpD,IAAI,OAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAE,GAAC,GAAG,EAAE,CAAC;oBAAA,IAAI,GAAC,SAAS,CAAC;oBAAA,MAAK;gBAAA,CAAC;YACxG,CAAC;YACD,IAAI,IAAI,KAAG,MAAM,CAAC,MAAM;gBAAE,IAAI,CAAC,KAAK,EAAC,gCAAgC,IAAI,IAAE,cAAc,EAAE,CAAC,CAAA;YAC5F,OAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAA,MAAM,GAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAC,CAAC,CAAC,GAAC,KAAK,CAAC,MAAM,CAAA;YACnF,IAAI,MAAM,CAAC,MAAM,KAAG,OAAO,EAAE,CAAC;gBAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAAE,IAAI,CAAC,KAAK,EAAC,oBAAoB,CAAC,CAAC;gBAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAAC,CAAC;iBACzG,IAAI,MAAM,CAAC,MAAM,KAAG,QAAQ,EAAE,CAAC;gBAAC,IAAI,MAAM,GAAC,GAAG;oBAAE,IAAI,CAAC,KAAK,EAAC,oBAAoB,CAAC,CAAA;YAAC,CAAC;iBAClF,IAAI,MAAM,CAAC,MAAM,KAAG,OAAO,EAAE,CAAC;gBACjC,KAAK,GAAC,MAAM,CAAC,IAAI,IAAE,UAAU,CAAC;gBAAC,SAAS,GAAC,KAAK,CAAA;gBAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAC,UAAU,CAAC,GAAC,GAAG,IAAI,MAAM,IAAE,GAAG;oBAAE,IAAI,CAAC,KAAK,EAAC,uBAAuB,CAAC,CAAA;YACxF,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAG,IAAI;oBAAE,IAAI,CAAC,KAAK,EAAC,+BAA+B,CAAC,CAAA;gBAChF,IAAI,MAAM,CAAC,MAAM,KAAG,MAAM,IAAI,UAAU,GAAC,GAAG;oBAAE,IAAI,CAAC,KAAK,EAAC,2BAA2B,CAAC,CAAA;gBACrF,IAAI,MAAM,CAAC,MAAM,KAAG,QAAQ,IAAI,UAAU,IAAE,GAAG;oBAAE,IAAI,CAAC,KAAK,EAAC,8BAA8B,CAAC,CAAA;gBAC3F,OAAO,GAAG,MAAM,CAAC,MAAM,KAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,GAAC,MAAM,CAAC,IAAK,CAAA;gBAC5E,KAAK,GAAC,KAAK,CAAC,OAAQ,GAAC,YAAY,CAAC,CAAC;gBAAC,SAAS,GAAC,KAAK,CAAA;gBACnD,IAAI,OAAQ,IAAE,UAAU,GAAC,GAAG;oBAAE,IAAI,CAAC,KAAK,EAAC,oCAAoC,CAAC,CAAA;gBAC9E,IAAI,OAAQ,GAAC,GAAG,GAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAC,KAAK,CAAC,GAAC,GAAG;oBAAE,IAAI,CAAC,KAAK,EAAC,wCAAwC,CAAC,CAAA;YAChH,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,EAAC,WAAW,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxH,GAAG,EAAC,KAAK,EAAC,YAAY,EAAC,UAAU,EAAC,MAAM,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,aAAa,EAAC,KAAK;gBAC7F,MAAM,EAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAC,aAAa,EAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,EAAC,MAAM,EAAC,YAAY;gBACrG,QAAQ,EAAC,EAAC,MAAM,EAAC,MAAM,CAAC,MAAM,EAAC,WAAW,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,GAAC,CAAC,IAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAC,KAAK,CAAC,IAAE,GAAG;oBAChG,UAAU,EAAC,OAAO,KAAG,IAAI,IAAE,GAAG,GAAC,CAAC,CAAA,CAAC,CAAA,KAAK,GAAC,GAAG,CAAA,CAAC,CAAA,IAAI,EAAC,UAAU,EAAC,OAAO,KAAG,IAAI,IAAE,GAAG,GAAC,CAAC,CAAA,CAAC,CAAA,OAAO,GAAC,GAAG,CAAA,CAAC,CAAA,IAAI;oBACjG,YAAY,EAAC,OAAO,KAAG,IAAI,CAAA,CAAC,CAAA,sBAAsB,CAAC,OAAO,GAAC,CAAC,GAAG,GAAC,CAAC,CAAA,CAAC,CAAA,GAAG,CAAA,CAAC,CAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA,CAAC,CAAA,IAAI,EAAC,EAAC,CAAC,CAAA;YACrG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAC,YAAY,GAAC,SAAS,CAAC,CAAC,CAAA;QACzE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAC,CAAC,IAAI,KAAK,GAAC,KAAK,GAAC,GAAG;YAAE,IAAI,CAAC,KAAK,EAAC,gCAAgC,CAAC,CAAA;QACvG,GAAG,GAAC,KAAK,CAAC,GAAG,GAAC,KAAK,CAAC,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAC,KAAK,CAAC,KAAK,GAAC,KAAK,CAAC,CAAC,CAAC;QAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAC,KAAK,CAAC,YAAY,GAAC,SAAS,CAAC,CAAC,CAAA;QAClI,MAAM,KAAK,GAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAE,CAAA;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAG,OAAO,IAAI,KAAK,GAAC,UAAU,GAAC,GAAG,EAAE,CAAC;YACpD,MAAM,SAAS,GAAC,KAAK,CAAC,KAAK,GAAC,UAAU,CAAC,CAAA;YACvC,IAAI,SAAS,GAAC,GAAG,IAAE,SAAS;gBAAE,SAAS,GAAC,SAAS,CAAA;YACjD,UAAU,GAAC,KAAK,CAAA;YAChB,KAAK,MAAM,IAAI,IAAI,MAAM;gBAAE,IAAI,IAAI,KAAG,MAAM,CAAC,MAAM,IAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,GAAC,GAAG,IAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,GAAC,GAAG,GAAC,UAAU;oBAAE,OAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACzI,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAE,EAAE,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAE,CAAA;YAC3C,MAAM,QAAQ,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAC,EAAE,CAAA,IAAI,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,EAAE,CAAA,KAAK,CAAC,CAAC,CAAA;YAC9G,IAAI,MAAM,CAAC,MAAM,GAAC,GAAG,GAAC,QAAQ,GAAC,GAAG,IAAI,MAAM,CAAC,MAAM,GAAC,GAAG,GAAC,GAAG;gBAAE,IAAI,CAAC,KAAK,EAAC,uCAAuC,CAAC,CAAA;YAChH,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAC,KAAK,CAAC,GAAG,GAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAE,GAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAAC,GAAG,GAAC,KAAK,CAAC,GAAG,GAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAClK,UAAU,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAA;QAClD,CAAC;IACH,CAAC,CAAC,CAAA;IACF,IAAI,MAAM,CAAC,IAAI,GAAC,CAAC,IAAI,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA,EAAE,CAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,GAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,kCAAkC,CAAC,CAAA;IACnK,MAAM,KAAK,GAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAC,CAAC,EAAC,EAAE,CAAA,GAAG,GAAC,CAAC,CAAC,KAAK,EAAC,CAAC,CAAC,CAAA;IACvD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAC,CAAC,EAAC,EAAE,CAAA,GAAG,GAAC,CAAC,EAAC,CAAC,CAAC,GAAC,GAAG,GAAC,KAAK,CAAC,GAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IACtH,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,GAAG,EAAC,WAAW,EAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAC,CAAA;AACxE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type Street = 'preflop' | 'flop' | 'turn' | 'river';
|
|
2
|
+
export type Action = {
|
|
3
|
+
street: Street;
|
|
4
|
+
player: string;
|
|
5
|
+
action: 'folds' | 'calls' | 'checks' | 'bets' | 'raises' | 'posts';
|
|
6
|
+
size: number | null;
|
|
7
|
+
pot: number;
|
|
8
|
+
};
|
|
9
|
+
export type Player = {
|
|
10
|
+
seat: number;
|
|
11
|
+
name: string;
|
|
12
|
+
stack: number;
|
|
13
|
+
};
|
|
14
|
+
export type ParsedHand = {
|
|
15
|
+
handId: string;
|
|
16
|
+
bigBlindSize: number;
|
|
17
|
+
players: Player[];
|
|
18
|
+
buttonSeat: number;
|
|
19
|
+
actions: Action[];
|
|
20
|
+
board: string[];
|
|
21
|
+
knownCards: Record<string, string[]>;
|
|
22
|
+
returnedBets?: Partial<Record<Street, Record<string, number>>>;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/history/vendor/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D,MAAM,MAAM,MAAM,GAAG;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IAClE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;CAC/D,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/history/vendor/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
|
+
export { parseHandHistories } from './history/index.js';
|
|
2
3
|
export { HoldemValidationError } from './validation.js';
|
|
3
|
-
import type { CallOptions, ClientOptions, ActionsInput, ActionsResult } from './types.js';
|
|
4
|
+
import type { CallOptions, ClientOptions, ActionsInput, ActionsResult, HistoryActionsInput } from './types.js';
|
|
4
5
|
export { RangeStore } from './ranges.js';
|
|
5
6
|
export declare class HoldemApiError extends Error {
|
|
6
7
|
readonly status: number;
|
|
@@ -23,6 +24,8 @@ export declare class HoldemClient {
|
|
|
23
24
|
constructor(config: ClientOptions);
|
|
24
25
|
/** Returns the complete action response without dropping analysis or optional fields. */
|
|
25
26
|
actions(input: ActionsInput, call?: CallOptions): Promise<ActionsResult>;
|
|
27
|
+
/** Parse a live hand-history prefix on the API and request the next decision. */
|
|
28
|
+
actionsFromHistory(input: HistoryActionsInput, call?: CallOptions): Promise<ActionsResult>;
|
|
26
29
|
/** Alias for actions; uses the same /api/actions contract. */
|
|
27
30
|
predictActions(input: ActionsInput, call?: CallOptions): Promise<ActionsResult>;
|
|
28
31
|
private post;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAE9G,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,qBAAa,cAAe,SAAQ,KAAK;aACM,MAAM,EAAE,MAAM;aAAkB,IAAI,EAAE,OAAO;gBAA9E,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM,EAAkB,IAAI,EAAE,OAAO;CAG3F;AACD,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAC5C;AACD,qBAAa,mBAAoB,SAAQ,KAAK;aAChB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAC3C;AAkBD,mGAAmG;AACnG,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;gBACvC,MAAM,EAAE,aAAa;IAWjC,yFAAyF;IACnF,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAI9E,iFAAiF;IAC3E,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAShG,8DAA8D;IACxD,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;YAGvE,IAAI;CA2BnB"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
|
+
export { parseHandHistories } from './history/index.js';
|
|
2
3
|
export { HoldemValidationError } from './validation.js';
|
|
3
4
|
import { check, validateActions, range } from './validation.js';
|
|
4
5
|
export { RangeStore } from './ranges.js';
|
|
@@ -75,6 +76,15 @@ export class HoldemClient {
|
|
|
75
76
|
validateActions(input);
|
|
76
77
|
return this.post('/api/actions', input, validActions, call);
|
|
77
78
|
}
|
|
79
|
+
/** Parse a live hand-history prefix on the API and request the next decision. */
|
|
80
|
+
async actionsFromHistory(input, call) {
|
|
81
|
+
check(input && typeof input === 'object', 'History input is required');
|
|
82
|
+
check(typeof input.handHistory === 'string' && input.handHistory.trim().length > 0 && input.handHistory.length <= 100_000, 'handHistory requires one unfinished hand (up to 100 KB)');
|
|
83
|
+
check(!('policy' in input), 'Do not mix handHistory with policy');
|
|
84
|
+
check(input.player === undefined || (typeof input.player === 'string' && input.player.trim().length > 0), 'Invalid player');
|
|
85
|
+
check(input.hand === undefined || /^[2-9TJQKA][cdhs][2-9TJQKA][cdhs]$/.test(input.hand), 'hand requires an exact combo');
|
|
86
|
+
return this.post('/api/actions', input, validActions, call);
|
|
87
|
+
}
|
|
78
88
|
/** Alias for actions; uses the same /api/actions contract. */
|
|
79
89
|
async predictActions(input, call) {
|
|
80
90
|
return this.actions(input, call);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -22,6 +22,14 @@ export interface ActionsInput {
|
|
|
22
22
|
export interface CallOptions {
|
|
23
23
|
signal?: AbortSignal;
|
|
24
24
|
}
|
|
25
|
+
/** An unfinished PokerStars USD cash hand, through the action before this turn. */
|
|
26
|
+
export interface HistoryActionsInput extends Omit<ActionsInput, 'policy' | 'hand'> {
|
|
27
|
+
handHistory: string;
|
|
28
|
+
/** Optional assertion: the parser must identify this player as next to act. */
|
|
29
|
+
player?: string;
|
|
30
|
+
/** Required unless the next actor has a Dealt to line in the text. */
|
|
31
|
+
hand?: string;
|
|
32
|
+
}
|
|
25
33
|
export interface ClientOptions {
|
|
26
34
|
apiKey: string;
|
|
27
35
|
baseUrl: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@holdem-api/holdem-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Typed server-side client for Holdem API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "tsc -p tsconfig.json",
|
|
23
23
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
24
|
-
"test": "npm run build && node --test test/client.test.mjs",
|
|
24
|
+
"test": "npm run build && node --test test/client.test.mjs test/history.test.mjs",
|
|
25
25
|
"prepack": "npm run build"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
+
"@types/node": "^22.20.5",
|
|
28
29
|
"typescript": "5.7.3"
|
|
29
30
|
},
|
|
30
31
|
"license": "MIT",
|