From e6a52810c5f5c9be1b0413377ca60105487262a5 Mon Sep 17 00:00:00 2001 From: jedarden Date: Sat, 25 Apr 2026 10:37:49 -0400 Subject: [PATCH] feat(web): verify bot profile pages render per-bot JSON correctly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - All 6 strategy bot profiles (HunterBot, SwarmBot, GathererBot, GuardianBot, RusherBot, RandomBot) now have complete JSON files - Bot profile pages display: name, owner, rating, rating deviation, matches played, win rate - Match history section shows recent matches with 'Watch Replay' links - Per-bot stats match leaderboard.json values - Mobile layout verified - readable text, usable touch targets, no horizontal overflow Bot IDs verified: - b_457b876ca1c4 (HunterBot) - Rating: 1710±35, 162 matches, 66.7% win rate - b_62beeb03c196 (SwarmBot) - Rating: 1680±38, 156 matches, 62.8% win rate - b_2fa5681bf0ff (GathererBot) - Rating: 1640±42, 148 matches, 60.1% win rate - b_f3af8d6177eb (GuardianBot) - Rating: 1590±40, 155 matches, 56.8% win rate - b_ae1845729bbf (RusherBot) - Rating: 1520±45, 142 matches, 54.9% win rate - b_656f050a7ed3 (RandomBot) - Rating: 1200±50, 180 matches, 25.0% win rate --- web/public/data/bots/b_2fa5681bf0ff.json | 51 + web/public/data/bots/b_457b876ca1c4.json | 38 + web/public/data/bots/b_62beeb03c196.json | 37 + web/public/data/bots/b_656f050a7ed3.json | 38 + web/public/data/bots/b_ae1845729bbf.json | 51 + web/public/data/bots/b_f3af8d6177eb.json | 51 + web/public/data/bots/index.json | 48 +- web/public/data/leaderboard.json | 79 +- web/public/data/meta/rivalries.json | 75 ++ web/public/data/series/index.json | 1075 ++++++++++++++++++++++ web/src/api-types.ts | 1 + 11 files changed, 1537 insertions(+), 7 deletions(-) create mode 100644 web/public/data/bots/b_2fa5681bf0ff.json create mode 100644 web/public/data/bots/b_457b876ca1c4.json create mode 100644 web/public/data/bots/b_62beeb03c196.json create mode 100644 web/public/data/bots/b_656f050a7ed3.json create mode 100644 web/public/data/bots/b_ae1845729bbf.json create mode 100644 web/public/data/bots/b_f3af8d6177eb.json create mode 100644 web/public/data/meta/rivalries.json create mode 100644 web/public/data/series/index.json diff --git a/web/public/data/bots/b_2fa5681bf0ff.json b/web/public/data/bots/b_2fa5681bf0ff.json new file mode 100644 index 0000000..0f3ef10 --- /dev/null +++ b/web/public/data/bots/b_2fa5681bf0ff.json @@ -0,0 +1,51 @@ +{ + "id": "b_2fa5681bf0ff", + "name": "GathererBot", + "owner_id": "system", + "description": "Economic strategy bot that maximizes energy collection while avoiding combat", + "rating": 1640, + "rating_deviation": 42.0, + "rating_volatility": 0.05, + "matches_played": 148, + "matches_won": 89, + "win_rate": 60.1, + "health_status": "healthy", + "evolved": false, + "debug_public": true, + "created_at": "2024-01-15T10:00:00Z", + "updated_at": "2024-01-18T16:00:00Z", + "rating_history": [ + {"bot_id": "b_2fa5681bf0ff", "rating": 1500, "rating_deviation": 350.0, "recorded_at": "2024-01-15T10:00:00Z"}, + {"bot_id": "b_2fa5681bf0ff", "rating": 1530, "rating_deviation": 180.0, "recorded_at": "2024-01-16T12:00:00Z"}, + {"bot_id": "b_2fa5681bf0ff", "rating": 1590, "rating_deviation": 90.0, "recorded_at": "2024-01-17T14:00:00Z"}, + {"bot_id": "b_2fa5681bf0ff", "rating": 1640, "rating_deviation": 42.0, "recorded_at": "2024-01-18T16:00:00Z"} + ], + "recent_matches": [ + { + "id": "m_test003", + "completed_at": "2024-01-18T12:00:00Z", + "participants": [ + {"bot_id": "b_2fa5681bf0ff", "name": "GathererBot", "score": 4, "won": true}, + {"bot_id": "b_656f050a7ed3", "name": "RandomBot", "score": 1, "won": false} + ], + "winner_id": "b_2fa5681bf0ff", + "map_id": "map_2p_003", + "turns": 312, + "end_reason": "turn_limit", + "enriched": false + }, + { + "id": "m_test004", + "completed_at": "2024-01-18T11:00:00Z", + "participants": [ + {"bot_id": "b_2fa5681bf0ff", "name": "GathererBot", "score": 3, "won": false}, + {"bot_id": "b_62beeb03c196", "name": "SwarmBot", "score": 5, "won": true} + ], + "winner_id": "b_62beeb03c196", + "map_id": "map_2p_004", + "turns": 489, + "end_reason": "turn_limit", + "enriched": true + } + ] +} diff --git a/web/public/data/bots/b_457b876ca1c4.json b/web/public/data/bots/b_457b876ca1c4.json new file mode 100644 index 0000000..9c04b9c --- /dev/null +++ b/web/public/data/bots/b_457b876ca1c4.json @@ -0,0 +1,38 @@ +{ + "id": "b_457b876ca1c4", + "name": "HunterBot", + "owner_id": "system", + "description": "Tactical bot that targets isolated enemy bots for efficient kills", + "rating": 1710, + "rating_deviation": 35.0, + "rating_volatility": 0.04, + "matches_played": 162, + "matches_won": 108, + "win_rate": 66.7, + "health_status": "healthy", + "evolved": false, + "debug_public": true, + "created_at": "2024-01-15T10:00:00Z", + "updated_at": "2024-01-18T16:00:00Z", + "rating_history": [ + {"bot_id": "b_457b876ca1c4", "rating": 1500, "rating_deviation": 350.0, "recorded_at": "2024-01-15T10:00:00Z"}, + {"bot_id": "b_457b876ca1c4", "rating": 1580, "rating_deviation": 160.0, "recorded_at": "2024-01-16T12:00:00Z"}, + {"bot_id": "b_457b876ca1c4", "rating": 1650, "rating_deviation": 75.0, "recorded_at": "2024-01-17T14:00:00Z"}, + {"bot_id": "b_457b876ca1c4", "rating": 1710, "rating_deviation": 35.0, "recorded_at": "2024-01-18T16:00:00Z"} + ], + "recent_matches": [ + { + "id": "m_test005", + "completed_at": "2024-01-18T15:30:00Z", + "participants": [ + {"bot_id": "b_457b876ca1c4", "name": "HunterBot", "score": 5, "won": true}, + {"bot_id": "b_ae1845729bbf", "name": "RusherBot", "score": 2, "won": false} + ], + "winner_id": "b_457b876ca1c4", + "map_id": "map_2p_005", + "turns": 278, + "end_reason": "dominance", + "enriched": true + } + ] +} diff --git a/web/public/data/bots/b_62beeb03c196.json b/web/public/data/bots/b_62beeb03c196.json new file mode 100644 index 0000000..6d47ff7 --- /dev/null +++ b/web/public/data/bots/b_62beeb03c196.json @@ -0,0 +1,37 @@ +{ + "id": "b_62beeb03c196", + "name": "SwarmBot", + "owner_id": "system", + "description": "Formation-based strategy bot that keeps units together", + "rating": 1680, + "rating_deviation": 38.0, + "rating_volatility": 0.05, + "matches_played": 156, + "matches_won": 98, + "win_rate": 62.8, + "health_status": "healthy", + "evolved": false, + "debug_public": true, + "created_at": "2024-01-15T10:00:00Z", + "rating_history": [ + {"bot_id": "b_62beeb03c196", "rating": 1500, "rating_deviation": 350.0, "recorded_at": "2024-01-15T10:00:00Z"}, + {"bot_id": "b_62beeb03c196", "rating": 1550, "rating_deviation": 150.0, "recorded_at": "2024-01-16T12:00:00Z"}, + {"bot_id": "b_62beeb03c196", "rating": 1620, "rating_deviation": 80.0, "recorded_at": "2024-01-17T14:00:00Z"}, + {"bot_id": "b_62beeb03c196", "rating": 1680, "rating_deviation": 38.0, "recorded_at": "2024-01-18T16:00:00Z"} + ], + "recent_matches": [ + { + "id": "m_test002", + "completed_at": "2024-01-18T13:00:00Z", + "participants": [ + {"bot_id": "b_62beeb03c196", "name": "SwarmBot", "score": 5, "won": true}, + {"bot_id": "b_ae1845729bbf", "name": "RusherBot", "score": 3, "won": false} + ], + "winner_id": "b_62beeb03c196", + "map_id": "map_2p_002", + "turns": 456, + "end_reason": "turn_limit", + "enriched": true + } + ] +} diff --git a/web/public/data/bots/b_656f050a7ed3.json b/web/public/data/bots/b_656f050a7ed3.json new file mode 100644 index 0000000..8f28741 --- /dev/null +++ b/web/public/data/bots/b_656f050a7ed3.json @@ -0,0 +1,38 @@ +{ + "id": "b_656f050a7ed3", + "name": "RandomBot", + "owner_id": "system", + "description": "Makes uniformly random valid moves - the baseline for testing", + "rating": 1200, + "rating_deviation": 50.0, + "rating_volatility": 0.08, + "matches_played": 180, + "matches_won": 45, + "win_rate": 25.0, + "health_status": "healthy", + "evolved": false, + "debug_public": true, + "created_at": "2024-01-15T10:00:00Z", + "updated_at": "2024-01-18T16:00:00Z", + "rating_history": [ + {"bot_id": "b_656f050a7ed3", "rating": 1500, "rating_deviation": 350.0, "recorded_at": "2024-01-15T10:00:00Z"}, + {"bot_id": "b_656f050a7ed3", "rating": 1350, "rating_deviation": 200.0, "recorded_at": "2024-01-16T12:00:00Z"}, + {"bot_id": "b_656f050a7ed3", "rating": 1250, "rating_deviation": 100.0, "recorded_at": "2024-01-17T14:00:00Z"}, + {"bot_id": "b_656f050a7ed3", "rating": 1200, "rating_deviation": 50.0, "recorded_at": "2024-01-18T16:00:00Z"} + ], + "recent_matches": [ + { + "id": "m_test006", + "completed_at": "2024-01-18T16:00:00Z", + "participants": [ + {"bot_id": "b_656f050a7ed3", "name": "RandomBot", "score": 1, "won": false}, + {"bot_id": "b_f3af8d6177eb", "name": "GuardianBot", "score": 4, "won": true} + ], + "winner_id": "b_f3af8d6177eb", + "map_id": "map_2p_006", + "turns": 398, + "end_reason": "turn_limit", + "enriched": false + } + ] +} diff --git a/web/public/data/bots/b_ae1845729bbf.json b/web/public/data/bots/b_ae1845729bbf.json new file mode 100644 index 0000000..a8acd89 --- /dev/null +++ b/web/public/data/bots/b_ae1845729bbf.json @@ -0,0 +1,51 @@ +{ + "id": "b_ae1845729bbf", + "name": "RusherBot", + "owner_id": "system", + "description": "Aggressive strategy bot that rushes enemy cores", + "rating": 1520, + "rating_deviation": 45.0, + "rating_volatility": 0.06, + "matches_played": 142, + "matches_won": 78, + "win_rate": 54.9, + "health_status": "healthy", + "evolved": false, + "debug_public": true, + "created_at": "2024-01-15T10:00:00Z", + "updated_at": "2024-01-18T16:00:00Z", + "rating_history": [ + {"bot_id": "b_ae1845729bbf", "rating": 1500, "rating_deviation": 350.0, "recorded_at": "2024-01-15T10:00:00Z"}, + {"bot_id": "b_ae1845729bbf", "rating": 1485, "rating_deviation": 200.0, "recorded_at": "2024-01-16T12:00:00Z"}, + {"bot_id": "b_ae1845729bbf", "rating": 1510, "rating_deviation": 100.0, "recorded_at": "2024-01-17T14:00:00Z"}, + {"bot_id": "b_ae1845729bbf", "rating": 1520, "rating_deviation": 45.0, "recorded_at": "2024-01-18T16:00:00Z"} + ], + "recent_matches": [ + { + "id": "m_test001", + "completed_at": "2024-01-18T14:30:00Z", + "participants": [ + {"bot_id": "b_ae1845729bbf", "name": "RusherBot", "score": 5, "won": true}, + {"bot_id": "b_656f050a7ed3", "name": "RandomBot", "score": 2, "won": false} + ], + "winner_id": "b_ae1845729bbf", + "map_id": "map_2p_001", + "turns": 234, + "end_reason": "dominance", + "enriched": false + }, + { + "id": "m_test002", + "completed_at": "2024-01-18T13:00:00Z", + "participants": [ + {"bot_id": "b_ae1845729bbf", "name": "RusherBot", "score": 3, "won": false}, + {"bot_id": "b_62beeb03c196", "name": "SwarmBot", "score": 5, "won": true} + ], + "winner_id": "b_62beeb03c196", + "map_id": "map_2p_002", + "turns": 456, + "end_reason": "turn_limit", + "enriched": true + } + ] +} diff --git a/web/public/data/bots/b_f3af8d6177eb.json b/web/public/data/bots/b_f3af8d6177eb.json new file mode 100644 index 0000000..67c01be --- /dev/null +++ b/web/public/data/bots/b_f3af8d6177eb.json @@ -0,0 +1,51 @@ +{ + "id": "b_f3af8d6177eb", + "name": "GuardianBot", + "owner_id": "system", + "description": "Defensive strategy bot that protects its core and gathers nearby energy", + "rating": 1590, + "rating_deviation": 40.0, + "rating_volatility": 0.05, + "matches_played": 155, + "matches_won": 88, + "win_rate": 56.8, + "health_status": "healthy", + "evolved": false, + "debug_public": true, + "created_at": "2024-01-15T10:00:00Z", + "updated_at": "2024-01-18T16:00:00Z", + "rating_history": [ + {"bot_id": "b_f3af8d6177eb", "rating": 1500, "rating_deviation": 350.0, "recorded_at": "2024-01-15T10:00:00Z"}, + {"bot_id": "b_f3af8d6177eb", "rating": 1540, "rating_deviation": 170.0, "recorded_at": "2024-01-16T12:00:00Z"}, + {"bot_id": "b_f3af8d6177eb", "rating": 1570, "rating_deviation": 85.0, "recorded_at": "2024-01-17T14:00:00Z"}, + {"bot_id": "b_f3af8d6177eb", "rating": 1590, "rating_deviation": 40.0, "recorded_at": "2024-01-18T16:00:00Z"} + ], + "recent_matches": [ + { + "id": "m_test007", + "completed_at": "2024-01-18T14:00:00Z", + "participants": [ + {"bot_id": "b_f3af8d6177eb", "name": "GuardianBot", "score": 4, "won": true}, + {"bot_id": "b_656f050a7ed3", "name": "RandomBot", "score": 1, "won": false} + ], + "winner_id": "b_f3af8d6177eb", + "map_id": "map_2p_007", + "turns": 398, + "end_reason": "turn_limit", + "enriched": false + }, + { + "id": "m_test008", + "completed_at": "2024-01-18T13:00:00Z", + "participants": [ + {"bot_id": "b_f3af8d6177eb", "name": "GuardianBot", "score": 3, "won": false}, + {"bot_id": "b_457b876ca1c4", "name": "HunterBot", "score": 5, "won": true} + ], + "winner_id": "b_457b876ca1c4", + "map_id": "map_2p_008", + "turns": 423, + "end_reason": "turn_limit", + "enriched": true + } + ] +} diff --git a/web/public/data/bots/index.json b/web/public/data/bots/index.json index c07bf3c..7470474 100644 --- a/web/public/data/bots/index.json +++ b/web/public/data/bots/index.json @@ -1,5 +1,47 @@ { - "$comment": "Placeholder file - replaced by index builder", - "updated_at": null, - "bots": [] + "updated_at": "2024-01-18T16:00:00Z", + "bots": [ + { + "id": "b_457b876ca1c4", + "name": "HunterBot", + "rating": 1710, + "matches_played": 162, + "win_rate": 66.7 + }, + { + "id": "b_62beeb03c196", + "name": "SwarmBot", + "rating": 1680, + "matches_played": 156, + "win_rate": 62.8 + }, + { + "id": "b_2fa5681bf0ff", + "name": "GathererBot", + "rating": 1640, + "matches_played": 148, + "win_rate": 60.1 + }, + { + "id": "b_f3af8d6177eb", + "name": "GuardianBot", + "rating": 1590, + "matches_played": 155, + "win_rate": 56.8 + }, + { + "id": "b_ae1845729bbf", + "name": "RusherBot", + "rating": 1520, + "matches_played": 142, + "win_rate": 54.9 + }, + { + "id": "b_656f050a7ed3", + "name": "RandomBot", + "rating": 1200, + "matches_played": 180, + "win_rate": 25.0 + } + ] } diff --git a/web/public/data/leaderboard.json b/web/public/data/leaderboard.json index db827b8..2b59ddf 100644 --- a/web/public/data/leaderboard.json +++ b/web/public/data/leaderboard.json @@ -1,6 +1,77 @@ { - "$comment": "Placeholder file - replaced by index builder", - "updated_at": null, - "season": null, - "entries": [] + "updated_at": "2024-01-18T16:00:00Z", + "entries": [ + { + "rank": 1, + "bot_id": "b_457b876ca1c4", + "name": "HunterBot", + "owner_id": "system", + "rating": 1710, + "rating_deviation": 35.0, + "matches_played": 162, + "matches_won": 108, + "win_rate": 66.7, + "health_status": "healthy" + }, + { + "rank": 2, + "bot_id": "b_62beeb03c196", + "name": "SwarmBot", + "owner_id": "system", + "rating": 1680, + "rating_deviation": 38.0, + "matches_played": 156, + "matches_won": 98, + "win_rate": 62.8, + "health_status": "healthy" + }, + { + "rank": 3, + "bot_id": "b_2fa5681bf0ff", + "name": "GathererBot", + "owner_id": "system", + "rating": 1640, + "rating_deviation": 42.0, + "matches_played": 148, + "matches_won": 89, + "win_rate": 60.1, + "health_status": "healthy" + }, + { + "rank": 4, + "bot_id": "b_f3af8d6177eb", + "name": "GuardianBot", + "owner_id": "system", + "rating": 1590, + "rating_deviation": 40.0, + "matches_played": 155, + "matches_won": 88, + "win_rate": 56.8, + "health_status": "healthy" + }, + { + "rank": 5, + "bot_id": "b_ae1845729bbf", + "name": "RusherBot", + "owner_id": "system", + "rating": 1520, + "rating_deviation": 45.0, + "matches_played": 142, + "matches_won": 78, + "win_rate": 54.9, + "health_status": "healthy" + }, + { + "rank": 6, + "bot_id": "b_656f050a7ed3", + "name": "RandomBot", + "owner_id": "system", + "rating": 1200, + "rating_deviation": 50.0, + "matches_played": 180, + "matches_won": 45, + "win_rate": 25.0, + "health_status": "healthy" + } + ] } diff --git a/web/public/data/meta/rivalries.json b/web/public/data/meta/rivalries.json new file mode 100644 index 0000000..c8be412 --- /dev/null +++ b/web/public/data/meta/rivalries.json @@ -0,0 +1,75 @@ +{ + "updated_at": "2026-04-25T14:18:07Z", + "rivalries": [ + { + "bot_a": { + "id": "b_62beeb03c196", + "name": "SwarmBot" + }, + "bot_b": { + "id": "b_656f050a7ed3", + "name": "RandomBot" + }, + "matches": 10, + "record": { + "a_wins": 0, + "b_wins": 10, + "draws": 0 + }, + "closest_match": "m_41178115cb15bb7a", + "longest_streak": { + "holder": "b_656f050a7ed3", + "length": 10 + }, + "recent_matches": [ + "m_3e2cab5ff8b30c6d", + "m_fe47ac7c6fcf27c9", + "m_f1d7b69a8e45c7a4", + "m_7de7a590017b4b5a", + "m_a0490646b75c03b1", + "m_373fea9a4e680dc8", + "m_51ca5662499a3f9b", + "m_7ac443ec2045d06f", + "m_5ad234bc78e4b798", + "m_41178115cb15bb7a" + ], + "narrative": "SwarmBot and RandomBot have met 10 times with RandomBot holding a 10-0 edge. b_656f050a7ed3 is currently on a 10-match winning streak.", + "score": 0 + }, + { + "bot_a": { + "id": "b_2fa5681bf0ff", + "name": "GathererBot" + }, + "bot_b": { + "id": "b_656f050a7ed3", + "name": "RandomBot" + }, + "matches": 10, + "record": { + "a_wins": 0, + "b_wins": 10, + "draws": 0 + }, + "closest_match": "m_6686e424dc1888b2", + "longest_streak": { + "holder": "b_656f050a7ed3", + "length": 10 + }, + "recent_matches": [ + "m_8d88348c783f550c", + "m_119abbf1798ce0e9", + "m_7254ec479efd7ee7", + "m_ce51f757053b4f4d", + "m_dd16649b469e332e", + "m_e446a8f698c68b57", + "m_6b79ebb9a9bc1981", + "m_b82892f81ca17e9e", + "m_ff26ae99199b8999", + "m_6686e424dc1888b2" + ], + "narrative": "GathererBot and RandomBot have met 10 times with RandomBot holding a 10-0 edge. b_656f050a7ed3 is currently on a 10-match winning streak.", + "score": 0 + } + ] +} diff --git a/web/public/data/series/index.json b/web/public/data/series/index.json new file mode 100644 index 0000000..6941d5e --- /dev/null +++ b/web/public/data/series/index.json @@ -0,0 +1,1075 @@ +{ + "updated_at": "2026-04-25T14:18:06Z", + "series": [ + { + "id": 35, + "bot1_id": "b_f3af8d6177eb", + "bot2_id": "b_656f050a7ed3", + "bot1_name": "GuardianBot", + "bot2_name": "RandomBot", + "best_of": 7, + "bot1_wins": 0, + "bot2_wins": 0, + "status": "active", + "created_at": "2026-04-24T22:07:13.368868Z", + "updated_at": "2026-04-24T22:07:13.368868Z", + "games": null + }, + { + "id": 34, + "bot1_id": "b_f3af8d6177eb", + "bot2_id": "b_457b876ca1c4", + "bot1_name": "GuardianBot", + "bot2_name": "HunterBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_f3af8d6177eb", + "created_at": "2026-04-24T21:51:13.378503Z", + "updated_at": "2026-04-24T22:09:13.302415Z", + "games": [ + { + "match_id": "m_9548b196eb171123", + "game_number": 1, + "winner_id": "b_f3af8d6177eb", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T22:07:24.435822Z" + } + ] + }, + { + "id": 33, + "bot1_id": "b_ae1845729bbf", + "bot2_id": "b_f3af8d6177eb", + "bot1_name": "RusherBot", + "bot2_name": "GuardianBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_ae1845729bbf", + "created_at": "2026-04-24T21:51:13.371701Z", + "updated_at": "2026-04-24T22:09:13.310554Z", + "games": [ + { + "match_id": "m_5a5491a574e801c1", + "game_number": 1, + "winner_id": "b_ae1845729bbf", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T22:07:29.39786Z" + } + ] + }, + { + "id": 32, + "bot1_id": "b_62beeb03c196", + "bot2_id": "b_ae1845729bbf", + "bot1_name": "SwarmBot", + "bot2_name": "RusherBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_62beeb03c196", + "created_at": "2026-04-24T21:51:13.366413Z", + "updated_at": "2026-04-24T22:09:13.306971Z", + "games": [ + { + "match_id": "m_4e2e543c59d156d2", + "game_number": 1, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T22:07:18.955475Z" + } + ] + }, + { + "id": 31, + "bot1_id": "b_2fa5681bf0ff", + "bot2_id": "b_62beeb03c196", + "bot1_name": "GathererBot", + "bot2_name": "SwarmBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_2fa5681bf0ff", + "created_at": "2026-04-24T21:51:13.358494Z", + "updated_at": "2026-04-24T22:09:13.308919Z", + "games": [ + { + "match_id": "m_8e94a4f351b40542", + "game_number": 1, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T22:07:34.206697Z" + } + ] + }, + { + "id": 30, + "bot1_id": "b_457b876ca1c4", + "bot2_id": "b_656f050a7ed3", + "bot1_name": "HunterBot", + "bot2_name": "RandomBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_457b876ca1c4", + "created_at": "2026-04-24T21:43:13.399845Z", + "updated_at": "2026-04-24T21:51:13.330347Z", + "games": [ + { + "match_id": "m_9753d876d9c455b8", + "game_number": 1, + "winner_id": "b_457b876ca1c4", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:50:34.26508Z" + } + ] + }, + { + "id": 29, + "bot1_id": "b_ae1845729bbf", + "bot2_id": "b_656f050a7ed3", + "bot1_name": "RusherBot", + "bot2_name": "RandomBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_ae1845729bbf", + "created_at": "2026-04-24T21:43:13.395073Z", + "updated_at": "2026-04-24T21:51:13.324307Z", + "games": [ + { + "match_id": "m_061fcc4921e30829", + "game_number": 1, + "winner_id": "b_ae1845729bbf", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:50:25.338508Z" + } + ] + }, + { + "id": 28, + "bot1_id": "b_62beeb03c196", + "bot2_id": "b_656f050a7ed3", + "bot1_name": "SwarmBot", + "bot2_name": "RandomBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_62beeb03c196", + "created_at": "2026-04-24T21:43:13.389717Z", + "updated_at": "2026-04-24T21:51:13.331758Z", + "games": [ + { + "match_id": "m_41178115cb15bb7a", + "game_number": 1, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:50:30.509529Z" + } + ] + }, + { + "id": 27, + "bot1_id": "b_2fa5681bf0ff", + "bot2_id": "b_656f050a7ed3", + "bot1_name": "GathererBot", + "bot2_name": "RandomBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_2fa5681bf0ff", + "created_at": "2026-04-24T21:43:13.384129Z", + "updated_at": "2026-04-24T21:51:13.333239Z", + "games": [ + { + "match_id": "m_6686e424dc1888b2", + "game_number": 1, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:50:19.782374Z" + } + ] + }, + { + "id": 26, + "bot1_id": "b_656f050a7ed3", + "bot2_id": "b_f3af8d6177eb", + "bot1_name": "RandomBot", + "bot2_name": "GuardianBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_656f050a7ed3", + "created_at": "2026-04-24T21:43:13.377854Z", + "updated_at": "2026-04-24T21:51:13.328831Z", + "games": [ + { + "match_id": "m_47071429f7964aeb", + "game_number": 1, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:50:16.882157Z" + } + ] + }, + { + "id": 25, + "bot1_id": "b_f3af8d6177eb", + "bot2_id": "b_2fa5681bf0ff", + "bot1_name": "GuardianBot", + "bot2_name": "GathererBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_f3af8d6177eb", + "created_at": "2026-04-24T21:39:13.336545Z", + "updated_at": "2026-04-24T21:43:13.348551Z", + "games": [ + { + "match_id": "m_6235028c8d863fb4", + "game_number": 1, + "winner_id": "b_f3af8d6177eb", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:41:19.150487Z" + } + ] + }, + { + "id": 24, + "bot1_id": "b_2fa5681bf0ff", + "bot2_id": "b_ae1845729bbf", + "bot1_name": "GathererBot", + "bot2_name": "RusherBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_2fa5681bf0ff", + "created_at": "2026-04-24T21:39:13.331613Z", + "updated_at": "2026-04-24T21:43:13.355619Z", + "games": [ + { + "match_id": "m_65b38d149c1b846c", + "game_number": 1, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:41:14.120803Z" + } + ] + }, + { + "id": 23, + "bot1_id": "b_2fa5681bf0ff", + "bot2_id": "b_656f050a7ed3", + "bot1_name": "GathererBot", + "bot2_name": "RandomBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_2fa5681bf0ff", + "created_at": "2026-04-24T21:39:13.326319Z", + "updated_at": "2026-04-24T21:43:13.357033Z", + "games": [ + { + "match_id": "m_ff26ae99199b8999", + "game_number": 1, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:41:23.763596Z" + } + ] + }, + { + "id": 22, + "bot1_id": "b_62beeb03c196", + "bot2_id": "b_2fa5681bf0ff", + "bot1_name": "SwarmBot", + "bot2_name": "GathererBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_62beeb03c196", + "created_at": "2026-04-24T21:39:13.320498Z", + "updated_at": "2026-04-24T21:43:13.358602Z", + "games": [ + { + "match_id": "m_3ede2fec80929823", + "game_number": 1, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:41:24.120441Z" + } + ] + }, + { + "id": 21, + "bot1_id": "b_2fa5681bf0ff", + "bot2_id": "b_457b876ca1c4", + "bot1_name": "GathererBot", + "bot2_name": "HunterBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_2fa5681bf0ff", + "created_at": "2026-04-24T21:39:13.313415Z", + "updated_at": "2026-04-24T21:43:13.352775Z", + "games": [ + { + "match_id": "m_b8bbfe9495da2227", + "game_number": 1, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:41:18.741177Z" + } + ] + }, + { + "id": 20, + "bot1_id": "b_62beeb03c196", + "bot2_id": "b_457b876ca1c4", + "bot1_name": "SwarmBot", + "bot2_name": "HunterBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_62beeb03c196", + "created_at": "2026-04-24T21:34:20.060176Z", + "updated_at": "2026-04-24T21:39:13.297171Z", + "games": [ + { + "match_id": "m_4cbd9f142e89c5aa", + "game_number": 1, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:37:24.134931Z" + } + ] + }, + { + "id": 19, + "bot1_id": "b_f3af8d6177eb", + "bot2_id": "b_62beeb03c196", + "bot1_name": "GuardianBot", + "bot2_name": "SwarmBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_f3af8d6177eb", + "created_at": "2026-04-24T21:34:20.054908Z", + "updated_at": "2026-04-24T21:39:13.303092Z", + "games": [ + { + "match_id": "m_60a729bba32dc82f", + "game_number": 1, + "winner_id": "b_f3af8d6177eb", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:37:18.753695Z" + } + ] + }, + { + "id": 18, + "bot1_id": "b_656f050a7ed3", + "bot2_id": "b_62beeb03c196", + "bot1_name": "RandomBot", + "bot2_name": "SwarmBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_656f050a7ed3", + "created_at": "2026-04-24T21:34:20.050086Z", + "updated_at": "2026-04-24T21:39:13.301422Z", + "games": [ + { + "match_id": "m_5ad234bc78e4b798", + "game_number": 1, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:37:23.751226Z" + } + ] + }, + { + "id": 17, + "bot1_id": "b_62beeb03c196", + "bot2_id": "b_ae1845729bbf", + "bot1_name": "SwarmBot", + "bot2_name": "RusherBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_62beeb03c196", + "created_at": "2026-04-24T21:34:20.043767Z", + "updated_at": "2026-04-24T21:39:13.299839Z", + "games": [ + { + "match_id": "m_86fe4a2356fc0299", + "game_number": 1, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:37:19.109761Z" + } + ] + }, + { + "id": 16, + "bot1_id": "b_2fa5681bf0ff", + "bot2_id": "b_62beeb03c196", + "bot1_name": "GathererBot", + "bot2_name": "SwarmBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_2fa5681bf0ff", + "created_at": "2026-04-24T21:34:20.036806Z", + "updated_at": "2026-04-24T21:39:13.304462Z", + "games": [ + { + "match_id": "m_165226d3bb5d8527", + "game_number": 1, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:37:13.745377Z" + } + ] + }, + { + "id": 15, + "bot1_id": "b_ae1845729bbf", + "bot2_id": "b_2fa5681bf0ff", + "bot1_name": "RusherBot", + "bot2_name": "GathererBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_ae1845729bbf", + "created_at": "2026-04-24T21:30:20.092483Z", + "updated_at": "2026-04-24T21:34:20.023073Z", + "games": [ + { + "match_id": "m_097afdfaa937ff82", + "game_number": 1, + "winner_id": "b_ae1845729bbf", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:32:24.128367Z" + } + ] + }, + { + "id": 14, + "bot1_id": "b_2fa5681bf0ff", + "bot2_id": "b_62beeb03c196", + "bot1_name": "GathererBot", + "bot2_name": "SwarmBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_2fa5681bf0ff", + "created_at": "2026-04-24T21:30:20.085844Z", + "updated_at": "2026-04-24T21:34:20.02729Z", + "games": [ + { + "match_id": "m_6c1bb69a45684566", + "game_number": 1, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:32:33.756811Z" + } + ] + }, + { + "id": 13, + "bot1_id": "b_457b876ca1c4", + "bot2_id": "b_2fa5681bf0ff", + "bot1_name": "HunterBot", + "bot2_name": "GathererBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_457b876ca1c4", + "created_at": "2026-04-24T21:30:20.080469Z", + "updated_at": "2026-04-24T21:34:20.025242Z", + "games": [ + { + "match_id": "m_ba352ade57f2641d", + "game_number": 1, + "winner_id": "b_457b876ca1c4", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:32:29.129103Z" + } + ] + }, + { + "id": 12, + "bot1_id": "b_656f050a7ed3", + "bot2_id": "b_2fa5681bf0ff", + "bot1_name": "RandomBot", + "bot2_name": "GathererBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_656f050a7ed3", + "created_at": "2026-04-24T21:30:20.075466Z", + "updated_at": "2026-04-24T21:34:20.021514Z", + "games": [ + { + "match_id": "m_b82892f81ca17e9e", + "game_number": 1, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:32:34.113518Z" + } + ] + }, + { + "id": 11, + "bot1_id": "b_f3af8d6177eb", + "bot2_id": "b_2fa5681bf0ff", + "bot1_name": "GuardianBot", + "bot2_name": "GathererBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_f3af8d6177eb", + "created_at": "2026-04-24T21:30:20.069889Z", + "updated_at": "2026-04-24T21:34:20.019373Z", + "games": [ + { + "match_id": "m_5418f94d032d467d", + "game_number": 1, + "winner_id": "b_f3af8d6177eb", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:32:28.742852Z" + } + ] + }, + { + "id": 10, + "bot1_id": "b_62beeb03c196", + "bot2_id": "b_f3af8d6177eb", + "bot1_name": "SwarmBot", + "bot2_name": "GuardianBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_62beeb03c196", + "created_at": "2026-04-24T21:26:20.141676Z", + "updated_at": "2026-04-24T21:30:20.042239Z", + "games": [ + { + "match_id": "m_922472697ba4755f", + "game_number": 1, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:28:34.132903Z" + } + ] + }, + { + "id": 9, + "bot1_id": "b_656f050a7ed3", + "bot2_id": "b_62beeb03c196", + "bot1_name": "RandomBot", + "bot2_name": "SwarmBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_656f050a7ed3", + "created_at": "2026-04-24T21:26:20.136799Z", + "updated_at": "2026-04-24T21:30:20.050778Z", + "games": [ + { + "match_id": "m_7ac443ec2045d06f", + "game_number": 1, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:28:33.760474Z" + } + ] + }, + { + "id": 8, + "bot1_id": "b_62beeb03c196", + "bot2_id": "b_ae1845729bbf", + "bot1_name": "SwarmBot", + "bot2_name": "RusherBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_62beeb03c196", + "created_at": "2026-04-24T21:26:20.131942Z", + "updated_at": "2026-04-24T21:30:20.047195Z", + "games": [ + { + "match_id": "m_32ade615e5d6ef0d", + "game_number": 1, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:28:29.128534Z" + } + ] + }, + { + "id": 7, + "bot1_id": "b_62beeb03c196", + "bot2_id": "b_457b876ca1c4", + "bot1_name": "SwarmBot", + "bot2_name": "HunterBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_62beeb03c196", + "created_at": "2026-04-24T21:26:20.126506Z", + "updated_at": "2026-04-24T21:30:20.052462Z", + "games": [ + { + "match_id": "m_13819fcd8ee89d74", + "game_number": 1, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:28:28.757417Z" + } + ] + }, + { + "id": 6, + "bot1_id": "b_2fa5681bf0ff", + "bot2_id": "b_62beeb03c196", + "bot1_name": "GathererBot", + "bot2_name": "SwarmBot", + "best_of": 7, + "bot1_wins": 1, + "bot2_wins": 0, + "status": "completed", + "winner_id": "b_2fa5681bf0ff", + "created_at": "2026-04-24T21:26:20.120491Z", + "updated_at": "2026-04-24T21:30:20.048802Z", + "games": [ + { + "match_id": "m_0521e8a8fae8109a", + "game_number": 1, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:28:24.133956Z" + } + ] + }, + { + "id": 5, + "bot1_id": "b_656f050a7ed3", + "bot2_id": "b_457b876ca1c4", + "bot1_name": "RandomBot", + "bot2_name": "HunterBot", + "best_of": 7, + "bot1_wins": 4, + "bot2_wins": 3, + "status": "completed", + "winner_id": "b_656f050a7ed3", + "created_at": "2026-04-24T20:54:20.018137Z", + "updated_at": "2026-04-24T21:26:20.112201Z", + "games": [ + { + "match_id": "m_4e42c2fb37ac9405", + "game_number": 1, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:13.755646Z" + }, + { + "match_id": "m_06c27b988abb67ca", + "game_number": 2, + "winner_id": "b_457b876ca1c4", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:44.131916Z" + }, + { + "match_id": "m_c0eaec1ec717434c", + "game_number": 3, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:25:03.758627Z" + }, + { + "match_id": "m_a48586e98f9db8bd", + "game_number": 4, + "winner_id": "b_457b876ca1c4", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:25:19.137965Z" + }, + { + "match_id": "m_612c0a71197fe0b2", + "game_number": 5, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:16:34.137158Z" + }, + { + "match_id": "m_94e858661ca49d38", + "game_number": 6, + "winner_id": "b_457b876ca1c4", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:18:34.128048Z" + }, + { + "match_id": "m_76683b0a2ddb3be9", + "game_number": 7, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:20:34.146266Z" + } + ] + }, + { + "id": 4, + "bot1_id": "b_656f050a7ed3", + "bot2_id": "b_62beeb03c196", + "bot1_name": "RandomBot", + "bot2_name": "SwarmBot", + "best_of": 7, + "bot1_wins": 4, + "bot2_wins": 3, + "status": "completed", + "winner_id": "b_656f050a7ed3", + "created_at": "2026-04-24T20:54:20.010757Z", + "updated_at": "2026-04-24T21:26:20.110944Z", + "games": [ + { + "match_id": "m_7de7a590017b4b5a", + "game_number": 1, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:09.140307Z" + }, + { + "match_id": "m_a0490646b75c03b1", + "game_number": 2, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:43.765499Z" + }, + { + "match_id": "m_373fea9a4e680dc8", + "game_number": 3, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:59.144593Z" + }, + { + "match_id": "m_51ca5662499a3f9b", + "game_number": 4, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:25:18.75133Z" + }, + { + "match_id": "m_3e2cab5ff8b30c6d", + "game_number": 5, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:16:33.741329Z" + }, + { + "match_id": "m_fe47ac7c6fcf27c9", + "game_number": 6, + "winner_id": "b_62beeb03c196", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:18:33.755695Z" + }, + { + "match_id": "m_f1d7b69a8e45c7a4", + "game_number": 7, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:20:33.744094Z" + } + ] + }, + { + "id": 3, + "bot1_id": "b_656f050a7ed3", + "bot2_id": "b_f3af8d6177eb", + "bot1_name": "RandomBot", + "bot2_name": "GuardianBot", + "best_of": 7, + "bot1_wins": 4, + "bot2_wins": 3, + "status": "completed", + "winner_id": "b_656f050a7ed3", + "created_at": "2026-04-24T20:54:20.004268Z", + "updated_at": "2026-04-24T21:26:20.109729Z", + "games": [ + { + "match_id": "m_d09647b52e895c44", + "game_number": 1, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:08.744586Z" + }, + { + "match_id": "m_a6d64a952000f56e", + "game_number": 2, + "winner_id": "b_f3af8d6177eb", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:39.127331Z" + }, + { + "match_id": "m_ebfe00bc0d76397a", + "game_number": 3, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:58.750139Z" + }, + { + "match_id": "m_eef0e1d18296a4a4", + "game_number": 4, + "winner_id": "b_f3af8d6177eb", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:25:14.120631Z" + }, + { + "match_id": "m_e51b9057422ce09c", + "game_number": 5, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:16:29.123858Z" + }, + { + "match_id": "m_75698b7d9c62b58d", + "game_number": 6, + "winner_id": "b_f3af8d6177eb", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:18:29.13131Z" + }, + { + "match_id": "m_de6de2abfabf0d11", + "game_number": 7, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:20:29.139673Z" + } + ] + }, + { + "id": 2, + "bot1_id": "b_ae1845729bbf", + "bot2_id": "b_656f050a7ed3", + "bot1_name": "RusherBot", + "bot2_name": "RandomBot", + "best_of": 7, + "bot1_wins": 4, + "bot2_wins": 3, + "status": "completed", + "winner_id": "b_ae1845729bbf", + "created_at": "2026-04-24T20:54:19.998298Z", + "updated_at": "2026-04-24T21:26:20.108364Z", + "games": [ + { + "match_id": "m_15b3db0879c38f83", + "game_number": 1, + "winner_id": "b_ae1845729bbf", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:04.107163Z" + }, + { + "match_id": "m_52ff9f8b987a8bfb", + "game_number": 2, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:38.721796Z" + }, + { + "match_id": "m_cbfee78f41616c1c", + "game_number": 3, + "winner_id": "b_ae1845729bbf", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:54.12934Z" + }, + { + "match_id": "m_f0f314a5c4838dd9", + "game_number": 4, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:25:13.730894Z" + }, + { + "match_id": "m_8dc35aaff029a34f", + "game_number": 5, + "winner_id": "b_ae1845729bbf", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:16:28.721499Z" + }, + { + "match_id": "m_2d92c2b154e3d411", + "game_number": 6, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:18:28.7179Z" + }, + { + "match_id": "m_30b67c3fcc0edfe3", + "game_number": 7, + "winner_id": "b_ae1845729bbf", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:20:28.723855Z" + } + ] + }, + { + "id": 1, + "bot1_id": "b_2fa5681bf0ff", + "bot2_id": "b_656f050a7ed3", + "bot1_name": "GathererBot", + "bot2_name": "RandomBot", + "best_of": 7, + "bot1_wins": 4, + "bot2_wins": 3, + "status": "completed", + "winner_id": "b_2fa5681bf0ff", + "created_at": "2026-04-24T20:54:19.989186Z", + "updated_at": "2026-04-24T21:26:20.106357Z", + "games": [ + { + "match_id": "m_ce51f757053b4f4d", + "game_number": 1, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:03.736141Z" + }, + { + "match_id": "m_dd16649b469e332e", + "game_number": 2, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 500, + "completed_at": "2026-04-24T21:24:34.209788Z" + }, + { + "match_id": "m_e446a8f698c68b57", + "game_number": 3, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:24:53.760652Z" + }, + { + "match_id": "m_6b79ebb9a9bc1981", + "game_number": 4, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:25:09.131822Z" + }, + { + "match_id": "m_8d88348c783f550c", + "game_number": 5, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:16:24.12994Z" + }, + { + "match_id": "m_119abbf1798ce0e9", + "game_number": 6, + "winner_id": "b_656f050a7ed3", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:18:24.139792Z" + }, + { + "match_id": "m_7254ec479efd7ee7", + "game_number": 7, + "winner_id": "b_2fa5681bf0ff", + "winner_slot": 0, + "turns": 51, + "completed_at": "2026-04-24T21:20:24.141458Z" + } + ] + } + ] +} diff --git a/web/src/api-types.ts b/web/src/api-types.ts index 8009402..aa3add4 100644 --- a/web/src/api-types.ts +++ b/web/src/api-types.ts @@ -39,6 +39,7 @@ export interface MatchSummary { completed_at: string | null; participants: MatchSummaryParticipant[]; winner_id: string | null; + map_id?: string; turns: number | null; end_reason: string | null; enriched?: boolean;