From dc5e6678b90a77734c576d7a384fc71a45e931e2 Mon Sep 17 00:00:00 2001 From: "claude (blind_chess)" Date: Tue, 28 Apr 2026 14:52:10 -0400 Subject: [PATCH] feat(bot): self-play harness with Casual and random baselines Co-Authored-By: Claude Sonnet 4.6 --- .secrets.baseline | 552 ++++++++++++++++++++++---------------------- package.json | 4 +- pnpm-lock.yaml | 3 + scripts/selfplay.ts | 195 ++++++++++++++++ 4 files changed, 479 insertions(+), 275 deletions(-) create mode 100644 scripts/selfplay.ts diff --git a/.secrets.baseline b/.secrets.baseline index 4fa71fa..e0e4f07 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -90,6 +90,10 @@ { "path": "detect_secrets.filters.allowlist.is_line_allowlisted" }, + { + "path": "detect_secrets.filters.common.is_baseline_file", + "filename": ".secrets.baseline" + }, { "path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies", "min_level": 2 @@ -4172,1913 +4176,1913 @@ "filename": "pnpm-lock.yaml", "hashed_secret": "d1b8345cd5758682c4e2be076930b6dee81a8f0a", "is_verified": false, - "line_number": 98 + "line_number": 101 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4fc407ff3fa666522e784402874b39ccaa9b9084", "is_verified": false, - "line_number": 104 + "line_number": 107 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "34fc2e926d119d522332afcf0b1e31be4943e728", "is_verified": false, - "line_number": 110 + "line_number": 113 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "6e53b1d7147a431758aded05223f60a6cf8404b6", "is_verified": false, - "line_number": 116 + "line_number": 119 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "ee9277ef9d8d4012e1b5e779ec43d5b9ec480348", "is_verified": false, - "line_number": 122 + "line_number": 125 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "21094ab4fc5b3c4b172a28c6e96d474b60d8f176", "is_verified": false, - "line_number": 128 + "line_number": 131 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b51ddd35a554c659b500b4c1169692da4f6cee67", "is_verified": false, - "line_number": 134 + "line_number": 137 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "57902bee1f6a5e12ed03dd3b3281ab07318ff81f", "is_verified": false, - "line_number": 140 + "line_number": 143 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "552658965b8efb6ebaf095b54636a6d54c8e4a6b", "is_verified": false, - "line_number": 146 + "line_number": 149 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3cfe66e44a47be9aa1a2b2570d4e6ca4fe8646d6", "is_verified": false, - "line_number": 152 + "line_number": 155 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "04e50569b26a331d6327f95e0a43e04435017c25", "is_verified": false, - "line_number": 158 + "line_number": 161 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "6e9116d6ceb830c0e81b752f03b594c04b867404", "is_verified": false, - "line_number": 164 + "line_number": 167 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "f427b0533ef2217b7b65d4be9d69dfb98e234645", "is_verified": false, - "line_number": 170 + "line_number": 173 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "92eb7bfdfe82cc5019dea1ead34c876de720e71f", "is_verified": false, - "line_number": 176 + "line_number": 179 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3f10b09e053c0d12d409925cdbee129e15aee7ee", "is_verified": false, - "line_number": 182 + "line_number": 185 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "f83beff54841a17222f2c5d542077e07f0a640ce", "is_verified": false, - "line_number": 188 + "line_number": 191 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7cb36fd100cc7d0102797bb6a79a28f2c4a2a33d", "is_verified": false, - "line_number": 194 + "line_number": 197 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "de1558a98424f61bb30fd681ab33ebe9ac162b93", "is_verified": false, - "line_number": 200 + "line_number": 203 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "2acca17ade2dd33b015ab19d80c162e241749350", "is_verified": false, - "line_number": 206 + "line_number": 209 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "0609a7c3993cb0b98d835bd299b5e78674c1c4e6", "is_verified": false, - "line_number": 212 + "line_number": 215 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "970ba53b3d18d68bf94e8458ec9c1b6326188d4f", "is_verified": false, - "line_number": 218 + "line_number": 221 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7cd72661910d8f1eae72b0783a01c7dcdb990036", "is_verified": false, - "line_number": 224 + "line_number": 227 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5d012814b5566671037c067991ea81d19cd07cbf", "is_verified": false, - "line_number": 230 + "line_number": 233 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c5b024f5526693865d3af7324ab65fc3ab1605fa", "is_verified": false, - "line_number": 236 + "line_number": 239 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "e0ed8c59207e32883f7f1b4b33356054c4214245", "is_verified": false, - "line_number": 242 + "line_number": 245 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7ea3a0d38529d3159199bb46bcf538993729a4ca", "is_verified": false, - "line_number": 248 + "line_number": 251 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "fa4f8c78da34eeb842b7c58de563aa7feabcb7b9", "is_verified": false, - "line_number": 254 + "line_number": 257 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "abac0dd92435eb969522a0ad244a7d5d3bcf9c90", "is_verified": false, - "line_number": 260 + "line_number": 263 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "762142615ab1dc453cd4c6e0d16d9abff71f7c3b", "is_verified": false, - "line_number": 266 + "line_number": 269 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "039980936156bd5bc0de9e386f1e385a9bbabcf0", "is_verified": false, - "line_number": 272 + "line_number": 275 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "6385b43929b2ca3cd3fc11ddc7c9429aa6799e95", "is_verified": false, - "line_number": 278 + "line_number": 281 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "ff2f515b75e908a3a079d6b0cf692f65bec13192", "is_verified": false, - "line_number": 284 + "line_number": 287 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3f729bd8163365c1bc85737b1a5091cb37d83829", "is_verified": false, - "line_number": 290 + "line_number": 293 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "43b4d7cc77f29c50ebc0ae65cdd5ae53c4610b89", "is_verified": false, - "line_number": 296 + "line_number": 299 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "00fbf776f031ec28f109bdb0502c86883d29ac01", "is_verified": false, - "line_number": 302 + "line_number": 305 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4080ae8ed6a6391c581edbf27618aa0806118784", "is_verified": false, - "line_number": 308 + "line_number": 311 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "afabc9199b55dca97a779220cf30689beace5333", "is_verified": false, - "line_number": 314 + "line_number": 317 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3e24f346b7ed723f027041976b3d2e7b555ebd90", "is_verified": false, - "line_number": 320 + "line_number": 323 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7cdd98d664bd97065578d2af7b793094d23fedb7", "is_verified": false, - "line_number": 326 + "line_number": 329 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "2b88177306d91942e3df15d0361c1fd5125db60a", "is_verified": false, - "line_number": 332 + "line_number": 335 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "611d19d8a4d5842d0970db276cdd09ae44de3df6", "is_verified": false, - "line_number": 338 + "line_number": 341 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "68d8df9678250f3f17e3c6e65e8e29e1007cd5ba", "is_verified": false, - "line_number": 344 + "line_number": 347 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "20e89c354326f9aebacc5df3bcb782d7b36edf88", "is_verified": false, - "line_number": 350 + "line_number": 353 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "a1d2a1836521ff0216663ecd5526c0a53ce86a4d", "is_verified": false, - "line_number": 356 + "line_number": 359 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "ff07375cb2a21e51b33412e3316544b3c5d575a1", "is_verified": false, - "line_number": 362 + "line_number": 365 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b1265b06c14c30da47639c2ed791f50c8d80227f", "is_verified": false, - "line_number": 368 + "line_number": 371 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c93372223d2b5bbe594d85bfc0d21dfafea217b5", "is_verified": false, - "line_number": 374 + "line_number": 377 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "17e8e3b6a6567490ad87c92962f2fe73df1a95e3", "is_verified": false, - "line_number": 380 + "line_number": 383 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "6e1232ec19c19bb978ed3a5bf123312c5648df9d", "is_verified": false, - "line_number": 386 + "line_number": 389 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b9ed31d4313f86c359571fc1caeced011e1549c8", "is_verified": false, - "line_number": 392 + "line_number": 395 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5fd341ad5e6bff70186ba90c6b39ca49c19fe297", "is_verified": false, - "line_number": 398 + "line_number": 401 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9234d6da8ceb8786f9a95485ab027085c326afee", "is_verified": false, - "line_number": 404 + "line_number": 407 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5fe3acc13d078fe4f1dc5c153bdb8514f78c1dd9", "is_verified": false, - "line_number": 410 + "line_number": 413 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "6ebe9d7b6feeca2cbb04503532b053496601ea4c", "is_verified": false, - "line_number": 413 + "line_number": 416 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4c8137bba4c60ac8c70aa9dc26f17b833b0485b5", "is_verified": false, - "line_number": 416 + "line_number": 419 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "bf0f532d4fa6ce4da69534acc295afe5d9dce2d8", "is_verified": false, - "line_number": 419 + "line_number": 422 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "0a46ec56e14c6b0f3988c65531be78c66569c035", "is_verified": false, - "line_number": 422 + "line_number": 425 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "824b72098dc6947718d316f436bb00fbe3f3f3b5", "is_verified": false, - "line_number": 425 + "line_number": 428 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "11098cf4a6594cded115edc443cb1d6c38956f3b", "is_verified": false, - "line_number": 428 + "line_number": 431 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "bd79cc98321f7be3a979a8ecf9deedc8aba70a27", "is_verified": false, - "line_number": 431 + "line_number": 434 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "a250c23ee71fb585be959874180b87fc5565084e", "is_verified": false, - "line_number": 434 + "line_number": 437 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "0da9ffd747e36f3c422029e7099e27dd5ccb412c", "is_verified": false, - "line_number": 437 + "line_number": 440 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1b3495fbdeef2dee0dc3f2ca206965663474a3d7", "is_verified": false, - "line_number": 440 + "line_number": 443 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "8733ba82d33885a92ca3009eb6ba61e505a1ee9a", "is_verified": false, - "line_number": 444 + "line_number": 447 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3e3522c83d724aa4133ee6bb6d627e4390be31a5", "is_verified": false, - "line_number": 447 + "line_number": 450 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9d1b9dbec9f048e048f4dd38591947ca7deff5dd", "is_verified": false, - "line_number": 450 + "line_number": 453 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "f60c00cacddf514ad090fbde7005d8721adc0b89", "is_verified": false, - "line_number": 454 + "line_number": 457 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b0e9cbf320ebe74507bcdaae3f0b40740459a092", "is_verified": false, - "line_number": 457 + "line_number": 460 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "393b2680ecbbb743a86d0b44313313f5d77ff202", "is_verified": false, - "line_number": 460 + "line_number": 463 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "559cb512c616ae4934092a7ceb3d42239213543d", "is_verified": false, - "line_number": 464 + "line_number": 467 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "80baf094c85a8b814390721f28df4426791950e2", "is_verified": false, - "line_number": 467 + "line_number": 470 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "19c871b99cc8a8066f7c372cc935250508cdbf7e", "is_verified": false, - "line_number": 472 + "line_number": 475 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "66eb29da9a96876a8e1b7fefb901f6b582e14b33", "is_verified": false, - "line_number": 477 + "line_number": 480 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5ce412f8142bfcc2b11a375e1c91a3a54ca8c0ae", "is_verified": false, - "line_number": 482 + "line_number": 485 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3e47d4fda361e2553fee0d1f059b0b135fcce98f", "is_verified": false, - "line_number": 487 + "line_number": 490 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7ce2d9200e0e41b2ee19b821089b6a95a39bc509", "is_verified": false, - "line_number": 492 + "line_number": 495 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b68b16505cf49c5f3cb98af1b54893a1a79565a5", "is_verified": false, - "line_number": 497 + "line_number": 500 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b41be781eb3b0c4750e39d09dcdd6a3494f1f357", "is_verified": false, - "line_number": 503 + "line_number": 506 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "f99a49bc745631a8b7085149e82a79811d9bac8c", "is_verified": false, - "line_number": 509 + "line_number": 512 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "edeb02a82bcc0b255ba89f276f37e4091792f4fe", "is_verified": false, - "line_number": 515 + "line_number": 518 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7691f9054b1626b357caca8a9f8e83eb8ac84def", "is_verified": false, - "line_number": 521 + "line_number": 524 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b77dfdeb5ffee23aff3b2f97ff640802ad415a3c", "is_verified": false, - "line_number": 527 + "line_number": 530 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "94297c922da678a24c4fc963af0da51d961d8fe5", "is_verified": false, - "line_number": 533 + "line_number": 536 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1f0eb8fb4434346c68f359042c9fc254c1c46be6", "is_verified": false, - "line_number": 539 + "line_number": 542 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5d67ae5d1c2f8a622e078f0d8d16670619aa561e", "is_verified": false, - "line_number": 545 + "line_number": 548 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "fee3efd07b8abcb9d734d6f324253508f7501156", "is_verified": false, - "line_number": 551 + "line_number": 554 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1380cb2734346cc00e41eb54cdd94860f4859e2c", "is_verified": false, - "line_number": 557 + "line_number": 560 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5aea3dce81939048d287d7761e40642490194d09", "is_verified": false, - "line_number": 563 + "line_number": 566 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "11487ba85b40245c0bb0e34846085b8714439652", "is_verified": false, - "line_number": 569 + "line_number": 572 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9f2824e8182be80a655c1164a0c7d043abe0b2e8", "is_verified": false, - "line_number": 575 + "line_number": 578 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "87bb0e1e3669074c5cda58de04798789e0eda61d", "is_verified": false, - "line_number": 580 + "line_number": 583 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5423261b835b9649ae476fc59e957f6cb03b2369", "is_verified": false, - "line_number": 585 + "line_number": 588 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c62e701dc37732b77d24e97d4676d597a1e1ce41", "is_verified": false, - "line_number": 590 + "line_number": 593 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "58a0c6f04ab904bada0f96e79f61f7633b8e8554", "is_verified": false, - "line_number": 595 + "line_number": 598 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5ac63bbb4857e2c672bef90951ed012b5e1a3099", "is_verified": false, - "line_number": 600 + "line_number": 603 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "0e08e31e43853476fc57d10643d8c871082c08b3", "is_verified": false, - "line_number": 605 + "line_number": 608 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b31d08ed4329a2b257e3183cdb4917a06ff76acf", "is_verified": false, - "line_number": 610 + "line_number": 613 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b74484fafbbaf80a55364e035669088e7fd44b6c", "is_verified": false, - "line_number": 618 + "line_number": 621 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7739c7a36e8b5c9759887d54c3d3a252d017cb71", "is_verified": false, - "line_number": 625 + "line_number": 628 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "d4dda0583372eb865e22ea00ae160ceb315aa0df", "is_verified": false, - "line_number": 628 + "line_number": 631 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "904dae7e3147870781ad476afdbc281061d76e62", "is_verified": false, - "line_number": 631 + "line_number": 634 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4a96348ad16d0abe922e3e2c78b1b4d82a9b3f07", "is_verified": false, - "line_number": 634 + "line_number": 637 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5f411c7e6073b67aca1c9043e3e952322dc21d46", "is_verified": false, - "line_number": 637 + "line_number": 640 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "618a8148c9899b3b6bd69562f235038dc7953718", "is_verified": false, - "line_number": 640 + "line_number": 643 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5c4d2062f4b9170e2571cfe2b901592767edc7cd", "is_verified": false, - "line_number": 643 + "line_number": 646 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "2a04ad8254d18f2f4403c9056e67951c1e0fb0a5", "is_verified": false, - "line_number": 646 + "line_number": 649 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "a7655c0dea3997e8ee27a2090dc9eb749a7b1282", "is_verified": false, - "line_number": 657 + "line_number": 660 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "2c684cbb0ceecbae320bff3152c0f2b1b3434c7e", "is_verified": false, - "line_number": 660 + "line_number": 663 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "6ff1feade4ea98d27ec8f31fa2dbcfd3d2a5028f", "is_verified": false, - "line_number": 663 + "line_number": 666 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "359e9803b99c38d739e61ade83000c2ab5a22448", "is_verified": false, - "line_number": 666 + "line_number": 669 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b0af613d49499b2f6f2643ef7acf1a219e9e6fb6", "is_verified": false, - "line_number": 669 + "line_number": 672 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "86c936c2fd0b15334fb3e7e08ea42b385c42f7a1", "is_verified": false, - "line_number": 672 + "line_number": 675 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "a3fde05f04dec549057c3104497d942072394189", "is_verified": false, - "line_number": 676 + "line_number": 679 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b2c03df0ed8f8caded3abab58c3b2e3b645dbb28", "is_verified": false, - "line_number": 679 + "line_number": 682 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4f6636587fecd2341ba754a447e6a26db011795f", "is_verified": false, - "line_number": 684 + "line_number": 687 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "07860d1f8563c118dfa14b8c27bfef9420e3f8c2", "is_verified": false, - "line_number": 692 + "line_number": 695 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5bb90e7e3d7847438b155c9fb564dfd279383855", "is_verified": false, - "line_number": 695 + "line_number": 698 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1c504c77e2b9f1ea0e1770e65673fd7f8b3f4c8f", "is_verified": false, - "line_number": 699 + "line_number": 702 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "6f5c4f8389922a6637a0b4fdb837095b494c0bfb", "is_verified": false, - "line_number": 703 + "line_number": 706 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "38604ae508f167b156742a5c072915272fb37857", "is_verified": false, - "line_number": 707 + "line_number": 710 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4a6acdb47bbd22c85e10baf5921ddbb3c09a787b", "is_verified": false, - "line_number": 710 + "line_number": 713 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "e0ed71a4c2836a6a251bef5e00b00401cfac286d", "is_verified": false, - "line_number": 714 + "line_number": 717 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7bb507ba2f47095177b03051a6340091be5871b2", "is_verified": false, - "line_number": 718 + "line_number": 721 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5389eb7ce46c53e5d6adc57d5bafb1180870b814", "is_verified": false, - "line_number": 721 + "line_number": 724 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9748716a465dd6d055354fd346c4cd105b7d39b1", "is_verified": false, - "line_number": 725 + "line_number": 728 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c56c76bc828483f5553df346fb2eaa6e3e6c4bba", "is_verified": false, - "line_number": 728 + "line_number": 731 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5620b727309eb0585715c051b3f1ad6560879967", "is_verified": false, - "line_number": 732 + "line_number": 735 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "fd40953175f0c99e010e94312afacb63e7f1a817", "is_verified": false, - "line_number": 736 + "line_number": 739 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "8095985919187b5be33de4b775c7a5e7562aafee", "is_verified": false, - "line_number": 740 + "line_number": 743 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "8ff61e34bccd3c9f85c8a24db9723d984fd74314", "is_verified": false, - "line_number": 743 + "line_number": 746 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5974b42acc3c558a08c734a45a10785534b5d382", "is_verified": false, - "line_number": 747 + "line_number": 750 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1dae660604ec052e4c8dfd54b0657636c412a22b", "is_verified": false, - "line_number": 751 + "line_number": 754 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "f52956fa7c317746fde250d0f4e54d6115252cd4", "is_verified": false, - "line_number": 754 + "line_number": 757 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "8f16039bc2ed9b93d8e319897b70cb25f25dfcc4", "is_verified": false, - "line_number": 758 + "line_number": 761 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "862951cd71d0412b5e52bae3e952725486a655b0", "is_verified": false, - "line_number": 762 + "line_number": 765 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "ab4bcd85dbb08e2c7721a4842f74653506829466", "is_verified": false, - "line_number": 766 + "line_number": 769 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "d45062677e99f28b9a98f4b53e9af8f56b01bb10", "is_verified": false, - "line_number": 769 + "line_number": 772 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b4a9257558064dbd957e726d9d25d81b97837009", "is_verified": false, - "line_number": 778 + "line_number": 781 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c0c7aeed5e5a888b2aa3cdb739955fd27d25335e", "is_verified": false, - "line_number": 782 + "line_number": 785 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c5deff9c59d0e0419952da44431546620804d70e", "is_verified": false, - "line_number": 786 + "line_number": 789 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "d031e18cc14e54a719197084af4cd6b2372fd005", "is_verified": false, - "line_number": 790 + "line_number": 793 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "183c0616018161acd77ce39914e9bb5a22fcae49", "is_verified": false, - "line_number": 794 + "line_number": 797 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "309db07fa3cab58e7ea5fc5ba8f629a4430fa6a6", "is_verified": false, - "line_number": 797 + "line_number": 800 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "fc231c807593551488e1df5cd5d488e39f7db93f", "is_verified": false, - "line_number": 800 + "line_number": 803 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "d076e5a9f2245bcedf234f70abb7fa41d4d9f0dc", "is_verified": false, - "line_number": 803 + "line_number": 806 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "bf4a0e0cb4a648f94a1ceff84d8070ab01b0df0e", "is_verified": false, - "line_number": 806 + "line_number": 809 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "cab616f3cdb6eb3c372039eeae16f83314439923", "is_verified": false, - "line_number": 811 + "line_number": 814 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "cc0394ae9ff7278ac1f8ba8305e06627798ae34b", "is_verified": false, - "line_number": 816 + "line_number": 819 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4a1a266072e5f401e1aa928a9bf6d94bfeab4806", "is_verified": false, - "line_number": 819 + "line_number": 822 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "50c2ef2e538e117e2c5cb97fd9678257c05daea1", "is_verified": false, - "line_number": 822 + "line_number": 825 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "763f4272f5426f2cb52dd90f1f6a490a4ce61418", "is_verified": false, - "line_number": 830 + "line_number": 833 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "bdc1322162b3c2d06c4103afb50937bf6085ebf2", "is_verified": false, - "line_number": 833 + "line_number": 836 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3446aea3a08fd97b7eb1beac15a525d1b4586864", "is_verified": false, - "line_number": 837 + "line_number": 840 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "16d0c877fca994fd1c43bd7f131be967bf4f87b6", "is_verified": false, - "line_number": 841 + "line_number": 844 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "373eefae8f0bb627d355aa0997dbf702a2274642", "is_verified": false, - "line_number": 845 + "line_number": 848 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c7018ff5fd96eec2abbadb93bb97d56f00235687", "is_verified": false, - "line_number": 848 + "line_number": 851 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c0f64a532897bbd5497996fdfec7cfcd087540ce", "is_verified": false, - "line_number": 851 + "line_number": 854 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4e742e60616be1578b81769f2ffd9bef51586512", "is_verified": false, - "line_number": 854 + "line_number": 857 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5ffcc7770e283fe45a96c1ba2bc21dd7f38458b5", "is_verified": false, - "line_number": 857 + "line_number": 860 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "38a37f53e7403dabad025e1d953382e82ff53762", "is_verified": false, - "line_number": 860 + "line_number": 863 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "a175423c144b95f8ef14eca365738012ae8ff166", "is_verified": false, - "line_number": 863 + "line_number": 866 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "2f00e7db8ba09014a8f7ae078346fd4630c8ee54", "is_verified": false, - "line_number": 866 + "line_number": 869 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b3edf680cb58f88cd49833b666c6c1b310fd4c90", "is_verified": false, - "line_number": 869 + "line_number": 872 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "02031683c4d321f8660ff8b2d0258362940c8a6d", "is_verified": false, - "line_number": 872 + "line_number": 875 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "16fa3bfaeef78e32910c87baf9060e51490d09ad", "is_verified": false, - "line_number": 875 + "line_number": 878 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "74f497c18c464bd0d65adca16a8e96c0fafeefcb", "is_verified": false, - "line_number": 884 + "line_number": 887 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3aa0faf721de27687f7be4cc9ed4e61c745e6e44", "is_verified": false, - "line_number": 888 + "line_number": 891 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "d950cd8ef510429f57fb282e4a437321ca86158c", "is_verified": false, - "line_number": 892 + "line_number": 895 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3ad5ab41a177a3b1dbc7cc007170bfcc93c0607a", "is_verified": false, - "line_number": 897 + "line_number": 900 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5d204787c8c7979085337870c453871dbe65cb84", "is_verified": false, - "line_number": 900 + "line_number": 903 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4648471e6e277a4eb3eb85ed4ef695b6bfabe451", "is_verified": false, - "line_number": 906 + "line_number": 909 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9bad76463ceffd240ee9bd95c3faa98c0a4b94d0", "is_verified": false, - "line_number": 909 + "line_number": 912 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "82bb8edb4003308fc261a3cd2488be9862e99657", "is_verified": false, - "line_number": 913 + "line_number": 916 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "cf09cb791688fe019284bfdc362abc41918645a5", "is_verified": false, - "line_number": 916 + "line_number": 919 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9ecdd3b0214d99d66a71bf1e48cebbdd897db432", "is_verified": false, - "line_number": 919 + "line_number": 922 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "aea3a2f0dd7f8e8655ed2e6cf823ce09d0d537a4", "is_verified": false, - "line_number": 923 + "line_number": 926 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4e5e279b264f80f6302507f3bc02028118a5381f", "is_verified": false, - "line_number": 926 + "line_number": 929 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3e62a0c4062cf833f44b3d28c2df580a178a0ce7", "is_verified": false, - "line_number": 929 + "line_number": 932 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c61f6450dea4696f664cee46c1938e2353da53b9", "is_verified": false, - "line_number": 933 + "line_number": 936 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1a9c505c27a3d51d07d5cd60f1cd51dccb1ce4e6", "is_verified": false, - "line_number": 937 + "line_number": 940 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "8d04b6573603b749b3e15f4a0d2a322aaf7a74d2", "is_verified": false, - "line_number": 940 + "line_number": 943 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "e7c4ee17ab711302f98d915dd0b266cd2d1063e5", "is_verified": false, - "line_number": 943 + "line_number": 946 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "74c6778d90507aa5b96f9aa8ace227ae46079c3d", "is_verified": false, - "line_number": 946 + "line_number": 949 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4349ff4e19d7672f6b7397e5bf9ec7a64bc28e14", "is_verified": false, - "line_number": 950 + "line_number": 953 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3e2f7beb6f6a2204eb1ca56ae8ca7e9602ad13f3", "is_verified": false, - "line_number": 953 + "line_number": 956 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "73bc28172456bad6166fd9a576eb52082dc4dd3c", "is_verified": false, - "line_number": 956 + "line_number": 959 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "dc1b9f847614c5a40208a767d4cc7cf0f9b2282a", "is_verified": false, - "line_number": 959 + "line_number": 962 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1e2228f0d8e0fc2bc3b8740a8ff3d287006b9a38", "is_verified": false, - "line_number": 963 + "line_number": 966 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "625c8e34a90184351c844c05950c45473933b7dc", "is_verified": false, - "line_number": 966 + "line_number": 969 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "31d6671bbf40210dfde8e313a9c03ab41489691d", "is_verified": false, - "line_number": 971 + "line_number": 974 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "8ac8e759308be486fa9eb1fcadf99defd39eab96", "is_verified": false, - "line_number": 975 + "line_number": 978 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "e7142097a5cce8cfe60e9c080b88bbbeb28f2a7a", "is_verified": false, - "line_number": 978 + "line_number": 981 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1229dc2178fd4b24f6dcb957dbdc4dd4f592e26f", "is_verified": false, - "line_number": 982 + "line_number": 985 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "805d9656080308c11cde7cb7f0310e12c7e60c48", "is_verified": false, - "line_number": 986 + "line_number": 989 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "ca13874532c9df50a570a36576667e2bbd4383bc", "is_verified": false, - "line_number": 989 + "line_number": 992 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "85c66cde4af421982424442e55d5b0a85e75b40e", "is_verified": false, - "line_number": 994 + "line_number": 997 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "38c97b06ca380ec6b537fb959634cd6042e47cea", "is_verified": false, - "line_number": 998 + "line_number": 1001 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "55159cc007aeaf5fbf0746c70b85d9ddc16db6dd", "is_verified": false, - "line_number": 1001 + "line_number": 1004 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "61ff5c8a702d8ffe28063c06487a3a5a0db2ed70", "is_verified": false, - "line_number": 1004 + "line_number": 1007 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "cf64476b50691518582d89769fcebde8862b0020", "is_verified": false, - "line_number": 1008 + "line_number": 1011 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9235bcf425e49c5749d9f52ed67b13717efda795", "is_verified": false, - "line_number": 1012 + "line_number": 1015 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "406d7e234572008768bde7f31b176a7a0f8da4f0", "is_verified": false, - "line_number": 1015 + "line_number": 1018 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4439cc784aca22e5cdf33ed6656f5b8b99eaa44d", "is_verified": false, - "line_number": 1019 + "line_number": 1022 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "84cbfec871cf2b178ab90fcc1f442fa369e99a02", "is_verified": false, - "line_number": 1022 + "line_number": 1025 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "80eb677fae3a58bfd1df58e32807f8eccd8ca18d", "is_verified": false, - "line_number": 1026 + "line_number": 1029 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "498226c66b0e41fceaff482c6cc115f1bc4abd6e", "is_verified": false, - "line_number": 1029 + "line_number": 1032 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "635b865541a9b317d71b354dc07769e554004a0a", "is_verified": false, - "line_number": 1033 + "line_number": 1036 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "eeb22523a5f23b8e2f2839101e2a21df63062eef", "is_verified": false, - "line_number": 1036 + "line_number": 1039 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "cf7ae21a07aec42c0047f67e1b0b7ecd28fc23b5", "is_verified": false, - "line_number": 1040 + "line_number": 1043 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9fe5b3fda621da0e9b76aa653d894f94f8f58cd4", "is_verified": false, - "line_number": 1044 + "line_number": 1047 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "f1d33d6aede0dfb7fe9978bebd04c76d861c98c3", "is_verified": false, - "line_number": 1047 + "line_number": 1050 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4f4dde0efe7acd336975cd25fc68e25347fd64ee", "is_verified": false, - "line_number": 1050 + "line_number": 1053 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "353aafcecdb8834ff13733ca486183ed2882e7ec", "is_verified": false, - "line_number": 1054 + "line_number": 1057 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7969827f4e081fc3ab6d578be9fe52cf55b34bef", "is_verified": false, - "line_number": 1057 + "line_number": 1060 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "ac92f6ef74f09318d36f34716ed2f258b5e0924f", "is_verified": false, - "line_number": 1060 + "line_number": 1063 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "288c8b24d63adf108e603c52001b6412037a9edc", "is_verified": false, - "line_number": 1064 + "line_number": 1067 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "36149fc78b01f35bca00b832a55a4ea4f21995ae", "is_verified": false, - "line_number": 1068 + "line_number": 1071 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4b07e969bf7c1a9efdf5eab7e13abaa484c49d38", "is_verified": false, - "line_number": 1072 + "line_number": 1075 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "5a485a4915f94231f9dc5b355ddda367442ba450", "is_verified": false, - "line_number": 1076 + "line_number": 1079 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "17df0cf1bffb39d85a2aea45c887f1998ffc48a8", "is_verified": false, - "line_number": 1080 + "line_number": 1083 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "a6bc2cd23b205c0d88f94eef4d6c1268906d0670", "is_verified": false, - "line_number": 1083 + "line_number": 1086 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "19a998b1bf7031d19515cd35f049a7a6aa7dd1b3", "is_verified": false, - "line_number": 1087 + "line_number": 1090 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "ea4d705920dea9e9007f7ffd977007d97d93720a", "is_verified": false, - "line_number": 1091 + "line_number": 1094 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4a92c1257b67845f12260b454ba353a5919dec29", "is_verified": false, - "line_number": 1094 + "line_number": 1097 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7e42e0804bd25c31e53b2f0871fa2b3551dc66d9", "is_verified": false, - "line_number": 1099 + "line_number": 1102 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "dab00d860d09dd9092b16718edd82bb24a6a21e9", "is_verified": false, - "line_number": 1103 + "line_number": 1106 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "09d8666b35e6c586e3ac50ff958d10e8f3a12d3f", "is_verified": false, - "line_number": 1106 + "line_number": 1109 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7ecd16de4642448e5a002d0eb887796642d37c29", "is_verified": false, - "line_number": 1110 + "line_number": 1113 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "f65cbf613806c65f44181f17817d02c7be05ceda", "is_verified": false, - "line_number": 1114 + "line_number": 1117 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "2364d220157112e44b4d06ea9df8f2b9fb44069e", "is_verified": false, - "line_number": 1117 + "line_number": 1120 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "39ffec566bffcf8c829bbb54c2f3e06aadbccb15", "is_verified": false, - "line_number": 1120 + "line_number": 1123 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "2fd4d093008863345a56756800819a01bf8e0451", "is_verified": false, - "line_number": 1125 + "line_number": 1128 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "bae67d3ce231086fba18abc7365c94878f900c14", "is_verified": false, - "line_number": 1128 + "line_number": 1131 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3b7990b0f82bc9bc6c4ec02744f9c02e76aac827", "is_verified": false, - "line_number": 1131 + "line_number": 1134 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9072ebcbad57a1ae4256c5ae37c1e7c7ae5325de", "is_verified": false, - "line_number": 1135 + "line_number": 1138 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "33e224ae0061fa6dc855702e88cad5e948136009", "is_verified": false, - "line_number": 1139 + "line_number": 1142 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "e0c6ae09dd70fa25056d591ada0ad32df0dfe873", "is_verified": false, - "line_number": 1142 + "line_number": 1145 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "156a735a4c43b9c6b0c08f6b857738968fe588d4", "is_verified": false, - "line_number": 1146 + "line_number": 1149 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "336d02c1e7195c5237197b5884304099ab15c6ba", "is_verified": false, - "line_number": 1149 + "line_number": 1152 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "02757ec3c99c3192621db35f0eea3897cede465a", "is_verified": false, - "line_number": 1153 + "line_number": 1156 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b015b77432bd6d255596af7b2f552d8e8c91a7f7", "is_verified": false, - "line_number": 1157 + "line_number": 1160 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4dcc5c09923b9c0c9014f1f416f58aed8360e584", "is_verified": false, - "line_number": 1160 + "line_number": 1163 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "32026694f097ae0956b46d081f53c72d129a0e9d", "is_verified": false, - "line_number": 1164 + "line_number": 1167 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1ef51736be44df9a195f0a4ecc99642e7e006803", "is_verified": false, - "line_number": 1167 + "line_number": 1170 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "1be172b28420494a97b5bd6dc5d20d9b54d52047", "is_verified": false, - "line_number": 1170 + "line_number": 1173 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "3e536139add3f70bf34712d57cf490dc9c631553", "is_verified": false, - "line_number": 1173 + "line_number": 1176 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4035430d526a269d8e16277f9be0f9c6a7e695bd", "is_verified": false, - "line_number": 1177 + "line_number": 1180 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "01a928fe600e802e506f5354d0be5df023952b7d", "is_verified": false, - "line_number": 1180 + "line_number": 1183 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "612114aa542d50acb4e8481ff643adb46c6e71b3", "is_verified": false, - "line_number": 1188 + "line_number": 1191 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "11973b25b26c5ffab277f15a5f39da63518c061c", "is_verified": false, - "line_number": 1192 + "line_number": 1195 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "2fbe8ab30e5355ea9d7538aec4d6c869562a0ed8", "is_verified": false, - "line_number": 1195 + "line_number": 1198 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "a664083cd7ea977f953eb398c15a7391521e8c88", "is_verified": false, - "line_number": 1198 + "line_number": 1201 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "bcc923e3a3bbb5c5c7c2f2b5e17bda91f8076652", "is_verified": false, - "line_number": 1201 + "line_number": 1204 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "66022833f4701f45cff007311050911fe571487c", "is_verified": false, - "line_number": 1205 + "line_number": 1208 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "512b3e49cdd404e4e23779be697a6801e04255ab", "is_verified": false, - "line_number": 1209 + "line_number": 1212 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "b3f13048bf1127d22a091b20bef5f1fb485b94c2", "is_verified": false, - "line_number": 1213 + "line_number": 1216 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "f50a9ae6c1f90c2adc6b60bbe3779ed40e14ca9e", "is_verified": false, - "line_number": 1217 + "line_number": 1220 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "a6d813aa7164341218d80a2b625ff1b254fa10c3", "is_verified": false, - "line_number": 1221 + "line_number": 1224 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "422f025608080feaba8cb1fbbb522deb3f43cdcc", "is_verified": false, - "line_number": 1225 + "line_number": 1228 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "8239574b4263502316ae4af75858c8537b8f9dc2", "is_verified": false, - "line_number": 1230 + "line_number": 1233 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7c43a5a81cdfc2d174e64e7441e07b48f610be0e", "is_verified": false, - "line_number": 1235 + "line_number": 1238 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "735bd20202e59e618bfe941a5941731da477e7b6", "is_verified": false, - "line_number": 1238 + "line_number": 1241 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "32f11283bec656108388929b40993090be755520", "is_verified": false, - "line_number": 1241 + "line_number": 1244 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "4801a08438ed2a6af40afdf77d92cf8412cae7fb", "is_verified": false, - "line_number": 1246 + "line_number": 1249 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "10268f6f4f68752aa603c74f237e00cf940909a4", "is_verified": false, - "line_number": 1286 + "line_number": 1289 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "8ac9d9448e688e8f94e810f2c49fd9b728bd2041", "is_verified": false, - "line_number": 1326 + "line_number": 1329 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "7dbba2db5c8622d492abdd259dd9033ed5f205e2", "is_verified": false, - "line_number": 1334 + "line_number": 1337 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "f0257d02d23f53e799476af74cf0386375d4b6c2", "is_verified": false, - "line_number": 1362 + "line_number": 1365 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "95b02c02e7cb902e9603042bf77d2ce3b47d7dd1", "is_verified": false, - "line_number": 1367 + "line_number": 1370 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "c1a38efe10a08cb343b44ec85e4f991fa64e0dc8", "is_verified": false, - "line_number": 1372 + "line_number": 1375 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "77fb73a7cac9311a40dd4d7f73c5991ef9e79fb6", "is_verified": false, - "line_number": 1375 + "line_number": 1378 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "9b0596f2945cdeab0d6fb2407275942153f87d9c", "is_verified": false, - "line_number": 1387 + "line_number": 1390 }, { "type": "Base64 High Entropy String", "filename": "pnpm-lock.yaml", "hashed_secret": "2a6ec2710324e581e13c5bd7ce5f78fd563b3db0", "is_verified": false, - "line_number": 1390 + "line_number": 1393 } ] }, - "generated_at": "2026-04-28T15:20:02Z" + "generated_at": "2026-04-28T18:52:08Z" } diff --git a/package.json b/package.json index 68b6ea0..50f7a6f 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,11 @@ "test": "pnpm -r test", "dev:server": "pnpm --filter @blind-chess/server dev", "dev:client": "pnpm --filter @blind-chess/client dev", - "typecheck": "pnpm -r typecheck" + "typecheck": "pnpm -r typecheck", + "selfplay": "tsx scripts/selfplay.ts" }, "devDependencies": { + "tsx": "^4.21.0", "typescript": "^5.6.0", "vitest": "^3.0.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c2d62b..2605f98 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: devDependencies: + tsx: + specifier: ^4.21.0 + version: 4.21.0 typescript: specifier: ^5.6.0 version: 5.9.3 diff --git a/scripts/selfplay.ts b/scripts/selfplay.ts new file mode 100644 index 0000000..4f4072a --- /dev/null +++ b/scripts/selfplay.ts @@ -0,0 +1,195 @@ +#!/usr/bin/env tsx +/** + * Self-play harness for the Casual bot. + * + * Runs N games in-process (no HTTP). Reports stats and optionally writes a + * transcript per game. Supports CasualBrain on either color and a + * RandomBrain baseline for measuring Casual's strength. + * + * Usage: + * pnpm selfplay --games 100 --mode vanilla + * pnpm selfplay --white casual --black random --games 100 --mode vanilla + * pnpm selfplay --white random --black casual --games 100 --mode vanilla + * pnpm selfplay --games 50 --mode blind --transcripts + * pnpm selfplay --games 10 --seed 42 + */ +import { mkdirSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { CasualBrain, BotDriver } from '../packages/server/src/bot/index.js'; +import type { Brain, BrainAction, BrainInitArgs, BrainInput } + from '../packages/server/src/bot/brain.js'; +import { createGame } from '../packages/server/src/games.js'; + +interface Args { + white: 'casual' | 'random'; + black: 'casual' | 'random'; + games: number; + mode: 'blind' | 'vanilla'; + seed: number; + transcripts: boolean; + maxPly: number; +} + +function parseArgs(): Args { + const args: Args = { + white: 'casual', black: 'casual', + games: 10, mode: 'blind', seed: 1, transcripts: false, maxPly: 400, + }; + const a = process.argv.slice(2); + for (let i = 0; i < a.length; i++) { + const k = a[i]!; + const v = a[i + 1]!; + if (k === '--white') { args.white = v as 'casual' | 'random'; i++; } + else if (k === '--black') { args.black = v as 'casual' | 'random'; i++; } + else if (k === '--games') { args.games = parseInt(v, 10); i++; } + else if (k === '--mode') { args.mode = v as 'blind' | 'vanilla'; i++; } + else if (k === '--seed') { args.seed = parseInt(v, 10); i++; } + else if (k === '--max-ply') { args.maxPly = parseInt(v, 10); i++; } + else if (k === '--transcripts') { args.transcripts = true; } + else if (k === '--help' || k === '-h') { + console.log('Usage: pnpm selfplay [--white casual|random] [--black casual|random]'); + console.log(' [--games N] [--mode blind|vanilla]'); + console.log(' [--seed N] [--max-ply N] [--transcripts]'); + process.exit(0); + } + } + return args; +} + +class RandomBrain implements Brain { + private rng: () => number; + constructor(seed: number) { + let a = seed >>> 0; + this.rng = () => { + a = (a + 0x6d2b79f5) >>> 0; + let t = a; + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; + } + async init(_args: BrainInitArgs): Promise {} + async decide(input: BrainInput): Promise { + const cs = input.legalCandidates; + if (cs.length === 0) throw new Error('no candidates'); + const i = Math.floor(this.rng() * cs.length); + const c = cs[i]!; + return { type: 'commit', from: c.from, to: c.to, promotion: c.promotion }; + } +} + +function makeBrain(kind: 'casual' | 'random', seed: number): Brain { + return kind === 'casual' ? new CasualBrain({ seed }) : new RandomBrain(seed); +} + +interface GameResult { + result: 'w' | 'b' | 'draw' | 'maxply' | 'error'; + endReason: string; + ply: number; + ms: number; + transcript: string[]; +} + +async function runOneGame(args: Args, gameIdx: number): Promise { + const startMs = Date.now(); + const transcript: string[] = []; + + const { game } = createGame({ + mode: args.mode, creatorSide: 'w', highlightingEnabled: false, + vsAi: { brain: 'casual' }, + }); + // createGame already filled both slots when vsAi is set. Clear the + // aiOpponent tag (this is a self-play game, not a vs-AI game) and flip + // status to 'active' (no hello will arrive in self-play). + game.aiOpponent = undefined; + game.status = 'active'; + + const wBrain = makeBrain(args.white, args.seed + gameIdx * 2); + const bBrain = makeBrain(args.black, args.seed + gameIdx * 2 + 1); + const wDriver = new BotDriver({ game, brain: wBrain, color: 'w' }); + const bDriver = new BotDriver({ game, brain: bBrain, color: 'b' }); + await wDriver.init(); + await bDriver.init(); + + let ply = 0; + while (game.status === 'active' && ply < args.maxPly) { + const turn = game.chess.turn() as 'w' | 'b'; + const driver = turn === 'w' ? wDriver : bDriver; + try { + await driver.onStateChange(); + } catch (err) { + transcript.push(`!! error at ply ${ply}: ${(err as Error).message}`); + return { result: 'error', endReason: (err as Error).message, + ply, ms: Date.now() - startMs, transcript }; + } + const newPly = game.chess.history().length; + if (newPly === ply && game.status === 'active') { + // Driver didn't move and game didn't end — defensive break. + transcript.push(`!! stuck at ply ${ply} (${turn} to move)`); + return { result: 'error', endReason: 'stuck', + ply, ms: Date.now() - startMs, transcript }; + } + if (newPly > ply) { + const lastSan = game.chess.history()[newPly - 1]; + transcript.push(`${newPly}. ${turn === 'w' ? 'W' : 'B'}: ${lastSan}`); + } + ply = newPly; + } + + const ms = Date.now() - startMs; + if (game.status !== 'finished') { + return { result: 'maxply', endReason: 'max_ply', ply, ms, transcript }; + } + const result: 'w' | 'b' | 'draw' = game.winner ?? 'draw'; + return { result, endReason: game.endReason ?? 'unknown', ply, ms, transcript }; +} + +function summarize(rs: GameResult[]): string { + const w = rs.filter((r) => r.result === 'w').length; + const b = rs.filter((r) => r.result === 'b').length; + const d = rs.filter((r) => r.result === 'draw').length; + const mp = rs.filter((r) => r.result === 'maxply').length; + const er = rs.filter((r) => r.result === 'error').length; + const avgPly = rs.reduce((s, r) => s + r.ply, 0) / Math.max(rs.length, 1); + const avgMs = rs.reduce((s, r) => s + r.ms, 0) / Math.max(rs.length, 1); + return `W=${w} B=${b} D=${d} MaxPly=${mp} Err=${er} avgPly=${avgPly.toFixed(0)} avgMs=${avgMs.toFixed(0)}`; +} + +async function main(): Promise { + const args = parseArgs(); + console.log(`selfplay: ${args.games} game(s), mode=${args.mode}, white=${args.white}, black=${args.black}, seed=${args.seed}`); + const results: GameResult[] = []; + + let outDir: string | null = null; + if (args.transcripts) { + outDir = resolve('tmp', 'selfplay-runs', String(Date.now())); + mkdirSync(outDir, { recursive: true }); + console.log(`transcripts -> ${outDir}`); + } + + for (let i = 0; i < args.games; i++) { + const r = await runOneGame(args, i); + results.push(r); + if (outDir) { + writeFileSync( + resolve(outDir, `game-${String(i + 1).padStart(4, '0')}.txt`), + `result=${r.result} reason=${r.endReason} ply=${r.ply} ms=${r.ms}\n${r.transcript.join('\n')}\n`, + ); + } + if ((i + 1) % 10 === 0 || i === args.games - 1) { + console.log(`[${i + 1}/${args.games}] ${summarize(results)}`); + } + } + + console.log('\n=== summary ==='); + console.log(summarize(results)); + const reasons = new Map(); + for (const r of results) reasons.set(r.endReason, (reasons.get(r.endReason) ?? 0) + 1); + console.log('end reasons:'); + for (const [k, v] of [...reasons.entries()].sort((a, b) => b[1] - a[1])) { + console.log(` ${k}: ${v}`); + } + console.log('errors: ' + results.filter((r) => r.result === 'error').length); +} + +main().catch((err) => { console.error(err); process.exit(1); });