@holdem-api/holdem-sdk 0.1.1 → 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 CHANGED
@@ -150,3 +150,77 @@ Each history event has 32 values: actor seat one-hot (9), street one-hot (4), ac
150
150
  ## Blitzfold migration checklist
151
151
 
152
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":"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"}
@@ -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":"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"}
@@ -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":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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;
@@ -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;AAEzF,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,8DAA8D;IACxD,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;YAGvE,IAAI;CA2BnB"}
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;
@@ -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.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,9 +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
+ "prepack": "npm run build"
25
26
  },
26
27
  "devDependencies": {
28
+ "@types/node": "^22.20.5",
27
29
  "typescript": "5.7.3"
28
30
  },
29
31
  "license": "MIT",