propline-cli 0.43.0 → 0.45.0
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 +3 -0
- package/dist/index.js +81 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -135,6 +135,9 @@ propline player-games baseball_mlb "Aaron Judge" --limit 5 --opponent BOS \
|
|
|
135
135
|
| `propline resolution-summary` | Graded-prop volume + per-sport breakdown (free) |
|
|
136
136
|
| `propline ids <sport>` | Event id crosswalk — ESPN, MLB gamePk and each book's own event id (free) |
|
|
137
137
|
| `propline book-accuracy [--days N] [--sport KEY]` | How well each sportsbook prices player props vs the market (free) |
|
|
138
|
+
| `propline golf-rounds <player> [--tour pga,liv] [--limit N]` | A golfer's completed rounds by tour + L5/L10/L20 averages (free) |
|
|
139
|
+
| `propline injuries <sport> [--team KC] [--status out,questionable]` | Current injury report for NFL, NCAAF, NBA, WNBA, NHL, MLB (free) |
|
|
140
|
+
| `propline injuries <sport> --history [--days 7] [--player name]` | Injury status changes over the last 1-90 days (free) |
|
|
138
141
|
| `propline live` | Every in-progress game across the major sports |
|
|
139
142
|
| `propline ev <sport> <event_id>` | Cross-book +EV vs no-vig fair line (Pro) |
|
|
140
143
|
| `propline projections <sport> <event_id>` | Market-implied consensus projection per (market, player) — the line where no-vig P(over) crosses 50%, median across books (Hobby+) |
|
package/dist/index.js
CHANGED
|
@@ -495,6 +495,77 @@ skill_bp > 0 = closer to the result than the market average. A pricing report, n
|
|
|
495
495
|
printTable(rows, cols);
|
|
496
496
|
});
|
|
497
497
|
}
|
|
498
|
+
function cmdGolfRounds(player, flags) {
|
|
499
|
+
return runCommand(async () => {
|
|
500
|
+
const client = buildClient(flags);
|
|
501
|
+
const r = await client.getGolfRounds(player, {
|
|
502
|
+
tour: flags.tour,
|
|
503
|
+
limit: flags.limit,
|
|
504
|
+
since: flags.since
|
|
505
|
+
});
|
|
506
|
+
if (flags.json) return printJson(r);
|
|
507
|
+
const fmt = (v) => v === null ? "-" : String(v);
|
|
508
|
+
const s = r.summary;
|
|
509
|
+
process.stdout.write(
|
|
510
|
+
`${r.player_name} \u2014 ${r.tours.join(", ")}
|
|
511
|
+
L5 ${fmt(s.last_5.avg_strokes)} (${fmt(s.last_5.avg_to_par)}) L10 ${fmt(s.last_10.avg_strokes)} (${fmt(s.last_10.avg_to_par)}) L20 ${fmt(s.last_20.avg_strokes)} (${fmt(s.last_20.avg_to_par)})
|
|
512
|
+
|
|
513
|
+
`
|
|
514
|
+
);
|
|
515
|
+
const cols = [
|
|
516
|
+
{ label: "DATE", value: (x) => x.round_date },
|
|
517
|
+
{ label: "TOUR", value: (x) => x.tour },
|
|
518
|
+
{ label: "TOURNAMENT", value: (x) => x.tournament },
|
|
519
|
+
{ label: "RD", value: (x) => String(x.round), numeric: true },
|
|
520
|
+
{ label: "STROKES", value: (x) => String(x.strokes), numeric: true },
|
|
521
|
+
{ label: "TO_PAR", value: (x) => fmt(x.to_par), numeric: true },
|
|
522
|
+
{ label: "BIRDIES", value: (x) => fmt(x.birdies), numeric: true },
|
|
523
|
+
{ label: "BOGEYS", value: (x) => fmt(x.bogeys), numeric: true }
|
|
524
|
+
];
|
|
525
|
+
printTable(r.rounds, cols);
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
function cmdInjuries(sport, flags) {
|
|
529
|
+
return runCommand(async () => {
|
|
530
|
+
const client = buildClient(flags);
|
|
531
|
+
if (flags.history) {
|
|
532
|
+
const h = await client.getInjuryHistory(sport, {
|
|
533
|
+
days: flags.days,
|
|
534
|
+
player: flags.player
|
|
535
|
+
});
|
|
536
|
+
if (flags.json) return printJson(h);
|
|
537
|
+
process.stdout.write(
|
|
538
|
+
`${h.sport} \u2014 ${h.count} status changes, last ${h.days} days` + (h.truncated ? " (truncated)" : "") + `
|
|
539
|
+
|
|
540
|
+
`
|
|
541
|
+
);
|
|
542
|
+
const cols2 = [
|
|
543
|
+
{ label: "WHEN", value: (c) => formatTime(c.changed_at) },
|
|
544
|
+
{ label: "PLAYER", value: (c) => c.player_name },
|
|
545
|
+
{ label: "TEAM", value: (c) => c.team ?? "-" },
|
|
546
|
+
{ label: "FROM", value: (c) => c.old_status ?? "-" },
|
|
547
|
+
{ label: "TO", value: (c) => c.new_status ?? "off report" }
|
|
548
|
+
];
|
|
549
|
+
printTable(h.changes, cols2);
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
const r = await client.getInjuries(sport, { team: flags.team, status: flags.status });
|
|
553
|
+
if (flags.json) return printJson(r);
|
|
554
|
+
process.stdout.write(`${r.sport} \u2014 ${r.count} players on the injury report
|
|
555
|
+
|
|
556
|
+
`);
|
|
557
|
+
const cols = [
|
|
558
|
+
{ label: "TEAM", value: (p) => p.team_abbr ?? p.team ?? "-" },
|
|
559
|
+
{ label: "PLAYER", value: (p) => p.player_name },
|
|
560
|
+
{ label: "POS", value: (p) => p.position ?? "-" },
|
|
561
|
+
{ label: "STATUS", value: (p) => p.status },
|
|
562
|
+
{ label: "INJURY", value: (p) => [p.side, p.body_part, p.injury_type].filter(Boolean).join(" ") || "-" },
|
|
563
|
+
{ label: "RETURN", value: (p) => p.expected_return ?? "-" },
|
|
564
|
+
{ label: "SINCE", value: (p) => formatTime(p.status_since) }
|
|
565
|
+
];
|
|
566
|
+
printTable(r.players, cols);
|
|
567
|
+
});
|
|
568
|
+
}
|
|
498
569
|
function cmdDfsPayouts(flags) {
|
|
499
570
|
return runCommand(async () => {
|
|
500
571
|
const client = buildClient(flags);
|
|
@@ -1392,7 +1463,7 @@ function parseMarketsFlag(value) {
|
|
|
1392
1463
|
}
|
|
1393
1464
|
|
|
1394
1465
|
// src/index.ts
|
|
1395
|
-
var VERSION = "0.
|
|
1466
|
+
var VERSION = "0.45.0";
|
|
1396
1467
|
var program = new Command();
|
|
1397
1468
|
program.name("propline").description(
|
|
1398
1469
|
"PropLine CLI \u2014 query live odds, scores, +EV plays, prop resolution, and webhooks from the terminal."
|
|
@@ -1498,6 +1569,15 @@ program.command("book-accuracy").option(
|
|
|
1498
1569
|
).option("-s, --sport <key>", "limit to one sport key, e.g. baseball_mlb").description("How well each sportsbook prices player props vs the market (free)").action(function() {
|
|
1499
1570
|
return cmdBookAccuracy(gather(this));
|
|
1500
1571
|
});
|
|
1572
|
+
program.command("golf-rounds <player>").option("-t, --tour <tours>", "comma-separated: pga, dp_world, liv, lpga, korn_ferry, champions").option("-n, --limit <n>", "rounds to show, 1-200 (default 20)", (v) => parseInt(v, 10)).option("--since <date>", "only rounds on or after YYYY-MM-DD").description("A golfer's completed rounds by tour + L5/L10/L20 averages (free)").action(function(player) {
|
|
1573
|
+
return cmdGolfRounds(player, gather(this));
|
|
1574
|
+
});
|
|
1575
|
+
program.command("injuries <sport>").option("-t, --team <team>", "team name or abbreviation, e.g. KC").option(
|
|
1576
|
+
"-s, --status <codes>",
|
|
1577
|
+
"comma-separated: out, doubtful, questionable, probable, day_to_day, injured_list, suspended, other"
|
|
1578
|
+
).option("--history", "show status changes instead of the current report").option("-d, --days <n>", "with --history: 1-90 days (default 7)", (v) => parseInt(v, 10)).option("-p, --player <name>", "with --history: filter by player name").description("Injury report for NFL, NCAAF, NBA, WNBA, NHL, MLB (free)").action(function(sport) {
|
|
1579
|
+
return cmdInjuries(sport, gather(this));
|
|
1580
|
+
});
|
|
1501
1581
|
program.command("dfs-payouts").option(
|
|
1502
1582
|
"--leg-win-prob <p>",
|
|
1503
1583
|
"assumed per-leg win prob 0-1 (adds expected return + +EV flag)",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands.ts","../src/client.ts","../src/format.ts"],"sourcesContent":["// PropLine CLI — terminal interface to the PropLine player props API.\n// Wraps the `propline` Node SDK; no API surface of its own. Add new\n// commands by importing a handler from ./commands.ts and registering\n// it on the matching `program.command(...)` below.\n\nimport { Command, Option } from \"commander\";\nimport {\n cmdSports,\n cmdEvents,\n cmdOdds,\n cmdScores,\n cmdFutures,\n cmdContext,\n cmdMovement,\n cmdGrandSalami,\n cmdDailyGoalsTotal,\n cmdDfsPayouts,\n cmdResolutionSummary,\n cmdBookAccuracy,\n cmdIds,\n cmdLive,\n cmdEv,\n cmdProjections,\n cmdBestLine,\n cmdPlayers,\n cmdPlayerHistory,\n cmdPlayerGames,\n cmdPlayerTrends,\n cmdExportResolvedProps,\n cmdExportOddsHistory,\n cmdHistory,\n cmdClosing,\n cmdClv,\n cmdSgp,\n cmdWebhooksList,\n cmdWebhooksCreate,\n cmdWebhooksDelete,\n cmdWebhooksTest,\n cmdWebhooksDeliveries,\n cmdWebhooksReplay,\n cmdStream,\n} from \"./commands.js\";\n\nexport const VERSION = \"0.43.0\";\n\nconst program = new Command();\n\nprogram\n .name(\"propline\")\n .description(\n \"PropLine CLI — query live odds, scores, +EV plays, prop resolution, and webhooks from the terminal.\",\n )\n .version(VERSION)\n // Global flags. Each command resolves these via its own options object\n // (commander merges parent options into action callbacks for us via\n // .opts({ from: 'parent' }), but easier to just pull from this.parent\n // explicitly to stay strict-typed-friendly).\n .addOption(\n new Option(\"--api-key <key>\", \"PropLine API key\").env(\"PROPLINE_API_KEY\"),\n )\n .addOption(\n new Option(\n \"--base-url <url>\",\n \"API base URL (default https://api.prop-line.com/v1)\",\n ),\n )\n .addOption(\n new Option(\n \"--timeout <seconds>\",\n \"Request timeout in seconds (default 15)\",\n ).argParser((v) => parseInt(v, 10)),\n )\n .addOption(new Option(\"--json\", \"Emit raw JSON instead of a table\"))\n .showHelpAfterError();\n\n// Helper to merge global + command-local options into the flat shape\n// the handlers expect. Keeps each command call site terse.\nfunction gather(cmd: Command): Record<string, unknown> {\n // Walk the WHOLE ancestor chain, not just one level. The global flags\n // (--api-key, --base-url, --timeout, --json) live on `program`, so a\n // one-level lookup only reaches them for top-level commands. Every\n // `webhooks <sub>` command is two levels deep and silently dropped all\n // four: `propline webhooks deliveries 42 --json` printed a table, and\n // `--api-key` on the command line was ignored in favour of the env var.\n // Nothing errored — the flags just did nothing, which is why it survived\n // (found 2026-08-31 while smoke-testing `webhooks replay`).\n //\n // Nearest ancestor wins, so a command-local option can still shadow a\n // global of the same name.\n const chain: Record<string, unknown>[] = [];\n for (let c: Command | null = cmd; c; c = c.parent) {\n chain.unshift(c.opts());\n }\n return Object.assign({}, ...chain) as Record<string, unknown>;\n}\n\n/* ── sports ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"sports\")\n .description(\"List available sports\")\n .action(function (this: Command) {\n return cmdSports(gather(this));\n });\n\n/* ── events ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"events\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .description(\"List upcoming events for a sport\")\n .action(function (this: Command, sport: string) {\n return cmdEvents(sport, gather(this));\n });\n\n/* ── ids ────────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"ids\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .description(\"Event id crosswalk: ESPN, MLB gamePk and each book's own event id (free)\")\n .action(function (this: Command, sport: string) {\n return cmdIds(sport, gather(this));\n });\n\n/* ── odds ───────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"odds\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .argument(\"[event_id]\", \"specific event id (omit for bulk odds)\")\n .option(\n \"-m, --markets <list>\",\n \"comma-separated market keys (e.g. h2h,spreads,totals or player_points)\",\n )\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .option(\n \"--links\",\n \"include each book's public event-page URL (Bovada/DK/FanDuel/BetMGM/Kalshi/Polymarket/Smarkets/ProphetX/Novig)\",\n )\n .option(\n \"--book-ids\",\n \"include each book's own ids (book_event_id per book, book_outcome_id per outcome) for joining onto a book's native feed — Kalshi ships its event + per-contract tickers. Best with --json\",\n )\n .option(\n \"--main-only\",\n \"per-event table: show only each book's main line (hide alternate lines and N+ milestone rungs)\",\n )\n .description(\"Get current odds across all books\")\n .action(function (this: Command, sport: string, eventId: string | undefined) {\n return cmdOdds(sport, eventId, gather(this));\n });\n\n/* ── scores ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"scores\")\n .argument(\"<sport>\", \"sport key\")\n .option(\n \"-d, --days-from <n>\",\n \"days back to include (default 3)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Get game scores and status\")\n .action(function (this: Command, sport: string) {\n return cmdScores(sport, gather(this));\n });\n\n/* ── futures ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"futures\")\n .argument(\"<sport>\", \"sport key\")\n .description(\n \"Season-long futures — championship/division/conference winners, MVP + awards, season win totals across books (free)\",\n )\n .action(function (this: Command, sport: string) {\n return cmdFutures(sport, gather(this));\n });\n\n/* ── context ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"context\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .description(\n \"Game context an event plays under — probable pitchers, lineup, umpire, weather (free)\",\n )\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdContext(sport, eventId, gather(this));\n });\n\n/* ── movement ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"movement\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Line movement + steam detection across books (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdMovement(sport, eventId, gather(this));\n });\n\n/* ── grand-salami ────────────────────────────────────────────────────── */\n\nprogram\n .command(\"grand-salami\")\n .option(\n \"--date <YYYY-MM-DD>\",\n \"UTC date (defaults to today)\",\n )\n .description(\"MLB synthetic Grand Salami — total runs + per-book line\")\n .action(function (this: Command) {\n return cmdGrandSalami(gather(this));\n });\n\n/* ── daily-goals-total ───────────────────────────────────────────────── */\n\nprogram\n .command(\"daily-goals-total\")\n .option(\n \"--date <YYYY-MM-DD>\",\n \"UTC date (defaults to today)\",\n )\n .description(\"NHL synthetic Daily Goals Total — total goals + per-book line\")\n .action(function (this: Command) {\n return cmdDailyGoalsTotal(gather(this));\n });\n\n/* ── resolution-summary ──────────────────────────────────────────────── */\n\nprogram\n .command(\"resolution-summary\")\n .option(\n \"-d, --days <n>\",\n \"look-back window, 1-90 (default 30)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Graded-prop volume + per-sport breakdown (free)\")\n .action(function (this: Command) {\n return cmdResolutionSummary(gather(this));\n });\n\n/* ── book-accuracy ───────────────────────────────────────────────────── */\n\nprogram\n .command(\"book-accuracy\")\n .option(\n \"-d, --days <n>\",\n \"look-back window, 7-120 (default 30)\",\n (v) => parseInt(v, 10),\n )\n .option(\"-s, --sport <key>\", \"limit to one sport key, e.g. baseball_mlb\")\n .description(\"How well each sportsbook prices player props vs the market (free)\")\n .action(function (this: Command) {\n return cmdBookAccuracy(gather(this));\n });\n\n/* ── dfs-payouts ─────────────────────────────────────────────────────── */\n\nprogram\n .command(\"dfs-payouts\")\n .option(\n \"--leg-win-prob <p>\",\n \"assumed per-leg win prob 0-1 (adds expected return + +EV flag)\",\n (v) => parseFloat(v),\n )\n .description(\"PrizePicks Power/Flex payout schedule + per-leg breakeven (free)\")\n .action(function (this: Command) {\n return cmdDfsPayouts(gather(this));\n });\n\n/* ── live ───────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"live\")\n .description(\n \"Show every in-progress game across the major sports (score + period)\",\n )\n .action(function (this: Command) {\n return cmdLive(gather(this));\n });\n\n/* ── ev ─────────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"ev\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel) — price only your books; never changes the fair-line anchor\",\n )\n .option(\n \"--plus\",\n \"show only +EV outcomes (filter rows where ev_pct > 0)\",\n false,\n )\n .option(\n \"--devig <method>\",\n \"de-vig method for the fair line: multiplicative (default) or shin (corrects the favourite-longshot bias on longshot props)\",\n )\n .option(\n \"--fair-source <list>\",\n \"anchor book(s), tried in order per line: pinnacle, polymarket, kalshi, bovada, smarkets (default order when omitted); or 'consensus' alone for the median no-vig line across 3+ fresh books (opt-in, not a proven better anchor)\",\n )\n .option(\n \"--max-age <seconds>\",\n \"drop quoted prices the book has not delivered within this many seconds (the fair line is unaffected)\",\n )\n .description(\"Cross-book +EV against a sharp no-vig fair line (Pro tier)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdEv(sport, eventId, gather(this));\n });\n\n/* ── projections ────────────────────────────────────────────────────── */\n\nprogram\n .command(\"projections\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys\")\n .description(\n \"Market-implied consensus projection per (market, player) — the line where the no-vig P(over) crosses 50%, median across books (Hobby+)\",\n )\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdProjections(sport, eventId, gather(this));\n });\n\n/* ── best-line ──────────────────────────────────────────────────────── */\n\nprogram\n .command(\"best-line\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel) — shop only your books\",\n )\n .option(\n \"--links\",\n \"include each book's public event-page URL per price row (click out to the book)\",\n )\n .description(\n \"Cross-book line shopping: best price per (market, player, line) across all comparable books (Hobby+)\",\n )\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdBestLine(sport, eventId, gather(this) as never);\n });\n\n/* ── history ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"history\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\"--from <iso>\", \"ISO timestamp; only include snapshots at or after\")\n .option(\"--to <iso>\", \"ISO timestamp; only include snapshots at or before\")\n .option(\n \"--relative-from <offset>\",\n \"offset relative to commence_time, e.g. -3h, -30m, -90s\",\n )\n .option(\n \"--relative-to <offset>\",\n \"offset relative to commence_time, e.g. -1m, 0\",\n )\n .option(\n \"--interval <bucket>\",\n \"downsample to one snapshot per bucket: 30s|1m|5m|15m|30m|1h\",\n )\n .option(\"--changes-only\", \"drop snapshots whose (price, point) match the previous one\", false)\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Historical line movement for an event with period filters (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdHistory(sport, eventId, gather(this) as never);\n });\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"clv\")\n .argument(\"<file>\", 'JSON file of placed bets, or \"-\" for stdin')\n .description(\"Grade placed bets against their closing lines — CLV (Hobby+)\")\n .action(function (this: Command, file: string) {\n return cmdClv(file, gather(this) as never);\n });\n\n/* ── sgp ────────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"sgp\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .argument(\n \"<file>\",\n 'JSON file of legs (market, name, description, point, period, team for a team total, or book_outcome_id), or \"-\" for stdin',\n )\n .option(\"-B, --bookmaker <key>\", \"book to price at: fanduel, draftkings, betonlineag, lowvig — or all (every book side by side)\", \"fanduel\")\n .description(\"Price a same-game parlay at the book's own correlated odds (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string, file: string) {\n return cmdSgp(sport, eventId, file, gather(this) as never);\n });\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"closing\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Closing line per (book, market, outcome) — CLV helper (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdClosing(sport, eventId, gather(this) as never);\n });\n\n/* ── players (search) ───────────────────────────────────────────────── */\n\nprogram\n .command(\"players\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<search>\", 'name fragment (e.g. \"judge\")')\n .option(\"-l, --limit <n>\", \"max players (1-100, default 25)\", (v) =>\n parseInt(v, 10),\n )\n .description(\n \"Search players by name — stable player_id + every spelling the books use (free)\",\n )\n .action(function (this: Command, sport: string, search: string) {\n return cmdPlayers(sport, search, gather(this) as never);\n });\n\n/* ── player-history ─────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-history\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name or player_id (quote if it contains spaces — e.g. \"Aaron Judge\" or mlb:592450)')\n .requiredOption(\n \"-m, --market <key>\",\n \"market key (required — e.g. pitcher_strikeouts)\",\n )\n .option(\"-b, --bookmaker <key>\", \"filter to a single book (e.g. draftkings)\")\n .option(\"-l, --limit <n>\", \"max entries (1-100, default 20)\", (v) =>\n parseInt(v, 10),\n )\n .option(\n \"--main-line-only\",\n \"only each book's main line (drops alt-ladder rungs)\",\n )\n .description(\"Recent prop history for a player on a market (Pro full, Free redacted)\")\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerHistory(sport, player, gather(this) as never);\n });\n\n/* ── player-games ───────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-games\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name (quote if it contains spaces — e.g. \"Aaron Judge\") or a player_id (e.g. mlb:592450)')\n .option(\"-l, --limit <n>\", \"games to return (1-100, default 20)\", (v) =>\n parseInt(v, 10),\n )\n .option(\n \"-o, --opponent <team>\",\n 'head-to-head filter — name, nickname or abbreviation (\"BOS\"); the limit applies after it, so this is the last N MEETINGS',\n )\n .option(\n \"--stat-type <names>\",\n \"comma-separated stat names to return (default: all)\",\n )\n .description(\n \"Player game log — recent games with every raw box-score stat per game (free)\",\n )\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerGames(sport, player, gather(this) as never);\n });\n\n/* ── player-trends ──────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-trends\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name or player_id (quote if it contains spaces — e.g. \"Aaron Judge\" or mlb:592450)')\n .option(\n \"-m, --market <key>\",\n \"filter to a single market key (e.g. batter_total_bases)\",\n )\n .option(\n \"--dfs-odds-type <flavor>\",\n \"PrizePicks flavor to compute trends against (standard | goblin | demon)\",\n )\n .description(\n \"Aggregated hit-rate trends per market — L5/L10/L20/L50 over/under splits + current streak (Pro full, Free redacted)\",\n )\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerTrends(sport, player, gather(this) as never);\n });\n\n/* ── export-resolved-props ──────────────────────────────────────────── */\n\nprogram\n .command(\"export-resolved-props\")\n .requiredOption(\"--sport <key>\", \"sport key (required)\")\n .option(\"--market <key>\", \"filter by market key\")\n .option(\"--bookmaker <key>\", \"filter by bookmaker key\")\n .option(\"--since <iso>\", \"ISO datetime lower bound on resolved_at\")\n .option(\"--until <iso>\", \"ISO datetime upper bound on resolved_at\")\n .option(\n \"--out <path>\",\n \"write CSV to this path (default: stream CSV to stdout)\",\n )\n .description(\"Bulk CSV export of resolved props (Pro tier)\")\n .action(function (this: Command) {\n return cmdExportResolvedProps(gather(this) as never);\n });\n\n/* ── export-odds-history ────────────────────────────────────────────── */\n\nprogram\n .command(\"export-odds-history\")\n .requiredOption(\"--sport <key>\", \"sport key (required)\")\n .option(\"--market <key>\", \"filter by market key\")\n .option(\"--bookmaker <key>\", \"filter by bookmaker key\")\n .option(\"--since <iso>\", \"ISO datetime lower bound on recorded_at\")\n .option(\"--until <iso>\", \"ISO datetime upper bound on recorded_at\")\n .option(\n \"--out <path>\",\n \"write CSV to this path (default: stream CSV to stdout)\",\n )\n .description(\n \"Bulk CSV export of the full line-movement tick history (Backfill pass / Enterprise). Large — page month-by-month with --since/--until.\",\n )\n .action(function (this: Command) {\n return cmdExportOddsHistory(gather(this) as never);\n });\n\n/* ── webhooks ───────────────────────────────────────────────────────── */\n\nconst webhooks = program.command(\"webhooks\").description(\"Manage webhook subscriptions (Streaming tier)\");\n\nwebhooks\n .command(\"list\")\n .description(\"List your webhook subscriptions\")\n .action(function (this: Command) {\n return cmdWebhooksList(gather(this));\n });\n\nwebhooks\n .command(\"create\")\n .requiredOption(\"--url <url>\", \"HTTPS endpoint that will receive POSTs\")\n .option(\n \"--events <list>\",\n \"comma-separated event types: line_movement,resolution,steam,market_suspended,ev,line_added,line_pulled (default: all except line_added/line_pulled, which are opt-in)\",\n )\n .option(\"--sport <key>\", \"filter to a single sport\")\n .option(\"--market <key>\", \"filter to a single market key\")\n .option(\"--player <name>\", \"filter to a player name (case-insensitive substring)\")\n .option(\n \"--bookmakers <list>\",\n \"filter to comma-separated book keys, same vocabulary as ?bookmakers= (e.g. draftkings,fanduel); steam events are cross-book and unaffected\",\n )\n .option(\n \"--event-id <id>\",\n \"filter to one event id (numeric)\",\n (v) => parseInt(v, 10),\n )\n .option(\n \"--min-price-change-pct <n>\",\n \"minimum % change in American odds to fire a line_movement\",\n (v) => parseFloat(v),\n )\n .option(\n \"--min-steam-score <n>\",\n \"minimum 0-100 steam score to fire a steam event\",\n (v) => parseFloat(v),\n )\n .option(\n \"--min-books-agreeing <n>\",\n \"market_suspended only: books that must have pulled the same player/market before you hear it (unset = every drop, 3 = late scratches)\",\n (v) => parseInt(v, 10),\n )\n .option(\n \"--min-ev-pct <n>\",\n \"ev events only: minimum EV% (0-100) against the fair line to deliver (default 1)\",\n (v) => parseFloat(v),\n )\n .option(\n \"--max-ev-pct <n>\",\n \"ev events only: maximum EV% to deliver, drops implausibly large edges (default: no cap)\",\n (v) => parseFloat(v),\n )\n .option(\n \"--ev-fair-source <value>\",\n \"ev events only: fair-line anchor, 'consensus' or comma list of pinnacle,polymarket,kalshi,bovada,smarkets (default: the /ev order)\",\n )\n .option(\n \"--batch-max <n>\",\n \"batched delivery: up to N events per POST as a signed envelope (1-500; recommended for high-volume subscriptions; 0 = per-event)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Register a webhook subscription (returns the signing secret ONCE)\")\n .action(function (this: Command) {\n return cmdWebhooksCreate(gather(this) as never);\n });\n\nwebhooks\n .command(\"delete\")\n .argument(\"<id>\", \"webhook id\")\n .description(\"Delete a webhook (cascades its delivery history)\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksDelete(id, gather(this));\n });\n\nwebhooks\n .command(\"test\")\n .argument(\"<id>\", \"webhook id\")\n .description(\"Queue a sample test payload to the webhook URL\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksTest(id, gather(this));\n });\n\nwebhooks\n .command(\"deliveries\")\n .argument(\"<id>\", \"webhook id\")\n .option(\"-l, --limit <n>\", \"max deliveries (default 50, max 200)\", (v) =>\n parseInt(v, 10),\n )\n .option(\n \"--before-id <id>\",\n \"page backwards: smallest id from the previous page\",\n (v) => parseInt(v, 10),\n )\n .description(\"Show recent delivery attempts for a webhook (newest first)\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksDeliveries(id, gather(this) as never);\n });\n\nwebhooks\n .command(\"replay\")\n .argument(\"<id>\", \"webhook id\")\n .option(\n \"--since-seq <n>\",\n \"read events after this X-PropLine-Sequence (default 0)\",\n (v) => parseInt(v, 10),\n )\n .option(\"-l, --limit <n>\", \"max events per page (default 100, max 500)\", (v) =>\n parseInt(v, 10),\n )\n .option(\"--all\", \"follow the cursor to the end of the retained window\")\n .description(\"Re-read missed webhook events from a cursor (oldest first)\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksReplay(id, gather(this) as never);\n });\n\nprogram\n .command(\"stream\")\n .argument(\"<webhook-id>\", \"websocket subscription id (transport=websocket)\")\n .option(\n \"--since-seq <n>\",\n \"resume from this sequence (default 0 = oldest retained)\",\n (v) => parseInt(v, 10),\n )\n .option(\"--once\", \"do not reconnect; exit when the socket closes\")\n .description(\"Stream a websocket subscription to stdout (line-delimited JSON with --json)\")\n .action(function (this: Command, id: string) {\n return cmdStream(id, gather(this) as never);\n });\n\nprogram.parseAsync().catch((err) => {\n process.stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\\n`);\n // Structured API errors carry the exact URL that unlocks the feature\n // or lifts the cap — surface it instead of making the user hunt.\n const upgradeUrl = (err as { upgradeUrl?: unknown })?.upgradeUrl;\n if (typeof upgradeUrl === \"string\" && upgradeUrl) {\n process.stderr.write(`upgrade: ${upgradeUrl}\\n`);\n }\n process.exit(1);\n});\n","// Per-command handlers. Each one builds a PropLine client, calls the\n// SDK, and pretty-prints the result via format.ts (or dumps raw JSON\n// when --json is passed). Commands stay independent — no shared\n// per-call state — so future ones can be added without touching the\n// existing surface.\n\nimport { readFile } from \"node:fs/promises\";\nimport type { PropLine, PlayerMarketTrend, HitRateSplit } from \"propline\";\nimport { buildClient, runCommand, type ClientFlags } from \"./client.js\";\nimport {\n printJson,\n printTable,\n formatPrice,\n formatPoint,\n formatTime,\n truncate,\n type Column,\n} from \"./format.js\";\n\ninterface CommonFlags extends ClientFlags {\n json?: boolean;\n}\n\n/* ── sports ─────────────────────────────────────────────────────────── */\n\nexport function cmdSports(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const sports = await client.getSports();\n if (flags.json) return printJson(sports);\n const cols: Column<(typeof sports)[number]>[] = [\n { label: \"KEY\", value: (r) => r.key },\n { label: \"TITLE\", value: (r) => r.title },\n { label: \"ACTIVE\", value: (r) => (r.active ? \"yes\" : \"no\") },\n ];\n printTable(sports, cols);\n });\n}\n\n/* ── events ─────────────────────────────────────────────────────────── */\n\nexport function cmdEvents(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = await client.getEvents(sport);\n if (flags.json) return printJson(events);\n const cols: Column<(typeof events)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"AWAY\", value: (r) => r.away_team },\n { label: \"HOME\", value: (r) => r.home_team },\n { label: \"COMMENCES\", value: (r) => formatTime(r.commence_time) },\n ];\n printTable(events, cols);\n });\n}\n\n/* ── ids (event id crosswalk) ────────────────────────────────────────── */\n\nexport function cmdIds(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = await client.getEventIds(sport);\n if (flags.json) return printJson(events);\n const cols: Column<(typeof events)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"START\", value: (r) => formatTime(r.commence_time) },\n { label: \"MATCHUP\", value: (r) => `${r.away_team} @ ${r.home_team}` },\n { label: \"BOOKS\", value: (r) => String(Object.keys(r.books ?? {}).length), numeric: true },\n ];\n printTable(events, cols);\n });\n}\n\n/* ── odds (bulk and single-event) ───────────────────────────────────── */\n\nexport function cmdOdds(\n sport: string,\n eventId: string | undefined,\n flags: CommonFlags & {\n markets?: string;\n bookmakers?: string;\n period?: string;\n links?: boolean;\n bookIds?: boolean;\n mainOnly?: boolean;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const period = flags.period;\n const bookmakers = flags.bookmakers;\n const includeLinks = flags.links;\n const includeBookIds = flags.bookIds;\n\n if (eventId) {\n const resp = await client.getOdds(sport, {\n eventId,\n markets,\n period,\n bookmakers,\n includeLinks,\n includeBookIds,\n });\n if (flags.json) return printJson(resp);\n printOddsResponse(resp, flags.mainOnly === true);\n printEventLinks(resp.bookmakers);\n return;\n }\n\n const resp = await client.getOdds(sport, {\n markets,\n period,\n bookmakers,\n includeLinks,\n includeBookIds,\n });\n if (flags.json) return printJson(resp);\n // Bulk: one row per (event, book, market, outcome) gets dense fast.\n // Collapse to a per-event summary row showing how many books / markets\n // each event has, so the user sees the slate at a glance.\n type Row = {\n id: string;\n teams: string;\n commence: string;\n books: number;\n markets: number;\n };\n const rows: Row[] = resp.map((ev) => {\n const books = ev.bookmakers ?? [];\n const markets = books.reduce((sum, b) => sum + (b.markets?.length ?? 0), 0);\n return {\n id: String(ev.id),\n teams: `${ev.away_team} @ ${ev.home_team}`,\n commence: formatTime(ev.commence_time),\n books: books.length,\n markets,\n };\n });\n const cols: Column<Row>[] = [\n { label: \"ID\", value: (r) => r.id },\n { label: \"MATCHUP\", value: (r) => r.teams },\n { label: \"COMMENCES\", value: (r) => r.commence },\n { label: \"BOOKS\", value: (r) => String(r.books), numeric: true },\n { label: \"MARKETS\", value: (r) => String(r.markets), numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\ninterface OddsResponseLike {\n id: number | string;\n home_team: string;\n away_team: string;\n bookmakers?: Array<{\n key: string;\n title: string;\n /**\n * True when the event is LIVE and this book does not price it in\n * play — its prices are the last pregame quote and will not move\n * again this game.\n */\n pregame_only?: boolean;\n markets?: Array<{\n key: string;\n /** Canonical team name on a team total; null on a game market. */\n team?: string | null;\n /** \"main\" | \"alternate\" | \"milestone\". */\n line_type?: string | null;\n outcomes?: Array<{\n /** Per-outcome override (Kalshi / Polymarket US rows). */\n line_type?: string | null;\n name: string;\n description?: string | null;\n price: number;\n point?: number | null;\n payout_multiplier?: number | null;\n }>;\n }>;\n }>;\n}\n\nfunction printEventLinks(\n bookmakers: Array<{\n key: string;\n title: string;\n link?: string | null;\n app_link?: string | null;\n }>,\n): void {\n const linked = bookmakers.filter((b) => b.link || b.app_link);\n if (!linked.length) return;\n process.stdout.write(\"\\nEvent pages:\\n\");\n for (const b of linked) {\n if (b.link) process.stdout.write(` ${b.title}: ${b.link}\\n`);\n // Mobile app-open deep link (ProphetX only today) — shown when present.\n if (b.app_link) process.stdout.write(` ${b.title} (app): ${b.app_link}\\n`);\n }\n}\n\nconst LINE_TYPE_LABEL: Record<string, string> = {\n main: \"main\",\n alternate: \"alt\",\n milestone: \"N+\",\n};\n\nfunction printOddsResponse(resp: OddsResponseLike, mainOnly = false): void {\n // Per-event detail view: one row per (book, market, outcome). Same\n // shape as `propline odds <sport> <event> --json` but flattened so the\n // table reads top-to-bottom by book → market → outcome.\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n point: string;\n price: string;\n mult: string;\n type: string;\n };\n const rows: Row[] = [];\n let anyType = false;\n let anyMult = false;\n let anyFrozen = false;\n for (const book of resp.bookmakers ?? []) {\n // The event is live and this book does not price it in play: its\n // prices are the last PREGAME quote and will not move again this\n // game. Marked rather than hidden — on the DFS books that frozen\n // line is the number the bet settles against — but showing it\n // unmarked next to books quoting seconds ago is the misleading part.\n const frozen = book.pregame_only === true;\n if (frozen) anyFrozen = true;\n for (const market of book.markets ?? []) {\n for (const o of market.outcomes ?? []) {\n // An outcome's own line_type overrides its market's on the books\n // that put every player on one row (Kalshi / Polymarket US).\n const lineType = o.line_type ?? market.line_type ?? null;\n if (mainOnly && lineType && lineType !== \"main\") continue;\n if (lineType) anyType = true;\n const m = o.payout_multiplier;\n if (m !== null && m !== undefined) anyMult = true;\n rows.push({\n book: frozen ? `${book.title} *` : book.title,\n // A team total and the game total both ride the `totals` key and\n // differ only by point, which reads as one market mispriced.\n // `team` is the API's own answer for which side it is scoped to\n // (null on a game market), so surface it in the label.\n market: market.team\n ? `${market.key} (${market.team})`\n : market.key,\n player: o.description ?? \"\",\n side: o.name,\n point: formatPoint(o.point ?? null),\n price: formatPrice(o.price),\n mult: m !== null && m !== undefined ? `${m}x` : \"\",\n type: lineType ? (LINE_TYPE_LABEL[lineType] ?? lineType) : \"\",\n });\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no markets returned — try --markets h2h,spreads,totals or the desired prop key)\\n`,\n );\n return;\n }\n const header = `${resp.away_team} @ ${resp.home_team} (event ${resp.id})\\n`;\n process.stdout.write(header);\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 28) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n // main / alt / N+ (milestone rung) — from the API's line_type field.\n if (anyType) cols.push({ label: \"TYPE\", value: (r) => r.type });\n // DFS boost/discount column — only shown when a book (Underdog) actually\n // returns a multiplier, so standard sportsbook output stays unchanged.\n if (anyMult) {\n cols.push({ label: \"MULT\", value: (r) => r.mult, numeric: true });\n }\n printTable(rows, cols);\n if (anyFrozen) {\n process.stdout.write(\n `\\n* pregame price — this game is live and these books do not price it\\n` +\n ` in play, so these lines are frozen and will not move again.\\n`,\n );\n }\n}\n\n/* ── scores ─────────────────────────────────────────────────────────── */\n\nexport function cmdScores(\n sport: string,\n flags: CommonFlags & { daysFrom?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const scores = await client.getScores(sport, { daysFrom: flags.daysFrom });\n if (flags.json) return printJson(scores);\n const cols: Column<(typeof scores)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"STATUS\", value: (r) => String(r.status) },\n { label: \"AWAY\", value: (r) => r.away_team },\n {\n label: \"AS\",\n value: (r) => (r.away_score === null ? \"\" : String(r.away_score)),\n numeric: true,\n },\n { label: \"HOME\", value: (r) => r.home_team },\n {\n label: \"HS\",\n value: (r) => (r.home_score === null ? \"\" : String(r.home_score)),\n numeric: true,\n },\n { label: \"COMMENCED\", value: (r) => formatTime(r.commence_time) },\n ];\n printTable(scores, cols);\n });\n}\n\n/* ── futures ────────────────────────────────────────────────────────── */\n\nexport function cmdFutures(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const futures = await client.getFutures(sport);\n if (flags.json) return printJson(futures);\n\n // One row per (futures market, book). The favorite is the\n // shortest-priced outcome (lowest American number = most favored).\n interface Row {\n title: string;\n market: string;\n book: string;\n outcomes: number;\n favorite: string;\n }\n const rows: Row[] = [];\n for (const ev of futures) {\n for (const m of ev.markets) {\n const priced = m.outcomes.filter((o) => o.price !== null);\n const fav = priced.reduce<(typeof priced)[number] | null>(\n (best, o) =>\n best === null || (o.price as number) < (best.price as number)\n ? o\n : best,\n null,\n );\n rows.push({\n title: ev.title,\n market: m.description,\n book: m.bookmaker_title || m.bookmaker,\n outcomes: m.outcomes.length,\n favorite: fav ? `${fav.name} ${formatPrice(fav.price)}` : \"—\",\n });\n }\n }\n const cols: Column<Row>[] = [\n { label: \"FUTURE\", value: (r) => truncate(r.title, 32) },\n { label: \"MARKET\", value: (r) => truncate(r.market, 30) },\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"N\", value: (r) => String(r.outcomes), numeric: true },\n { label: \"FAVORITE\", value: (r) => r.favorite },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── context ─────────────────────────────────────────────────────────── */\n\n/** \"Paul Skenes (R)\" — append the throwing hand when present. `hand` is typed\n * loosely so this works whether or not the installed SDK models the field. */\nfunction fmtPitcher(name: string | null, hand: unknown): string {\n if (!name) return \"—\";\n return typeof hand === \"string\" && hand ? `${name} (${hand})` : name;\n}\n\nexport function cmdContext(\n sport: string,\n eventId: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const ctx = await client.getContext(sport, eventId);\n if (flags.json) return printJson(ctx);\n\n const roof = ctx.roof_type ? ` (${ctx.roof_type})` : \"\";\n process.stdout.write(\n `${ctx.away_team} @ ${ctx.home_team}\\n` +\n `${ctx.venue ?? \"venue TBD\"}${roof} · ${formatTime(ctx.commence_time)}\\n\\n` +\n `Probable pitchers : ${fmtPitcher(ctx.away_probable_pitcher, ctx.away_probable_pitcher_hand)} (away) vs ` +\n `${fmtPitcher(ctx.home_probable_pitcher, ctx.home_probable_pitcher_hand)} (home)\\n` +\n `Lineup confirmed : ${ctx.lineup_confirmed ? \"yes\" : \"no\"}\\n` +\n `Home-plate umpire : ${ctx.home_plate_umpire ?? \"—\"}\\n`,\n );\n const w = ctx.weather;\n if (ctx.is_indoor) {\n process.stdout.write(`Weather : indoor / climate-controlled\\n`);\n } else if (w) {\n const parts = [\n w.temperature_f === null ? null : `${w.temperature_f}°F`,\n w.wind_speed_mph === null\n ? null\n : `wind ${w.wind_speed_mph}mph ${w.wind_direction ?? \"\"}`.trim(),\n w.precip_probability_pct === null\n ? null\n : `precip ${w.precip_probability_pct}%`,\n w.conditions ?? null,\n ].filter(Boolean);\n process.stdout.write(`Weather : ${parts.join(\" · \")}\\n`);\n } else {\n process.stdout.write(`Weather : —\\n`);\n }\n });\n}\n\n/* ── movement ────────────────────────────────────────────────────────── */\n\nexport function cmdMovement(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; bookmakers?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const mv = await client.getMovement(sport, eventId, {\n markets: flags.markets ? flags.markets.split(\",\") : undefined,\n bookmakers: flags.bookmakers,\n period: flags.period,\n });\n if (flags.json) return printJson(mv);\n\n process.stdout.write(\n `${mv.away_team} @ ${mv.home_team} — line movement & steam\\n` +\n `${mv.bookmakers.length} books\\n\\n`,\n );\n if (!mv.steam.length) {\n process.stdout.write(\"No steam moves detected.\\n\");\n return;\n }\n const cols: Column<(typeof mv.steam)[number]>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n {\n label: \"OUTCOME\",\n value: (r) => (r.description ? `${r.name} (${r.description})` : r.name),\n },\n { label: \"DIR\", value: (r) => r.consensus_direction },\n {\n label: \"BOOKS\",\n value: (r) => `${r.books_moved}/${r.books_quoting}`,\n numeric: true,\n },\n { label: \"SCORE\", value: (r) => r.steam_score.toFixed(1), numeric: true },\n {\n label: \"PROBΔ\",\n value: (r) => `${(r.avg_prob_shift * 100).toFixed(1)}%`,\n numeric: true,\n },\n ];\n printTable(mv.steam, cols);\n });\n}\n\n/* ── grand-salami ────────────────────────────────────────────────────── */\n\nexport function cmdGrandSalami(\n flags: CommonFlags & { date?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const gs = await client.getMlbGrandSalami({ date: flags.date });\n if (flags.json) return printJson(gs);\n process.stdout.write(\n `MLB Grand Salami — ${gs.date} (US Eastern)\\n` +\n `${gs.games_total} games · ${gs.games_completed} final · ` +\n `${gs.games_in_progress} live · ${gs.games_upcoming} upcoming\\n` +\n (gs.actual_total_runs === null\n ? `Actual total: pending\\n\\n`\n : `Actual total: ${gs.actual_total_runs} runs\\n\\n`),\n );\n const cols: Column<(typeof gs.bookmakers)[number]>[] = [\n { label: \"BOOK\", value: (r) => r.title },\n { label: \"GAMES\", value: (r) => String(r.games_priced), numeric: true },\n { label: \"LINE\", value: (r) => r.line.toFixed(1), numeric: true },\n { label: \"RESULT\", value: (r) => r.result ?? \"\" },\n ];\n printTable(gs.bookmakers, cols);\n });\n}\n\n/* ── daily-goals-total ───────────────────────────────────────────────── */\n\nexport function cmdDailyGoalsTotal(\n flags: CommonFlags & { date?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const dgt = await client.getNhlDailyGoalsTotal({ date: flags.date });\n if (flags.json) return printJson(dgt);\n process.stdout.write(\n `NHL Daily Goals Total — ${dgt.date} (US Eastern)\\n` +\n `${dgt.games_total} games · ${dgt.games_completed} final · ` +\n `${dgt.games_in_progress} live · ${dgt.games_upcoming} upcoming\\n` +\n (dgt.actual_total_goals === null\n ? `Actual total: pending\\n\\n`\n : `Actual total: ${dgt.actual_total_goals} goals\\n\\n`),\n );\n const cols: Column<(typeof dgt.bookmakers)[number]>[] = [\n { label: \"BOOK\", value: (r) => r.title },\n { label: \"GAMES\", value: (r) => String(r.games_priced), numeric: true },\n { label: \"LINE\", value: (r) => r.line.toFixed(1), numeric: true },\n { label: \"RESULT\", value: (r) => r.result ?? \"\" },\n ];\n printTable(dgt.bookmakers, cols);\n });\n}\n\n/* ── resolution-summary ──────────────────────────────────────────────── */\n\nexport function cmdResolutionSummary(\n flags: CommonFlags & { days?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const s = await client.getResolutionSummary(flags.days ?? 30);\n if (flags.json) return printJson(s);\n process.stdout.write(\n `${s.total_graded.toLocaleString()} props graded ` +\n `(${s.total_settled.toLocaleString()} settled) across ` +\n `${s.sports_covered} sports / ${s.events_graded.toLocaleString()} ` +\n `games — last ${s.days}d\\n\\n`,\n );\n const cols: Column<(typeof s.by_sport)[number]>[] = [\n { label: \"SPORT\", value: (r) => r.title },\n { label: \"KEY\", value: (r) => r.sport_key },\n { label: \"GRADED\", value: (r) => r.graded.toLocaleString(), numeric: true },\n { label: \"GAMES\", value: (r) => String(r.events), numeric: true },\n ];\n printTable(s.by_sport, cols);\n });\n}\n\n/* ── book-accuracy ───────────────────────────────────────────────────── */\n\nexport function cmdBookAccuracy(\n flags: CommonFlags & { days?: number; sport?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const r = await client.getBookAccuracy({ days: flags.days, sport: flags.sport });\n if (flags.json) return printJson(r);\n process.stdout.write(\n `Sportsbook prop-pricing accuracy — ${r.total_props.toLocaleString()} props, ` +\n `last ${r.days}d${r.sport ? ` (${r.sport})` : \"\"}\\n` +\n `skill_bp > 0 = closer to the result than the market average. ` +\n `A pricing report, not a betting edge.\\n\\n`,\n );\n const rows = [...r.books]\n .sort((a, b) => b.skill_bp - a.skill_bp)\n .map((b, i) => ({ ...b, rank: i + 1 }));\n const cols: Column<(typeof rows)[number]>[] = [\n { label: \"#\", value: (b) => String(b.rank), numeric: true },\n { label: \"BOOK\", value: (b) => b.title },\n {\n label: \"SKILL_BP\",\n value: (b) => `${b.skill_bp > 0 ? \"+\" : \"\"}${b.skill_bp.toFixed(1)}`,\n numeric: true,\n },\n { label: \"VERDICT\", value: (b) => b.verdict },\n { label: \"MARGIN%\", value: (b) => b.margin_pct.toFixed(2), numeric: true },\n { label: \"PROPS\", value: (b) => b.props.toLocaleString(), numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── dfs-payouts ─────────────────────────────────────────────────────── */\n\nexport function cmdDfsPayouts(\n flags: CommonFlags & { legWinProb?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const t = await client.getDfsPayouts({ legWinProb: flags.legWinProb });\n if (flags.json) return printJson(t);\n const withEv = flags.legWinProb !== undefined;\n process.stdout.write(\n `PrizePicks payout schedule + per-leg breakeven` +\n (withEv ? ` @ ${(flags.legWinProb! * 100).toFixed(0)}% per leg` : \"\") +\n `\\n\\n`,\n );\n const cols: Column<(typeof t.plays)[number]>[] = [\n { label: \"PLAY\", value: (r) => r.play_type },\n { label: \"LEGS\", value: (r) => String(r.legs), numeric: true },\n {\n label: \"ALL-HIT\",\n value: (r) => `${r.all_correct_multiplier.toFixed(2)}x`,\n numeric: true,\n },\n {\n label: \"BREAKEVEN\",\n value: (r) => `${(r.breakeven_leg_win_prob * 100).toFixed(1)}%`,\n numeric: true,\n },\n ];\n if (withEv) {\n cols.push(\n {\n label: \"EV/$1\",\n value: (r) => (r.expected_return ?? 0).toFixed(3),\n numeric: true,\n },\n { label: \"+EV?\", value: (r) => (r.is_plus_ev ? \"yes\" : \"no\") },\n );\n }\n printTable(t.plays, cols);\n process.stdout.write(`\\n${t.disclaimer}\\n`);\n });\n}\n\n/* ── live (cross-sport in-progress games) ────────────────────────────── */\n\nconst LIVE_SPORTS = [\n \"baseball_mlb\",\n \"basketball_nba\",\n \"hockey_nhl\",\n \"basketball_ncaab\",\n \"football_nfl\",\n \"football_ncaaf\",\n \"soccer_epl\",\n \"soccer_la_liga\",\n \"soccer_serie_a\",\n \"soccer_bundesliga\",\n \"soccer_ligue_1\",\n \"soccer_mls\",\n \"tennis\",\n \"golf\",\n \"mma_ufc\",\n];\n\nexport function cmdLive(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n // Hit /scores per sport in parallel and keep only `in_progress` rows.\n // Tolerates per-sport failure so one 404 doesn't abort the whole\n // command — the CLI is meant for casual terminal use, not strict\n // pipelines.\n type LiveRow = {\n sport: string;\n id: string;\n teams: string;\n score: string;\n period: string;\n };\n const settled = await Promise.allSettled(\n LIVE_SPORTS.map(async (sportKey): Promise<LiveRow[]> => {\n const scores = await client.getScores(sportKey, { daysFrom: 1 });\n return scores\n .filter((sc) => sc.status === \"in_progress\")\n .map((sc) => ({\n sport: sportKey,\n id: String(sc.id),\n teams: `${sc.away_team} @ ${sc.home_team}`,\n score:\n sc.home_score !== null && sc.away_score !== null\n ? `${sc.away_score}-${sc.home_score}`\n : \"\",\n period: typeof sc.period === \"string\" ? sc.period : \"\",\n }));\n }),\n );\n const rows: LiveRow[] = [];\n for (const r of settled) {\n if (r.status !== \"fulfilled\") continue;\n rows.push(...r.value);\n }\n if (flags.json) return printJson(rows);\n if (rows.length === 0) {\n process.stdout.write(\"(no games in progress right now)\\n\");\n return;\n }\n const cols: Column<LiveRow>[] = [\n { label: \"SPORT\", value: (r) => r.sport },\n { label: \"ID\", value: (r) => r.id },\n { label: \"MATCHUP\", value: (r) => r.teams },\n { label: \"SCORE\", value: (r) => r.score },\n { label: \"PERIOD\", value: (r) => r.period },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── ev (cross-book +EV) ────────────────────────────────────────────── */\n\nexport function cmdEv(\n sport: string,\n eventId: string,\n flags: CommonFlags & {\n markets?: string;\n bookmakers?: string;\n plus?: boolean;\n devig?: string;\n fairSource?: string;\n maxAge?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.devig && flags.devig !== \"multiplicative\" && flags.devig !== \"shin\") {\n throw new Error(`--devig must be 'multiplicative' or 'shin' (got '${flags.devig}')`);\n }\n let maxAge: number | undefined;\n if (flags.maxAge !== undefined) {\n maxAge = Number(flags.maxAge);\n if (!Number.isInteger(maxAge) || maxAge < 0) {\n throw new Error(`--max-age must be a whole number of seconds >= 0 (got '${flags.maxAge}')`);\n }\n }\n const resp = await client.getEventEv(sport, eventId, {\n markets: parseMarketsFlag(flags.markets),\n // Narrows the prices, never the anchor: --bookmakers draftkings\n // still measures DK against Pinnacle.\n bookmakers: flags.bookmakers,\n devig: flags.devig as \"multiplicative\" | \"shin\" | undefined,\n fairSource: flags.fairSource,\n maxAge,\n });\n if (flags.json) return printJson(resp);\n type Row = {\n market: string;\n player: string;\n point: string;\n side: string;\n book: string;\n price: string;\n ev: string;\n plus: boolean;\n };\n const rows: Row[] = [];\n for (const line of resp.lines) {\n for (const o of line.outcomes) {\n rows.push({\n market: line.market_key,\n player: line.description,\n point: formatPoint(line.point),\n side: o.name,\n book: o.book_title,\n price: formatPrice(o.price),\n ev: `${o.ev_pct >= 0 ? \"+\" : \"\"}${o.ev_pct.toFixed(2)}%`,\n plus: o.is_plus_ev,\n });\n }\n }\n const filtered = flags.plus ? rows.filter((r) => r.plus) : rows;\n // Sort +EV first regardless of filter — the most-actionable rows\n // should land at the top of the terminal, not the bottom.\n filtered.sort((a, b) => parseFloat(b.ev) - parseFloat(a.ev));\n process.stdout.write(\n `${resp.away_team} @ ${resp.home_team} · fair anchor: ${resp.fair_source_default}\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n { label: \"EV%\", value: (r) => r.ev, numeric: true },\n ];\n printTable(filtered, cols);\n });\n}\n\n/* ── projections ────────────────────────────────────────────────────── */\n\nexport function cmdProjections(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getEventProjections(sport, eventId, {\n markets: parseMarketsFlag(flags.markets),\n });\n if (flags.json) return printJson(resp);\n type Row = {\n market: string;\n player: string;\n value: string;\n prob: string;\n books: string;\n };\n const rows: Row[] = resp.projections.map((r) => ({\n market: r.market_key,\n player: r.player,\n value: r.projected_value == null ? \"—\" : String(r.projected_value),\n prob:\n r.consensus_over_prob == null\n ? \"—\"\n : `${(r.consensus_over_prob * 100).toFixed(1)}%`,\n books: String(r.books_contributing),\n }));\n process.stdout.write(\n `${resp.away_team} @ ${resp.home_team} · market-implied (not a forecast)\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"PROJECTED\", value: (r) => r.value, numeric: true },\n { label: \"P(OVER)\", value: (r) => r.prob, numeric: true },\n { label: \"BOOKS\", value: (r) => r.books, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── best-line ──────────────────────────────────────────────────────── */\n\nexport function cmdBestLine(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; bookmakers?: string; links?: boolean },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getEventBestLine(sport, eventId, {\n markets: parseMarketsFlag(flags.markets),\n bookmakers: flags.bookmakers,\n includeLinks: flags.links,\n });\n if (flags.json) return printJson(resp);\n type Row = {\n market: string;\n player: string;\n point: string;\n side: string;\n book: string;\n price: string;\n books: string;\n };\n const rows: Row[] = [];\n for (const line of resp.lines) {\n for (const [side, info] of Object.entries(line.sides)) {\n rows.push({\n market: line.market_key,\n player: line.description,\n point: formatPoint(line.point),\n side,\n book: info.best.book_title,\n price: formatPrice(info.best.price),\n books: String(info.all_prices.length),\n });\n }\n }\n process.stdout.write(\n `${resp.away_team} @ ${resp.home_team} · books considered: ${resp.books_considered.join(\", \")}\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"BEST BOOK\", value: (r) => r.book },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n { label: \"N BOOKS\", value: (r) => r.books, numeric: true },\n ];\n printTable(rows, cols);\n if (flags.links) {\n const links = new Map<string, string>();\n const appLinks = new Map<string, string>();\n for (const line of resp.lines) {\n for (const info of Object.values(line.sides)) {\n for (const price of info.all_prices) {\n const p = price as {\n link?: string | null;\n app_link?: string | null;\n };\n if (p.link) links.set(price.book_title, p.link);\n // Mobile app-open deep link (ProphetX only today).\n if (p.app_link) appLinks.set(price.book_title, p.app_link);\n }\n }\n }\n if (links.size || appLinks.size) {\n process.stdout.write(\"\\nEvent pages:\\n\");\n for (const [title, link] of links) {\n process.stdout.write(` ${title}: ${link}\\n`);\n }\n for (const [title, link] of appLinks) {\n process.stdout.write(` ${title} (app): ${link}\\n`);\n }\n }\n }\n });\n}\n\n/* ── players (search) ───────────────────────────────────────────────── */\n\nexport function cmdPlayers(\n sport: string,\n search: string,\n flags: CommonFlags & { limit?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.searchPlayers(sport, search, {\n limit: flags.limit,\n });\n if (flags.json) return printJson(resp);\n process.stdout.write(\n `${resp.sport_key} · \"${resp.search}\" (${resp.players.length} players)\\n`,\n );\n type Player = (typeof resp.players)[number];\n const cols: Column<Player>[] = [\n { label: \"PLAYER_ID\", value: (r) => r.player_id },\n { label: \"NAME\", value: (r) => r.name },\n { label: \"KNOWN_NAMES\", value: (r) => r.known_names.join(\", \") },\n ];\n printTable(resp.players, cols);\n });\n}\n\n/* ── player-history ─────────────────────────────────────────────────── */\n\nexport function cmdPlayerHistory(\n sport: string,\n player: string,\n flags: CommonFlags & {\n market: string;\n bookmaker?: string;\n limit?: number;\n mainLineOnly?: boolean;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerHistory(sport, player, {\n market: flags.market,\n bookmaker: flags.bookmaker,\n limit: flags.limit,\n mainLineOnly: flags.mainLineOnly,\n });\n if (flags.json) return printJson(resp);\n const pid = resp.player_id ? ` [${resp.player_id}]` : \"\";\n process.stdout.write(\n `${resp.player_name}${pid} · ${resp.market} (${resp.entries.length} entries)\\n`,\n );\n type Entry = (typeof resp.entries)[number];\n const cols: Column<Entry>[] = [\n { label: \"DATE\", value: (r) => formatTime(r.commence_time).slice(0, 10) },\n { label: \"MATCHUP\", value: (r) => `${r.away_team} @ ${r.home_team}` },\n { label: \"BOOK\", value: (r) => r.bookmaker_title },\n {\n label: \"LINE\",\n value: (r) => formatPoint(r.line),\n numeric: true,\n },\n {\n // \"M\" = the book's main line; blank = an alt-ladder rung.\n // \"*\" = the book moved this line after the game started.\n label: \"MAIN\",\n value: (r) =>\n `${r.is_main_line ? \"M\" : \"\"}${r.line_moved_in_play ? \"*\" : \"\"}`,\n },\n { label: \"OVER\", value: (r) => formatPrice(r.over_price), numeric: true },\n {\n label: \"UNDER\",\n value: (r) => formatPrice(r.under_price),\n numeric: true,\n },\n {\n label: \"ACTUAL\",\n value: (r) => (r.actual_value === null ? \"\" : String(r.actual_value)),\n numeric: true,\n },\n {\n label: \"RESULT\",\n value: (r) => {\n if (r.over_result === \"won\") return \"OVER ✓\";\n if (r.under_result === \"won\") return \"UNDER ✓\";\n if (r.over_result === \"push\" || r.under_result === \"push\") return \"PUSH\";\n if (r.over_result === \"void\" || r.under_result === \"void\") return \"VOID\";\n return \"\";\n },\n },\n ];\n printTable(resp.entries, cols);\n });\n}\n\n/* ── player-games ───────────────────────────────────────────────────── */\n\nexport function cmdPlayerGames(\n sport: string,\n player: string,\n flags: CommonFlags & {\n limit?: number;\n opponent?: string;\n statType?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerGames(sport, player, {\n limit: flags.limit,\n opponent: flags.opponent,\n statType: flags.statType,\n });\n if (flags.json) return printJson(resp);\n\n const scope = resp.opponent ? ` vs ${resp.opponent}` : \"\";\n process.stdout.write(\n `${resp.player_name}${scope} (${resp.games.length} games)\\n`,\n );\n if (resp.games.length === 0) return;\n\n // Columns are data-driven: the stat vocabulary differs per sport, and\n // within a sport a game can carry a stat an earlier one didn't (a pitcher\n // in one row, a batter in the next), so take the union across games and\n // keep first-seen order rather than hardcoding a per-sport list.\n const statNames: string[] = [];\n for (const g of resp.games) {\n for (const name of Object.keys(g.stats)) {\n if (!statNames.includes(name)) statNames.push(name);\n }\n }\n\n type Game = (typeof resp.games)[number];\n const cols: Column<Game>[] = [\n { label: \"DATE\", value: (g) => formatTime(g.commence_time).slice(0, 10) },\n {\n label: \"OPP\",\n value: (g) =>\n g.opponent === null\n ? `${g.away_team} @ ${g.home_team}`\n : `${g.is_home ? \"vs\" : \"@\"} ${g.opponent}`,\n },\n ...statNames.map((name) => ({\n label: name.toUpperCase(),\n value: (g: Game) => {\n const v = g.stats[name];\n // A stat absent for this game is blank, never 0 — the player may\n // simply not have been measured on it (a batter has no pitching\n // line), and printing 0 would read as a real result.\n return v === undefined ? \"\" : String(v);\n },\n numeric: true,\n })),\n ];\n printTable(resp.games, cols);\n });\n}\n\n/* ── player-trends ──────────────────────────────────────────────────── */\n\nfunction formatOverPct(w: HitRateSplit | null): string {\n if (!w || w.over_pct === null || w.over_pct === undefined) return \"\";\n return `${w.over_pct.toFixed(0)}%`;\n}\n\nexport function cmdPlayerTrends(\n sport: string,\n player: string,\n flags: CommonFlags & {\n market?: string;\n dfsOddsType?: \"standard\" | \"goblin\" | \"demon\";\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerTrends(sport, player, {\n market: flags.market,\n dfsOddsType: flags.dfsOddsType,\n });\n if (flags.json) return printJson(resp);\n process.stdout.write(\n `${resp.player_name} · ${resp.sport_key} (${resp.markets.length} markets)\\n`,\n );\n const cols: Column<PlayerMarketTrend>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n {\n label: \"GAMES\",\n value: (r) => String(r.games_graded),\n numeric: true,\n },\n { label: \"LINE\", value: (r) => formatPoint(r.recent_line), numeric: true },\n {\n label: \"AVG\",\n value: (r) =>\n r.avg_actual === null || r.avg_actual === undefined\n ? \"\"\n : r.avg_actual.toFixed(2),\n numeric: true,\n },\n { label: \"L5 O%\", value: (r) => formatOverPct(r.last_5), numeric: true },\n { label: \"L10 O%\", value: (r) => formatOverPct(r.last_10), numeric: true },\n { label: \"L20 O%\", value: (r) => formatOverPct(r.last_20), numeric: true },\n {\n label: \"STREAK\",\n value: (r) => {\n const s = r.current_streak;\n if (!s) return \"\";\n return `${s.length}× ${s.result}`;\n },\n },\n ];\n printTable(resp.markets, cols);\n });\n}\n\n/* ── export-resolved-props ──────────────────────────────────────────── */\n\nexport function cmdExportResolvedProps(\n flags: CommonFlags & {\n sport: string;\n market?: string;\n bookmaker?: string;\n since?: string;\n until?: string;\n out?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.out) {\n const path = await client.exportResolvedProps({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n outPath: flags.out,\n });\n process.stdout.write(`exported → ${path}\\n`);\n return;\n }\n // No --out: stream raw CSV bytes straight to stdout so a user can\n // pipe `propline export-resolved-props --sport mlb | head` to\n // sample. --json is meaningless here since the API only emits CSV;\n // we ignore it for this command.\n const buf = await client.exportResolvedProps({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n });\n process.stdout.write(buf);\n });\n}\n\n/* ── export-odds-history ────────────────────────────────────────────── */\n\nexport function cmdExportOddsHistory(\n flags: CommonFlags & {\n sport: string;\n market?: string;\n bookmaker?: string;\n since?: string;\n until?: string;\n out?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.out) {\n const path = await client.exportOddsHistory({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n outPath: flags.out,\n });\n process.stdout.write(`exported → ${path}\\n`);\n return;\n }\n // No --out: stream raw CSV bytes to stdout. The API only emits CSV,\n // so --json is meaningless here and ignored. This dataset is large —\n // pass --since/--until to page month-by-month.\n const buf = await client.exportOddsHistory({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n });\n process.stdout.write(buf);\n });\n}\n\n/* ── webhooks ───────────────────────────────────────────────────────── */\n\nexport function cmdWebhooksList(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const hooks = await client.listWebhooks();\n if (flags.json) return printJson(hooks);\n type H = (typeof hooks)[number];\n const cols: Column<H>[] = [\n { label: \"ID\", value: (r) => String(r.id), numeric: true },\n { label: \"URL\", value: (r) => truncate(r.url, 50) },\n { label: \"EVENTS\", value: (r) => (r.events ?? []).join(\",\") },\n { label: \"ACTIVE\", value: (r) => (r.active ? \"yes\" : \"no\") },\n { label: \"SPORT\", value: (r) => r.filter_sport_key ?? \"\" },\n { label: \"MARKET\", value: (r) => r.filter_market_key ?? \"\" },\n { label: \"CREATED\", value: (r) => formatTime(r.created_at) },\n ];\n printTable(hooks, cols);\n });\n}\n\nexport function cmdWebhooksCreate(\n flags: CommonFlags & {\n url: string;\n events?: string;\n sport?: string;\n market?: string;\n player?: string;\n bookmakers?: string;\n eventId?: number;\n minPriceChangePct?: number;\n minSteamScore?: number;\n minBooksAgreeing?: number;\n minEvPct?: number;\n maxEvPct?: number;\n evFairSource?: string;\n batchMax?: number;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = flags.events\n ? (flags.events.split(\",\").map((s) => s.trim()) as Array<\n \"line_movement\" | \"resolution\" | \"steam\" | \"market_suspended\" | \"ev\" | \"line_added\" | \"line_pulled\"\n >)\n : undefined;\n const hook = await client.createWebhook({\n url: flags.url,\n events,\n filterSportKey: flags.sport,\n filterMarketKey: flags.market,\n filterPlayerName: flags.player,\n filterBookmakerKey: flags.bookmakers,\n filterEventId: flags.eventId,\n minPriceChangePct: flags.minPriceChangePct,\n minSteamScore: flags.minSteamScore,\n minBooksAgreeing: flags.minBooksAgreeing,\n minEvPct: flags.minEvPct,\n maxEvPct: flags.maxEvPct,\n evFairSource: flags.evFairSource,\n batchMax: flags.batchMax,\n });\n if (flags.json) return printJson(hook);\n process.stdout.write(\n `webhook ${hook.id} created.\\n` +\n `url: ${hook.url}\\n` +\n `events: ${(hook.events ?? []).join(\",\") || \"(all)\"}\\n` +\n `secret: ${hook.secret}\\n\\n` +\n `STORE THE SECRET NOW — it's only revealed once. Use it to verify\\n` +\n `the X-PropLine-Signature header on every delivery.\\n`,\n );\n });\n}\n\nexport function cmdWebhooksDelete(\n id: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n await client.deleteWebhook(numeric);\n if (flags.json) return printJson({ ok: true, id: numeric });\n process.stdout.write(`webhook ${numeric} deleted.\\n`);\n });\n}\n\nexport function cmdWebhooksTest(id: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n const result = await client.testWebhook(numeric);\n if (flags.json) return printJson(result);\n process.stdout.write(`test payload queued for webhook ${numeric}.\\n`);\n });\n}\n\nexport function cmdWebhooksDeliveries(\n id: string,\n flags: CommonFlags & { limit?: number; beforeId?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n const deliveries = await client.listWebhookDeliveries(numeric, {\n limit: flags.limit,\n beforeId: flags.beforeId,\n });\n if (flags.json) return printJson(deliveries);\n type D = (typeof deliveries)[number];\n const cols: Column<D>[] = [\n { label: \"ID\", value: (r) => String(r.id), numeric: true },\n { label: \"STATUS\", value: (r) => String(r.status) },\n {\n label: \"RESP\",\n value: (r) => (r.response_code === null ? \"\" : String(r.response_code)),\n numeric: true,\n },\n { label: \"ATTEMPTS\", value: (r) => String(r.attempts), numeric: true },\n { label: \"DELIVERED\", value: (r) => formatTime(r.delivered_at) },\n ];\n printTable(deliveries, cols);\n });\n}\n\nexport function cmdWebhooksReplay(\n id: string,\n flags: CommonFlags & { sinceSeq?: number; limit?: number; all?: boolean },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n\n let cursor = flags.sinceSeq ?? 0;\n const collected: Awaited<\n ReturnType<typeof client.replayWebhookEvents>\n >[\"events\"] = [];\n let page = await client.replayWebhookEvents(numeric, {\n sinceSeq: cursor,\n limit: flags.limit,\n });\n let truncated = page.truncated;\n collected.push(...page.events);\n cursor = page.next_seq;\n\n // --all follows the cursor to the end of the retained window; without it\n // a single page is fetched, which is the right default for eyeballing.\n while (flags.all && page.has_more) {\n page = await client.replayWebhookEvents(numeric, {\n sinceSeq: cursor,\n limit: flags.limit,\n });\n truncated = truncated || page.truncated;\n collected.push(...page.events);\n cursor = page.next_seq;\n }\n\n if (flags.json) {\n return printJson({ ...page, events: collected, truncated });\n }\n\n type E = (typeof collected)[number];\n const cols: Column<E>[] = [\n { label: \"SEQ\", value: (r) => String(r.seq), numeric: true },\n { label: \"EVENT\", value: (r) => String(r.event_type) },\n { label: \"CREATED\", value: (r) => formatTime(r.created_at) },\n { label: \"DELIVERY\", value: (r) => String(r.delivery_id), numeric: true },\n ];\n printTable(collected, cols);\n\n // The whole reason this endpoint returns an object rather than a list: a\n // short page must never read as \"you are caught up\".\n if (truncated) {\n process.stderr.write(\n \"warning: events after your cursor have aged out of retention and \" +\n \"cannot be replayed — resync from the REST endpoints.\\n\",\n );\n }\n const behind = page.latest_seq - cursor;\n process.stdout.write(\n `\\ncursor ${cursor} of ${page.latest_seq}` +\n (behind > 0 ? ` (${behind} event(s) still ahead)` : \" (caught up)\") +\n \"\\n\",\n );\n });\n}\n\nexport function cmdStream(\n id: string,\n flags: CommonFlags & { sinceSeq?: number; once?: boolean },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n\n // Line-delimited JSON on stdout so this pipes into jq. The human-readable\n // status goes to stderr, which keeps stdout a clean data stream.\n for await (const ev of client.stream({\n webhookId: numeric,\n sinceSeq: flags.sinceSeq,\n reconnect: !flags.once,\n onTruncated: (ready) => {\n process.stderr.write(\n `warning: events after seq ${ready.since_seq} aged out of retention ` +\n `and cannot be replayed — resync from the REST endpoints.\\n`,\n );\n },\n onReady: (ready) => {\n process.stderr.write(\n `connected: webhook ${ready.webhook_id}, latest_seq ${ready.latest_seq}\\n`,\n );\n },\n })) {\n if (flags.json) {\n process.stdout.write(JSON.stringify(ev) + \"\\n\");\n } else {\n const who = (ev.data as Record<string, unknown>)?.player_name ?? \"\";\n process.stdout.write(\n `${String(ev.seq).padStart(8)} ${ev.event_type} ${who}\\n`,\n );\n }\n }\n });\n}\n\n/* ── history ────────────────────────────────────────────────────────── */\n\nexport function cmdHistory(\n sport: string,\n eventId: string,\n flags: CommonFlags & {\n markets?: string;\n bookmakers?: string;\n from?: string;\n to?: string;\n relativeFrom?: string;\n relativeTo?: string;\n interval?: string;\n changesOnly?: boolean;\n period?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const hist = await client.getOddsHistory(sport, eventId, {\n markets,\n bookmakers: flags.bookmakers,\n from: flags.from,\n to: flags.to,\n relativeFrom: flags.relativeFrom,\n relativeTo: flags.relativeTo,\n interval: flags.interval as\n | \"30s\"\n | \"1m\"\n | \"5m\"\n | \"15m\"\n | \"30m\"\n | \"1h\"\n | undefined,\n changesOnly: flags.changesOnly,\n period: flags.period,\n });\n if (flags.json) return printJson(hist);\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n when: string;\n point: string;\n price: string;\n };\n const rows: Row[] = [];\n for (const book of hist.bookmakers ?? []) {\n for (const m of book.markets ?? []) {\n for (const o of m.outcomes ?? []) {\n for (const s of o.snapshots ?? []) {\n rows.push({\n book: book.title ?? book.key,\n market: m.key,\n player: o.description ?? \"\",\n side: o.name,\n when: formatTime(s.recorded_at),\n point: formatPoint(s.point ?? null),\n price: formatPrice(s.price),\n });\n }\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no snapshots returned — check tier access and the time window)\\n`,\n );\n return;\n }\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"WHEN\", value: (r) => r.when },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nexport function cmdSgp(\n sport: string,\n eventId: string,\n file: string,\n flags: CommonFlags & { bookmaker?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const raw =\n file === \"-\"\n ? await new Promise<string>((resolve, reject) => {\n let buf = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (c) => (buf += c));\n process.stdin.on(\"end\", () => resolve(buf));\n process.stdin.on(\"error\", reject);\n })\n : await readFile(file, \"utf8\");\n let legs: unknown;\n try {\n legs = JSON.parse(raw);\n } catch (e) {\n throw new Error(\n `Could not parse ${file === \"-\" ? \"stdin\" : file} as JSON: ${\n (e as Error).message\n }`,\n );\n }\n if (!Array.isArray(legs)) {\n throw new Error(\"Expected a JSON array of leg objects (market, name, description, point, period).\");\n }\n\n const q = await client.priceSgp(\n sport,\n eventId,\n legs as never,\n flags.bookmaker ?? \"fanduel\",\n );\n if (flags.json) return printJson(q);\n\n if (\"quotes\" in q) {\n // bookmaker=all — every book on the same legs, side by side.\n type SgpOne = Awaited<ReturnType<PropLine[\"priceSgp\"]>>;\n type SgpAll = {\n away_team: string; home_team: string; redacted?: boolean;\n best_bookmaker: string | null;\n quotes: SgpOne[];\n errors: { bookmaker_title: string; status: number; error: string | null }[];\n };\n const all = q as unknown as SgpAll;\n process.stdout.write(`${all.away_team} @ ${all.home_team} · all books\\n`);\n if (all.redacted) {\n process.stdout.write(\"(free tier — prices redacted; Hobby+ unlocks the quotes)\\n\");\n }\n type BookRow = { book: string; sgp: string; indep: string; corr: string; note: string };\n const bookRows: BookRow[] = [\n ...all.quotes.map((x) => ({\n book: x.bookmaker_title,\n sgp: x.sgp_price === null || x.sgp_price === undefined ? \"\" : formatPrice(x.sgp_price),\n indep:\n x.independent_price === null || x.independent_price === undefined\n ? \"\"\n : formatPrice(x.independent_price),\n corr: x.correlation_factor === null || x.correlation_factor === undefined ? \"\" : `×${x.correlation_factor}`,\n note: x.bookmaker === all.best_bookmaker ? \"best\" : x.quoted === false ? \"not quoted\" : \"\",\n })),\n ...all.errors.map((e) => ({\n book: e.bookmaker_title, sgp: \"\", indep: \"\", corr: \"\",\n note: `${e.status} ${e.error ?? \"error\"}`,\n })),\n ];\n const bookCols: Column<BookRow>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"SGP\", value: (r) => r.sgp, numeric: true },\n { label: \"INDEPENDENT\", value: (r) => r.indep, numeric: true },\n { label: \"CORRELATION\", value: (r) => r.corr, numeric: true },\n { label: \"\", value: (r) => r.note },\n ];\n printTable(bookRows, bookCols);\n return;\n }\n\n process.stdout.write(\n `${q.away_team} @ ${q.home_team} · ${q.bookmaker_title}\\n`,\n );\n if (q.redacted) {\n process.stdout.write(\"(free tier — prices redacted; Hobby+ unlocks the quote)\\n\");\n } else if (q.quoted) {\n process.stdout.write(\n `SGP ${formatPrice(q.sgp_price ?? 0)} · independent ${formatPrice(\n q.independent_price ?? 0,\n )} · correlation ×${q.correlation_factor ?? \"n/a\"}\\n`,\n );\n } else {\n process.stdout.write(\"not quoted — the book will not offer this combination as an SGP\\n\");\n }\n\n type Row = { leg: string; price: string; live: string; status: string };\n const rows: Row[] = q.legs.map((l) => ({\n leg: `${l.market} ${l.description ? `${l.description} ` : \"\"}${l.name}${\n l.point !== null && l.point !== undefined ? ` ${l.point}` : \"\"\n }${l.period ? ` (${l.period})` : \"\"}`,\n price: l.price === null || l.price === undefined ? \"\" : formatPrice(l.price),\n live: l.book_price === null || l.book_price === undefined ? \"\" : formatPrice(l.book_price),\n status:\n l.accepted === null || l.accepted === undefined\n ? \"\"\n : l.accepted\n ? \"ok\"\n : (l.failure_code ?? \"refused\"),\n }));\n const cols: Column<Row>[] = [\n { label: \"LEG\", value: (r) => truncate(r.leg, 48) },\n { label: \"STORED\", value: (r) => r.price, numeric: true },\n { label: \"LIVE\", value: (r) => r.live, numeric: true },\n { label: \"STATUS\", value: (r) => r.status },\n ];\n printTable(rows, cols);\n });\n}\n\nexport function cmdClv(\n file: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n\n // JSON only, deliberately. A bet log is usually a CSV, but a naive\n // split(\",\") mangles any quoted field — \"Tatis Jr., Fernando\" becomes\n // two columns — and silently grading the wrong bet is exactly the\n // failure this endpoint's fail-closed matching exists to prevent.\n // Pipe CSV through jq/csvkit rather than trusting a half parser here.\n const raw =\n file === \"-\"\n ? await new Promise<string>((resolve, reject) => {\n let buf = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (c) => (buf += c));\n process.stdin.on(\"end\", () => resolve(buf));\n process.stdin.on(\"error\", reject);\n })\n : await readFile(file, \"utf8\");\n\n let bets: unknown;\n try {\n bets = JSON.parse(raw);\n } catch (e) {\n throw new Error(\n `Could not parse ${file === \"-\" ? \"stdin\" : file} as JSON: ${\n (e as Error).message\n }`,\n );\n }\n if (!Array.isArray(bets)) {\n throw new Error(\"Expected a JSON array of bet objects.\");\n }\n\n const res = await client.gradeClv(bets as never);\n if (flags.json) return printJson(res);\n\n const s = res.summary;\n process.stdout.write(\n `${s.matched}/${s.bets} matched` +\n (s.unmatched ? ` · ${s.unmatched} unmatched` : \"\") +\n (s.pending ? ` · ${s.pending} pending (event not started)` : \"\") +\n `\\n`,\n );\n if (s.avg_clv_pct !== null && s.avg_clv_pct !== undefined) {\n process.stdout.write(\n `avg CLV ${s.avg_clv_pct > 0 ? \"+\" : \"\"}${s.avg_clv_pct}% · ` +\n `vs de-vigged close ${\n s.avg_ev_vs_close_pct !== null && s.avg_ev_vs_close_pct !== undefined\n ? `${s.avg_ev_vs_close_pct > 0 ? \"+\" : \"\"}${s.avg_ev_vs_close_pct}%`\n : \"n/a\"\n } · beat the close ${s.beat_close_pct ?? \"n/a\"}%` +\n (s.profit_units !== null && s.profit_units !== undefined\n ? ` · ${s.profit_units > 0 ? \"+\" : \"\"}${s.profit_units}u`\n : \"\") +\n `\\n`,\n );\n }\n\n type Row = {\n ref: string;\n selection: string;\n price: string;\n close: string;\n clv: string;\n evClose: string;\n anchor: string;\n result: string;\n };\n const rows: Row[] = (res.bets ?? []).map((b) => ({\n ref: b.ref ?? \"\",\n selection: `${b.selection}${b.side ? ` ${b.side}` : \"\"}${\n b.point !== null && b.point !== undefined ? ` ${b.point}` : \"\"\n }`,\n price: formatPrice(b.price),\n close: b.matched\n ? b.closing_price === null || b.closing_price === undefined\n ? \"\"\n : formatPrice(b.closing_price)\n : `— ${b.unmatched_reason ?? \"unmatched\"}`,\n clv:\n b.clv_pct === null || b.clv_pct === undefined\n ? \"\"\n : `${b.clv_pct > 0 ? \"+\" : \"\"}${b.clv_pct}%`,\n evClose:\n b.ev_vs_close_pct === null || b.ev_vs_close_pct === undefined\n ? \"\"\n : `${b.ev_vs_close_pct > 0 ? \"+\" : \"\"}${b.ev_vs_close_pct}%`,\n // Pre-kickoff rows have no real close; say so rather than printing a\n // CLV that is ~0 by construction.\n anchor: b.matched && !b.closing_is_final ? \"pending\" : b.fair_source ?? \"\",\n result: b.resolution ?? \"\",\n }));\n\n const cols: Column<Row>[] = [\n { label: \"REF\", value: (r) => r.ref },\n { label: \"SELECTION\", value: (r) => truncate(r.selection, 30) },\n { label: \"TOOK\", value: (r) => r.price, numeric: true },\n { label: \"CLOSE\", value: (r) => r.close, numeric: true },\n { label: \"CLV\", value: (r) => r.clv, numeric: true },\n { label: \"VS DEVIG\", value: (r) => r.evClose, numeric: true },\n { label: \"ANCHOR\", value: (r) => r.anchor },\n { label: \"RESULT\", value: (r) => r.result },\n ];\n printTable(rows, cols);\n });\n}\n\nexport function cmdClosing(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; bookmakers?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const closing = await client.getOddsClosing(sport, eventId, {\n markets,\n bookmakers: flags.bookmakers,\n period: flags.period,\n });\n if (flags.json) return printJson(closing);\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n closingAt: string;\n openPoint: string;\n openPrice: string;\n point: string;\n price: string;\n };\n const rows: Row[] = [];\n for (const book of closing.bookmakers ?? []) {\n for (const m of book.markets ?? []) {\n for (const o of m.outcomes ?? []) {\n rows.push({\n book: book.title ?? book.key,\n market: m.key,\n player: o.description ?? \"\",\n side: o.name,\n closingAt: o.closing_at ? formatTime(o.closing_at) : \"\",\n openPoint: formatPoint(o.opening_point ?? null),\n openPrice:\n o.opening_price === null || o.opening_price === undefined\n ? \"\"\n : formatPrice(o.opening_price),\n point: formatPoint(o.point ?? null),\n price: o.price === null ? \"\" : formatPrice(o.price),\n });\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no closing lines returned — check tier access; free tier sees redacted structure)\\n`,\n );\n return;\n }\n process.stdout.write(\n `${closing.away_team} @ ${closing.home_team} (event ${closing.id})\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"CLOSED AT\", value: (r) => r.closingAt },\n { label: \"OPEN\", value: (r) => r.openPoint, numeric: true },\n { label: \"OPEN PRICE\", value: (r) => r.openPrice, numeric: true },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── helpers ────────────────────────────────────────────────────────── */\n\nfunction parseMarketsFlag(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Avoid an unused-import warning while still re-exporting the type\n * for downstream consumers who want to wire their own subcommands. */\nexport type { PropLine };\n","// Thin wrapper around the propline SDK constructor. Resolves auth from\n// (in priority order): --api-key flag → PROPLINE_API_KEY env var → exit\n// with a friendly message. Also threads --base-url for self-hosted /\n// staging deployments and --timeout for slow networks.\n//\n// Pulled out of index.ts so every command resolves credentials the same\n// way — drift between commands is the most common source of \"works on\n// my machine\" CLI bugs.\n\nimport { PropLine, PropLineError } from \"propline\";\n\nexport interface ClientFlags {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n}\n\nexport function buildClient(flags: ClientFlags): PropLine {\n const apiKey = flags.apiKey ?? process.env.PROPLINE_API_KEY;\n if (!apiKey) {\n process.stderr.write(\n \"error: API key required.\\n\\n\" +\n \" Set PROPLINE_API_KEY in your environment, or pass --api-key.\\n\" +\n \" Get one free at https://prop-line.com\\n\",\n );\n process.exit(2);\n }\n return new PropLine(apiKey, {\n baseUrl: flags.baseUrl,\n timeoutMs: flags.timeout ? flags.timeout * 1000 : undefined,\n });\n}\n\n/** Wrap a command body with consistent error reporting. PropLine API\n * errors get a one-line summary; everything else surfaces the message\n * + exits non-zero so shell scripts can detect failure. */\nexport async function runCommand(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n if (err instanceof PropLineError) {\n process.stderr.write(`error: ${err.message}\\n`);\n } else if (err instanceof Error) {\n process.stderr.write(`error: ${err.message}\\n`);\n } else {\n process.stderr.write(`error: ${String(err)}\\n`);\n }\n process.exit(1);\n }\n}\n","// Pretty-printing helpers — zero deps. Default output is a fixed-width\n// table with right-aligned numeric columns; pass --json on any command\n// to bypass and emit raw response JSON instead. Tables are streamed to\n// stdout via console.log so a downstream `| head` short-circuits cleanly.\n\nexport interface Column<T> {\n label: string;\n /** Stringified cell value. */\n value: (row: T) => string;\n /** Right-align (numeric) vs default left-align. */\n numeric?: boolean;\n}\n\nexport function printJson(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function printTable<T>(rows: T[], columns: Column<T>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(no rows)\\n\");\n return;\n }\n const cells: string[][] = rows.map((r) =>\n columns.map((c) => {\n const v = c.value(r);\n return v === undefined || v === null ? \"\" : String(v);\n }),\n );\n const headers = columns.map((c) => c.label);\n\n // Width = max(header, max cell). Capped at 60 chars so a long player\n // name or URL doesn't blow the layout open; the table is for skim\n // reading, full data is one --json away.\n const widths = headers.map((h, i) =>\n Math.min(60, Math.max(h.length, ...cells.map((row) => (row[i] ?? \"\").length))),\n );\n\n function pad(s: string, w: number, numeric: boolean): string {\n const truncated = s.length > w ? s.slice(0, w - 1) + \"…\" : s;\n if (numeric) return truncated.padStart(w);\n return truncated.padEnd(w);\n }\n\n // Header\n process.stdout.write(\n headers\n .map((h, i) => pad(h, widths[i] ?? 0, columns[i]?.numeric ?? false))\n .join(\" \") + \"\\n\",\n );\n // Underline\n process.stdout.write(widths.map((w) => \"─\".repeat(w)).join(\" \") + \"\\n\");\n // Rows\n for (const row of cells) {\n process.stdout.write(\n row\n .map((c, i) => pad(c, widths[i] ?? 0, columns[i]?.numeric ?? false))\n .join(\" \") + \"\\n\",\n );\n }\n}\n\nexport function formatPrice(price: number | null | undefined): string {\n if (price === null || price === undefined) return \"–\";\n if (price === 0) return \"EVEN\";\n return price > 0 ? `+${price}` : String(price);\n}\n\nexport function formatPoint(point: number | null | undefined): string {\n if (point === null || point === undefined) return \"\";\n if (Number.isInteger(point)) return String(point);\n return point.toFixed(1);\n}\n\nexport function formatTime(iso: string | null | undefined): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\n/** Truncate to N chars with ellipsis — used for long player/market names. */\nexport function truncate(s: string, n: number): string {\n if (s.length <= n) return s;\n return s.slice(0, n - 1) + \"…\";\n}\n"],"mappings":"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","names":["resp","markets"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands.ts","../src/client.ts","../src/format.ts"],"sourcesContent":["// PropLine CLI — terminal interface to the PropLine player props API.\n// Wraps the `propline` Node SDK; no API surface of its own. Add new\n// commands by importing a handler from ./commands.ts and registering\n// it on the matching `program.command(...)` below.\n\nimport { Command, Option } from \"commander\";\nimport {\n cmdSports,\n cmdEvents,\n cmdOdds,\n cmdScores,\n cmdFutures,\n cmdContext,\n cmdMovement,\n cmdGrandSalami,\n cmdDailyGoalsTotal,\n cmdDfsPayouts,\n cmdResolutionSummary,\n cmdBookAccuracy,\n cmdGolfRounds,\n cmdInjuries,\n cmdIds,\n cmdLive,\n cmdEv,\n cmdProjections,\n cmdBestLine,\n cmdPlayers,\n cmdPlayerHistory,\n cmdPlayerGames,\n cmdPlayerTrends,\n cmdExportResolvedProps,\n cmdExportOddsHistory,\n cmdHistory,\n cmdClosing,\n cmdClv,\n cmdSgp,\n cmdWebhooksList,\n cmdWebhooksCreate,\n cmdWebhooksDelete,\n cmdWebhooksTest,\n cmdWebhooksDeliveries,\n cmdWebhooksReplay,\n cmdStream,\n} from \"./commands.js\";\n\nexport const VERSION = \"0.45.0\";\n\nconst program = new Command();\n\nprogram\n .name(\"propline\")\n .description(\n \"PropLine CLI — query live odds, scores, +EV plays, prop resolution, and webhooks from the terminal.\",\n )\n .version(VERSION)\n // Global flags. Each command resolves these via its own options object\n // (commander merges parent options into action callbacks for us via\n // .opts({ from: 'parent' }), but easier to just pull from this.parent\n // explicitly to stay strict-typed-friendly).\n .addOption(\n new Option(\"--api-key <key>\", \"PropLine API key\").env(\"PROPLINE_API_KEY\"),\n )\n .addOption(\n new Option(\n \"--base-url <url>\",\n \"API base URL (default https://api.prop-line.com/v1)\",\n ),\n )\n .addOption(\n new Option(\n \"--timeout <seconds>\",\n \"Request timeout in seconds (default 15)\",\n ).argParser((v) => parseInt(v, 10)),\n )\n .addOption(new Option(\"--json\", \"Emit raw JSON instead of a table\"))\n .showHelpAfterError();\n\n// Helper to merge global + command-local options into the flat shape\n// the handlers expect. Keeps each command call site terse.\nfunction gather(cmd: Command): Record<string, unknown> {\n // Walk the WHOLE ancestor chain, not just one level. The global flags\n // (--api-key, --base-url, --timeout, --json) live on `program`, so a\n // one-level lookup only reaches them for top-level commands. Every\n // `webhooks <sub>` command is two levels deep and silently dropped all\n // four: `propline webhooks deliveries 42 --json` printed a table, and\n // `--api-key` on the command line was ignored in favour of the env var.\n // Nothing errored — the flags just did nothing, which is why it survived\n // (found 2026-08-31 while smoke-testing `webhooks replay`).\n //\n // Nearest ancestor wins, so a command-local option can still shadow a\n // global of the same name.\n const chain: Record<string, unknown>[] = [];\n for (let c: Command | null = cmd; c; c = c.parent) {\n chain.unshift(c.opts());\n }\n return Object.assign({}, ...chain) as Record<string, unknown>;\n}\n\n/* ── sports ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"sports\")\n .description(\"List available sports\")\n .action(function (this: Command) {\n return cmdSports(gather(this));\n });\n\n/* ── events ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"events\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .description(\"List upcoming events for a sport\")\n .action(function (this: Command, sport: string) {\n return cmdEvents(sport, gather(this));\n });\n\n/* ── ids ────────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"ids\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .description(\"Event id crosswalk: ESPN, MLB gamePk and each book's own event id (free)\")\n .action(function (this: Command, sport: string) {\n return cmdIds(sport, gather(this));\n });\n\n/* ── odds ───────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"odds\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .argument(\"[event_id]\", \"specific event id (omit for bulk odds)\")\n .option(\n \"-m, --markets <list>\",\n \"comma-separated market keys (e.g. h2h,spreads,totals or player_points)\",\n )\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .option(\n \"--links\",\n \"include each book's public event-page URL (Bovada/DK/FanDuel/BetMGM/Kalshi/Polymarket/Smarkets/ProphetX/Novig)\",\n )\n .option(\n \"--book-ids\",\n \"include each book's own ids (book_event_id per book, book_outcome_id per outcome) for joining onto a book's native feed — Kalshi ships its event + per-contract tickers. Best with --json\",\n )\n .option(\n \"--main-only\",\n \"per-event table: show only each book's main line (hide alternate lines and N+ milestone rungs)\",\n )\n .description(\"Get current odds across all books\")\n .action(function (this: Command, sport: string, eventId: string | undefined) {\n return cmdOdds(sport, eventId, gather(this));\n });\n\n/* ── scores ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"scores\")\n .argument(\"<sport>\", \"sport key\")\n .option(\n \"-d, --days-from <n>\",\n \"days back to include (default 3)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Get game scores and status\")\n .action(function (this: Command, sport: string) {\n return cmdScores(sport, gather(this));\n });\n\n/* ── futures ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"futures\")\n .argument(\"<sport>\", \"sport key\")\n .description(\n \"Season-long futures — championship/division/conference winners, MVP + awards, season win totals across books (free)\",\n )\n .action(function (this: Command, sport: string) {\n return cmdFutures(sport, gather(this));\n });\n\n/* ── context ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"context\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .description(\n \"Game context an event plays under — probable pitchers, lineup, umpire, weather (free)\",\n )\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdContext(sport, eventId, gather(this));\n });\n\n/* ── movement ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"movement\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Line movement + steam detection across books (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdMovement(sport, eventId, gather(this));\n });\n\n/* ── grand-salami ────────────────────────────────────────────────────── */\n\nprogram\n .command(\"grand-salami\")\n .option(\n \"--date <YYYY-MM-DD>\",\n \"UTC date (defaults to today)\",\n )\n .description(\"MLB synthetic Grand Salami — total runs + per-book line\")\n .action(function (this: Command) {\n return cmdGrandSalami(gather(this));\n });\n\n/* ── daily-goals-total ───────────────────────────────────────────────── */\n\nprogram\n .command(\"daily-goals-total\")\n .option(\n \"--date <YYYY-MM-DD>\",\n \"UTC date (defaults to today)\",\n )\n .description(\"NHL synthetic Daily Goals Total — total goals + per-book line\")\n .action(function (this: Command) {\n return cmdDailyGoalsTotal(gather(this));\n });\n\n/* ── resolution-summary ──────────────────────────────────────────────── */\n\nprogram\n .command(\"resolution-summary\")\n .option(\n \"-d, --days <n>\",\n \"look-back window, 1-90 (default 30)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Graded-prop volume + per-sport breakdown (free)\")\n .action(function (this: Command) {\n return cmdResolutionSummary(gather(this));\n });\n\n/* ── book-accuracy ───────────────────────────────────────────────────── */\n\nprogram\n .command(\"book-accuracy\")\n .option(\n \"-d, --days <n>\",\n \"look-back window, 7-120 (default 30)\",\n (v) => parseInt(v, 10),\n )\n .option(\"-s, --sport <key>\", \"limit to one sport key, e.g. baseball_mlb\")\n .description(\"How well each sportsbook prices player props vs the market (free)\")\n .action(function (this: Command) {\n return cmdBookAccuracy(gather(this));\n });\n\n/* ── golf-rounds ─────────────────────────────────────────────────────── */\n\nprogram\n .command(\"golf-rounds <player>\")\n .option(\"-t, --tour <tours>\", \"comma-separated: pga, dp_world, liv, lpga, korn_ferry, champions\")\n .option(\"-n, --limit <n>\", \"rounds to show, 1-200 (default 20)\", (v) => parseInt(v, 10))\n .option(\"--since <date>\", \"only rounds on or after YYYY-MM-DD\")\n .description(\"A golfer's completed rounds by tour + L5/L10/L20 averages (free)\")\n .action(function (this: Command, player: string) {\n return cmdGolfRounds(player, gather(this));\n });\n\n/* ── injuries ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"injuries <sport>\")\n .option(\"-t, --team <team>\", \"team name or abbreviation, e.g. KC\")\n .option(\n \"-s, --status <codes>\",\n \"comma-separated: out, doubtful, questionable, probable, day_to_day, injured_list, suspended, other\",\n )\n .option(\"--history\", \"show status changes instead of the current report\")\n .option(\"-d, --days <n>\", \"with --history: 1-90 days (default 7)\", (v) => parseInt(v, 10))\n .option(\"-p, --player <name>\", \"with --history: filter by player name\")\n .description(\"Injury report for NFL, NCAAF, NBA, WNBA, NHL, MLB (free)\")\n .action(function (this: Command, sport: string) {\n return cmdInjuries(sport, gather(this));\n });\n\n/* ── dfs-payouts ─────────────────────────────────────────────────────── */\n\nprogram\n .command(\"dfs-payouts\")\n .option(\n \"--leg-win-prob <p>\",\n \"assumed per-leg win prob 0-1 (adds expected return + +EV flag)\",\n (v) => parseFloat(v),\n )\n .description(\"PrizePicks Power/Flex payout schedule + per-leg breakeven (free)\")\n .action(function (this: Command) {\n return cmdDfsPayouts(gather(this));\n });\n\n/* ── live ───────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"live\")\n .description(\n \"Show every in-progress game across the major sports (score + period)\",\n )\n .action(function (this: Command) {\n return cmdLive(gather(this));\n });\n\n/* ── ev ─────────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"ev\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel) — price only your books; never changes the fair-line anchor\",\n )\n .option(\n \"--plus\",\n \"show only +EV outcomes (filter rows where ev_pct > 0)\",\n false,\n )\n .option(\n \"--devig <method>\",\n \"de-vig method for the fair line: multiplicative (default) or shin (corrects the favourite-longshot bias on longshot props)\",\n )\n .option(\n \"--fair-source <list>\",\n \"anchor book(s), tried in order per line: pinnacle, polymarket, kalshi, bovada, smarkets (default order when omitted); or 'consensus' alone for the median no-vig line across 3+ fresh books (opt-in, not a proven better anchor)\",\n )\n .option(\n \"--max-age <seconds>\",\n \"drop quoted prices the book has not delivered within this many seconds (the fair line is unaffected)\",\n )\n .description(\"Cross-book +EV against a sharp no-vig fair line (Pro tier)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdEv(sport, eventId, gather(this));\n });\n\n/* ── projections ────────────────────────────────────────────────────── */\n\nprogram\n .command(\"projections\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys\")\n .description(\n \"Market-implied consensus projection per (market, player) — the line where the no-vig P(over) crosses 50%, median across books (Hobby+)\",\n )\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdProjections(sport, eventId, gather(this));\n });\n\n/* ── best-line ──────────────────────────────────────────────────────── */\n\nprogram\n .command(\"best-line\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel) — shop only your books\",\n )\n .option(\n \"--links\",\n \"include each book's public event-page URL per price row (click out to the book)\",\n )\n .description(\n \"Cross-book line shopping: best price per (market, player, line) across all comparable books (Hobby+)\",\n )\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdBestLine(sport, eventId, gather(this) as never);\n });\n\n/* ── history ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"history\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\"--from <iso>\", \"ISO timestamp; only include snapshots at or after\")\n .option(\"--to <iso>\", \"ISO timestamp; only include snapshots at or before\")\n .option(\n \"--relative-from <offset>\",\n \"offset relative to commence_time, e.g. -3h, -30m, -90s\",\n )\n .option(\n \"--relative-to <offset>\",\n \"offset relative to commence_time, e.g. -1m, 0\",\n )\n .option(\n \"--interval <bucket>\",\n \"downsample to one snapshot per bucket: 30s|1m|5m|15m|30m|1h\",\n )\n .option(\"--changes-only\", \"drop snapshots whose (price, point) match the previous one\", false)\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Historical line movement for an event with period filters (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdHistory(sport, eventId, gather(this) as never);\n });\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"clv\")\n .argument(\"<file>\", 'JSON file of placed bets, or \"-\" for stdin')\n .description(\"Grade placed bets against their closing lines — CLV (Hobby+)\")\n .action(function (this: Command, file: string) {\n return cmdClv(file, gather(this) as never);\n });\n\n/* ── sgp ────────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"sgp\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .argument(\n \"<file>\",\n 'JSON file of legs (market, name, description, point, period, team for a team total, or book_outcome_id), or \"-\" for stdin',\n )\n .option(\"-B, --bookmaker <key>\", \"book to price at: fanduel, draftkings, betonlineag, lowvig — or all (every book side by side)\", \"fanduel\")\n .description(\"Price a same-game parlay at the book's own correlated odds (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string, file: string) {\n return cmdSgp(sport, eventId, file, gather(this) as never);\n });\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"closing\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Closing line per (book, market, outcome) — CLV helper (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdClosing(sport, eventId, gather(this) as never);\n });\n\n/* ── players (search) ───────────────────────────────────────────────── */\n\nprogram\n .command(\"players\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<search>\", 'name fragment (e.g. \"judge\")')\n .option(\"-l, --limit <n>\", \"max players (1-100, default 25)\", (v) =>\n parseInt(v, 10),\n )\n .description(\n \"Search players by name — stable player_id + every spelling the books use (free)\",\n )\n .action(function (this: Command, sport: string, search: string) {\n return cmdPlayers(sport, search, gather(this) as never);\n });\n\n/* ── player-history ─────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-history\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name or player_id (quote if it contains spaces — e.g. \"Aaron Judge\" or mlb:592450)')\n .requiredOption(\n \"-m, --market <key>\",\n \"market key (required — e.g. pitcher_strikeouts)\",\n )\n .option(\"-b, --bookmaker <key>\", \"filter to a single book (e.g. draftkings)\")\n .option(\"-l, --limit <n>\", \"max entries (1-100, default 20)\", (v) =>\n parseInt(v, 10),\n )\n .option(\n \"--main-line-only\",\n \"only each book's main line (drops alt-ladder rungs)\",\n )\n .description(\"Recent prop history for a player on a market (Pro full, Free redacted)\")\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerHistory(sport, player, gather(this) as never);\n });\n\n/* ── player-games ───────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-games\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name (quote if it contains spaces — e.g. \"Aaron Judge\") or a player_id (e.g. mlb:592450)')\n .option(\"-l, --limit <n>\", \"games to return (1-100, default 20)\", (v) =>\n parseInt(v, 10),\n )\n .option(\n \"-o, --opponent <team>\",\n 'head-to-head filter — name, nickname or abbreviation (\"BOS\"); the limit applies after it, so this is the last N MEETINGS',\n )\n .option(\n \"--stat-type <names>\",\n \"comma-separated stat names to return (default: all)\",\n )\n .description(\n \"Player game log — recent games with every raw box-score stat per game (free)\",\n )\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerGames(sport, player, gather(this) as never);\n });\n\n/* ── player-trends ──────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-trends\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name or player_id (quote if it contains spaces — e.g. \"Aaron Judge\" or mlb:592450)')\n .option(\n \"-m, --market <key>\",\n \"filter to a single market key (e.g. batter_total_bases)\",\n )\n .option(\n \"--dfs-odds-type <flavor>\",\n \"PrizePicks flavor to compute trends against (standard | goblin | demon)\",\n )\n .description(\n \"Aggregated hit-rate trends per market — L5/L10/L20/L50 over/under splits + current streak (Pro full, Free redacted)\",\n )\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerTrends(sport, player, gather(this) as never);\n });\n\n/* ── export-resolved-props ──────────────────────────────────────────── */\n\nprogram\n .command(\"export-resolved-props\")\n .requiredOption(\"--sport <key>\", \"sport key (required)\")\n .option(\"--market <key>\", \"filter by market key\")\n .option(\"--bookmaker <key>\", \"filter by bookmaker key\")\n .option(\"--since <iso>\", \"ISO datetime lower bound on resolved_at\")\n .option(\"--until <iso>\", \"ISO datetime upper bound on resolved_at\")\n .option(\n \"--out <path>\",\n \"write CSV to this path (default: stream CSV to stdout)\",\n )\n .description(\"Bulk CSV export of resolved props (Pro tier)\")\n .action(function (this: Command) {\n return cmdExportResolvedProps(gather(this) as never);\n });\n\n/* ── export-odds-history ────────────────────────────────────────────── */\n\nprogram\n .command(\"export-odds-history\")\n .requiredOption(\"--sport <key>\", \"sport key (required)\")\n .option(\"--market <key>\", \"filter by market key\")\n .option(\"--bookmaker <key>\", \"filter by bookmaker key\")\n .option(\"--since <iso>\", \"ISO datetime lower bound on recorded_at\")\n .option(\"--until <iso>\", \"ISO datetime upper bound on recorded_at\")\n .option(\n \"--out <path>\",\n \"write CSV to this path (default: stream CSV to stdout)\",\n )\n .description(\n \"Bulk CSV export of the full line-movement tick history (Backfill pass / Enterprise). Large — page month-by-month with --since/--until.\",\n )\n .action(function (this: Command) {\n return cmdExportOddsHistory(gather(this) as never);\n });\n\n/* ── webhooks ───────────────────────────────────────────────────────── */\n\nconst webhooks = program.command(\"webhooks\").description(\"Manage webhook subscriptions (Streaming tier)\");\n\nwebhooks\n .command(\"list\")\n .description(\"List your webhook subscriptions\")\n .action(function (this: Command) {\n return cmdWebhooksList(gather(this));\n });\n\nwebhooks\n .command(\"create\")\n .requiredOption(\"--url <url>\", \"HTTPS endpoint that will receive POSTs\")\n .option(\n \"--events <list>\",\n \"comma-separated event types: line_movement,resolution,steam,market_suspended,ev,line_added,line_pulled (default: all except line_added/line_pulled, which are opt-in)\",\n )\n .option(\"--sport <key>\", \"filter to a single sport\")\n .option(\"--market <key>\", \"filter to a single market key\")\n .option(\"--player <name>\", \"filter to a player name (case-insensitive substring)\")\n .option(\n \"--bookmakers <list>\",\n \"filter to comma-separated book keys, same vocabulary as ?bookmakers= (e.g. draftkings,fanduel); steam events are cross-book and unaffected\",\n )\n .option(\n \"--event-id <id>\",\n \"filter to one event id (numeric)\",\n (v) => parseInt(v, 10),\n )\n .option(\n \"--min-price-change-pct <n>\",\n \"minimum % change in American odds to fire a line_movement\",\n (v) => parseFloat(v),\n )\n .option(\n \"--min-steam-score <n>\",\n \"minimum 0-100 steam score to fire a steam event\",\n (v) => parseFloat(v),\n )\n .option(\n \"--min-books-agreeing <n>\",\n \"market_suspended only: books that must have pulled the same player/market before you hear it (unset = every drop, 3 = late scratches)\",\n (v) => parseInt(v, 10),\n )\n .option(\n \"--min-ev-pct <n>\",\n \"ev events only: minimum EV% (0-100) against the fair line to deliver (default 1)\",\n (v) => parseFloat(v),\n )\n .option(\n \"--max-ev-pct <n>\",\n \"ev events only: maximum EV% to deliver, drops implausibly large edges (default: no cap)\",\n (v) => parseFloat(v),\n )\n .option(\n \"--ev-fair-source <value>\",\n \"ev events only: fair-line anchor, 'consensus' or comma list of pinnacle,polymarket,kalshi,bovada,smarkets (default: the /ev order)\",\n )\n .option(\n \"--batch-max <n>\",\n \"batched delivery: up to N events per POST as a signed envelope (1-500; recommended for high-volume subscriptions; 0 = per-event)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Register a webhook subscription (returns the signing secret ONCE)\")\n .action(function (this: Command) {\n return cmdWebhooksCreate(gather(this) as never);\n });\n\nwebhooks\n .command(\"delete\")\n .argument(\"<id>\", \"webhook id\")\n .description(\"Delete a webhook (cascades its delivery history)\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksDelete(id, gather(this));\n });\n\nwebhooks\n .command(\"test\")\n .argument(\"<id>\", \"webhook id\")\n .description(\"Queue a sample test payload to the webhook URL\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksTest(id, gather(this));\n });\n\nwebhooks\n .command(\"deliveries\")\n .argument(\"<id>\", \"webhook id\")\n .option(\"-l, --limit <n>\", \"max deliveries (default 50, max 200)\", (v) =>\n parseInt(v, 10),\n )\n .option(\n \"--before-id <id>\",\n \"page backwards: smallest id from the previous page\",\n (v) => parseInt(v, 10),\n )\n .description(\"Show recent delivery attempts for a webhook (newest first)\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksDeliveries(id, gather(this) as never);\n });\n\nwebhooks\n .command(\"replay\")\n .argument(\"<id>\", \"webhook id\")\n .option(\n \"--since-seq <n>\",\n \"read events after this X-PropLine-Sequence (default 0)\",\n (v) => parseInt(v, 10),\n )\n .option(\"-l, --limit <n>\", \"max events per page (default 100, max 500)\", (v) =>\n parseInt(v, 10),\n )\n .option(\"--all\", \"follow the cursor to the end of the retained window\")\n .description(\"Re-read missed webhook events from a cursor (oldest first)\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksReplay(id, gather(this) as never);\n });\n\nprogram\n .command(\"stream\")\n .argument(\"<webhook-id>\", \"websocket subscription id (transport=websocket)\")\n .option(\n \"--since-seq <n>\",\n \"resume from this sequence (default 0 = oldest retained)\",\n (v) => parseInt(v, 10),\n )\n .option(\"--once\", \"do not reconnect; exit when the socket closes\")\n .description(\"Stream a websocket subscription to stdout (line-delimited JSON with --json)\")\n .action(function (this: Command, id: string) {\n return cmdStream(id, gather(this) as never);\n });\n\nprogram.parseAsync().catch((err) => {\n process.stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\\n`);\n // Structured API errors carry the exact URL that unlocks the feature\n // or lifts the cap — surface it instead of making the user hunt.\n const upgradeUrl = (err as { upgradeUrl?: unknown })?.upgradeUrl;\n if (typeof upgradeUrl === \"string\" && upgradeUrl) {\n process.stderr.write(`upgrade: ${upgradeUrl}\\n`);\n }\n process.exit(1);\n});\n","// Per-command handlers. Each one builds a PropLine client, calls the\n// SDK, and pretty-prints the result via format.ts (or dumps raw JSON\n// when --json is passed). Commands stay independent — no shared\n// per-call state — so future ones can be added without touching the\n// existing surface.\n\nimport { readFile } from \"node:fs/promises\";\nimport type { PropLine, PlayerMarketTrend, HitRateSplit } from \"propline\";\nimport { buildClient, runCommand, type ClientFlags } from \"./client.js\";\nimport {\n printJson,\n printTable,\n formatPrice,\n formatPoint,\n formatTime,\n truncate,\n type Column,\n} from \"./format.js\";\n\ninterface CommonFlags extends ClientFlags {\n json?: boolean;\n}\n\n/* ── sports ─────────────────────────────────────────────────────────── */\n\nexport function cmdSports(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const sports = await client.getSports();\n if (flags.json) return printJson(sports);\n const cols: Column<(typeof sports)[number]>[] = [\n { label: \"KEY\", value: (r) => r.key },\n { label: \"TITLE\", value: (r) => r.title },\n { label: \"ACTIVE\", value: (r) => (r.active ? \"yes\" : \"no\") },\n ];\n printTable(sports, cols);\n });\n}\n\n/* ── events ─────────────────────────────────────────────────────────── */\n\nexport function cmdEvents(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = await client.getEvents(sport);\n if (flags.json) return printJson(events);\n const cols: Column<(typeof events)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"AWAY\", value: (r) => r.away_team },\n { label: \"HOME\", value: (r) => r.home_team },\n { label: \"COMMENCES\", value: (r) => formatTime(r.commence_time) },\n ];\n printTable(events, cols);\n });\n}\n\n/* ── ids (event id crosswalk) ────────────────────────────────────────── */\n\nexport function cmdIds(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = await client.getEventIds(sport);\n if (flags.json) return printJson(events);\n const cols: Column<(typeof events)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"START\", value: (r) => formatTime(r.commence_time) },\n { label: \"MATCHUP\", value: (r) => `${r.away_team} @ ${r.home_team}` },\n { label: \"BOOKS\", value: (r) => String(Object.keys(r.books ?? {}).length), numeric: true },\n ];\n printTable(events, cols);\n });\n}\n\n/* ── odds (bulk and single-event) ───────────────────────────────────── */\n\nexport function cmdOdds(\n sport: string,\n eventId: string | undefined,\n flags: CommonFlags & {\n markets?: string;\n bookmakers?: string;\n period?: string;\n links?: boolean;\n bookIds?: boolean;\n mainOnly?: boolean;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const period = flags.period;\n const bookmakers = flags.bookmakers;\n const includeLinks = flags.links;\n const includeBookIds = flags.bookIds;\n\n if (eventId) {\n const resp = await client.getOdds(sport, {\n eventId,\n markets,\n period,\n bookmakers,\n includeLinks,\n includeBookIds,\n });\n if (flags.json) return printJson(resp);\n printOddsResponse(resp, flags.mainOnly === true);\n printEventLinks(resp.bookmakers);\n return;\n }\n\n const resp = await client.getOdds(sport, {\n markets,\n period,\n bookmakers,\n includeLinks,\n includeBookIds,\n });\n if (flags.json) return printJson(resp);\n // Bulk: one row per (event, book, market, outcome) gets dense fast.\n // Collapse to a per-event summary row showing how many books / markets\n // each event has, so the user sees the slate at a glance.\n type Row = {\n id: string;\n teams: string;\n commence: string;\n books: number;\n markets: number;\n };\n const rows: Row[] = resp.map((ev) => {\n const books = ev.bookmakers ?? [];\n const markets = books.reduce((sum, b) => sum + (b.markets?.length ?? 0), 0);\n return {\n id: String(ev.id),\n teams: `${ev.away_team} @ ${ev.home_team}`,\n commence: formatTime(ev.commence_time),\n books: books.length,\n markets,\n };\n });\n const cols: Column<Row>[] = [\n { label: \"ID\", value: (r) => r.id },\n { label: \"MATCHUP\", value: (r) => r.teams },\n { label: \"COMMENCES\", value: (r) => r.commence },\n { label: \"BOOKS\", value: (r) => String(r.books), numeric: true },\n { label: \"MARKETS\", value: (r) => String(r.markets), numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\ninterface OddsResponseLike {\n id: number | string;\n home_team: string;\n away_team: string;\n bookmakers?: Array<{\n key: string;\n title: string;\n /**\n * True when the event is LIVE and this book does not price it in\n * play — its prices are the last pregame quote and will not move\n * again this game.\n */\n pregame_only?: boolean;\n markets?: Array<{\n key: string;\n /** Canonical team name on a team total; null on a game market. */\n team?: string | null;\n /** \"main\" | \"alternate\" | \"milestone\". */\n line_type?: string | null;\n outcomes?: Array<{\n /** Per-outcome override (Kalshi / Polymarket US rows). */\n line_type?: string | null;\n name: string;\n description?: string | null;\n price: number;\n point?: number | null;\n payout_multiplier?: number | null;\n }>;\n }>;\n }>;\n}\n\nfunction printEventLinks(\n bookmakers: Array<{\n key: string;\n title: string;\n link?: string | null;\n app_link?: string | null;\n }>,\n): void {\n const linked = bookmakers.filter((b) => b.link || b.app_link);\n if (!linked.length) return;\n process.stdout.write(\"\\nEvent pages:\\n\");\n for (const b of linked) {\n if (b.link) process.stdout.write(` ${b.title}: ${b.link}\\n`);\n // Mobile app-open deep link (ProphetX only today) — shown when present.\n if (b.app_link) process.stdout.write(` ${b.title} (app): ${b.app_link}\\n`);\n }\n}\n\nconst LINE_TYPE_LABEL: Record<string, string> = {\n main: \"main\",\n alternate: \"alt\",\n milestone: \"N+\",\n};\n\nfunction printOddsResponse(resp: OddsResponseLike, mainOnly = false): void {\n // Per-event detail view: one row per (book, market, outcome). Same\n // shape as `propline odds <sport> <event> --json` but flattened so the\n // table reads top-to-bottom by book → market → outcome.\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n point: string;\n price: string;\n mult: string;\n type: string;\n };\n const rows: Row[] = [];\n let anyType = false;\n let anyMult = false;\n let anyFrozen = false;\n for (const book of resp.bookmakers ?? []) {\n // The event is live and this book does not price it in play: its\n // prices are the last PREGAME quote and will not move again this\n // game. Marked rather than hidden — on the DFS books that frozen\n // line is the number the bet settles against — but showing it\n // unmarked next to books quoting seconds ago is the misleading part.\n const frozen = book.pregame_only === true;\n if (frozen) anyFrozen = true;\n for (const market of book.markets ?? []) {\n for (const o of market.outcomes ?? []) {\n // An outcome's own line_type overrides its market's on the books\n // that put every player on one row (Kalshi / Polymarket US).\n const lineType = o.line_type ?? market.line_type ?? null;\n if (mainOnly && lineType && lineType !== \"main\") continue;\n if (lineType) anyType = true;\n const m = o.payout_multiplier;\n if (m !== null && m !== undefined) anyMult = true;\n rows.push({\n book: frozen ? `${book.title} *` : book.title,\n // A team total and the game total both ride the `totals` key and\n // differ only by point, which reads as one market mispriced.\n // `team` is the API's own answer for which side it is scoped to\n // (null on a game market), so surface it in the label.\n market: market.team\n ? `${market.key} (${market.team})`\n : market.key,\n player: o.description ?? \"\",\n side: o.name,\n point: formatPoint(o.point ?? null),\n price: formatPrice(o.price),\n mult: m !== null && m !== undefined ? `${m}x` : \"\",\n type: lineType ? (LINE_TYPE_LABEL[lineType] ?? lineType) : \"\",\n });\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no markets returned — try --markets h2h,spreads,totals or the desired prop key)\\n`,\n );\n return;\n }\n const header = `${resp.away_team} @ ${resp.home_team} (event ${resp.id})\\n`;\n process.stdout.write(header);\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 28) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n // main / alt / N+ (milestone rung) — from the API's line_type field.\n if (anyType) cols.push({ label: \"TYPE\", value: (r) => r.type });\n // DFS boost/discount column — only shown when a book (Underdog) actually\n // returns a multiplier, so standard sportsbook output stays unchanged.\n if (anyMult) {\n cols.push({ label: \"MULT\", value: (r) => r.mult, numeric: true });\n }\n printTable(rows, cols);\n if (anyFrozen) {\n process.stdout.write(\n `\\n* pregame price — this game is live and these books do not price it\\n` +\n ` in play, so these lines are frozen and will not move again.\\n`,\n );\n }\n}\n\n/* ── scores ─────────────────────────────────────────────────────────── */\n\nexport function cmdScores(\n sport: string,\n flags: CommonFlags & { daysFrom?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const scores = await client.getScores(sport, { daysFrom: flags.daysFrom });\n if (flags.json) return printJson(scores);\n const cols: Column<(typeof scores)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"STATUS\", value: (r) => String(r.status) },\n { label: \"AWAY\", value: (r) => r.away_team },\n {\n label: \"AS\",\n value: (r) => (r.away_score === null ? \"\" : String(r.away_score)),\n numeric: true,\n },\n { label: \"HOME\", value: (r) => r.home_team },\n {\n label: \"HS\",\n value: (r) => (r.home_score === null ? \"\" : String(r.home_score)),\n numeric: true,\n },\n { label: \"COMMENCED\", value: (r) => formatTime(r.commence_time) },\n ];\n printTable(scores, cols);\n });\n}\n\n/* ── futures ────────────────────────────────────────────────────────── */\n\nexport function cmdFutures(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const futures = await client.getFutures(sport);\n if (flags.json) return printJson(futures);\n\n // One row per (futures market, book). The favorite is the\n // shortest-priced outcome (lowest American number = most favored).\n interface Row {\n title: string;\n market: string;\n book: string;\n outcomes: number;\n favorite: string;\n }\n const rows: Row[] = [];\n for (const ev of futures) {\n for (const m of ev.markets) {\n const priced = m.outcomes.filter((o) => o.price !== null);\n const fav = priced.reduce<(typeof priced)[number] | null>(\n (best, o) =>\n best === null || (o.price as number) < (best.price as number)\n ? o\n : best,\n null,\n );\n rows.push({\n title: ev.title,\n market: m.description,\n book: m.bookmaker_title || m.bookmaker,\n outcomes: m.outcomes.length,\n favorite: fav ? `${fav.name} ${formatPrice(fav.price)}` : \"—\",\n });\n }\n }\n const cols: Column<Row>[] = [\n { label: \"FUTURE\", value: (r) => truncate(r.title, 32) },\n { label: \"MARKET\", value: (r) => truncate(r.market, 30) },\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"N\", value: (r) => String(r.outcomes), numeric: true },\n { label: \"FAVORITE\", value: (r) => r.favorite },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── context ─────────────────────────────────────────────────────────── */\n\n/** \"Paul Skenes (R)\" — append the throwing hand when present. `hand` is typed\n * loosely so this works whether or not the installed SDK models the field. */\nfunction fmtPitcher(name: string | null, hand: unknown): string {\n if (!name) return \"—\";\n return typeof hand === \"string\" && hand ? `${name} (${hand})` : name;\n}\n\nexport function cmdContext(\n sport: string,\n eventId: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const ctx = await client.getContext(sport, eventId);\n if (flags.json) return printJson(ctx);\n\n const roof = ctx.roof_type ? ` (${ctx.roof_type})` : \"\";\n process.stdout.write(\n `${ctx.away_team} @ ${ctx.home_team}\\n` +\n `${ctx.venue ?? \"venue TBD\"}${roof} · ${formatTime(ctx.commence_time)}\\n\\n` +\n `Probable pitchers : ${fmtPitcher(ctx.away_probable_pitcher, ctx.away_probable_pitcher_hand)} (away) vs ` +\n `${fmtPitcher(ctx.home_probable_pitcher, ctx.home_probable_pitcher_hand)} (home)\\n` +\n `Lineup confirmed : ${ctx.lineup_confirmed ? \"yes\" : \"no\"}\\n` +\n `Home-plate umpire : ${ctx.home_plate_umpire ?? \"—\"}\\n`,\n );\n const w = ctx.weather;\n if (ctx.is_indoor) {\n process.stdout.write(`Weather : indoor / climate-controlled\\n`);\n } else if (w) {\n const parts = [\n w.temperature_f === null ? null : `${w.temperature_f}°F`,\n w.wind_speed_mph === null\n ? null\n : `wind ${w.wind_speed_mph}mph ${w.wind_direction ?? \"\"}`.trim(),\n w.precip_probability_pct === null\n ? null\n : `precip ${w.precip_probability_pct}%`,\n w.conditions ?? null,\n ].filter(Boolean);\n process.stdout.write(`Weather : ${parts.join(\" · \")}\\n`);\n } else {\n process.stdout.write(`Weather : —\\n`);\n }\n });\n}\n\n/* ── movement ────────────────────────────────────────────────────────── */\n\nexport function cmdMovement(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; bookmakers?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const mv = await client.getMovement(sport, eventId, {\n markets: flags.markets ? flags.markets.split(\",\") : undefined,\n bookmakers: flags.bookmakers,\n period: flags.period,\n });\n if (flags.json) return printJson(mv);\n\n process.stdout.write(\n `${mv.away_team} @ ${mv.home_team} — line movement & steam\\n` +\n `${mv.bookmakers.length} books\\n\\n`,\n );\n if (!mv.steam.length) {\n process.stdout.write(\"No steam moves detected.\\n\");\n return;\n }\n const cols: Column<(typeof mv.steam)[number]>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n {\n label: \"OUTCOME\",\n value: (r) => (r.description ? `${r.name} (${r.description})` : r.name),\n },\n { label: \"DIR\", value: (r) => r.consensus_direction },\n {\n label: \"BOOKS\",\n value: (r) => `${r.books_moved}/${r.books_quoting}`,\n numeric: true,\n },\n { label: \"SCORE\", value: (r) => r.steam_score.toFixed(1), numeric: true },\n {\n label: \"PROBΔ\",\n value: (r) => `${(r.avg_prob_shift * 100).toFixed(1)}%`,\n numeric: true,\n },\n ];\n printTable(mv.steam, cols);\n });\n}\n\n/* ── grand-salami ────────────────────────────────────────────────────── */\n\nexport function cmdGrandSalami(\n flags: CommonFlags & { date?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const gs = await client.getMlbGrandSalami({ date: flags.date });\n if (flags.json) return printJson(gs);\n process.stdout.write(\n `MLB Grand Salami — ${gs.date} (US Eastern)\\n` +\n `${gs.games_total} games · ${gs.games_completed} final · ` +\n `${gs.games_in_progress} live · ${gs.games_upcoming} upcoming\\n` +\n (gs.actual_total_runs === null\n ? `Actual total: pending\\n\\n`\n : `Actual total: ${gs.actual_total_runs} runs\\n\\n`),\n );\n const cols: Column<(typeof gs.bookmakers)[number]>[] = [\n { label: \"BOOK\", value: (r) => r.title },\n { label: \"GAMES\", value: (r) => String(r.games_priced), numeric: true },\n { label: \"LINE\", value: (r) => r.line.toFixed(1), numeric: true },\n { label: \"RESULT\", value: (r) => r.result ?? \"\" },\n ];\n printTable(gs.bookmakers, cols);\n });\n}\n\n/* ── daily-goals-total ───────────────────────────────────────────────── */\n\nexport function cmdDailyGoalsTotal(\n flags: CommonFlags & { date?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const dgt = await client.getNhlDailyGoalsTotal({ date: flags.date });\n if (flags.json) return printJson(dgt);\n process.stdout.write(\n `NHL Daily Goals Total — ${dgt.date} (US Eastern)\\n` +\n `${dgt.games_total} games · ${dgt.games_completed} final · ` +\n `${dgt.games_in_progress} live · ${dgt.games_upcoming} upcoming\\n` +\n (dgt.actual_total_goals === null\n ? `Actual total: pending\\n\\n`\n : `Actual total: ${dgt.actual_total_goals} goals\\n\\n`),\n );\n const cols: Column<(typeof dgt.bookmakers)[number]>[] = [\n { label: \"BOOK\", value: (r) => r.title },\n { label: \"GAMES\", value: (r) => String(r.games_priced), numeric: true },\n { label: \"LINE\", value: (r) => r.line.toFixed(1), numeric: true },\n { label: \"RESULT\", value: (r) => r.result ?? \"\" },\n ];\n printTable(dgt.bookmakers, cols);\n });\n}\n\n/* ── resolution-summary ──────────────────────────────────────────────── */\n\nexport function cmdResolutionSummary(\n flags: CommonFlags & { days?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const s = await client.getResolutionSummary(flags.days ?? 30);\n if (flags.json) return printJson(s);\n process.stdout.write(\n `${s.total_graded.toLocaleString()} props graded ` +\n `(${s.total_settled.toLocaleString()} settled) across ` +\n `${s.sports_covered} sports / ${s.events_graded.toLocaleString()} ` +\n `games — last ${s.days}d\\n\\n`,\n );\n const cols: Column<(typeof s.by_sport)[number]>[] = [\n { label: \"SPORT\", value: (r) => r.title },\n { label: \"KEY\", value: (r) => r.sport_key },\n { label: \"GRADED\", value: (r) => r.graded.toLocaleString(), numeric: true },\n { label: \"GAMES\", value: (r) => String(r.events), numeric: true },\n ];\n printTable(s.by_sport, cols);\n });\n}\n\n/* ── book-accuracy ───────────────────────────────────────────────────── */\n\nexport function cmdBookAccuracy(\n flags: CommonFlags & { days?: number; sport?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const r = await client.getBookAccuracy({ days: flags.days, sport: flags.sport });\n if (flags.json) return printJson(r);\n process.stdout.write(\n `Sportsbook prop-pricing accuracy — ${r.total_props.toLocaleString()} props, ` +\n `last ${r.days}d${r.sport ? ` (${r.sport})` : \"\"}\\n` +\n `skill_bp > 0 = closer to the result than the market average. ` +\n `A pricing report, not a betting edge.\\n\\n`,\n );\n const rows = [...r.books]\n .sort((a, b) => b.skill_bp - a.skill_bp)\n .map((b, i) => ({ ...b, rank: i + 1 }));\n const cols: Column<(typeof rows)[number]>[] = [\n { label: \"#\", value: (b) => String(b.rank), numeric: true },\n { label: \"BOOK\", value: (b) => b.title },\n {\n label: \"SKILL_BP\",\n value: (b) => `${b.skill_bp > 0 ? \"+\" : \"\"}${b.skill_bp.toFixed(1)}`,\n numeric: true,\n },\n { label: \"VERDICT\", value: (b) => b.verdict },\n { label: \"MARGIN%\", value: (b) => b.margin_pct.toFixed(2), numeric: true },\n { label: \"PROPS\", value: (b) => b.props.toLocaleString(), numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── golf-rounds ─────────────────────────────────────────────────────── */\n\nexport function cmdGolfRounds(\n player: string,\n flags: CommonFlags & { tour?: string; limit?: number; since?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const r = await client.getGolfRounds(player, {\n tour: flags.tour,\n limit: flags.limit,\n since: flags.since,\n });\n if (flags.json) return printJson(r);\n const fmt = (v: number | null) => (v === null ? \"-\" : String(v));\n const s = r.summary;\n process.stdout.write(\n `${r.player_name} — ${r.tours.join(\", \")}\\n` +\n `L5 ${fmt(s.last_5.avg_strokes)} (${fmt(s.last_5.avg_to_par)}) ` +\n `L10 ${fmt(s.last_10.avg_strokes)} (${fmt(s.last_10.avg_to_par)}) ` +\n `L20 ${fmt(s.last_20.avg_strokes)} (${fmt(s.last_20.avg_to_par)})\\n\\n`,\n );\n const cols: Column<(typeof r.rounds)[number]>[] = [\n { label: \"DATE\", value: (x) => x.round_date },\n { label: \"TOUR\", value: (x) => x.tour },\n { label: \"TOURNAMENT\", value: (x) => x.tournament },\n { label: \"RD\", value: (x) => String(x.round), numeric: true },\n { label: \"STROKES\", value: (x) => String(x.strokes), numeric: true },\n { label: \"TO_PAR\", value: (x) => fmt(x.to_par), numeric: true },\n { label: \"BIRDIES\", value: (x) => fmt(x.birdies), numeric: true },\n { label: \"BOGEYS\", value: (x) => fmt(x.bogeys), numeric: true },\n ];\n printTable(r.rounds, cols);\n });\n}\n\n/* ── injuries ────────────────────────────────────────────────────────── */\n\nexport function cmdInjuries(\n sport: string,\n flags: CommonFlags & {\n team?: string;\n status?: string;\n history?: boolean;\n days?: number;\n player?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.history) {\n const h = await client.getInjuryHistory(sport, {\n days: flags.days,\n player: flags.player,\n });\n if (flags.json) return printJson(h);\n process.stdout.write(\n `${h.sport} — ${h.count} status changes, last ${h.days} days` +\n (h.truncated ? \" (truncated)\" : \"\") +\n `\\n\\n`,\n );\n const cols: Column<(typeof h.changes)[number]>[] = [\n { label: \"WHEN\", value: (c) => formatTime(c.changed_at) },\n { label: \"PLAYER\", value: (c) => c.player_name },\n { label: \"TEAM\", value: (c) => c.team ?? \"-\" },\n { label: \"FROM\", value: (c) => c.old_status ?? \"-\" },\n { label: \"TO\", value: (c) => c.new_status ?? \"off report\" },\n ];\n printTable(h.changes, cols);\n return;\n }\n const r = await client.getInjuries(sport, { team: flags.team, status: flags.status });\n if (flags.json) return printJson(r);\n process.stdout.write(`${r.sport} — ${r.count} players on the injury report\\n\\n`);\n const cols: Column<(typeof r.players)[number]>[] = [\n { label: \"TEAM\", value: (p) => p.team_abbr ?? p.team ?? \"-\" },\n { label: \"PLAYER\", value: (p) => p.player_name },\n { label: \"POS\", value: (p) => p.position ?? \"-\" },\n { label: \"STATUS\", value: (p) => p.status },\n { label: \"INJURY\", value: (p) => [p.side, p.body_part, p.injury_type].filter(Boolean).join(\" \") || \"-\" },\n { label: \"RETURN\", value: (p) => p.expected_return ?? \"-\" },\n { label: \"SINCE\", value: (p) => formatTime(p.status_since) },\n ];\n printTable(r.players, cols);\n });\n}\n\n/* ── dfs-payouts ─────────────────────────────────────────────────────── */\n\nexport function cmdDfsPayouts(\n flags: CommonFlags & { legWinProb?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const t = await client.getDfsPayouts({ legWinProb: flags.legWinProb });\n if (flags.json) return printJson(t);\n const withEv = flags.legWinProb !== undefined;\n process.stdout.write(\n `PrizePicks payout schedule + per-leg breakeven` +\n (withEv ? ` @ ${(flags.legWinProb! * 100).toFixed(0)}% per leg` : \"\") +\n `\\n\\n`,\n );\n const cols: Column<(typeof t.plays)[number]>[] = [\n { label: \"PLAY\", value: (r) => r.play_type },\n { label: \"LEGS\", value: (r) => String(r.legs), numeric: true },\n {\n label: \"ALL-HIT\",\n value: (r) => `${r.all_correct_multiplier.toFixed(2)}x`,\n numeric: true,\n },\n {\n label: \"BREAKEVEN\",\n value: (r) => `${(r.breakeven_leg_win_prob * 100).toFixed(1)}%`,\n numeric: true,\n },\n ];\n if (withEv) {\n cols.push(\n {\n label: \"EV/$1\",\n value: (r) => (r.expected_return ?? 0).toFixed(3),\n numeric: true,\n },\n { label: \"+EV?\", value: (r) => (r.is_plus_ev ? \"yes\" : \"no\") },\n );\n }\n printTable(t.plays, cols);\n process.stdout.write(`\\n${t.disclaimer}\\n`);\n });\n}\n\n/* ── live (cross-sport in-progress games) ────────────────────────────── */\n\nconst LIVE_SPORTS = [\n \"baseball_mlb\",\n \"basketball_nba\",\n \"hockey_nhl\",\n \"basketball_ncaab\",\n \"football_nfl\",\n \"football_ncaaf\",\n \"soccer_epl\",\n \"soccer_la_liga\",\n \"soccer_serie_a\",\n \"soccer_bundesliga\",\n \"soccer_ligue_1\",\n \"soccer_mls\",\n \"tennis\",\n \"golf\",\n \"mma_ufc\",\n];\n\nexport function cmdLive(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n // Hit /scores per sport in parallel and keep only `in_progress` rows.\n // Tolerates per-sport failure so one 404 doesn't abort the whole\n // command — the CLI is meant for casual terminal use, not strict\n // pipelines.\n type LiveRow = {\n sport: string;\n id: string;\n teams: string;\n score: string;\n period: string;\n };\n const settled = await Promise.allSettled(\n LIVE_SPORTS.map(async (sportKey): Promise<LiveRow[]> => {\n const scores = await client.getScores(sportKey, { daysFrom: 1 });\n return scores\n .filter((sc) => sc.status === \"in_progress\")\n .map((sc) => ({\n sport: sportKey,\n id: String(sc.id),\n teams: `${sc.away_team} @ ${sc.home_team}`,\n score:\n sc.home_score !== null && sc.away_score !== null\n ? `${sc.away_score}-${sc.home_score}`\n : \"\",\n period: typeof sc.period === \"string\" ? sc.period : \"\",\n }));\n }),\n );\n const rows: LiveRow[] = [];\n for (const r of settled) {\n if (r.status !== \"fulfilled\") continue;\n rows.push(...r.value);\n }\n if (flags.json) return printJson(rows);\n if (rows.length === 0) {\n process.stdout.write(\"(no games in progress right now)\\n\");\n return;\n }\n const cols: Column<LiveRow>[] = [\n { label: \"SPORT\", value: (r) => r.sport },\n { label: \"ID\", value: (r) => r.id },\n { label: \"MATCHUP\", value: (r) => r.teams },\n { label: \"SCORE\", value: (r) => r.score },\n { label: \"PERIOD\", value: (r) => r.period },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── ev (cross-book +EV) ────────────────────────────────────────────── */\n\nexport function cmdEv(\n sport: string,\n eventId: string,\n flags: CommonFlags & {\n markets?: string;\n bookmakers?: string;\n plus?: boolean;\n devig?: string;\n fairSource?: string;\n maxAge?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.devig && flags.devig !== \"multiplicative\" && flags.devig !== \"shin\") {\n throw new Error(`--devig must be 'multiplicative' or 'shin' (got '${flags.devig}')`);\n }\n let maxAge: number | undefined;\n if (flags.maxAge !== undefined) {\n maxAge = Number(flags.maxAge);\n if (!Number.isInteger(maxAge) || maxAge < 0) {\n throw new Error(`--max-age must be a whole number of seconds >= 0 (got '${flags.maxAge}')`);\n }\n }\n const resp = await client.getEventEv(sport, eventId, {\n markets: parseMarketsFlag(flags.markets),\n // Narrows the prices, never the anchor: --bookmakers draftkings\n // still measures DK against Pinnacle.\n bookmakers: flags.bookmakers,\n devig: flags.devig as \"multiplicative\" | \"shin\" | undefined,\n fairSource: flags.fairSource,\n maxAge,\n });\n if (flags.json) return printJson(resp);\n type Row = {\n market: string;\n player: string;\n point: string;\n side: string;\n book: string;\n price: string;\n ev: string;\n plus: boolean;\n };\n const rows: Row[] = [];\n for (const line of resp.lines) {\n for (const o of line.outcomes) {\n rows.push({\n market: line.market_key,\n player: line.description,\n point: formatPoint(line.point),\n side: o.name,\n book: o.book_title,\n price: formatPrice(o.price),\n ev: `${o.ev_pct >= 0 ? \"+\" : \"\"}${o.ev_pct.toFixed(2)}%`,\n plus: o.is_plus_ev,\n });\n }\n }\n const filtered = flags.plus ? rows.filter((r) => r.plus) : rows;\n // Sort +EV first regardless of filter — the most-actionable rows\n // should land at the top of the terminal, not the bottom.\n filtered.sort((a, b) => parseFloat(b.ev) - parseFloat(a.ev));\n process.stdout.write(\n `${resp.away_team} @ ${resp.home_team} · fair anchor: ${resp.fair_source_default}\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n { label: \"EV%\", value: (r) => r.ev, numeric: true },\n ];\n printTable(filtered, cols);\n });\n}\n\n/* ── projections ────────────────────────────────────────────────────── */\n\nexport function cmdProjections(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getEventProjections(sport, eventId, {\n markets: parseMarketsFlag(flags.markets),\n });\n if (flags.json) return printJson(resp);\n type Row = {\n market: string;\n player: string;\n value: string;\n prob: string;\n books: string;\n };\n const rows: Row[] = resp.projections.map((r) => ({\n market: r.market_key,\n player: r.player,\n value: r.projected_value == null ? \"—\" : String(r.projected_value),\n prob:\n r.consensus_over_prob == null\n ? \"—\"\n : `${(r.consensus_over_prob * 100).toFixed(1)}%`,\n books: String(r.books_contributing),\n }));\n process.stdout.write(\n `${resp.away_team} @ ${resp.home_team} · market-implied (not a forecast)\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"PROJECTED\", value: (r) => r.value, numeric: true },\n { label: \"P(OVER)\", value: (r) => r.prob, numeric: true },\n { label: \"BOOKS\", value: (r) => r.books, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── best-line ──────────────────────────────────────────────────────── */\n\nexport function cmdBestLine(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; bookmakers?: string; links?: boolean },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getEventBestLine(sport, eventId, {\n markets: parseMarketsFlag(flags.markets),\n bookmakers: flags.bookmakers,\n includeLinks: flags.links,\n });\n if (flags.json) return printJson(resp);\n type Row = {\n market: string;\n player: string;\n point: string;\n side: string;\n book: string;\n price: string;\n books: string;\n };\n const rows: Row[] = [];\n for (const line of resp.lines) {\n for (const [side, info] of Object.entries(line.sides)) {\n rows.push({\n market: line.market_key,\n player: line.description,\n point: formatPoint(line.point),\n side,\n book: info.best.book_title,\n price: formatPrice(info.best.price),\n books: String(info.all_prices.length),\n });\n }\n }\n process.stdout.write(\n `${resp.away_team} @ ${resp.home_team} · books considered: ${resp.books_considered.join(\", \")}\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"BEST BOOK\", value: (r) => r.book },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n { label: \"N BOOKS\", value: (r) => r.books, numeric: true },\n ];\n printTable(rows, cols);\n if (flags.links) {\n const links = new Map<string, string>();\n const appLinks = new Map<string, string>();\n for (const line of resp.lines) {\n for (const info of Object.values(line.sides)) {\n for (const price of info.all_prices) {\n const p = price as {\n link?: string | null;\n app_link?: string | null;\n };\n if (p.link) links.set(price.book_title, p.link);\n // Mobile app-open deep link (ProphetX only today).\n if (p.app_link) appLinks.set(price.book_title, p.app_link);\n }\n }\n }\n if (links.size || appLinks.size) {\n process.stdout.write(\"\\nEvent pages:\\n\");\n for (const [title, link] of links) {\n process.stdout.write(` ${title}: ${link}\\n`);\n }\n for (const [title, link] of appLinks) {\n process.stdout.write(` ${title} (app): ${link}\\n`);\n }\n }\n }\n });\n}\n\n/* ── players (search) ───────────────────────────────────────────────── */\n\nexport function cmdPlayers(\n sport: string,\n search: string,\n flags: CommonFlags & { limit?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.searchPlayers(sport, search, {\n limit: flags.limit,\n });\n if (flags.json) return printJson(resp);\n process.stdout.write(\n `${resp.sport_key} · \"${resp.search}\" (${resp.players.length} players)\\n`,\n );\n type Player = (typeof resp.players)[number];\n const cols: Column<Player>[] = [\n { label: \"PLAYER_ID\", value: (r) => r.player_id },\n { label: \"NAME\", value: (r) => r.name },\n { label: \"KNOWN_NAMES\", value: (r) => r.known_names.join(\", \") },\n ];\n printTable(resp.players, cols);\n });\n}\n\n/* ── player-history ─────────────────────────────────────────────────── */\n\nexport function cmdPlayerHistory(\n sport: string,\n player: string,\n flags: CommonFlags & {\n market: string;\n bookmaker?: string;\n limit?: number;\n mainLineOnly?: boolean;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerHistory(sport, player, {\n market: flags.market,\n bookmaker: flags.bookmaker,\n limit: flags.limit,\n mainLineOnly: flags.mainLineOnly,\n });\n if (flags.json) return printJson(resp);\n const pid = resp.player_id ? ` [${resp.player_id}]` : \"\";\n process.stdout.write(\n `${resp.player_name}${pid} · ${resp.market} (${resp.entries.length} entries)\\n`,\n );\n type Entry = (typeof resp.entries)[number];\n const cols: Column<Entry>[] = [\n { label: \"DATE\", value: (r) => formatTime(r.commence_time).slice(0, 10) },\n { label: \"MATCHUP\", value: (r) => `${r.away_team} @ ${r.home_team}` },\n { label: \"BOOK\", value: (r) => r.bookmaker_title },\n {\n label: \"LINE\",\n value: (r) => formatPoint(r.line),\n numeric: true,\n },\n {\n // \"M\" = the book's main line; blank = an alt-ladder rung.\n // \"*\" = the book moved this line after the game started.\n label: \"MAIN\",\n value: (r) =>\n `${r.is_main_line ? \"M\" : \"\"}${r.line_moved_in_play ? \"*\" : \"\"}`,\n },\n { label: \"OVER\", value: (r) => formatPrice(r.over_price), numeric: true },\n {\n label: \"UNDER\",\n value: (r) => formatPrice(r.under_price),\n numeric: true,\n },\n {\n label: \"ACTUAL\",\n value: (r) => (r.actual_value === null ? \"\" : String(r.actual_value)),\n numeric: true,\n },\n {\n label: \"RESULT\",\n value: (r) => {\n if (r.over_result === \"won\") return \"OVER ✓\";\n if (r.under_result === \"won\") return \"UNDER ✓\";\n if (r.over_result === \"push\" || r.under_result === \"push\") return \"PUSH\";\n if (r.over_result === \"void\" || r.under_result === \"void\") return \"VOID\";\n return \"\";\n },\n },\n ];\n printTable(resp.entries, cols);\n });\n}\n\n/* ── player-games ───────────────────────────────────────────────────── */\n\nexport function cmdPlayerGames(\n sport: string,\n player: string,\n flags: CommonFlags & {\n limit?: number;\n opponent?: string;\n statType?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerGames(sport, player, {\n limit: flags.limit,\n opponent: flags.opponent,\n statType: flags.statType,\n });\n if (flags.json) return printJson(resp);\n\n const scope = resp.opponent ? ` vs ${resp.opponent}` : \"\";\n process.stdout.write(\n `${resp.player_name}${scope} (${resp.games.length} games)\\n`,\n );\n if (resp.games.length === 0) return;\n\n // Columns are data-driven: the stat vocabulary differs per sport, and\n // within a sport a game can carry a stat an earlier one didn't (a pitcher\n // in one row, a batter in the next), so take the union across games and\n // keep first-seen order rather than hardcoding a per-sport list.\n const statNames: string[] = [];\n for (const g of resp.games) {\n for (const name of Object.keys(g.stats)) {\n if (!statNames.includes(name)) statNames.push(name);\n }\n }\n\n type Game = (typeof resp.games)[number];\n const cols: Column<Game>[] = [\n { label: \"DATE\", value: (g) => formatTime(g.commence_time).slice(0, 10) },\n {\n label: \"OPP\",\n value: (g) =>\n g.opponent === null\n ? `${g.away_team} @ ${g.home_team}`\n : `${g.is_home ? \"vs\" : \"@\"} ${g.opponent}`,\n },\n ...statNames.map((name) => ({\n label: name.toUpperCase(),\n value: (g: Game) => {\n const v = g.stats[name];\n // A stat absent for this game is blank, never 0 — the player may\n // simply not have been measured on it (a batter has no pitching\n // line), and printing 0 would read as a real result.\n return v === undefined ? \"\" : String(v);\n },\n numeric: true,\n })),\n ];\n printTable(resp.games, cols);\n });\n}\n\n/* ── player-trends ──────────────────────────────────────────────────── */\n\nfunction formatOverPct(w: HitRateSplit | null): string {\n if (!w || w.over_pct === null || w.over_pct === undefined) return \"\";\n return `${w.over_pct.toFixed(0)}%`;\n}\n\nexport function cmdPlayerTrends(\n sport: string,\n player: string,\n flags: CommonFlags & {\n market?: string;\n dfsOddsType?: \"standard\" | \"goblin\" | \"demon\";\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerTrends(sport, player, {\n market: flags.market,\n dfsOddsType: flags.dfsOddsType,\n });\n if (flags.json) return printJson(resp);\n process.stdout.write(\n `${resp.player_name} · ${resp.sport_key} (${resp.markets.length} markets)\\n`,\n );\n const cols: Column<PlayerMarketTrend>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n {\n label: \"GAMES\",\n value: (r) => String(r.games_graded),\n numeric: true,\n },\n { label: \"LINE\", value: (r) => formatPoint(r.recent_line), numeric: true },\n {\n label: \"AVG\",\n value: (r) =>\n r.avg_actual === null || r.avg_actual === undefined\n ? \"\"\n : r.avg_actual.toFixed(2),\n numeric: true,\n },\n { label: \"L5 O%\", value: (r) => formatOverPct(r.last_5), numeric: true },\n { label: \"L10 O%\", value: (r) => formatOverPct(r.last_10), numeric: true },\n { label: \"L20 O%\", value: (r) => formatOverPct(r.last_20), numeric: true },\n {\n label: \"STREAK\",\n value: (r) => {\n const s = r.current_streak;\n if (!s) return \"\";\n return `${s.length}× ${s.result}`;\n },\n },\n ];\n printTable(resp.markets, cols);\n });\n}\n\n/* ── export-resolved-props ──────────────────────────────────────────── */\n\nexport function cmdExportResolvedProps(\n flags: CommonFlags & {\n sport: string;\n market?: string;\n bookmaker?: string;\n since?: string;\n until?: string;\n out?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.out) {\n const path = await client.exportResolvedProps({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n outPath: flags.out,\n });\n process.stdout.write(`exported → ${path}\\n`);\n return;\n }\n // No --out: stream raw CSV bytes straight to stdout so a user can\n // pipe `propline export-resolved-props --sport mlb | head` to\n // sample. --json is meaningless here since the API only emits CSV;\n // we ignore it for this command.\n const buf = await client.exportResolvedProps({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n });\n process.stdout.write(buf);\n });\n}\n\n/* ── export-odds-history ────────────────────────────────────────────── */\n\nexport function cmdExportOddsHistory(\n flags: CommonFlags & {\n sport: string;\n market?: string;\n bookmaker?: string;\n since?: string;\n until?: string;\n out?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.out) {\n const path = await client.exportOddsHistory({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n outPath: flags.out,\n });\n process.stdout.write(`exported → ${path}\\n`);\n return;\n }\n // No --out: stream raw CSV bytes to stdout. The API only emits CSV,\n // so --json is meaningless here and ignored. This dataset is large —\n // pass --since/--until to page month-by-month.\n const buf = await client.exportOddsHistory({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n });\n process.stdout.write(buf);\n });\n}\n\n/* ── webhooks ───────────────────────────────────────────────────────── */\n\nexport function cmdWebhooksList(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const hooks = await client.listWebhooks();\n if (flags.json) return printJson(hooks);\n type H = (typeof hooks)[number];\n const cols: Column<H>[] = [\n { label: \"ID\", value: (r) => String(r.id), numeric: true },\n { label: \"URL\", value: (r) => truncate(r.url, 50) },\n { label: \"EVENTS\", value: (r) => (r.events ?? []).join(\",\") },\n { label: \"ACTIVE\", value: (r) => (r.active ? \"yes\" : \"no\") },\n { label: \"SPORT\", value: (r) => r.filter_sport_key ?? \"\" },\n { label: \"MARKET\", value: (r) => r.filter_market_key ?? \"\" },\n { label: \"CREATED\", value: (r) => formatTime(r.created_at) },\n ];\n printTable(hooks, cols);\n });\n}\n\nexport function cmdWebhooksCreate(\n flags: CommonFlags & {\n url: string;\n events?: string;\n sport?: string;\n market?: string;\n player?: string;\n bookmakers?: string;\n eventId?: number;\n minPriceChangePct?: number;\n minSteamScore?: number;\n minBooksAgreeing?: number;\n minEvPct?: number;\n maxEvPct?: number;\n evFairSource?: string;\n batchMax?: number;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = flags.events\n ? (flags.events.split(\",\").map((s) => s.trim()) as Array<\n \"line_movement\" | \"resolution\" | \"steam\" | \"market_suspended\" | \"ev\" | \"line_added\" | \"line_pulled\"\n >)\n : undefined;\n const hook = await client.createWebhook({\n url: flags.url,\n events,\n filterSportKey: flags.sport,\n filterMarketKey: flags.market,\n filterPlayerName: flags.player,\n filterBookmakerKey: flags.bookmakers,\n filterEventId: flags.eventId,\n minPriceChangePct: flags.minPriceChangePct,\n minSteamScore: flags.minSteamScore,\n minBooksAgreeing: flags.minBooksAgreeing,\n minEvPct: flags.minEvPct,\n maxEvPct: flags.maxEvPct,\n evFairSource: flags.evFairSource,\n batchMax: flags.batchMax,\n });\n if (flags.json) return printJson(hook);\n process.stdout.write(\n `webhook ${hook.id} created.\\n` +\n `url: ${hook.url}\\n` +\n `events: ${(hook.events ?? []).join(\",\") || \"(all)\"}\\n` +\n `secret: ${hook.secret}\\n\\n` +\n `STORE THE SECRET NOW — it's only revealed once. Use it to verify\\n` +\n `the X-PropLine-Signature header on every delivery.\\n`,\n );\n });\n}\n\nexport function cmdWebhooksDelete(\n id: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n await client.deleteWebhook(numeric);\n if (flags.json) return printJson({ ok: true, id: numeric });\n process.stdout.write(`webhook ${numeric} deleted.\\n`);\n });\n}\n\nexport function cmdWebhooksTest(id: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n const result = await client.testWebhook(numeric);\n if (flags.json) return printJson(result);\n process.stdout.write(`test payload queued for webhook ${numeric}.\\n`);\n });\n}\n\nexport function cmdWebhooksDeliveries(\n id: string,\n flags: CommonFlags & { limit?: number; beforeId?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n const deliveries = await client.listWebhookDeliveries(numeric, {\n limit: flags.limit,\n beforeId: flags.beforeId,\n });\n if (flags.json) return printJson(deliveries);\n type D = (typeof deliveries)[number];\n const cols: Column<D>[] = [\n { label: \"ID\", value: (r) => String(r.id), numeric: true },\n { label: \"STATUS\", value: (r) => String(r.status) },\n {\n label: \"RESP\",\n value: (r) => (r.response_code === null ? \"\" : String(r.response_code)),\n numeric: true,\n },\n { label: \"ATTEMPTS\", value: (r) => String(r.attempts), numeric: true },\n { label: \"DELIVERED\", value: (r) => formatTime(r.delivered_at) },\n ];\n printTable(deliveries, cols);\n });\n}\n\nexport function cmdWebhooksReplay(\n id: string,\n flags: CommonFlags & { sinceSeq?: number; limit?: number; all?: boolean },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n\n let cursor = flags.sinceSeq ?? 0;\n const collected: Awaited<\n ReturnType<typeof client.replayWebhookEvents>\n >[\"events\"] = [];\n let page = await client.replayWebhookEvents(numeric, {\n sinceSeq: cursor,\n limit: flags.limit,\n });\n let truncated = page.truncated;\n collected.push(...page.events);\n cursor = page.next_seq;\n\n // --all follows the cursor to the end of the retained window; without it\n // a single page is fetched, which is the right default for eyeballing.\n while (flags.all && page.has_more) {\n page = await client.replayWebhookEvents(numeric, {\n sinceSeq: cursor,\n limit: flags.limit,\n });\n truncated = truncated || page.truncated;\n collected.push(...page.events);\n cursor = page.next_seq;\n }\n\n if (flags.json) {\n return printJson({ ...page, events: collected, truncated });\n }\n\n type E = (typeof collected)[number];\n const cols: Column<E>[] = [\n { label: \"SEQ\", value: (r) => String(r.seq), numeric: true },\n { label: \"EVENT\", value: (r) => String(r.event_type) },\n { label: \"CREATED\", value: (r) => formatTime(r.created_at) },\n { label: \"DELIVERY\", value: (r) => String(r.delivery_id), numeric: true },\n ];\n printTable(collected, cols);\n\n // The whole reason this endpoint returns an object rather than a list: a\n // short page must never read as \"you are caught up\".\n if (truncated) {\n process.stderr.write(\n \"warning: events after your cursor have aged out of retention and \" +\n \"cannot be replayed — resync from the REST endpoints.\\n\",\n );\n }\n const behind = page.latest_seq - cursor;\n process.stdout.write(\n `\\ncursor ${cursor} of ${page.latest_seq}` +\n (behind > 0 ? ` (${behind} event(s) still ahead)` : \" (caught up)\") +\n \"\\n\",\n );\n });\n}\n\nexport function cmdStream(\n id: string,\n flags: CommonFlags & { sinceSeq?: number; once?: boolean },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n\n // Line-delimited JSON on stdout so this pipes into jq. The human-readable\n // status goes to stderr, which keeps stdout a clean data stream.\n for await (const ev of client.stream({\n webhookId: numeric,\n sinceSeq: flags.sinceSeq,\n reconnect: !flags.once,\n onTruncated: (ready) => {\n process.stderr.write(\n `warning: events after seq ${ready.since_seq} aged out of retention ` +\n `and cannot be replayed — resync from the REST endpoints.\\n`,\n );\n },\n onReady: (ready) => {\n process.stderr.write(\n `connected: webhook ${ready.webhook_id}, latest_seq ${ready.latest_seq}\\n`,\n );\n },\n })) {\n if (flags.json) {\n process.stdout.write(JSON.stringify(ev) + \"\\n\");\n } else {\n const who = (ev.data as Record<string, unknown>)?.player_name ?? \"\";\n process.stdout.write(\n `${String(ev.seq).padStart(8)} ${ev.event_type} ${who}\\n`,\n );\n }\n }\n });\n}\n\n/* ── history ────────────────────────────────────────────────────────── */\n\nexport function cmdHistory(\n sport: string,\n eventId: string,\n flags: CommonFlags & {\n markets?: string;\n bookmakers?: string;\n from?: string;\n to?: string;\n relativeFrom?: string;\n relativeTo?: string;\n interval?: string;\n changesOnly?: boolean;\n period?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const hist = await client.getOddsHistory(sport, eventId, {\n markets,\n bookmakers: flags.bookmakers,\n from: flags.from,\n to: flags.to,\n relativeFrom: flags.relativeFrom,\n relativeTo: flags.relativeTo,\n interval: flags.interval as\n | \"30s\"\n | \"1m\"\n | \"5m\"\n | \"15m\"\n | \"30m\"\n | \"1h\"\n | undefined,\n changesOnly: flags.changesOnly,\n period: flags.period,\n });\n if (flags.json) return printJson(hist);\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n when: string;\n point: string;\n price: string;\n };\n const rows: Row[] = [];\n for (const book of hist.bookmakers ?? []) {\n for (const m of book.markets ?? []) {\n for (const o of m.outcomes ?? []) {\n for (const s of o.snapshots ?? []) {\n rows.push({\n book: book.title ?? book.key,\n market: m.key,\n player: o.description ?? \"\",\n side: o.name,\n when: formatTime(s.recorded_at),\n point: formatPoint(s.point ?? null),\n price: formatPrice(s.price),\n });\n }\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no snapshots returned — check tier access and the time window)\\n`,\n );\n return;\n }\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"WHEN\", value: (r) => r.when },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nexport function cmdSgp(\n sport: string,\n eventId: string,\n file: string,\n flags: CommonFlags & { bookmaker?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const raw =\n file === \"-\"\n ? await new Promise<string>((resolve, reject) => {\n let buf = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (c) => (buf += c));\n process.stdin.on(\"end\", () => resolve(buf));\n process.stdin.on(\"error\", reject);\n })\n : await readFile(file, \"utf8\");\n let legs: unknown;\n try {\n legs = JSON.parse(raw);\n } catch (e) {\n throw new Error(\n `Could not parse ${file === \"-\" ? \"stdin\" : file} as JSON: ${\n (e as Error).message\n }`,\n );\n }\n if (!Array.isArray(legs)) {\n throw new Error(\"Expected a JSON array of leg objects (market, name, description, point, period).\");\n }\n\n const q = await client.priceSgp(\n sport,\n eventId,\n legs as never,\n flags.bookmaker ?? \"fanduel\",\n );\n if (flags.json) return printJson(q);\n\n if (\"quotes\" in q) {\n // bookmaker=all — every book on the same legs, side by side.\n type SgpOne = Awaited<ReturnType<PropLine[\"priceSgp\"]>>;\n type SgpAll = {\n away_team: string; home_team: string; redacted?: boolean;\n best_bookmaker: string | null;\n quotes: SgpOne[];\n errors: { bookmaker_title: string; status: number; error: string | null }[];\n };\n const all = q as unknown as SgpAll;\n process.stdout.write(`${all.away_team} @ ${all.home_team} · all books\\n`);\n if (all.redacted) {\n process.stdout.write(\"(free tier — prices redacted; Hobby+ unlocks the quotes)\\n\");\n }\n type BookRow = { book: string; sgp: string; indep: string; corr: string; note: string };\n const bookRows: BookRow[] = [\n ...all.quotes.map((x) => ({\n book: x.bookmaker_title,\n sgp: x.sgp_price === null || x.sgp_price === undefined ? \"\" : formatPrice(x.sgp_price),\n indep:\n x.independent_price === null || x.independent_price === undefined\n ? \"\"\n : formatPrice(x.independent_price),\n corr: x.correlation_factor === null || x.correlation_factor === undefined ? \"\" : `×${x.correlation_factor}`,\n note: x.bookmaker === all.best_bookmaker ? \"best\" : x.quoted === false ? \"not quoted\" : \"\",\n })),\n ...all.errors.map((e) => ({\n book: e.bookmaker_title, sgp: \"\", indep: \"\", corr: \"\",\n note: `${e.status} ${e.error ?? \"error\"}`,\n })),\n ];\n const bookCols: Column<BookRow>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"SGP\", value: (r) => r.sgp, numeric: true },\n { label: \"INDEPENDENT\", value: (r) => r.indep, numeric: true },\n { label: \"CORRELATION\", value: (r) => r.corr, numeric: true },\n { label: \"\", value: (r) => r.note },\n ];\n printTable(bookRows, bookCols);\n return;\n }\n\n process.stdout.write(\n `${q.away_team} @ ${q.home_team} · ${q.bookmaker_title}\\n`,\n );\n if (q.redacted) {\n process.stdout.write(\"(free tier — prices redacted; Hobby+ unlocks the quote)\\n\");\n } else if (q.quoted) {\n process.stdout.write(\n `SGP ${formatPrice(q.sgp_price ?? 0)} · independent ${formatPrice(\n q.independent_price ?? 0,\n )} · correlation ×${q.correlation_factor ?? \"n/a\"}\\n`,\n );\n } else {\n process.stdout.write(\"not quoted — the book will not offer this combination as an SGP\\n\");\n }\n\n type Row = { leg: string; price: string; live: string; status: string };\n const rows: Row[] = q.legs.map((l) => ({\n leg: `${l.market} ${l.description ? `${l.description} ` : \"\"}${l.name}${\n l.point !== null && l.point !== undefined ? ` ${l.point}` : \"\"\n }${l.period ? ` (${l.period})` : \"\"}`,\n price: l.price === null || l.price === undefined ? \"\" : formatPrice(l.price),\n live: l.book_price === null || l.book_price === undefined ? \"\" : formatPrice(l.book_price),\n status:\n l.accepted === null || l.accepted === undefined\n ? \"\"\n : l.accepted\n ? \"ok\"\n : (l.failure_code ?? \"refused\"),\n }));\n const cols: Column<Row>[] = [\n { label: \"LEG\", value: (r) => truncate(r.leg, 48) },\n { label: \"STORED\", value: (r) => r.price, numeric: true },\n { label: \"LIVE\", value: (r) => r.live, numeric: true },\n { label: \"STATUS\", value: (r) => r.status },\n ];\n printTable(rows, cols);\n });\n}\n\nexport function cmdClv(\n file: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n\n // JSON only, deliberately. A bet log is usually a CSV, but a naive\n // split(\",\") mangles any quoted field — \"Tatis Jr., Fernando\" becomes\n // two columns — and silently grading the wrong bet is exactly the\n // failure this endpoint's fail-closed matching exists to prevent.\n // Pipe CSV through jq/csvkit rather than trusting a half parser here.\n const raw =\n file === \"-\"\n ? await new Promise<string>((resolve, reject) => {\n let buf = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (c) => (buf += c));\n process.stdin.on(\"end\", () => resolve(buf));\n process.stdin.on(\"error\", reject);\n })\n : await readFile(file, \"utf8\");\n\n let bets: unknown;\n try {\n bets = JSON.parse(raw);\n } catch (e) {\n throw new Error(\n `Could not parse ${file === \"-\" ? \"stdin\" : file} as JSON: ${\n (e as Error).message\n }`,\n );\n }\n if (!Array.isArray(bets)) {\n throw new Error(\"Expected a JSON array of bet objects.\");\n }\n\n const res = await client.gradeClv(bets as never);\n if (flags.json) return printJson(res);\n\n const s = res.summary;\n process.stdout.write(\n `${s.matched}/${s.bets} matched` +\n (s.unmatched ? ` · ${s.unmatched} unmatched` : \"\") +\n (s.pending ? ` · ${s.pending} pending (event not started)` : \"\") +\n `\\n`,\n );\n if (s.avg_clv_pct !== null && s.avg_clv_pct !== undefined) {\n process.stdout.write(\n `avg CLV ${s.avg_clv_pct > 0 ? \"+\" : \"\"}${s.avg_clv_pct}% · ` +\n `vs de-vigged close ${\n s.avg_ev_vs_close_pct !== null && s.avg_ev_vs_close_pct !== undefined\n ? `${s.avg_ev_vs_close_pct > 0 ? \"+\" : \"\"}${s.avg_ev_vs_close_pct}%`\n : \"n/a\"\n } · beat the close ${s.beat_close_pct ?? \"n/a\"}%` +\n (s.profit_units !== null && s.profit_units !== undefined\n ? ` · ${s.profit_units > 0 ? \"+\" : \"\"}${s.profit_units}u`\n : \"\") +\n `\\n`,\n );\n }\n\n type Row = {\n ref: string;\n selection: string;\n price: string;\n close: string;\n clv: string;\n evClose: string;\n anchor: string;\n result: string;\n };\n const rows: Row[] = (res.bets ?? []).map((b) => ({\n ref: b.ref ?? \"\",\n selection: `${b.selection}${b.side ? ` ${b.side}` : \"\"}${\n b.point !== null && b.point !== undefined ? ` ${b.point}` : \"\"\n }`,\n price: formatPrice(b.price),\n close: b.matched\n ? b.closing_price === null || b.closing_price === undefined\n ? \"\"\n : formatPrice(b.closing_price)\n : `— ${b.unmatched_reason ?? \"unmatched\"}`,\n clv:\n b.clv_pct === null || b.clv_pct === undefined\n ? \"\"\n : `${b.clv_pct > 0 ? \"+\" : \"\"}${b.clv_pct}%`,\n evClose:\n b.ev_vs_close_pct === null || b.ev_vs_close_pct === undefined\n ? \"\"\n : `${b.ev_vs_close_pct > 0 ? \"+\" : \"\"}${b.ev_vs_close_pct}%`,\n // Pre-kickoff rows have no real close; say so rather than printing a\n // CLV that is ~0 by construction.\n anchor: b.matched && !b.closing_is_final ? \"pending\" : b.fair_source ?? \"\",\n result: b.resolution ?? \"\",\n }));\n\n const cols: Column<Row>[] = [\n { label: \"REF\", value: (r) => r.ref },\n { label: \"SELECTION\", value: (r) => truncate(r.selection, 30) },\n { label: \"TOOK\", value: (r) => r.price, numeric: true },\n { label: \"CLOSE\", value: (r) => r.close, numeric: true },\n { label: \"CLV\", value: (r) => r.clv, numeric: true },\n { label: \"VS DEVIG\", value: (r) => r.evClose, numeric: true },\n { label: \"ANCHOR\", value: (r) => r.anchor },\n { label: \"RESULT\", value: (r) => r.result },\n ];\n printTable(rows, cols);\n });\n}\n\nexport function cmdClosing(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; bookmakers?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const closing = await client.getOddsClosing(sport, eventId, {\n markets,\n bookmakers: flags.bookmakers,\n period: flags.period,\n });\n if (flags.json) return printJson(closing);\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n closingAt: string;\n openPoint: string;\n openPrice: string;\n point: string;\n price: string;\n };\n const rows: Row[] = [];\n for (const book of closing.bookmakers ?? []) {\n for (const m of book.markets ?? []) {\n for (const o of m.outcomes ?? []) {\n rows.push({\n book: book.title ?? book.key,\n market: m.key,\n player: o.description ?? \"\",\n side: o.name,\n closingAt: o.closing_at ? formatTime(o.closing_at) : \"\",\n openPoint: formatPoint(o.opening_point ?? null),\n openPrice:\n o.opening_price === null || o.opening_price === undefined\n ? \"\"\n : formatPrice(o.opening_price),\n point: formatPoint(o.point ?? null),\n price: o.price === null ? \"\" : formatPrice(o.price),\n });\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no closing lines returned — check tier access; free tier sees redacted structure)\\n`,\n );\n return;\n }\n process.stdout.write(\n `${closing.away_team} @ ${closing.home_team} (event ${closing.id})\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"CLOSED AT\", value: (r) => r.closingAt },\n { label: \"OPEN\", value: (r) => r.openPoint, numeric: true },\n { label: \"OPEN PRICE\", value: (r) => r.openPrice, numeric: true },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── helpers ────────────────────────────────────────────────────────── */\n\nfunction parseMarketsFlag(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Avoid an unused-import warning while still re-exporting the type\n * for downstream consumers who want to wire their own subcommands. */\nexport type { PropLine };\n","// Thin wrapper around the propline SDK constructor. Resolves auth from\n// (in priority order): --api-key flag → PROPLINE_API_KEY env var → exit\n// with a friendly message. Also threads --base-url for self-hosted /\n// staging deployments and --timeout for slow networks.\n//\n// Pulled out of index.ts so every command resolves credentials the same\n// way — drift between commands is the most common source of \"works on\n// my machine\" CLI bugs.\n\nimport { PropLine, PropLineError } from \"propline\";\n\nexport interface ClientFlags {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n}\n\nexport function buildClient(flags: ClientFlags): PropLine {\n const apiKey = flags.apiKey ?? process.env.PROPLINE_API_KEY;\n if (!apiKey) {\n process.stderr.write(\n \"error: API key required.\\n\\n\" +\n \" Set PROPLINE_API_KEY in your environment, or pass --api-key.\\n\" +\n \" Get one free at https://prop-line.com\\n\",\n );\n process.exit(2);\n }\n return new PropLine(apiKey, {\n baseUrl: flags.baseUrl,\n timeoutMs: flags.timeout ? flags.timeout * 1000 : undefined,\n });\n}\n\n/** Wrap a command body with consistent error reporting. PropLine API\n * errors get a one-line summary; everything else surfaces the message\n * + exits non-zero so shell scripts can detect failure. */\nexport async function runCommand(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n if (err instanceof PropLineError) {\n process.stderr.write(`error: ${err.message}\\n`);\n } else if (err instanceof Error) {\n process.stderr.write(`error: ${err.message}\\n`);\n } else {\n process.stderr.write(`error: ${String(err)}\\n`);\n }\n process.exit(1);\n }\n}\n","// Pretty-printing helpers — zero deps. Default output is a fixed-width\n// table with right-aligned numeric columns; pass --json on any command\n// to bypass and emit raw response JSON instead. Tables are streamed to\n// stdout via console.log so a downstream `| head` short-circuits cleanly.\n\nexport interface Column<T> {\n label: string;\n /** Stringified cell value. */\n value: (row: T) => string;\n /** Right-align (numeric) vs default left-align. */\n numeric?: boolean;\n}\n\nexport function printJson(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function printTable<T>(rows: T[], columns: Column<T>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(no rows)\\n\");\n return;\n }\n const cells: string[][] = rows.map((r) =>\n columns.map((c) => {\n const v = c.value(r);\n return v === undefined || v === null ? \"\" : String(v);\n }),\n );\n const headers = columns.map((c) => c.label);\n\n // Width = max(header, max cell). Capped at 60 chars so a long player\n // name or URL doesn't blow the layout open; the table is for skim\n // reading, full data is one --json away.\n const widths = headers.map((h, i) =>\n Math.min(60, Math.max(h.length, ...cells.map((row) => (row[i] ?? \"\").length))),\n );\n\n function pad(s: string, w: number, numeric: boolean): string {\n const truncated = s.length > w ? s.slice(0, w - 1) + \"…\" : s;\n if (numeric) return truncated.padStart(w);\n return truncated.padEnd(w);\n }\n\n // Header\n process.stdout.write(\n headers\n .map((h, i) => pad(h, widths[i] ?? 0, columns[i]?.numeric ?? false))\n .join(\" \") + \"\\n\",\n );\n // Underline\n process.stdout.write(widths.map((w) => \"─\".repeat(w)).join(\" \") + \"\\n\");\n // Rows\n for (const row of cells) {\n process.stdout.write(\n row\n .map((c, i) => pad(c, widths[i] ?? 0, columns[i]?.numeric ?? false))\n .join(\" \") + \"\\n\",\n );\n }\n}\n\nexport function formatPrice(price: number | null | undefined): string {\n if (price === null || price === undefined) return \"–\";\n if (price === 0) return \"EVEN\";\n return price > 0 ? `+${price}` : String(price);\n}\n\nexport function formatPoint(point: number | null | undefined): string {\n if (point === null || point === undefined) return \"\";\n if (Number.isInteger(point)) return String(point);\n return point.toFixed(1);\n}\n\nexport function formatTime(iso: string | null | undefined): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\n/** Truncate to N chars with ellipsis — used for long player/market names. */\nexport function truncate(s: string, n: number): string {\n if (s.length <= n) return s;\n return s.slice(0, n - 1) + \"…\";\n}\n"],"mappings":"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","names":["resp","markets","cols"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "propline-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.45.0",
|
|
4
4
|
"description": "Command-line interface for the PropLine player props betting odds API. Wraps the propline SDK with pretty-printed tables and JSON output.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"commander": "^12.1.0",
|
|
55
|
-
"propline": "^0.
|
|
55
|
+
"propline": "^0.68.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@types/node": "^20.19.39",
|