Compare commits

...

27 Commits

Author SHA1 Message Date
TeamCity 18a4b1cc15 ci: bump version with Build-60 2026-05-02 15:53:05 +00:00
Janis 804a4bf179 feat(logging): add DEBUG/INFO/WARN logging across services (NCS-72) (#41)
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #41
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-05-02 17:33:27 +02:00
TeamCity 3c47d2b8c9 ci: bump version with Build-58 2026-05-01 18:23:46 +00:00
Janis d346c41d98 refactor: improve code formatting and readability
Build & Test (NowChessSystems) TeamCity build finished
2026-05-01 20:06:10 +02:00
Janis 2dd0501687 fix(middleware): update paths for bot generation and stockfish configuration
Build & Test (NowChessSystems) TeamCity build failed
refactor(bru): standardize authentication settings across requests
chore: add coordinator base URL to configuration files
2026-05-01 19:56:34 +02:00
Janis e17e4e806a feat(api): add comprehensive API collection for NowChess microservices 2026-05-01 19:55:07 +02:00
TeamCity 9f86cc421f ci: bump version with Build-57 2026-04-30 17:14:21 +00:00
Janis 3844456f0c feat(api): add comprehensive API collection for NowChess microservices
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 18:56:54 +02:00
TeamCity 77e498a326 ci: bump version with Build-56 2026-04-30 16:15:27 +00:00
Janis 3efebd5ed0 feat(config): update application.yml to nest HTTP port configuration
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 17:58:16 +02:00
TeamCity 0229147f4d ci: bump version with Build-55 2026-04-30 15:35:40 +00:00
Janis 3a0cb92256 feat(config): add H2 database configuration for testing environment
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 16:45:15 +02:00
Janis 39c9e492ce feat(config): add H2 database configuration for testing environment
Build & Test (NowChessSystems) TeamCity build failed
2026-04-30 16:29:16 +02:00
Janis 2404e6164c feat(config): update application.yml for PostgreSQL and remove staging/production configurations 2026-04-30 16:14:10 +02:00
TeamCity 6a143a462a ci: bump version with Build-54 2026-04-30 09:55:43 +00:00
Janis 5399c9bffb feat(ci): read version from versions.env for native image builds
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 11:37:55 +02:00
Janis 6113432a14 feat(config): update application.yml for staging and production environments
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 10:55:20 +02:00
Janis 952cf00413 feat(docker): update COPY command in native Dockerfile to reflect new build path
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 09:37:38 +02:00
Janis 34b9933046 feat(docker): add Dockerfiles for Quarkus application in JVM and native modes
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 09:28:02 +02:00
Janis e5fe7d07a5 feat(docker): add Dockerfiles for Quarkus application in JVM and native modes
Build & Test (NowChessSystems) TeamCity build was removed from queue
2026-04-30 08:47:36 +02:00
Janis c987d8e258 feat(docker): add .dockerignore and .gitignore files for build exclusions
Build & Test (NowChessSystems) TeamCity build was queued
2026-04-30 08:41:03 +02:00
Janis 3f2d2bb4c9 feat(docker): add Dockerfiles for building Quarkus application in native and JVM modes
Build & Test (NowChessSystems) TeamCity build failed
2026-04-30 08:32:04 +02:00
Janis 04a3ad721c feat: true-microservices (#40)
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #40
2026-04-29 22:06:20 +02:00
Janis 590924254e feat: true-microservices (#40)
Reviewed-on: #40
2026-04-29 22:06:01 +02:00
TeamCity 67511fc649 ci: bump version with Build-50 2026-04-22 08:21:04 +00:00
Janis 093134d36c feat(rule): Rules as a microservice (#39)
Build & Test (NowChessSystems) TeamCity build finished
Co-authored-by: LQ63 <lkhermann@web.de>
Co-authored-by: TeamCity <teamcity@service.local>
Reviewed-on: #39
2026-04-22 10:09:35 +02:00
Janis ffeb3ce338 fix: disable jar packaging in native image build
Build & Test (NowChessSystems) TeamCity build finished
2026-04-22 09:50:10 +02:00
483 changed files with 17052 additions and 2987 deletions
+511 -172
View File
@@ -2,11 +2,58 @@
> **Stack:** raw-http | none | unknown | scala > **Stack:** raw-http | none | unknown | scala
> 0 routes | 0 models | 0 components | 63 lib files | 1 env vars | 1 middleware > 0 routes + 40 rpc | 0 models | 0 components | 163 lib files | 1 env vars | 1 middleware
> **Token savings:** this file is ~0 tokens. Without it, AI exploration would cost ~0 tokens. **Saves ~0 tokens per conversation.** > **Token savings:** this file is ~0 tokens. Without it, AI exploration would cost ~0 tokens. **Saves ~0 tokens per conversation.**
--- ---
# Routes
## gRPC
- `/CoordinatorService/BatchResubscribeGames` (BatchResubscribeRequest) → BatchResubscribeResponse
- `/CoordinatorService/UnsubscribeGames` (UnsubscribeGamesRequest) → UnsubscribeGamesResponse
- `/CoordinatorService/EvictGames` (EvictGamesRequest) → EvictGamesResponse
- `/CoordinatorService/DrainInstance` (DrainInstanceRequest) → DrainInstanceResponse
- `/CoordinatorService/BatchResubscribeGames` (BatchResubscribeRequest) → BatchResubscribeResponse
- `/CoordinatorService/UnsubscribeGames` (UnsubscribeGamesRequest) → UnsubscribeGamesResponse
- `/CoordinatorService/EvictGames` (EvictGamesRequest) → EvictGamesResponse
- `/CoordinatorService/DrainInstance` (DrainInstanceRequest) → DrainInstanceResponse
- `/IoService/ImportFen` (ProtoImportFenRequest) → ProtoGameContext
- `/IoService/ImportPgn` (ProtoImportPgnRequest) → ProtoGameContext
- `/IoService/ExportCombined` (ProtoGameContext) → ProtoCombinedExport
- `/IoService/ExportFen` (ProtoGameContext) → ProtoStringResult
- `/IoService/ExportPgn` (ProtoGameContext) → ProtoStringResult
- `/RuleService/CandidateMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/LegalMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/AllLegalMoves` (ProtoGameContext) → ProtoMoveList
- `/RuleService/IsCheck` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsCheckmate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsStalemate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsInsufficientMaterial` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsFiftyMoveRule` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsThreefoldRepetition` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/ApplyMove` (ProtoMoveRequest) → ProtoGameContext
- `/RuleService/PostMoveStatus` (ProtoGameContext) → ProtoPostMoveStatus
- `/IoService/ImportFen` (ProtoImportFenRequest) → ProtoGameContext
- `/IoService/ImportPgn` (ProtoImportPgnRequest) → ProtoGameContext
- `/IoService/ExportCombined` (ProtoGameContext) → ProtoCombinedExport
- `/IoService/ExportFen` (ProtoGameContext) → ProtoStringResult
- `/IoService/ExportPgn` (ProtoGameContext) → ProtoStringResult
- `/RuleService/CandidateMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/LegalMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/AllLegalMoves` (ProtoGameContext) → ProtoMoveList
- `/RuleService/IsCheck` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsCheckmate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsStalemate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsInsufficientMaterial` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsFiftyMoveRule` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsThreefoldRepetition` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/ApplyMove` (ProtoMoveRequest) → ProtoGameContext
- `/RuleService/PostMoveStatus` (ProtoGameContext) → ProtoPostMoveStatus
---
# Libraries # Libraries
- `jacoco-reporter/scoverage_coverage_gaps.py` - `jacoco-reporter/scoverage_coverage_gaps.py`
@@ -25,6 +72,82 @@
- function main: () -> None - function main: () -> None
- class TestCase - class TestCase
- _...2 more_ - _...2 more_
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — class RedisConfig
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
- class Challenge
- function gameIdOpt
- function declineReasonOpt
- function timeControlLimitOpt
- function timeControlIncrementOpt
- `modules/account/src/main/scala/de/nowchess/account/domain/ChallengeColorConverter.scala` — class ChallengeColorConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/ChallengeStatusConverter.scala` — class ChallengeStatusConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/DeclineReasonConverter.scala` — class DeclineReasonConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/TimeControl.scala` — class TimeControl
- `modules/account/src/main/scala/de/nowchess/account/domain/UserAccount.scala`
- class UserAccount
- function getBotAccounts
- class BotAccount
- class OfficialBotAccount
- `modules/account/src/main/scala/de/nowchess/account/error/AccountError.scala` — function message
- `modules/account/src/main/scala/de/nowchess/account/error/ChallengeError.scala` — function message
- `modules/account/src/main/scala/de/nowchess/account/filter/AlreadyLoggedInFilter.scala` — class AlreadyLoggedInFilter
- `modules/account/src/main/scala/de/nowchess/account/repository/AccountRepository.scala`
- class UserAccountRepository
- function findByUsername
- function findById
- function persist
- function findByEmail
- function findAll
- _...11 more_
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
- class ChallengeRepository
- function findActiveByChallengerId
- function findActiveByDestUserId
- function findDuplicateChallenge
- function findById
- function persist
- _...1 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/AccountResource.scala`
- class AccountResource
- function register
- function login
- function me
- function publicProfile
- function banUser
- _...9 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
- class ChallengeResource
- function create
- function list
- function get
- function accept
- function decline
- _...1 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/OfficialChallengeResource.scala` — class OfficialChallengeResource, function challengeWithDifficulty
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
- class AccountService
- function register
- function login
- function findByUsername
- function findById
- function createBotAccount
- _...10 more_
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
- class ChallengeService
- function create
- function accept
- function decline
- function cancel
- function findById
- _...2 more_
- `modules/account/src/main/scala/de/nowchess/account/service/EventPublisher.scala`
- class EventPublisher
- function publishGameStart
- function publishChallengeCreated
- function publishChallengeAccepted
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
- class Board - class Board
- function apply - function apply
@@ -47,13 +170,18 @@
- class Square - class Square
- function fromAlgebraic - function fromAlgebraic
- function offset - function offset
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`
- class Bot
- function name
- function nextMove
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — function message
- `modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`
- function activeColor
- function afterMove
- function remainingMs
- function remainingMs
- function afterMove
- function remainingMs
- _...3 more_
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`
- function kingSquare - function kingSquare
- function withBoard - function withBoard
@@ -62,139 +190,158 @@
- function withEnPassantSquare - function withEnPassantSquare
- function withHalfMoveClock - function withHalfMoveClock
- _...4 more_ - _...4 more_
- `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`
- class ProtoMapperBase
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...17 more_
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply - `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
- `modules/api/src/main/scala/de/nowchess/api/response/ApiResponse.scala` - `modules/api/src/main/scala/de/nowchess/api/response/ApiResponse.scala`
- class ApiResponse - class ApiResponse
- function error - function error
- function totalPages - function totalPages
- `modules/bot/python/nnue.py` - `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`
- function get_weights_dir: () - class RuleSet
- function get_data_dir: () - function candidateMoves
- function list_checkpoints: () - function legalMoves
- function migrate_legacy_data: () - function allLegalMoves
- function show_header: () - function isCheck
- function show_checkpoints_table: () - function isCheckmate
- _...10 more_ - _...6 more_
- `modules/bot/python/src/dataset.py` - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/JacksonConfig.scala` — class JacksonConfig, function customize
- function get_datasets_dir: () -> Path - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/RedisConfig.scala` — class RedisConfig
- function next_dataset_version: () -> int - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/registry/BotRegistry.scala`
- function list_datasets: () -> List[Tuple[int, Dict]] - class BotRegistry
- function load_dataset_metadata: (version) -> Optional[Dict] - function register
- function save_dataset_metadata: (version, metadata) -> None - function unregister
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path - function dispatch
- _...4 more_ - function registeredBots
- `modules/bot/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss) - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/resource/BotEventResource.scala`
- `modules/bot/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers) - class BotEventResource
- `modules/bot/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers) - function streamEvents
- `modules/bot/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int - function streamGame
- `modules/bot/python/src/tactical_positions_extractor.py` - function makeMove
- function download_and_extract_puzzle_db: (url, output_dir) - `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str] - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala` — class BeansProducer, function kubernetesClient
- function load_positions_from_file: (file_path) -> Set[str] - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
- function merge_positions: (tactical, other, output_file) - class CoordinatorConfig
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int - function maxGamesPerCore
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles) - function maxDeviationPercent
- `modules/bot/python/src/train.py` - function rebalanceInterval
- function fen_to_features: (fen) - function rebalanceMinInterval
- function find_next_version: (base_name) - function heartbeatTtl
- function save_metadata: (weights_file, metadata) - _...11 more_
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes) - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/JacksonConfig.scala` — class JacksonConfig, function customize
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes) - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- class NNUEDataset - `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoordinatorGrpcServer.scala` — class CoordinatorGrpcServer
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoreGrpcClient.scala`
- class CoreGrpcClient
- function shutdown
- function batchResubscribeGames
- function unsubscribeGames
- function evictGames
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/resource/CoordinatorResource.scala`
- class CoordinatorResource
- function listInstances
- function getMetrics
- function triggerRebalance
- function triggerFailover
- function triggerScaleUp
- _...1 more_ - _...1 more_
- `modules/bot/src/main/scala/de/nowchess/bot/BotController.scala` - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/AutoScaler.scala`
- class BotController - class AutoScaler
- function getBot - function checkAndScale
- function listBots - function scaleUp
- `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` - function scaleDown
- class BotMoveRepetition - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/CacheEvictionManager.scala`
- function blockedMoves - class CacheEvictionManager
- function repeatedMove - function setRedisPrefix
- function filterAllowed - function evictStaleGames
- `modules/bot/src/main/scala/de/nowchess/bot/Config.scala` — class Config - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/FailoverService.scala`
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala` - class FailoverService
- class Evaluation - function setRedisPrefix
- class CHECKMATE_SCORE - function onInstanceStreamDropped
- class DRAW_SCORE - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/HealthMonitor.scala`
- function evaluate - class HealthMonitor
- function initAccumulator - function setRedisPrefix
- function copyAccumulator - function checkInstanceHealth
- _...2 more_ - function watchK8sPods
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala` - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/InstanceRegistry.scala`
- class EvaluationClassic - class InstanceRegistry
- function evaluate - function setRedisPrefix
- function countRay - function getInstance
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate - function getAllInstances
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala` - function updateInstanceFromRedis
- class NNUE - function markInstanceDead
- function initAccumulator - _...1 more_
- function pushAccumulator - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/LoadBalancer.scala`
- function copyAccumulator - class LoadBalancer
- function recomputeAccumulator - function setRedisPrefix
- function validateAccumulator - function shouldRebalance
- _...4 more_ - function rebalance
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala` - `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala`
- class NbaiLoader - class RuleSetRestAdapter
- function load - function candidateMoves
- function loadDefault - function legalMoves
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin - function allLegalMoves
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala` - function isCheck
- function toJson - function isCheckmate
- class NbaiMetadata - _...5 more_
- function fromJson - `modules/core/src/main/scala/de/nowchess/chess/client/IoServiceClient.scala`
- function str - class IoServiceClient
- function num - function importFen
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write - function importPgn
- `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala` - function exportFen
- function bestMove - function exportPgn
- function bestMove - function exportCombined
- function bestMoveWithTime - `modules/core/src/main/scala/de/nowchess/chess/client/RuleServiceClient.scala`
- function bestMoveWithTime - class RuleServiceClient
- function loop - function candidateMoves
- function loop - function legalMoves
- `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` - function allLegalMoves
- class MoveOrdering - function isCheck
- class OrderingContext - function isCheckmate
- function addKillerMove - _...6 more_
- function getKillerMoves - `modules/core/src/main/scala/de/nowchess/chess/client/StoreServiceClient.scala` — class StoreServiceClient, function getGame
- function addHistory
- function getHistory
- _...3 more_
- `modules/bot/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/core/src/main/scala/de/nowchess/chess/command/Command.scala`
- class Command
- function execute
- function undo
- function description
- class MoveResult
- `modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala`
- class CommandInvoker
- function execute
- function undo
- function redo
- function history
- function getCurrentIndex
- _...3 more_
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove - `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala` - `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
- class GameEngine - class GameEngine
- function board - function board
- function turn - function turn
- function context - function context
- function canUndo - function pendingDrawOfferBy
- function canRedo - function currentClockState
- _...11 more_ - _...21 more_
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiException.scala`
- class ApiException
- class GameNotFoundException
- class BadRequestException
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` — class CoreProtoMapper
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
- class IoGrpcClientWrapper
- function exportCombined
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- `modules/core/src/main/scala/de/nowchess/chess/grpc/RuleSetGrpcAdapter.scala`
- class RuleSetGrpcAdapter
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...5 more_
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` - `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`
- function context - function context
- class Observer - class Observer
@@ -203,28 +350,52 @@
- function subscribe - function subscribe
- function unsubscribe - function unsubscribe
- _...1 more_ - _...1 more_
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala` — class GameRedisPublisher, function onGameEvent
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
- class GameRedisSubscriberManager
- function subscribeGame
- function unsubscribeGame
- function batchResubscribeGames
- function unsubscribeGames
- function evictGames
- _...2 more_
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala` - `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
- class GameRegistry - class GameRegistry
- function store - function store
- function get - function get
- function update - function update
- function generateId - function generateId
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistryImpl.scala` - `modules/core/src/main/scala/de/nowchess/chess/registry/RedisGameRegistry.scala`
- class GameRegistryImpl - class RedisGameRegistry
- function generateId
- function store - function store
- function get - function get
- function update - function update
- function generateId - `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala`
- class GameDtoMapper
- function statusOf
- function moveToUci
- function toPlayerDto
- function toClockDto
- function toGameStateDto
- _...1 more_
- `modules/core/src/main/scala/de/nowchess/chess/resource/GameResource.scala` - `modules/core/src/main/scala/de/nowchess/chess/resource/GameResource.scala`
- class GameResource
- function onGameEvent - function onGameEvent
- function createGame - function createGame
- function getGame - function getGame
- function streamGame
- function onGameEvent
- function resignGame - function resignGame
- function makeMove
- _...9 more_ - _...9 more_
- `modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala` — class GameContextExport, function exportGameContext - `modules/core/src/main/scala/de/nowchess/chess/service/InstanceHeartbeatService.scala`
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala` — class GameContextImport, function importGameContext - class InstanceHeartbeatService
- function onStart
- function onShutdown
- function setRedisPrefix
- function setSubscriptionCount
- function setLocalCacheSize
- _...2 more_
- `modules/io/src/main/scala/de/nowchess/io/GameFileService.scala` - `modules/io/src/main/scala/de/nowchess/io/GameFileService.scala`
- class GameFileService - class GameFileService
- function saveGameToFile - function saveGameToFile
@@ -253,6 +424,8 @@
- function parseBoard - function parseBoard
- function importGameContext - function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares - `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala` — class IoProtoMapper
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext - `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext - `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala` - `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
@@ -265,20 +438,186 @@
- function importGameContext - function importGameContext
- function parsePgn - function parsePgn
- function parseAlgebraicMove - function parseAlgebraicMove
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala` - `modules/io/src/main/scala/de/nowchess/io/service/config/JacksonConfig.scala` — class JacksonConfig, function customize
- class RuleSet - `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/io/src/main/scala/de/nowchess/io/service/resource/IoResource.scala`
- class IoResource
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- function exportCombined
- `modules/json/src/main/scala/de/nowchess/json/ChessJacksonModule.scala` — class ChessJacksonModule
- `modules/json/src/main/scala/de/nowchess/json/GameResultDeserializer.scala` — class GameResultDeserializer
- `modules/json/src/main/scala/de/nowchess/json/GameResultSerializer.scala` — class GameResultSerializer
- `modules/json/src/main/scala/de/nowchess/json/MoveTypeDeserializer.scala` — class MoveTypeDeserializer
- `modules/json/src/main/scala/de/nowchess/json/MoveTypeSerializer.scala` — class MoveTypeSerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareDeserializer.scala` — class SquareDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
- `modules/official-bots/python/nnue.py`
- function get_weights_dir: ()
- function get_data_dir: ()
- function list_checkpoints: ()
- function migrate_legacy_data: ()
- function show_header: ()
- function show_checkpoints_table: ()
- _...10 more_
- `modules/official-bots/python/src/dataset.py`
- function get_datasets_dir: () -> Path
- function next_dataset_version: () -> int
- function list_datasets: () -> List[Tuple[int, Dict]]
- function load_dataset_metadata: (version) -> Optional[Dict]
- function save_dataset_metadata: (version, metadata) -> None
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
- _...4 more_
- `modules/official-bots/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
- `modules/official-bots/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
- `modules/official-bots/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
- `modules/official-bots/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
- `modules/official-bots/python/src/tactical_positions_extractor.py`
- function download_and_extract_puzzle_db: (url, output_dir)
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
- function load_positions_from_file: (file_path) -> Set[str]
- function merge_positions: (tactical, other, output_file)
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
- `modules/official-bots/python/src/train.py`
- function fen_to_features: (fen)
- function find_next_version: (base_name)
- function save_metadata: (weights_file, metadata)
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
- class NNUEDataset
- _...1 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotController.scala`
- class BotController
- function getBot
- function listBots
- class BotController
- function getBot
- function listBots
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
- class BotMoveRepetition
- function blockedMoves
- function repeatedMove
- function filterAllowed
- `modules/official-bots/src/main/scala/de/nowchess/bot/Config.scala` — class Config
- `modules/official-bots/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
- class Evaluation
- class CHECKMATE_SCORE
- class DRAW_SCORE
- function evaluate
- function initAccumulator
- function copyAccumulator
- _...2 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala` — class ClassicalBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/HybridBot.scala` — class HybridBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala` — class NNUEBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
- class EvaluationClassic
- function evaluate
- function countRay
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
- class NNUE
- function initAccumulator
- function pushAccumulator
- function copyAccumulator
- function recomputeAccumulator
- function validateAccumulator
- _...4 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
- class NbaiLoader
- function load
- function loadDefault
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
- function toJson
- class NbaiMetadata
- function fromJson
- function str
- function num
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/RedisConfig.scala` — class RedisConfig
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
- function bestMove
- function bestMove
- function bestMoveWithTime
- function bestMoveWithTime
- function loop
- function loop
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
- class MoveOrdering
- class OrderingContext
- function addKillerMove
- function getKillerMoves
- function addHistory
- function getHistory
- _...3 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/official-bots/src/main/scala/de/nowchess/bot/resource/OfficialBotChallengeResource.scala` — class OfficialBotChallengeResource, function challengeWithDifficulty
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/DifficultyMapper.scala` — class DifficultyMapper, function fromElo
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/OfficialBotService.scala` — class OfficialBotService, function onStart
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala` — class ProtoMapper
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
- class RuleSetResource
- function candidateMoves - function candidateMoves
- function legalMoves - function legalMoves
- function allLegalMoves - function allLegalMoves
- function isCheck - function isCheck
- function isCheckmate - function isCheckmate
- _...5 more_ - _...6 more_
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
- class DefaultRules - `modules/security/src/main/scala/de/nowchess/security/InternalAuthFilter.scala` — class InternalAuthFilter
- function positionOf - `modules/security/src/main/scala/de/nowchess/security/InternalGrpcAuthInterceptor.scala` — class InternalGrpcAuthInterceptor
- function loop - `modules/security/src/main/scala/de/nowchess/security/InternalGrpcSecretClientInterceptor.scala` — class InternalGrpcSecretClientInterceptor
- function toMoves - `modules/security/src/main/scala/de/nowchess/security/InternalSecretClientFilter.scala` — class InternalSecretClientFilter
- function loop - `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala` — class GameWritebackStreamListener, function startListening
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
- class GameRecordRepository
- function findByGameId
- function persist
- function merge
- function findByPlayerId
- function findByPlayerIdRunning
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala`
- class StoreGameResource
- function getGame
- function getRunning
- function getHistory
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
- class GameWebSocketResource
- function onOpen
- function onTextMessage
- function onClose
- `modules/ws/src/main/scala/de/nowchess/ws/resource/UserWebSocketResource.scala`
- class UserWebSocketResource
- function onOpen
- function onClose
--- ---
@@ -286,14 +625,14 @@
## Environment Variables ## Environment Variables
- `STOCKFISH_PATH` **required** — modules/bot/python/nnue.py - `STOCKFISH_PATH` **required** — modules/official-bots/python/nnue.py
--- ---
# Middleware # Middleware
## custom ## custom
- generate — `modules/bot/python/src/generate.py` - generate — `modules/official-bots/python/src/generate.py`
--- ---
@@ -301,39 +640,39 @@
## Most Imported Files (change these carefully) ## Most Imported Files (change these carefully)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **64** files - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **44** files - `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **56** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **40** files - `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **54** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **35** files - `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **27** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **19** files - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **18** files - `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **17** files - `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **17** files - `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **12** files
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala` — imported by **11** files - `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **12** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **10** files - `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **9** files - `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **7** files - `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — imported by **8** files
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala` — imported by **7** files - `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala` — imported by **6** files - `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **7** files
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala` — imported by **6** files - `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **6** files
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **5** files - `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — imported by **5** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **4** files
- `modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala` — imported by **4** files
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala` — imported by **4** files
## Import Map (who imports what) ## Import Map (who imports what)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`, `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala` +59 more - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +71 more
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` +39 more - `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +51 more
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala` +35 more - `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +49 more
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala` +30 more - `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +14 more - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineClockTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineDrawOfferTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineGameEndingTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +22 more
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +13 more - `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` +12 more - `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +12 more - `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +6 more - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +14 more
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala``modules/bot/src/test/scala/de/nowchess/bot/PolyglotHashTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/resource/GameResource.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineNotationTest.scala` +5 more - `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala`, `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` +14 more
--- ---
+1 -1
View File
@@ -2,4 +2,4 @@
## Environment Variables ## Environment Variables
- `STOCKFISH_PATH` **required** — modules/bot/python/nnue.py - `STOCKFISH_PATH` **required** — modules/official-bots/python/nnue.py
+29 -29
View File
@@ -2,36 +2,36 @@
## Most Imported Files (change these carefully) ## Most Imported Files (change these carefully)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **64** files - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **44** files - `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **56** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **40** files - `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **54** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **35** files - `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **27** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **19** files - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **18** files - `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **17** files - `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **17** files - `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **12** files
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala` — imported by **11** files - `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **12** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **10** files - `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **9** files - `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **7** files - `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — imported by **8** files
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala` — imported by **7** files - `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala` — imported by **6** files - `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **7** files
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala` — imported by **6** files - `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **6** files
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **5** files - `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — imported by **5** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **4** files
- `modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala` — imported by **4** files
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala` — imported by **4** files
## Import Map (who imports what) ## Import Map (who imports what)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`, `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala` +59 more - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +71 more
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` +39 more - `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +51 more
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala` +35 more - `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +49 more
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala` +30 more - `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +14 more - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineClockTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineDrawOfferTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineGameEndingTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +22 more
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +13 more - `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` +12 more - `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +12 more - `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +6 more - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +14 more
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala``modules/bot/src/test/scala/de/nowchess/bot/PolyglotHashTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/resource/GameResource.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineNotationTest.scala` +5 more - `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala`, `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` +14 more
+432 -140
View File
@@ -16,6 +16,82 @@
- function main: () -> None - function main: () -> None
- class TestCase - class TestCase
- _...2 more_ - _...2 more_
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — class RedisConfig
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
- class Challenge
- function gameIdOpt
- function declineReasonOpt
- function timeControlLimitOpt
- function timeControlIncrementOpt
- `modules/account/src/main/scala/de/nowchess/account/domain/ChallengeColorConverter.scala` — class ChallengeColorConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/ChallengeStatusConverter.scala` — class ChallengeStatusConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/DeclineReasonConverter.scala` — class DeclineReasonConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/TimeControl.scala` — class TimeControl
- `modules/account/src/main/scala/de/nowchess/account/domain/UserAccount.scala`
- class UserAccount
- function getBotAccounts
- class BotAccount
- class OfficialBotAccount
- `modules/account/src/main/scala/de/nowchess/account/error/AccountError.scala` — function message
- `modules/account/src/main/scala/de/nowchess/account/error/ChallengeError.scala` — function message
- `modules/account/src/main/scala/de/nowchess/account/filter/AlreadyLoggedInFilter.scala` — class AlreadyLoggedInFilter
- `modules/account/src/main/scala/de/nowchess/account/repository/AccountRepository.scala`
- class UserAccountRepository
- function findByUsername
- function findById
- function persist
- function findByEmail
- function findAll
- _...11 more_
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
- class ChallengeRepository
- function findActiveByChallengerId
- function findActiveByDestUserId
- function findDuplicateChallenge
- function findById
- function persist
- _...1 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/AccountResource.scala`
- class AccountResource
- function register
- function login
- function me
- function publicProfile
- function banUser
- _...9 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
- class ChallengeResource
- function create
- function list
- function get
- function accept
- function decline
- _...1 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/OfficialChallengeResource.scala` — class OfficialChallengeResource, function challengeWithDifficulty
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
- class AccountService
- function register
- function login
- function findByUsername
- function findById
- function createBotAccount
- _...10 more_
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
- class ChallengeService
- function create
- function accept
- function decline
- function cancel
- function findById
- _...2 more_
- `modules/account/src/main/scala/de/nowchess/account/service/EventPublisher.scala`
- class EventPublisher
- function publishGameStart
- function publishChallengeCreated
- function publishChallengeAccepted
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
- class Board - class Board
- function apply - function apply
@@ -38,13 +114,18 @@
- class Square - class Square
- function fromAlgebraic - function fromAlgebraic
- function offset - function offset
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`
- class Bot
- function name
- function nextMove
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — function message
- `modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`
- function activeColor
- function afterMove
- function remainingMs
- function remainingMs
- function afterMove
- function remainingMs
- _...3 more_
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`
- function kingSquare - function kingSquare
- function withBoard - function withBoard
@@ -53,139 +134,158 @@
- function withEnPassantSquare - function withEnPassantSquare
- function withHalfMoveClock - function withHalfMoveClock
- _...4 more_ - _...4 more_
- `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`
- class ProtoMapperBase
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...17 more_
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply - `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
- `modules/api/src/main/scala/de/nowchess/api/response/ApiResponse.scala` - `modules/api/src/main/scala/de/nowchess/api/response/ApiResponse.scala`
- class ApiResponse - class ApiResponse
- function error - function error
- function totalPages - function totalPages
- `modules/bot/python/nnue.py` - `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`
- function get_weights_dir: () - class RuleSet
- function get_data_dir: () - function candidateMoves
- function list_checkpoints: () - function legalMoves
- function migrate_legacy_data: () - function allLegalMoves
- function show_header: () - function isCheck
- function show_checkpoints_table: () - function isCheckmate
- _...10 more_ - _...6 more_
- `modules/bot/python/src/dataset.py` - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/JacksonConfig.scala` — class JacksonConfig, function customize
- function get_datasets_dir: () -> Path - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/RedisConfig.scala` — class RedisConfig
- function next_dataset_version: () -> int - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/registry/BotRegistry.scala`
- function list_datasets: () -> List[Tuple[int, Dict]] - class BotRegistry
- function load_dataset_metadata: (version) -> Optional[Dict] - function register
- function save_dataset_metadata: (version, metadata) -> None - function unregister
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path - function dispatch
- _...4 more_ - function registeredBots
- `modules/bot/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss) - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/resource/BotEventResource.scala`
- `modules/bot/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers) - class BotEventResource
- `modules/bot/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers) - function streamEvents
- `modules/bot/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int - function streamGame
- `modules/bot/python/src/tactical_positions_extractor.py` - function makeMove
- function download_and_extract_puzzle_db: (url, output_dir) - `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str] - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala` — class BeansProducer, function kubernetesClient
- function load_positions_from_file: (file_path) -> Set[str] - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
- function merge_positions: (tactical, other, output_file) - class CoordinatorConfig
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int - function maxGamesPerCore
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles) - function maxDeviationPercent
- `modules/bot/python/src/train.py` - function rebalanceInterval
- function fen_to_features: (fen) - function rebalanceMinInterval
- function find_next_version: (base_name) - function heartbeatTtl
- function save_metadata: (weights_file, metadata) - _...11 more_
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes) - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/JacksonConfig.scala` — class JacksonConfig, function customize
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes) - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- class NNUEDataset - `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoordinatorGrpcServer.scala` — class CoordinatorGrpcServer
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoreGrpcClient.scala`
- class CoreGrpcClient
- function shutdown
- function batchResubscribeGames
- function unsubscribeGames
- function evictGames
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/resource/CoordinatorResource.scala`
- class CoordinatorResource
- function listInstances
- function getMetrics
- function triggerRebalance
- function triggerFailover
- function triggerScaleUp
- _...1 more_ - _...1 more_
- `modules/bot/src/main/scala/de/nowchess/bot/BotController.scala` - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/AutoScaler.scala`
- class BotController - class AutoScaler
- function getBot - function checkAndScale
- function listBots - function scaleUp
- `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` - function scaleDown
- class BotMoveRepetition - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/CacheEvictionManager.scala`
- function blockedMoves - class CacheEvictionManager
- function repeatedMove - function setRedisPrefix
- function filterAllowed - function evictStaleGames
- `modules/bot/src/main/scala/de/nowchess/bot/Config.scala` — class Config - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/FailoverService.scala`
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala` - class FailoverService
- class Evaluation - function setRedisPrefix
- class CHECKMATE_SCORE - function onInstanceStreamDropped
- class DRAW_SCORE - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/HealthMonitor.scala`
- function evaluate - class HealthMonitor
- function initAccumulator - function setRedisPrefix
- function copyAccumulator - function checkInstanceHealth
- _...2 more_ - function watchK8sPods
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala` - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/InstanceRegistry.scala`
- class EvaluationClassic - class InstanceRegistry
- function evaluate - function setRedisPrefix
- function countRay - function getInstance
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate - function getAllInstances
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala` - function updateInstanceFromRedis
- class NNUE - function markInstanceDead
- function initAccumulator - _...1 more_
- function pushAccumulator - `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/LoadBalancer.scala`
- function copyAccumulator - class LoadBalancer
- function recomputeAccumulator - function setRedisPrefix
- function validateAccumulator - function shouldRebalance
- _...4 more_ - function rebalance
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala` - `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala`
- class NbaiLoader - class RuleSetRestAdapter
- function load - function candidateMoves
- function loadDefault - function legalMoves
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin - function allLegalMoves
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala` - function isCheck
- function toJson - function isCheckmate
- class NbaiMetadata - _...5 more_
- function fromJson - `modules/core/src/main/scala/de/nowchess/chess/client/IoServiceClient.scala`
- function str - class IoServiceClient
- function num - function importFen
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write - function importPgn
- `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala` - function exportFen
- function bestMove - function exportPgn
- function bestMove - function exportCombined
- function bestMoveWithTime - `modules/core/src/main/scala/de/nowchess/chess/client/RuleServiceClient.scala`
- function bestMoveWithTime - class RuleServiceClient
- function loop - function candidateMoves
- function loop - function legalMoves
- `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` - function allLegalMoves
- class MoveOrdering - function isCheck
- class OrderingContext - function isCheckmate
- function addKillerMove - _...6 more_
- function getKillerMoves - `modules/core/src/main/scala/de/nowchess/chess/client/StoreServiceClient.scala` — class StoreServiceClient, function getGame
- function addHistory
- function getHistory
- _...3 more_
- `modules/bot/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/core/src/main/scala/de/nowchess/chess/command/Command.scala`
- class Command
- function execute
- function undo
- function description
- class MoveResult
- `modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala`
- class CommandInvoker
- function execute
- function undo
- function redo
- function history
- function getCurrentIndex
- _...3 more_
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove - `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala` - `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
- class GameEngine - class GameEngine
- function board - function board
- function turn - function turn
- function context - function context
- function canUndo - function pendingDrawOfferBy
- function canRedo - function currentClockState
- _...11 more_ - _...21 more_
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiException.scala`
- class ApiException
- class GameNotFoundException
- class BadRequestException
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` — class CoreProtoMapper
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
- class IoGrpcClientWrapper
- function exportCombined
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- `modules/core/src/main/scala/de/nowchess/chess/grpc/RuleSetGrpcAdapter.scala`
- class RuleSetGrpcAdapter
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...5 more_
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` - `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`
- function context - function context
- class Observer - class Observer
@@ -194,28 +294,52 @@
- function subscribe - function subscribe
- function unsubscribe - function unsubscribe
- _...1 more_ - _...1 more_
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala` — class GameRedisPublisher, function onGameEvent
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
- class GameRedisSubscriberManager
- function subscribeGame
- function unsubscribeGame
- function batchResubscribeGames
- function unsubscribeGames
- function evictGames
- _...2 more_
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala` - `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
- class GameRegistry - class GameRegistry
- function store - function store
- function get - function get
- function update - function update
- function generateId - function generateId
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistryImpl.scala` - `modules/core/src/main/scala/de/nowchess/chess/registry/RedisGameRegistry.scala`
- class GameRegistryImpl - class RedisGameRegistry
- function generateId
- function store - function store
- function get - function get
- function update - function update
- function generateId - `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala`
- class GameDtoMapper
- function statusOf
- function moveToUci
- function toPlayerDto
- function toClockDto
- function toGameStateDto
- _...1 more_
- `modules/core/src/main/scala/de/nowchess/chess/resource/GameResource.scala` - `modules/core/src/main/scala/de/nowchess/chess/resource/GameResource.scala`
- class GameResource
- function onGameEvent - function onGameEvent
- function createGame - function createGame
- function getGame - function getGame
- function streamGame
- function onGameEvent
- function resignGame - function resignGame
- function makeMove
- _...9 more_ - _...9 more_
- `modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala` — class GameContextExport, function exportGameContext - `modules/core/src/main/scala/de/nowchess/chess/service/InstanceHeartbeatService.scala`
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala` — class GameContextImport, function importGameContext - class InstanceHeartbeatService
- function onStart
- function onShutdown
- function setRedisPrefix
- function setSubscriptionCount
- function setLocalCacheSize
- _...2 more_
- `modules/io/src/main/scala/de/nowchess/io/GameFileService.scala` - `modules/io/src/main/scala/de/nowchess/io/GameFileService.scala`
- class GameFileService - class GameFileService
- function saveGameToFile - function saveGameToFile
@@ -244,6 +368,8 @@
- function parseBoard - function parseBoard
- function importGameContext - function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares - `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala` — class IoProtoMapper
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext - `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext - `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala` - `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
@@ -256,17 +382,183 @@
- function importGameContext - function importGameContext
- function parsePgn - function parsePgn
- function parseAlgebraicMove - function parseAlgebraicMove
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala` - `modules/io/src/main/scala/de/nowchess/io/service/config/JacksonConfig.scala` — class JacksonConfig, function customize
- class RuleSet - `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/io/src/main/scala/de/nowchess/io/service/resource/IoResource.scala`
- class IoResource
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- function exportCombined
- `modules/json/src/main/scala/de/nowchess/json/ChessJacksonModule.scala` — class ChessJacksonModule
- `modules/json/src/main/scala/de/nowchess/json/GameResultDeserializer.scala` — class GameResultDeserializer
- `modules/json/src/main/scala/de/nowchess/json/GameResultSerializer.scala` — class GameResultSerializer
- `modules/json/src/main/scala/de/nowchess/json/MoveTypeDeserializer.scala` — class MoveTypeDeserializer
- `modules/json/src/main/scala/de/nowchess/json/MoveTypeSerializer.scala` — class MoveTypeSerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareDeserializer.scala` — class SquareDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
- `modules/official-bots/python/nnue.py`
- function get_weights_dir: ()
- function get_data_dir: ()
- function list_checkpoints: ()
- function migrate_legacy_data: ()
- function show_header: ()
- function show_checkpoints_table: ()
- _...10 more_
- `modules/official-bots/python/src/dataset.py`
- function get_datasets_dir: () -> Path
- function next_dataset_version: () -> int
- function list_datasets: () -> List[Tuple[int, Dict]]
- function load_dataset_metadata: (version) -> Optional[Dict]
- function save_dataset_metadata: (version, metadata) -> None
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
- _...4 more_
- `modules/official-bots/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
- `modules/official-bots/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
- `modules/official-bots/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
- `modules/official-bots/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
- `modules/official-bots/python/src/tactical_positions_extractor.py`
- function download_and_extract_puzzle_db: (url, output_dir)
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
- function load_positions_from_file: (file_path) -> Set[str]
- function merge_positions: (tactical, other, output_file)
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
- `modules/official-bots/python/src/train.py`
- function fen_to_features: (fen)
- function find_next_version: (base_name)
- function save_metadata: (weights_file, metadata)
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
- class NNUEDataset
- _...1 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotController.scala`
- class BotController
- function getBot
- function listBots
- class BotController
- function getBot
- function listBots
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
- class BotMoveRepetition
- function blockedMoves
- function repeatedMove
- function filterAllowed
- `modules/official-bots/src/main/scala/de/nowchess/bot/Config.scala` — class Config
- `modules/official-bots/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
- class Evaluation
- class CHECKMATE_SCORE
- class DRAW_SCORE
- function evaluate
- function initAccumulator
- function copyAccumulator
- _...2 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala` — class ClassicalBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/HybridBot.scala` — class HybridBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala` — class NNUEBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
- class EvaluationClassic
- function evaluate
- function countRay
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
- class NNUE
- function initAccumulator
- function pushAccumulator
- function copyAccumulator
- function recomputeAccumulator
- function validateAccumulator
- _...4 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
- class NbaiLoader
- function load
- function loadDefault
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
- function toJson
- class NbaiMetadata
- function fromJson
- function str
- function num
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/RedisConfig.scala` — class RedisConfig
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
- function bestMove
- function bestMove
- function bestMoveWithTime
- function bestMoveWithTime
- function loop
- function loop
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
- class MoveOrdering
- class OrderingContext
- function addKillerMove
- function getKillerMoves
- function addHistory
- function getHistory
- _...3 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/official-bots/src/main/scala/de/nowchess/bot/resource/OfficialBotChallengeResource.scala` — class OfficialBotChallengeResource, function challengeWithDifficulty
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/DifficultyMapper.scala` — class DifficultyMapper, function fromElo
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/OfficialBotService.scala` — class OfficialBotService, function onStart
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala` — class ProtoMapper
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
- class RuleSetResource
- function candidateMoves - function candidateMoves
- function legalMoves - function legalMoves
- function allLegalMoves - function allLegalMoves
- function isCheck - function isCheck
- function isCheckmate - function isCheckmate
- _...5 more_ - _...6 more_
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
- class DefaultRules - `modules/security/src/main/scala/de/nowchess/security/InternalAuthFilter.scala` — class InternalAuthFilter
- function positionOf - `modules/security/src/main/scala/de/nowchess/security/InternalGrpcAuthInterceptor.scala` — class InternalGrpcAuthInterceptor
- function loop - `modules/security/src/main/scala/de/nowchess/security/InternalGrpcSecretClientInterceptor.scala` — class InternalGrpcSecretClientInterceptor
- function toMoves - `modules/security/src/main/scala/de/nowchess/security/InternalSecretClientFilter.scala` — class InternalSecretClientFilter
- function loop - `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala` — class GameWritebackStreamListener, function startListening
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
- class GameRecordRepository
- function findByGameId
- function persist
- function merge
- function findByPlayerId
- function findByPlayerIdRunning
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala`
- class StoreGameResource
- function getGame
- function getRunning
- function getHistory
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
- class GameWebSocketResource
- function onOpen
- function onTextMessage
- function onClose
- `modules/ws/src/main/scala/de/nowchess/ws/resource/UserWebSocketResource.scala`
- class UserWebSocketResource
- function onOpen
- function onClose
+1 -1
View File
@@ -1,4 +1,4 @@
# Middleware # Middleware
## custom ## custom
- generate — `modules/bot/python/src/generate.py` - generate — `modules/official-bots/python/src/generate.py`
+44
View File
@@ -0,0 +1,44 @@
# Routes
## gRPC
- `/CoordinatorService/BatchResubscribeGames` (BatchResubscribeRequest) → BatchResubscribeResponse
- `/CoordinatorService/UnsubscribeGames` (UnsubscribeGamesRequest) → UnsubscribeGamesResponse
- `/CoordinatorService/EvictGames` (EvictGamesRequest) → EvictGamesResponse
- `/CoordinatorService/DrainInstance` (DrainInstanceRequest) → DrainInstanceResponse
- `/CoordinatorService/BatchResubscribeGames` (BatchResubscribeRequest) → BatchResubscribeResponse
- `/CoordinatorService/UnsubscribeGames` (UnsubscribeGamesRequest) → UnsubscribeGamesResponse
- `/CoordinatorService/EvictGames` (EvictGamesRequest) → EvictGamesResponse
- `/CoordinatorService/DrainInstance` (DrainInstanceRequest) → DrainInstanceResponse
- `/IoService/ImportFen` (ProtoImportFenRequest) → ProtoGameContext
- `/IoService/ImportPgn` (ProtoImportPgnRequest) → ProtoGameContext
- `/IoService/ExportCombined` (ProtoGameContext) → ProtoCombinedExport
- `/IoService/ExportFen` (ProtoGameContext) → ProtoStringResult
- `/IoService/ExportPgn` (ProtoGameContext) → ProtoStringResult
- `/RuleService/CandidateMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/LegalMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/AllLegalMoves` (ProtoGameContext) → ProtoMoveList
- `/RuleService/IsCheck` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsCheckmate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsStalemate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsInsufficientMaterial` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsFiftyMoveRule` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsThreefoldRepetition` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/ApplyMove` (ProtoMoveRequest) → ProtoGameContext
- `/RuleService/PostMoveStatus` (ProtoGameContext) → ProtoPostMoveStatus
- `/IoService/ImportFen` (ProtoImportFenRequest) → ProtoGameContext
- `/IoService/ImportPgn` (ProtoImportPgnRequest) → ProtoGameContext
- `/IoService/ExportCombined` (ProtoGameContext) → ProtoCombinedExport
- `/IoService/ExportFen` (ProtoGameContext) → ProtoStringResult
- `/IoService/ExportPgn` (ProtoGameContext) → ProtoStringResult
- `/RuleService/CandidateMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/LegalMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/AllLegalMoves` (ProtoGameContext) → ProtoMoveList
- `/RuleService/IsCheck` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsCheckmate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsStalemate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsInsufficientMaterial` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsFiftyMoveRule` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsThreefoldRepetition` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/ApplyMove` (ProtoMoveRequest) → ProtoGameContext
- `/RuleService/PostMoveStatus` (ProtoGameContext) → ProtoPostMoveStatus
+3 -3
View File
@@ -1,6 +1,6 @@
# NowChessSystems — Wiki # NowChessSystems — Wiki
_Generated 2026-04-12 — re-run `npx codesight --wiki` if the codebase has changed._ _Generated 2026-04-23 — re-run `npx codesight --wiki` if the codebase has changed._
Structural map compiled from source code via AST. No LLM — deterministic, 200ms. Structural map compiled from source code via AST. No LLM — deterministic, 200ms.
@@ -15,7 +15,7 @@ Structural map compiled from source code via AST. No LLM — deterministic, 200m
- Routes: **0** - Routes: **0**
- Models: **0** - Models: **0**
- Components: **0** - Components: **0**
- Env vars: **0** required, **0** with defaults - Env vars: **1** required, **0** with defaults
## How to Use ## How to Use
@@ -41,4 +41,4 @@ These exist in your codebase but are **not** reflected in wiki articles:
When in doubt, search the source. The wiki is a starting point, not a complete inventory. When in doubt, search the source. The wiki is a starting point, not a complete inventory.
--- ---
_Last compiled: 2026-04-12 · 2 articles · [codesight](https://github.com/Houseofmvps/codesight)_ _Last compiled: 2026-04-23 · 2 articles · [codesight](https://github.com/Houseofmvps/codesight)_
+2
View File
@@ -3,3 +3,5 @@
History of `npx codesight --wiki` runs. Capped at 20 entries. History of `npx codesight --wiki` runs. Capped at 20 entries.
## [2026-04-12 14:34:19] scan | 0 routes, 0 models, 0 components → 2 articles ## [2026-04-12 14:34:19] scan | 0 routes, 0 models, 0 components → 2 articles
## [2026-04-23 11:41:43] scan | 0 routes, 0 models, 0 components → 2 articles
+15 -7
View File
@@ -4,16 +4,24 @@
**NowChessSystems** is a scala project built with raw-http. **NowChessSystems** is a scala project built with raw-http.
## Scale
1 middleware layers · 1 environment variables
## High-Impact Files ## High-Impact Files
Changes to these files have the widest blast radius across the codebase: Changes to these files have the widest blast radius across the codebase:
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **28** files - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **74** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **21** files - `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **66** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **19** files - `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **52** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **14** files - `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **42** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **13** files - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **27** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **10** files - `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **21** files
## Required Environment Variables
- `STOCKFISH_PATH``modules/bot/python/nnue.py`
--- ---
_Back to [index.md](./index.md) · Generated 2026-04-12_ _Back to [index.md](./index.md) · Generated 2026-04-23_
+12
View File
@@ -0,0 +1,12 @@
FROM mcr.microsoft.com/devcontainers/java:21-bookworm
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
postgresql-client \
redis-tools \
stockfish \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /home/vscode/.gradle/wrapper/dists \
&& chown -R vscode:vscode /home/vscode/.gradle
+18
View File
@@ -0,0 +1,18 @@
# Devcontainer
Dieses Setup startet den NowChess-Workspace zusammen mit Redis und PostgreSQL.
## Enthaltene Services
- `workspace` Scala/Gradle-Entwicklungscontainer
- `redis` Redis 7.4
- `postgres` PostgreSQL 16
## Wichtige Ports
- App-Services: `8080`, `8081`, `8082`, `8083`, `8084`, `8085`, `8086`, `9086`
- Redis auf dem Host: `16379`
- PostgreSQL auf dem Host: `15432`
## Einstieg
- VS Code: Ordner in einem Dev Container öffnen
- IntelliJ: Dev Container / Docker-Compose-Workspace öffnen und den `workspace`-Dienst nutzen
+39
View File
@@ -0,0 +1,39 @@
{
"name": "NowChessSystems",
"dockerComposeFile": ["docker-compose.yml"],
"service": "workspace",
"workspaceFolder": "/workspaces/NowChessSystems",
"shutdownAction": "stopCompose",
"overrideCommand": false,
"remoteUser": "vscode",
"forwardPorts": [8080, 8081, 8082, 8083, 8084, 8085, 8086, 9086],
"portsAttributes": {
"8080": {"label": "NowChess Core", "onAutoForward": "notify"},
"8081": {"label": "NowChess Io", "onAutoForward": "notify"},
"8082": {"label": "NowChess Rule", "onAutoForward": "notify"},
"8083": {"label": "NowChess Account", "onAutoForward": "notify"},
"8084": {"label": "NowChess WebSocket", "onAutoForward": "notify"},
"8085": {"label": "NowChess Store", "onAutoForward": "notify"},
"8086": {"label": "NowChess Coordinator HTTP", "onAutoForward": "notify"},
"9086": {"label": "NowChess Coordinator gRPC", "onAutoForward": "notify"}
},
"customizations": {
"vscode": {
"settings": {
"java.configuration.updateBuildConfiguration": "automatic",
"java.import.gradle.wrapper.enabled": true,
"files.watcherExclude": {
"**/build/**": true,
"**/.gradle/**": true
}
},
"extensions": [
"scala-lang.scala",
"redhat.java",
"vscjava.vscode-java-pack"
]
}
},
"postCreateCommand": "bash -lc './gradlew --no-daemon help >/dev/null'"
}
+65
View File
@@ -0,0 +1,65 @@
services:
workspace:
build:
context: ..
dockerfile: .devcontainer/Dockerfile
command: sleep infinity
init: true
volumes:
- gradle-cache:/home/vscode/.gradle
environment:
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PREFIX: nowchess
DB_URL: jdbc:postgresql://postgres:5432/nowchess
DB_USER: nowchess
DB_PASSWORD: nowchess
CORE_SERVICE_URL: http://localhost:8080
INTERNAL_SECRET: dev-internal-secret
STOCKFISH_PATH: /usr/games/stockfish
NOWCHESS_COORDINATOR_ENABLED: "true"
dns:
- 8.8.8.8
- 1.1.1.1
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy
redis:
image: docker.io/redis:7.4-alpine
command: ["redis-server", "--appendonly", "yes", "--save", "60", "1"]
ports:
- "16379:6379"
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 20
start_period: 5s
postgres:
image: docker.io/postgres:16-alpine
environment:
POSTGRES_DB: nowchess
POSTGRES_USER: nowchess
POSTGRES_PASSWORD: nowchess
ports:
- "15432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
interval: 5s
timeout: 3s
retries: 20
start_period: 10s
volumes:
gradle-cache:
redis-data:
postgres-data:
+31 -4
View File
@@ -12,12 +12,21 @@ jobs:
outputs: outputs:
allowed: ${{ steps.check.outputs.allowed }} allowed: ${{ steps.check.outputs.allowed }}
steps: steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1
- id: check - id: check
run: | run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" || "${{ github.actor }}" == "TeamCity" ]]; then if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "allowed=true" >> "$GITHUB_OUTPUT" echo "allowed=true" >> "$GITHUB_OUTPUT"
else else
echo "allowed=false" >> "$GITHUB_OUTPUT" COMMIT_AUTHOR=$(git log -1 --format='%an')
if [[ "$COMMIT_AUTHOR" == "TeamCity" ]]; then
echo "allowed=true" >> "$GITHUB_OUTPUT"
else
echo "allowed=false" >> "$GITHUB_OUTPUT"
fi
fi fi
build-and-push: build-and-push:
@@ -31,8 +40,15 @@ jobs:
strategy: strategy:
matrix: matrix:
module: module:
- account
- bot-platform
- coordinator
- core - core
- io - io
- official-bots
- rule
- store
- ws
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -53,8 +69,19 @@ jobs:
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: gradle-${{ runner.os }}- restore-keys: gradle-${{ runner.os }}-
- name: Read version from versions.env
id: version
run: |
if [ -f "modules/${{ matrix.module }}/versions.env" ]; then
source modules/${{ matrix.module }}/versions.env
VERSION="${MAJOR}.${MINOR}.${PATCH}"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
else
echo "version=latest" >> "$GITHUB_OUTPUT"
fi
- name: Build native binary - name: Build native binary
run: ./gradlew :modules:${{ matrix.module }}:build -Dquarkus.native.enabled=true --no-daemon run: ./gradlew :modules:${{ matrix.module }}:build -x test -Dquarkus.native.enabled=true -Dquarkus.package.jar.enabled=false -Dquarkus.profile=deployed --no-daemon
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
@@ -72,7 +99,7 @@ jobs:
with: with:
images: ghcr.io/now-chess/now-chess-systems/${{ matrix.module }} images: ghcr.io/now-chess/now-chess-systems/${{ matrix.module }}
tags: | tags: |
type=sha,prefix=,format=short type=raw,value=${{ steps.version.outputs.version }}
type=raw,value=latest type=raw,value=latest
- name: Build and push - name: Build and push
+3
View File
@@ -41,6 +41,9 @@ bin/
graphify-out/ graphify-out/
.graphify_*.json .graphify_*.json
### Keys ###
**/keys/private.pem
### Mac OS ### ### Mac OS ###
.DS_Store .DS_Store
/jacoco-reporter/.venv/ /jacoco-reporter/.venv/
+18
View File
File diff suppressed because one or more lines are too long
+9 -2
View File
@@ -5,16 +5,23 @@
<option name="linkedExternalProjectsSettings"> <option name="linkedExternalProjectsSettings">
<GradleProjectSettings> <GradleProjectSettings>
<option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="corretto-21" /> <option name="gradleJvm" value="ms-21" />
<option name="modules"> <option name="modules">
<set> <set>
<option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/modules" /> <option value="$PROJECT_DIR$/modules" />
<option value="$PROJECT_DIR$/modules/account" />
<option value="$PROJECT_DIR$/modules/api" /> <option value="$PROJECT_DIR$/modules/api" />
<option value="$PROJECT_DIR$/modules/bot" /> <option value="$PROJECT_DIR$/modules/bot-platform" />
<option value="$PROJECT_DIR$/modules/coordinator" />
<option value="$PROJECT_DIR$/modules/core" /> <option value="$PROJECT_DIR$/modules/core" />
<option value="$PROJECT_DIR$/modules/io" /> <option value="$PROJECT_DIR$/modules/io" />
<option value="$PROJECT_DIR$/modules/json" />
<option value="$PROJECT_DIR$/modules/official-bots" />
<option value="$PROJECT_DIR$/modules/rule" /> <option value="$PROJECT_DIR$/modules/rule" />
<option value="$PROJECT_DIR$/modules/security" />
<option value="$PROJECT_DIR$/modules/store" />
<option value="$PROJECT_DIR$/modules/ws" />
</set> </set>
</option> </option>
</GradleProjectSettings> </GradleProjectSettings>
+2 -1
View File
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="FrameworkDetectionExcludesConfiguration"> <component name="FrameworkDetectionExcludesConfiguration">
<file type="web" url="file://$PROJECT_DIR$" /> <file type="web" url="file://$PROJECT_DIR$" />
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="corretto-21" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="ms-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>
+1 -1
View File
@@ -5,7 +5,7 @@
<option name="deprecationWarnings" value="true" /> <option name="deprecationWarnings" value="true" />
<option name="uncheckedWarnings" value="true" /> <option name="uncheckedWarnings" value="true" />
</profile> </profile>
<profile name="Gradle 2" modules="NowChessSystems.modules.bot.main,NowChessSystems.modules.bot.scoverage,NowChessSystems.modules.bot.test,NowChessSystems.modules.core.integrationTest,NowChessSystems.modules.core.main,NowChessSystems.modules.core.native-test,NowChessSystems.modules.core.quarkus-generated-sources,NowChessSystems.modules.core.quarkus-test-generated-sources,NowChessSystems.modules.core.scoverage,NowChessSystems.modules.core.test,NowChessSystems.modules.io.integrationTest,NowChessSystems.modules.io.main,NowChessSystems.modules.io.native-test,NowChessSystems.modules.io.quarkus-generated-sources,NowChessSystems.modules.io.quarkus-test-generated-sources,NowChessSystems.modules.io.scoverage,NowChessSystems.modules.io.test,NowChessSystems.modules.rule.main,NowChessSystems.modules.rule.scoverage,NowChessSystems.modules.rule.test,NowChessSystems.modules.ui.main,NowChessSystems.modules.ui.scoverage,NowChessSystems.modules.ui.test"> <profile name="Gradle 2" modules="NowChessSystems.modules.account.integrationTest,NowChessSystems.modules.account.main,NowChessSystems.modules.account.native-test,NowChessSystems.modules.account.quarkus-generated-sources,NowChessSystems.modules.account.quarkus-test-generated-sources,NowChessSystems.modules.account.scoverage,NowChessSystems.modules.account.test,NowChessSystems.modules.bot-platform.integrationTest,NowChessSystems.modules.bot-platform.main,NowChessSystems.modules.bot-platform.native-test,NowChessSystems.modules.bot-platform.quarkus-generated-sources,NowChessSystems.modules.bot-platform.quarkus-test-generated-sources,NowChessSystems.modules.bot-platform.scoverage,NowChessSystems.modules.bot-platform.test,NowChessSystems.modules.bot.main,NowChessSystems.modules.bot.scoverage,NowChessSystems.modules.bot.test,NowChessSystems.modules.coordinator.integrationTest,NowChessSystems.modules.coordinator.main,NowChessSystems.modules.coordinator.native-test,NowChessSystems.modules.coordinator.quarkus-generated-sources,NowChessSystems.modules.coordinator.quarkus-test-generated-sources,NowChessSystems.modules.coordinator.scoverage,NowChessSystems.modules.coordinator.test,NowChessSystems.modules.core.integrationTest,NowChessSystems.modules.core.main,NowChessSystems.modules.core.native-test,NowChessSystems.modules.core.quarkus-generated-sources,NowChessSystems.modules.core.quarkus-test-generated-sources,NowChessSystems.modules.core.scoverage,NowChessSystems.modules.core.test,NowChessSystems.modules.io.integrationTest,NowChessSystems.modules.io.main,NowChessSystems.modules.io.native-test,NowChessSystems.modules.io.quarkus-generated-sources,NowChessSystems.modules.io.quarkus-test-generated-sources,NowChessSystems.modules.io.scoverage,NowChessSystems.modules.io.test,NowChessSystems.modules.json.main,NowChessSystems.modules.json.scoverage,NowChessSystems.modules.json.test,NowChessSystems.modules.official-bots.integrationTest,NowChessSystems.modules.official-bots.main,NowChessSystems.modules.official-bots.native-test,NowChessSystems.modules.official-bots.quarkus-generated-sources,NowChessSystems.modules.official-bots.quarkus-test-generated-sources,NowChessSystems.modules.official-bots.scoverage,NowChessSystems.modules.official-bots.test,NowChessSystems.modules.rule.integrationTest,NowChessSystems.modules.rule.main,NowChessSystems.modules.rule.native-test,NowChessSystems.modules.rule.quarkus-generated-sources,NowChessSystems.modules.rule.quarkus-test-generated-sources,NowChessSystems.modules.rule.scoverage,NowChessSystems.modules.rule.test,NowChessSystems.modules.security.main,NowChessSystems.modules.security.scoverage,NowChessSystems.modules.security.test,NowChessSystems.modules.store.integrationTest,NowChessSystems.modules.store.main,NowChessSystems.modules.store.native-test,NowChessSystems.modules.store.quarkus-generated-sources,NowChessSystems.modules.store.quarkus-test-generated-sources,NowChessSystems.modules.store.scoverage,NowChessSystems.modules.store.test,NowChessSystems.modules.ui.main,NowChessSystems.modules.ui.scoverage,NowChessSystems.modules.ui.test,NowChessSystems.modules.ws.integrationTest,NowChessSystems.modules.ws.main,NowChessSystems.modules.ws.native-test,NowChessSystems.modules.ws.quarkus-generated-sources,NowChessSystems.modules.ws.quarkus-test-generated-sources,NowChessSystems.modules.ws.scoverage,NowChessSystems.modules.ws.test">
<option name="deprecationWarnings" value="true" /> <option name="deprecationWarnings" value="true" />
<option name="uncheckedWarnings" value="true" /> <option name="uncheckedWarnings" value="true" />
<parameters> <parameters>
-1
View File
@@ -22,7 +22,6 @@ Use consistently.
| `rule` | Game rules | api | | `rule` | Game rules | api |
| `bot` | Bots and AI | api,rule,io | | `bot` | Bots and AI | api,rule,io |
| `io` | Export formats | api, core | | `io` | Export formats | api, core |
| `ui` | Entrypoint & UI | core, io |
## Style ## Style
-1
View File
@@ -22,7 +22,6 @@ Try to stick to these commands for consistency.
| `rule` | Game rules | api | | `rule` | Game rules | api |
| `bot` | Bots and AI | api,rule,io | | `bot` | Bots and AI | api,rule,io |
| `io` | Export formats | api, core | | `io` | Export formats | api, core |
| `ui` | Entrypoint & UI | core, io |
## Style ## Style
@@ -0,0 +1,334 @@
# Plan: Add Coordinator Microservice
## Context
NowChess scales `core` horizontally via shared Redis but lacks:
- **Instance visibility**: no way to list running cores or their load
- **Load balancing**: games land randomly on cores; no rebalancing
- **Failover**: dead cores orphan subscriptions; bullet chess requires <1s recovery
- **Auto-scaling**: manual ops to add/remove cores
- **Cache management**: no eviction of stale games from core memory
Bullet chess games run on move timings of <3s. 30s failover = game lost on clock. Target: **<300ms failover**.
---
## Architecture: Sub-1s Failover
### Why Not Polling/TTL
- TTL expiry: minimum 10-30s detection
- HTTP polling 3x failure: 30s minimum
- **gRPC streaming TCP drop: 50-200ms** — use this as primary
### Primary: gRPC Bidirectional Streaming
- Core opens a **persistent bidirectional stream** (`CoreHeartbeatStream`) to coordinator on startup
- Core sends heartbeat frames every **200ms**
- Core crash = TCP RST/FIN → coordinator stream error in **~50-200ms**
- Stream also carries metadata updates (subscription count changes) in real-time
### Fallback: Redis Heartbeat + K8s Watch
- Redis heartbeat key `{prefix}:instances:{instanceId}` with **5s TTL**, refreshed every **2s**
- K8s pod watch via Kubernetes Java client (event-driven; handles pod eviction/OOMKill)
- Fallback covers: network partition (TCP stays up but core is zombie), coordinator restart gap
---
## Design
### 1. Module: `modules/coordinator`
**Language**: Scala 3.5.1, Quarkus REST + gRPC
**Ports**: HTTP 8086, gRPC 9086
**Dependencies**: Redisson, Kubernetes Java client, Quarkus gRPC
**Persistence**: None (all state in Redis)
---
### 2. Instance Registry
**Redis schema**:
```
{prefix}:instances:{instanceId}
- TTL: 5s (refreshed by core every 2s via background task)
- Value: JSON
{
"instanceId": "core-abc123",
"hostname": "core-pod-3",
"httpPort": 8080,
"grpcPort": 9080,
"subscriptionCount": 147,
"localCacheSize": 147,
"lastHeartbeat": "2026-04-26T10:15:30.123Z"
}
{prefix}:instance:{instanceId}:games
- Type: Redis Set (no TTL — managed explicitly)
- Members: all gameIds currently subscribed on this instance
```
**Core changes** (new `InstanceHeartbeatService` bean in `modules/core`):
- `@PostConstruct`: generate stable `instanceId` (hostname + random suffix); open gRPC stream to coordinator; publish Redis heartbeat; register in `{prefix}:instances:{instanceId}`
- Every 200ms: send heartbeat frame on gRPC stream (carries `subscriptionCount`)
- Every 2s: refresh Redis heartbeat bucket TTL
- `subscribeGame(gameId)`: `SADD {prefix}:instance:{instanceId}:games gameId`
- `unsubscribeGame(gameId)` / `evictGame(gameId)`: `SREM {prefix}:instance:{instanceId}:games gameId`
- `@PreDestroy`: delete Redis key + games set; close gRPC stream (clean shutdown)
---
### 3. Health Monitoring (3 signals, primary fast)
| Signal | Mechanism | Detection time | Role |
|--------|-----------|---------------|------|
| **gRPC stream drop** | TCP RST/FIN on bidirectional stream | 50200ms | Primary |
| **Redis heartbeat expiry** | `{prefix}:instances:{instanceId}` TTL=5s | 57s | Fallback |
| **K8s pod watch** | `CoreV1Api.listNamespacedPod` watch stream | ~instant (pod events) | Fallback |
**Dead decision**:
- gRPC stream drops → **immediate failover** (no confirmation needed; games must recover fast)
- Redis heartbeat expires (gRPC still up) → verify with single HTTP `/q/health` call → if fail: failover
- K8s pod NotReady (gRPC still up) → failover
---
### 4. Failover Protocol (<300ms target)
```
T+0ms Core JVM crashes / network drops
T+50ms Coordinator: gRPC stream error received
T+52ms SMEMBERS {prefix}:instance:{instanceId}:games → list of orphaned gameIds
T+55ms Distribute gameIds across healthy cores (least-loaded first)
T+60ms BatchResubscribeGames gRPC call(s) fire to healthy core(s)
T+150ms Healthy cores resubscribed; Redis s2c topics live again
T+200ms WebSocket clients reconnect; receive GameFullEventDto on CONNECTED
```
**Failover steps** (coordinator `FailoverService`):
1. On stream drop for `instanceId`:
a. Mark instance DEAD in local map
b. `SMEMBERS {prefix}:instance:{instanceId}:games`
c. Group gameIds into batches per target core (round-robin by load)
d. For each target core: call `BatchResubscribeGames(gameIds)`
e. Each target core: calls `subscribeGame(gameId)` for each (loads from Redis if not in local cache)
f. `DEL {prefix}:instance:{instanceId}:games` (cleanup)
2. Log failover event with count of games migrated + latency
---
### 5. Load Rebalancing
**Thresholds** (both must be evaluated):
1. **Absolute**: any core > 500 games → rebalance
2. **Relative**: max load > mean × 1.2 AND max - min > 50 games → rebalance
**Algorithm** (runs every 30s, min 60s between actual rebalances):
1. Read all `{prefix}:instances:*` keys → load map
2. Identify overloaded cores (exceed either threshold)
3. For each overloaded core: pick `excess = load - targetLoad` games
4. Assign excess games to underloaded cores
5. Call `UnsubscribeGames(gameIds)` on overloaded core
6. Call `BatchResubscribeGames(gameIds)` on target core
7. Overloaded core: `SREM` each game from its set
8. Target core: `SADD` each game to its set on subscribe
---
### 6. Auto-Scaling
**Metric**: avg `subscriptionCount` across all cores
**Actions**:
- avg > `scale-up-threshold` (80% of max): patch `nowchess-core` Argo Rollout `spec.replicas += 1`
- avg < `scale-down-threshold` (30% of max) AND `replicas > min-replicas`: drain one core then scale down
- Backoff: min 2-minute interval between scale events
**Argo Rollouts API**:
- CRD: `argoproj.io/v1alpha1`, Kind: `Rollout`, resource: `rollouts`
- Scale via Fabric8 `GenericKubernetesResource` patch on `spec.replicas`
- No StatefulSet — Argo Rollout owns pod lifecycle (canary/blue-green strategies respected)
- Pod watch filter: label selector `app=nowchess-core` (Rollout sets this; `rollouts-pod-template-hash` is Argo's equivalent of `pod-template-hash`)
**Drain before scale-down**:
1. Pick least-loaded core
2. Migrate all its games to other cores via `BatchResubscribeGames`
3. Call `DrainInstance(instanceId)` on that core (sets it to reject new subscriptions)
4. After drain confirmed: patch Rollout `spec.replicas -= 1`
---
### 7. Cache Eviction
**Trigger**: coordinator scans `{prefix}:game:entry:*` every 10 minutes
**Policy**: if `now - lastUpdated > 45min` AND `gameId` in any instance's games set → call `EvictGame`
**Effect**: core removes game from `localEngines` and `unsubscribeGame`, `SREM` from instance set
---
### 8. Proto: `coordinator_service.proto`
```proto
syntax = "proto3";
package de.nowchess.coordinator;
service CoordinatorService {
// Core → Coordinator: bidirectional stream for liveness
rpc HeartbeatStream(stream HeartbeatFrame) returns (stream CoordinatorCommand);
// Coordinator → Core: batch resubscribe after failover or rebalance
rpc BatchResubscribeGames(BatchResubscribeRequest) returns (BatchResubscribeResponse);
// Coordinator → Core: unsubscribe games (rebalance source)
rpc UnsubscribeGames(UnsubscribeGamesRequest) returns (UnsubscribeGamesResponse);
// Coordinator → Core: evict idle games from local cache
rpc EvictGames(EvictGamesRequest) returns (EvictGamesResponse);
// Coordinator → Core: drain instance before scale-down
rpc DrainInstance(DrainInstanceRequest) returns (DrainInstanceResponse);
}
message HeartbeatFrame {
string instanceId = 1;
string hostname = 2;
int32 httpPort = 3;
int32 grpcPort = 4;
int32 subscriptionCount = 5;
int32 localCacheSize = 6;
int64 timestampMillis = 7;
}
message CoordinatorCommand {
// Future: coordinator can push commands back (e.g., "start draining")
string type = 1;
string payload = 2;
}
message BatchResubscribeRequest {
repeated string gameIds = 1;
}
message BatchResubscribeResponse {
int32 subscribedCount = 1;
repeated string failedGameIds = 2;
}
message UnsubscribeGamesRequest {
repeated string gameIds = 1;
}
message UnsubscribeGamesResponse {
int32 unsubscribedCount = 1;
}
message EvictGamesRequest {
repeated string gameIds = 1;
}
message EvictGamesResponse {
int32 evictedCount = 1;
}
message DrainInstanceRequest {}
message DrainInstanceResponse {
int32 gamesMigrated = 0;
}
```
---
### 9. Coordinator REST API (internal)
- `GET /api/coordinator/instances` — all cores with load, health state
- `GET /api/coordinator/metrics` — load distribution, rebalance history
- `POST /api/coordinator/rebalance` — manual rebalance trigger
- `POST /api/coordinator/failover/{instanceId}` — manual failover
- `POST /api/coordinator/scale-up` / `scale-down` — manual scaling
---
### 10. Configuration
**`modules/coordinator/src/main/resources/application.yml`**:
```yaml
quarkus.application.name: nowchess-coordinator
quarkus.http.port: 8086
quarkus.grpc.server.port: 9086
nowchess.coordinator.max-games-per-core: 500
nowchess.coordinator.max-deviation-percent: 20
nowchess.coordinator.rebalance-interval: 30s
nowchess.coordinator.rebalance-min-interval: 60s
nowchess.coordinator.heartbeat-ttl: 5s
nowchess.coordinator.stream-heartbeat-interval: 200ms
nowchess.coordinator.cache-eviction-interval: 10m
nowchess.coordinator.game-idle-threshold: 45m
nowchess.coordinator.auto-scale-enabled: false
nowchess.coordinator.scale-up-threshold: 0.8
nowchess.coordinator.scale-down-threshold: 0.3
nowchess.coordinator.scale-min-replicas: 2
nowchess.coordinator.scale-max-replicas: 10
nowchess.coordinator.k8s-namespace: default
nowchess.coordinator.k8s-rollout-name: nowchess-core
nowchess.coordinator.k8s-rollout-label-selector: app=nowchess-core
quarkus.kubernetes-client.trust-certs: true
```
**Core `application.yml` additions**:
```yaml
nowchess.coordinator.host: localhost
nowchess.coordinator.grpc-port: 9086
nowchess.coordinator.stream-heartbeat-interval: 200ms
nowchess.coordinator.redis-heartbeat-interval: 2s
nowchess.coordinator.instance-id: ${HOSTNAME:local}-${quarkus.uuid}
```
---
### 11. Files to Create / Modify
**New — `modules/coordinator/`**:
```
build.gradle.kts
src/main/proto/coordinator_service.proto
src/main/resources/application.yml
src/main/scala/de/nowchess/coordinator/
resource/CoordinatorResource.scala # REST endpoints
service/InstanceRegistry.scala # Redis instance list + in-memory map
service/HealthMonitor.scala # gRPC stream watcher + Redis TTL + k8s watch
service/FailoverService.scala # dead core → BatchResubscribe
service/LoadBalancer.scala # rebalance logic
service/AutoScaler.scala # k8s StatefulSet scaling
service/CacheEvictionManager.scala # idle game eviction
grpc/CoordinatorGrpcServer.scala # CoordinatorService gRPC impl (for HeartbeatStream)
```
**Modify — `modules/core/`**:
- `build.gradle.kts` — add `coordinator_service.proto` stub, keep grpc dep
- `src/main/proto/coordinator_service.proto` — copy (or symlink) proto for stub generation
- `src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala``SADD`/`SREM` on subscribe/unsubscribe + implement `BatchResubscribeGames`, `UnsubscribeGames`, `EvictGames`, `DrainInstance` gRPC handlers
- `src/main/scala/de/nowchess/chess/` — new `InstanceHeartbeatService.scala` (startup, gRPC stream, Redis TTL refresh)
- `src/main/resources/application.yml` — coordinator connection config
**Modify — root**:
- `settings.gradle.kts` — add `include("modules/coordinator")`
---
## Verification
1. `./compile` — coordinator and core compile cleanly
2. **Stream detection**: start core + coordinator; kill core JVM (`kill -9`); coordinator logs failover within 300ms
3. **Game continuity**: active game on killed core; WebSocket client reconnects and receives game state
4. **Rebalance**: create 600 games on core-1 (2-core setup); coordinator rebalances ~100 to core-2
5. **Fallback**: disconnect gRPC stream manually but keep core alive; Redis TTL fallback triggers within 7s
6. **Cache eviction**: create idle game; coordinator calls `EvictGames` after 45min idle
7. **REST metrics**: `curl localhost:8086/api/coordinator/metrics` returns per-core load + health
8. **Restart recovery**: restart coordinator; gRPC streams re-establish from cores; state rebuilt from Redis
---
## Dependencies (new)
- `io.fabric8:kubernetes-client:6.13.0` (Fabric8 k8s client — handles Argo `Rollout` CRD via `GenericKubernetesResource`; no Argo Java SDK needed)
- Redisson — already in core, reuse via shared config
- Quarkus gRPC — already in core, reuse
+149
View File
@@ -0,0 +1,149 @@
# NowChess Bruno API Collection
Complete API collection for all NowChess microservices.
## Structure
```
bruno/
├── collection.bru # Collection metadata
├── environments/ # Environment configurations
│ ├── local.bru # Local development (http://localhost)
│ ├── staging.bru # Staging (https://st.nowchess.janis-eccarius.de)
│ └── prod.bru # Production (https://nowchess.janis-eccarius.de)
├── core/ # Core service endpoints (port 8080)
│ ├── game.bru # Game management
│ ├── rules.bru # Rule validation (@InternalOnly)
│ ├── io.bru # Import/Export (@InternalOnly)
│ └── coordinator.bru # Orchestration
├── account/ # Account service (port 8083)
│ ├── account.bru # User & bot accounts
│ ├── challenge.bru # Player challenges
│ └── official-challenge.bru # Official bot challenges
├── store/ # Store service (port 8085)
│ └── game.bru # Game persistence
├── ws/ # WebSocket (port 8084)
│ ├── game-ws.bru # Game real-time updates
│ └── user-ws.bru # User notifications
└── bot/ # Bot integration
└── events.bru # Bot event streaming
```
## Ingress Routing
Based on `ingress-nginx` configuration:
```yaml
/api/account → nowchess-account-active:8083
/ws → nowchess-ws-active:8084
/api/store → nowchess-store-active:8085
/api → nowchess-core-active:8080
```
## Environments
### Local Development
```
baseUrl: http://localhost:8080
accountBaseUrl: http://localhost:8083
storeBaseUrl: http://localhost:8085
wsBaseUrl: ws://localhost:8084
```
### Staging
```
baseUrl: https://st.nowchess.janis-eccarius.de/api
wsBaseUrl: wss://st.nowchess.janis-eccarius.de/ws
```
### Production
```
baseUrl: https://nowchess.janis-eccarius.de/api
wsBaseUrl: wss://nowchess.janis-eccarius.de/ws
```
## Environment Variables
Set these in your Bruno environment for authentication:
- `token`: JWT token for regular user operations
- `adminToken`: JWT token with Admin role
- `botToken`: Bot account JWT token
- `internalToken`: Internal service-to-service token
- `gameId`: Game identifier for game endpoints
- `username`: User username for profile/challenge operations
- `playerId`: Player ID for store operations
- `botId`: Bot ID for bot endpoints
- `botName`: Official bot name for challenges
- `difficulty`: Bot difficulty 1000-2800 (ELO)
- `color`: white/black/random for bot challenges
## Security Notes
From `@modules/security/src`:
- **InternalOnly** endpoints require internal service authentication
- `/api/rules/*`
- `/io/*`
- **@RolesAllowed** endpoints require JWT with specific roles
- Admin operations
- Authenticated user operations
- Internal filters validate service-to-service calls
## API Endpoints Summary
### Public Endpoints (No Auth Required)
- `GET /api/account/{username}` - Public profile
- `GET /api/account/official-bots` - List official bots
- `GET /game/{gameId}` - Game record
- `GET /api/board/game/{gameId}` - Game state
- `GET /api/board/game/{gameId}/moves` - Legal moves
### Authenticated Endpoints (JWT Required)
- `POST /api/account` - Register
- `POST /api/account/login` - Login
- `GET /api/account/me` - Current user profile
- `POST /api/challenge/*` - Challenge operations
- `POST /api/challenge/official/{botName}` - Challenge official bot
- `POST /api/account/bots` - Create bot account
- `GET /api/bot/stream/events` - Bot event stream
- `WS /api/board/game/{gameId}/ws` - Game WebSocket
- `WS /api/user/ws` - User notifications
### Internal Endpoints (@InternalOnly)
- `POST /api/rules/*` - Rule validation
- `POST /io/*` - Format conversion
- `POST /api/board/game` - Create game
## Usage
1. **Select Environment**: Click the environment dropdown and choose local/staging/prod
2. **Set Variables**: Update `token`, `gameId`, `username`, etc. as needed
3. **Send Request**: Click Send on any endpoint
4. **WebSocket**: Use Bruno's WebSocket support or connect manually with:
```bash
websocat wss://nowchess.janis-eccarius.de/ws/api/board/game/GAMEID/ws
```
## Example Workflows
### Play a Game
1. `POST /api/account` - Create user
2. `POST /api/account/login` - Get JWT token
3. `POST /api/challenge/official/Stockfish` - Challenge a bot
4. Use returned `gameId` for subsequent moves
5. `WS /api/board/game/{gameId}/ws` - Connect for real-time updates
6. `POST /api/board/game/{gameId}/move/{uci}` - Make moves
### Manage Bot Account
1. `POST /api/account` - Create main account
2. `POST /api/account/login` - Get token
3. `POST /api/account/bots` - Create bot account
4. Copy bot token from response
5. `GET /api/bot/stream/events?botId={botId}` - Listen for game invites
6. `POST /api/bot/game/{gameId}/move/{uci}` - Submit moves
## Notes
- All timestamps are ISO 8601 format
- Move notation uses UCI (e.g., "e2e4")
- Game IDs are auto-generated UUIDs
- WebSocket connections auto-close on inactivity (check your server timeout)
+28
View File
@@ -0,0 +1,28 @@
meta {
name: Register
type: http
seq: 1
}
post {
url: {{accountBaseUrl}}/account
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
}
body:json {
{
"username": "player1",
"email": "player1@example.com",
"password": "securepassword"
}
}
+27
View File
@@ -0,0 +1,27 @@
meta {
name: Login
type: http
seq: 2
}
post {
url: {{accountBaseUrl}}/account/login
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
}
body:json {
{
"username": "player1",
"password": "securepassword"
}
}
@@ -0,0 +1,21 @@
meta {
name: Get Current User
type: http
seq: 3
}
get {
url: {{accountBaseUrl}}/account/me
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
@@ -0,0 +1,20 @@
meta {
name: Get Public Profile
type: http
seq: 4
}
get {
url: {{accountBaseUrl}}/account/{{username}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Accept: application/json
}
+27
View File
@@ -0,0 +1,27 @@
meta {
name: Create Bot
type: http
seq: 5
}
post {
url: {{accountBaseUrl}}/account/bots
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{token}}
}
body:json {
{
"name": "ChessBot-1"
}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: List Bots
type: http
seq: 6
}
get {
url: {{accountBaseUrl}}/account/bots
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
@@ -0,0 +1,27 @@
meta {
name: Update Bot Name
type: http
seq: 7
}
put {
url: {{accountBaseUrl}}/account/bots/{{botId}}
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{token}}
}
body:json {
{
"name": "ChessBot-Updated"
}
}
@@ -0,0 +1,20 @@
meta {
name: Rotate Bot Token
type: http
seq: 8
}
post {
url: {{accountBaseUrl}}/account/bots/{{botId}}/rotate-token
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: Delete Bot
type: http
seq: 9
}
delete {
url: {{accountBaseUrl}}/account/bots/{{botId}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
}
@@ -0,0 +1,20 @@
meta {
name: Get Official Bots
type: http
seq: 10
}
get {
url: {{accountBaseUrl}}/account/official-bots
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Accept: application/json
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: Ban User
type: http
seq: 11
}
post {
url: {{accountBaseUrl}}/account/{{userId}}/ban
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{adminToken}}
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: Unban User
type: http
seq: 12
}
post {
url: {{accountBaseUrl}}/account/{{userId}}/unban
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{adminToken}}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: account
seq: 1
}
@@ -0,0 +1,30 @@
meta {
name: Send Challenge
type: http
seq: 1
}
post {
url: {{accountBaseUrl}}/challenge/{{username}}
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{token}}
}
body:json {
{
"timeControl": {
"limitSeconds": 600,
"incrementSeconds": 5
}
}
}
@@ -0,0 +1,21 @@
meta {
name: List Challenges
type: http
seq: 2
}
get {
url: {{accountBaseUrl}}/challenge
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
@@ -0,0 +1,21 @@
meta {
name: Get Challenge
type: http
seq: 3
}
get {
url: {{accountBaseUrl}}/challenge/{{challengeId}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
@@ -0,0 +1,20 @@
meta {
name: Accept Challenge
type: http
seq: 4
}
post {
url: {{accountBaseUrl}}/challenge/{{challengeId}}/accept
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
}
@@ -0,0 +1,27 @@
meta {
name: Decline Challenge
type: http
seq: 5
}
post {
url: {{accountBaseUrl}}/challenge/{{challengeId}}/decline
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{token}}
}
body:json {
{
"reason": "Not interested"
}
}
@@ -0,0 +1,20 @@
meta {
name: Cancel Challenge
type: http
seq: 6
}
post {
url: {{accountBaseUrl}}/challenge/{{challengeId}}/cancel
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: challenge
seq: 2
}
@@ -0,0 +1,27 @@
meta {
name: Challenge Official Bot
type: http
seq: 1
}
post {
url: {{accountBaseUrl}}/challenge/official/{{botName}}?difficulty={{difficulty}}&color={{color}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
docs {
Query Parameters:
- difficulty: 1000-2800 (ELO)
- color: white | black | random
}
@@ -0,0 +1,27 @@
meta {
name: Create Official Bot
type: http
seq: 2
}
post {
url: {{accountBaseUrl}}/account/official-bots
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{adminToken}}
}
body:json {
{
"name": "Stockfish-1000"
}
}
@@ -0,0 +1,20 @@
meta {
name: Delete Official Bot
type: http
seq: 3
}
delete {
url: {{accountBaseUrl}}/account/official-bots/{{botId}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{adminToken}}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: official
seq: 3
}
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 1 seq: 1
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/offer url: {{baseUrl}}/api/board/game/{{gameId}}/draw/offer
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 2 seq: 2
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/accept url: {{baseUrl}}/api/board/game/{{gameId}}/draw/accept
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 3 seq: 3
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/decline url: {{baseUrl}}/api/board/game/{{gameId}}/draw/decline
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 4 seq: 4
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/claim url: {{baseUrl}}/api/board/game/{{gameId}}/draw/claim
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 1 seq: 1
} }
http { get {
method: GET
url: {{baseUrl}}/api/board/game/{{gameId}}/export/fen url: {{baseUrl}}/api/board/game/{{gameId}}/export/fen
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 2 seq: 2
} }
http { get {
method: GET
url: {{baseUrl}}/api/board/game/{{gameId}}/export/pgn url: {{baseUrl}}/api/board/game/{{gameId}}/export/pgn
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+12 -4
View File
@@ -4,11 +4,15 @@ meta {
seq: 1 seq: 1
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game url: {{baseUrl}}/api/board/game
body: json body: json
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
headers { headers {
@@ -18,6 +22,10 @@ headers {
body:json { body:json {
{ {
"white": {"id": "p1", "displayName": "Alice"}, "white": {"id": "p1", "displayName": "Alice"},
"black": {"id": "p2", "displayName": "Bob"} "black": {"id": "p2", "displayName": "Bob"},
"timeControl": {
"limitSeconds": 300,
"incrementSeconds": 3
}
} }
} }
+11 -3
View File
@@ -4,9 +4,17 @@ meta {
seq: 2 seq: 2
} }
http { get {
method: GET
url: {{baseUrl}}/api/board/game/{{gameId}} url: {{baseUrl}}/api/board/game/{{gameId}}
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
vars:pre-request {
gameId: j0nPtcjl
} }
+22 -7
View File
@@ -1,19 +1,34 @@
meta { meta {
name: Stream Game name: Stream Game
type: http type: ws
seq: 3 seq: 3
} }
get { ws {
url: {{baseUrl}}/api/board/game/{{gameId}}/stream url: {{wsBaseUrl}}/api/board/game/{{gameId}}/ws
body: none body: ws
auth: none auth: none
} }
headers { body:ws {
Accept: application/x-ndjson name: move
content: '''
{
"type": "MOVE",
"uci": "b1c3"
}
'''
}
body:ws {
name: ping
content: '''
{
"type": "PING"
}
'''
} }
vars:pre-request { vars:pre-request {
gameId: tjOgyEcS gameId: j0nPtcjl
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 4 seq: 4
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/resign url: {{baseUrl}}/api/board/game/{{gameId}}/resign
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+12 -4
View File
@@ -4,11 +4,15 @@ meta {
seq: 1 seq: 1
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/import/fen url: {{baseUrl}}/api/board/game/import/fen
body: json body: json
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
headers { headers {
@@ -19,6 +23,10 @@ body:json {
{ {
"fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1", "fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",
"white": {"id": "p1", "displayName": "Alice"}, "white": {"id": "p1", "displayName": "Alice"},
"black": {"id": "p2", "displayName": "Bob"} "black": {"id": "p2", "displayName": "Bob"},
"timeControl": {
"limitSeconds": 300,
"incrementSeconds": 3
}
} }
} }
+1 -1
View File
@@ -11,5 +11,5 @@ post {
} }
vars:pre-request { vars:pre-request {
gameId: tjOgyEcS gameId: Yg200tOF
} }
+1 -1
View File
@@ -15,5 +15,5 @@ params:query {
} }
vars:pre-request { vars:pre-request {
gameId: tjOgyEcS gameId: COy3oigz
} }
+26
View File
@@ -0,0 +1,26 @@
meta {
name: Stream Bot Events
type: http
seq: 1
}
http {
method: GET
url: {{baseUrl}}/bot/stream/events?botId={{botId}}
auth: none
}
headers {
Authorization: Bearer {{botToken}}
Accept: text/event-stream
}
notes {
Server-Sent Events stream.
Bot must match token subject (botId).
Events:
- Game start notification
- Move requests
- Game end notification
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: Stream Game Events
type: http
seq: 2
}
http {
method: GET
url: {{baseUrl}}/bot/game/stream/{{gameId}}
auth: none
}
headers {
Accept: text/event-stream
}
notes {
Server-Sent Events stream of game updates.
No authentication required - broadcasts all state changes.
}
+23
View File
@@ -0,0 +1,23 @@
meta {
name: Make Bot Move
type: http
seq: 3
}
http {
method: POST
url: {{baseUrl}}/bot/game/{{gameId}}/move/{{uci}}
auth: none
}
headers {
Authorization: Bearer {{botToken}}
}
notes {
Submit move from bot.
Parameters:
- gameId: Game identifier
- uci: Move notation (e.g., e2e4)
}
+36
View File
@@ -0,0 +1,36 @@
meta {
name: NowChess API
type: http
seq: 1
}
docs {
title: NowChess Microservices API Collection
content: |
# NowChess API Collection
Complete API collection for all NowChess microservices.
## Services Architecture
- **Core** (8080): Game engine, rules validation, format import/export
- **Account** (8083): User management, bot accounts, challenges
- **Store** (8085): Game persistence and history
- **WebSocket** (8084): Real-time game updates
## Ingress Routing
- /api/account → nowchess-account-active:8083
- /ws → nowchess-ws-active:8084
- /api/store → nowchess-store-active:8085
- /api → nowchess-core-active:8080
## Environments
- **local**: http://localhost (direct service ports)
- **staging**: https://st.nowchess.janis-eccarius.de/api
- **prod**: https://nowchess.janis-eccarius.de/api
## Security
@modules/security/src contains:
- InternalAuthFilter: Validates internal service tokens
- InternalOnly: Annotation for internal endpoints (rules, io)
- JWT validation for authenticated endpoints
}
+33
View File
@@ -0,0 +1,33 @@
meta {
name: List Instances
type: http
seq: 1
}
get {
url: {{coordinatorBaseUrl}}/api/coordinator/instances
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Returns all known core instances from the in-memory registry.
Registry is populated via gRPC heartbeats from core instances.
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Response: InstanceMetadata[]
instanceId: string — unique instance ID
hostname: string
httpPort: int
grpcPort: int
subscriptionCount: int — active game subscriptions
localCacheSize: int
lastHeartbeat: string — ISO-8601 timestamp
state: string — "HEALTHY" | "DEAD"
}
+30
View File
@@ -0,0 +1,30 @@
meta {
name: List Instances
type: http
seq: 1
}
http {
method: GET
url: {{coordinatorBaseUrl}}/api/coordinator/instances
auth: none
}
headers {
Accept: application/json
}
notes {
Returns all known core instances from the in-memory registry.
Registry is populated via gRPC heartbeats from core instances.
Response: InstanceMetadata[]
instanceId: string — unique instance ID
hostname: string
httpPort: int
grpcPort: int
subscriptionCount: int — number of active game subscriptions
localCacheSize: int
lastHeartbeat: string — ISO-8601 timestamp
state: string — "HEALTHY" | "DEAD"
}
+32
View File
@@ -0,0 +1,32 @@
meta {
name: Get Metrics
type: http
seq: 2
}
get {
url: {{coordinatorBaseUrl}}/api/coordinator/metrics
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Aggregate load metrics computed from the instance registry.
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Response: MetricsDto
totalInstances: int
healthyInstances: int
deadInstances: int
totalGames: int — sum of subscriptionCount across all instances
avgGamesPerCore: double
maxGamesPerCore: int
minGamesPerCore: int
instances: InstanceMetadata[]
}
+29
View File
@@ -0,0 +1,29 @@
meta {
name: Rebalance
type: http
seq: 3
}
post {
url: {{coordinatorBaseUrl}}/api/coordinator/rebalance
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Triggers a manual rebalance of game subscriptions across core instances.
Runs asynchronously — response does not wait for completion.
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Auto-rebalance runs every 30s (rebalance-interval), min 60s between runs
(rebalance-min-interval). Triggers when load deviation exceeds 20%
(max-deviation-percent).
Response: {"status": "rebalance_started"}
}
+32
View File
@@ -0,0 +1,32 @@
meta {
name: Failover
type: http
seq: 4
}
post {
url: {{coordinatorBaseUrl}}/api/coordinator/failover/{{instanceId}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
vars:pre-request {
instanceId: core-instance-1
}
docs {
Triggers manual failover for a specific core instance.
Marks it DEAD and migrates its game subscriptions to healthy instances.
Runs asynchronously — response does not wait for completion.
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Path param: instanceId — from /instances response (instanceId field)
Response: {"status": "failover_started", "instanceId": "<id>"}
}
+28
View File
@@ -0,0 +1,28 @@
meta {
name: Scale Up
type: http
seq: 5
}
post {
url: {{coordinatorBaseUrl}}/api/coordinator/scale-up
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Triggers manual scale-up of core replicas via Kubernetes rollout.
Requires auto-scale-enabled=true and a reachable k8s API.
Respects scale-max-replicas (default: 10).
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Auto-scale triggers when avg load exceeds scale-up-threshold (default: 0.8).
Response: {"status": "scale_up_started"}
}
+28
View File
@@ -0,0 +1,28 @@
meta {
name: Scale Down
type: http
seq: 6
}
post {
url: {{coordinatorBaseUrl}}/api/coordinator/scale-down
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Triggers manual scale-down of core replicas via Kubernetes rollout.
Requires auto-scale-enabled=true and a reachable k8s API.
Respects scale-min-replicas (default: 2).
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Auto-scale triggers when avg load drops below scale-down-threshold (default: 0.3).
Response: {"status": "scale_down_started"}
}
+31
View File
@@ -0,0 +1,31 @@
meta {
name: List Instances
type: http
seq: 1
}
get {
url: {{coordinatorBaseUrl}}/api/coordinator/instances
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Returns all known core instances from the in-memory registry.
Registry is populated via gRPC heartbeats from core instances.
Response: InstanceMetadata[]
instanceId: string — unique instance ID
hostname: string
httpPort: int
grpcPort: int
subscriptionCount: int — number of active game subscriptions
localCacheSize: int
lastHeartbeat: string — ISO-8601 timestamp
state: string — "HEALTHY" | "DEAD"
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: coordinator
seq: 6
}
+26
View File
@@ -0,0 +1,26 @@
meta {
name: Create Game
type: http
seq: 1
}
http {
method: POST
url: {{baseUrl}}/board/game
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"white": {"id": "p1", "displayName": "Player 1"},
"black": {"id": "p2", "displayName": "Player 2"},
"timeControl": {"limitSeconds": 600, "incrementSeconds": 5},
"mode": "Open"
}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Get Game
type: http
seq: 2
}
http {
method: GET
url: {{baseUrl}}/board/game/{{gameId}}
auth: none
}
headers {
Accept: application/json
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Make Move
type: http
seq: 3
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/move/{{uci}}
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Get Legal Moves
type: http
seq: 4
}
http {
method: GET
url: {{baseUrl}}/board/game/{{gameId}}/moves?square={{square}}
auth: none
}
headers {
Accept: application/json
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Undo Move
type: http
seq: 5
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/undo
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Redo Move
type: http
seq: 6
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/redo
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Resign Game
type: http
seq: 7
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/resign
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+24
View File
@@ -0,0 +1,24 @@
meta {
name: Import FEN
type: http
seq: 8
}
http {
method: POST
url: {{baseUrl}}/board/game/import/fen
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",
"white": {"id": "p1", "displayName": "Player 1"},
"black": {"id": "p2", "displayName": "Player 2"}
}
}
+22
View File
@@ -0,0 +1,22 @@
meta {
name: Import PGN
type: http
seq: 9
}
http {
method: POST
url: {{baseUrl}}/board/game/import/pgn
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"pgn": "[Event \"Test Game\"]\n[Site \"NowChess\"]\n1. e4 e5 2. Nf3 Nc6"
}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Export FEN
type: http
seq: 10
}
http {
method: GET
url: {{baseUrl}}/board/game/{{gameId}}/export/fen
auth: none
}
headers {
Accept: text/plain
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Export PGN
type: http
seq: 11
}
http {
method: GET
url: {{baseUrl}}/board/game/{{gameId}}/export/pgn
auth: none
}
headers {
Accept: application/x-chess-pgn
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Offer Draw
type: http
seq: 12
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/draw/offer
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Accept Draw
type: http
seq: 13
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/draw/accept
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Decline Draw
type: http
seq: 14
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/draw/decline
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Claim Draw
type: http
seq: 15
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/draw/claim
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Request Takeback
type: http
seq: 16
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/takeback/request
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Accept Takeback
type: http
seq: 17
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/takeback/accept
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Decline Takeback
type: http
seq: 18
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/takeback/decline
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: game
seq: 1
}
+23
View File
@@ -0,0 +1,23 @@
meta {
name: Import FEN
type: http
seq: 1
}
http {
method: POST
url: {{ioBaseUrl}}/io/import/fen
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"
}
}
+23
View File
@@ -0,0 +1,23 @@
meta {
name: Import PGN
type: http
seq: 2
}
http {
method: POST
url: {{ioBaseUrl}}/io/import/pgn
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"pgn": "[Event \"Test\"]\n1. e4 e5"
}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: Export FEN
type: http
seq: 3
}
http {
method: POST
url: {{ioBaseUrl}}/io/export/fen
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: Export PGN
type: http
seq: 4
}
http {
method: POST
url: {{ioBaseUrl}}/io/export/pgn
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: io
seq: 3
}
+24
View File
@@ -0,0 +1,24 @@
meta {
name: Candidate Moves
type: http
seq: 1
}
post {
url: {{baseUrl}}/rules/candidate-moves
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"context": {},
"square": "e2"
}
}
+24
View File
@@ -0,0 +1,24 @@
meta {
name: Legal Moves
type: http
seq: 2
}
http {
method: POST
url: {{baseUrl}}/rules/legal-moves
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"context": {},
"square": "e2"
}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: All Legal Moves
type: http
seq: 3
}
http {
method: POST
url: {{baseUrl}}/rules/all-legal-moves
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{}
}

Some files were not shown because too many files have changed in this diff Show More