{"openapi":"3.1.0","info":{"title":"Muse plays Minecraft: bot control","version":"0.1.0","description":"Drive a Minecraft bot through 10 fixed skills. Start a session, then call one skill at a time and read the state. Arguments are checked against fixed lists; nothing you send is run as code. A research demo by Picasso Lab, UC San Diego. Not affiliated with or endorsed by Meta, Mojang or Microsoft. Adults (18+) only."},"servers":[{"url":"https://play.picasso-lab.com"}],"tags":[{"name":"session","description":"start, read, stop, end"},{"name":"tools","description":"the 10 skills"}],"paths":{"/api/session":{"post":{"operationId":"start_session","tags":["session"],"summary":"Get a bot of your own for one lease","description":"Starts a 30-minute session with its own bot. Adults only: send {\"adult\": true} to confirm you are 18 or older.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"adult":{"type":"boolean","const":true,"description":"I am 18 or older"}},"required":["adult"],"additionalProperties":false}}}},"responses":{"201":{"description":"session started (the bot joins within seconds)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}},"400":{"description":"not confirmed 18+","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"too many sessions from this address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"every bot is in use","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}":{"delete":{"operationId":"end_session","tags":["session"],"summary":"End the session early and free the bot","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"responses":{"200":{"description":"ended","content":{"application/json":{"schema":{"type":"object","properties":{"ended":{"type":"boolean"}}}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"already ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/state":{"get":{"operationId":"read_state","tags":["session"],"summary":"Read the game state, the running action and the last result","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"responses":{"200":{"description":"state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/State"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/stop":{"post":{"operationId":"stop","tags":["session"],"summary":"Stop the running action (the bot stays)","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"responses":{"200":{"description":"stopped","content":{"application/json":{"schema":{"type":"object","properties":{"stopped":{"type":"boolean"}}}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/get_state":{"post":{"operationId":"get_state","tags":["tools"],"summary":"Read your state as text: health, food, position, time of day, inventory, nearby blocks and mobs, current goal and the last result","description":"Read your state as text: health, food, position, time of day, inventory, nearby blocks and mobs, current goal and the last result. Takes no game time. One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/go_to":{"post":{"operationId":"go_to","tags":["tools"],"summary":"Walk to a block position with pathfinding (it may dig or bridge small obstacles)","description":"Walk to a block position with pathfinding (it may dig or bridge small obstacles). A y below your feet makes it dig its way down there (how to reach ore underground). The target must be within 256 blocks. Seconds to a minute. One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"x":{"type":"integer","description":"block x","minimum":-30000000,"maximum":30000000},"y":{"type":"integer","description":"block y (feet level), -64 to 320","minimum":-64,"maximum":320},"z":{"type":"integer","description":"block z","minimum":-30000000,"maximum":30000000}},"required":["x","y","z"],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/collect":{"post":{"operationId":"collect","tags":["tools"],"summary":"Find the nearest blocks of one type (searches 32 blocks around you), walk there, mine n of them with the best tool you carry and pick up the drops","description":"Find the nearest blocks of one type (searches 32 blocks around you), walk there, mine n of them with the best tool you carry and pick up the drops. stone drops cobblestone; iron_ore drops raw_iron and needs a stone pickaxe or better. One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"block":{"type":"string","description":"block to mine","enum":["oak_log","spruce_log","birch_log","jungle_log","acacia_log","dark_oak_log","mangrove_log","cherry_log","stone","cobblestone","deepslate","cobbled_deepslate","andesite","diorite","granite","dirt","grass_block","sand","gravel","clay","short_grass","oak_leaves","coal_ore","deepslate_coal_ore","iron_ore","deepslate_iron_ore","copper_ore","deepslate_copper_ore","crafting_table","furnace"]},"n":{"type":"integer","description":"how many blocks to mine, 1 to 64","minimum":1,"maximum":64}},"required":["block","n"],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/craft":{"post":{"operationId":"craft","tags":["tools"],"summary":"Craft n of an item from your inventory (rounded up to whole recipe batches)","description":"Craft n of an item from your inventory (rounded up to whole recipe batches). When the recipe needs a crafting table it uses one within reach, or places one from your inventory. One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"item":{"type":"string","description":"item to make","enum":["oak_planks","spruce_planks","birch_planks","jungle_planks","acacia_planks","dark_oak_planks","mangrove_planks","cherry_planks","stick","crafting_table","chest","furnace","torch","ladder","bowl","bread","bucket","shield","wooden_pickaxe","wooden_axe","wooden_shovel","wooden_sword","stone_pickaxe","stone_axe","stone_shovel","stone_sword","iron_pickaxe","iron_axe","iron_shovel","iron_sword","iron_helmet","iron_chestplate","iron_leggings","iron_boots","oak_door","spruce_door","birch_door","oak_slab","oak_stairs","oak_fence","cobblestone_slab","cobblestone_stairs","stone_bricks"]},"n":{"type":"integer","description":"how many items you want, 1 to 64","minimum":1,"maximum":64}},"required":["item","n"],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/smelt":{"post":{"operationId":"smelt","tags":["tools"],"summary":"Smelt n items in a furnace","description":"Smelt n items in a furnace. item is the INPUT (raw_iron -> iron_ingot, oak_log -> charcoal, cobblestone -> stone). Uses a furnace nearby or places one from your inventory, and fuels it from your inventory (coal, charcoal, planks, logs). About 10 s per item, so one call smelts at most 24; call again for the rest. One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"item":{"type":"string","description":"what to put in the furnace","enum":["raw_iron","raw_copper","raw_gold","cobblestone","sand","clay_ball","oak_log","spruce_log","birch_log","jungle_log","acacia_log","dark_oak_log","mangrove_log","cherry_log","beef","porkchop","chicken","mutton","rabbit","cod","salmon","potato"]},"n":{"type":"integer","description":"how many items to smelt, 1 to 64","minimum":1,"maximum":64}},"required":["item","n"],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/place":{"post":{"operationId":"place","tags":["tools"],"summary":"Place one block from your inventory at an exact position: it must be air, next to a solid block and within reach after walking there.","description":"Place one block from your inventory at an exact position: it must be air, next to a solid block and within reach after walking there. One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"block":{"type":"string","description":"block to place","enum":["crafting_table","furnace","chest","torch","ladder","oak_door","cobblestone","stone","cobbled_deepslate","stone_bricks","dirt","sand","gravel","glass","oak_planks","spruce_planks","birch_planks","jungle_planks","acacia_planks","dark_oak_planks","mangrove_planks","cherry_planks","oak_log","oak_slab","cobblestone_slab"]},"pos":{"type":"object","properties":{"x":{"type":"integer","description":"block x","minimum":-30000000,"maximum":30000000},"y":{"type":"integer","description":"block y (feet level), -64 to 320","minimum":-64,"maximum":320},"z":{"type":"integer","description":"block z","minimum":-30000000,"maximum":30000000}},"required":["x","y","z"],"additionalProperties":false,"description":"where the block goes"}},"required":["block","pos"],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/build":{"post":{"operationId":"build","tags":["tools"],"summary":"Build a blueprint from blocks in your inventory, on flat ground just in front of you (shelter: around you)","description":"Build a blueprint from blocks in your inventory, on flat ground just in front of you (shelter: around you). Blueprints: hut_3x3 = 3x3 hut: walls two high with a door gap at the front, flat roof (23 blocks); shelter = emergency 1x1 shelter around the bot: four walls two high and a roof (10 blocks); wall_5x2 = straight wall 5 long, 2 high (10 blocks); platform_3x3 = flat 3x3 floor (9 blocks). One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"blueprint":{"type":"string","description":"what to build","enum":["hut_3x3","shelter","wall_5x2","platform_3x3"]},"material":{"type":"string","description":"block to build with (must be in your inventory)","enum":["oak_planks","spruce_planks","birch_planks","jungle_planks","acacia_planks","dark_oak_planks","mangrove_planks","cherry_planks","cobblestone","stone","stone_bricks","cobbled_deepslate","dirt","oak_log"]}},"required":["blueprint","material"],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/attack":{"post":{"operationId":"attack","tags":["tools"],"summary":"Fight one mob of this kind (the closest within 16 blocks) until it dies or gets away","description":"Fight one mob of this kind (the closest within 16 blocks) until it dies or gets away. nearest_hostile picks the closest hostile mob. Never players. One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","description":"mob to fight","enum":["nearest_hostile","zombie","husk","drowned","skeleton","stray","spider","cave_spider","creeper","slime","witch","cow","pig","sheep","chicken","rabbit"]}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/eat":{"post":{"operationId":"eat","tags":["tools"],"summary":"Eat the best food in your inventory","description":"Eat the best food in your inventory. Only works when your food bar is below 20. One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/{token}/say":{"post":{"operationId":"say","tags":["tools"],"summary":"Send one chat message to the players on the server (1 to 200 characters, must not start with / or a space, no § sign).","description":"Send one chat message to the players on the server (1 to 200 characters, must not start with / or a space, no § sign). One action at a time: the call waits up to about 25 s for the result, otherwise it answers 202 and the result appears in read_state.","parameters":[{"name":"token","in":"path","required":true,"description":"the session token returned by start_session","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"the message","minLength":1,"maxLength":200,"pattern":"^[^/\\s§][^§]*$"}},"required":["text"],"additionalProperties":false}}}},"responses":{"200":{"description":"the action finished (ok may still be false, with the reason in result)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResult"}}}},"202":{"description":"still running; poll read_state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Running"}}}},"400":{"description":"arguments not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"unknown session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"another action is running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"session ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"the bot is still joining","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"Session":{"type":"object","properties":{"token":{"type":"string"},"session":{"type":"string"},"status":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"leaseSeconds":{"type":"integer"},"playUrl":{"type":"string"},"apiUrl":{"type":"string"}}},"ActionResult":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{"type":"string"},"tool":{"type":"string"},"args":{"type":"object"},"delta":{"type":"object","additionalProperties":{"type":"integer"},"description":"inventory change, item -> +gained / -spent"},"ms":{"type":"number"},"state":{"type":"string","description":"the game state as text after the action"}}},"Running":{"type":"object","properties":{"running":{"type":"boolean"},"tool":{"type":"string"},"message":{"type":"string"}}},"State":{"type":"object","properties":{"session":{"type":"object"},"state":{"type":"string","description":"the game state as text"},"snapshot":{"type":["object","null"]},"running":{"type":["object","null"]},"last":{"type":["object","null"]},"notice":{"type":["string","null"]},"log":{"type":"array","items":{"type":"string"}}}}}}}
