zchess 0.1.3-alpha.0 → 0.1.5-alpha.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 -3
- package/dist/cli.bundle.js +5 -5
- package/dist/cli.bundle.js.map +2 -2
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ZChess CLI
|
|
2
2
|
|
|
3
3
|
Play chess against the Stockfish engine from your terminal. The published
|
|
4
4
|
package includes the CLI and installs Stockfish automatically.
|
|
@@ -10,12 +10,12 @@ chess
|
|
|
10
10
|
|
|
11
11
|
Requires Node.js 22.13 or newer. The menu lets you choose a skill level and
|
|
12
12
|
color, or load a saved game. Games are saved in
|
|
13
|
-
`~/.local/share/
|
|
13
|
+
`~/.local/share/zchess/games.sqlite`.
|
|
14
14
|
|
|
15
15
|
You can also install with Homebrew from a release:
|
|
16
16
|
|
|
17
17
|
```sh
|
|
18
|
-
brew install --formula https://github.com/kennylwx/
|
|
18
|
+
brew install --formula https://github.com/kennylwx/zchess/releases/latest/download/zchess.rb
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
Stockfish runs locally. Plain-English move descriptions need the Chess server;
|
package/dist/cli.bundle.js
CHANGED
|
@@ -491,7 +491,7 @@ function moveHistory(chess, width = 80) {
|
|
|
491
491
|
|
|
492
492
|
// src/api.ts
|
|
493
493
|
var ChessServerClient = class {
|
|
494
|
-
constructor(baseUrl = process.env.
|
|
494
|
+
constructor(baseUrl = process.env.ZCHESS_SERVER_URL || "http://localhost:8000", signal) {
|
|
495
495
|
this.baseUrl = baseUrl;
|
|
496
496
|
this.signal = signal;
|
|
497
497
|
}
|
|
@@ -820,7 +820,7 @@ import { dirname, join } from "node:path";
|
|
|
820
820
|
import { homedir } from "node:os";
|
|
821
821
|
var GameStore = class {
|
|
822
822
|
db;
|
|
823
|
-
constructor(path = process.env.
|
|
823
|
+
constructor(path = process.env.ZCHESS_DB_PATH || join(process.env.XDG_DATA_HOME || join(homedir(), ".local", "share"), "zchess", "games.sqlite")) {
|
|
824
824
|
mkdirSync(dirname(path), { recursive: true });
|
|
825
825
|
this.db = new DatabaseSync(path);
|
|
826
826
|
this.db.exec(`
|
|
@@ -883,7 +883,7 @@ Usage: chess [--elo 1500] [--color white|black] [--fen FEN]
|
|
|
883
883
|
Run "chess" with no options to open the Play / Load game menu.
|
|
884
884
|
Moves accept UCI (e2e4), SAN (Nf3), or free text ("move the queen up by 1").
|
|
885
885
|
Stockfish is included and runs locally. Only free text requires the Chess server.
|
|
886
|
-
Games are saved automatically in ~/.local/share/
|
|
886
|
+
Games are saved automatically in ~/.local/share/zchess/games.sqlite.
|
|
887
887
|
Commands: /fen, /fen <position>, /undo, /help, /back, /quit`;
|
|
888
888
|
function commandHelp() {
|
|
889
889
|
return [
|
|
@@ -950,7 +950,7 @@ async function run(args) {
|
|
|
950
950
|
config = choice;
|
|
951
951
|
}
|
|
952
952
|
if (config) {
|
|
953
|
-
const again = await playGame(config, { graphics, depth, serverUrl: get("--server", process.env.
|
|
953
|
+
const again = await playGame(config, { graphics, depth, serverUrl: get("--server", process.env.ZCHESS_SERVER_URL || "http://localhost:8000"), store, sharedScreen: interactiveMenu });
|
|
954
954
|
if (again && config.saved) returnToSavedGames = true;
|
|
955
955
|
if (direct || !again) keepGoing = false;
|
|
956
956
|
}
|
|
@@ -971,7 +971,7 @@ async function mainMenu(store, screen, openSavedGames = false) {
|
|
|
971
971
|
if (game) return game;
|
|
972
972
|
continue;
|
|
973
973
|
}
|
|
974
|
-
screen.draw("
|
|
974
|
+
screen.draw("ZCHESS / LOCAL STOCKFISH", " 1 Play\n 2 Load a saved game\n 3 Quit", "");
|
|
975
975
|
const choice = await menuKey("Select \u203A ", ["1", "2", "3"]);
|
|
976
976
|
if (choice === "q") return "quit";
|
|
977
977
|
if (choice === "b") continue;
|
package/dist/cli.bundle.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli.ts", "../../../packages/chess/src/index.ts", "../../../packages/chess/src/resolution.ts", "../../../packages/chess/src/legality.ts", "../../../packages/chess/src/suggestions.ts", "../../../packages/chess/src/input.ts", "../../../packages/chess/src/history.ts", "../src/api.ts", "../src/ui.ts", "../src/graphics.ts", "../../../packages/chess/assets/pieces.json", "../src/engine.ts", "../src/screen.ts", "../src/store.ts"],
|
|
4
|
-
"sourcesContent": ["import { createInterface } from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport { Chess, START_FEN } from '@chess/chess';\nimport { modelInput } from './input.js';\nimport { ChessServerClient } from './api.js';\nimport { render } from './ui.js';\nimport { renderGraphics, supportsGraphics, type GraphicsMode } from './graphics.js';\nimport { engineMove } from './engine.js';\nimport { GameScreen, MenuScreen } from './screen.js';\nimport { moveHistory, undoTurn } from './history.js';\nimport { GameStore, type SavedGame } from './store.js';\nimport type { Key } from 'node:readline';\n\nconst HELP = `chess \u2014 terminal chess\n\nUsage: chess [--elo 1500] [--color white|black] [--fen FEN]\n [--server URL] [--depth 12] [--graphics auto|kitty|text]\n\nRun \"chess\" with no options to open the Play / Load game menu.\nMoves accept UCI (e2e4), SAN (Nf3), or free text (\"move the queen up by 1\").\nStockfish is included and runs locally. Only free text requires the Chess server.\nGames are saved automatically in ~/.local/share/chess/games.sqlite.\nCommands: /fen, /fen <position>, /undo, /help, /back, /quit`;\n\nexport function commandHelp(): string {\n return [\n 'COMMANDS',\n '/help Show this list',\n '/undo Take back a turn',\n '/fen Show the current position',\n '/fen <FEN> Load a position',\n '/back Return to the previous screen',\n '/quit Quit Chess',\n '',\n 'SHORTCUTS',\n 'Ctrl+C Quit',\n 'Ctrl+U Clear input',\n ].join('\\n');\n}\n\nexport function editGameInput(value: string, text: string, key: Key): string {\n if ((key?.ctrl && key.name === 'u') || (key?.meta && key.name === 'backspace')) return '';\n if (key?.name === 'backspace') return [...value].slice(0, -1).join('');\n if (!key?.ctrl && !key?.meta && text && !/[\\x00-\\x1f\\x7f]/.test(text)) return value + text;\n return value;\n}\n\nconst promptColor = '\\x1b[38;2;190;221;173m';\nconst reset = '\\x1b[0m';\nconst ELO_PRESETS = [\n { label: 'Beginner', elo: 1320 },\n { label: 'Intermediate', elo: 1500 },\n { label: 'Advanced', elo: 1800 },\n { label: 'Expert', elo: 2200 },\n { label: 'Master', elo: 3190 },\n];\ninterface GameConfig { elo: number; human: 'w' | 'b'; saved?: SavedGame; fen?: string }\n\nexport async function run(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) { console.log(HELP); return; }\n const get = (name: string, fallback: string | undefined): string | undefined => {\n const index = args.indexOf(name);\n return index < 0 ? fallback : (args[index + 1] ?? fallback);\n };\n const graphics = get('--graphics', 'auto') as GraphicsMode;\n if (!['auto', 'kitty', 'text'].includes(graphics)) throw new Error('Graphics must be auto, kitty, or text.');\n const depth = Number(get('--depth', '12'));\n if (!Number.isInteger(depth) || depth < 1 || depth > 30) throw new Error('Depth must be an integer from 1 to 30.');\n const store = new GameStore(get('--db', undefined));\n const direct = args.some(arg => arg.startsWith('--'));\n const interactiveMenu = !direct && stdin.isTTY && stdout.isTTY;\n const menuScreen = interactiveMenu ? new MenuScreen(true) : undefined;\n menuScreen?.open();\n\n try {\n let keepGoing = true;\n let returnToSavedGames = false;\n while (keepGoing) {\n let config: GameConfig | undefined;\n if (direct || !stdin.isTTY || !stdout.isTTY) {\n const elo = Number(get('--elo', '1500'));\n if (!Number.isInteger(elo) || elo < 1320 || elo > 3190) throw new Error('ELO must be an integer from 1320 to 3190 (Stockfish UCI range).');\n config = { elo, human: get('--color', 'white')!.toLowerCase().startsWith('b') ? 'b' : 'w', fen: get('--fen', undefined) };\n keepGoing = false;\n } else {\n const choice = await mainMenu(store, menuScreen!, returnToSavedGames);\n returnToSavedGames = false;\n if (choice === 'quit') break;\n config = choice;\n }\n if (config) {\n const again = await playGame(config, { graphics, depth, serverUrl: get('--server', process.env.CHESS_SERVER_URL || 'http://localhost:8000')!, store, sharedScreen: interactiveMenu });\n if (again && config.saved) returnToSavedGames = true;\n if (direct || !again) keepGoing = false;\n }\n }\n } finally { menuScreen?.close(); store.close(); }\n}\n\nasync function mainMenu(store: GameStore, screen: MenuScreen, openSavedGames = false): Promise<GameConfig | 'quit'> {\n const rl = createInterface({ input: stdin, output: stdout });\n try {\n while (true) {\n if (openSavedGames) {\n openSavedGames = false;\n const game = await savedGamesMenu(store, screen);\n if (game === 'quit') return 'quit';\n if (game) return game;\n continue;\n }\n screen.draw('CHESS / LOCAL STOCKFISH', ' 1 Play\\n 2 Load a saved game\\n 3 Quit', '');\n const choice = await menuKey('Select \u203A ', ['1', '2', '3']);\n if (choice === 'q') return 'quit';\n if (choice === 'b') continue;\n if (choice === '3') return 'quit';\n if (choice === '1') {\n const game = await newGameMenu(screen);\n if (game === 'quit') return 'quit';\n if (game) return game;\n }\n if (choice === '2' || choice === 'load') {\n const game = await savedGamesMenu(store, screen);\n if (game === 'quit') return 'quit';\n if (game) return game;\n }\n }\n } finally { rl.close(); }\n}\n\nasync function savedGamesMenu(store: GameStore, screen: MenuScreen): Promise<GameConfig | 'quit' | null> {\n const games = store.list();\n if (!games.length) {\n screen.draw('LOAD A SAVED GAME', 'No saved games yet.\\n\\n 1 Back\\n 2 Quit', '');\n const action = await menuKey('Select \u203A ', ['1', '2']);\n return action === '2' || action === 'q' ? 'quit' : null;\n }\n const recent = games.slice(0, 7);\n const lines = recent.map((game, index) => ` ${index + 1} ${game.updatedAt.slice(0, 16).replace('T', ' ')} \u00B7 ${game.elo} ELO \u00B7 ${game.moves.length ? game.moves.join(' ') : 'New game'} \u00B7 ${game.status}`);\n if (games.length > recent.length) lines.push(' Showing the 7 most recent games.');\n const backChoice = recent.length + 1;\n const quitChoice = recent.length + 2;\n lines.push(` ${backChoice} Back`, ` ${quitChoice} Quit`);\n screen.draw('LOAD A SAVED GAME', lines.join('\\n'), '');\n const selection = await menuKey('Choose a game \u203A ', Array.from({ length: quitChoice }, (_, index) => String(index + 1)));\n if (selection === 'q') return 'quit';\n if (Number(selection) === backChoice) return null;\n if (Number(selection) === quitChoice) return 'quit';\n const game = recent[Number(selection) - 1];\n return game ? { elo: game.elo, human: game.color, saved: game } : null;\n}\n\nasync function newGameMenu(screen: MenuScreen): Promise<GameConfig | null | 'quit'> {\n const choices = ELO_PRESETS.map(({ label, elo }, index) => ` ${index + 1} ${label} \u00B7 ${elo} ELO`);\n choices.push(' 6 Custom ELO');\n choices.push(' 7 Back', ' 8 Quit');\n screen.draw('NEW GAME / STOCKFISH STRENGTH', `${choices.join('\\n')}\\n\\nAvailable range: 1320\u20133190 ELO`, '');\n const selection = await menuKey('ELO \u203A ', ['1', '2', '3', '4', '5', '6', '7', '8']);\n if (selection === 'q') return 'quit';\n if (selection === '7') return null;\n if (selection === '8') return 'quit';\n let elo = ELO_PRESETS[Number(selection) - 1]?.elo;\n if (selection === '6') {\n let custom: number;\n while (true) {\n screen.draw('NEW GAME / CUSTOM ELO', 'Enter any ELO from 1320 to 3190.\\n\\n 0 Back\\n 00 Quit', '');\n const value = await menuText('ELO \u203A ');\n if (value === 'q') return 'quit';\n if (value === 'b' || value === null) return await newGameMenu(screen);\n custom = Number(value);\n if (Number.isInteger(custom) && custom >= 1320 && custom <= 3190) break;\n screen.draw('NEW GAME / CUSTOM ELO', 'Enter an ELO from 1320 to 3190.\\nThat value is outside the range.\\n\\n 0 Back\\n 00 Quit', '');\n }\n elo = custom;\n }\n if (elo === undefined) return null;\n while (true) {\n screen.draw('NEW GAME / CHOOSE SIDE', `Stockfish ${elo} ELO\\n\\n 1 White\\n 2 Black\\n 3 Random\\n 4 Back\\n 5 Quit`, '');\n const side = await menuKey('Side \u203A ', ['1', '2', '3', '4', '5']);\n if (side === 'q') return 'quit';\n if (side === '4') return await newGameMenu(screen);\n if (side === '5') return 'quit';\n const human: 'w' | 'b' = side === '1' ? 'w' : side === '2' ? 'b' : Math.random() < 0.5 ? 'w' : 'b';\n return { elo, human };\n }\n}\n\nfunction menuKey(prompt: string, choices: string[]): Promise<string> {\n return rawPrompt(prompt, (text, key, finish) => {\n if (key?.ctrl && key.name === 'c') { finish('q'); return; }\n const character = (text ?? '').toLowerCase();\n if (!key?.ctrl && choices.includes(character)) finish(character);\n });\n}\n\nfunction menuText(prompt: string): Promise<string | 'b' | 'q' | null> {\n let value = '';\n return rawPrompt(prompt, (text, key, finish) => {\n if (key?.ctrl && key.name === 'c') { finish('q'); return; }\n if (key?.name === 'backspace') {\n value = value.slice(0, -1);\n stdout.write('\\b \\b');\n return;\n }\n if (key?.name === 'return' || key?.name === 'enter') {\n finish(value === '0' ? 'b' : value === '00' ? 'q' : value);\n return;\n }\n const character = text ?? '';\n if (key?.ctrl || !character) return;\n value += character;\n stdout.write(character);\n });\n}\n\nfunction rawPrompt<T>(prompt: string, onKey: (text: string, key: Key, finish: (value: T) => void) => void): Promise<T> {\n const stream = stdin as typeof stdin & { setRawMode?: (mode: boolean) => void };\n if (!stream.isTTY || !stream.setRawMode) return Promise.reject(new Error('Menu selection requires an interactive terminal.'));\n const previous = stdin.listeners('keypress') as Array<(...args: any[]) => void>;\n previous.forEach(listener => stdin.removeListener('keypress', listener));\n stdout.write(`${promptColor}${prompt}${reset}`);\n stream.setRawMode(true);\n return new Promise(resolve => {\n let finished = false;\n const finish = (value: T): void => {\n if (finished) return;\n finished = true;\n stdin.removeListener('keypress', listener);\n stream.setRawMode(false);\n [...previous].reverse().forEach(listener => stdin.prependListener('keypress', listener));\n stdout.write('\\r\\n');\n resolve(value);\n };\n const listener = (text: string, key: Key): void => onKey(text, key, finish);\n stdin.on('keypress', listener);\n });\n}\n\nasync function playGame(config: GameConfig, options: { graphics: GraphicsMode; depth: number; serverUrl: string; store: GameStore; sharedScreen: boolean }): Promise<boolean> {\n const { elo, human, saved } = config;\n let startFen = saved?.startFen ?? config.fen ?? START_FEN;\n const chess = new Chess(startFen);\n if (saved) for (const move of saved.moves) chess.play(move);\n const abort = new AbortController();\n const server = new ChessServerClient(options.serverUrl, abort.signal);\n const rl = createInterface({ input: stdin, output: stdout });\n const screen = new GameScreen(Boolean(stdout.isTTY && stdin.isTTY), stdout, !options.sharedScreen);\n const useGraphics = supportsGraphics(options.graphics);\n let stopped = false;\n let redrawInput: (() => void) | undefined;\n let last: number[] | null = null;\n let showingHelp = false;\n let returnToMenu = false;\n let returnToMenuRequested = false;\n let search: AbortController | undefined;\n let notice = 'Your move';\n let gameId = saved?.id;\n const header = `CHESS / ${human === 'w' ? 'White' : 'Black'} / Stockfish ${elo} ELO`;\n const persist = (): void => {\n gameId = options.store.save({ elo, color: human, startFen, fen: chess.fen(), moves: chess.history.map(entry => entry.san), status: chess.status() ?? 'In progress' }, gameId);\n };\n const draw = (): void => screen.draw(header,\n showingHelp ? commandHelp()\n : useGraphics ? renderGraphics(chess, human, last, screen.active)\n : render(chess, { perspective: human, last, compact: screen.active && (stdout.rows || 40) < 36 }),\n notice, showingHelp ? '' : moveHistory(chess, Math.max(1, (stdout.columns || 80) - 1)));\n const takeBack = (): void => {\n notice = undoTurn(chess, human) ? 'Took back your last move and any Stockfish reply.' : 'No move to undo yet.';\n const move = chess.history.at(-1)?.move;\n last = move ? [move.from, move.to] : null;\n persist();\n };\n const shortcut = (text: string, key: Key): void => {\n if (stopped || returnToMenuRequested) return;\n if (key?.ctrl && key.name === 'c') { stop(); return; }\n };\n const stop = (): void => { stopped = true; abort.abort(); search?.abort(); };\n const resize = (): void => { if (!stopped) { draw(); redrawInput?.(); } };\n const question = async (placeholder: string): Promise<string> => {\n if (!screen.active) return await rl.question(`${promptColor}${placeholder} \u203A ${reset}`, { signal: abort.signal });\n const stream = stdin as typeof stdin & { setRawMode?: (mode: boolean) => void };\n const previousRaw = stream.isRaw;\n const previous = stdin.listeners('keypress') as Array<(text: string, key: Key) => void>;\n previous.forEach(listener => stdin.removeListener('keypress', listener));\n stream.setRawMode?.(true);\n return new Promise(resolve => {\n let value = '';\n let done = false;\n const redraw = (): void => screen.input(value, placeholder);\n const finish = (answer: string): void => {\n if (done) return;\n done = true;\n stdin.removeListener('keypress', onKey);\n abort.signal.removeEventListener('abort', onAbort);\n previous.forEach(listener => stdin.on('keypress', listener));\n stream.setRawMode?.(previousRaw);\n redrawInput = undefined;\n screen.input('', placeholder);\n resolve(answer);\n };\n const onAbort = (): void => finish('');\n const onKey = (text: string, key: Key): void => {\n if (key?.ctrl && key.name === 'c') { stop(); finish(''); return; }\n if (key?.name === 'return' || key?.name === 'enter') { finish(value); return; }\n value = editGameInput(value, text, key);\n redraw();\n };\n redrawInput = redraw;\n stdin.on('keypress', onKey);\n abort.signal.addEventListener('abort', onAbort, { once: true });\n redraw();\n });\n };\n stdin.on('keypress', shortcut);\n rl.on('SIGINT', stop);\n rl.on('close', stop);\n process.on('SIGINT', stop);\n process.on('SIGTERM', stop);\n stdout.on('resize', resize);\n screen.open();\n persist();\n\n try {\n while (!stopped && !returnToMenuRequested) {\n const status = chess.status();\n if (status) {\n notice = status;\n persist();\n draw();\n if (screen.active) {\n const command = await question('Type /undo, /back, or /quit \u00B7 Ctrl+C quit');\n if (command.trim().toLowerCase() === '/undo') { takeBack(); continue; }\n if (/^\\/(quit|exit)$/.test(command.trim().toLowerCase())) { stop(); break; }\n break;\n }\n console.log(status);\n break;\n }\n if (chess.turn !== human) {\n notice = 'Stockfish is thinking\u2026';\n draw();\n search = new AbortController();\n let move: string;\n try { move = await engineMove(chess.fen(), elo, options.depth, search.signal); }\n catch (error) {\n if (returnToMenuRequested) break;\n throw error;\n } finally { search = undefined; }\n const side = chess.turn;\n const san = chess.play(move);\n const played = chess.history.at(-1)!.move;\n last = [played.from, played.to];\n notice = `${side === 'w' ? 'White' : 'Black'} plays ${san}`;\n persist();\n continue;\n }\n\n draw();\n let raw: string;\n try { raw = await question(showingHelp ? 'Type /back to return to the game' : 'Type any moves e.g. e4 or e pawn up 2'); }\n catch (error) { if (returnToMenuRequested) break; throw error; }\n const wasShowingHelp = showingHelp;\n showingHelp = false;\n if (wasShowingHelp && /^\\/back$/i.test(raw.trim())) { notice = 'Your move'; continue; }\n let intent;\n try { intent = await modelInput(raw, chess, server); }\n catch (error) { notice = message(error); continue; }\n if (stopped) break;\n if (intent.type === 'quit') { stop(); break; }\n if (intent.type === 'help') { notice = 'Available commands'; showingHelp = true; continue; }\n if (intent.type === 'back') { returnToMenuRequested = true; break; }\n if (intent.type === 'show-fen') { notice = chess.fen(); continue; }\n if (intent.type === 'load-fen') {\n try { chess.load(intent.value); startFen = intent.value; last = null; notice = 'Position loaded.'; persist(); }\n catch (error) { notice = message(error); }\n continue;\n }\n if (intent.type === 'undo') { takeBack(); continue; }\n if (intent.type === 'empty') continue;\n try {\n const san = chess.play(intent.value);\n const move = chess.history.at(-1)!.move;\n last = [move.from, move.to];\n notice = intent.source === 'jev' ? `JEV chose ${san}` : `You played ${san}`;\n persist();\n } catch (error) { notice = `${message(error)}. Try e2e4, Nf3, or describe the move.`; }\n }\n } catch (error) { if (!stopped) throw error; }\n finally {\n returnToMenu = screen.active && !stopped;\n stdin.off('keypress', shortcut);\n stdout.off('resize', resize);\n process.off('SIGINT', stop);\n process.off('SIGTERM', stop);\n rl.close();\n screen.close();\n }\n return returnToMenu || screen.active && returnToMenuRequested;\n}\n\nexport { HELP };\nconst message = (error: unknown): string => error instanceof Error ? error.message : String(error);\n", "export const START_FEN = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';\nconst FILES = 'abcdefgh';\nconst KNIGHT: Direction[] = [[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]];\nconst KING: Direction[] = [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]];\ntype Side = 'w' | 'b';\ntype Piece = 'P'|'N'|'B'|'R'|'Q'|'K'|'p'|'n'|'b'|'r'|'q'|'k';\ntype Direction = [number, number];\nexport interface Move { from:number; to:number; promotion:string|null; flags:string }\nexport interface PositionSnapshot { board:(Piece|null)[]; turn:Side; castling:string; ep:number; halfmove:number; fullmove:number }\nexport interface HistoryEntry { move:Move; san:string; before:PositionSnapshot }\n\nexport const squareName = (i:number):string => FILES[i % 8] + (8 - Math.floor(i / 8));\nexport const squareIndex = (s:string):number => /^[a-h][1-8]$/i.test(s) ? (8 - Number(s[1])) * 8 + FILES.indexOf(s[0].toLowerCase()) : -1;\nconst color = (p:Piece|null):Side|null => p ? (p === p.toUpperCase() ? 'w' : 'b') : null;\n\nexport class Chess {\n board:(Piece|null)[]=[]; turn:Side='w'; castling=''; ep=-1; halfmove=0; fullmove=1; history:HistoryEntry[]=[];\n constructor(fen:string = START_FEN) { this.load(fen); }\n load(fen:string):this {\n const [placement, turn, castling = '-', ep = '-', half = '0', full = '1'] = fen.trim().split(/\\s+/);\n const ranks = placement?.split('/');\n if (!ranks || ranks.length !== 8 || !/^[wb]$/.test(turn)) throw new Error('Invalid FEN');\n this.board = [];\n for (const rank of ranks) {\n for (const c of rank) {\n if (/\\d/.test(c)) this.board.push(...Array(Number(c)).fill(null));\n else if (/[prnbqkPRNBQK]/.test(c)) this.board.push(c as Piece);\n else throw new Error('Invalid FEN');\n }\n }\n if (this.board.length !== 64) throw new Error('Invalid FEN');\n this.turn = turn as Side; this.castling = castling === '-' ? '' : castling; this.ep = ep === '-' ? -1 : squareIndex(ep);\n this.halfmove = Number(half); this.fullmove = Number(full); this.history = [];\n if (this.ep < -1 || !Number.isFinite(this.halfmove) || !Number.isFinite(this.fullmove)) throw new Error('Invalid FEN');\n return this;\n }\n fen():string {\n let out = '';\n for (let r=0;r<8;r++) { let empty=0; for(let f=0;f<8;f++){ const p=this.board[r*8+f]; if(!p) empty++; else {if(empty){out+=empty;empty=0;} out+=p;} } if(empty)out+=empty; if(r<7)out+='/'; }\n return `${out} ${this.turn} ${this.castling || '-'} ${this.ep < 0 ? '-' : squareName(this.ep)} ${this.halfmove} ${this.fullmove}`;\n }\n attacked(sq:number, by:Side):boolean {\n const r=Math.floor(sq/8), f=sq%8;\n const pawn = by==='w'?'P':'p', pawnRow = r + (by==='w'?1:-1);\n for(const df of [-1,1]) if(pawnRow>=0&&pawnRow<8&&f+df>=0&&f+df<8&&this.board[pawnRow*8+f+df]===pawn)return true;\n for(const [df,dr] of KNIGHT){const rr=r+dr,ff=f+df;if(rr>=0&&rr<8&&ff>=0&&ff<8&&this.board[rr*8+ff]===(by==='w'?'N':'n'))return true;}\n for(const [df,dr] of KING){const rr=r+dr,ff=f+df;if(rr>=0&&rr<8&&ff>=0&&ff<8&&this.board[rr*8+ff]===(by==='w'?'K':'k'))return true;}\n for(const [df,dr,types] of [[1,0,'RQ'],[-1,0,'RQ'],[0,1,'RQ'],[0,-1,'RQ'],[1,1,'BQ'],[-1,1,'BQ'],[1,-1,'BQ'],[-1,-1,'BQ']] as [number,number,string][]) {\n let rr=r+dr,ff=f+df; while(rr>=0&&rr<8&&ff>=0&&ff<8){const p=this.board[rr*8+ff];if(p){if(color(p)===by&&types.includes(p.toUpperCase()))return true;break;}rr+=dr;ff+=df;\n }} return false;\n }\n inCheck(side:Side=this.turn):boolean { const king=this.board.indexOf(side==='w'?'K':'k'); return king<0 || this.attacked(king,side==='w'?'b':'w'); }\n pseudo():Move[] {\n const moves:Move[]=[];\n const add=(from:number,to:number,promotion:string|null=null,flags='')=>moves.push({from,to,promotion,flags});\n for(let from=0;from<64;from++){const p=this.board[from];if(!p||color(p)!==this.turn)continue;const type=p.toUpperCase(),r=Math.floor(from/8),f=from%8;\n if(type==='P'){const dir=this.turn==='w'?-1:1, home=this.turn==='w'?6:1, last=this.turn==='w'?0:7;const one=(r+dir)*8+f;\n if(r+dir>=0&&r+dir<8&&!this.board[one]){if(r+dir===last)for(const q of 'qrbn')add(from,one,q,'p');else add(from,one);const two=(r+2*dir)*8+f;if(r===home&&!this.board[two])add(from,two,null,'d');}\n for(const df of [-1,1]){const rr=r+dir,ff=f+df;if(rr<0||rr>7||ff<0||ff>7)continue;const to=rr*8+ff;if((this.board[to]&&color(this.board[to])!==this.turn)||to===this.ep){if(rr===last)for(const q of 'qrbn')add(from,to,q,to===this.ep?'ep':'cp');else add(from,to,null,to===this.ep?'e':'c');}}\n } else if(type==='N'||type==='K'){for(const [df,dr] of type==='N'?KNIGHT:KING){const rr=r+dr,ff=f+df;if(rr>=0&&rr<8&&ff>=0&&ff<8&&color(this.board[rr*8+ff])!==this.turn)add(from,rr*8+ff,null,this.board[rr*8+ff]?'c':'');}\n if(type==='K')this.castleMoves(from,add);\n } else {const dirs=type==='B'?KING.slice(4):type==='R'?KING.slice(0,4):KING;for(const[df,dr]of dirs){let rr=r+dr,ff=f+df;while(rr>=0&&rr<8&&ff>=0&&ff<8){const to=rr*8+ff;if(color(this.board[to])===this.turn)break;add(from,to,null,this.board[to]?'c':'');if(this.board[to])break;rr+=dr;ff+=df;}}}\n } return moves;\n }\n castleMoves(from:number, add:(from:number,to:number,promotion?:string|null,flags?:string)=>void):void {\n const white=this.turn==='w', base=white?60:4, enemy=white?'b':'w'; if(from!==base||this.inCheck())return;\n const king=white?'K':'k', rook=white?'R':'r'; if(this.board[from]!==king)return;\n if(this.castling.includes(white?'K':'k')&&this.board[base+3]===rook&&!this.board[base+1]&&!this.board[base+2]&&!this.attacked(base+1,enemy)&&!this.attacked(base+2,enemy))add(from,base+2,null,'k');\n if(this.castling.includes(white?'Q':'q')&&this.board[base-4]===rook&&!this.board[base-1]&&!this.board[base-2]&&!this.board[base-3]&&!this.attacked(base-1,enemy)&&!this.attacked(base-2,enemy))add(from,base-2,null,'q');\n }\n moves():Move[] { return this.pseudo().filter(m=>{const snapshot=this.snapshot();this.apply(m);const bad=this.inCheck(this.turn==='w'?'b':'w');this.restore(snapshot);return !bad;}); }\n snapshot():PositionSnapshot{return {board:[...this.board],turn:this.turn,castling:this.castling,ep:this.ep,halfmove:this.halfmove,fullmove:this.fullmove};}\n restore(s:PositionSnapshot):void{Object.assign(this,s);}\n apply(m:Move):void{const p=this.board[m.from]! as Piece, side=this.turn, captured=this.board[m.to];this.board[m.to]=(m.promotion?(side==='w'?m.promotion.toUpperCase():m.promotion):p) as Piece;this.board[m.from]=null;\n if(m.flags.includes('e'))this.board[m.to+(side==='w'?8:-8)]=null;\n if(m.flags==='k'){this.board[m.to-1]=this.board[m.to+1];this.board[m.to+1]=null;} if(m.flags==='q'){this.board[m.to+1]=this.board[m.to-2];this.board[m.to-2]=null;}\n const rights:Record<number,string>={0:'q',4:'kq',7:'k',56:'Q',60:'KQ',63:'K'};for(const sq of [m.from,m.to])if(rights[sq])for(const x of rights[sq])this.castling=this.castling.replace(x,'');\n this.ep=m.flags==='d'?(m.from+m.to)/2:-1;this.halfmove=(p.toUpperCase()==='P'||captured||m.flags.includes('e'))?0:this.halfmove+1;if(side==='b')this.fullmove++;this.turn=side==='w'?'b':'w';\n }\n san(m:Move, legal:Move[]=this.moves()):string {const p=this.board[m.from]!, type=p.toUpperCase();if(m.flags==='k')return'O-O';if(m.flags==='q')return'O-O-O';let s=type==='P'?'':type;\n if(type!=='P'){const same=legal.filter(x=>x!==m&&x.to===m.to&&this.board[x.from]?.toUpperCase()===type);if(same.length){if(same.every(x=>x.from%8!==m.from%8))s+=FILES[m.from%8];else if(same.every(x=>Math.floor(x.from/8)!==Math.floor(m.from/8)))s+=8-Math.floor(m.from/8);else s+=squareName(m.from);}}\n if(m.flags.includes('c')||m.flags.includes('e'))s+=(type==='P'?FILES[m.from%8]:'')+'x';s+=squareName(m.to);if(m.promotion)s+='='+m.promotion.toUpperCase();const snap=this.snapshot();this.apply(m);if(this.inCheck()){s+=this.moves().length?'#'.replace('#','+'):'#';}this.restore(snap);return s;\n }\n play(input:string):string {const legal=this.moves(), normalized=input.trim().replace(/[!?+#]/g,'').replace(/0/g,'O');let move=legal.find(m=>`${squareName(m.from)}${squareName(m.to)}${m.promotion||''}`===normalized.toLowerCase());if(!move)move=legal.find(m=>this.san(m,legal).replace(/[+#]/g,'')===normalized);if(!move)throw new Error(`Illegal or unrecognized move: ${input}`);const san=this.san(move,legal), before=this.snapshot();this.apply(move);this.history.push({move,san,before});return san;}\n undo():HistoryEntry|undefined{const h=this.history.pop();if(h)this.restore(h.before);return h;}\n status():string|null{const moves=this.moves();if(!moves.length)return this.inCheck()?(this.turn==='w'?'Black':'White')+' wins by checkmate':'Draw by stalemate';if(this.halfmove>=100)return'Draw by fifty-move rule';return null;}\n}\n", "import type { Chess } from './index.js';\nexport interface MoveResult { move: string; fen: string; explanation: string }\nexport interface MoveResolver { resolve(text: string, chess: Chess): Promise<MoveResult> }\nexport class ResolutionError extends Error {\n constructor(message: string, readonly status: number) { super(message); }\n}\n", "import { Chess, squareName } from './index.js';\n\nconst names: Record<string, string> = { P: 'Pawn', N: 'Knight', B: 'Bishop', R: 'Rook', Q: 'Queen', K: 'King' };\n\n/** Explain a recognizable move rejected for king safety, without changing the game. */\nexport function illegalMoveReason(input: string, chess: Chess): string | undefined {\n const text = input.trim();\n const uci = /^([a-h][1-8])([a-h][1-8])([qrbn])?$/.exec(text);\n const san = /^([KQRBN])?([a-h])?([1-8])?(x)?([a-h][1-8])(?:=([QRBN]))?[+#]?$/.exec(text);\n const words = text.toLowerCase();\n const squares = words.match(/[a-h][1-8]/g) || [];\n const named = words.match(/\\bwith (?:my |the |a )?(pawn|knight|bishop|rook|queen|king)\\b/)?.[1]\n || words.match(/\\b(pawn|knight|bishop|rook|queen|king)\\b/)?.[1];\n const kind = uci ? undefined : san ? san[1] || 'P'\n : Object.keys(names).find(key => names[key].toLowerCase() === named);\n const from = uci?.[1] || (squares.length > 1 ? squares[0] : undefined);\n const to = uci?.[2] || san?.[5] || squares.at(-1);\n if (!to || (!uci && !san && !kind && !from)) return;\n const capture = san ? Boolean(san[4]) : /\\b(take|takes|taking|capture|captures|capturing)\\b/.test(words);\n const candidates = chess.pseudo().filter(move => {\n if (squareName(move.to) !== to) return false;\n if (from && squareName(move.from) !== from) return false;\n if (kind && chess.board[move.from]!.toUpperCase() !== kind) return false;\n if (san?.[2] && squareName(move.from)[0] !== san[2]) return false;\n if (san?.[3] && squareName(move.from)[1] !== san[3]) return false;\n if (capture && !/[ce]/.test(move.flags)) return false;\n return true;\n });\n const legal = chess.moves();\n // A legal interpretation or multiple possible pieces needs clarification, not a pin claim.\n if (candidates.length !== 1 || legal.some(move => move.from === candidates[0].from && move.to === candidates[0].to)) return;\n const move = candidates[0];\n const copy = new Chess(chess.fen());\n copy.apply(move);\n if (!copy.inCheck(chess.turn)) return;\n const piece = chess.board[move.from]!.toUpperCase();\n if (piece === 'K') return `King cannot move to ${to}: that square is attacked.`;\n if (chess.inCheck()) return 'You are in check; this move would leave your king in check.';\n\n const king = chess.board.indexOf(chess.turn === 'w' ? 'K' : 'k');\n const dr = Math.floor(move.from / 8) - Math.floor(king / 8);\n const df = move.from % 8 - king % 8;\n if (dr === 0 || df === 0 || Math.abs(dr) === Math.abs(df)) {\n const stepR = Math.sign(dr), stepF = Math.sign(df);\n let rank = Math.floor(king / 8) + stepR, file = king % 8 + stepF;\n let passedPiece = false;\n while (rank >= 0 && rank < 8 && file >= 0 && file < 8) {\n const index = rank * 8 + file;\n const blocker = chess.board[index];\n if (index === move.from) passedPiece = true;\n else if (blocker) {\n const enemy = (blocker === blocker.toUpperCase() ? 'w' : 'b') !== chess.turn;\n const slider = (dr === 0 || df === 0 ? 'RQ' : 'BQ').includes(blocker.toUpperCase());\n if (passedPiece && enemy && slider) {\n return `${names[piece]} ${squareName(move.from)} is pinned by ${names[blocker.toUpperCase()].toLowerCase()} ${squareName(index)}; moving it exposes your king.`;\n }\n break;\n }\n rank += stepR;\n file += stepF;\n }\n }\n return `${names[piece]} ${squareName(move.from)} cannot move to ${to}: it would expose your king to check.`;\n}\n", "import { squareName, type Chess } from './index.js';\n\nconst names: Record<string, string> = { king: 'K', queen: 'Q', rook: 'R', bishop: 'B', knight: 'N', pawn: 'P' };\nexport const looksLikeNotation = (text: string): boolean => !/\\s/.test(text) && (/\\d/.test(text) || /^[O0]-[O0]/.test(text));\n\nfunction distance(a: string, b: string): number {\n let row = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 0; i < a.length; i++) {\n const next = [i + 1];\n for (let j = 0; j < b.length; j++) next.push(Math.min(next[j] + 1, row[j + 1] + 1, row[j] + Number(a[i] !== b[j])));\n row = next;\n }\n return row[b.length];\n}\n\n/** Rank only legal moves related to the requested piece, square or capture. */\nexport function suggestMoves(input: string, chess: Chess): string[] {\n const text = input.trim();\n const lower = text.toLowerCase();\n const notation = looksLikeNotation(text);\n const squares = lower.match(/[a-h][1-8]/g) || [];\n const destination = squares.at(-1);\n const source = squares.length > 1 ? squares[0] : undefined;\n const named = lower.match(/\\bwith (?:my |the |a )?(king|queen|rook|bishop|knight|pawn)\\b/)?.[1]\n || lower.match(/\\b(king|queen|rook|bishop|knight|pawn)\\b/)?.[1];\n const piece = named ? names[named] : notation && !/^[a-h][1-8][a-h][1-8]/.test(text)\n ? (/^[KQRBN]/.exec(text)?.[0] || (/^[a-h]/.test(text) ? 'P' : undefined)) : undefined;\n const capture = notation ? text.includes('x') : /\\b(take|takes|taking|capture|captures|capturing)\\b/.test(lower);\n const castle = /\\bcastl/.test(lower) || /^[O0]-[O0]/.test(text);\n if (!notation && !piece && !destination && !capture && !castle) return [];\n const legal = chess.moves();\n return legal.map(move => {\n const san = chess.san(move, legal);\n const from = squareName(move.from), to = squareName(move.to);\n const kind = chess.board[move.from]!.toUpperCase();\n if (piece && kind !== piece) return null;\n if (source && from !== source) return null;\n if (capture && !san.includes('x')) return null;\n if (castle && !san.startsWith('O-O')) return null;\n if (!notation && destination && to !== destination) return null;\n const uci = from + to + (move.promotion || '');\n const difference = Math.min(distance(text, san), distance(lower, uci));\n if (notation && difference > 2 && to !== destination) return null;\n return { san, score: (to === destination ? 20 : 0) + (from === source ? 10 : 0) - difference };\n }).filter((entry): entry is { san: string; score: number } => entry !== null)\n .sort((a, b) => b.score - a.score || a.san.localeCompare(b.san)).slice(0, 5).map(entry => entry.san);\n}\n\nexport function suggestionMessage(input: string, chess: Chess): string {\n const moves = suggestMoves(input, chess);\n return moves.length ? `No exact match. Try: ${moves.join(' \u00B7 ')}` : 'No matching legal move. Specify the piece and target square.';\n}\n", "import { squareName } from './index.js';\nimport type { Chess } from './index.js';\nimport { ResolutionError, type MoveResolver } from './resolution.js';\nimport { illegalMoveReason } from './legality.js';\nimport { looksLikeNotation, suggestionMessage } from './suggestions.js';\n\nexport type InputIntent =\n | { type:'empty' }\n | { type:'quit' }\n | { type:'help' }\n | { type:'undo' }\n | { type:'back' }\n | { type:'show-fen' }\n | { type:'load-fen'; value:string }\n | { type:'move'; value:string; source:'notation'|'jev'; fen?:string; explanation?:string };\n\n/** Parse local commands/notation; delegate all genuinely free-form text to JEV. */\nexport async function modelInput(raw:string, chess:Chess, server?:MoveResolver):Promise<InputIntent> {\n const text = String(raw).trim();\n const lower = text.toLowerCase();\n if (!text) return { type: 'empty' };\n if (/^\\/(quit|exit)$/.test(lower)) return { type: 'quit' };\n if (lower === '/help') return { type: 'help' };\n if (lower === '/undo') return { type: 'undo' };\n if (/^\\/(back|menu)$/.test(lower)) return { type: 'back' };\n if (/^\\/(fen|position)$/.test(lower)) return { type: 'show-fen' };\n if (/^\\/(fen|position)\\s+/.test(lower)) return { type: 'load-fen', value: text.replace(/^\\/(?:fen|position)\\s+/i, '').trim() };\n if (lower.startsWith('/')) throw new Error(`Unknown command: ${text}. Type /help to see commands.`);\n\n const legal = chess.moves();\n const normalized = text;\n const exact = legal.find(move => {\n const uci = squareName(move.from) + squareName(move.to) + (move.promotion || '');\n return uci === normalized || chess.san(move, legal) === normalized;\n });\n if (exact) return { type: 'move', value: squareName(exact.from) + squareName(exact.to) + (exact.promotion || ''), source: 'notation' };\n\n const reason = illegalMoveReason(text, chess);\n if (reason) throw new Error(reason);\n if (looksLikeNotation(text)) throw new Error(suggestionMessage(text, chess));\n\n if (!server) throw new Error('Chess server is required for natural-language input');\n let result;\n try { result = await server.resolve(text, chess); }\n catch (error) {\n if (error instanceof ResolutionError && error.status === 422) throw new Error(suggestionMessage(text, chess));\n throw error;\n }\n return { type: 'move', value: result.move, fen: result.fen, explanation: result.explanation, source: 'jev' };\n}\n", "import type { Chess } from './index.js';\n\n/** Undo through the player's most recent move, including any engine reply. */\nexport function undoTurn(chess: Chess, human: 'w' | 'b'): boolean {\n let index = chess.history.length - 1;\n while (index >= 0 && chess.history[index].before.turn !== human) index--;\n if (index < 0) return false;\n while (chess.history.length > index) chess.undo();\n return true;\n}\n\nexport function moveHistory(chess: Chess, width = 80): string {\n const groups: string[] = [];\n for (const entry of chess.history) {\n const { fullmove, turn } = entry.before;\n if (turn === 'w') groups.push(`${fullmove}. ${entry.san}`);\n else if (groups.length) groups[groups.length - 1] += ` ${entry.san}`;\n else groups.push(`${fullmove}\u2026 ${entry.san}`);\n }\n if (!groups.length) return 'Moves: \u2014';\n let clipped = false;\n while (groups.length > 1 && `Moves: ${clipped ? '\u2026 ' : ''}${groups.join(' ')}`.length > width) {\n groups.shift();\n clipped = true;\n }\n return `Moves: ${clipped ? '\u2026 ' : ''}${groups.join(' ')}`;\n}\n", "import type { Chess } from '@chess/chess';\nimport { ResolutionError, type MoveResult } from '@chess/chess/interaction';\nexport { ResolutionError, type MoveResult } from '@chess/chess/interaction';\nexport class ChessServerClient {\n constructor(private readonly baseUrl=process.env.CHESS_SERVER_URL||'http://localhost:8000', private readonly signal?:AbortSignal){}\n async resolve(text:string,chess:Chess):Promise<MoveResult>{return this.post('/api/resolve',{instruction:text,fen:chess.fen()});}\n private async post(path:string,body:unknown):Promise<MoveResult>{const response=await fetch(this.baseUrl.replace(/\\/$/,'')+path,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(body),signal:this.signal});if(!response.ok){\n const body = await response.json().catch(() => ({})) as {detail?:unknown};\n throw new ResolutionError(typeof body.detail === 'string' ? body.detail : `Chess server failed (${response.status})`, response.status);\n }return response.json() as Promise<MoveResult>;}\n}\n", "import type { Chess } from '@chess/chess';\n\nconst PIECES: Record<string, string> = {\n K: '\u265A', Q: '\u265B', R: '\u265C', B: '\u265D', N: '\u265E', P: '\u265F',\n k: '\u265A', q: '\u265B', r: '\u265C', b: '\u265D', n: '\u265E', p: '\u265F',\n};\nconst OUTLINES: Record<string, string> = { K: '\u2654', Q: '\u2655', R: '\u2656', B: '\u2657', N: '\u2658', P: '\u2659' };\nconst RESET = '\\x1b[0m';\ninterface RenderOptions { perspective?: 'w' | 'b'; last?: number[] | null; color?: boolean; compact?: boolean }\n\nexport function render(chess: Chess, { perspective = 'w', last = null, color = Boolean(process.stdout.isTTY), compact = false }: RenderOptions = {}): string {\n const rows = perspective === 'w' ? [0, 1, 2, 3, 4, 5, 6, 7] : [7, 6, 5, 4, 3, 2, 1, 0];\n const files = perspective === 'w' ? [0, 1, 2, 3, 4, 5, 6, 7] : [7, 6, 5, 4, 3, 2, 1, 0];\n const cellWidth = Math.max(6, Math.min(8, Math.floor(((process.stdout.columns || 80) - 8) / 8)));\n const cell = (content = ''): string => {\n const left = Math.floor((cellWidth - 1) / 2);\n return `${' '.repeat(left)}${content}${' '.repeat(cellWidth - left - (content ? 1 : 0))}`;\n };\n const green = (text: string): string => color ? `\\x1b[38;5;114m${text}${RESET}` : text;\n const border = green(` +${'-'.repeat(cellWidth * 8)}+`);\n const output = [border];\n\n for (const rank of rows) {\n for (const line of compact ? [1] : [0, 1, 2]) {\n let row = green(`${line === 1 ? ` ${8 - rank} ` : ' '}|`);\n for (const file of files) {\n const index = rank * 8 + file;\n const piece = chess.board[index];\n const white = piece !== null && piece === piece.toUpperCase();\n const glyph = piece ? (!color && white ? OUTLINES[piece] : PIECES[piece]) : ' ';\n let square = cell(line === 1 ? glyph : '');\n if (color) {\n const background = last?.includes(index) ? 107 : (rank + file) % 2 ? 65 : 108;\n square = `\\x1b[1;48;5;${background};38;5;${white ? 231 : 16}m${square}${RESET}`;\n } else if (!piece && line === 1) {\n square = cell((rank + file) % 2 ? '\u00B7' : '');\n }\n row += square;\n }\n output.push(row + green('|'));\n }\n }\n output.push(border);\n output.push(green(' ' + files.map(file => cell('abcdefgh'[file])).join('')));\n output.push(color\n ? ` \\x1b[1;38;5;231m\u265A White${RESET} ${green('\u265A Black \u00B7 dark pieces')}`\n : ' \u2654 White \u265A Black');\n return output.join('\\n') + '\\n';\n}\n", "import { createRequire } from 'node:module';\nimport type { Chess } from '@chess/chess';\nimport piecesData from '@chess/chess/pieces' with { type: 'json' };\n\nconst require = createRequire(import.meta.url);\nconst pieces = piecesData as Record<string, string>;\nconst IMAGE_ID = 73191;\nexport type GraphicsMode = 'auto' | 'kitty' | 'text';\n\nexport function supportsGraphics(mode: GraphicsMode, tty = Boolean(process.stdout.isTTY), env = process.env): boolean {\n if (!tty || mode === 'text') return false;\n if (mode === 'kitty') return true;\n if (env.TMUX || env.STY) return false;\n return env.TERM_PROGRAM === 'ghostty' || env.TERM === 'xterm-ghostty' || env.TERM === 'xterm-kitty';\n}\n\nexport function boardSvg(chess: Chess, perspective: 'w' | 'b', last: number[] | null): string {\n const order = perspective === 'w' ? [0, 1, 2, 3, 4, 5, 6, 7] : [7, 6, 5, 4, 3, 2, 1, 0];\n const svg = ['<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"768\" height=\"768\" viewBox=\"0 0 768 768\">',\n '<rect width=\"768\" height=\"768\" rx=\"12\" fill=\"#14291f\"/>'];\n for (const [y, rank] of order.entries()) {\n for (const [x, file] of order.entries()) {\n const index = rank * 8 + file;\n const left = 24 + x * 90, top = 24 + y * 90;\n const fill = last?.includes(index) ? '#b4cf68' : (rank + file) % 2 ? '#64916d' : '#d5e5cb';\n svg.push(`<rect x=\"${left}\" y=\"${top}\" width=\"90\" height=\"90\" fill=\"${fill}\"/>`);\n const piece = chess.board[index];\n if (piece) svg.push(`<g transform=\"translate(${left} ${top}) scale(2)\">${pieces[piece]}</g>`);\n }\n svg.push(`<text x=\"12\" y=\"${24 + y * 90 + 50}\" text-anchor=\"middle\" font-size=\"16\" font-family=\"sans-serif\" fill=\"#d5e5cb\">${8 - rank}</text>`);\n }\n for (const [x, file] of order.entries()) {\n svg.push(`<text x=\"${24 + x * 90 + 45}\" y=\"762\" text-anchor=\"middle\" font-size=\"16\" font-family=\"sans-serif\" fill=\"#d5e5cb\">${'abcdefgh'[file]}</text>`);\n }\n svg.push('</svg>');\n return svg.join('');\n}\n\nexport function boardPng(chess: Chess, perspective: 'w' | 'b', last: number[] | null): Buffer {\n const { Resvg } = require('@resvg/resvg-js') as typeof import('@resvg/resvg-js');\n return new Resvg(boardSvg(chess, perspective, last)).render().asPng();\n}\n\nexport function renderGraphics(chess: Chess, perspective: 'w' | 'b', last: number[] | null, fixed = false): string {\n // The supplied Ghostty screenshot shows that this terminal's cells are a\n // little narrower than the usual 2:1 estimate. Use a 2.2:1 placement so the\n // rendered board squares do not appear tall.\n const columnsPerRow = 2.2;\n const availableRows = Math.max(1, (process.stdout.rows || 40) - (fixed ? 8 : 7));\n const availableColumns = Math.max(2, (process.stdout.columns || 80) - 2);\n const rows = Math.max(1, Math.min(32, availableRows, Math.floor(availableColumns / columnsPerRow)));\n const columns = Math.min(availableColumns, Math.round(rows * columnsPerRow));\n const data = boardPng(chess, perspective, last).toString('base64');\n // Reserve room first: images anchored near the bottom must not cover the prompt.\n let output = `\\x1b_Ga=d,d=I,i=${IMAGE_ID},q=2;\\x1b\\\\`;\n if (!fixed) output += '\\n'.repeat(rows) + `\\x1b[${rows}A\\r`;\n for (let offset = 0; offset < data.length; offset += 4096) {\n const chunk = data.slice(offset, offset + 4096);\n const more = offset + 4096 < data.length ? 1 : 0;\n const control = offset === 0 ? `a=T,f=100,t=d,i=${IMAGE_ID},c=${columns},r=${rows},C=1,q=2,` : '';\n output += `\\x1b_G${control}m=${more};${chunk}\\x1b\\\\`;\n }\n return output + `\\x1b[${rows}B\\r`;\n}\n", "{\n \"b\": \"<g id=\\\"black-bishop\\\" class=\\\"black bishop\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 36c3.39-.97 10.11.43 13.5-2 3.39 2.43 10.11 1.03 13.5 2 0 0 1.65.54 3 2-.68.97-1.65.99-3 .5-3.39-.97-10.11.46-13.5-1-3.39 1.46-10.11.03-13.5 1-1.354.49-2.323.47-3-.5 1.354-1.94 3-2 3-2zm6-4c2.5 2.5 12.5 2.5 15 0 .5-1.5 0-2 0-2 0-2.5-2.5-4-2.5-4 5.5-1.5 6-11.5-5-15.5-11 4-10.5 14-5 15.5 0 0-2.5 1.5-2.5 4 0 0-.5.5 0 2zM25 8a2.5 2.5 0 1 1-5 0 2.5 2.5 0 1 1 5 0z\\\" fill=\\\"#000\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M17.5 26h10M15 30h15m-7.5-14.5v5M20 18h5\\\" stroke=\\\"#fff\\\" stroke-linejoin=\\\"miter\\\"/></g>\",\n \"k\": \"<g id=\\\"black-king\\\" class=\\\"black king\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M22.5 11.63V6\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M22.5 25s4.5-7.5 3-10.5c0 0-1-2.5-3-2.5s-3 2.5-3 2.5c-1.5 3 3 10.5 3 10.5\\\" fill=\\\"#000\\\" stroke-linecap=\\\"butt\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M11.5 37c5.5 3.5 15.5 3.5 21 0v-7s9-4.5 6-10.5c-4-6.5-13.5-3.5-16 4V27v-3.5c-3.5-7.5-13-10.5-16-4-3 6 5 10 5 10V37z\\\" fill=\\\"#000\\\"/><path d=\\\"M20 8h5\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M32 29.5s8.5-4 6.03-9.65C34.15 14 25 18 22.5 24.5l.01 2.1-.01-2.1C20 18 9.906 14 6.997 19.85c-2.497 5.65 4.853 9 4.853 9M11.5 30c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0\\\" stroke=\\\"#fff\\\"/></g>\",\n \"n\": \"<g id=\\\"black-knight\\\" class=\\\"black knight\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M 22,10 C 32.5,11 38.5,18 38,39 L 15,39 C 15,30 25,32.5 23,18\\\" style=\\\"fill:#000000; stroke:#000000;\\\"/><path d=\\\"M 24,18 C 24.38,20.91 18.45,25.37 16,27 C 13,29 13.18,31.34 11,31 C 9.958,30.06 12.41,27.96 11,28 C 10,28 11.19,29.23 10,30 C 9,30 5.997,31 6,26 C 6,24 12,14 12,14 C 12,14 13.89,12.1 14,10.5 C 13.27,9.506 13.5,8.5 13.5,7.5 C 14.5,6.5 16.5,10 16.5,10 L 18.5,10 C 18.5,10 19.28,8.008 21,7 C 22,7 22,10 22,10\\\" style=\\\"fill:#000000; stroke:#000000;\\\"/><path d=\\\"M 9.5 25.5 A 0.5 0.5 0 1 1 8.5,25.5 A 0.5 0.5 0 1 1 9.5 25.5 z\\\" style=\\\"fill:#ececec; stroke:#ececec;\\\"/><path d=\\\"M 15 15.5 A 0.5 1.5 0 1 1 14,15.5 A 0.5 1.5 0 1 1 15 15.5 z\\\" transform=\\\"matrix(0.866,0.5,-0.5,0.866,9.693,-5.173)\\\" style=\\\"fill:#ececec; stroke:#ececec;\\\"/><path d=\\\"M 24.55,10.4 L 24.1,11.85 L 24.6,12 C 27.75,13 30.25,14.49 32.5,18.75 C 34.75,23.01 35.75,29.06 35.25,39 L 35.2,39.5 L 37.45,39.5 L 37.5,39 C 38,28.94 36.62,22.15 34.25,17.66 C 31.88,13.17 28.46,11.02 25.06,10.5 L 24.55,10.4 z \\\" style=\\\"fill:#ececec; stroke:none;\\\"/></g>\",\n \"p\": \"<g id=\\\"black-pawn\\\" class=\\\"black pawn\\\"><path d=\\\"M22.5 9c-2.21 0-4 1.79-4 4 0 .89.29 1.71.78 2.38C17.33 16.5 16 18.59 16 21c0 2.03.94 3.84 2.41 5.03-3 1.06-7.41 5.55-7.41 13.47h23c0-7.92-4.41-12.41-7.41-13.47 1.47-1.19 2.41-3 2.41-5.03 0-2.41-1.33-4.5-3.28-5.62.49-.67.78-1.49.78-2.38 0-2.21-1.79-4-4-4z\\\" fill=\\\"#000\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/></g>\",\n \"q\": \"<g id=\\\"black-queen\\\" class=\\\"black queen\\\" fill=\\\"#000\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><g fill=\\\"#000\\\" stroke=\\\"none\\\"><circle cx=\\\"6\\\" cy=\\\"12\\\" r=\\\"2.75\\\"/><circle cx=\\\"14\\\" cy=\\\"9\\\" r=\\\"2.75\\\"/><circle cx=\\\"22.5\\\" cy=\\\"8\\\" r=\\\"2.75\\\"/><circle cx=\\\"31\\\" cy=\\\"9\\\" r=\\\"2.75\\\"/><circle cx=\\\"39\\\" cy=\\\"12\\\" r=\\\"2.75\\\"/></g><path d=\\\"M9 26c8.5-1.5 21-1.5 27 0l2.5-12.5L31 25l-.3-14.1-5.2 13.6-3-14.5-3 14.5-5.2-13.6L14 25 6.5 13.5 9 26zM9 26c0 2 1.5 2 2.5 4 1 1.5 1 1 .5 3.5-1.5 1-1.5 2.5-1.5 2.5-1.5 1.5.5 2.5.5 2.5 6.5 1 16.5 1 23 0 0 0 1.5-1 0-2.5 0 0 .5-1.5-1-2.5-.5-2.5-.5-2 .5-3.5 1-2 2.5-2 2.5-4-8.5-1.5-18.5-1.5-27 0z\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M11 38.5a35 35 1 0 0 23 0\\\" fill=\\\"none\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M11 29a35 35 1 0 1 23 0M12.5 31.5h20M11.5 34.5a35 35 1 0 0 22 0M10.5 37.5a35 35 1 0 0 24 0\\\" fill=\\\"none\\\" stroke=\\\"#fff\\\"/></g>\",\n \"r\": \"<g id=\\\"black-rook\\\" class=\\\"black rook\\\" fill=\\\"#000\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 39h27v-3H9v3zM12.5 32l1.5-2.5h17l1.5 2.5h-20zM12 36v-4h21v4H12z\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M14 29.5v-13h17v13H14z\\\" stroke-linecap=\\\"butt\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M14 16.5L11 14h23l-3 2.5H14zM11 14V9h4v2h5V9h5v2h5V9h4v5H11z\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M12 35.5h21M13 31.5h19M14 29.5h17M14 16.5h17M11 14h23\\\" fill=\\\"none\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1\\\" stroke-linejoin=\\\"miter\\\"/></g>\",\n \"B\": \"<g id=\\\"white-bishop\\\" class=\\\"white bishop\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><g fill=\\\"#fff\\\" stroke-linecap=\\\"butt\\\"><path d=\\\"M9 36c3.39-.97 10.11.43 13.5-2 3.39 2.43 10.11 1.03 13.5 2 0 0 1.65.54 3 2-.68.97-1.65.99-3 .5-3.39-.97-10.11.46-13.5-1-3.39 1.46-10.11.03-13.5 1-1.354.49-2.323.47-3-.5 1.354-1.94 3-2 3-2zM15 32c2.5 2.5 12.5 2.5 15 0 .5-1.5 0-2 0-2 0-2.5-2.5-4-2.5-4 5.5-1.5 6-11.5-5-15.5-11 4-10.5 14-5 15.5 0 0-2.5 1.5-2.5 4 0 0-.5.5 0 2zM25 8a2.5 2.5 0 1 1-5 0 2.5 2.5 0 1 1 5 0z\\\"/></g><path d=\\\"M17.5 26h10M15 30h15m-7.5-14.5v5M20 18h5\\\" stroke-linejoin=\\\"miter\\\"/></g>\",\n \"K\": \"<g id=\\\"white-king\\\" class=\\\"white king\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M22.5 11.63V6M20 8h5\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M22.5 25s4.5-7.5 3-10.5c0 0-1-2.5-3-2.5s-3 2.5-3 2.5c-1.5 3 3 10.5 3 10.5\\\" fill=\\\"#fff\\\" stroke-linecap=\\\"butt\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M11.5 37c5.5 3.5 15.5 3.5 21 0v-7s9-4.5 6-10.5c-4-6.5-13.5-3.5-16 4V27v-3.5c-3.5-7.5-13-10.5-16-4-3 6 5 10 5 10V37z\\\" fill=\\\"#fff\\\"/><path d=\\\"M11.5 30c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0\\\"/></g>\",\n \"N\": \"<g id=\\\"white-knight\\\" class=\\\"white knight\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M 22,10 C 32.5,11 38.5,18 38,39 L 15,39 C 15,30 25,32.5 23,18\\\" style=\\\"fill:#ffffff; stroke:#000000;\\\"/><path d=\\\"M 24,18 C 24.38,20.91 18.45,25.37 16,27 C 13,29 13.18,31.34 11,31 C 9.958,30.06 12.41,27.96 11,28 C 10,28 11.19,29.23 10,30 C 9,30 5.997,31 6,26 C 6,24 12,14 12,14 C 12,14 13.89,12.1 14,10.5 C 13.27,9.506 13.5,8.5 13.5,7.5 C 14.5,6.5 16.5,10 16.5,10 L 18.5,10 C 18.5,10 19.28,8.008 21,7 C 22,7 22,10 22,10\\\" style=\\\"fill:#ffffff; stroke:#000000;\\\"/><path d=\\\"M 9.5 25.5 A 0.5 0.5 0 1 1 8.5,25.5 A 0.5 0.5 0 1 1 9.5 25.5 z\\\" style=\\\"fill:#000000; stroke:#000000;\\\"/><path d=\\\"M 15 15.5 A 0.5 1.5 0 1 1 14,15.5 A 0.5 1.5 0 1 1 15 15.5 z\\\" transform=\\\"matrix(0.866,0.5,-0.5,0.866,9.693,-5.173)\\\" style=\\\"fill:#000000; stroke:#000000;\\\"/></g>\",\n \"P\": \"<g id=\\\"white-pawn\\\" class=\\\"white pawn\\\"><path d=\\\"M22.5 9c-2.21 0-4 1.79-4 4 0 .89.29 1.71.78 2.38C17.33 16.5 16 18.59 16 21c0 2.03.94 3.84 2.41 5.03-3 1.06-7.41 5.55-7.41 13.47h23c0-7.92-4.41-12.41-7.41-13.47 1.47-1.19 2.41-3 2.41-5.03 0-2.41-1.33-4.5-3.28-5.62.49-.67.78-1.49.78-2.38 0-2.21-1.79-4-4-4z\\\" fill=\\\"#fff\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/></g>\",\n \"Q\": \"<g id=\\\"white-queen\\\" class=\\\"white queen\\\" fill=\\\"#fff\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M8 12a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM24.5 7.5a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM41 12a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM16 8.5a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM33 9a2 2 0 1 1-4 0 2 2 0 1 1 4 0z\\\"/><path d=\\\"M9 26c8.5-1.5 21-1.5 27 0l2-12-7 11V11l-5.5 13.5-3-15-3 15-5.5-14V25L7 14l2 12zM9 26c0 2 1.5 2 2.5 4 1 1.5 1 1 .5 3.5-1.5 1-1.5 2.5-1.5 2.5-1.5 1.5.5 2.5.5 2.5 6.5 1 16.5 1 23 0 0 0 1.5-1 0-2.5 0 0 .5-1.5-1-2.5-.5-2.5-.5-2 .5-3.5 1-2 2.5-2 2.5-4-8.5-1.5-18.5-1.5-27 0z\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M11.5 30c3.5-1 18.5-1 22 0M12 33.5c6-1 15-1 21 0\\\" fill=\\\"none\\\"/></g>\",\n \"R\": \"<g id=\\\"white-rook\\\" class=\\\"white rook\\\" fill=\\\"#fff\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 39h27v-3H9v3zM12 36v-4h21v4H12zM11 14V9h4v2h5V9h5v2h5V9h4v5\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M34 14l-3 3H14l-3-3\\\"/><path d=\\\"M31 17v12.5H14V17\\\" stroke-linecap=\\\"butt\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M31 29.5l1.5 2.5h-20l1.5-2.5\\\"/><path d=\\\"M11 14h23\\\" fill=\\\"none\\\" stroke-linejoin=\\\"miter\\\"/></g>\"\n}\n", "import { spawn } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport { createInterface } from 'node:readline';\nimport { Chess } from '@chess/chess';\n\nconst require = createRequire(import.meta.url);\nconst stockfish = require('stockfish') as { findEngine(flavor: string): string };\n\n/** Run the bundled engine in a separate process so search never blocks the CLI. */\nexport async function engineMove(fen: string, elo: number, depth: number, signal?: AbortSignal): Promise<string> {\n if (!Number.isInteger(elo) || elo < 1320 || elo > 3190) throw new Error('ELO must be an integer from 1320 to 3190.');\n if (!Number.isInteger(depth) || depth < 1 || depth > 30) throw new Error('Depth must be an integer from 1 to 30.');\n signal?.throwIfAborted();\n const position = new Chess(fen);\n if (position.status()) throw new Error('The game is over.');\n\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [stockfish.findEngine('single')], { stdio: ['pipe', 'pipe', 'ignore'] });\n const lines = createInterface({ input: child.stdout });\n let settled = false;\n const finish = (error?: Error, move?: string): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', cancel);\n lines.close();\n child.kill();\n if (error) reject(error);\n else resolve(move!);\n };\n const timer = setTimeout(() => finish(new Error('Stockfish timed out. Try a lower --depth.')), 60_000);\n const cancel = (): void => finish(new Error('Stockfish search cancelled.'));\n signal?.addEventListener('abort', cancel, { once: true });\n child.on('error', error => finish(new Error(`Could not start bundled Stockfish: ${error.message}`)));\n child.stdin.on('error', error => finish(error));\n child.on('exit', () => finish(new Error('Stockfish exited before returning a move.')));\n lines.on('line', line => {\n if (line === 'uciok') {\n child.stdin.write(`setoption name UCI_LimitStrength value true\\nsetoption name UCI_Elo value ${elo}\\nisready\\n`);\n } else if (line === 'readyok') {\n child.stdin.write(`position fen ${fen}\\ngo depth ${depth}\\n`);\n } else if (line.startsWith('bestmove ')) {\n const move = line.split(/\\s+/)[1];\n try {\n position.play(move);\n finish(undefined, move);\n } catch {\n finish(new Error('Stockfish returned an invalid move.'));\n }\n }\n });\n child.stdin.write('uci\\n');\n });\n}\n", "import { stdout } from 'node:process';\n\ninterface Output {\n columns?: number;\n rows?: number;\n write(text: string): unknown;\n}\n\n/** Keep game frames out of shell scrollback and restore the shell on exit. */\nexport class GameScreen {\n private opened = false;\n private cursorStyled = false;\n constructor(readonly active: boolean, private readonly output: Output = stdout, private readonly manageScreen = true) {}\n\n open(): void {\n if (this.active && this.manageScreen && !this.opened) {\n this.output.write('\\x1b[?1049h');\n this.opened = true;\n }\n }\n\n draw(header: string, board: string, status: string, moves = ''): void {\n if (!this.active) {\n this.output.write(`${header}\\n${moves}\\n\\n${board}\\n${status}\\n`);\n return;\n }\n const width = Math.max(1, (this.output.columns || 80) - 1);\n const fit = (text: string): string => [...text.replace(/[\\x00-\\x1f\\x7f]/g, ' ')].slice(0, width).join('');\n // Synchronized output prevents a visible blank frame between positions.\n const title = `\\x1b[38;2;224;242;215m${fit(header).padEnd(width)}\\x1b[0m`;\n const history = `\\x1b[38;2;190;221;173m${fit(moves).padEnd(width)}\\x1b[0m`;\n const horizontalPadding = Math.min(1, Math.floor((width - 1) / 2));\n const innerWidth = Math.max(1, width - horizontalPadding * 2);\n const controls = '/help';\n const visibleControls = controls.slice(-Math.min(innerWidth, controls.length));\n const statusWidth = Math.max(0, innerWidth - visibleControls.length);\n const footer = `\\x1b[38;2;224;242;215m${' '.repeat(horizontalPadding)}${fit(status).slice(0, statusWidth).padEnd(statusWidth)}${visibleControls}${' '.repeat(horizontalPadding + 1)}\\x1b[0m`;\n const bottom = Math.max(6, this.output.rows || 40);\n this.output.write('\\x1b[?2026h\\x1b[H\\x1b[2J' +\n `${title}\\r\\n${history}\\r\\n\\r\\n${board}\\x1b[${bottom - 4};1H${footer}` +\n this.inputFrame('', 'Type any moves e.g. e4 or e pawn up 2') + '\\x1b[?2026l');\n }\n\n input(value: string, placeholder = 'Type any moves e.g. e4 or e pawn up 2'): void {\n if (this.active) this.output.write(this.inputFrame(value, placeholder));\n }\n\n private inputFrame(value: string, placeholder: string): string {\n const width = Math.max(1, (this.output.columns || 80) - 1);\n const bottom = Math.max(6, this.output.rows || 40);\n const visible = [...value].slice(-Math.max(0, width - 4)).join('');\n const foreground = value ? '\\x1b[38;2;235;248;226m' : '\\x1b[38;2;139;168;144m';\n const horizontalPadding = 1;\n const fieldTextWidth = Math.max(0, width - horizontalPadding - 2);\n const shown = value\n ? [...visible].slice(-fieldTextWidth).join('')\n : [...placeholder].slice(0, Math.max(0, fieldTextWidth - 1)).join('');\n const prefix = ' ';\n const displayed = value ? shown : ` ${shown}`;\n const background = '\\x1b[48;2;12;42;34m';\n const paddingRow = `${background}${' '.repeat(width + 1)}\\x1b[0m`;\n const row = `${background}\\x1b[38;2;190;221;173m${prefix}${foreground}${displayed}${' '.repeat(Math.max(0, width + 1 - prefix.length - [...displayed].length))}\\x1b[0m`;\n const cursor = value ? Math.min(width, prefix.length + [...shown].length + 1) : 2;\n this.cursorStyled = true;\n return `\\x1b[${bottom - 2};1H${paddingRow}` +\n `\\x1b[${bottom - 1};1H${row}` +\n `\\x1b[${bottom};1H${paddingRow}\\x1b[${bottom - 1};${cursor}H\\x1b[5 q\\x1b[?25h`;\n }\n\n close(): void {\n if (this.cursorStyled) {\n this.output.write('\\x1b[0 q');\n this.cursorStyled = false;\n }\n if (this.opened) {\n this.output.write('\\x1b[?2026l\\x1b[?25h\\x1b[?1049l');\n this.opened = false;\n }\n }\n}\n\n/** Full-screen start and load menus that replace one another without scrollback. */\nexport class MenuScreen {\n private opened = false;\n constructor(readonly active: boolean, private readonly output: Output = stdout) {}\n\n open(): void {\n if (this.active && !this.opened) {\n this.output.write('\\x1b[?1049h\\x1b[?25l');\n this.opened = true;\n }\n }\n\n draw(header: string, content: string, footer: string): void {\n const width = Math.max(1, (this.output.columns || 80) - 1);\n const fit = (text: string): string => [...text.replace(/[\\x00-\\x1f\\x7f]/g, ' ')].slice(0, width).join('');\n if (!this.active) {\n this.output.write(`${header}\\n${content}\\n${footer}\\n`);\n return;\n }\n const title = `\\x1b[38;2;224;242;215m${fit(header).padEnd(width)}\\x1b[0m`;\n const horizontalPadding = Math.min(2, Math.floor((width - 1) / 2));\n const status = `\\x1b[38;2;210;225;202m${' '.repeat(horizontalPadding)}${fit(footer).slice(0, width - horizontalPadding * 2).padEnd(width - horizontalPadding * 2)}${' '.repeat(horizontalPadding)}\\x1b[0m`;\n const body = content.split('\\n').map(line => fit(line)).join('\\r\\n');\n this.output.write(`\\x1b[?25l\\x1b[?2026h\\x1b[H\\x1b[2J${title}\\r\\n\\r\\n${body}\\r\\n\\r\\n${status}\\r\\n\\x1b[?2026l`);\n }\n\n close(): void {\n if (this.opened) {\n this.output.write('\\x1b[?25h\\x1b[?1049l');\n this.opened = false;\n }\n }\n}\n", "import { DatabaseSync } from 'node:sqlite';\nimport { mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface SavedGame {\n id: number;\n createdAt: string;\n updatedAt: string;\n elo: number;\n color: 'w' | 'b';\n startFen: string;\n fen: string;\n moves: string[];\n status: string;\n}\n\nexport class GameStore {\n private readonly db: DatabaseSync;\n\n constructor(path = process.env.CHESS_DB_PATH || join(process.env.XDG_DATA_HOME || join(homedir(), '.local', 'share'), 'chess', 'games.sqlite')) {\n mkdirSync(dirname(path), { recursive: true });\n this.db = new DatabaseSync(path);\n this.db.exec(`\n PRAGMA journal_mode = WAL;\n CREATE TABLE IF NOT EXISTS games (\n id INTEGER PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n elo INTEGER NOT NULL,\n color TEXT NOT NULL CHECK (color IN ('w', 'b')),\n start_fen TEXT NOT NULL,\n fen TEXT NOT NULL,\n moves TEXT NOT NULL,\n status TEXT NOT NULL\n );\n `);\n }\n\n save(game: Omit<SavedGame, 'id' | 'createdAt' | 'updatedAt'>, id?: number): number {\n const now = new Date().toISOString();\n if (id === undefined) {\n const result = this.db.prepare(`INSERT INTO games (created_at, updated_at, elo, color, start_fen, fen, moves, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(now, now, game.elo, game.color, game.startFen, game.fen, JSON.stringify(game.moves), game.status);\n return Number(result.lastInsertRowid);\n }\n this.db.prepare(`UPDATE games SET updated_at = ?, elo = ?, color = ?, start_fen = ?, fen = ?, moves = ?, status = ? WHERE id = ?`)\n .run(now, game.elo, game.color, game.startFen, game.fen, JSON.stringify(game.moves), game.status, id);\n return id;\n }\n\n list(): SavedGame[] {\n const rows = this.db.prepare('SELECT * FROM games ORDER BY updated_at DESC').all() as Array<Record<string, unknown>>;\n return rows.map(row => this.decode(row));\n }\n\n get(id: number): SavedGame | undefined {\n const row = this.db.prepare('SELECT * FROM games WHERE id = ?').get(id) as Record<string, unknown> | undefined;\n return row ? this.decode(row) : undefined;\n }\n\n close(): void { this.db.close(); }\n\n private decode(row: Record<string, unknown>): SavedGame {\n return {\n id: Number(row.id), createdAt: String(row.created_at), updatedAt: String(row.updated_at),\n elo: Number(row.elo), color: row.color === 'b' ? 'b' : 'w', startFen: String(row.start_fen), fen: String(row.fen),\n moves: JSON.parse(String(row.moves)) as string[], status: String(row.status),\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { createInterface } from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport { Chess, START_FEN } from '@zchess/chess';\nimport { modelInput } from './input.js';\nimport { ChessServerClient } from './api.js';\nimport { render } from './ui.js';\nimport { renderGraphics, supportsGraphics, type GraphicsMode } from './graphics.js';\nimport { engineMove } from './engine.js';\nimport { GameScreen, MenuScreen } from './screen.js';\nimport { moveHistory, undoTurn } from './history.js';\nimport { GameStore, type SavedGame } from './store.js';\nimport type { Key } from 'node:readline';\n\nconst HELP = `chess \u2014 terminal chess\n\nUsage: chess [--elo 1500] [--color white|black] [--fen FEN]\n [--server URL] [--depth 12] [--graphics auto|kitty|text]\n\nRun \"chess\" with no options to open the Play / Load game menu.\nMoves accept UCI (e2e4), SAN (Nf3), or free text (\"move the queen up by 1\").\nStockfish is included and runs locally. Only free text requires the Chess server.\nGames are saved automatically in ~/.local/share/zchess/games.sqlite.\nCommands: /fen, /fen <position>, /undo, /help, /back, /quit`;\n\nexport function commandHelp(): string {\n return [\n 'COMMANDS',\n '/help Show this list',\n '/undo Take back a turn',\n '/fen Show the current position',\n '/fen <FEN> Load a position',\n '/back Return to the previous screen',\n '/quit Quit Chess',\n '',\n 'SHORTCUTS',\n 'Ctrl+C Quit',\n 'Ctrl+U Clear input',\n ].join('\\n');\n}\n\nexport function editGameInput(value: string, text: string, key: Key): string {\n if ((key?.ctrl && key.name === 'u') || (key?.meta && key.name === 'backspace')) return '';\n if (key?.name === 'backspace') return [...value].slice(0, -1).join('');\n if (!key?.ctrl && !key?.meta && text && !/[\\x00-\\x1f\\x7f]/.test(text)) return value + text;\n return value;\n}\n\nconst promptColor = '\\x1b[38;2;190;221;173m';\nconst reset = '\\x1b[0m';\nconst ELO_PRESETS = [\n { label: 'Beginner', elo: 1320 },\n { label: 'Intermediate', elo: 1500 },\n { label: 'Advanced', elo: 1800 },\n { label: 'Expert', elo: 2200 },\n { label: 'Master', elo: 3190 },\n];\ninterface GameConfig { elo: number; human: 'w' | 'b'; saved?: SavedGame; fen?: string }\n\nexport async function run(args: string[]): Promise<void> {\n if (args.includes('--help') || args.includes('-h')) { console.log(HELP); return; }\n const get = (name: string, fallback: string | undefined): string | undefined => {\n const index = args.indexOf(name);\n return index < 0 ? fallback : (args[index + 1] ?? fallback);\n };\n const graphics = get('--graphics', 'auto') as GraphicsMode;\n if (!['auto', 'kitty', 'text'].includes(graphics)) throw new Error('Graphics must be auto, kitty, or text.');\n const depth = Number(get('--depth', '12'));\n if (!Number.isInteger(depth) || depth < 1 || depth > 30) throw new Error('Depth must be an integer from 1 to 30.');\n const store = new GameStore(get('--db', undefined));\n const direct = args.some(arg => arg.startsWith('--'));\n const interactiveMenu = !direct && stdin.isTTY && stdout.isTTY;\n const menuScreen = interactiveMenu ? new MenuScreen(true) : undefined;\n menuScreen?.open();\n\n try {\n let keepGoing = true;\n let returnToSavedGames = false;\n while (keepGoing) {\n let config: GameConfig | undefined;\n if (direct || !stdin.isTTY || !stdout.isTTY) {\n const elo = Number(get('--elo', '1500'));\n if (!Number.isInteger(elo) || elo < 1320 || elo > 3190) throw new Error('ELO must be an integer from 1320 to 3190 (Stockfish UCI range).');\n config = { elo, human: get('--color', 'white')!.toLowerCase().startsWith('b') ? 'b' : 'w', fen: get('--fen', undefined) };\n keepGoing = false;\n } else {\n const choice = await mainMenu(store, menuScreen!, returnToSavedGames);\n returnToSavedGames = false;\n if (choice === 'quit') break;\n config = choice;\n }\n if (config) {\n const again = await playGame(config, { graphics, depth, serverUrl: get('--server', process.env.ZCHESS_SERVER_URL || 'http://localhost:8000')!, store, sharedScreen: interactiveMenu });\n if (again && config.saved) returnToSavedGames = true;\n if (direct || !again) keepGoing = false;\n }\n }\n } finally { menuScreen?.close(); store.close(); }\n}\n\nasync function mainMenu(store: GameStore, screen: MenuScreen, openSavedGames = false): Promise<GameConfig | 'quit'> {\n const rl = createInterface({ input: stdin, output: stdout });\n try {\n while (true) {\n if (openSavedGames) {\n openSavedGames = false;\n const game = await savedGamesMenu(store, screen);\n if (game === 'quit') return 'quit';\n if (game) return game;\n continue;\n }\n screen.draw('ZCHESS / LOCAL STOCKFISH', ' 1 Play\\n 2 Load a saved game\\n 3 Quit', '');\n const choice = await menuKey('Select \u203A ', ['1', '2', '3']);\n if (choice === 'q') return 'quit';\n if (choice === 'b') continue;\n if (choice === '3') return 'quit';\n if (choice === '1') {\n const game = await newGameMenu(screen);\n if (game === 'quit') return 'quit';\n if (game) return game;\n }\n if (choice === '2' || choice === 'load') {\n const game = await savedGamesMenu(store, screen);\n if (game === 'quit') return 'quit';\n if (game) return game;\n }\n }\n } finally { rl.close(); }\n}\n\nasync function savedGamesMenu(store: GameStore, screen: MenuScreen): Promise<GameConfig | 'quit' | null> {\n const games = store.list();\n if (!games.length) {\n screen.draw('LOAD A SAVED GAME', 'No saved games yet.\\n\\n 1 Back\\n 2 Quit', '');\n const action = await menuKey('Select \u203A ', ['1', '2']);\n return action === '2' || action === 'q' ? 'quit' : null;\n }\n const recent = games.slice(0, 7);\n const lines = recent.map((game, index) => ` ${index + 1} ${game.updatedAt.slice(0, 16).replace('T', ' ')} \u00B7 ${game.elo} ELO \u00B7 ${game.moves.length ? game.moves.join(' ') : 'New game'} \u00B7 ${game.status}`);\n if (games.length > recent.length) lines.push(' Showing the 7 most recent games.');\n const backChoice = recent.length + 1;\n const quitChoice = recent.length + 2;\n lines.push(` ${backChoice} Back`, ` ${quitChoice} Quit`);\n screen.draw('LOAD A SAVED GAME', lines.join('\\n'), '');\n const selection = await menuKey('Choose a game \u203A ', Array.from({ length: quitChoice }, (_, index) => String(index + 1)));\n if (selection === 'q') return 'quit';\n if (Number(selection) === backChoice) return null;\n if (Number(selection) === quitChoice) return 'quit';\n const game = recent[Number(selection) - 1];\n return game ? { elo: game.elo, human: game.color, saved: game } : null;\n}\n\nasync function newGameMenu(screen: MenuScreen): Promise<GameConfig | null | 'quit'> {\n const choices = ELO_PRESETS.map(({ label, elo }, index) => ` ${index + 1} ${label} \u00B7 ${elo} ELO`);\n choices.push(' 6 Custom ELO');\n choices.push(' 7 Back', ' 8 Quit');\n screen.draw('NEW GAME / STOCKFISH STRENGTH', `${choices.join('\\n')}\\n\\nAvailable range: 1320\u20133190 ELO`, '');\n const selection = await menuKey('ELO \u203A ', ['1', '2', '3', '4', '5', '6', '7', '8']);\n if (selection === 'q') return 'quit';\n if (selection === '7') return null;\n if (selection === '8') return 'quit';\n let elo = ELO_PRESETS[Number(selection) - 1]?.elo;\n if (selection === '6') {\n let custom: number;\n while (true) {\n screen.draw('NEW GAME / CUSTOM ELO', 'Enter any ELO from 1320 to 3190.\\n\\n 0 Back\\n 00 Quit', '');\n const value = await menuText('ELO \u203A ');\n if (value === 'q') return 'quit';\n if (value === 'b' || value === null) return await newGameMenu(screen);\n custom = Number(value);\n if (Number.isInteger(custom) && custom >= 1320 && custom <= 3190) break;\n screen.draw('NEW GAME / CUSTOM ELO', 'Enter an ELO from 1320 to 3190.\\nThat value is outside the range.\\n\\n 0 Back\\n 00 Quit', '');\n }\n elo = custom;\n }\n if (elo === undefined) return null;\n while (true) {\n screen.draw('NEW GAME / CHOOSE SIDE', `Stockfish ${elo} ELO\\n\\n 1 White\\n 2 Black\\n 3 Random\\n 4 Back\\n 5 Quit`, '');\n const side = await menuKey('Side \u203A ', ['1', '2', '3', '4', '5']);\n if (side === 'q') return 'quit';\n if (side === '4') return await newGameMenu(screen);\n if (side === '5') return 'quit';\n const human: 'w' | 'b' = side === '1' ? 'w' : side === '2' ? 'b' : Math.random() < 0.5 ? 'w' : 'b';\n return { elo, human };\n }\n}\n\nfunction menuKey(prompt: string, choices: string[]): Promise<string> {\n return rawPrompt(prompt, (text, key, finish) => {\n if (key?.ctrl && key.name === 'c') { finish('q'); return; }\n const character = (text ?? '').toLowerCase();\n if (!key?.ctrl && choices.includes(character)) finish(character);\n });\n}\n\nfunction menuText(prompt: string): Promise<string | 'b' | 'q' | null> {\n let value = '';\n return rawPrompt(prompt, (text, key, finish) => {\n if (key?.ctrl && key.name === 'c') { finish('q'); return; }\n if (key?.name === 'backspace') {\n value = value.slice(0, -1);\n stdout.write('\\b \\b');\n return;\n }\n if (key?.name === 'return' || key?.name === 'enter') {\n finish(value === '0' ? 'b' : value === '00' ? 'q' : value);\n return;\n }\n const character = text ?? '';\n if (key?.ctrl || !character) return;\n value += character;\n stdout.write(character);\n });\n}\n\nfunction rawPrompt<T>(prompt: string, onKey: (text: string, key: Key, finish: (value: T) => void) => void): Promise<T> {\n const stream = stdin as typeof stdin & { setRawMode?: (mode: boolean) => void };\n if (!stream.isTTY || !stream.setRawMode) return Promise.reject(new Error('Menu selection requires an interactive terminal.'));\n const previous = stdin.listeners('keypress') as Array<(...args: any[]) => void>;\n previous.forEach(listener => stdin.removeListener('keypress', listener));\n stdout.write(`${promptColor}${prompt}${reset}`);\n stream.setRawMode(true);\n return new Promise(resolve => {\n let finished = false;\n const finish = (value: T): void => {\n if (finished) return;\n finished = true;\n stdin.removeListener('keypress', listener);\n stream.setRawMode(false);\n [...previous].reverse().forEach(listener => stdin.prependListener('keypress', listener));\n stdout.write('\\r\\n');\n resolve(value);\n };\n const listener = (text: string, key: Key): void => onKey(text, key, finish);\n stdin.on('keypress', listener);\n });\n}\n\nasync function playGame(config: GameConfig, options: { graphics: GraphicsMode; depth: number; serverUrl: string; store: GameStore; sharedScreen: boolean }): Promise<boolean> {\n const { elo, human, saved } = config;\n let startFen = saved?.startFen ?? config.fen ?? START_FEN;\n const chess = new Chess(startFen);\n if (saved) for (const move of saved.moves) chess.play(move);\n const abort = new AbortController();\n const server = new ChessServerClient(options.serverUrl, abort.signal);\n const rl = createInterface({ input: stdin, output: stdout });\n const screen = new GameScreen(Boolean(stdout.isTTY && stdin.isTTY), stdout, !options.sharedScreen);\n const useGraphics = supportsGraphics(options.graphics);\n let stopped = false;\n let redrawInput: (() => void) | undefined;\n let last: number[] | null = null;\n let showingHelp = false;\n let returnToMenu = false;\n let returnToMenuRequested = false;\n let search: AbortController | undefined;\n let notice = 'Your move';\n let gameId = saved?.id;\n const header = `CHESS / ${human === 'w' ? 'White' : 'Black'} / Stockfish ${elo} ELO`;\n const persist = (): void => {\n gameId = options.store.save({ elo, color: human, startFen, fen: chess.fen(), moves: chess.history.map(entry => entry.san), status: chess.status() ?? 'In progress' }, gameId);\n };\n const draw = (): void => screen.draw(header,\n showingHelp ? commandHelp()\n : useGraphics ? renderGraphics(chess, human, last, screen.active)\n : render(chess, { perspective: human, last, compact: screen.active && (stdout.rows || 40) < 36 }),\n notice, showingHelp ? '' : moveHistory(chess, Math.max(1, (stdout.columns || 80) - 1)));\n const takeBack = (): void => {\n notice = undoTurn(chess, human) ? 'Took back your last move and any Stockfish reply.' : 'No move to undo yet.';\n const move = chess.history.at(-1)?.move;\n last = move ? [move.from, move.to] : null;\n persist();\n };\n const shortcut = (text: string, key: Key): void => {\n if (stopped || returnToMenuRequested) return;\n if (key?.ctrl && key.name === 'c') { stop(); return; }\n };\n const stop = (): void => { stopped = true; abort.abort(); search?.abort(); };\n const resize = (): void => { if (!stopped) { draw(); redrawInput?.(); } };\n const question = async (placeholder: string): Promise<string> => {\n if (!screen.active) return await rl.question(`${promptColor}${placeholder} \u203A ${reset}`, { signal: abort.signal });\n const stream = stdin as typeof stdin & { setRawMode?: (mode: boolean) => void };\n const previousRaw = stream.isRaw;\n const previous = stdin.listeners('keypress') as Array<(text: string, key: Key) => void>;\n previous.forEach(listener => stdin.removeListener('keypress', listener));\n stream.setRawMode?.(true);\n return new Promise(resolve => {\n let value = '';\n let done = false;\n const redraw = (): void => screen.input(value, placeholder);\n const finish = (answer: string): void => {\n if (done) return;\n done = true;\n stdin.removeListener('keypress', onKey);\n abort.signal.removeEventListener('abort', onAbort);\n previous.forEach(listener => stdin.on('keypress', listener));\n stream.setRawMode?.(previousRaw);\n redrawInput = undefined;\n screen.input('', placeholder);\n resolve(answer);\n };\n const onAbort = (): void => finish('');\n const onKey = (text: string, key: Key): void => {\n if (key?.ctrl && key.name === 'c') { stop(); finish(''); return; }\n if (key?.name === 'return' || key?.name === 'enter') { finish(value); return; }\n value = editGameInput(value, text, key);\n redraw();\n };\n redrawInput = redraw;\n stdin.on('keypress', onKey);\n abort.signal.addEventListener('abort', onAbort, { once: true });\n redraw();\n });\n };\n stdin.on('keypress', shortcut);\n rl.on('SIGINT', stop);\n rl.on('close', stop);\n process.on('SIGINT', stop);\n process.on('SIGTERM', stop);\n stdout.on('resize', resize);\n screen.open();\n persist();\n\n try {\n while (!stopped && !returnToMenuRequested) {\n const status = chess.status();\n if (status) {\n notice = status;\n persist();\n draw();\n if (screen.active) {\n const command = await question('Type /undo, /back, or /quit \u00B7 Ctrl+C quit');\n if (command.trim().toLowerCase() === '/undo') { takeBack(); continue; }\n if (/^\\/(quit|exit)$/.test(command.trim().toLowerCase())) { stop(); break; }\n break;\n }\n console.log(status);\n break;\n }\n if (chess.turn !== human) {\n notice = 'Stockfish is thinking\u2026';\n draw();\n search = new AbortController();\n let move: string;\n try { move = await engineMove(chess.fen(), elo, options.depth, search.signal); }\n catch (error) {\n if (returnToMenuRequested) break;\n throw error;\n } finally { search = undefined; }\n const side = chess.turn;\n const san = chess.play(move);\n const played = chess.history.at(-1)!.move;\n last = [played.from, played.to];\n notice = `${side === 'w' ? 'White' : 'Black'} plays ${san}`;\n persist();\n continue;\n }\n\n draw();\n let raw: string;\n try { raw = await question(showingHelp ? 'Type /back to return to the game' : 'Type any moves e.g. e4 or e pawn up 2'); }\n catch (error) { if (returnToMenuRequested) break; throw error; }\n const wasShowingHelp = showingHelp;\n showingHelp = false;\n if (wasShowingHelp && /^\\/back$/i.test(raw.trim())) { notice = 'Your move'; continue; }\n let intent;\n try { intent = await modelInput(raw, chess, server); }\n catch (error) { notice = message(error); continue; }\n if (stopped) break;\n if (intent.type === 'quit') { stop(); break; }\n if (intent.type === 'help') { notice = 'Available commands'; showingHelp = true; continue; }\n if (intent.type === 'back') { returnToMenuRequested = true; break; }\n if (intent.type === 'show-fen') { notice = chess.fen(); continue; }\n if (intent.type === 'load-fen') {\n try { chess.load(intent.value); startFen = intent.value; last = null; notice = 'Position loaded.'; persist(); }\n catch (error) { notice = message(error); }\n continue;\n }\n if (intent.type === 'undo') { takeBack(); continue; }\n if (intent.type === 'empty') continue;\n try {\n const san = chess.play(intent.value);\n const move = chess.history.at(-1)!.move;\n last = [move.from, move.to];\n notice = intent.source === 'jev' ? `JEV chose ${san}` : `You played ${san}`;\n persist();\n } catch (error) { notice = `${message(error)}. Try e2e4, Nf3, or describe the move.`; }\n }\n } catch (error) { if (!stopped) throw error; }\n finally {\n returnToMenu = screen.active && !stopped;\n stdin.off('keypress', shortcut);\n stdout.off('resize', resize);\n process.off('SIGINT', stop);\n process.off('SIGTERM', stop);\n rl.close();\n screen.close();\n }\n return returnToMenu || screen.active && returnToMenuRequested;\n}\n\nexport { HELP };\nconst message = (error: unknown): string => error instanceof Error ? error.message : String(error);\n", "export const START_FEN = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';\nconst FILES = 'abcdefgh';\nconst KNIGHT: Direction[] = [[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]];\nconst KING: Direction[] = [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]];\ntype Side = 'w' | 'b';\ntype Piece = 'P'|'N'|'B'|'R'|'Q'|'K'|'p'|'n'|'b'|'r'|'q'|'k';\ntype Direction = [number, number];\nexport interface Move { from:number; to:number; promotion:string|null; flags:string }\nexport interface PositionSnapshot { board:(Piece|null)[]; turn:Side; castling:string; ep:number; halfmove:number; fullmove:number }\nexport interface HistoryEntry { move:Move; san:string; before:PositionSnapshot }\n\nexport const squareName = (i:number):string => FILES[i % 8] + (8 - Math.floor(i / 8));\nexport const squareIndex = (s:string):number => /^[a-h][1-8]$/i.test(s) ? (8 - Number(s[1])) * 8 + FILES.indexOf(s[0].toLowerCase()) : -1;\nconst color = (p:Piece|null):Side|null => p ? (p === p.toUpperCase() ? 'w' : 'b') : null;\n\nexport class Chess {\n board:(Piece|null)[]=[]; turn:Side='w'; castling=''; ep=-1; halfmove=0; fullmove=1; history:HistoryEntry[]=[];\n constructor(fen:string = START_FEN) { this.load(fen); }\n load(fen:string):this {\n const [placement, turn, castling = '-', ep = '-', half = '0', full = '1'] = fen.trim().split(/\\s+/);\n const ranks = placement?.split('/');\n if (!ranks || ranks.length !== 8 || !/^[wb]$/.test(turn)) throw new Error('Invalid FEN');\n this.board = [];\n for (const rank of ranks) {\n for (const c of rank) {\n if (/\\d/.test(c)) this.board.push(...Array(Number(c)).fill(null));\n else if (/[prnbqkPRNBQK]/.test(c)) this.board.push(c as Piece);\n else throw new Error('Invalid FEN');\n }\n }\n if (this.board.length !== 64) throw new Error('Invalid FEN');\n this.turn = turn as Side; this.castling = castling === '-' ? '' : castling; this.ep = ep === '-' ? -1 : squareIndex(ep);\n this.halfmove = Number(half); this.fullmove = Number(full); this.history = [];\n if (this.ep < -1 || !Number.isFinite(this.halfmove) || !Number.isFinite(this.fullmove)) throw new Error('Invalid FEN');\n return this;\n }\n fen():string {\n let out = '';\n for (let r=0;r<8;r++) { let empty=0; for(let f=0;f<8;f++){ const p=this.board[r*8+f]; if(!p) empty++; else {if(empty){out+=empty;empty=0;} out+=p;} } if(empty)out+=empty; if(r<7)out+='/'; }\n return `${out} ${this.turn} ${this.castling || '-'} ${this.ep < 0 ? '-' : squareName(this.ep)} ${this.halfmove} ${this.fullmove}`;\n }\n attacked(sq:number, by:Side):boolean {\n const r=Math.floor(sq/8), f=sq%8;\n const pawn = by==='w'?'P':'p', pawnRow = r + (by==='w'?1:-1);\n for(const df of [-1,1]) if(pawnRow>=0&&pawnRow<8&&f+df>=0&&f+df<8&&this.board[pawnRow*8+f+df]===pawn)return true;\n for(const [df,dr] of KNIGHT){const rr=r+dr,ff=f+df;if(rr>=0&&rr<8&&ff>=0&&ff<8&&this.board[rr*8+ff]===(by==='w'?'N':'n'))return true;}\n for(const [df,dr] of KING){const rr=r+dr,ff=f+df;if(rr>=0&&rr<8&&ff>=0&&ff<8&&this.board[rr*8+ff]===(by==='w'?'K':'k'))return true;}\n for(const [df,dr,types] of [[1,0,'RQ'],[-1,0,'RQ'],[0,1,'RQ'],[0,-1,'RQ'],[1,1,'BQ'],[-1,1,'BQ'],[1,-1,'BQ'],[-1,-1,'BQ']] as [number,number,string][]) {\n let rr=r+dr,ff=f+df; while(rr>=0&&rr<8&&ff>=0&&ff<8){const p=this.board[rr*8+ff];if(p){if(color(p)===by&&types.includes(p.toUpperCase()))return true;break;}rr+=dr;ff+=df;\n }} return false;\n }\n inCheck(side:Side=this.turn):boolean { const king=this.board.indexOf(side==='w'?'K':'k'); return king<0 || this.attacked(king,side==='w'?'b':'w'); }\n pseudo():Move[] {\n const moves:Move[]=[];\n const add=(from:number,to:number,promotion:string|null=null,flags='')=>moves.push({from,to,promotion,flags});\n for(let from=0;from<64;from++){const p=this.board[from];if(!p||color(p)!==this.turn)continue;const type=p.toUpperCase(),r=Math.floor(from/8),f=from%8;\n if(type==='P'){const dir=this.turn==='w'?-1:1, home=this.turn==='w'?6:1, last=this.turn==='w'?0:7;const one=(r+dir)*8+f;\n if(r+dir>=0&&r+dir<8&&!this.board[one]){if(r+dir===last)for(const q of 'qrbn')add(from,one,q,'p');else add(from,one);const two=(r+2*dir)*8+f;if(r===home&&!this.board[two])add(from,two,null,'d');}\n for(const df of [-1,1]){const rr=r+dir,ff=f+df;if(rr<0||rr>7||ff<0||ff>7)continue;const to=rr*8+ff;if((this.board[to]&&color(this.board[to])!==this.turn)||to===this.ep){if(rr===last)for(const q of 'qrbn')add(from,to,q,to===this.ep?'ep':'cp');else add(from,to,null,to===this.ep?'e':'c');}}\n } else if(type==='N'||type==='K'){for(const [df,dr] of type==='N'?KNIGHT:KING){const rr=r+dr,ff=f+df;if(rr>=0&&rr<8&&ff>=0&&ff<8&&color(this.board[rr*8+ff])!==this.turn)add(from,rr*8+ff,null,this.board[rr*8+ff]?'c':'');}\n if(type==='K')this.castleMoves(from,add);\n } else {const dirs=type==='B'?KING.slice(4):type==='R'?KING.slice(0,4):KING;for(const[df,dr]of dirs){let rr=r+dr,ff=f+df;while(rr>=0&&rr<8&&ff>=0&&ff<8){const to=rr*8+ff;if(color(this.board[to])===this.turn)break;add(from,to,null,this.board[to]?'c':'');if(this.board[to])break;rr+=dr;ff+=df;}}}\n } return moves;\n }\n castleMoves(from:number, add:(from:number,to:number,promotion?:string|null,flags?:string)=>void):void {\n const white=this.turn==='w', base=white?60:4, enemy=white?'b':'w'; if(from!==base||this.inCheck())return;\n const king=white?'K':'k', rook=white?'R':'r'; if(this.board[from]!==king)return;\n if(this.castling.includes(white?'K':'k')&&this.board[base+3]===rook&&!this.board[base+1]&&!this.board[base+2]&&!this.attacked(base+1,enemy)&&!this.attacked(base+2,enemy))add(from,base+2,null,'k');\n if(this.castling.includes(white?'Q':'q')&&this.board[base-4]===rook&&!this.board[base-1]&&!this.board[base-2]&&!this.board[base-3]&&!this.attacked(base-1,enemy)&&!this.attacked(base-2,enemy))add(from,base-2,null,'q');\n }\n moves():Move[] { return this.pseudo().filter(m=>{const snapshot=this.snapshot();this.apply(m);const bad=this.inCheck(this.turn==='w'?'b':'w');this.restore(snapshot);return !bad;}); }\n snapshot():PositionSnapshot{return {board:[...this.board],turn:this.turn,castling:this.castling,ep:this.ep,halfmove:this.halfmove,fullmove:this.fullmove};}\n restore(s:PositionSnapshot):void{Object.assign(this,s);}\n apply(m:Move):void{const p=this.board[m.from]! as Piece, side=this.turn, captured=this.board[m.to];this.board[m.to]=(m.promotion?(side==='w'?m.promotion.toUpperCase():m.promotion):p) as Piece;this.board[m.from]=null;\n if(m.flags.includes('e'))this.board[m.to+(side==='w'?8:-8)]=null;\n if(m.flags==='k'){this.board[m.to-1]=this.board[m.to+1];this.board[m.to+1]=null;} if(m.flags==='q'){this.board[m.to+1]=this.board[m.to-2];this.board[m.to-2]=null;}\n const rights:Record<number,string>={0:'q',4:'kq',7:'k',56:'Q',60:'KQ',63:'K'};for(const sq of [m.from,m.to])if(rights[sq])for(const x of rights[sq])this.castling=this.castling.replace(x,'');\n this.ep=m.flags==='d'?(m.from+m.to)/2:-1;this.halfmove=(p.toUpperCase()==='P'||captured||m.flags.includes('e'))?0:this.halfmove+1;if(side==='b')this.fullmove++;this.turn=side==='w'?'b':'w';\n }\n san(m:Move, legal:Move[]=this.moves()):string {const p=this.board[m.from]!, type=p.toUpperCase();if(m.flags==='k')return'O-O';if(m.flags==='q')return'O-O-O';let s=type==='P'?'':type;\n if(type!=='P'){const same=legal.filter(x=>x!==m&&x.to===m.to&&this.board[x.from]?.toUpperCase()===type);if(same.length){if(same.every(x=>x.from%8!==m.from%8))s+=FILES[m.from%8];else if(same.every(x=>Math.floor(x.from/8)!==Math.floor(m.from/8)))s+=8-Math.floor(m.from/8);else s+=squareName(m.from);}}\n if(m.flags.includes('c')||m.flags.includes('e'))s+=(type==='P'?FILES[m.from%8]:'')+'x';s+=squareName(m.to);if(m.promotion)s+='='+m.promotion.toUpperCase();const snap=this.snapshot();this.apply(m);if(this.inCheck()){s+=this.moves().length?'#'.replace('#','+'):'#';}this.restore(snap);return s;\n }\n play(input:string):string {const legal=this.moves(), normalized=input.trim().replace(/[!?+#]/g,'').replace(/0/g,'O');let move=legal.find(m=>`${squareName(m.from)}${squareName(m.to)}${m.promotion||''}`===normalized.toLowerCase());if(!move)move=legal.find(m=>this.san(m,legal).replace(/[+#]/g,'')===normalized);if(!move)throw new Error(`Illegal or unrecognized move: ${input}`);const san=this.san(move,legal), before=this.snapshot();this.apply(move);this.history.push({move,san,before});return san;}\n undo():HistoryEntry|undefined{const h=this.history.pop();if(h)this.restore(h.before);return h;}\n status():string|null{const moves=this.moves();if(!moves.length)return this.inCheck()?(this.turn==='w'?'Black':'White')+' wins by checkmate':'Draw by stalemate';if(this.halfmove>=100)return'Draw by fifty-move rule';return null;}\n}\n", "import type { Chess } from './index.js';\nexport interface MoveResult { move: string; fen: string; explanation: string }\nexport interface MoveResolver { resolve(text: string, chess: Chess): Promise<MoveResult> }\nexport class ResolutionError extends Error {\n constructor(message: string, readonly status: number) { super(message); }\n}\n", "import { Chess, squareName } from './index.js';\n\nconst names: Record<string, string> = { P: 'Pawn', N: 'Knight', B: 'Bishop', R: 'Rook', Q: 'Queen', K: 'King' };\n\n/** Explain a recognizable move rejected for king safety, without changing the game. */\nexport function illegalMoveReason(input: string, chess: Chess): string | undefined {\n const text = input.trim();\n const uci = /^([a-h][1-8])([a-h][1-8])([qrbn])?$/.exec(text);\n const san = /^([KQRBN])?([a-h])?([1-8])?(x)?([a-h][1-8])(?:=([QRBN]))?[+#]?$/.exec(text);\n const words = text.toLowerCase();\n const squares = words.match(/[a-h][1-8]/g) || [];\n const named = words.match(/\\bwith (?:my |the |a )?(pawn|knight|bishop|rook|queen|king)\\b/)?.[1]\n || words.match(/\\b(pawn|knight|bishop|rook|queen|king)\\b/)?.[1];\n const kind = uci ? undefined : san ? san[1] || 'P'\n : Object.keys(names).find(key => names[key].toLowerCase() === named);\n const from = uci?.[1] || (squares.length > 1 ? squares[0] : undefined);\n const to = uci?.[2] || san?.[5] || squares.at(-1);\n if (!to || (!uci && !san && !kind && !from)) return;\n const capture = san ? Boolean(san[4]) : /\\b(take|takes|taking|capture|captures|capturing)\\b/.test(words);\n const candidates = chess.pseudo().filter(move => {\n if (squareName(move.to) !== to) return false;\n if (from && squareName(move.from) !== from) return false;\n if (kind && chess.board[move.from]!.toUpperCase() !== kind) return false;\n if (san?.[2] && squareName(move.from)[0] !== san[2]) return false;\n if (san?.[3] && squareName(move.from)[1] !== san[3]) return false;\n if (capture && !/[ce]/.test(move.flags)) return false;\n return true;\n });\n const legal = chess.moves();\n // A legal interpretation or multiple possible pieces needs clarification, not a pin claim.\n if (candidates.length !== 1 || legal.some(move => move.from === candidates[0].from && move.to === candidates[0].to)) return;\n const move = candidates[0];\n const copy = new Chess(chess.fen());\n copy.apply(move);\n if (!copy.inCheck(chess.turn)) return;\n const piece = chess.board[move.from]!.toUpperCase();\n if (piece === 'K') return `King cannot move to ${to}: that square is attacked.`;\n if (chess.inCheck()) return 'You are in check; this move would leave your king in check.';\n\n const king = chess.board.indexOf(chess.turn === 'w' ? 'K' : 'k');\n const dr = Math.floor(move.from / 8) - Math.floor(king / 8);\n const df = move.from % 8 - king % 8;\n if (dr === 0 || df === 0 || Math.abs(dr) === Math.abs(df)) {\n const stepR = Math.sign(dr), stepF = Math.sign(df);\n let rank = Math.floor(king / 8) + stepR, file = king % 8 + stepF;\n let passedPiece = false;\n while (rank >= 0 && rank < 8 && file >= 0 && file < 8) {\n const index = rank * 8 + file;\n const blocker = chess.board[index];\n if (index === move.from) passedPiece = true;\n else if (blocker) {\n const enemy = (blocker === blocker.toUpperCase() ? 'w' : 'b') !== chess.turn;\n const slider = (dr === 0 || df === 0 ? 'RQ' : 'BQ').includes(blocker.toUpperCase());\n if (passedPiece && enemy && slider) {\n return `${names[piece]} ${squareName(move.from)} is pinned by ${names[blocker.toUpperCase()].toLowerCase()} ${squareName(index)}; moving it exposes your king.`;\n }\n break;\n }\n rank += stepR;\n file += stepF;\n }\n }\n return `${names[piece]} ${squareName(move.from)} cannot move to ${to}: it would expose your king to check.`;\n}\n", "import { squareName, type Chess } from './index.js';\n\nconst names: Record<string, string> = { king: 'K', queen: 'Q', rook: 'R', bishop: 'B', knight: 'N', pawn: 'P' };\nexport const looksLikeNotation = (text: string): boolean => !/\\s/.test(text) && (/\\d/.test(text) || /^[O0]-[O0]/.test(text));\n\nfunction distance(a: string, b: string): number {\n let row = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 0; i < a.length; i++) {\n const next = [i + 1];\n for (let j = 0; j < b.length; j++) next.push(Math.min(next[j] + 1, row[j + 1] + 1, row[j] + Number(a[i] !== b[j])));\n row = next;\n }\n return row[b.length];\n}\n\n/** Rank only legal moves related to the requested piece, square or capture. */\nexport function suggestMoves(input: string, chess: Chess): string[] {\n const text = input.trim();\n const lower = text.toLowerCase();\n const notation = looksLikeNotation(text);\n const squares = lower.match(/[a-h][1-8]/g) || [];\n const destination = squares.at(-1);\n const source = squares.length > 1 ? squares[0] : undefined;\n const named = lower.match(/\\bwith (?:my |the |a )?(king|queen|rook|bishop|knight|pawn)\\b/)?.[1]\n || lower.match(/\\b(king|queen|rook|bishop|knight|pawn)\\b/)?.[1];\n const piece = named ? names[named] : notation && !/^[a-h][1-8][a-h][1-8]/.test(text)\n ? (/^[KQRBN]/.exec(text)?.[0] || (/^[a-h]/.test(text) ? 'P' : undefined)) : undefined;\n const capture = notation ? text.includes('x') : /\\b(take|takes|taking|capture|captures|capturing)\\b/.test(lower);\n const castle = /\\bcastl/.test(lower) || /^[O0]-[O0]/.test(text);\n if (!notation && !piece && !destination && !capture && !castle) return [];\n const legal = chess.moves();\n return legal.map(move => {\n const san = chess.san(move, legal);\n const from = squareName(move.from), to = squareName(move.to);\n const kind = chess.board[move.from]!.toUpperCase();\n if (piece && kind !== piece) return null;\n if (source && from !== source) return null;\n if (capture && !san.includes('x')) return null;\n if (castle && !san.startsWith('O-O')) return null;\n if (!notation && destination && to !== destination) return null;\n const uci = from + to + (move.promotion || '');\n const difference = Math.min(distance(text, san), distance(lower, uci));\n if (notation && difference > 2 && to !== destination) return null;\n return { san, score: (to === destination ? 20 : 0) + (from === source ? 10 : 0) - difference };\n }).filter((entry): entry is { san: string; score: number } => entry !== null)\n .sort((a, b) => b.score - a.score || a.san.localeCompare(b.san)).slice(0, 5).map(entry => entry.san);\n}\n\nexport function suggestionMessage(input: string, chess: Chess): string {\n const moves = suggestMoves(input, chess);\n return moves.length ? `No exact match. Try: ${moves.join(' \u00B7 ')}` : 'No matching legal move. Specify the piece and target square.';\n}\n", "import { squareName } from './index.js';\nimport type { Chess } from './index.js';\nimport { ResolutionError, type MoveResolver } from './resolution.js';\nimport { illegalMoveReason } from './legality.js';\nimport { looksLikeNotation, suggestionMessage } from './suggestions.js';\n\nexport type InputIntent =\n | { type:'empty' }\n | { type:'quit' }\n | { type:'help' }\n | { type:'undo' }\n | { type:'back' }\n | { type:'show-fen' }\n | { type:'load-fen'; value:string }\n | { type:'move'; value:string; source:'notation'|'jev'; fen?:string; explanation?:string };\n\n/** Parse local commands/notation; delegate all genuinely free-form text to JEV. */\nexport async function modelInput(raw:string, chess:Chess, server?:MoveResolver):Promise<InputIntent> {\n const text = String(raw).trim();\n const lower = text.toLowerCase();\n if (!text) return { type: 'empty' };\n if (/^\\/(quit|exit)$/.test(lower)) return { type: 'quit' };\n if (lower === '/help') return { type: 'help' };\n if (lower === '/undo') return { type: 'undo' };\n if (/^\\/(back|menu)$/.test(lower)) return { type: 'back' };\n if (/^\\/(fen|position)$/.test(lower)) return { type: 'show-fen' };\n if (/^\\/(fen|position)\\s+/.test(lower)) return { type: 'load-fen', value: text.replace(/^\\/(?:fen|position)\\s+/i, '').trim() };\n if (lower.startsWith('/')) throw new Error(`Unknown command: ${text}. Type /help to see commands.`);\n\n const legal = chess.moves();\n const normalized = text;\n const exact = legal.find(move => {\n const uci = squareName(move.from) + squareName(move.to) + (move.promotion || '');\n return uci === normalized || chess.san(move, legal) === normalized;\n });\n if (exact) return { type: 'move', value: squareName(exact.from) + squareName(exact.to) + (exact.promotion || ''), source: 'notation' };\n\n const reason = illegalMoveReason(text, chess);\n if (reason) throw new Error(reason);\n if (looksLikeNotation(text)) throw new Error(suggestionMessage(text, chess));\n\n if (!server) throw new Error('Chess server is required for natural-language input');\n let result;\n try { result = await server.resolve(text, chess); }\n catch (error) {\n if (error instanceof ResolutionError && error.status === 422) throw new Error(suggestionMessage(text, chess));\n throw error;\n }\n return { type: 'move', value: result.move, fen: result.fen, explanation: result.explanation, source: 'jev' };\n}\n", "import type { Chess } from './index.js';\n\n/** Undo through the player's most recent move, including any engine reply. */\nexport function undoTurn(chess: Chess, human: 'w' | 'b'): boolean {\n let index = chess.history.length - 1;\n while (index >= 0 && chess.history[index].before.turn !== human) index--;\n if (index < 0) return false;\n while (chess.history.length > index) chess.undo();\n return true;\n}\n\nexport function moveHistory(chess: Chess, width = 80): string {\n const groups: string[] = [];\n for (const entry of chess.history) {\n const { fullmove, turn } = entry.before;\n if (turn === 'w') groups.push(`${fullmove}. ${entry.san}`);\n else if (groups.length) groups[groups.length - 1] += ` ${entry.san}`;\n else groups.push(`${fullmove}\u2026 ${entry.san}`);\n }\n if (!groups.length) return 'Moves: \u2014';\n let clipped = false;\n while (groups.length > 1 && `Moves: ${clipped ? '\u2026 ' : ''}${groups.join(' ')}`.length > width) {\n groups.shift();\n clipped = true;\n }\n return `Moves: ${clipped ? '\u2026 ' : ''}${groups.join(' ')}`;\n}\n", "import type { Chess } from '@zchess/chess';\nimport { ResolutionError, type MoveResult } from '@zchess/chess/interaction';\nexport { ResolutionError, type MoveResult } from '@zchess/chess/interaction';\nexport class ChessServerClient {\n constructor(private readonly baseUrl=process.env.ZCHESS_SERVER_URL||'http://localhost:8000', private readonly signal?:AbortSignal){}\n async resolve(text:string,chess:Chess):Promise<MoveResult>{return this.post('/api/resolve',{instruction:text,fen:chess.fen()});}\n private async post(path:string,body:unknown):Promise<MoveResult>{const response=await fetch(this.baseUrl.replace(/\\/$/,'')+path,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(body),signal:this.signal});if(!response.ok){\n const body = await response.json().catch(() => ({})) as {detail?:unknown};\n throw new ResolutionError(typeof body.detail === 'string' ? body.detail : `Chess server failed (${response.status})`, response.status);\n }return response.json() as Promise<MoveResult>;}\n}\n", "import type { Chess } from '@zchess/chess';\n\nconst PIECES: Record<string, string> = {\n K: '\u265A', Q: '\u265B', R: '\u265C', B: '\u265D', N: '\u265E', P: '\u265F',\n k: '\u265A', q: '\u265B', r: '\u265C', b: '\u265D', n: '\u265E', p: '\u265F',\n};\nconst OUTLINES: Record<string, string> = { K: '\u2654', Q: '\u2655', R: '\u2656', B: '\u2657', N: '\u2658', P: '\u2659' };\nconst RESET = '\\x1b[0m';\ninterface RenderOptions { perspective?: 'w' | 'b'; last?: number[] | null; color?: boolean; compact?: boolean }\n\nexport function render(chess: Chess, { perspective = 'w', last = null, color = Boolean(process.stdout.isTTY), compact = false }: RenderOptions = {}): string {\n const rows = perspective === 'w' ? [0, 1, 2, 3, 4, 5, 6, 7] : [7, 6, 5, 4, 3, 2, 1, 0];\n const files = perspective === 'w' ? [0, 1, 2, 3, 4, 5, 6, 7] : [7, 6, 5, 4, 3, 2, 1, 0];\n const cellWidth = Math.max(6, Math.min(8, Math.floor(((process.stdout.columns || 80) - 8) / 8)));\n const cell = (content = ''): string => {\n const left = Math.floor((cellWidth - 1) / 2);\n return `${' '.repeat(left)}${content}${' '.repeat(cellWidth - left - (content ? 1 : 0))}`;\n };\n const green = (text: string): string => color ? `\\x1b[38;5;114m${text}${RESET}` : text;\n const border = green(` +${'-'.repeat(cellWidth * 8)}+`);\n const output = [border];\n\n for (const rank of rows) {\n for (const line of compact ? [1] : [0, 1, 2]) {\n let row = green(`${line === 1 ? ` ${8 - rank} ` : ' '}|`);\n for (const file of files) {\n const index = rank * 8 + file;\n const piece = chess.board[index];\n const white = piece !== null && piece === piece.toUpperCase();\n const glyph = piece ? (!color && white ? OUTLINES[piece] : PIECES[piece]) : ' ';\n let square = cell(line === 1 ? glyph : '');\n if (color) {\n const background = last?.includes(index) ? 107 : (rank + file) % 2 ? 65 : 108;\n square = `\\x1b[1;48;5;${background};38;5;${white ? 231 : 16}m${square}${RESET}`;\n } else if (!piece && line === 1) {\n square = cell((rank + file) % 2 ? '\u00B7' : '');\n }\n row += square;\n }\n output.push(row + green('|'));\n }\n }\n output.push(border);\n output.push(green(' ' + files.map(file => cell('abcdefgh'[file])).join('')));\n output.push(color\n ? ` \\x1b[1;38;5;231m\u265A White${RESET} ${green('\u265A Black \u00B7 dark pieces')}`\n : ' \u2654 White \u265A Black');\n return output.join('\\n') + '\\n';\n}\n", "import { createRequire } from 'node:module';\nimport type { Chess } from '@zchess/chess';\nimport piecesData from '@zchess/chess/pieces' with { type: 'json' };\n\nconst require = createRequire(import.meta.url);\nconst pieces = piecesData as Record<string, string>;\nconst IMAGE_ID = 73191;\nexport type GraphicsMode = 'auto' | 'kitty' | 'text';\n\nexport function supportsGraphics(mode: GraphicsMode, tty = Boolean(process.stdout.isTTY), env = process.env): boolean {\n if (!tty || mode === 'text') return false;\n if (mode === 'kitty') return true;\n if (env.TMUX || env.STY) return false;\n return env.TERM_PROGRAM === 'ghostty' || env.TERM === 'xterm-ghostty' || env.TERM === 'xterm-kitty';\n}\n\nexport function boardSvg(chess: Chess, perspective: 'w' | 'b', last: number[] | null): string {\n const order = perspective === 'w' ? [0, 1, 2, 3, 4, 5, 6, 7] : [7, 6, 5, 4, 3, 2, 1, 0];\n const svg = ['<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"768\" height=\"768\" viewBox=\"0 0 768 768\">',\n '<rect width=\"768\" height=\"768\" rx=\"12\" fill=\"#14291f\"/>'];\n for (const [y, rank] of order.entries()) {\n for (const [x, file] of order.entries()) {\n const index = rank * 8 + file;\n const left = 24 + x * 90, top = 24 + y * 90;\n const fill = last?.includes(index) ? '#b4cf68' : (rank + file) % 2 ? '#64916d' : '#d5e5cb';\n svg.push(`<rect x=\"${left}\" y=\"${top}\" width=\"90\" height=\"90\" fill=\"${fill}\"/>`);\n const piece = chess.board[index];\n if (piece) svg.push(`<g transform=\"translate(${left} ${top}) scale(2)\">${pieces[piece]}</g>`);\n }\n svg.push(`<text x=\"12\" y=\"${24 + y * 90 + 50}\" text-anchor=\"middle\" font-size=\"16\" font-family=\"sans-serif\" fill=\"#d5e5cb\">${8 - rank}</text>`);\n }\n for (const [x, file] of order.entries()) {\n svg.push(`<text x=\"${24 + x * 90 + 45}\" y=\"762\" text-anchor=\"middle\" font-size=\"16\" font-family=\"sans-serif\" fill=\"#d5e5cb\">${'abcdefgh'[file]}</text>`);\n }\n svg.push('</svg>');\n return svg.join('');\n}\n\nexport function boardPng(chess: Chess, perspective: 'w' | 'b', last: number[] | null): Buffer {\n const { Resvg } = require('@resvg/resvg-js') as typeof import('@resvg/resvg-js');\n return new Resvg(boardSvg(chess, perspective, last)).render().asPng();\n}\n\nexport function renderGraphics(chess: Chess, perspective: 'w' | 'b', last: number[] | null, fixed = false): string {\n // The supplied Ghostty screenshot shows that this terminal's cells are a\n // little narrower than the usual 2:1 estimate. Use a 2.2:1 placement so the\n // rendered board squares do not appear tall.\n const columnsPerRow = 2.2;\n const availableRows = Math.max(1, (process.stdout.rows || 40) - (fixed ? 8 : 7));\n const availableColumns = Math.max(2, (process.stdout.columns || 80) - 2);\n const rows = Math.max(1, Math.min(32, availableRows, Math.floor(availableColumns / columnsPerRow)));\n const columns = Math.min(availableColumns, Math.round(rows * columnsPerRow));\n const data = boardPng(chess, perspective, last).toString('base64');\n // Reserve room first: images anchored near the bottom must not cover the prompt.\n let output = `\\x1b_Ga=d,d=I,i=${IMAGE_ID},q=2;\\x1b\\\\`;\n if (!fixed) output += '\\n'.repeat(rows) + `\\x1b[${rows}A\\r`;\n for (let offset = 0; offset < data.length; offset += 4096) {\n const chunk = data.slice(offset, offset + 4096);\n const more = offset + 4096 < data.length ? 1 : 0;\n const control = offset === 0 ? `a=T,f=100,t=d,i=${IMAGE_ID},c=${columns},r=${rows},C=1,q=2,` : '';\n output += `\\x1b_G${control}m=${more};${chunk}\\x1b\\\\`;\n }\n return output + `\\x1b[${rows}B\\r`;\n}\n", "{\n \"b\": \"<g id=\\\"black-bishop\\\" class=\\\"black bishop\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 36c3.39-.97 10.11.43 13.5-2 3.39 2.43 10.11 1.03 13.5 2 0 0 1.65.54 3 2-.68.97-1.65.99-3 .5-3.39-.97-10.11.46-13.5-1-3.39 1.46-10.11.03-13.5 1-1.354.49-2.323.47-3-.5 1.354-1.94 3-2 3-2zm6-4c2.5 2.5 12.5 2.5 15 0 .5-1.5 0-2 0-2 0-2.5-2.5-4-2.5-4 5.5-1.5 6-11.5-5-15.5-11 4-10.5 14-5 15.5 0 0-2.5 1.5-2.5 4 0 0-.5.5 0 2zM25 8a2.5 2.5 0 1 1-5 0 2.5 2.5 0 1 1 5 0z\\\" fill=\\\"#000\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M17.5 26h10M15 30h15m-7.5-14.5v5M20 18h5\\\" stroke=\\\"#fff\\\" stroke-linejoin=\\\"miter\\\"/></g>\",\n \"k\": \"<g id=\\\"black-king\\\" class=\\\"black king\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M22.5 11.63V6\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M22.5 25s4.5-7.5 3-10.5c0 0-1-2.5-3-2.5s-3 2.5-3 2.5c-1.5 3 3 10.5 3 10.5\\\" fill=\\\"#000\\\" stroke-linecap=\\\"butt\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M11.5 37c5.5 3.5 15.5 3.5 21 0v-7s9-4.5 6-10.5c-4-6.5-13.5-3.5-16 4V27v-3.5c-3.5-7.5-13-10.5-16-4-3 6 5 10 5 10V37z\\\" fill=\\\"#000\\\"/><path d=\\\"M20 8h5\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M32 29.5s8.5-4 6.03-9.65C34.15 14 25 18 22.5 24.5l.01 2.1-.01-2.1C20 18 9.906 14 6.997 19.85c-2.497 5.65 4.853 9 4.853 9M11.5 30c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0\\\" stroke=\\\"#fff\\\"/></g>\",\n \"n\": \"<g id=\\\"black-knight\\\" class=\\\"black knight\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M 22,10 C 32.5,11 38.5,18 38,39 L 15,39 C 15,30 25,32.5 23,18\\\" style=\\\"fill:#000000; stroke:#000000;\\\"/><path d=\\\"M 24,18 C 24.38,20.91 18.45,25.37 16,27 C 13,29 13.18,31.34 11,31 C 9.958,30.06 12.41,27.96 11,28 C 10,28 11.19,29.23 10,30 C 9,30 5.997,31 6,26 C 6,24 12,14 12,14 C 12,14 13.89,12.1 14,10.5 C 13.27,9.506 13.5,8.5 13.5,7.5 C 14.5,6.5 16.5,10 16.5,10 L 18.5,10 C 18.5,10 19.28,8.008 21,7 C 22,7 22,10 22,10\\\" style=\\\"fill:#000000; stroke:#000000;\\\"/><path d=\\\"M 9.5 25.5 A 0.5 0.5 0 1 1 8.5,25.5 A 0.5 0.5 0 1 1 9.5 25.5 z\\\" style=\\\"fill:#ececec; stroke:#ececec;\\\"/><path d=\\\"M 15 15.5 A 0.5 1.5 0 1 1 14,15.5 A 0.5 1.5 0 1 1 15 15.5 z\\\" transform=\\\"matrix(0.866,0.5,-0.5,0.866,9.693,-5.173)\\\" style=\\\"fill:#ececec; stroke:#ececec;\\\"/><path d=\\\"M 24.55,10.4 L 24.1,11.85 L 24.6,12 C 27.75,13 30.25,14.49 32.5,18.75 C 34.75,23.01 35.75,29.06 35.25,39 L 35.2,39.5 L 37.45,39.5 L 37.5,39 C 38,28.94 36.62,22.15 34.25,17.66 C 31.88,13.17 28.46,11.02 25.06,10.5 L 24.55,10.4 z \\\" style=\\\"fill:#ececec; stroke:none;\\\"/></g>\",\n \"p\": \"<g id=\\\"black-pawn\\\" class=\\\"black pawn\\\"><path d=\\\"M22.5 9c-2.21 0-4 1.79-4 4 0 .89.29 1.71.78 2.38C17.33 16.5 16 18.59 16 21c0 2.03.94 3.84 2.41 5.03-3 1.06-7.41 5.55-7.41 13.47h23c0-7.92-4.41-12.41-7.41-13.47 1.47-1.19 2.41-3 2.41-5.03 0-2.41-1.33-4.5-3.28-5.62.49-.67.78-1.49.78-2.38 0-2.21-1.79-4-4-4z\\\" fill=\\\"#000\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/></g>\",\n \"q\": \"<g id=\\\"black-queen\\\" class=\\\"black queen\\\" fill=\\\"#000\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><g fill=\\\"#000\\\" stroke=\\\"none\\\"><circle cx=\\\"6\\\" cy=\\\"12\\\" r=\\\"2.75\\\"/><circle cx=\\\"14\\\" cy=\\\"9\\\" r=\\\"2.75\\\"/><circle cx=\\\"22.5\\\" cy=\\\"8\\\" r=\\\"2.75\\\"/><circle cx=\\\"31\\\" cy=\\\"9\\\" r=\\\"2.75\\\"/><circle cx=\\\"39\\\" cy=\\\"12\\\" r=\\\"2.75\\\"/></g><path d=\\\"M9 26c8.5-1.5 21-1.5 27 0l2.5-12.5L31 25l-.3-14.1-5.2 13.6-3-14.5-3 14.5-5.2-13.6L14 25 6.5 13.5 9 26zM9 26c0 2 1.5 2 2.5 4 1 1.5 1 1 .5 3.5-1.5 1-1.5 2.5-1.5 2.5-1.5 1.5.5 2.5.5 2.5 6.5 1 16.5 1 23 0 0 0 1.5-1 0-2.5 0 0 .5-1.5-1-2.5-.5-2.5-.5-2 .5-3.5 1-2 2.5-2 2.5-4-8.5-1.5-18.5-1.5-27 0z\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M11 38.5a35 35 1 0 0 23 0\\\" fill=\\\"none\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M11 29a35 35 1 0 1 23 0M12.5 31.5h20M11.5 34.5a35 35 1 0 0 22 0M10.5 37.5a35 35 1 0 0 24 0\\\" fill=\\\"none\\\" stroke=\\\"#fff\\\"/></g>\",\n \"r\": \"<g id=\\\"black-rook\\\" class=\\\"black rook\\\" fill=\\\"#000\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 39h27v-3H9v3zM12.5 32l1.5-2.5h17l1.5 2.5h-20zM12 36v-4h21v4H12z\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M14 29.5v-13h17v13H14z\\\" stroke-linecap=\\\"butt\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M14 16.5L11 14h23l-3 2.5H14zM11 14V9h4v2h5V9h5v2h5V9h4v5H11z\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M12 35.5h21M13 31.5h19M14 29.5h17M14 16.5h17M11 14h23\\\" fill=\\\"none\\\" stroke=\\\"#fff\\\" stroke-width=\\\"1\\\" stroke-linejoin=\\\"miter\\\"/></g>\",\n \"B\": \"<g id=\\\"white-bishop\\\" class=\\\"white bishop\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><g fill=\\\"#fff\\\" stroke-linecap=\\\"butt\\\"><path d=\\\"M9 36c3.39-.97 10.11.43 13.5-2 3.39 2.43 10.11 1.03 13.5 2 0 0 1.65.54 3 2-.68.97-1.65.99-3 .5-3.39-.97-10.11.46-13.5-1-3.39 1.46-10.11.03-13.5 1-1.354.49-2.323.47-3-.5 1.354-1.94 3-2 3-2zM15 32c2.5 2.5 12.5 2.5 15 0 .5-1.5 0-2 0-2 0-2.5-2.5-4-2.5-4 5.5-1.5 6-11.5-5-15.5-11 4-10.5 14-5 15.5 0 0-2.5 1.5-2.5 4 0 0-.5.5 0 2zM25 8a2.5 2.5 0 1 1-5 0 2.5 2.5 0 1 1 5 0z\\\"/></g><path d=\\\"M17.5 26h10M15 30h15m-7.5-14.5v5M20 18h5\\\" stroke-linejoin=\\\"miter\\\"/></g>\",\n \"K\": \"<g id=\\\"white-king\\\" class=\\\"white king\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M22.5 11.63V6M20 8h5\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M22.5 25s4.5-7.5 3-10.5c0 0-1-2.5-3-2.5s-3 2.5-3 2.5c-1.5 3 3 10.5 3 10.5\\\" fill=\\\"#fff\\\" stroke-linecap=\\\"butt\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M11.5 37c5.5 3.5 15.5 3.5 21 0v-7s9-4.5 6-10.5c-4-6.5-13.5-3.5-16 4V27v-3.5c-3.5-7.5-13-10.5-16-4-3 6 5 10 5 10V37z\\\" fill=\\\"#fff\\\"/><path d=\\\"M11.5 30c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0\\\"/></g>\",\n \"N\": \"<g id=\\\"white-knight\\\" class=\\\"white knight\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M 22,10 C 32.5,11 38.5,18 38,39 L 15,39 C 15,30 25,32.5 23,18\\\" style=\\\"fill:#ffffff; stroke:#000000;\\\"/><path d=\\\"M 24,18 C 24.38,20.91 18.45,25.37 16,27 C 13,29 13.18,31.34 11,31 C 9.958,30.06 12.41,27.96 11,28 C 10,28 11.19,29.23 10,30 C 9,30 5.997,31 6,26 C 6,24 12,14 12,14 C 12,14 13.89,12.1 14,10.5 C 13.27,9.506 13.5,8.5 13.5,7.5 C 14.5,6.5 16.5,10 16.5,10 L 18.5,10 C 18.5,10 19.28,8.008 21,7 C 22,7 22,10 22,10\\\" style=\\\"fill:#ffffff; stroke:#000000;\\\"/><path d=\\\"M 9.5 25.5 A 0.5 0.5 0 1 1 8.5,25.5 A 0.5 0.5 0 1 1 9.5 25.5 z\\\" style=\\\"fill:#000000; stroke:#000000;\\\"/><path d=\\\"M 15 15.5 A 0.5 1.5 0 1 1 14,15.5 A 0.5 1.5 0 1 1 15 15.5 z\\\" transform=\\\"matrix(0.866,0.5,-0.5,0.866,9.693,-5.173)\\\" style=\\\"fill:#000000; stroke:#000000;\\\"/></g>\",\n \"P\": \"<g id=\\\"white-pawn\\\" class=\\\"white pawn\\\"><path d=\\\"M22.5 9c-2.21 0-4 1.79-4 4 0 .89.29 1.71.78 2.38C17.33 16.5 16 18.59 16 21c0 2.03.94 3.84 2.41 5.03-3 1.06-7.41 5.55-7.41 13.47h23c0-7.92-4.41-12.41-7.41-13.47 1.47-1.19 2.41-3 2.41-5.03 0-2.41-1.33-4.5-3.28-5.62.49-.67.78-1.49.78-2.38 0-2.21-1.79-4-4-4z\\\" fill=\\\"#fff\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\"/></g>\",\n \"Q\": \"<g id=\\\"white-queen\\\" class=\\\"white queen\\\" fill=\\\"#fff\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M8 12a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM24.5 7.5a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM41 12a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM16 8.5a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM33 9a2 2 0 1 1-4 0 2 2 0 1 1 4 0z\\\"/><path d=\\\"M9 26c8.5-1.5 21-1.5 27 0l2-12-7 11V11l-5.5 13.5-3-15-3 15-5.5-14V25L7 14l2 12zM9 26c0 2 1.5 2 2.5 4 1 1.5 1 1 .5 3.5-1.5 1-1.5 2.5-1.5 2.5-1.5 1.5.5 2.5.5 2.5 6.5 1 16.5 1 23 0 0 0 1.5-1 0-2.5 0 0 .5-1.5-1-2.5-.5-2.5-.5-2 .5-3.5 1-2 2.5-2 2.5-4-8.5-1.5-18.5-1.5-27 0z\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M11.5 30c3.5-1 18.5-1 22 0M12 33.5c6-1 15-1 21 0\\\" fill=\\\"none\\\"/></g>\",\n \"R\": \"<g id=\\\"white-rook\\\" class=\\\"white rook\\\" fill=\\\"#fff\\\" fill-rule=\\\"evenodd\\\" stroke=\\\"#000\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 39h27v-3H9v3zM12 36v-4h21v4H12zM11 14V9h4v2h5V9h5v2h5V9h4v5\\\" stroke-linecap=\\\"butt\\\"/><path d=\\\"M34 14l-3 3H14l-3-3\\\"/><path d=\\\"M31 17v12.5H14V17\\\" stroke-linecap=\\\"butt\\\" stroke-linejoin=\\\"miter\\\"/><path d=\\\"M31 29.5l1.5 2.5h-20l1.5-2.5\\\"/><path d=\\\"M11 14h23\\\" fill=\\\"none\\\" stroke-linejoin=\\\"miter\\\"/></g>\"\n}\n", "import { spawn } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport { createInterface } from 'node:readline';\nimport { Chess } from '@zchess/chess';\n\nconst require = createRequire(import.meta.url);\nconst stockfish = require('stockfish') as { findEngine(flavor: string): string };\n\n/** Run the bundled engine in a separate process so search never blocks the CLI. */\nexport async function engineMove(fen: string, elo: number, depth: number, signal?: AbortSignal): Promise<string> {\n if (!Number.isInteger(elo) || elo < 1320 || elo > 3190) throw new Error('ELO must be an integer from 1320 to 3190.');\n if (!Number.isInteger(depth) || depth < 1 || depth > 30) throw new Error('Depth must be an integer from 1 to 30.');\n signal?.throwIfAborted();\n const position = new Chess(fen);\n if (position.status()) throw new Error('The game is over.');\n\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [stockfish.findEngine('single')], { stdio: ['pipe', 'pipe', 'ignore'] });\n const lines = createInterface({ input: child.stdout });\n let settled = false;\n const finish = (error?: Error, move?: string): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', cancel);\n lines.close();\n child.kill();\n if (error) reject(error);\n else resolve(move!);\n };\n const timer = setTimeout(() => finish(new Error('Stockfish timed out. Try a lower --depth.')), 60_000);\n const cancel = (): void => finish(new Error('Stockfish search cancelled.'));\n signal?.addEventListener('abort', cancel, { once: true });\n child.on('error', error => finish(new Error(`Could not start bundled Stockfish: ${error.message}`)));\n child.stdin.on('error', error => finish(error));\n child.on('exit', () => finish(new Error('Stockfish exited before returning a move.')));\n lines.on('line', line => {\n if (line === 'uciok') {\n child.stdin.write(`setoption name UCI_LimitStrength value true\\nsetoption name UCI_Elo value ${elo}\\nisready\\n`);\n } else if (line === 'readyok') {\n child.stdin.write(`position fen ${fen}\\ngo depth ${depth}\\n`);\n } else if (line.startsWith('bestmove ')) {\n const move = line.split(/\\s+/)[1];\n try {\n position.play(move);\n finish(undefined, move);\n } catch {\n finish(new Error('Stockfish returned an invalid move.'));\n }\n }\n });\n child.stdin.write('uci\\n');\n });\n}\n", "import { stdout } from 'node:process';\n\ninterface Output {\n columns?: number;\n rows?: number;\n write(text: string): unknown;\n}\n\n/** Keep game frames out of shell scrollback and restore the shell on exit. */\nexport class GameScreen {\n private opened = false;\n private cursorStyled = false;\n constructor(readonly active: boolean, private readonly output: Output = stdout, private readonly manageScreen = true) {}\n\n open(): void {\n if (this.active && this.manageScreen && !this.opened) {\n this.output.write('\\x1b[?1049h');\n this.opened = true;\n }\n }\n\n draw(header: string, board: string, status: string, moves = ''): void {\n if (!this.active) {\n this.output.write(`${header}\\n${moves}\\n\\n${board}\\n${status}\\n`);\n return;\n }\n const width = Math.max(1, (this.output.columns || 80) - 1);\n const fit = (text: string): string => [...text.replace(/[\\x00-\\x1f\\x7f]/g, ' ')].slice(0, width).join('');\n // Synchronized output prevents a visible blank frame between positions.\n const title = `\\x1b[38;2;224;242;215m${fit(header).padEnd(width)}\\x1b[0m`;\n const history = `\\x1b[38;2;190;221;173m${fit(moves).padEnd(width)}\\x1b[0m`;\n const horizontalPadding = Math.min(1, Math.floor((width - 1) / 2));\n const innerWidth = Math.max(1, width - horizontalPadding * 2);\n const controls = '/help';\n const visibleControls = controls.slice(-Math.min(innerWidth, controls.length));\n const statusWidth = Math.max(0, innerWidth - visibleControls.length);\n const footer = `\\x1b[38;2;224;242;215m${' '.repeat(horizontalPadding)}${fit(status).slice(0, statusWidth).padEnd(statusWidth)}${visibleControls}${' '.repeat(horizontalPadding + 1)}\\x1b[0m`;\n const bottom = Math.max(6, this.output.rows || 40);\n this.output.write('\\x1b[?2026h\\x1b[H\\x1b[2J' +\n `${title}\\r\\n${history}\\r\\n\\r\\n${board}\\x1b[${bottom - 4};1H${footer}` +\n this.inputFrame('', 'Type any moves e.g. e4 or e pawn up 2') + '\\x1b[?2026l');\n }\n\n input(value: string, placeholder = 'Type any moves e.g. e4 or e pawn up 2'): void {\n if (this.active) this.output.write(this.inputFrame(value, placeholder));\n }\n\n private inputFrame(value: string, placeholder: string): string {\n const width = Math.max(1, (this.output.columns || 80) - 1);\n const bottom = Math.max(6, this.output.rows || 40);\n const visible = [...value].slice(-Math.max(0, width - 4)).join('');\n const foreground = value ? '\\x1b[38;2;235;248;226m' : '\\x1b[38;2;139;168;144m';\n const horizontalPadding = 1;\n const fieldTextWidth = Math.max(0, width - horizontalPadding - 2);\n const shown = value\n ? [...visible].slice(-fieldTextWidth).join('')\n : [...placeholder].slice(0, Math.max(0, fieldTextWidth - 1)).join('');\n const prefix = ' ';\n const displayed = value ? shown : ` ${shown}`;\n const background = '\\x1b[48;2;12;42;34m';\n const paddingRow = `${background}${' '.repeat(width + 1)}\\x1b[0m`;\n const row = `${background}\\x1b[38;2;190;221;173m${prefix}${foreground}${displayed}${' '.repeat(Math.max(0, width + 1 - prefix.length - [...displayed].length))}\\x1b[0m`;\n const cursor = value ? Math.min(width, prefix.length + [...shown].length + 1) : 2;\n this.cursorStyled = true;\n return `\\x1b[${bottom - 2};1H${paddingRow}` +\n `\\x1b[${bottom - 1};1H${row}` +\n `\\x1b[${bottom};1H${paddingRow}\\x1b[${bottom - 1};${cursor}H\\x1b[5 q\\x1b[?25h`;\n }\n\n close(): void {\n if (this.cursorStyled) {\n this.output.write('\\x1b[0 q');\n this.cursorStyled = false;\n }\n if (this.opened) {\n this.output.write('\\x1b[?2026l\\x1b[?25h\\x1b[?1049l');\n this.opened = false;\n }\n }\n}\n\n/** Full-screen start and load menus that replace one another without scrollback. */\nexport class MenuScreen {\n private opened = false;\n constructor(readonly active: boolean, private readonly output: Output = stdout) {}\n\n open(): void {\n if (this.active && !this.opened) {\n this.output.write('\\x1b[?1049h\\x1b[?25l');\n this.opened = true;\n }\n }\n\n draw(header: string, content: string, footer: string): void {\n const width = Math.max(1, (this.output.columns || 80) - 1);\n const fit = (text: string): string => [...text.replace(/[\\x00-\\x1f\\x7f]/g, ' ')].slice(0, width).join('');\n if (!this.active) {\n this.output.write(`${header}\\n${content}\\n${footer}\\n`);\n return;\n }\n const title = `\\x1b[38;2;224;242;215m${fit(header).padEnd(width)}\\x1b[0m`;\n const horizontalPadding = Math.min(2, Math.floor((width - 1) / 2));\n const status = `\\x1b[38;2;210;225;202m${' '.repeat(horizontalPadding)}${fit(footer).slice(0, width - horizontalPadding * 2).padEnd(width - horizontalPadding * 2)}${' '.repeat(horizontalPadding)}\\x1b[0m`;\n const body = content.split('\\n').map(line => fit(line)).join('\\r\\n');\n this.output.write(`\\x1b[?25l\\x1b[?2026h\\x1b[H\\x1b[2J${title}\\r\\n\\r\\n${body}\\r\\n\\r\\n${status}\\r\\n\\x1b[?2026l`);\n }\n\n close(): void {\n if (this.opened) {\n this.output.write('\\x1b[?25h\\x1b[?1049l');\n this.opened = false;\n }\n }\n}\n", "import { DatabaseSync } from 'node:sqlite';\nimport { mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface SavedGame {\n id: number;\n createdAt: string;\n updatedAt: string;\n elo: number;\n color: 'w' | 'b';\n startFen: string;\n fen: string;\n moves: string[];\n status: string;\n}\n\nexport class GameStore {\n private readonly db: DatabaseSync;\n\n constructor(path = process.env.ZCHESS_DB_PATH || join(process.env.XDG_DATA_HOME || join(homedir(), '.local', 'share'), 'zchess', 'games.sqlite')) {\n mkdirSync(dirname(path), { recursive: true });\n this.db = new DatabaseSync(path);\n this.db.exec(`\n PRAGMA journal_mode = WAL;\n CREATE TABLE IF NOT EXISTS games (\n id INTEGER PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n elo INTEGER NOT NULL,\n color TEXT NOT NULL CHECK (color IN ('w', 'b')),\n start_fen TEXT NOT NULL,\n fen TEXT NOT NULL,\n moves TEXT NOT NULL,\n status TEXT NOT NULL\n );\n `);\n }\n\n save(game: Omit<SavedGame, 'id' | 'createdAt' | 'updatedAt'>, id?: number): number {\n const now = new Date().toISOString();\n if (id === undefined) {\n const result = this.db.prepare(`INSERT INTO games (created_at, updated_at, elo, color, start_fen, fen, moves, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(now, now, game.elo, game.color, game.startFen, game.fen, JSON.stringify(game.moves), game.status);\n return Number(result.lastInsertRowid);\n }\n this.db.prepare(`UPDATE games SET updated_at = ?, elo = ?, color = ?, start_fen = ?, fen = ?, moves = ?, status = ? WHERE id = ?`)\n .run(now, game.elo, game.color, game.startFen, game.fen, JSON.stringify(game.moves), game.status, id);\n return id;\n }\n\n list(): SavedGame[] {\n const rows = this.db.prepare('SELECT * FROM games ORDER BY updated_at DESC').all() as Array<Record<string, unknown>>;\n return rows.map(row => this.decode(row));\n }\n\n get(id: number): SavedGame | undefined {\n const row = this.db.prepare('SELECT * FROM games WHERE id = ?').get(id) as Record<string, unknown> | undefined;\n return row ? this.decode(row) : undefined;\n }\n\n close(): void { this.db.close(); }\n\n private decode(row: Record<string, unknown>): SavedGame {\n return {\n id: Number(row.id), createdAt: String(row.created_at), updatedAt: String(row.updated_at),\n elo: Number(row.elo), color: row.color === 'b' ? 'b' : 'w', startFen: String(row.start_fen), fen: String(row.fen),\n moves: JSON.parse(String(row.moves)) as string[], status: String(row.status),\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["createInterface", "stdout", "message", "move", "names", "body", "color", "require", "createRequire", "require", "createRequire", "stdout", "createInterface", "game", "elo", "listener"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zchess",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5-alpha.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22.13.0"
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
20
|
-
"url": "git+https://github.com/kennylwx/
|
|
20
|
+
"url": "git+https://github.com/kennylwx/zchess.git",
|
|
21
21
|
"directory": "apps/cli"
|
|
22
22
|
},
|
|
23
23
|
"license": "MIT",
|