<aside>
The primitives. These map almost 1:1 onto Thrall's /actions surface - fire-and-forget by default, with wait to block until the input releases and screenshot to attach a PNG of the result.
/move - Hold a movement direction for N client ticks/look - Set the view angle, absolute or relative/jump - Trigger a single jump/sneak - Toggle sneak, or hold it for N ticks/attack - Left-click, single or held/use - Right-click, single or held/hotbar - Select active hotbar slot/equip - Alias of /hotbar
</aside><aside>
Composed conveniences. Each of these is a small chain over the primitives above - they exist because the same two-step ritual (equip a slot, then do the thing) kept showing up in scripts and chat workflows. Pulling them up to first-class commands removes that boilerplate.
/eat - Equip optional slot, then hold use for 32 ticks/mine - Equip a tool, then hold attack for N ticks/shoot-bow - Equip a bow, then hold use for 20 ticks (full draw)/peek - Inventory + hover + tooltip screenshot, one shot
</aside><aside>
The bottom-up version of the same surface. /peek above is the convenience wrapper; these are the parts.
/inventory - Open the player inventory/menu - Open named menus and click their slots/hover - Settle the cursor on a slot or pixel for tooltip capture
</aside><aside>
The read-state commands. Neither mutates the game; both are how you find out what's going on.
/status - Current player + world state, as an embed/screenshot - Capture the current view
</aside><aside>
/say - Send chat as the player/run - Run a Minecraft slash command and capture its reply/chat-mirror - Bidirectional Minecraft ↔ Discord chat bridge
</aside><aside>
Anything that moves the client between worlds, servers, or the title screen. The list commands (/worlds, /servers) are doing more than they look - they're rendering interactive UI on top of plain HTTP data.
/world - Singleplayer save management/worlds - List saves, with one-click Join buttons/server - Multiplayer server management/servers - List saved servers, with one-click Join buttons/leave - Disconnect to title screen (SP + MP both)
</aside><aside>
/auth - Microsoft sign-in for online-mode multiplayerThis is the chunkiest command in the catalogue because online-mode auth is the chunkiest part of the system. Thrall doesn't ship with an account - it inherits whichever account the player launched the game with. To join servers as a different account (or to refresh an expired token), the bot drives a full Microsoft → Xbox Live → Minecraft auth chain.
Flow:
/auth start - Issues a Microsoft sign-in URL. If a refresh token from a previous session is cached on disk, it fast-paths: the chain re-runs silently and the response immediately reads logged_in: true with the account details.?code=.../auth complete input: <paste> - Accepts the full redirect URL or just the bare code value. The bot does the XBL → XSTS → Minecraft login_with_xbox → profile-fetch dance, then asks Thrall to swap the active session./auth start after they leave. The embed surfaces this clearly so operators know why the active account hasn't changed yet.Status & logout. /auth status reports logged_out / pending / logged_in with token expiry and the resolved profile. /auth logout clears the on-disk refresh token; the live MC session is untouched until the next auth cycle.
Pre-auth on server join. /server join and /server connect quietly call into this same chain — refreshing silently when possible, prompting the user when interactive sign-in is required.
Examples: /auth start • /auth complete input: <http://localhost/?code=M.R3_BAY>...Calls: POST /auth/start, POST /auth/complete, GET /auth/status, POST /auth/logout
</aside>
<aside>
The scripting layer is where the bot stops being a remote control and starts being a small programming environment. Tasks are JSON schemas - an array of named steps, each one a Thrall action - that you can author inline, attach as a file, save to a library, and re-run by name.
/task - Author, save, and run multi-step JSON task schemas/task run - opens a modal where you paste a schema (≤4000 chars), or you can attach a file: for larger schemas (≤256KB). Optional save-as: <name> persists it under that name in one step. verbose: true posts each step's result as a separate follow-up message; off, you only get the screenshots that steps explicitly produce.
/task save name: <name> file: <json> - persists a schema to the library without running it. Names are kebab-case, ≤50 chars. overwrite: true is required to replace an existing entry - guards against fat-finger collisions.
/task run-saved name: <auto> - re-runs a saved schema. name autocompletes against the library so you don't need to remember spelling.
/task show name: <auto> - prints the schema's metadata + steps and attaches the JSON file for inspection or copy-paste.
/task delete name: <auto> - confirmation-button deletion.
Storage. Saved schemas live as plain JSON files under <jarl-data>/schemas/. You can hand-edit them in your text editor and they'll show up in autocomplete immediately - no reload required. That makes the library feel like just another folder, which is the point.
Execution model. A schema runs step-by-step. Each step is {action, args, label?}; the executor maps action onto the corresponding Thrall endpoint, passes args through, and reports a per-step result. Failures are non-blocking by default - the run continues, so an operator can see "step 3 failed, steps 4-7 succeeded, here's the screenshot at the end" rather than getting halted at the first hiccup.
Examples:
/task run (modal, paste schema inline)/task run file: small-farm.json save-as: small-farm verbose: true/task run-saved name: morning-chores/task save name: chop-tree file: chop-tree.jsonCalls: Any Thrall endpoint named by schema steps.
</aside>