Full Code of MineDojo/Voyager for AI

main 55e45a880755 cached
416 files
559.0 KB
160.8k tokens
322 symbols
1 requests
Download .txt
Showing preview only (654K chars total). Download the full file or copy to clipboard to get everything.
Repository: MineDojo/Voyager
Branch: main
Commit: 55e45a880755
Files: 416
Total size: 559.0 KB

Directory structure:
gitextract_fq_ns2xz/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── voyager-issue-template.md
│   └── workflows/
│       └── close_issue.yml
├── .gitignore
├── FAQ.md
├── LICENSE
├── README.md
├── installation/
│   ├── fabric_mods_install.md
│   └── minecraft_instance_install.md
├── requirements.txt
├── setup.py
├── skill_library/
│   ├── README.md
│   ├── trial1/
│   │   └── skill/
│   │       ├── code/
│   │       │   ├── collectBamboo.js
│   │       │   ├── collectFiveCactusBlocks.js
│   │       │   ├── cookPorkchops.js
│   │       │   ├── cookSevenMutton.js
│   │       │   ├── craftAcaciaPlanksAndSticks.js
│   │       │   ├── craftBucket.js
│   │       │   ├── craftChest.js
│   │       │   ├── craftCopperBlock.js
│   │       │   ├── craftCraftingTable.js
│   │       │   ├── craftFurnace.js
│   │       │   ├── craftIronAxe.js
│   │       │   ├── craftIronChestplate.js
│   │       │   ├── craftIronHelmet.js
│   │       │   ├── craftIronHelmetV2.js
│   │       │   ├── craftIronLeggingsAndBoots.js
│   │       │   ├── craftIronPickaxe.js
│   │       │   ├── craftIronPickaxeV2.js
│   │       │   ├── craftIronShovel.js
│   │       │   ├── craftIronSword.js
│   │       │   ├── craftLightningRod.js
│   │       │   ├── craftOakPlanksAndSticks.js
│   │       │   ├── craftScaffolding.js
│   │       │   ├── craftShears.js
│   │       │   ├── craftShieldImproved.js
│   │       │   ├── craftStonePickaxe.js
│   │       │   ├── craftStoneShovel.js
│   │       │   ├── craftWhiteBed.js
│   │       │   ├── craftWoodenHoe.js
│   │       │   ├── craftWoodenPickaxe.js
│   │       │   ├── craftWoodenSword.js
│   │       │   ├── eatCookedPorkchop.js
│   │       │   ├── eatTwoCookedMutton.js
│   │       │   ├── equipIronArmor.js
│   │       │   ├── equipIronChestplate.js
│   │       │   ├── equipIronSword.js
│   │       │   ├── fillBucketWithWater.js
│   │       │   ├── killFourSheep.js
│   │       │   ├── killOneEnderman.js
│   │       │   ├── killOnePig.js
│   │       │   ├── killOneSpider.js
│   │       │   ├── killOneZombie.js
│   │       │   ├── killTwoPigs.js
│   │       │   ├── mineFiveCoalOres.js
│   │       │   ├── mineFiveCoalOresV2.js
│   │       │   ├── mineFiveCopperOres.js
│   │       │   ├── mineFiveCopperOresV2.js
│   │       │   ├── mineFiveIronOres.js
│   │       │   ├── mineFiveIronOresV2.js
│   │       │   ├── mineFiveLapisLazuliOres.js
│   │       │   ├── mineTenCobblestone.js
│   │       │   ├── mineThreeMoreOakLogs.js
│   │       │   ├── mineWoodLog.js
│   │       │   ├── obtainOneMoreAcaciaLog.js
│   │       │   ├── smeltCactusIntoGreenDye.js
│   │       │   ├── smeltFiveRawIron.js
│   │       │   ├── smeltFiveRawIronV2.js
│   │       │   └── smeltRawCopper.js
│   │       ├── description/
│   │       │   ├── collectBamboo.txt
│   │       │   ├── collectFiveCactusBlocks.txt
│   │       │   ├── cookPorkchops.txt
│   │       │   ├── cookSevenMutton.txt
│   │       │   ├── craftAcaciaPlanksAndSticks.txt
│   │       │   ├── craftBucket.txt
│   │       │   ├── craftChest.txt
│   │       │   ├── craftCopperBlock.txt
│   │       │   ├── craftCraftingTable.txt
│   │       │   ├── craftFurnace.txt
│   │       │   ├── craftIronAxe.txt
│   │       │   ├── craftIronChestplate.txt
│   │       │   ├── craftIronHelmet.txt
│   │       │   ├── craftIronHelmetV2.txt
│   │       │   ├── craftIronLeggingsAndBoots.txt
│   │       │   ├── craftIronPickaxe.txt
│   │       │   ├── craftIronPickaxeV2.txt
│   │       │   ├── craftIronShovel.txt
│   │       │   ├── craftIronSword.txt
│   │       │   ├── craftLightningRod.txt
│   │       │   ├── craftOakPlanksAndSticks.txt
│   │       │   ├── craftScaffolding.txt
│   │       │   ├── craftShears.txt
│   │       │   ├── craftShieldImproved.txt
│   │       │   ├── craftStonePickaxe.txt
│   │       │   ├── craftStoneShovel.txt
│   │       │   ├── craftWhiteBed.txt
│   │       │   ├── craftWoodenHoe.txt
│   │       │   ├── craftWoodenPickaxe.txt
│   │       │   ├── craftWoodenSword.txt
│   │       │   ├── eatCookedPorkchop.txt
│   │       │   ├── eatTwoCookedMutton.txt
│   │       │   ├── equipIronArmor.txt
│   │       │   ├── equipIronChestplate.txt
│   │       │   ├── equipIronSword.txt
│   │       │   ├── fillBucketWithWater.txt
│   │       │   ├── killFourSheep.txt
│   │       │   ├── killOneEnderman.txt
│   │       │   ├── killOnePig.txt
│   │       │   ├── killOneSpider.txt
│   │       │   ├── killOneZombie.txt
│   │       │   ├── killTwoPigs.txt
│   │       │   ├── mineFiveCoalOres.txt
│   │       │   ├── mineFiveCoalOresV2.txt
│   │       │   ├── mineFiveCopperOres.txt
│   │       │   ├── mineFiveCopperOresV2.txt
│   │       │   ├── mineFiveIronOres.txt
│   │       │   ├── mineFiveIronOresV2.txt
│   │       │   ├── mineFiveLapisLazuliOres.txt
│   │       │   ├── mineTenCobblestone.txt
│   │       │   ├── mineThreeMoreOakLogs.txt
│   │       │   ├── mineWoodLog.txt
│   │       │   ├── obtainOneMoreAcaciaLog.txt
│   │       │   ├── smeltCactusIntoGreenDye.txt
│   │       │   ├── smeltFiveRawIron.txt
│   │       │   ├── smeltFiveRawIronV2.txt
│   │       │   └── smeltRawCopper.txt
│   │       ├── skills.json
│   │       └── vectordb/
│   │           ├── chroma-collections.parquet
│   │           ├── chroma-embeddings.parquet
│   │           └── index/
│   │               ├── id_to_uuid_e1bd933d-d62f-46c2-884d-d75ef3bcb09e.pkl
│   │               ├── index_metadata_e1bd933d-d62f-46c2-884d-d75ef3bcb09e.pkl
│   │               └── uuid_to_id_e1bd933d-d62f-46c2-884d-d75ef3bcb09e.pkl
│   ├── trial2/
│   │   └── skill/
│   │       ├── code/
│   │       │   ├── catchFiveFishSafely.js
│   │       │   ├── catchThreeFish.js
│   │       │   ├── checkStonePickaxe.js
│   │       │   ├── chopDownSpruceLogs.js
│   │       │   ├── chopDownSpruceLogsV2.js
│   │       │   ├── chopSpruceLogs.js
│   │       │   ├── collectWaterWithBucket.js
│   │       │   ├── cookMutton.js
│   │       │   ├── craftBucket.js
│   │       │   ├── craftChest.js
│   │       │   ├── craftEightSticks.js
│   │       │   ├── craftEightTorches.js
│   │       │   ├── craftFishingRod.js
│   │       │   ├── craftFurnace.js
│   │       │   ├── craftIronChestplate.js
│   │       │   ├── craftIronHelmet.js
│   │       │   ├── craftIronLeggingsAndBoots.js
│   │       │   ├── craftIronPickaxe.js
│   │       │   ├── craftIronPickaxeWithMaterials.js
│   │       │   ├── craftIronSword.js
│   │       │   ├── craftShieldWithFurnace.js
│   │       │   ├── craftSixteenTorches.js
│   │       │   ├── craftSpyglass.js
│   │       │   ├── craftSticks.js
│   │       │   ├── craftStoneAxe.js
│   │       │   ├── craftStoneHoe.js
│   │       │   ├── craftStonePickaxe.js
│   │       │   ├── craftStoneShovel.js
│   │       │   ├── craftStoneSword.js
│   │       │   ├── craftTorches.js
│   │       │   ├── craftTwentySprucePlanks.js
│   │       │   ├── craftWhiteBedWithExploration.js
│   │       │   ├── craftWoodenHoe.js
│   │       │   ├── craftWoodenPickaxe.js
│   │       │   ├── craftWoodenPlanks.js
│   │       │   ├── eatCookedMutton.js
│   │       │   ├── eatCookedMuttonV2.js
│   │       │   ├── eatCookedMuttonV3.js
│   │       │   ├── equipIronArmor.js
│   │       │   ├── exploreCave.js
│   │       │   ├── exploreCaveAndGatherResources.js
│   │       │   ├── exploreCaveAndGatherResourcesV2.js
│   │       │   ├── fishInNearbyWaterSafely.js
│   │       │   ├── mineCoalOre.js
│   │       │   ├── mineCopperOreWithStonePickaxe.js
│   │       │   ├── mineFiveCoalOres.js
│   │       │   ├── mineFiveCoalOresV2.js
│   │       │   ├── mineFiveCopperOres.js
│   │       │   ├── mineFiveIronOres.js
│   │       │   ├── mineLapisOre.js
│   │       │   ├── mineThreeIronOres.js
│   │       │   ├── mineWoodLog.js
│   │       │   ├── smeltOneRawIron.js
│   │       │   ├── smeltRawCopper.js
│   │       │   ├── smeltRawIron.js
│   │       │   ├── smeltSixRawIron.js
│   │       │   └── smeltTwentyFiveIronIngots.js
│   │       ├── description/
│   │       │   ├── catchFiveFishSafely.txt
│   │       │   ├── catchThreeFish.txt
│   │       │   ├── checkStonePickaxe.txt
│   │       │   ├── chopDownSpruceLogs.txt
│   │       │   ├── chopDownSpruceLogsV2.txt
│   │       │   ├── chopSpruceLogs.txt
│   │       │   ├── collectWaterWithBucket.txt
│   │       │   ├── cookMutton.txt
│   │       │   ├── craftBucket.txt
│   │       │   ├── craftChest.txt
│   │       │   ├── craftEightSticks.txt
│   │       │   ├── craftEightTorches.txt
│   │       │   ├── craftFishingRod.txt
│   │       │   ├── craftFurnace.txt
│   │       │   ├── craftIronChestplate.txt
│   │       │   ├── craftIronHelmet.txt
│   │       │   ├── craftIronLeggingsAndBoots.txt
│   │       │   ├── craftIronPickaxe.txt
│   │       │   ├── craftIronPickaxeWithMaterials.txt
│   │       │   ├── craftIronSword.txt
│   │       │   ├── craftShieldWithFurnace.txt
│   │       │   ├── craftSixteenTorches.txt
│   │       │   ├── craftSpyglass.txt
│   │       │   ├── craftSticks.txt
│   │       │   ├── craftStoneAxe.txt
│   │       │   ├── craftStoneHoe.txt
│   │       │   ├── craftStonePickaxe.txt
│   │       │   ├── craftStoneShovel.txt
│   │       │   ├── craftStoneSword.txt
│   │       │   ├── craftTorches.txt
│   │       │   ├── craftTwentySprucePlanks.txt
│   │       │   ├── craftWhiteBedWithExploration.txt
│   │       │   ├── craftWoodenHoe.txt
│   │       │   ├── craftWoodenPickaxe.txt
│   │       │   ├── craftWoodenPlanks.txt
│   │       │   ├── eatCookedMutton.txt
│   │       │   ├── eatCookedMuttonV2.txt
│   │       │   ├── eatCookedMuttonV3.txt
│   │       │   ├── equipIronArmor.txt
│   │       │   ├── exploreCave.txt
│   │       │   ├── exploreCaveAndGatherResources.txt
│   │       │   ├── exploreCaveAndGatherResourcesV2.txt
│   │       │   ├── fishInNearbyWaterSafely.txt
│   │       │   ├── mineCoalOre.txt
│   │       │   ├── mineCopperOreWithStonePickaxe.txt
│   │       │   ├── mineFiveCoalOres.txt
│   │       │   ├── mineFiveCoalOresV2.txt
│   │       │   ├── mineFiveCopperOres.txt
│   │       │   ├── mineFiveIronOres.txt
│   │       │   ├── mineLapisOre.txt
│   │       │   ├── mineThreeIronOres.txt
│   │       │   ├── mineWoodLog.txt
│   │       │   ├── smeltOneRawIron.txt
│   │       │   ├── smeltRawCopper.txt
│   │       │   ├── smeltRawIron.txt
│   │       │   ├── smeltSixRawIron.txt
│   │       │   └── smeltTwentyFiveIronIngots.txt
│   │       ├── skills.json
│   │       └── vectordb/
│   │           ├── chroma-collections.parquet
│   │           ├── chroma-embeddings.parquet
│   │           └── index/
│   │               ├── id_to_uuid_7b5fd116-0820-46cb-981a-a6d642d4f025.pkl
│   │               ├── index_metadata_7b5fd116-0820-46cb-981a-a6d642d4f025.pkl
│   │               └── uuid_to_id_7b5fd116-0820-46cb-981a-a6d642d4f025.pkl
│   └── trial3/
│       └── skill/
│           ├── code/
│           │   ├── cookChicken.js
│           │   ├── cookRawBeef.js
│           │   ├── cookRawMutton.js
│           │   ├── cookThreeRawChicken.js
│           │   ├── craftBirchBoat.js
│           │   ├── craftBoneMeal.js
│           │   ├── craftChest.js
│           │   ├── craftClock.js
│           │   ├── craftCopperBlock.js
│           │   ├── craftDiamondSword.js
│           │   ├── craftFurnace.js
│           │   ├── craftIronChestplate.js
│           │   ├── craftIronHelmet.js
│           │   ├── craftIronLeggingsAndBoots.js
│           │   ├── craftIronPickaxe.js
│           │   ├── craftIronSword.js
│           │   ├── craftShield.js
│           │   ├── craftStoneAxe.js
│           │   ├── craftStoneHoe.js
│           │   ├── craftStoneHoeV2.js
│           │   ├── craftStonePickaxe.js
│           │   ├── craftStoneShovel.js
│           │   ├── craftStoneSword.js
│           │   ├── craftStoneTools.js
│           │   ├── craftTenCobblestoneWalls.js
│           │   ├── craftWoodenPickaxe.js
│           │   ├── craftWoodenSword.js
│           │   ├── eatCookedBeef.js
│           │   ├── eatCookedBeefV2.js
│           │   ├── eatCookedBeefV3.js
│           │   ├── eatCookedMutton.js
│           │   ├── eatCookedMuttonIfHungry.js
│           │   ├── equipIronChestplate.js
│           │   ├── equipIronHelmet.js
│           │   ├── equipIronLeggingsAndBoots.js
│           │   ├── equipShield.js
│           │   ├── killChickenWithIncreasedTime.js
│           │   ├── killThreeChickens.js
│           │   ├── killThreeCows.js
│           │   ├── killThreeSheep.js
│           │   ├── mineDeepslateOres.js
│           │   ├── mineEightCobblestone.js
│           │   ├── mineFiveCoalOre.js
│           │   ├── mineFiveCopperOre.js
│           │   ├── mineFourCoalOre.js
│           │   ├── mineTenCobbledDeepslateBelowY0.js
│           │   ├── mineThreeIronOre.js
│           │   ├── mineThreeMoreOakLogs.js
│           │   ├── mineWoodLog.js
│           │   ├── obtainBirchLogs.js
│           │   ├── openChestAndCheckContents.js
│           │   ├── plantOakSapling.js
│           │   ├── smeltCopperOre.js
│           │   ├── smeltFiveRawCopper.js
│           │   ├── smeltFiveRawGold.js
│           │   ├── smeltRawIron.js
│           │   ├── smeltThreeRawCopper.js
│           │   └── waitAndEatCookedMutton.js
│           ├── description/
│           │   ├── cookChicken.txt
│           │   ├── cookRawBeef.txt
│           │   ├── cookRawMutton.txt
│           │   ├── cookThreeRawChicken.txt
│           │   ├── craftBirchBoat.txt
│           │   ├── craftBoneMeal.txt
│           │   ├── craftChest.txt
│           │   ├── craftClock.txt
│           │   ├── craftCopperBlock.txt
│           │   ├── craftDiamondSword.txt
│           │   ├── craftFurnace.txt
│           │   ├── craftIronChestplate.txt
│           │   ├── craftIronHelmet.txt
│           │   ├── craftIronLeggingsAndBoots.txt
│           │   ├── craftIronPickaxe.txt
│           │   ├── craftIronSword.txt
│           │   ├── craftShield.txt
│           │   ├── craftStoneAxe.txt
│           │   ├── craftStoneHoe.txt
│           │   ├── craftStoneHoeV2.txt
│           │   ├── craftStonePickaxe.txt
│           │   ├── craftStoneShovel.txt
│           │   ├── craftStoneSword.txt
│           │   ├── craftStoneTools.txt
│           │   ├── craftTenCobblestoneWalls.txt
│           │   ├── craftWoodenPickaxe.txt
│           │   ├── craftWoodenSword.txt
│           │   ├── eatCookedBeef.txt
│           │   ├── eatCookedBeefV2.txt
│           │   ├── eatCookedBeefV3.txt
│           │   ├── eatCookedMutton.txt
│           │   ├── eatCookedMuttonIfHungry.txt
│           │   ├── equipIronChestplate.txt
│           │   ├── equipIronHelmet.txt
│           │   ├── equipIronLeggingsAndBoots.txt
│           │   ├── equipShield.txt
│           │   ├── killChickenWithIncreasedTime.txt
│           │   ├── killThreeChickens.txt
│           │   ├── killThreeCows.txt
│           │   ├── killThreeSheep.txt
│           │   ├── mineDeepslateOres.txt
│           │   ├── mineEightCobblestone.txt
│           │   ├── mineFiveCoalOre.txt
│           │   ├── mineFiveCopperOre.txt
│           │   ├── mineFourCoalOre.txt
│           │   ├── mineTenCobbledDeepslateBelowY0.txt
│           │   ├── mineThreeIronOre.txt
│           │   ├── mineThreeMoreOakLogs.txt
│           │   ├── mineWoodLog.txt
│           │   ├── obtainBirchLogs.txt
│           │   ├── openChestAndCheckContents.txt
│           │   ├── plantOakSapling.txt
│           │   ├── smeltCopperOre.txt
│           │   ├── smeltFiveRawCopper.txt
│           │   ├── smeltFiveRawGold.txt
│           │   ├── smeltRawIron.txt
│           │   ├── smeltThreeRawCopper.txt
│           │   └── waitAndEatCookedMutton.txt
│           ├── skills.json
│           └── vectordb/
│               ├── chroma-collections.parquet
│               ├── chroma-embeddings.parquet
│               └── index/
│                   ├── id_to_uuid_2f8ccde6-89f7-422b-87ec-8e46e8f1292a.pkl
│                   ├── index_metadata_2f8ccde6-89f7-422b-87ec-8e46e8f1292a.pkl
│                   └── uuid_to_id_2f8ccde6-89f7-422b-87ec-8e46e8f1292a.pkl
└── voyager/
    ├── __init__.py
    ├── agents/
    │   ├── __init__.py
    │   ├── action.py
    │   ├── critic.py
    │   ├── curriculum.py
    │   └── skill.py
    ├── control_primitives/
    │   ├── .prettierrc.json
    │   ├── __init__.py
    │   ├── craftHelper.js
    │   ├── craftItem.js
    │   ├── exploreUntil.js
    │   ├── givePlacedItemBack.js
    │   ├── killMob.js
    │   ├── mineBlock.js
    │   ├── placeItem.js
    │   ├── shoot.js
    │   ├── smeltItem.js
    │   ├── useChest.js
    │   └── waitForMobRemoved.js
    ├── control_primitives_context/
    │   ├── .prettierrc.json
    │   ├── __init__.py
    │   ├── craftItem.js
    │   ├── exploreUntil.js
    │   ├── killMob.js
    │   ├── mineBlock.js
    │   ├── mineflayer.js
    │   ├── placeItem.js
    │   ├── smeltItem.js
    │   └── useChest.js
    ├── prompts/
    │   ├── __init__.py
    │   ├── action_response_format.txt
    │   ├── action_template.txt
    │   ├── critic.txt
    │   ├── curriculum.txt
    │   ├── curriculum_qa_step1_ask_questions.txt
    │   ├── curriculum_qa_step2_answer_questions.txt
    │   ├── curriculum_task_decomposition.txt
    │   └── skill.txt
    ├── utils/
    │   ├── __init__.py
    │   ├── file_utils.py
    │   ├── json_utils.py
    │   └── record_utils.py
    └── voyager.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/voyager-issue-template.md
================================================
---
name: Voyager Issue Template
about: Create an issue to Voyager
title: ''
labels: ''
assignees: ''

---

### Before submitting an issue, make sure you read the [FAQ.md](FAQ.md)

### Briefly describe your issue
...
### Please provide your python, nodejs, Minecraft, and Fabric versions here
...
### [If applicable] Please provide the Minefalyer and Minecraft logs, you can find the log under `logs` folder
...
### [If applicable] Please provide the GPT conversations that are printed each round.
...


================================================
FILE: .github/workflows/close_issue.yml
================================================
name: Close inactive issues
on:
  schedule:
    - cron: "30 1 * * *"

jobs:
  close-issues:
    runs-on: ubuntu-latest
    permissions:
      issues: write
      pull-requests: write
    steps:
      - uses: actions/stale@v5
        with:
          days-before-issue-stale: 30
          days-before-issue-close: 14
          stale-issue-label: "stale"
          stale-issue-message: "This issue is stale because it has been open for 30 days with no activity."
          close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
          days-before-pr-stale: -1
          days-before-pr-close: -1
          repo-token: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .gitignore
================================================
ckpt*

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/

# Translations
*.mo
*.pot

# Django stuff:
*.log
.static_storage/
.media/
local_settings.py

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
# env/
venv/
# ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/

# Mac
.DS_Store

# MuJoCo License key
mjkey.txt

.mujocomanip_temp_model.xml

# Python IDE
.idea

# Locally generated files
dump.rdb
*.local.ipynb
runs/
temp*
debug_*
*.swp

.tabnine_root

logs/
plot_iter.py
*.svg

================================================
FILE: FAQ.md
================================================
# Frequently Asked Questions
* [I got connection error after I click on the Azure login link and login to Microsoft account.](#i-got-a-connection-error-after-i-click-on-the-azure-login-link-and-login-to-my-microsoft-account)
* [I got `KeyError: 'access_token'` after I copied the link](#i-got-keyerror-accesstoken-after-i-copied-the-link)
* [I got `Subprocess Mineflayer failed to start` error.](#i-got-subprocess-mineflayer-failed-to-start-error)
* [I saw the bot left and rejoin the game after each task.](#i-saw-the-bot-left-and-rejoin-the-game-after-each-task)
* [How to show the bot's first-person perspective?](#how-to-show-the-bots-first-person-view)
* [Can I use GPT-3.5 instead of GPT-4?](#can-i-use-gpt-35-instead-of-gpt-4)
* [What's the estimated cost of running Voyager?](#whats-the-estimated-cost-of-running-voyager)

## I got a connection error after I click on the Azure login link and login to my Microsoft account.

It's normal that you get a connection refused or 404 error after you log in. You will still see the new URL in your browser. You just need to copy and paste that link. It should contain things like `code=M.C....` in that link.

## I got `KeyError: 'access_token'` after I copied the link

While testing Voyager, we use Redirect URI Type: `Public client/native (mobile & desktop)` in the app registration for Azure Login. However, according to the report in issue [#34](https://github.com/MineDojo/Voyager/issues/34#issuecomment-1567007133), the URI Type was changed to "Web" and it resolved the problem. Feel free to attempt both URI Types to determine which one works for you. If all the approaches fail, please refer to the original tutorial in [minecraft-launcher-lib](https://minecraft-launcher-lib.readthedocs.io/en/stable/tutorial/microsoft_login.html).

Update: This is probably a Microsoft's bug. See [issue #80 in minecraft-launcher-lib](https://codeberg.org/JakobDev/minecraft-launcher-lib/issues/80). If you cannot solve this problem, you can try to use the [Minecraft Official Launcher](./installation/minecraft_instance_install.md#option-2-minecraft-official-launcher) and use mc_port to run.
## I got `Subprocess Mineflayer failed to start` error.

There are many reasons that may cause this problem. You can try with following solutions:
1. Make sure you install nodejs and the dependency packages correctly. You can use the following command to check your installation:
    ```bash
    cd voyager/env/mineflayer
    node index.js
    ```
   If you see `Server started on port {PORT}`, then your installation is correct. You can kill the process by `Ctrl+C`.
2. Make sure you install Fabric correctly. You should be able to select the Fabric version in the Minecraft launcher. 
3. Each Mineflayer process can only listen to one port. If you want to start multiple instances of `Voyager`, you need to manually change the port when initialization:
    ```python
    from voyager import Voyager
    voyager = Voyager(
        server_port=3001, # default is 3000
        ...
    )
    ```
   
## I saw the bot left and rejoin the game after each task.

After completing each task, we'll reset the environment, which means the bot will exit and rejoin the game. This reset is necessary to synchronize Mineflayer with the Minecraft game. We do this because certain commands we utilize might result in lag on the Mineflayer side, causing the inventory stored in Mineflayer to differ from the actual inventory in the game. However, if you wish to avoid the reset, you can use `voyager.learn(reset_env=False)` and consider increasing the `env_wait_ticks` value. This will provide Mineflayer with additional time to sync with the Minecraft game.


## How to show the bot's first-person view?

Due to the Mineflayer's limitation, we currently can not directly get the bot's view in the game. Although there's a plugin called [prismarine-viewer](https://github.com/PrismarineJS/prismarine-viewer), the video quality is not good enough, so we opt not to use it. Our demo video is generated by [replay-mod](https://www.replaymod.com/). We start the recording and let the bot play for hours, then come back to the recording and render the view from the bot.


## Can I use GPT-3.5 instead of GPT-4?

It's highly recommended to use GPT-4. GPT-3.5 falls behind in terms of code quality and reasoning ability compared to GPT-4. Moreover, GPT-3.5 has a limited context length, which means it may provide incomplete responses. If you insist on using GPT-3.5, it is essential to configure it with `skill_manager_retrieval_top_k` ≤ 2 to reduce the context length of the prompt.

## What's the estimated cost of running Voyager?

Using Voyager for approximately 160 iterations using GPT-4 will cost you around 50 USD. It's important to keep a close eye on your OpenAI API expenses and avoid unnecessary spending. Once Voyager begins running, it's recommended to monitor the bot's behavior for a period and ensure that it successfully completes some tasks.

================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2023 MineDojo Team

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# Voyager: An Open-Ended Embodied Agent with Large Language Models
<div align="center">

[[Website]](https://voyager.minedojo.org/)
[[Arxiv]](https://arxiv.org/abs/2305.16291)
[[PDF]](https://voyager.minedojo.org/assets/documents/voyager.pdf)
[[Tweet]](https://twitter.com/DrJimFan/status/1662115266933972993?s=20)

[![Python Version](https://img.shields.io/badge/Python-3.9-blue.svg)](https://github.com/MineDojo/Voyager)
[![GitHub license](https://img.shields.io/github/license/MineDojo/Voyager)](https://github.com/MineDojo/Voyager/blob/main/LICENSE)
______________________________________________________________________


https://github.com/MineDojo/Voyager/assets/25460983/ce29f45b-43a5-4399-8fd8-5dd105fd64f2

![](images/pull.png)


</div>

We introduce Voyager, the first LLM-powered embodied lifelong learning agent
in Minecraft that continuously explores the world, acquires diverse skills, and
makes novel discoveries without human intervention. Voyager consists of three
key components: 1) an automatic curriculum that maximizes exploration, 2) an
ever-growing skill library of executable code for storing and retrieving complex
behaviors, and 3) a new iterative prompting mechanism that incorporates environment
feedback, execution errors, and self-verification for program improvement.
Voyager interacts with GPT-4 via blackbox queries, which bypasses the need for
model parameter fine-tuning. The skills developed by Voyager are temporally
extended, interpretable, and compositional, which compounds the agent’s abilities
rapidly and alleviates catastrophic forgetting. Empirically, Voyager shows
strong in-context lifelong learning capability and exhibits exceptional proficiency
in playing Minecraft. It obtains 3.3× more unique items, travels 2.3× longer
distances, and unlocks key tech tree milestones up to 15.3× faster than prior SOTA.
Voyager is able to utilize the learned skill library in a new Minecraft world to
solve novel tasks from scratch, while other techniques struggle to generalize.

In this repo, we provide Voyager code. This codebase is under [MIT License](LICENSE).

# Installation
Voyager requires Python ≥ 3.9 and Node.js ≥ 16.13.0. We have tested on Ubuntu 20.04, Windows 11, and macOS. You need to follow the instructions below to install Voyager.

## Python Install
```
git clone https://github.com/MineDojo/Voyager
cd Voyager
pip install -e .
```

## Node.js Install
In addition to the Python dependencies, you need to install the following Node.js packages:
```
cd voyager/env/mineflayer
npm install -g npx
npm install
cd mineflayer-collectblock
npx tsc
cd ..
npm install
```

## Minecraft Instance Install

Voyager depends on Minecraft game. You need to install Minecraft game and set up a Minecraft instance.

Follow the instructions in [Minecraft Login Tutorial](installation/minecraft_instance_install.md) to set up your Minecraft Instance.

## Fabric Mods Install

You need to install fabric mods to support all the features in Voyager. Remember to use the correct Fabric version of all the mods. 

Follow the instructions in [Fabric Mods Install](installation/fabric_mods_install.md) to install the mods.

# Getting Started
Voyager uses OpenAI's GPT-4 as the language model. You need to have an OpenAI API key to use Voyager. You can get one from [here](https://platform.openai.com/account/api-keys).

After the installation process, you can run Voyager by:
```python
from voyager import Voyager

# You can also use mc_port instead of azure_login, but azure_login is highly recommended
azure_login = {
    "client_id": "YOUR_CLIENT_ID",
    "redirect_url": "https://127.0.0.1/auth-response",
    "secret_value": "[OPTIONAL] YOUR_SECRET_VALUE",
    "version": "fabric-loader-0.14.18-1.19", # the version Voyager is tested on
}
openai_api_key = "YOUR_API_KEY"

voyager = Voyager(
    azure_login=azure_login,
    openai_api_key=openai_api_key,
)

# start lifelong learning
voyager.learn()
```

* If you are running with `Azure Login` for the first time, it will ask you to follow the command line instruction to generate a config file.
* For `Azure Login`, you also need to select the world and open the world to LAN by yourself. After you run `voyager.learn()` the game will pop up soon, you need to:
  1. Select `Singleplayer` and press `Create New World`.
  2. Set Game Mode to `Creative` and Difficulty to `Peaceful`.
  3. After the world is created, press `Esc` key and press `Open to LAN`.
  4. Select `Allow cheats: ON` and press `Start LAN World`. You will see the bot join the world soon. 

# Resume from a checkpoint during learning

If you stop the learning process and want to resume from a checkpoint later, you can instantiate Voyager by:
```python
from voyager import Voyager

voyager = Voyager(
    azure_login=azure_login,
    openai_api_key=openai_api_key,
    ckpt_dir="YOUR_CKPT_DIR",
    resume=True,
)
```

# Run Voyager for a specific task with a learned skill library

If you want to run Voyager for a specific task with a learned skill library, you should first pass the skill library directory to Voyager:
```python
from voyager import Voyager

# First instantiate Voyager with skill_library_dir.
voyager = Voyager(
    azure_login=azure_login,
    openai_api_key=openai_api_key,
    skill_library_dir="./skill_library/trial1", # Load a learned skill library.
    ckpt_dir="YOUR_CKPT_DIR", # Feel free to use a new dir. Do not use the same dir as skill library because new events will still be recorded to ckpt_dir. 
    resume=False, # Do not resume from a skill library because this is not learning.
)
```
Then, you can run task decomposition. Notice: Occasionally, the task decomposition may not be logical. If you notice the printed sub-goals are flawed, you can rerun the decomposition.
```python
# Run task decomposition
task = "YOUR TASK" # e.g. "Craft a diamond pickaxe"
sub_goals = voyager.decompose_task(task=task)
```
Finally, you can run the sub-goals with the learned skill library:
```python
voyager.inference(sub_goals=sub_goals)
```

For all valid skill libraries, see [Learned Skill Libraries](skill_library/README.md).

# FAQ
If you have any questions, please check our [FAQ](FAQ.md) first before opening an issue.

# Paper and Citation

If you find our work useful, please consider citing us! 

```bibtex
@article{wang2023voyager,
  title   = {Voyager: An Open-Ended Embodied Agent with Large Language Models},
  author  = {Guanzhi Wang and Yuqi Xie and Yunfan Jiang and Ajay Mandlekar and Chaowei Xiao and Yuke Zhu and Linxi Fan and Anima Anandkumar},
  year    = {2023},
  journal = {arXiv preprint arXiv: Arxiv-2305.16291}
}
```

Disclaimer: This project is strictly for research purposes, and not an official product from NVIDIA.


================================================
FILE: installation/fabric_mods_install.md
================================================
# Fabric Mods Install
In this tutorial, we will install the Fabric launcher and 5 mods. Remember to use the correct Fabric version that matches your game version (1.19) of all the mods. 
1. You can download the latest Fabric Installer from [here](https://fabricmc.net/use/installer/). For Windows users, just download the `.exe` file. For Mac or Ubuntu users, download the jar file and call `java -jar fabric-installer-0.11.2.jar` to install. Select game version to be `1.19` and loader version to be `0.14.18`. It will automatically detect your Minecraft game install location.
2. After installing Fabric, you will have a `YOUR_MINECRAFT_GAME_LOCATION/mods` folder. You need to put all the mods under this folder. Also, you will have a `YOUR_MINECRAFT_GAME_LOCATION/versions/fabric-loader-0.14.18-1.19`. This is the version you will run the game with. 
3. Here are 4 mods that can be directly downloaded to `YOUR_MINECRAFT_GAME_LOCATION/mods` folder: 
   * [Fabric API](https://modrinth.com/mod/fabric-api/version/0.58.0+1.19): Basic Fabric APIs.
   * [Mod Menu](https://cdn.modrinth.com/data/mOgUt4GM/versions/4.0.4/modmenu-4.0.4.jar): Used to manage all the mods that you download.
   * [Complete Config](https://www.curseforge.com/minecraft/mc-mods/completeconfig/download/3821056): Dependency of server pause.
   * [Multi Server Pause](https://www.curseforge.com/minecraft/mc-mods/multiplayer-server-pause-fabric/download/3822586): Used to pause the server when waiting for GPT-4 to reply.
4. For the last mod [Better Respawn](https://github.com/xieleo5/better-respawn/tree/1.19), you need to manually clone and compile.
   
   * After you clone the repo, remove the `'forge'` string in the last line of `settings.gradle`. Then run `gradlew build` to compile the mod. You will find the compiled jar file in `better-respawn/fabric/build/libs/better-respawn-fabric-1.19-2.0.0.jar`. Put the jar file to the mod folder.
     * You will need a Java Runtime Environment v17+ to build `better-respawn`. Some newer JRE versions will error during build. Find the JRE v17 archive [here](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html).
   * After you launch the game, go to `YOUR_MINECRAFT_GAME_LOCATION/config/better-respawn`, and modify the properties file with:
      ```
      respawn_block_range=32
      max_respawn_distance=32
      min_respawn_distance=0
      ```
5. Don't forget to change the `version` in `azure_login` to `fabric-loader-0.14.18-1.19` that you are using. You can find it under `YOUR_MINECRAFT_GAME_LOCATION/version` folder.

You can return to [README.md](../README.md#getting-started) and getting started now.


================================================
FILE: installation/minecraft_instance_install.md
================================================
# Minecraft Instance Install
To start using Voyager, you should first make sure to have an official [Minecraft](https://www.minecraft.net/) game (version 1.19) installed. 

There are two ways to start a Minecraft instance for Voyager. Sometimes GPT-4 will write an infinite loop that runs forever. In this case, there'll be a request timeout. Using Azure login can automatically resume the running if there's a request timeout.

## Option 1: Microsoft Azure Login (Recommended)
Using this method will allow Voyager to automatically resume when there's a request timeout. This is dependent on the [minecraft-launcher-lib](https://minecraft-launcher-lib.readthedocs.io/en/stable/tutorial/microsoft_login.html#let-the-user-log-in) library.

1. Sign in to [Azure Portal](https://portal.azure.com/).
2. Go to [Azure Active Directory](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview).
3. Click on the `App Registrations` tab on the left panel.
4. Click on the `New registration` button.
5. Fill the form with the following values:
    - Name: `YOUR_APP_NAME`
    - Supported account types: `Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts`
    - Redirect URI Type: `Public client/native (mobile & desktop)`, Value: `https://127.0.0.1/auth-response` (If you get `KeyError: 'access_token'` in the end, you can try to change the type to `Web`, see [FAQ](https://github.com/MineDojo/Voyager/blob/main/FAQ.md) for more information)
6. Click on the `Register` button.
7. The `Application (client) ID` will be your `client_id`.
8. [Optional] Go to the `Certificates & Secrets` tab and click on the `New client secret` button. Fill the description by yourself. After you click `Add`, you will see your value, this will be your `secret_value`.
9. Go to your Minecraft install location `YOUR_MINECRAFT_GAME_LOCATION/versions`, and check all the versions you have. All the folder names are your valid `version` value. 

After these steps, you will finally get your azure_login information:
```python
azure_login = {
    "client_id": "CLIENT_ID FROM STEP 7",
    "redirect_url": "https://127.0.0.1/auth-response",
    "secret_value": "[OPTIONAL] SECRET_KEY FROM STEP 8",
    "version": "MINECRAFT VERSION YOU WANT TO USE",
}
```
**Voyager use `fabric-loader-0.14.18-1.19` version to run all the experiments.** You may not have this version currently, you can move on to the [Fabric Mods Install](fabric_mods_install.md#fabric-mods-install) section and follow the instructions there to install the fabric version of the game.

## Option 2: Minecraft Official Launcher

After you install official Minecraft, you should have a Minecraft official launcher, open it, and follow the instructions here:
1. Select the version you want to play and start the game.
2. Select `Singleplayer` and create a new world.
3. Set Game Mode to `Creative` and Difficulty to `Peaceful`.
4. After the world is created, press `Esc` and select `Open to LAN`.
5. Select `Allow cheats: ON` and press `Start LAN World`.
6. You will see a port number in the chat log, that is your `mc-port`, use this number to instantiate Voyager later.



================================================
FILE: requirements.txt
================================================
tqdm
langchain
javascript
setuptools
openai
chardet
cchardet
chromadb==0.3.29
tiktoken
requests
setuptools
gymnasium
psutil
minecraft_launcher_lib


================================================
FILE: setup.py
================================================
import os
import pathlib
import pkg_resources
from setuptools import setup, find_packages


PKG_NAME = "voyager"
VERSION = "0.1"
EXTRAS = {}


def _read_file(fname):
    # this_dir = os.path.abspath(os.path.dirname(__file__))
    # with open(os.path.join(this_dir, fname)) as f:
    with pathlib.Path(fname).open(encoding="utf-8") as fp:
        return fp.read()


def _read_install_requires():
    with pathlib.Path("requirements.txt").open() as fp:
        return [
            str(requirement) for requirement in pkg_resources.parse_requirements(fp)
        ]


def _fill_extras(extras):
    if extras:
        extras["all"] = list(set([item for group in extras.values() for item in group]))
    return extras


setup(
    name=PKG_NAME,
    version=VERSION,
    author=f"MineDojo Team",
    url="https://github.com/MineDojo/Voyager",
    description="research project",
    long_description=_read_file("README.md"),
    long_description_content_type="text/markdown",
    keywords=[
        "Open-Ended Learning",
        "Lifelong Learning",
        "Embodied Agents",
        "Large Language Models",
    ],
    license="MIT License",
    packages=find_packages(include=f"{PKG_NAME}.*"),
    include_package_data=True,
    zip_safe=False,
    install_requires=_read_install_requires(),
    extras_require=_fill_extras(EXTRAS),
    python_requires=">=3.9",
    classifiers=[
        "Development Status :: 5 - Production/Stable",
        "Topic :: Scientific/Engineering :: Artificial Intelligence",
        "Environment :: Console",
        "Programming Language :: Python :: 3.9",
    ],
)


================================================
FILE: skill_library/README.md
================================================
# Learned Skill Libraries

## Ours

* [skill_library/trial1](trial1)
* [skill_library/trial2](trial2)
* [skill_library/trial3](trial3)

## Community Contributions

* [daswer123/Voyager_checkpoint](https://github.com/daswer123/Voyager_checkpoint)
* [swen128/Voyager_checkpoint](https://github.com/swen128/Voyager_checkpoint)
* [DeveloperHarris/voyager_checkpoint](https://github.com/DeveloperHarris/voyager_checkpoint)

### How to resume from a community contribution
First, you need to clone or download their repo. Then, the resume is the same as using ours skill libraries. Just set `skill_library_dir=COMMUNITY_CKPT_DIR` where `COMMUNITY_CKPT_DIR` is the ckpt dir inside the folder you just downloaded.

## How to Contribute

After you run the learning process, you will see a checkpoint directory like:
```
.
├── action
│   └── chest_memory.json
├── curriculum
│   ├── completed_tasks.json
│   ├── failed_tasks.json
│   ├── qa_cache.json
│   └── vectordb
├── events
└── skill
    ├── code
    │   ├── catchThreeFishWithCheck.js
    │   ├── collectBamboo.js
    │   ├── ...
    ├── description
    │   ├── catchThreeFishWithCheck.txt
    │   ├── collectBamboo.txt
    │   └── ...
    ├── skills.json
    └── vectordb
```

Only `YOUR_CKPT_DIR/skill` is a learned skill library, which you can share with others. Create a pull request and add your skill library link to this page.


================================================
FILE: skill_library/trial1/skill/code/collectBamboo.js
================================================
async function collectBamboo(bot) {
  // Equip the iron sword
  const ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);
  await bot.equip(ironSword, "hand");

  // Find bamboo plants using the exploreUntil function
  const bambooPlants = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const bambooPlants = bot.findBlocks({
      matching: block => block.name === "bamboo",
      maxDistance: 32,
      count: 10
    });
    return bambooPlants.length >= 10 ? bambooPlants : null;
  });
  if (!bambooPlants) {
    bot.chat("Could not find enough bamboo plants.");
    return;
  }

  // Break 10 bamboo plants using the iron sword
  for (const bambooPlant of bambooPlants) {
    const block = bot.blockAt(bambooPlant);
    await bot.dig(block);
  }
  bot.chat("Broke 10 bamboo plants.");

  // Collect the dropped bamboo items
  for (const bambooPlant of bambooPlants) {
    await bot.pathfinder.goto(new GoalBlock(bambooPlant.x, bambooPlant.y, bambooPlant.z));
  }
  bot.chat("Collected 10 bamboo.");
}

================================================
FILE: skill_library/trial1/skill/code/collectFiveCactusBlocks.js
================================================
async function collectFiveCactusBlocks(bot) {
  // Equip the iron pickaxe
  const ironPickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.iron_pickaxe.id);
  await bot.equip(ironPickaxe, "hand");

  // Find 5 cactus blocks using the exploreUntil function
  const cactusBlocks = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const cactusBlocks = bot.findBlocks({
      matching: block => block.name === "cactus",
      maxDistance: 32,
      count: 5
    });
    return cactusBlocks.length >= 5 ? cactusBlocks : null;
  });
  if (!cactusBlocks) {
    bot.chat("Could not find enough cactus blocks.");
    return;
  }

  // Mine the 5 cactus blocks using the mineBlock function
  await mineBlock(bot, "cactus", 5);
  bot.chat("5 cactus blocks mined.");

  // Collect the dropped cactus items
  for (const cactusBlock of cactusBlocks) {
    await bot.pathfinder.goto(new GoalBlock(cactusBlock.x, cactusBlock.y, cactusBlock.z));
  }
  bot.chat("Collected 5 cactus blocks.");
}

================================================
FILE: skill_library/trial1/skill/code/cookPorkchops.js
================================================
async function cookPorkchops(bot) {
  // Check if there is a furnace in the inventory
  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);

  // If not, craft a furnace using the available cobblestone
  if (!furnaceItem) {
    await craftFurnace(bot);
  }

  // Place the furnace near the bot
  const furnacePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "furnace", furnacePosition);

  // Smelt 2 porkchops using the available coal as fuel
  await smeltItem(bot, "porkchop", "coal", 2);
  bot.chat("2 porkchops cooked.");
}

================================================
FILE: skill_library/trial1/skill/code/cookSevenMutton.js
================================================
async function cookSevenMutton(bot) {
  // Check if there is a furnace in the inventory
  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);

  // If not, craft a furnace using the available cobblestone
  if (!furnaceItem) {
    await craftFurnace(bot);
  }

  // Find a suitable position to place the furnace
  const furnacePosition = await findSuitablePosition(bot);
  if (!furnacePosition) {
    bot.chat("Could not find a suitable position to place the furnace.");
    return;
  }

  // Place the furnace at the suitable position
  await placeItem(bot, "furnace", furnacePosition);

  // Smelt 7 raw mutton using the available coal as fuel
  await smeltItem(bot, "mutton", "coal", 7);
  bot.chat("7 mutton cooked.");
}

================================================
FILE: skill_library/trial1/skill/code/craftAcaciaPlanksAndSticks.js
================================================
async function craftAcaciaPlanksAndSticks(bot) {
  // Check if there are enough acacia logs in the inventory
  const acaciaLogsCount = bot.inventory.count(mcData.itemsByName.acacia_log.id);

  // If not, mine more acacia logs
  if (acaciaLogsCount < 5) {
    await mineBlock(bot, "acacia_log", 5 - acaciaLogsCount);
    bot.chat("Mined acacia logs.");
  }

  // Craft 20 acacia planks from acacia logs
  await craftItem(bot, "acacia_planks", 5);
  bot.chat("Crafted 20 acacia planks.");

  // Check if there are enough acacia planks in the inventory to craft 10 sticks
  const acaciaPlanksCount = bot.inventory.count(mcData.itemsByName.acacia_planks.id);

  // If not, mine more acacia logs and craft more acacia planks
  if (acaciaPlanksCount < 5) {
    await mineBlock(bot, "acacia_log", 5 - acaciaLogsCount);
    bot.chat("Mined more acacia logs.");
    await craftItem(bot, "acacia_planks", 5 - acaciaPlanksCount);
    bot.chat("Crafted more acacia planks.");
  }

  // Craft 10 sticks from acacia planks
  await craftItem(bot, "stick", 3);
  bot.chat("Crafted 10 sticks.");
}

================================================
FILE: skill_library/trial1/skill/code/craftBucket.js
================================================
async function craftBucket(bot) {
  // Check if there are enough iron ingots in the inventory
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);

  // If not enough iron ingots, mine iron ores and smelt them into iron ingots
  if (ironIngotsCount < 3) {
    await mineBlock(bot, "iron_ore", 3 - ironIngotsCount);
    bot.chat("Collected iron ores.");
    await smeltItem(bot, "iron_ore", "coal", 3 - ironIngotsCount);
    bot.chat("Smelted iron ores into iron ingots.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a bucket using the crafting table
  await craftItem(bot, "bucket", 1);
  bot.chat("Crafted a bucket.");
}

================================================
FILE: skill_library/trial1/skill/code/craftChest.js
================================================
async function craftChest(bot) {
  // Check if there are enough oak planks in the inventory
  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);

  // If not, craft oak planks from oak logs
  if (oakPlanksCount < 8) {
    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);
    const planksToCraft = Math.ceil((8 - oakPlanksCount) / 4);
    if (oakLogsCount >= planksToCraft) {
      await craftItem(bot, "oak_planks", planksToCraft);
      bot.chat("Crafted oak planks.");
    } else {
      bot.chat("Not enough oak logs to craft oak planks.");
      return;
    }
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a chest using the crafting table
  await craftItem(bot, "chest", 1);
  bot.chat("Crafted a chest.");
}

================================================
FILE: skill_library/trial1/skill/code/craftCopperBlock.js
================================================
async function craftCopperBlock(bot) {
  // Check if there are enough copper ingots in the inventory
  const copperIngotsCount = bot.inventory.count(mcData.itemsByName.copper_ingot.id);

  // If not enough copper ingots, mine copper ores and smelt them into copper ingots
  if (copperIngotsCount < 9) {
    await mineBlock(bot, "copper_ore", 9 - copperIngotsCount);
    bot.chat("Collected copper ores.");
    await smeltItem(bot, "copper_ore", "coal", 9 - copperIngotsCount);
    bot.chat("Smelted copper ores into copper ingots.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a copper block using the crafting table
  await craftItem(bot, "copper_block", 1);
  bot.chat("Crafted a copper block.");
}

================================================
FILE: skill_library/trial1/skill/code/craftCraftingTable.js
================================================
async function craftCraftingTable(bot) {
  // Check if there are enough oak planks in the inventory
  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);

  // If not, craft oak planks from oak logs
  if (oakPlanksCount < 4) {
    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);
    const planksToCraft = Math.ceil((4 - oakPlanksCount) / 4);
    if (oakLogsCount >= planksToCraft) {
      await craftItem(bot, "oak_planks", planksToCraft);
      bot.chat("Crafted oak planks.");
    } else {
      bot.chat("Not enough oak logs to craft oak planks.");
      return;
    }
  }

  // Craft a crafting table using oak planks
  await craftItem(bot, "crafting_table", 1);
  bot.chat("Crafted a crafting table.");
}

================================================
FILE: skill_library/trial1/skill/code/craftFurnace.js
================================================
async function craftFurnace(bot) {
  // Check if there are enough cobblestones in the inventory
  const cobblestoneCount = bot.inventory.count(mcData.itemsByName.cobblestone.id);

  // If not, mine the required cobblestones
  if (cobblestoneCount < 8) {
    await mineBlock(bot, "stone", 8 - cobblestoneCount);
    bot.chat("Collected cobblestone.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a furnace using the crafting table
  await craftItem(bot, "furnace", 1);
  bot.chat("Crafted a furnace.");
}

================================================
FILE: skill_library/trial1/skill/code/craftIronAxe.js
================================================
async function craftIronAxe(bot) {
  // Check if there are enough iron ingots and sticks in the inventory
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not enough iron ingots or sticks, collect the required items
  if (ironIngotsCount < 3) {
    await mineBlock(bot, "iron_ore", 3 - ironIngotsCount);
    bot.chat("Collected iron ores.");
    await smeltItem(bot, "iron_ore", "coal", 3 - ironIngotsCount);
    bot.chat("Smelted iron ores into iron ingots.");
  }
  if (sticksCount < 2) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft an iron axe using the crafting table
  await craftItem(bot, "iron_axe", 1);
  bot.chat("Crafted an iron axe.");
}

================================================
FILE: skill_library/trial1/skill/code/craftIronChestplate.js
================================================
async function craftIronChestplate(bot) {
  // Check if there are enough iron ingots in the inventory
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);

  // If not enough iron ingots, mine iron ores and smelt them into iron ingots
  if (ironIngotsCount < 8) {
    await mineBlock(bot, "iron_ore", 8 - ironIngotsCount);
    bot.chat("Collected iron ores.");
    await smeltItem(bot, "iron_ore", "coal", 8 - ironIngotsCount);
    bot.chat("Smelted iron ores into iron ingots.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft an iron chestplate using the crafting table
  await craftItem(bot, "iron_chestplate", 1);
  bot.chat("Crafted an iron chestplate.");
}

================================================
FILE: skill_library/trial1/skill/code/craftIronHelmet.js
================================================
async function craftIronHelmet(bot) {
  // Check if there are enough iron ingots in the inventory
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);

  // If not enough iron ingots, mine iron ores and smelt them into iron ingots
  if (ironIngotsCount < 5) {
    await mineBlock(bot, "iron_ore", 5 - ironIngotsCount);
    bot.chat("Collected iron ores.");
    await smeltItem(bot, "iron_ore", "coal", 5 - ironIngotsCount);
    bot.chat("Smelted iron ores into iron ingots.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft an iron helmet using the crafting table
  await craftItem(bot, "iron_helmet", 1);
  bot.chat("Crafted an iron helmet.");
}

================================================
FILE: skill_library/trial1/skill/code/craftIronHelmetV2.js
================================================
async function craftIronHelmet(bot) {
  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft an iron helmet using the crafting table
  await craftItem(bot, "iron_helmet", 1);
  bot.chat("Crafted an iron helmet.");
}

================================================
FILE: skill_library/trial1/skill/code/craftIronLeggingsAndBoots.js
================================================
async function craftIronLeggingsAndBoots(bot) {
  // Check if there are enough iron ingots in the inventory
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);

  // If not enough iron ingots, mine iron ores and smelt them into iron ingots
  if (ironIngotsCount < 11) {
    await mineBlock(bot, "iron_ore", 11 - ironIngotsCount);
    bot.chat("Collected iron ores.");
    await smeltItem(bot, "iron_ore", "coal", 11 - ironIngotsCount);
    bot.chat("Smelted iron ores into iron ingots.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft iron leggings using the crafting table
  await craftItem(bot, "iron_leggings", 1);
  bot.chat("Crafted iron leggings.");

  // Craft iron boots using the crafting table
  await craftItem(bot, "iron_boots", 1);
  bot.chat("Crafted iron boots.");
}

================================================
FILE: skill_library/trial1/skill/code/craftIronPickaxe.js
================================================
async function craftIronPickaxe(bot) {
  // Check if there are enough iron ingots and sticks in the inventory
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not enough iron ingots or sticks, collect the required items
  if (ironIngotsCount < 3) {
    await mineBlock(bot, "iron_ore", 3 - ironIngotsCount);
    bot.chat("Collected iron ores.");
    await smeltItem(bot, "iron_ore", "coal", 3 - ironIngotsCount);
    bot.chat("Smelted iron ores into iron ingots.");
  }
  if (sticksCount < 2) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft an iron pickaxe using the crafting table
  await craftItem(bot, "iron_pickaxe", 1);
  bot.chat("Crafted an iron pickaxe.");
}

================================================
FILE: skill_library/trial1/skill/code/craftIronPickaxeV2.js
================================================
async function craftIronPickaxe(bot) {
  // Check if there are enough iron ingots and sticks in the inventory
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not enough iron ingots or sticks, collect the required items
  if (ironIngotsCount < 3) {
    await mineBlock(bot, "iron_ore", 3 - ironIngotsCount);
    bot.chat("Collected iron ores.");
    await smeltItem(bot, "iron_ore", "coal", 3 - ironIngotsCount);
    bot.chat("Smelted iron ores into iron ingots.");
  }
  if (sticksCount < 2) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft an iron pickaxe using the crafting table
  await craftItem(bot, "iron_pickaxe", 1);
  bot.chat("Crafted an iron pickaxe.");
}

================================================
FILE: skill_library/trial1/skill/code/craftIronShovel.js
================================================
async function craftIronShovel(bot) {
  // Check if there are enough iron ingots and sticks in the inventory
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not enough iron ingots or sticks, collect the required items
  if (ironIngotsCount < 1) {
    await mineBlock(bot, "iron_ore", 1);
    bot.chat("Collected iron ore.");
    await smeltItem(bot, "iron_ore", "coal", 1);
    bot.chat("Smelted iron ore into iron ingot.");
  }
  if (sticksCount < 2) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Find a suitable position to place the crafting table
  const suitablePosition = bot.entity.position.offset(1, 0, 0);
  const block = bot.blockAt(suitablePosition);
  if (block.name === "grass_block" || block.name === "dirt") {
    await bot.dig(block);
  }

  // Place the crafting table at the suitable position
  await placeItem(bot, "crafting_table", suitablePosition);

  // Craft an iron shovel using the crafting table
  await craftItem(bot, "iron_shovel", 1);
  bot.chat("Crafted an iron shovel.");
}

================================================
FILE: skill_library/trial1/skill/code/craftIronSword.js
================================================
async function craftIronSword(bot) {
  // Check if there are enough iron ingots and sticks in the inventory
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not enough iron ingots or sticks, collect the required items
  if (ironIngotsCount < 2) {
    await mineBlock(bot, "iron_ore", 2 - ironIngotsCount);
    bot.chat("Collected iron ores.");
    await smeltItem(bot, "iron_ore", "coal", 2 - ironIngotsCount);
    bot.chat("Smelted iron ores into iron ingots.");
  }
  if (sticksCount < 1) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft an iron sword using the crafting table
  await craftItem(bot, "iron_sword", 1);
  bot.chat("Crafted an iron sword.");
}

================================================
FILE: skill_library/trial1/skill/code/craftLightningRod.js
================================================
async function findSuitablePosition(bot) {
  const offsets = [new Vec3(1, 0, 0), new Vec3(-1, 0, 0), new Vec3(0, 0, 1), new Vec3(0, 0, -1)];
  for (const offset of offsets) {
    const position = bot.entity.position.offset(offset.x, offset.y, offset.z);
    const block = bot.blockAt(position);
    if (block.name === "air") {
      return position;
    }
  }
  return null;
}

async function craftLightningRod(bot) {
  // Find a suitable position to place the crafting table
  const craftingTablePosition = await findSuitablePosition(bot);

  // Place the crafting table at the found position
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Check if there are enough copper ingots in the inventory
  const copperIngotsCount = bot.inventory.count(mcData.itemsByName.copper_ingot.id);

  // If not enough copper ingots, mine copper ores and smelt them into copper ingots
  if (copperIngotsCount < 3) {
    await mineBlock(bot, "copper_ore", 3 - copperIngotsCount);
    bot.chat("Collected copper ores.");
    await smeltItem(bot, "copper_ore", "coal", 3 - copperIngotsCount);
    bot.chat("Smelted copper ores into copper ingots.");
  }

  // Craft a lightning rod using the crafting table
  await craftItem(bot, "lightning_rod", 1);
  bot.chat("Crafted a lightning rod.");
}

================================================
FILE: skill_library/trial1/skill/code/craftOakPlanksAndSticks.js
================================================
async function craftOakPlanksAndSticks(bot) {
  // Check if there are enough oak planks in the inventory
  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);

  // If not, craft oak planks from oak logs
  if (oakPlanksCount < 8) {
    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);
    const planksToCraft = Math.ceil((8 - oakPlanksCount) / 4);
    if (oakLogsCount >= planksToCraft) {
      await craftItem(bot, "oak_planks", planksToCraft);
      bot.chat("Crafted oak planks.");
    } else {
      bot.chat("Not enough oak logs to craft oak planks.");
      return;
    }
  }

  // Check if there are enough sticks in the inventory
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not, craft sticks from oak planks
  if (sticksCount < 4) {
    await craftItem(bot, "stick", 2);
    bot.chat("Crafted sticks.");
  }
}

================================================
FILE: skill_library/trial1/skill/code/craftScaffolding.js
================================================
async function craftScaffolding(bot) {
  // Check if we have a crafting table in the inventory
  const craftingTableCount = bot.inventory.count(mcData.itemsByName.crafting_table.id);

  // If not, craft a crafting table
  if (craftingTableCount === 0) {
    await craftItem(bot, "crafting_table", 1);
    bot.chat("Crafted a crafting table.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft 10 scaffolding using the crafting table
  await craftItem(bot, "scaffolding", 1);
  bot.chat("Crafted 10 scaffolding.");
}

================================================
FILE: skill_library/trial1/skill/code/craftShears.js
================================================
async function craftShears(bot) {
  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a pair of shears using the crafting table
  await craftItem(bot, "shears", 1);
  bot.chat("Crafted a pair of shears.");
}

================================================
FILE: skill_library/trial1/skill/code/craftShieldImproved.js
================================================
async function craftShieldImproved(bot) {
  // Check if there are enough oak planks in the inventory
  let oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);

  // If not, check if there are enough oak logs in the inventory
  if (oakPlanksCount < 6) {
    let oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);
    const planksToCraft = Math.ceil((6 - oakPlanksCount) / 4);

    // If not, explore to find and mine oak logs
    if (oakLogsCount < planksToCraft) {
      await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
        const oak_log = bot.findBlock({
          matching: mcData.blocksByName["oak_log"].id,
          maxDistance: 32
        });
        return oak_log;
      });
      await mineBlock(bot, "oak_log", planksToCraft - oakLogsCount);
      bot.chat("Collected oak logs.");
    }

    // Craft oak planks from oak logs
    await craftItem(bot, "oak_planks", planksToCraft);
    bot.chat("Crafted oak planks.");
    oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);
  }

  // Check if there are enough iron ingots in the inventory
  let ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);

  // If not, explore to find and mine iron ores
  if (ironIngotsCount < 1) {
    await exploreUntil(bot, new Vec3(0, -1, 0), 60, () => {
      const iron_ore = bot.findBlock({
        matching: mcData.blocksByName["iron_ore"].id,
        maxDistance: 32
      });
      return iron_ore;
    });
    await mineBlock(bot, "iron_ore", 1);
    bot.chat("Collected iron ores.");

    // Smelt iron ores into iron ingots
    await smeltItem(bot, "iron_ore", "coal", 1);
    bot.chat("Smelted iron ores into iron ingots.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a shield using the crafting table
  await craftItem(bot, "shield", 1);
  bot.chat("Crafted a shield.");
}

================================================
FILE: skill_library/trial1/skill/code/craftStonePickaxe.js
================================================
async function craftStonePickaxe(bot) {
  // Check if there are enough cobblestone and sticks in the inventory
  const cobblestoneCount = bot.inventory.count(mcData.itemsByName.cobblestone.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not enough cobblestone or sticks, collect the required items
  if (cobblestoneCount < 3) {
    await mineBlock(bot, "stone", 3 - cobblestoneCount);
    bot.chat("Collected cobblestone.");
  }
  if (sticksCount < 2) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a stone pickaxe using the crafting table
  await craftItem(bot, "stone_pickaxe", 1);
  bot.chat("Crafted a stone pickaxe.");
}

================================================
FILE: skill_library/trial1/skill/code/craftStoneShovel.js
================================================
async function craftStoneShovel(bot) {
  // Check if there are enough cobblestone and sticks in the inventory
  const cobblestoneCount = bot.inventory.count(mcData.itemsByName.cobblestone.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not enough cobblestone, mine cobblestone
  if (cobblestoneCount < 1) {
    await mineBlock(bot, "stone", 1);
    bot.chat("Collected cobblestone.");
  }

  // If not enough sticks, craft sticks
  if (sticksCount < 2) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a stone shovel using the crafting table
  await craftItem(bot, "stone_shovel", 1);
  bot.chat("Crafted a stone shovel.");
}

================================================
FILE: skill_library/trial1/skill/code/craftWhiteBed.js
================================================
async function craftWhiteBed(bot) {
  // Check if there are enough oak planks in the inventory
  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);

  // If not, craft oak planks from oak logs
  if (oakPlanksCount < 3) {
    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);
    const planksToCraft = Math.ceil((3 - oakPlanksCount) / 4);
    if (oakLogsCount >= planksToCraft) {
      await craftItem(bot, "oak_planks", planksToCraft);
      bot.chat("Crafted oak planks.");
    } else {
      bot.chat("Not enough oak logs to craft oak planks.");
      return;
    }
  }

  // Check if there are enough white wool in the inventory
  const whiteWoolCount = bot.inventory.count(mcData.itemsByName.white_wool.id);
  if (whiteWoolCount < 3) {
    bot.chat("Not enough white wool to craft a bed.");
    return;
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a white bed using the crafting table
  await craftItem(bot, "white_bed", 1);
  bot.chat("Crafted a white bed.");
}

================================================
FILE: skill_library/trial1/skill/code/craftWoodenHoe.js
================================================
async function craftWoodenHoe(bot) {
  // Check if there are enough oak planks in the inventory
  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);

  // If not, craft oak planks from oak logs
  if (oakPlanksCount < 2) {
    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);
    const planksToCraft = Math.ceil((2 - oakPlanksCount) / 4);
    if (oakLogsCount >= planksToCraft) {
      await craftItem(bot, "oak_planks", planksToCraft);
      bot.chat("Crafted oak planks.");
    } else {
      bot.chat("Not enough oak logs to craft oak planks.");
      return;
    }
  }

  // Check if there are enough sticks in the inventory
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not, craft sticks from oak planks
  if (sticksCount < 2) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a wooden hoe using the crafting table
  await craftItem(bot, "wooden_hoe", 1);
  bot.chat("Crafted a wooden hoe.");
}

================================================
FILE: skill_library/trial1/skill/code/craftWoodenPickaxe.js
================================================
async function craftWoodenPickaxe(bot) {
  // check if crafting table is in the inventory
  const craftingTableCount = bot.inventory.count(
    mcData.itemsByName.crafting_table.id
  );

  // If not, craft a crafting table
  if (craftingTableCount === 0) {
    await craftCraftingTable(bot);
  }

  // Check if there are enough oak planks in the inventory
  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);

  // If not, craft oak planks from oak logs
  if (oakPlanksCount < 6) {
    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);
    const planksToCraft = Math.ceil((6 - oakPlanksCount) / 4);
    if (oakLogsCount < planksToCraft) {
      await mineBlock(bot, "oak_log", planksToCraft - oakLogsCount);
    }
    await craftItem(bot, "oak_planks", planksToCraft);
    bot.chat("Crafted oak planks.");
  }

  // Check if there are enough sticks in the inventory
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not, craft sticks from oak planks
  if (sticksCount < 2) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a wooden pickaxe using the crafting table
  await craftItem(bot, "wooden_pickaxe", 1);
  bot.chat("Crafted a wooden pickaxe.");
}


================================================
FILE: skill_library/trial1/skill/code/craftWoodenSword.js
================================================
async function craftWoodenSword(bot) {
  // Check if there are enough oak planks in the inventory
  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);

  // If not, craft oak planks from oak logs
  if (oakPlanksCount < 2) {
    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);
    const planksToCraft = Math.ceil((2 - oakPlanksCount) / 4);
    if (oakLogsCount >= planksToCraft) {
      await craftItem(bot, "oak_planks", planksToCraft);
      bot.chat("Crafted oak planks.");
    } else {
      bot.chat("Not enough oak logs to craft oak planks.");
      return;
    }
  }

  // Check if there are enough sticks in the inventory
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);

  // If not, craft sticks from oak planks
  if (sticksCount < 1) {
    await craftItem(bot, "stick", 1);
    bot.chat("Crafted sticks.");
  }

  // Place the crafting table near the bot
  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "crafting_table", craftingTablePosition);

  // Craft a wooden sword using the crafting table
  await craftItem(bot, "wooden_sword", 1);
  bot.chat("Crafted a wooden sword.");
}

================================================
FILE: skill_library/trial1/skill/code/eatCookedPorkchop.js
================================================
async function eatCookedPorkchop(bot) {
  // Equip the cooked porkchop in the bot's hand
  const cookedPorkchop = bot.inventory.findInventoryItem(mcData.itemsByName.cooked_porkchop.id);
  await bot.equip(cookedPorkchop, "hand");

  // Consume the cooked porkchop
  await bot.consume();

  // Send a chat message to indicate the task is completed
  bot.chat("Ate 1 cooked porkchop.");
}

================================================
FILE: skill_library/trial1/skill/code/eatTwoCookedMutton.js
================================================
async function eatTwoCookedMutton(bot) {
  // Check if there are 2 cooked mutton in the inventory
  const cookedMutton = bot.inventory.findInventoryItem(mcData.itemsByName.cooked_mutton.id);
  if (!cookedMutton || cookedMutton.count < 2) {
    bot.chat("Not enough cooked mutton in the inventory.");
    return;
  }

  // Equip the cooked mutton in the bot's hand
  await bot.equip(cookedMutton, "hand");

  // Consume the cooked mutton twice
  await bot.consume();
  await bot.consume();

  // Send a chat message to indicate the task is completed
  bot.chat("Ate 2 cooked mutton.");
}

================================================
FILE: skill_library/trial1/skill/code/equipIronArmor.js
================================================
async function equipIronArmor(bot) {
  // Find the iron_leggings, iron_boots, and iron_helmet in the inventory
  const ironLeggings = bot.inventory.findInventoryItem(mcData.itemsByName.iron_leggings.id);
  const ironBoots = bot.inventory.findInventoryItem(mcData.itemsByName.iron_boots.id);
  const ironHelmet = bot.inventory.findInventoryItem(mcData.itemsByName.iron_helmet.id);

  // Equip the iron_leggings, iron_boots, and iron_helmet in the appropriate slots (legs, feet, and head)
  if (ironLeggings) {
    await bot.equip(ironLeggings, "legs");
    bot.chat("Equipped iron leggings.");
  } else {
    bot.chat("Iron leggings not found in inventory.");
  }
  if (ironBoots) {
    await bot.equip(ironBoots, "feet");
    bot.chat("Equipped iron boots.");
  } else {
    bot.chat("Iron boots not found in inventory.");
  }
  if (ironHelmet) {
    await bot.equip(ironHelmet, "head");
    bot.chat("Equipped iron helmet.");
  } else {
    bot.chat("Iron helmet not found in inventory.");
  }
}

================================================
FILE: skill_library/trial1/skill/code/equipIronChestplate.js
================================================
async function equipIronChestplate(bot) {
  // Find the iron chestplate in the inventory
  const ironChestplate = bot.inventory.findInventoryItem(mcData.itemsByName.iron_chestplate.id);

  // Equip the iron chestplate
  if (ironChestplate) {
    await bot.equip(ironChestplate, "torso");
    bot.chat("Equipped iron chestplate.");
  } else {
    bot.chat("Iron chestplate not found in inventory.");
  }
}

================================================
FILE: skill_library/trial1/skill/code/equipIronSword.js
================================================
async function equipIronSword(bot) {
  // Find the iron sword in the inventory
  let ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);

  // If the iron sword is not found in the inventory, check the chest
  if (!ironSword) {
    const chestPosition = new Vec3(89, 41, 206);
    const itemsToGet = {
      "iron_sword": 1
    };
    await getItemFromChest(bot, chestPosition, itemsToGet);
    ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);
  }

  // Equip the iron sword
  if (ironSword) {
    await bot.equip(ironSword, "hand");
    bot.chat("Equipped iron sword.");
  } else {
    bot.chat("Iron sword not found in inventory or chest.");
  }
}

================================================
FILE: skill_library/trial1/skill/code/fillBucketWithWater.js
================================================
async function fillBucketWithWater(bot) {
  // Find a water block nearby
  const waterBlock = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const water = bot.findBlock({
      matching: mcData.blocksByName.water.id,
      maxDistance: 32,
    });
    return water;
  });
  if (!waterBlock) {
    bot.chat("Could not find water.");
    return;
  }

  const adjacentBlock = waterBlock.position.offset(0, 1, 0);
  // Go to the water block
  await bot.pathfinder.goto(
    new GoalGetToBlock(adjacentBlock.x, adjacentBlock.y, adjacentBlock.z)
  );

  // Equip the bucket
  const bucket = bot.inventory.findInventoryItem(mcData.itemsByName.bucket.id);
  await bot.equip(bucket, "hand");

  // Look at the water block
  await bot.lookAt(waterBlock.position);

  // Activate the bucket to collect water
  await bot.activateItem();
  bot.chat("Filled the bucket with water.");
}


================================================
FILE: skill_library/trial1/skill/code/killFourSheep.js
================================================
async function killFourSheep(bot) {
  // Equip the wooden sword
  const woodenSword = bot.inventory.findInventoryItem(mcData.itemsByName.wooden_sword.id);
  await bot.equip(woodenSword, "hand");

  // Find and kill the first three sheep
  for (let i = 1; i <= 3; i++) {
    await killMob(bot, "sheep", 300);
    bot.chat(`Killed sheep ${i}.`);
  }

  // Find and kill the fourth sheep
  await killMob(bot, "sheep", 300);
  bot.chat("Killed the fourth sheep.");

  // Collect the dropped items from the killed sheep
  const sheepDrops = ["wool", "raw_mutton"];
  for (const drop of sheepDrops) {
    const droppedItem = bot.findBlock({
      matching: block => block.name === drop,
      maxDistance: 32
    });
    if (droppedItem) {
      await bot.pathfinder.goto(new GoalBlock(droppedItem.position.x, droppedItem.position.y, droppedItem.position.z));
    }
  }
  bot.chat("Collected dropped items from the killed sheep.");
}

================================================
FILE: skill_library/trial1/skill/code/killOneEnderman.js
================================================
async function killOneEnderman(bot) {
  // Equip the iron sword
  const ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);
  await bot.equip(ironSword, "hand");

  // Find the nearest enderman
  const enderman = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const enderman = bot.nearestEntity(entity => {
      return entity.name === "enderman" && entity.position.distanceTo(bot.entity.position) < 32;
    });
    return enderman;
  });
  if (!enderman) {
    bot.chat("Could not find an enderman.");
    return;
  }

  // Kill the enderman using the iron sword
  await killMob(bot, "enderman", 300);
  bot.chat("Killed an enderman.");

  // Collect the dropped items
  await bot.pathfinder.goto(new GoalBlock(enderman.position.x, enderman.position.y, enderman.position.z));
  bot.chat("Collected dropped items.");
}

================================================
FILE: skill_library/trial1/skill/code/killOnePig.js
================================================
async function killOnePig(bot) {
  // Equip the wooden sword
  const woodenSword = bot.inventory.findInventoryItem(mcData.itemsByName.wooden_sword.id);
  await bot.equip(woodenSword, "hand");

  // Find the nearest pig
  const pig = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const pig = bot.nearestEntity(entity => {
      return entity.name === "pig" && entity.position.distanceTo(bot.entity.position) < 32;
    });
    return pig;
  });
  if (!pig) {
    bot.chat("Could not find a pig.");
    return;
  }

  // Kill the pig using the wooden sword
  await killMob(bot, "pig", 300);
  bot.chat("Killed a pig.");

  // Collect the dropped items
  await bot.pathfinder.goto(new GoalBlock(pig.position.x, pig.position.y, pig.position.z));
  bot.chat("Collected dropped items.");
}

================================================
FILE: skill_library/trial1/skill/code/killOneSpider.js
================================================
async function killOneSpider(bot) {
  // Equip the iron sword
  const ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);
  await bot.equip(ironSword, "hand");

  // Find the nearest spider
  const spider = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const spider = bot.nearestEntity(entity => {
      return entity.name === "spider" && entity.position.distanceTo(bot.entity.position) < 32;
    });
    return spider;
  });
  if (!spider) {
    bot.chat("Could not find a spider.");
    return;
  }

  // Kill the spider using the iron sword
  await killMob(bot, "spider", 300);
  bot.chat("Killed a spider.");

  // Collect the dropped items
  await bot.pathfinder.goto(new GoalBlock(spider.position.x, spider.position.y, spider.position.z));
  bot.chat("Collected dropped items.");
}

================================================
FILE: skill_library/trial1/skill/code/killOneZombie.js
================================================
async function killOneZombie(bot) {
  // Equip the iron sword
  const ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);
  await bot.equip(ironSword, "hand");

  // Find the nearest zombie
  const zombie = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const zombie = bot.nearestEntity(entity => {
      return entity.name === "zombie" && entity.position.distanceTo(bot.entity.position) < 32;
    });
    return zombie;
  });
  if (!zombie) {
    bot.chat("Could not find a zombie.");
    return;
  }

  // Kill the zombie using the iron sword
  await killMob(bot, "zombie", 300);
  bot.chat("Killed a zombie.");

  // Collect the dropped items
  await bot.pathfinder.goto(new GoalBlock(zombie.position.x, zombie.position.y, zombie.position.z));
  bot.chat("Collected dropped items.");
}

================================================
FILE: skill_library/trial1/skill/code/killTwoPigs.js
================================================
async function killTwoPigs(bot) {
  // Equip the wooden sword
  const woodenSword = bot.inventory.findInventoryItem(mcData.itemsByName.wooden_sword.id);
  await bot.equip(woodenSword, "hand");

  // Find and kill the first pig
  await killMob(bot, "pig", 300);
  bot.chat("Killed the first pig.");

  // Find and kill the second pig
  await killMob(bot, "pig", 300);
  bot.chat("Killed the second pig.");

  // Collect the dropped items from the killed pigs
  const pigDrops = ["raw_porkchop"];
  for (const drop of pigDrops) {
    const droppedItem = bot.findBlock({
      matching: block => block.name === drop,
      maxDistance: 32
    });
    if (droppedItem) {
      await bot.pathfinder.goto(new GoalBlock(droppedItem.position.x, droppedItem.position.y, droppedItem.position.z));
    }
  }
  bot.chat("Collected dropped items from the killed pigs.");
}

================================================
FILE: skill_library/trial1/skill/code/mineFiveCoalOres.js
================================================
async function mineFiveCoalOres(bot) {
  // Equip the wooden pickaxe
  const woodenPickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.wooden_pickaxe.id);
  await bot.equip(woodenPickaxe, "hand");

  // Find 5 coal_ore blocks
  const coalOres = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const coalOres = bot.findBlocks({
      matching: block => block.name === "coal_ore",
      maxDistance: 32,
      count: 5
    });
    return coalOres.length >= 5 ? coalOres : null;
  });
  if (!coalOres) {
    bot.chat("Could not find enough coal ores.");
    return;
  }

  // Mine the 5 coal_ore blocks
  await mineBlock(bot, "coal_ore", 5);
  bot.chat("5 coal ores mined.");
}

================================================
FILE: skill_library/trial1/skill/code/mineFiveCoalOresV2.js
================================================
async function mineFiveCoalOres(bot) {
  // Equip the stone pickaxe
  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_pickaxe.id);
  await bot.equip(stonePickaxe, "hand");

  // Find 5 coal_ore blocks
  const coalOres = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const coalOres = bot.findBlocks({
      matching: block => block.name === "coal_ore",
      maxDistance: 32,
      count: 5
    });
    return coalOres.length >= 5 ? coalOres : null;
  });
  if (!coalOres) {
    bot.chat("Could not find enough coal ores.");
    return;
  }

  // Mine the 5 coal_ore blocks
  await mineBlock(bot, "coal_ore", 5);
  bot.chat("5 coal ores mined.");
}

================================================
FILE: skill_library/trial1/skill/code/mineFiveCopperOres.js
================================================
async function mineFiveCopperOres(bot) {
  // Equip the stone pickaxe
  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_pickaxe.id);
  await bot.equip(stonePickaxe, "hand");

  // Find 5 copper_ore blocks
  const copperOres = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const copperOres = bot.findBlocks({
      matching: block => block.name === "copper_ore",
      maxDistance: 32,
      count: 5
    });
    return copperOres.length >= 5 ? copperOres : null;
  });
  if (!copperOres) {
    bot.chat("Could not find enough copper ores.");
    return;
  }

  // Mine the 5 copper_ore blocks
  await mineBlock(bot, "copper_ore", 5);
  bot.chat("5 copper ores mined.");
}

================================================
FILE: skill_library/trial1/skill/code/mineFiveCopperOresV2.js
================================================
async function mineFiveCopperOres(bot) {
  // Check if the bot already has 5 or more copper ores in the inventory
  const copperOres = bot.inventory.items().filter(item => item.name === "copper_ore");
  const totalCopperOres = copperOres.reduce((total, item) => total + item.count, 0);
  if (totalCopperOres >= 5) {
    bot.chat("Task already completed. There are already " + totalCopperOres + " copper ores in the inventory.");
  } else {
    bot.chat("Need to mine " + (5 - totalCopperOres) + " more copper ores.");
    // You can call the mineFiveCopperOres function from the previous response here
  }
}

================================================
FILE: skill_library/trial1/skill/code/mineFiveIronOres.js
================================================
async function mineFiveIronOres(bot) {
  // Equip the stone pickaxe
  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_pickaxe.id);
  await bot.equip(stonePickaxe, "hand");

  // Find 5 iron_ore blocks
  const ironOres = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const ironOres = bot.findBlocks({
      matching: block => block.name === "iron_ore",
      maxDistance: 32,
      count: 5
    });
    return ironOres.length >= 5 ? ironOres : null;
  });
  if (!ironOres) {
    bot.chat("Could not find enough iron ores.");
    return;
  }

  // Mine the 5 iron_ore blocks
  await mineBlock(bot, "iron_ore", 5);
  bot.chat("5 iron ores mined.");
}

================================================
FILE: skill_library/trial1/skill/code/mineFiveIronOresV2.js
================================================
async function mineFiveIronOres(bot) {
  // Equip the stone pickaxe
  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_pickaxe.id);
  await bot.equip(stonePickaxe, "hand");

  // Find 5 iron_ore blocks
  const ironOres = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const ironOres = bot.findBlocks({
      matching: block => block.name === "iron_ore",
      maxDistance: 32,
      count: 5
    });
    return ironOres.length >= 5 ? ironOres : null;
  });
  if (!ironOres) {
    bot.chat("Could not find enough iron ores.");
    return;
  }

  // Mine the 5 iron_ore blocks
  await mineBlock(bot, "iron_ore", 5);
  bot.chat("5 iron ores mined.");
}

================================================
FILE: skill_library/trial1/skill/code/mineFiveLapisLazuliOres.js
================================================
async function mineFiveLapisLazuliOres(bot) {
  // Equip the iron pickaxe
  const ironPickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.iron_pickaxe.id);
  await bot.equip(ironPickaxe, "hand");

  // Find 5 lapis_lazuli_ore blocks
  const lapisOres = await exploreUntil(bot, new Vec3(1, -1, 1), 60, () => {
    const lapisOres = bot.findBlocks({
      matching: block => block.name === "lapis_ore",
      maxDistance: 32,
      count: 5
    });
    return lapisOres.length >= 5 ? lapisOres : null;
  });
  if (!lapisOres) {
    bot.chat("Could not find enough lapis lazuli ores.");
    return;
  }

  // Mine the 5 lapis_lazuli_ore blocks
  await mineBlock(bot, "lapis_ore", 5);
  bot.chat("5 lapis lazuli ores mined.");
}

================================================
FILE: skill_library/trial1/skill/code/mineTenCobblestone.js
================================================
async function mineTenCobblestone(bot) {
  // Check if the bot has a pickaxe in the inventory
  const pickaxe = bot.inventory.items().find(item => item.name.endsWith("_pickaxe"));

  // If not, craft a wooden pickaxe using the available resources in the inventory
  if (!pickaxe) {
    await craftWoodenPickaxe(bot);
  } else {
    // Equip the pickaxe
    await bot.equip(pickaxe, "hand");
  }

  // Use the exploreUntil function to find cobblestone blocks
  const cobblestoneBlocks = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const cobblestoneBlocks = bot.findBlocks({
      matching: block => block.name === "stone",
      maxDistance: 32,
      count: 10
    });
    return cobblestoneBlocks.length >= 10 ? cobblestoneBlocks : null;
  });
  if (!cobblestoneBlocks) {
    bot.chat("Could not find enough cobblestone.");
    return;
  }

  // Mine 10 cobblestone blocks using the mineBlock function
  await mineBlock(bot, "stone", 10);
  bot.chat("10 cobblestone mined.");
}

================================================
FILE: skill_library/trial1/skill/code/mineThreeMoreOakLogs.js
================================================
async function mineThreeMoreOakLogs(bot) {
  // Check the initial inventory for oak logs
  const initialOakLogs = bot.inventory.count(mcData.itemsByName.oak_log.id);

  // Find 3 oak_log blocks
  const oakLogs = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    const oakLogs = bot.findBlocks({
      matching: block => block.name === "oak_log",
      maxDistance: 32,
      count: 3
    });
    return oakLogs.length >= 3 ? oakLogs : null;
  });
  if (!oakLogs) {
    bot.chat("Could not find enough oak logs.");
    return;
  }

  // Mine the oak_log blocks
  await mineBlock(bot, "oak_log", 3);
  bot.chat("3 oak logs mined.");

  // Compare the final inventory with the initial inventory
  const finalOakLogs = bot.inventory.count(mcData.itemsByName.oak_log.id);
  if (finalOakLogs - initialOakLogs === 3) {
    bot.chat("Successfully mined 3 more oak logs.");
  } else {
    bot.chat("Failed to mine 3 more oak logs.");
  }
}

================================================
FILE: skill_library/trial1/skill/code/mineWoodLog.js
================================================
async function mineWoodLog(bot) {
  const woodLogNames = ["oak_log", "birch_log", "spruce_log", "jungle_log", "acacia_log", "dark_oak_log", "mangrove_log"];

  // Find a wood log block
  const woodLogBlock = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
    return bot.findBlock({
      matching: block => woodLogNames.includes(block.name),
      maxDistance: 32
    });
  });
  if (!woodLogBlock) {
    bot.chat("Could not find a wood log.");
    return;
  }

  // Mine the wood log block
  await mineBlock(bot, woodLogBlock.name, 1);
  bot.chat("Wood log mined.");
}

================================================
FILE: skill_library/trial1/skill/code/obtainOneMoreAcaciaLog.js
================================================
async function obtainOneMoreAcaciaLog(bot) {
  // Check the initial inventory for acacia logs
  const initialAcaciaLogs = bot.inventory.count(mcData.itemsByName.acacia_log.id);

  // If the number of acacia logs is less than 5, find and mine one more acacia log
  if (initialAcaciaLogs < 5) {
    const acaciaLog = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
      return bot.findBlock({
        matching: block => block.name === "acacia_log",
        maxDistance: 32
      });
    });
    if (!acaciaLog) {
      bot.chat("Could not find an acacia log.");
      return;
    }
    await mineBlock(bot, "acacia_log", 1);
    bot.chat("1 more acacia log obtained.");
  }

  // Check the final number of acacia logs in the inventory
  const finalAcaciaLogs = bot.inventory.count(mcData.itemsByName.acacia_log.id);
  if (finalAcaciaLogs >= 5) {
    bot.chat("Successfully obtained 5 acacia logs.");
  } else {
    bot.chat("Failed to obtain 5 acacia logs.");
  }
}

================================================
FILE: skill_library/trial1/skill/code/smeltCactusIntoGreenDye.js
================================================
async function smeltCactusIntoGreenDye(bot) {
  // Check if there is a furnace in the inventory
  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);

  // If not, craft a furnace using the available cobblestone
  if (!furnaceItem) {
    await craftFurnace(bot);
  }

  // Find a suitable position to place the furnace
  const furnacePosition = await findSuitablePosition(bot);
  if (!furnacePosition) {
    bot.chat("Could not find a suitable position to place the furnace.");
    return;
  }

  // Place the furnace at the suitable position
  await placeItem(bot, "furnace", furnacePosition);

  // Smelt 5 cactus using the available coal as fuel
  await smeltItem(bot, "cactus", "coal", 5);
  bot.chat("5 cactus smelted into green dye.");
}

================================================
FILE: skill_library/trial1/skill/code/smeltFiveRawIron.js
================================================
async function smeltFiveRawIron(bot) {
  // Check if there is a furnace in the inventory
  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);

  // If not, craft a furnace using the available cobblestone
  if (!furnaceItem) {
    await craftFurnace(bot);
  }

  // Place the furnace near the bot
  const furnacePosition = bot.entity.position.offset(1, 0, 0);
  await placeItem(bot, "furnace", furnacePosition);

  // Smelt 5 raw iron using the available coal as fuel
  await smeltItem(bot, "raw_iron", "coal", 5);
  bot.chat("5 raw iron smelted.");
}

================================================
FILE: skill_library/trial1/skill/code/smeltFiveRawIronV2.js
================================================
async function findSuitablePosition(bot) {
  const offsets = [
    new Vec3(1, 0, 0),
    new Vec3(-1, 0, 0),
    new Vec3(0, 0, 1),
    new Vec3(0, 0, -1),
  ];
  for (const offset of offsets) {
    const position = bot.entity.position.offset(offset.x, offset.y, offset.z);
    const block = bot.blockAt(position);
    if (block.name === "air") {
      return position;
    }
  }
  return null;
}

async function smeltFiveRawIron(bot) {
  // Check if there is coal in the inventory
  const coalCount = bot.inventory.count(mcData.itemsByName.coal.id);
  // If not enough coal, mine coal_ore to obtain coal
  if (coalCount < 3) {
    await mineBlock(bot, "coal_ore", 3 - coalCount);
    bot.chat("Collected coal.");
  }
  // Check if there is a furnace in the inventory
  const furnaceItem = bot.inventory.findInventoryItem(
    mcData.itemsByName.furnace.id
  );

  // If not, craft a furnace using the available cobblestone
  if (!furnaceItem) {
    await craftFurnace(bot);
  }

  // Find a suitable position to place the furnace
  const furnacePosition = await findSuitablePosition(bot);
  if (!furnacePosition) {
    bot.chat("Could not find a suitable position to place the furnace.");
    return;
  }

  // Place the furnace at the suitable position
  await placeItem(bot, "furnace", furnacePosition);

  // Smelt 5 raw iron using the available coal as fuel
  await smeltItem(bot, "raw_iron", "coal", 5);
  bot.chat("5 raw iron smelted.");
}


================================================
FILE: skill_library/trial1/skill/code/smeltRawCopper.js
================================================
async function smeltRawCopper(bot) {
  // Check if there is a furnace in the inventory
  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);

  // If not, craft a furnace using the available cobblestone
  if (!furnaceItem) {
    await craftFurnace(bot);
  }

  // Find a suitable position to place the furnace
  const furnacePosition = await findSuitablePosition(bot);
  if (!furnacePosition) {
    bot.chat("Could not find a suitable position to place the furnace.");
    return;
  }

  // Place the furnace at the suitable position
  await placeItem(bot, "furnace", furnacePosition);

  // Smelt 19 raw copper using the available coal as fuel
  await smeltItem(bot, "raw_copper", "coal", 19);
  bot.chat("19 raw copper smelted.");
}

================================================
FILE: skill_library/trial1/skill/description/collectBamboo.txt
================================================
async function collectBamboo(bot) {
    // The function is about collecting 10 bamboo plants. It equips the iron sword and uses the `exploreUntil` function to find 10 bamboo plants within a certain distance. If enough bamboo plants are found, it breaks them using the iron sword and collects the dropped bamboo items by moving to their location. If not enough bamboo plants are found, it returns an error message.
}

================================================
FILE: skill_library/trial1/skill/description/collectFiveCactusBlocks.txt
================================================
async function collectFiveCactusBlocks(bot) {
    // The function is about collecting 5 cactus blocks using an iron pickaxe. First, equip the iron pickaxe in the hand. Next, explore the environment until finding 5 cactus blocks using the `exploreUntil` function. If 5 cactus blocks are not found, return. Otherwise, mine the 5 cactus blocks using the `mineBlock` function. Finally, collect the dropped cactus items by moving to each block's location.
}

================================================
FILE: skill_library/trial1/skill/description/cookPorkchops.txt
================================================
async function cookPorkchops(bot) {
    // The function is about cooking 2 porkchops using a furnace and coal as fuel. First, it checks if there is a furnace in the inventory. If not, it crafts a furnace using cobblestone. Then, it places the furnace near the bot. Finally, it smelts 2 porkchops using coal as fuel and saves the event of cooking porkchops.
}

================================================
FILE: skill_library/trial1/skill/description/cookSevenMutton.txt
================================================
async function cookSevenMutton(bot) {
    // The function is about cooking 7 raw mutton using a furnace and coal as fuel. It checks if there is a furnace in the inventory, and if not, it crafts one. Then it finds a suitable position to place the furnace and places it there. After that, it smelts 7 raw mutton using the available coal as fuel and saves the event of cooking 7 mutton.
}

================================================
FILE: skill_library/trial1/skill/description/craftAcaciaPlanksAndSticks.txt
================================================
async function craftAcaciaPlanksAndSticks(bot) {
    // The function is about crafting 20 acacia planks and 10 sticks. It checks if there are enough acacia logs in the inventory, and if not, it mines more acacia logs. Then it crafts 20 acacia planks from the acacia logs. If there are not enough acacia planks in the inventory to craft 10 sticks, it mines more acacia logs and crafts more acacia planks. Finally, it crafts 10 sticks from the acacia planks.
}

================================================
FILE: skill_library/trial1/skill/description/craftBucket.txt
================================================
async function craftBucket(bot) {
    // The function crafts a bucket using a crafting table. It first checks if there are enough iron ingots in the inventory, and if not, it mines iron ores and smelts them into iron ingots. Then, it places a crafting table near the bot and crafts a bucket using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftChest.txt
================================================
async function craftChest(bot) {
    // The function crafts a chest using a crafting table and oak planks. If there are not enough oak planks in the inventory, it crafts oak planks from oak logs. Once there are enough oak planks, it places a crafting table near the bot and crafts a chest using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftCopperBlock.txt
================================================
async function craftCopperBlock(bot) {
    // The function crafts a copper block using a crafting table. It first checks if there are enough copper ingots in the inventory, and if not, it mines copper ores and smelts them into copper ingots. Then it places a crafting table near the bot and crafts a copper block using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftCraftingTable.txt
================================================
async function craftCraftingTable(bot) {
    // The function crafts a crafting table using oak planks. It first checks if there are enough oak planks in the inventory, and if not, crafts oak planks from oak logs. Then, it crafts a crafting table using the oak planks.
}

================================================
FILE: skill_library/trial1/skill/description/craftFurnace.txt
================================================
async function craftFurnace(bot) {
    // The function crafts a furnace using a crafting table and cobblestones. If there are not enough cobblestones in the inventory, it mines the required amount. Then, it places a crafting table near the bot and crafts a furnace using the crafting table. Finally, it sends a chat message indicating that a furnace has been crafted.
}

================================================
FILE: skill_library/trial1/skill/description/craftIronAxe.txt
================================================
async function craftIronAxe(bot) {
    // The function crafts an iron axe using a crafting table. It checks if there are enough iron ingots and sticks in the inventory, and if not, collects the required items. It then places a crafting table near the bot and crafts an iron axe using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftIronChestplate.txt
================================================
async function craftIronChestplate(bot) {
    // The function crafts an iron chestplate using a crafting table. It first checks if there are enough iron ingots in the inventory, and if not, it mines iron ores and smelts them into iron ingots. Then it places a crafting table near the bot and crafts an iron chestplate using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftIronHelmet.txt
================================================
async function craftIronHelmet(bot) {
    // The function crafts an iron helmet using a crafting table. It first checks if there are enough iron ingots in the inventory, and if not, it mines iron ores and smelts them into iron ingots. Then it places a crafting table near the bot and crafts an iron helmet using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftIronHelmetV2.txt
================================================
async function craftIronHelmet(bot) {
    // The function is about crafting an iron helmet using a crafting table. First, place the crafting table near the bot. Then, craft an iron helmet using the crafting table and save it to the inventory.
}

================================================
FILE: skill_library/trial1/skill/description/craftIronLeggingsAndBoots.txt
================================================
async function craftIronLeggingsAndBoots(bot) {
    // The function crafts iron leggings and boots using a crafting table. If there are not enough iron ingots in the inventory, the bot mines iron ores and smelts them into iron ingots. Then, the bot places a crafting table near itself and crafts iron leggings and boots using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftIronPickaxe.txt
================================================
async function craftIronPickaxe(bot) {
    // The function crafts an iron pickaxe using a crafting table. It checks if there are enough iron ingots and sticks in the inventory, and if not, collects the required items. It then places a crafting table near the bot and crafts an iron pickaxe using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftIronPickaxeV2.txt
================================================
async function craftIronPickaxe(bot) {
    // The function crafts an iron pickaxe using a crafting table. It checks if there are enough iron ingots and sticks in the inventory, and if not, collects the required items. It then places a crafting table near the bot and crafts an iron pickaxe using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftIronShovel.txt
================================================
async function craftIronShovel(bot) {
    // The function crafts an iron shovel using a crafting table. It checks if there are enough iron ingots and sticks in the inventory, and if not, collects the required items. It finds a suitable position to place the crafting table and places it there. Then, it crafts an iron shovel using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftIronSword.txt
================================================
async function craftIronSword(bot) {
    // The function crafts an iron sword using a crafting table. It checks if there are enough iron ingots and sticks in the inventory, and if not, it collects the required items. It then places a crafting table near the bot and crafts an iron sword using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftLightningRod.txt
================================================
async function craftLightningRod(bot) {
    // The function is about crafting a lightning rod. It first finds a suitable position to place the crafting table and places it there. Then it checks if there are enough copper ingots in the inventory, and if not, it mines copper ores and smelts them into copper ingots. Finally, it crafts a lightning rod using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftOakPlanksAndSticks.txt
================================================
async function craftOakPlanksAndSticks(bot) {
    // The function checks if there are enough oak planks and sticks in the inventory, and crafts them if necessary. If there are not enough oak planks, it crafts them from oak logs. If there are not enough sticks, it crafts them from oak planks.
}

================================================
FILE: skill_library/trial1/skill/description/craftScaffolding.txt
================================================
async function craftScaffolding(bot) {
    // The function is about crafting 10 scaffolding using a crafting table. First, it checks if there is a crafting table in the inventory. If not, it crafts one. Then, it places the crafting table near the bot. After that, it crafts 10 scaffolding using the crafting table and saves the event.
}

================================================
FILE: skill_library/trial1/skill/description/craftShears.txt
================================================
async function craftShears(bot) {
    // The function is about crafting a pair of shears. First, place a crafting table near the bot. Then, craft a pair of shears using the crafting table. Finally, the bot will chat that it has crafted a pair of shears.
}

================================================
FILE: skill_library/trial1/skill/description/craftShieldImproved.txt
================================================
async function craftShieldImproved(bot) {
    // The function crafts a shield using oak planks and iron ingots. It checks if there are enough oak planks and iron ingots in the inventory, and if not, it explores the environment to find and collect the required materials. It then places a crafting table near the bot and crafts a shield using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftStonePickaxe.txt
================================================
async function craftStonePickaxe(bot) {
    // The function crafts a stone pickaxe using cobblestone and sticks. It checks if there are enough cobblestone and sticks in the inventory, and if not, it collects the required items. Then, it places a crafting table near the bot and crafts a stone pickaxe using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftStoneShovel.txt
================================================
async function craftStoneShovel(bot) {
    // The function crafts a stone shovel using cobblestone and sticks. It checks if there are enough cobblestone and sticks in the inventory, and if not, it mines cobblestone or crafts sticks. Then, it places a crafting table near the bot and crafts a stone shovel using the crafting table. Finally, it sends a chat message indicating that a stone shovel has been crafted.
}

================================================
FILE: skill_library/trial1/skill/description/craftWhiteBed.txt
================================================
async function craftWhiteBed(bot) {
    // The function crafts a white bed using oak planks and white wool. If there are not enough oak planks in the inventory, it crafts oak planks from oak logs. If there are not enough white wool in the inventory, it stops the function. Then, it places a crafting table near the bot and crafts a white bed using the crafting table.
}

================================================
FILE: skill_library/trial1/skill/description/craftWoodenHoe.txt
================================================
async function craftWoodenHoe(bot) {
    // The function crafts a wooden hoe using oak planks and sticks. If there are not enough oak planks, it crafts them from oak logs. If there are not enough sticks, it crafts them from oak planks. Then, it places a crafting table near the bot and uses it to craft a wooden hoe.
}

================================================
FILE: skill_library/trial1/skill/description/craftWoodenPickaxe.txt
================================================
async function craftWoodenPickaxe(bot) {
    // The function crafts a wooden pickaxe using oak planks, sticks, and a crafting table. It checks if there are enough oak planks and sticks in the inventory, and crafts them if necessary. Then, it places a crafting table near the bot and uses it to craft a wooden pickaxe.
}

================================================
FILE: skill_library/trial1/skill/description/craftWoodenSword.txt
================================================
async function craftWoodenSword(bot) {
    // The function crafts a wooden sword using oak planks, sticks, and a crafting table. It checks if there are enough oak planks and sticks in the inventory, and crafts them if necessary. Then, it places a crafting table near the bot and uses it to craft a wooden sword.
}

================================================
FILE: skill_library/trial1/skill/description/eatCookedPorkchop.txt
================================================
async function eatCookedPorkchop(bot) {
    // The function is about eating a cooked porkchop. It equips the cooked porkchop in the bot's hand, consumes it, and sends a chat message to indicate the task is completed.
}

================================================
FILE: skill_library/trial1/skill/description/eatTwoCookedMutton.txt
================================================
async function eatTwoCookedMutton(bot) {
    // The function is about eating two cooked muttons. It checks if there are at least 2 cooked muttons in the inventory, and if not, it returns. If there are 2 or more cooked muttons, it equips one in the bot's hand and consumes it twice. Finally, it sends a chat message to indicate that the task is completed.
}

================================================
FILE: skill_library/trial1/skill/description/equipIronArmor.txt
================================================
async function equipIronArmor(bot) {
    // The function is about equipping iron armor (leggings, boots, and helmet) in the appropriate slots (legs, feet, and head) if they are available in the inventory. If any of the items are not found in the inventory, the function will output a message indicating that the item is not available.
}

================================================
FILE: skill_library/trial1/skill/description/equipIronChestplate.txt
================================================
async function equipIronChestplate(bot) {
    // The function is about equipping an iron chestplate on the bot's torso. It first finds the iron chestplate in the inventory and then equips it. If the iron chestplate is not found in the inventory, it sends a message saying that it was not found.
}

================================================
FILE: skill_library/trial1/skill/description/equipIronSword.txt
================================================
async function equipIronSword(bot) {
    // The function is about equipping an iron sword. It first checks if the iron sword is in the inventory. If not, it checks a chest for the iron sword. If the iron sword is found, it is equipped in the hand. If the iron sword is not found, a message is sent to the chat.
}

================================================
FILE: skill_library/trial1/skill/description/fillBucketWithWater.txt
================================================
async function fillBucketWithWater(bot) {
    // This function fills a bucket with water by first finding a nearby water block. After locating the water block, the bot moves to it and equips the bucket in its hand. The bot then looks at the water block and activates the bucket to collect water.
}

================================================
FILE: skill_library/trial1/skill/description/killFourSheep.txt
================================================
async function killFourSheep(bot) {
    // The function is about killing four sheep and collecting their drops. It equips a wooden sword and kills the first three sheep, then kills the fourth sheep. After that, it collects the dropped items from the killed sheep, which include wool and raw mutton.
}

================================================
FILE: skill_library/trial1/skill/description/killOneEnderman.txt
================================================
async function killOneEnderman(bot) {
    // The function is about killing one enderman using an iron sword. First, equip the iron sword in the hand. Next, explore the environment until finding the nearest enderman within 32 blocks. Once an enderman is found, kill it using the iron sword. After killing the enderman, collect the dropped items by moving to the enderman's position.
}

================================================
FILE: skill_library/trial1/skill/description/killOnePig.txt
================================================
async function killOnePig(bot) {
    // The function is about killing a pig using a wooden sword and collecting the dropped items. First, equip the wooden sword in the hand. Next, explore the environment until finding the nearest pig within 32 blocks. Once a pig is found, kill it using the wooden sword and collect the dropped items by moving to the pig's position.
}

================================================
FILE: skill_library/trial1/skill/description/killOneSpider.txt
================================================
async function killOneSpider(bot) {
    // The function is about killing a spider using an iron sword. First, equip the iron sword in the hand. Then, explore the environment until finding the nearest spider within 32 blocks. Once a spider is found, kill it using the iron sword. After killing the spider, collect the dropped items by moving to the spider's position.
}

================================================
FILE: skill_library/trial1/skill/description/killOneZombie.txt
================================================
async function killOneZombie(bot) {
    // The function is about killing a single zombie using an iron sword. First, equip the iron sword in the hand. Then, explore the environment until finding the nearest zombie within 32 blocks. Once a zombie is found, kill it using the iron sword and collect the dropped items.
}

================================================
FILE: skill_library/trial1/skill/description/killTwoPigs.txt
================================================
async function killTwoPigs(bot) {
    // The function is about killing two pigs and collecting their dropped items. The function equips a wooden sword and kills two pigs using the `killMob` function. After killing each pig, the function logs a message. Then, the function searches for dropped items from the killed pigs and collects them using the `pathfinder` module. Finally, the function logs a message indicating that the items have been collected.
}

================================================
FILE: skill_library/trial1/skill/description/mineFiveCoalOres.txt
================================================
async function mineFiveCoalOres(bot) {
    // The function is about mining 5 coal ores using a wooden pickaxe. The function first equips the wooden pickaxe in the hand. Then, it explores the environment until it finds 5 coal_ore blocks within a maximum distance of 32 blocks. Once 5 coal_ore blocks are found, it mines them using the wooden pickaxe and saves the event of mining 5 coal ores. If it cannot find enough coal ores, it sends a chat message indicating that it could not find enough coal ores.
}

================================================
FILE: skill_library/trial1/skill/description/mineFiveCoalOresV2.txt
================================================
async function mineFiveCoalOres(bot) {
    // The function is about mining 5 coal ores using a stone pickaxe. First, equip the stone pickaxe in the hand. Next, explore the environment until finding 5 coal_ore blocks. Once 5 coal_ore blocks are found, mine them using the stone pickaxe.
}

================================================
FILE: skill_library/trial1/skill/description/mineFiveCopperOres.txt
================================================
async function mineFiveCopperOres(bot) {
    // The function is about mining 5 copper ores using a stone pickaxe. First, equip the stone pickaxe in the hand. Next, explore the environment until finding 5 copper_ore blocks. Once 5 copper_ore blocks are found, mine them using the stone pickaxe.
}

================================================
FILE: skill_library/trial1/skill/description/mineFiveCopperOresV2.txt
================================================
async function mineFiveCopperOres(bot) {
    // The function checks if the bot already has 5 or more copper ores in the inventory. If not, it outputs how many more copper ores are needed to complete the task.
}

================================================
FILE: skill_library/trial1/skill/description/mineFiveIronOres.txt
================================================
async function mineFiveIronOres(bot) {
    // The function is about mining 5 iron ores using a stone pickaxe. First, equip the stone pickaxe in the hand. Next, explore the environment until finding 5 iron_ore blocks. Once 5 iron_ore blocks are found, mine them using the stone pickaxe.
}

================================================
FILE: skill_library/trial1/skill/description/mineFiveIronOresV2.txt
================================================
async function mineFiveIronOres(bot) {
    // The function is about mining 5 iron ores using a stone pickaxe. First, equip the stone pickaxe in the hand. Next, explore the environment until finding 5 iron_ore blocks. Once 5 iron_ore blocks are found, mine them using the stone pickaxe.
}

================================================
FILE: skill_library/trial1/skill/description/mineFiveLapisLazuliOres.txt
================================================
async function mineFiveLapisLazuliOres(bot) {
    // The function is about mining 5 lapis lazuli ores using an iron pickaxe. First, equip the iron pickaxe in the hand. Next, explore the environment until finding 5 lapis lazuli ore blocks. Once 5 lapis lazuli ore blocks are found, mine them using the iron pickaxe.
}

================================================
FILE: skill_library/trial1/skill/description/mineTenCobblestone.txt
================================================
async function mineTenCobblestone(bot) {
    // The function is about mining 10 cobblestones using a pickaxe. First, check if the bot has a pickaxe in the inventory. If not, craft a wooden pickaxe using the available resources in the inventory. If the pickaxe is available, equip the pickaxe in the hand. Next, use the exploreUntil function to find cobblestone blocks. Once 10 cobblestone blocks are found, mine them using the mineBlock function.
}

================================================
FILE: skill_library/trial1/skill/description/mineThreeMoreOakLogs.txt
================================================
async function mineThreeMoreOakLogs(bot) {
    // The function is about mining 3 oak logs. It first checks the initial inventory for oak logs. Then, it explores the environment until it finds 3 oak log blocks. If it cannot find enough oak logs, it returns. Otherwise, it mines the oak log blocks and compares the final inventory with the initial inventory to determine if it successfully mined 3 more oak logs.
}

================================================
FILE: skill_library/trial1/skill/description/mineWoodLog.txt
================================================
async function mineWoodLog(bot) {
    // The function is about mining a single wood log block. It searches for a wood log block by exploring the environment until it finds one of the seven types of wood logs. If a wood log block is found, it is mined and a success message is sent. If no wood log block is found, a failure message is sent.
}

================================================
FILE: skill_library/trial1/skill/description/obtainOneMoreAcaciaLog.txt
================================================
async function obtainOneMoreAcaciaLog(bot) {
    // The function checks if there are less than 5 acacia logs in the inventory, and if so, finds and mines one more acacia log. If the bot successfully obtains 5 acacia logs, it sends a success message, otherwise it sends a failure message.
}

================================================
FILE: skill_library/trial1/skill/description/smeltCactusIntoGreenDye.txt
================================================
async function smeltCactusIntoGreenDye(bot) {
    // The function is about smelting 5 cactus into green dye using a furnace and coal as fuel. It checks if there is a furnace in the inventory, and if not, it crafts one. Then it finds a suitable position to place the furnace and places it there. Finally, it smelts the cactus using coal as fuel and saves the event of smelting 5 cactus into green dye.
}

================================================
FILE: skill_library/trial1/skill/description/smeltFiveRawIron.txt
================================================
async function smeltFiveRawIron(bot) {
    // The function is about smelting 5 raw iron using a furnace and coal as fuel. First, it checks if there is a furnace in the inventory, and if not, it crafts one. Then, it places the furnace near the bot. Finally, it smelts 5 raw iron using the available coal as fuel and sends a chat message when finished.
}

================================================
FILE: skill_library/trial1/skill/description/smeltFiveRawIronV2.txt
================================================
async function smeltFiveRawIron(bot) {
    // The function is about smelting 5 raw iron using a furnace and coal as fuel. If there is no furnace in the inventory, craft one using cobblestone. Find a suitable position to place the furnace and place it there. Then, smelt 5 raw iron using the available coal as fuel.
}

================================================
FILE: skill_library/trial1/skill/description/smeltRawCopper.txt
================================================
async function smeltRawCopper(bot) {
    // The function is about smelting 19 raw copper using a furnace and coal as fuel. It checks if there is a furnace in the inventory, and if not, it crafts one. Then it finds a suitable position to place the furnace and places it there. Finally, it smelts the raw copper using the furnace and coal as fuel.
}

================================================
FILE: skill_library/trial1/skill/skills.json
================================================
{"mineWoodLog": {"code": "async function mineWoodLog(bot) {\n  const woodLogNames = [\"oak_log\", \"birch_log\", \"spruce_log\", \"jungle_log\", \"acacia_log\", \"dark_oak_log\", \"mangrove_log\"];\n\n  // Find a wood log block\n  const woodLogBlock = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    return bot.findBlock({\n      matching: block => woodLogNames.includes(block.name),\n      maxDistance: 32\n    });\n  });\n  if (!woodLogBlock) {\n    bot.chat(\"Could not find a wood log.\");\n    return;\n  }\n\n  // Mine the wood log block\n  await mineBlock(bot, woodLogBlock.name, 1);\n  bot.chat(\"Wood log mined.\");\n}", "description": "async function mineWoodLog(bot) {\n    // The function is about mining a single wood log block. It searches for a wood log block by exploring the environment until it finds one of the seven types of wood logs. If a wood log block is found, it is mined and a success message is sent. If no wood log block is found, a failure message is sent.\n}"}, "mineThreeMoreOakLogs": {"code": "async function mineThreeMoreOakLogs(bot) {\n  // Check the initial inventory for oak logs\n  const initialOakLogs = bot.inventory.count(mcData.itemsByName.oak_log.id);\n\n  // Find 3 oak_log blocks\n  const oakLogs = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const oakLogs = bot.findBlocks({\n      matching: block => block.name === \"oak_log\",\n      maxDistance: 32,\n      count: 3\n    });\n    return oakLogs.length >= 3 ? oakLogs : null;\n  });\n  if (!oakLogs) {\n    bot.chat(\"Could not find enough oak logs.\");\n    return;\n  }\n\n  // Mine the oak_log blocks\n  await mineBlock(bot, \"oak_log\", 3);\n  bot.chat(\"3 oak logs mined.\");\n\n  // Compare the final inventory with the initial inventory\n  const finalOakLogs = bot.inventory.count(mcData.itemsByName.oak_log.id);\n  if (finalOakLogs - initialOakLogs === 3) {\n    bot.chat(\"Successfully mined 3 more oak logs.\");\n  } else {\n    bot.chat(\"Failed to mine 3 more oak logs.\");\n  }\n}", "description": "async function mineThreeMoreOakLogs(bot) {\n    // The function is about mining 3 oak logs. It first checks the initial inventory for oak logs. Then, it explores the environment until it finds 3 oak log blocks. If it cannot find enough oak logs, it returns. Otherwise, it mines the oak log blocks and compares the final inventory with the initial inventory to determine if it successfully mined 3 more oak logs.\n}"}, "craftCraftingTable": {"code": "async function craftCraftingTable(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);\n\n  // If not, craft oak planks from oak logs\n  if (oakPlanksCount < 4) {\n    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);\n    const planksToCraft = Math.ceil((4 - oakPlanksCount) / 4);\n    if (oakLogsCount >= planksToCraft) {\n      await craftItem(bot, \"oak_planks\", planksToCraft);\n      bot.chat(\"Crafted oak planks.\");\n    } else {\n      bot.chat(\"Not enough oak logs to craft oak planks.\");\n      return;\n    }\n  }\n\n  // Craft a crafting table using oak planks\n  await craftItem(bot, \"crafting_table\", 1);\n  bot.chat(\"Crafted a crafting table.\");\n}", "description": "async function craftCraftingTable(bot) {\n    // The function crafts a crafting table using oak planks. It first checks if there are enough oak planks in the inventory, and if not, crafts oak planks from oak logs. Then, it crafts a crafting table using the oak planks.\n}"}, "craftWoodenPickaxe": {"code": "async function craftWoodenPickaxe(bot) {\n  // check if crafting table is in the inventory\n  const craftingTableCount = bot.inventory.count(\n    mcData.itemsByName.crafting_table.id\n  );\n\n  // If not, craft a crafting table\n  if (craftingTableCount === 0) {\n    await craftCraftingTable(bot);\n  }\n\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);\n\n  // If not, craft oak planks from oak logs\n  if (oakPlanksCount < 6) {\n    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);\n    const planksToCraft = Math.ceil((6 - oakPlanksCount) / 4);\n    if (oakLogsCount < planksToCraft) {\n      await mineBlock(bot, \"oak_log\", planksToCraft - oakLogsCount);\n    }\n    await craftItem(bot, \"oak_planks\", planksToCraft);\n    bot.chat(\"Crafted oak planks.\");\n  }\n\n  // Check if there are enough sticks in the inventory\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not, craft sticks from oak planks\n  if (sticksCount < 2) {\n    await craftItem(bot, \"stick\", 1);\n    bot.chat(\"Crafted sticks.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a wooden pickaxe using the crafting table\n  await craftItem(bot, \"wooden_pickaxe\", 1);\n  bot.chat(\"Crafted a wooden pickaxe.\");\n}\n", "description": "async function craftWoodenPickaxe(bot) {\n    // The function crafts a wooden pickaxe using oak planks, sticks, and a crafting table. It checks if there are enough oak planks and sticks in the inventory, and crafts them if necessary. Then, it places a crafting table near the bot and uses it to craft a wooden pickaxe.\n}"}, "craftWoodenSword": {"code": "async function craftWoodenSword(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);\n\n  // If not, craft oak planks from oak logs\n  if (oakPlanksCount < 2) {\n    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);\n    const planksToCraft = Math.ceil((2 - oakPlanksCount) / 4);\n    if (oakLogsCount >= planksToCraft) {\n      await craftItem(bot, \"oak_planks\", planksToCraft);\n      bot.chat(\"Crafted oak planks.\");\n    } else {\n      bot.chat(\"Not enough oak logs to craft oak planks.\");\n      return;\n    }\n  }\n\n  // Check if there are enough sticks in the inventory\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not, craft sticks from oak planks\n  if (sticksCount < 1) {\n    await craftItem(bot, \"stick\", 1);\n    bot.chat(\"Crafted sticks.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a wooden sword using the crafting table\n  await craftItem(bot, \"wooden_sword\", 1);\n  bot.chat(\"Crafted a wooden sword.\");\n}", "description": "async function craftWoodenSword(bot) {\n    // The function crafts a wooden sword using oak planks, sticks, and a crafting table. It checks if there are enough oak planks and sticks in the inventory, and crafts them if necessary. Then, it places a crafting table near the bot and uses it to craft a wooden sword.\n}"}, "killOnePig": {"code": "async function killOnePig(bot) {\n  // Equip the wooden sword\n  const woodenSword = bot.inventory.findInventoryItem(mcData.itemsByName.wooden_sword.id);\n  await bot.equip(woodenSword, \"hand\");\n\n  // Find the nearest pig\n  const pig = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const pig = bot.nearestEntity(entity => {\n      return entity.name === \"pig\" && entity.position.distanceTo(bot.entity.position) < 32;\n    });\n    return pig;\n  });\n  if (!pig) {\n    bot.chat(\"Could not find a pig.\");\n    return;\n  }\n\n  // Kill the pig using the wooden sword\n  await killMob(bot, \"pig\", 300);\n  bot.chat(\"Killed a pig.\");\n\n  // Collect the dropped items\n  await bot.pathfinder.goto(new GoalBlock(pig.position.x, pig.position.y, pig.position.z));\n  bot.chat(\"Collected dropped items.\");\n}", "description": "async function killOnePig(bot) {\n    // The function is about killing a pig using a wooden sword and collecting the dropped items. First, equip the wooden sword in the hand. Next, explore the environment until finding the nearest pig within 32 blocks. Once a pig is found, kill it using the wooden sword and collect the dropped items by moving to the pig's position.\n}"}, "killFourSheep": {"code": "async function killFourSheep(bot) {\n  // Equip the wooden sword\n  const woodenSword = bot.inventory.findInventoryItem(mcData.itemsByName.wooden_sword.id);\n  await bot.equip(woodenSword, \"hand\");\n\n  // Find and kill the first three sheep\n  for (let i = 1; i <= 3; i++) {\n    await killMob(bot, \"sheep\", 300);\n    bot.chat(`Killed sheep ${i}.`);\n  }\n\n  // Find and kill the fourth sheep\n  await killMob(bot, \"sheep\", 300);\n  bot.chat(\"Killed the fourth sheep.\");\n\n  // Collect the dropped items from the killed sheep\n  const sheepDrops = [\"wool\", \"raw_mutton\"];\n  for (const drop of sheepDrops) {\n    const droppedItem = bot.findBlock({\n      matching: block => block.name === drop,\n      maxDistance: 32\n    });\n    if (droppedItem) {\n      await bot.pathfinder.goto(new GoalBlock(droppedItem.position.x, droppedItem.position.y, droppedItem.position.z));\n    }\n  }\n  bot.chat(\"Collected dropped items from the killed sheep.\");\n}", "description": "async function killFourSheep(bot) {\n    // The function is about killing four sheep and collecting their drops. It equips a wooden sword and kills the first three sheep, then kills the fourth sheep. After that, it collects the dropped items from the killed sheep, which include wool and raw mutton.\n}"}, "craftOakPlanksAndSticks": {"code": "async function craftOakPlanksAndSticks(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);\n\n  // If not, craft oak planks from oak logs\n  if (oakPlanksCount < 8) {\n    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);\n    const planksToCraft = Math.ceil((8 - oakPlanksCount) / 4);\n    if (oakLogsCount >= planksToCraft) {\n      await craftItem(bot, \"oak_planks\", planksToCraft);\n      bot.chat(\"Crafted oak planks.\");\n    } else {\n      bot.chat(\"Not enough oak logs to craft oak planks.\");\n      return;\n    }\n  }\n\n  // Check if there are enough sticks in the inventory\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not, craft sticks from oak planks\n  if (sticksCount < 4) {\n    await craftItem(bot, \"stick\", 2);\n    bot.chat(\"Crafted sticks.\");\n  }\n}", "description": "async function craftOakPlanksAndSticks(bot) {\n    // The function checks if there are enough oak planks and sticks in the inventory, and crafts them if necessary. If there are not enough oak planks, it crafts them from oak logs. If there are not enough sticks, it crafts them from oak planks.\n}"}, "mineFiveCoalOres": {"code": "async function mineFiveCoalOres(bot) {\n  // Equip the stone pickaxe\n  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_pickaxe.id);\n  await bot.equip(stonePickaxe, \"hand\");\n\n  // Find 5 coal_ore blocks\n  const coalOres = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const coalOres = bot.findBlocks({\n      matching: block => block.name === \"coal_ore\",\n      maxDistance: 32,\n      count: 5\n    });\n    return coalOres.length >= 5 ? coalOres : null;\n  });\n  if (!coalOres) {\n    bot.chat(\"Could not find enough coal ores.\");\n    return;\n  }\n\n  // Mine the 5 coal_ore blocks\n  await mineBlock(bot, \"coal_ore\", 5);\n  bot.chat(\"5 coal ores mined.\");\n}", "description": "async function mineFiveCoalOres(bot) {\n    // The function is about mining 5 coal ores using a stone pickaxe. First, equip the stone pickaxe in the hand. Next, explore the environment until finding 5 coal_ore blocks. Once 5 coal_ore blocks are found, mine them using the stone pickaxe.\n}"}, "mineTenCobblestone": {"code": "async function mineTenCobblestone(bot) {\n  // Check if the bot has a pickaxe in the inventory\n  const pickaxe = bot.inventory.items().find(item => item.name.endsWith(\"_pickaxe\"));\n\n  // If not, craft a wooden pickaxe using the available resources in the inventory\n  if (!pickaxe) {\n    await craftWoodenPickaxe(bot);\n  } else {\n    // Equip the pickaxe\n    await bot.equip(pickaxe, \"hand\");\n  }\n\n  // Use the exploreUntil function to find cobblestone blocks\n  const cobblestoneBlocks = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const cobblestoneBlocks = bot.findBlocks({\n      matching: block => block.name === \"stone\",\n      maxDistance: 32,\n      count: 10\n    });\n    return cobblestoneBlocks.length >= 10 ? cobblestoneBlocks : null;\n  });\n  if (!cobblestoneBlocks) {\n    bot.chat(\"Could not find enough cobblestone.\");\n    return;\n  }\n\n  // Mine 10 cobblestone blocks using the mineBlock function\n  await mineBlock(bot, \"stone\", 10);\n  bot.chat(\"10 cobblestone mined.\");\n}", "description": "async function mineTenCobblestone(bot) {\n    // The function is about mining 10 cobblestones using a pickaxe. First, check if the bot has a pickaxe in the inventory. If not, craft a wooden pickaxe using the available resources in the inventory. If the pickaxe is available, equip the pickaxe in the hand. Next, use the exploreUntil function to find cobblestone blocks. Once 10 cobblestone blocks are found, mine them using the mineBlock function.\n}"}, "craftStonePickaxe": {"code": "async function craftStonePickaxe(bot) {\n  // Check if there are enough cobblestone and sticks in the inventory\n  const cobblestoneCount = bot.inventory.count(mcData.itemsByName.cobblestone.id);\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not enough cobblestone or sticks, collect the required items\n  if (cobblestoneCount < 3) {\n    await mineBlock(bot, \"stone\", 3 - cobblestoneCount);\n    bot.chat(\"Collected cobblestone.\");\n  }\n  if (sticksCount < 2) {\n    await craftItem(bot, \"stick\", 1);\n    bot.chat(\"Crafted sticks.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a stone pickaxe using the crafting table\n  await craftItem(bot, \"stone_pickaxe\", 1);\n  bot.chat(\"Crafted a stone pickaxe.\");\n}", "description": "async function craftStonePickaxe(bot) {\n    // The function crafts a stone pickaxe using cobblestone and sticks. It checks if there are enough cobblestone and sticks in the inventory, and if not, it collects the required items. Then, it places a crafting table near the bot and crafts a stone pickaxe using the crafting table.\n}"}, "mineFiveIronOres": {"code": "async function mineFiveIronOres(bot) {\n  // Equip the stone pickaxe\n  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_pickaxe.id);\n  await bot.equip(stonePickaxe, \"hand\");\n\n  // Find 5 iron_ore blocks\n  const ironOres = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const ironOres = bot.findBlocks({\n      matching: block => block.name === \"iron_ore\",\n      maxDistance: 32,\n      count: 5\n    });\n    return ironOres.length >= 5 ? ironOres : null;\n  });\n  if (!ironOres) {\n    bot.chat(\"Could not find enough iron ores.\");\n    return;\n  }\n\n  // Mine the 5 iron_ore blocks\n  await mineBlock(bot, \"iron_ore\", 5);\n  bot.chat(\"5 iron ores mined.\");\n}", "description": "async function mineFiveIronOres(bot) {\n    // The function is about mining 5 iron ores using a stone pickaxe. First, equip the stone pickaxe in the hand. Next, explore the environment until finding 5 iron_ore blocks. Once 5 iron_ore blocks are found, mine them using the stone pickaxe.\n}"}, "craftFurnace": {"code": "async function craftFurnace(bot) {\n  // Check if there are enough cobblestones in the inventory\n  const cobblestoneCount = bot.inventory.count(mcData.itemsByName.cobblestone.id);\n\n  // If not, mine the required cobblestones\n  if (cobblestoneCount < 8) {\n    await mineBlock(bot, \"stone\", 8 - cobblestoneCount);\n    bot.chat(\"Collected cobblestone.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a furnace using the crafting table\n  await craftItem(bot, \"furnace\", 1);\n  bot.chat(\"Crafted a furnace.\");\n}", "description": "async function craftFurnace(bot) {\n    // The function crafts a furnace using a crafting table and cobblestones. If there are not enough cobblestones in the inventory, it mines the required amount. Then, it places a crafting table near the bot and crafts a furnace using the crafting table. Finally, it sends a chat message indicating that a furnace has been crafted.\n}"}, "smeltFiveRawIron": {"code": "async function findSuitablePosition(bot) {\n  const offsets = [new Vec3(1, 0, 0), new Vec3(-1, 0, 0), new Vec3(0, 0, 1), new Vec3(0, 0, -1)];\n  for (const offset of offsets) {\n    const position = bot.entity.position.offset(offset.x, offset.y, offset.z);\n    const block = bot.blockAt(position);\n    if (block.name === \"air\") {\n      return position;\n    }\n  }\n  return null;\n}\nasync function smeltFiveRawIron(bot) {\n  // Check if there is coal in the inventory\n  const coalCount = bot.inventory.count(mcData.itemsByName.coal.id);\n\n  // If not enough coal, mine coal_ore to obtain coal\n  if (coalCount < 3) {\n    await mineBlock(bot, \"coal_ore\", 3 - coalCount);\n    bot.chat(\"Collected coal.\");\n  }\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);\n  // If not, craft a furnace using the available cobblestone\n  if (!furnaceItem) {\n    await craftFurnace(bot);\n  }\n  // Find a suitable position to place the furnace\n  const furnacePosition = await findSuitablePosition(bot);\n  if (!furnacePosition) {\n    bot.chat(\"Could not find a suitable position to place the furnace.\");\n    return;\n  }\n  // Place the furnace at the suitable position\n  await placeItem(bot, \"furnace\", furnacePosition);\n  // Smelt 5 raw iron using the available coal as fuel\n  await smeltItem(bot, \"raw_iron\", \"coal\", 5);\n  bot.chat(\"5 raw iron smelted.\");\n}", "description": "async function smeltFiveRawIron(bot) {\n    // The function is about smelting 5 raw iron using a furnace and coal as fuel. If there is no furnace in the inventory, craft one using cobblestone. Find a suitable position to place the furnace and place it there. Then, smelt 5 raw iron using the available coal as fuel.\n}"}, "craftIronPickaxe": {"code": "async function craftIronPickaxe(bot) {\n  // Check if there are enough iron ingots and sticks in the inventory\n  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not enough iron ingots or sticks, collect the required items\n  if (ironIngotsCount < 3) {\n    await mineBlock(bot, \"iron_ore\", 3 - ironIngotsCount);\n    bot.chat(\"Collected iron ores.\");\n    await smeltItem(bot, \"iron_ore\", \"coal\", 3 - ironIngotsCount);\n    bot.chat(\"Smelted iron ores into iron ingots.\");\n  }\n  if (sticksCount < 2) {\n    await craftItem(bot, \"stick\", 1);\n    bot.chat(\"Crafted sticks.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft an iron pickaxe using the crafting table\n  await craftItem(bot, \"iron_pickaxe\", 1);\n  bot.chat(\"Crafted an iron pickaxe.\");\n}", "description": "async function craftIronPickaxe(bot) {\n    // The function crafts an iron pickaxe using a crafting table. It checks if there are enough iron ingots and sticks in the inventory, and if not, collects the required items. It then places a crafting table near the bot and crafts an iron pickaxe using the crafting table.\n}"}, "craftIronSword": {"code": "async function craftIronSword(bot) {\n  // Check if there are enough iron ingots and sticks in the inventory\n  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not enough iron ingots or sticks, collect the required items\n  if (ironIngotsCount < 2) {\n    await mineBlock(bot, \"iron_ore\", 2 - ironIngotsCount);\n    bot.chat(\"Collected iron ores.\");\n    await smeltItem(bot, \"iron_ore\", \"coal\", 2 - ironIngotsCount);\n    bot.chat(\"Smelted iron ores into iron ingots.\");\n  }\n  if (sticksCount < 1) {\n    await craftItem(bot, \"stick\", 1);\n    bot.chat(\"Crafted sticks.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft an iron sword using the crafting table\n  await craftItem(bot, \"iron_sword\", 1);\n  bot.chat(\"Crafted an iron sword.\");\n}", "description": "async function craftIronSword(bot) {\n    // The function crafts an iron sword using a crafting table. It checks if there are enough iron ingots and sticks in the inventory, and if not, it collects the required items. It then places a crafting table near the bot and crafts an iron sword using the crafting table.\n}"}, "cookPorkchops": {"code": "async function cookPorkchops(bot) {\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);\n\n  // If not, craft a furnace using the available cobblestone\n  if (!furnaceItem) {\n    await craftFurnace(bot);\n  }\n\n  // Place the furnace near the bot\n  const furnacePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"furnace\", furnacePosition);\n\n  // Smelt 2 porkchops using the available coal as fuel\n  await smeltItem(bot, \"porkchop\", \"coal\", 2);\n  bot.chat(\"2 porkchops cooked.\");\n}", "description": "async function cookPorkchops(bot) {\n    // The function is about cooking 2 porkchops using a furnace and coal as fuel. First, it checks if there is a furnace in the inventory. If not, it crafts a furnace using cobblestone. Then, it places the furnace near the bot. Finally, it smelts 2 porkchops using coal as fuel and saves the event of cooking porkchops.\n}"}, "mineFiveLapisLazuliOres": {"code": "async function mineFiveLapisLazuliOres(bot) {\n  // Equip the iron pickaxe\n  const ironPickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.iron_pickaxe.id);\n  await bot.equip(ironPickaxe, \"hand\");\n\n  // Find 5 lapis_lazuli_ore blocks\n  const lapisOres = await exploreUntil(bot, new Vec3(1, -1, 1), 60, () => {\n    const lapisOres = bot.findBlocks({\n      matching: block => block.name === \"lapis_ore\",\n      maxDistance: 32,\n      count: 5\n    });\n    return lapisOres.length >= 5 ? lapisOres : null;\n  });\n  if (!lapisOres) {\n    bot.chat(\"Could not find enough lapis lazuli ores.\");\n    return;\n  }\n\n  // Mine the 5 lapis_lazuli_ore blocks\n  await mineBlock(bot, \"lapis_ore\", 5);\n  bot.chat(\"5 lapis lazuli ores mined.\");\n}", "description": "async function mineFiveLapisLazuliOres(bot) {\n    // The function is about mining 5 lapis lazuli ores using an iron pickaxe. First, equip the iron pickaxe in the hand. Next, explore the environment until finding 5 lapis lazuli ore blocks. Once 5 lapis lazuli ore blocks are found, mine them using the iron pickaxe.\n}"}, "craftIronAxe": {"code": "async function craftIronAxe(bot) {\n  // Check if there are enough iron ingots and sticks in the inventory\n  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not enough iron ingots or sticks, collect the required items\n  if (ironIngotsCount < 3) {\n    await mineBlock(bot, \"iron_ore\", 3 - ironIngotsCount);\n    bot.chat(\"Collected iron ores.\");\n    await smeltItem(bot, \"iron_ore\", \"coal\", 3 - ironIngotsCount);\n    bot.chat(\"Smelted iron ores into iron ingots.\");\n  }\n  if (sticksCount < 2) {\n    await craftItem(bot, \"stick\", 1);\n    bot.chat(\"Crafted sticks.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft an iron axe using the crafting table\n  await craftItem(bot, \"iron_axe\", 1);\n  bot.chat(\"Crafted an iron axe.\");\n}", "description": "async function craftIronAxe(bot) {\n    // The function crafts an iron axe using a crafting table. It checks if there are enough iron ingots and sticks in the inventory, and if not, collects the required items. It then places a crafting table near the bot and crafts an iron axe using the crafting table.\n}"}, "craftStoneShovel": {"code": "async function craftStoneShovel(bot) {\n  // Check if there are enough cobblestone and sticks in the inventory\n  const cobblestoneCount = bot.inventory.count(mcData.itemsByName.cobblestone.id);\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not enough cobblestone, mine cobblestone\n  if (cobblestoneCount < 1) {\n    await mineBlock(bot, \"stone\", 1);\n    bot.chat(\"Collected cobblestone.\");\n  }\n\n  // If not enough sticks, craft sticks\n  if (sticksCount < 2) {\n    await craftItem(bot, \"stick\", 1);\n    bot.chat(\"Crafted sticks.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a stone shovel using the crafting table\n  await craftItem(bot, \"stone_shovel\", 1);\n  bot.chat(\"Crafted a stone shovel.\");\n}", "description": "async function craftStoneShovel(bot) {\n    // The function crafts a stone shovel using cobblestone and sticks. It checks if there are enough cobblestone and sticks in the inventory, and if not, it mines cobblestone or crafts sticks. Then, it places a crafting table near the bot and crafts a stone shovel using the crafting table. Finally, it sends a chat message indicating that a stone shovel has been crafted.\n}"}, "cookSevenMutton": {"code": "async function cookSevenMutton(bot) {\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);\n\n  // If not, craft a furnace using the available cobblestone\n  if (!furnaceItem) {\n    await craftFurnace(bot);\n  }\n\n  // Find a suitable position to place the furnace\n  const furnacePosition = await findSuitablePosition(bot);\n  if (!furnacePosition) {\n    bot.chat(\"Could not find a suitable position to place the furnace.\");\n    return;\n  }\n\n  // Place the furnace at the suitable position\n  await placeItem(bot, \"furnace\", furnacePosition);\n\n  // Smelt 7 raw mutton using the available coal as fuel\n  await smeltItem(bot, \"mutton\", \"coal\", 7);\n  bot.chat(\"7 mutton cooked.\");\n}", "description": "async function cookSevenMutton(bot) {\n    // The function is about cooking 7 raw mutton using a furnace and coal as fuel. It checks if there is a furnace in the inventory, and if not, it crafts one. Then it finds a suitable position to place the furnace and places it there. After that, it smelts 7 raw mutton using the available coal as fuel and saves the event of cooking 7 mutton.\n}"}, "killTwoPigs": {"code": "async function killTwoPigs(bot) {\n  // Equip the wooden sword\n  const woodenSword = bot.inventory.findInventoryItem(mcData.itemsByName.wooden_sword.id);\n  await bot.equip(woodenSword, \"hand\");\n\n  // Find and kill the first pig\n  await killMob(bot, \"pig\", 300);\n  bot.chat(\"Killed the first pig.\");\n\n  // Find and kill the second pig\n  await killMob(bot, \"pig\", 300);\n  bot.chat(\"Killed the second pig.\");\n\n  // Collect the dropped items from the killed pigs\n  const pigDrops = [\"raw_porkchop\"];\n  for (const drop of pigDrops) {\n    const droppedItem = bot.findBlock({\n      matching: block => block.name === drop,\n      maxDistance: 32\n    });\n    if (droppedItem) {\n      await bot.pathfinder.goto(new GoalBlock(droppedItem.position.x, droppedItem.position.y, droppedItem.position.z));\n    }\n  }\n  bot.chat(\"Collected dropped items from the killed pigs.\");\n}", "description": "async function killTwoPigs(bot) {\n    // The function is about killing two pigs and collecting their dropped items. The function equips a wooden sword and kills two pigs using the `killMob` function. After killing each pig, the function logs a message. Then, the function searches for dropped items from the killed pigs and collects them using the `pathfinder` module. Finally, the function logs a message indicating that the items have been collected.\n}"}, "eatCookedPorkchop": {"code": "async function eatCookedPorkchop(bot) {\n  // Equip the cooked porkchop in the bot's hand\n  const cookedPorkchop = bot.inventory.findInventoryItem(mcData.itemsByName.cooked_porkchop.id);\n  await bot.equip(cookedPorkchop, \"hand\");\n\n  // Consume the cooked porkchop\n  await bot.consume();\n\n  // Send a chat message to indicate the task is completed\n  bot.chat(\"Ate 1 cooked porkchop.\");\n}", "description": "async function eatCookedPorkchop(bot) {\n    // The function is about eating a cooked porkchop. It equips the cooked porkchop in the bot's hand, consumes it, and sends a chat message to indicate the task is completed.\n}"}, "craftWoodenHoe": {"code": "async function craftWoodenHoe(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);\n\n  // If not, craft oak planks from oak logs\n  if (oakPlanksCount < 2) {\n    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);\n    const planksToCraft = Math.ceil((2 - oakPlanksCount) / 4);\n    if (oakLogsCount >= planksToCraft) {\n      await craftItem(bot, \"oak_planks\", planksToCraft);\n      bot.chat(\"Crafted oak planks.\");\n    } else {\n      bot.chat(\"Not enough oak logs to craft oak planks.\");\n      return;\n    }\n  }\n\n  // Check if there are enough sticks in the inventory\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not, craft sticks from oak planks\n  if (sticksCount < 2) {\n    await craftItem(bot, \"stick\", 1);\n    bot.chat(\"Crafted sticks.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a wooden hoe using the crafting table\n  await craftItem(bot, \"wooden_hoe\", 1);\n  bot.chat(\"Crafted a wooden hoe.\");\n}", "description": "async function craftWoodenHoe(bot) {\n    // The function crafts a wooden hoe using oak planks and sticks. If there are not enough oak planks, it crafts them from oak logs. If there are not enough sticks, it crafts them from oak planks. Then, it places a crafting table near the bot and uses it to craft a wooden hoe.\n}"}, "craftWhiteBed": {"code": "async function craftWhiteBed(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);\n\n  // If not, craft oak planks from oak logs\n  if (oakPlanksCount < 3) {\n    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);\n    const planksToCraft = Math.ceil((3 - oakPlanksCount) / 4);\n    if (oakLogsCount >= planksToCraft) {\n      await craftItem(bot, \"oak_planks\", planksToCraft);\n      bot.chat(\"Crafted oak planks.\");\n    } else {\n      bot.chat(\"Not enough oak logs to craft oak planks.\");\n      return;\n    }\n  }\n\n  // Check if there are enough white wool in the inventory\n  const whiteWoolCount = bot.inventory.count(mcData.itemsByName.white_wool.id);\n  if (whiteWoolCount < 3) {\n    bot.chat(\"Not enough white wool to craft a bed.\");\n    return;\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a white bed using the crafting table\n  await craftItem(bot, \"white_bed\", 1);\n  bot.chat(\"Crafted a white bed.\");\n}", "description": "async function craftWhiteBed(bot) {\n    // The function crafts a white bed using oak planks and white wool. If there are not enough oak planks in the inventory, it crafts oak planks from oak logs. If there are not enough white wool in the inventory, it stops the function. Then, it places a crafting table near the bot and crafts a white bed using the crafting table.\n}"}, "killOneEnderman": {"code": "async function killOneEnderman(bot) {\n  // Equip the iron sword\n  const ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);\n  await bot.equip(ironSword, \"hand\");\n\n  // Find the nearest enderman\n  const enderman = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const enderman = bot.nearestEntity(entity => {\n      return entity.name === \"enderman\" && entity.position.distanceTo(bot.entity.position) < 32;\n    });\n    return enderman;\n  });\n  if (!enderman) {\n    bot.chat(\"Could not find an enderman.\");\n    return;\n  }\n\n  // Kill the enderman using the iron sword\n  await killMob(bot, \"enderman\", 300);\n  bot.chat(\"Killed an enderman.\");\n\n  // Collect the dropped items\n  await bot.pathfinder.goto(new GoalBlock(enderman.position.x, enderman.position.y, enderman.position.z));\n  bot.chat(\"Collected dropped items.\");\n}", "description": "async function killOneEnderman(bot) {\n    // The function is about killing one enderman using an iron sword. First, equip the iron sword in the hand. Next, explore the environment until finding the nearest enderman within 32 blocks. Once an enderman is found, kill it using the iron sword. After killing the enderman, collect the dropped items by moving to the enderman's position.\n}"}, "craftIronChestplate": {"code": "async function craftIronChestplate(bot) {\n  // Check if there are enough iron ingots in the inventory\n  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);\n\n  // If not enough iron ingots, mine iron ores and smelt them into iron ingots\n  if (ironIngotsCount < 8) {\n    await mineBlock(bot, \"iron_ore\", 8 - ironIngotsCount);\n    bot.chat(\"Collected iron ores.\");\n    await smeltItem(bot, \"iron_ore\", \"coal\", 8 - ironIngotsCount);\n    bot.chat(\"Smelted iron ores into iron ingots.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft an iron chestplate using the crafting table\n  await craftItem(bot, \"iron_chestplate\", 1);\n  bot.chat(\"Crafted an iron chestplate.\");\n}", "description": "async function craftIronChestplate(bot) {\n    // The function crafts an iron chestplate using a crafting table. It first checks if there are enough iron ingots in the inventory, and if not, it mines iron ores and smelts them into iron ingots. Then it places a crafting table near the bot and crafts an iron chestplate using the crafting table.\n}"}, "mineFiveCopperOres": {"code": "async function mineFiveCopperOres(bot) {\n  // Check if the bot already has 5 or more copper ores in the inventory\n  const copperOres = bot.inventory.items().filter(item => item.name === \"copper_ore\");\n  const totalCopperOres = copperOres.reduce((total, item) => total + item.count, 0);\n  if (totalCopperOres >= 5) {\n    bot.chat(\"Task already completed. There are already \" + totalCopperOres + \" copper ores in the inventory.\");\n  } else {\n    bot.chat(\"Need to mine \" + (5 - totalCopperOres) + \" more copper ores.\");\n    // You can call the mineFiveCopperOres function from the previous response here\n  }\n}", "description": "async function mineFiveCopperOres(bot) {\n    // The function checks if the bot already has 5 or more copper ores in the inventory. If not, it outputs how many more copper ores are needed to complete the task.\n}"}, "equipIronChestplate": {"code": "async function equipIronChestplate(bot) {\n  // Find the iron chestplate in the inventory\n  const ironChestplate = bot.inventory.findInventoryItem(mcData.itemsByName.iron_chestplate.id);\n\n  // Equip the iron chestplate\n  if (ironChestplate) {\n    await bot.equip(ironChestplate, \"torso\");\n    bot.chat(\"Equipped iron chestplate.\");\n  } else {\n    bot.chat(\"Iron chestplate not found in inventory.\");\n  }\n}", "description": "async function equipIronChestplate(bot) {\n    // The function is about equipping an iron chestplate on the bot's torso. It first finds the iron chestplate in the inventory and then equips it. If the iron chestplate is not found in the inventory, it sends a message saying that it was not found.\n}"}, "smeltRawCopper": {"code": "async function smeltRawCopper(bot) {\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);\n\n  // If not, craft a furnace using the available cobblestone\n  if (!furnaceItem) {\n    await craftFurnace(bot);\n  }\n\n  // Find a suitable position to place the furnace\n  const furnacePosition = await findSuitablePosition(bot);\n  if (!furnacePosition) {\n    bot.chat(\"Could not find a suitable position to place the furnace.\");\n    return;\n  }\n\n  // Place the furnace at the suitable position\n  await placeItem(bot, \"furnace\", furnacePosition);\n\n  // Smelt 19 raw copper using the available coal as fuel\n  await smeltItem(bot, \"raw_copper\", \"coal\", 19);\n  bot.chat(\"19 raw copper smelted.\");\n}", "description": "async function smeltRawCopper(bot) {\n    // The function is about smelting 19 raw copper using a furnace and coal as fuel. It checks if there is a furnace in the inventory, and if not, it crafts one. Then it finds a suitable position to place the furnace and places it there. Finally, it smelts the raw copper using the furnace and coal as fuel.\n}"}, "craftIronHelmet": {"code": "async function craftIronHelmet(bot) {\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft an iron helmet using the crafting table\n  await craftItem(bot, \"iron_helmet\", 1);\n  bot.chat(\"Crafted an iron helmet.\");\n}", "description": "async function craftIronHelmet(bot) {\n    // The function is about crafting an iron helmet using a crafting table. First, place the crafting table near the bot. Then, craft an iron helmet using the crafting table and save it to the inventory.\n}"}, "craftChest": {"code": "async function craftChest(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);\n\n  // If not, craft oak planks from oak logs\n  if (oakPlanksCount < 8) {\n    const oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);\n    const planksToCraft = Math.ceil((8 - oakPlanksCount) / 4);\n    if (oakLogsCount >= planksToCraft) {\n      await craftItem(bot, \"oak_planks\", planksToCraft);\n      bot.chat(\"Crafted oak planks.\");\n    } else {\n      bot.chat(\"Not enough oak logs to craft oak planks.\");\n      return;\n    }\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a chest using the crafting table\n  await craftItem(bot, \"chest\", 1);\n  bot.chat(\"Crafted a chest.\");\n}", "description": "async function craftChest(bot) {\n    // The function crafts a chest using a crafting table and oak planks. If there are not enough oak planks in the inventory, it crafts oak planks from oak logs. Once there are enough oak planks, it places a crafting table near the bot and crafts a chest using the crafting table.\n}"}, "equipIronSword": {"code": "async function equipIronSword(bot) {\n  // Find the iron sword in the inventory\n  let ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);\n\n  // If the iron sword is not found in the inventory, check the chest\n  if (!ironSword) {\n    const chestPosition = new Vec3(89, 41, 206);\n    const itemsToGet = {\n      \"iron_sword\": 1\n    };\n    await getItemFromChest(bot, chestPosition, itemsToGet);\n    ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);\n  }\n\n  // Equip the iron sword\n  if (ironSword) {\n    await bot.equip(ironSword, \"hand\");\n    bot.chat(\"Equipped iron sword.\");\n  } else {\n    bot.chat(\"Iron sword not found in inventory or chest.\");\n  }\n}", "description": "async function equipIronSword(bot) {\n    // The function is about equipping an iron sword. It first checks if the iron sword is in the inventory. If not, it checks a chest for the iron sword. If the iron sword is found, it is equipped in the hand. If the iron sword is not found, a message is sent to the chat.\n}"}, "craftLightningRod": {"code": "async function findSuitablePosition(bot) {\n  const offsets = [new Vec3(1, 0, 0), new Vec3(-1, 0, 0), new Vec3(0, 0, 1), new Vec3(0, 0, -1)];\n  for (const offset of offsets) {\n    const position = bot.entity.position.offset(offset.x, offset.y, offset.z);\n    const block = bot.blockAt(position);\n    if (block.name === \"air\") {\n      return position;\n    }\n  }\n  return null;\n}\n\nasync function craftLightningRod(bot) {\n  // Find a suitable position to place the crafting table\n  const craftingTablePosition = await findSuitablePosition(bot);\n\n  // Place the crafting table at the found position\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Check if there are enough copper ingots in the inventory\n  const copperIngotsCount = bot.inventory.count(mcData.itemsByName.copper_ingot.id);\n\n  // If not enough copper ingots, mine copper ores and smelt them into copper ingots\n  if (copperIngotsCount < 3) {\n    await mineBlock(bot, \"copper_ore\", 3 - copperIngotsCount);\n    bot.chat(\"Collected copper ores.\");\n    await smeltItem(bot, \"copper_ore\", \"coal\", 3 - copperIngotsCount);\n    bot.chat(\"Smelted copper ores into copper ingots.\");\n  }\n\n  // Craft a lightning rod using the crafting table\n  await craftItem(bot, \"lightning_rod\", 1);\n  bot.chat(\"Crafted a lightning rod.\");\n}", "description": "async function craftLightningRod(bot) {\n    // The function is about crafting a lightning rod. It first finds a suitable position to place the crafting table and places it there. Then it checks if there are enough copper ingots in the inventory, and if not, it mines copper ores and smelts them into copper ingots. Finally, it crafts a lightning rod using the crafting table.\n}"}, "craftCopperBlock": {"code": "async function craftCopperBlock(bot) {\n  // Check if there are enough copper ingots in the inventory\n  const copperIngotsCount = bot.inventory.count(mcData.itemsByName.copper_ingot.id);\n\n  // If not enough copper ingots, mine copper ores and smelt them into copper ingots\n  if (copperIngotsCount < 9) {\n    await mineBlock(bot, \"copper_ore\", 9 - copperIngotsCount);\n    bot.chat(\"Collected copper ores.\");\n    await smeltItem(bot, \"copper_ore\", \"coal\", 9 - copperIngotsCount);\n    bot.chat(\"Smelted copper ores into copper ingots.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a copper block using the crafting table\n  await craftItem(bot, \"copper_block\", 1);\n  bot.chat(\"Crafted a copper block.\");\n}", "description": "async function craftCopperBlock(bot) {\n    // The function crafts a copper block using a crafting table. It first checks if there are enough copper ingots in the inventory, and if not, it mines copper ores and smelts them into copper ingots. Then it places a crafting table near the bot and crafts a copper block using the crafting table.\n}"}, "killOneSpider": {"code": "async function killOneSpider(bot) {\n  // Equip the iron sword\n  const ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);\n  await bot.equip(ironSword, \"hand\");\n\n  // Find the nearest spider\n  const spider = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const spider = bot.nearestEntity(entity => {\n      return entity.name === \"spider\" && entity.position.distanceTo(bot.entity.position) < 32;\n    });\n    return spider;\n  });\n  if (!spider) {\n    bot.chat(\"Could not find a spider.\");\n    return;\n  }\n\n  // Kill the spider using the iron sword\n  await killMob(bot, \"spider\", 300);\n  bot.chat(\"Killed a spider.\");\n\n  // Collect the dropped items\n  await bot.pathfinder.goto(new GoalBlock(spider.position.x, spider.position.y, spider.position.z));\n  bot.chat(\"Collected dropped items.\");\n}", "description": "async function killOneSpider(bot) {\n    // The function is about killing a spider using an iron sword. First, equip the iron sword in the hand. Then, explore the environment until finding the nearest spider within 32 blocks. Once a spider is found, kill it using the iron sword. After killing the spider, collect the dropped items by moving to the spider's position.\n}"}, "killOneZombie": {"code": "async function killOneZombie(bot) {\n  // Equip the iron sword\n  const ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);\n  await bot.equip(ironSword, \"hand\");\n\n  // Find the nearest zombie\n  const zombie = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const zombie = bot.nearestEntity(entity => {\n      return entity.name === \"zombie\" && entity.position.distanceTo(bot.entity.position) < 32;\n    });\n    return zombie;\n  });\n  if (!zombie) {\n    bot.chat(\"Could not find a zombie.\");\n    return;\n  }\n\n  // Kill the zombie using the iron sword\n  await killMob(bot, \"zombie\", 300);\n  bot.chat(\"Killed a zombie.\");\n\n  // Collect the dropped items\n  await bot.pathfinder.goto(new GoalBlock(zombie.position.x, zombie.position.y, zombie.position.z));\n  bot.chat(\"Collected dropped items.\");\n}", "description": "async function killOneZombie(bot) {\n    // The function is about killing a single zombie using an iron sword. First, equip the iron sword in the hand. Then, explore the environment until finding the nearest zombie within 32 blocks. Once a zombie is found, kill it using the iron sword and collect the dropped items.\n}"}, "craftIronLeggingsAndBoots": {"code": "async function craftIronLeggingsAndBoots(bot) {\n  // Check if there are enough iron ingots in the inventory\n  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);\n\n  // If not enough iron ingots, mine iron ores and smelt them into iron ingots\n  if (ironIngotsCount < 11) {\n    await mineBlock(bot, \"iron_ore\", 11 - ironIngotsCount);\n    bot.chat(\"Collected iron ores.\");\n    await smeltItem(bot, \"iron_ore\", \"coal\", 11 - ironIngotsCount);\n    bot.chat(\"Smelted iron ores into iron ingots.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft iron leggings using the crafting table\n  await craftItem(bot, \"iron_leggings\", 1);\n  bot.chat(\"Crafted iron leggings.\");\n\n  // Craft iron boots using the crafting table\n  await craftItem(bot, \"iron_boots\", 1);\n  bot.chat(\"Crafted iron boots.\");\n}", "description": "async function craftIronLeggingsAndBoots(bot) {\n    // The function crafts iron leggings and boots using a crafting table. If there are not enough iron ingots in the inventory, the bot mines iron ores and smelts them into iron ingots. Then, the bot places a crafting table near itself and crafts iron leggings and boots using the crafting table.\n}"}, "equipIronArmor": {"code": "async function equipIronArmor(bot) {\n  // Find the iron_leggings, iron_boots, and iron_helmet in the inventory\n  const ironLeggings = bot.inventory.findInventoryItem(mcData.itemsByName.iron_leggings.id);\n  const ironBoots = bot.inventory.findInventoryItem(mcData.itemsByName.iron_boots.id);\n  const ironHelmet = bot.inventory.findInventoryItem(mcData.itemsByName.iron_helmet.id);\n\n  // Equip the iron_leggings, iron_boots, and iron_helmet in the appropriate slots (legs, feet, and head)\n  if (ironLeggings) {\n    await bot.equip(ironLeggings, \"legs\");\n    bot.chat(\"Equipped iron leggings.\");\n  } else {\n    bot.chat(\"Iron leggings not found in inventory.\");\n  }\n  if (ironBoots) {\n    await bot.equip(ironBoots, \"feet\");\n    bot.chat(\"Equipped iron boots.\");\n  } else {\n    bot.chat(\"Iron boots not found in inventory.\");\n  }\n  if (ironHelmet) {\n    await bot.equip(ironHelmet, \"head\");\n    bot.chat(\"Equipped iron helmet.\");\n  } else {\n    bot.chat(\"Iron helmet not found in inventory.\");\n  }\n}", "description": "async function equipIronArmor(bot) {\n    // The function is about equipping iron armor (leggings, boots, and helmet) in the appropriate slots (legs, feet, and head) if they are available in the inventory. If any of the items are not found in the inventory, the function will output a message indicating that the item is not available.\n}"}, "craftShieldImproved": {"code": "async function craftShieldImproved(bot) {\n  // Check if there are enough oak planks in the inventory\n  let oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);\n\n  // If not, check if there are enough oak logs in the inventory\n  if (oakPlanksCount < 6) {\n    let oakLogsCount = bot.inventory.count(mcData.itemsByName.oak_log.id);\n    const planksToCraft = Math.ceil((6 - oakPlanksCount) / 4);\n\n    // If not, explore to find and mine oak logs\n    if (oakLogsCount < planksToCraft) {\n      await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n        const oak_log = bot.findBlock({\n          matching: mcData.blocksByName[\"oak_log\"].id,\n          maxDistance: 32\n        });\n        return oak_log;\n      });\n      await mineBlock(bot, \"oak_log\", planksToCraft - oakLogsCount);\n      bot.chat(\"Collected oak logs.\");\n    }\n\n    // Craft oak planks from oak logs\n    await craftItem(bot, \"oak_planks\", planksToCraft);\n    bot.chat(\"Crafted oak planks.\");\n    oakPlanksCount = bot.inventory.count(mcData.itemsByName.oak_planks.id);\n  }\n\n  // Check if there are enough iron ingots in the inventory\n  let ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);\n\n  // If not, explore to find and mine iron ores\n  if (ironIngotsCount < 1) {\n    await exploreUntil(bot, new Vec3(0, -1, 0), 60, () => {\n      const iron_ore = bot.findBlock({\n        matching: mcData.blocksByName[\"iron_ore\"].id,\n        maxDistance: 32\n      });\n      return iron_ore;\n    });\n    await mineBlock(bot, \"iron_ore\", 1);\n    bot.chat(\"Collected iron ores.\");\n\n    // Smelt iron ores into iron ingots\n    await smeltItem(bot, \"iron_ore\", \"coal\", 1);\n    bot.chat(\"Smelted iron ores into iron ingots.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a shield using the crafting table\n  await craftItem(bot, \"shield\", 1);\n  bot.chat(\"Crafted a shield.\");\n}", "description": "async function craftShieldImproved(bot) {\n    // The function crafts a shield using oak planks and iron ingots. It checks if there are enough oak planks and iron ingots in the inventory, and if not, it explores the environment to find and collect the required materials. It then places a crafting table near the bot and crafts a shield using the crafting table.\n}"}, "craftBucket": {"code": "async function craftBucket(bot) {\n  // Check if there are enough iron ingots in the inventory\n  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);\n\n  // If not enough iron ingots, mine iron ores and smelt them into iron ingots\n  if (ironIngotsCount < 3) {\n    await mineBlock(bot, \"iron_ore\", 3 - ironIngotsCount);\n    bot.chat(\"Collected iron ores.\");\n    await smeltItem(bot, \"iron_ore\", \"coal\", 3 - ironIngotsCount);\n    bot.chat(\"Smelted iron ores into iron ingots.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a bucket using the crafting table\n  await craftItem(bot, \"bucket\", 1);\n  bot.chat(\"Crafted a bucket.\");\n}", "description": "async function craftBucket(bot) {\n    // The function crafts a bucket using a crafting table. It first checks if there are enough iron ingots in the inventory, and if not, it mines iron ores and smelts them into iron ingots. Then, it places a crafting table near the bot and crafts a bucket using the crafting table.\n}"}, "fillBucketWithWater": {"code": "async function fillBucketWithWater(bot) {\n  // Find a water block nearby\n  const waterBlock = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const water = bot.findBlock({\n      matching: mcData.blocksByName.water.id,\n      maxDistance: 32,\n    });\n    return water;\n  });\n  if (!waterBlock) {\n    bot.chat(\"Could not find water.\");\n    return;\n  }\n\n  const adjacentBlock = waterBlock.position.offset(0, 1, 0);\n  // Go to the water block\n  await bot.pathfinder.goto(\n    new GoalGetToBlock(adjacentBlock.x, adjacentBlock.y, adjacentBlock.z)\n  );\n\n  // Equip the bucket\n  const bucket = bot.inventory.findInventoryItem(mcData.itemsByName.bucket.id);\n  await bot.equip(bucket, \"hand\");\n\n  // Look at the water block\n  await bot.lookAt(waterBlock.position);\n\n  // Activate the bucket to collect water\n  await bot.activateItem();\n  bot.chat(\"Filled the bucket with water.\");\n}\n", "description": "async function fillBucketWithWater(bot) {\n    // This function fills a bucket with water by first finding a nearby water block. After locating the water block, the bot moves to it and equips the bucket in its hand. The bot then looks at the water block and activates the bucket to collect water.\n}"}, "craftIronShovel": {"code": "async function craftIronShovel(bot) {\n  // Check if there are enough iron ingots and sticks in the inventory\n  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);\n  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);\n\n  // If not enough iron ingots or sticks, collect the required items\n  if (ironIngotsCount < 1) {\n    await mineBlock(bot, \"iron_ore\", 1);\n    bot.chat(\"Collected iron ore.\");\n    await smeltItem(bot, \"iron_ore\", \"coal\", 1);\n    bot.chat(\"Smelted iron ore into iron ingot.\");\n  }\n  if (sticksCount < 2) {\n    await craftItem(bot, \"stick\", 1);\n    bot.chat(\"Crafted sticks.\");\n  }\n\n  // Find a suitable position to place the crafting table\n  const suitablePosition = bot.entity.position.offset(1, 0, 0);\n  const block = bot.blockAt(suitablePosition);\n  if (block.name === \"grass_block\" || block.name === \"dirt\") {\n    await bot.dig(block);\n  }\n\n  // Place the crafting table at the suitable position\n  await placeItem(bot, \"crafting_table\", suitablePosition);\n\n  // Craft an iron shovel using the crafting table\n  await craftItem(bot, \"iron_shovel\", 1);\n  bot.chat(\"Crafted an iron shovel.\");\n}", "description": "async function craftIronShovel(bot) {\n    // The function crafts an iron shovel using a crafting table. It checks if there are enough iron ingots and sticks in the inventory, and if not, collects the required items. It finds a suitable position to place the crafting table and places it there. Then, it crafts an iron shovel using the crafting table.\n}"}, "obtainOneMoreAcaciaLog": {"code": "async function obtainOneMoreAcaciaLog(bot) {\n  // Check the initial inventory for acacia logs\n  const initialAcaciaLogs = bot.inventory.count(mcData.itemsByName.acacia_log.id);\n\n  // If the number of acacia logs is less than 5, find and mine one more acacia log\n  if (initialAcaciaLogs < 5) {\n    const acaciaLog = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n      return bot.findBlock({\n        matching: block => block.name === \"acacia_log\",\n        maxDistance: 32\n      });\n    });\n    if (!acaciaLog) {\n      bot.chat(\"Could not find an acacia log.\");\n      return;\n    }\n    await mineBlock(bot, \"acacia_log\", 1);\n    bot.chat(\"1 more acacia log obtained.\");\n  }\n\n  // Check the final number of acacia logs in the inventory\n  const finalAcaciaLogs = bot.inventory.count(mcData.itemsByName.acacia_log.id);\n  if (finalAcaciaLogs >= 5) {\n    bot.chat(\"Successfully obtained 5 acacia logs.\");\n  } else {\n    bot.chat(\"Failed to obtain 5 acacia logs.\");\n  }\n}", "description": "async function obtainOneMoreAcaciaLog(bot) {\n    // The function checks if there are less than 5 acacia logs in the inventory, and if so, finds and mines one more acacia log. If the bot successfully obtains 5 acacia logs, it sends a success message, otherwise it sends a failure message.\n}"}, "craftAcaciaPlanksAndSticks": {"code": "async function craftAcaciaPlanksAndSticks(bot) {\n  // Check if there are enough acacia logs in the inventory\n  const acaciaLogsCount = bot.inventory.count(mcData.itemsByName.acacia_log.id);\n\n  // If not, mine more acacia logs\n  if (acaciaLogsCount < 5) {\n    await mineBlock(bot, \"acacia_log\", 5 - acaciaLogsCount);\n    bot.chat(\"Mined acacia logs.\");\n  }\n\n  // Craft 20 acacia planks from acacia logs\n  await craftItem(bot, \"acacia_planks\", 5);\n  bot.chat(\"Crafted 20 acacia planks.\");\n\n  // Check if there are enough acacia planks in the inventory to craft 10 sticks\n  const acaciaPlanksCount = bot.inventory.count(mcData.itemsByName.acacia_planks.id);\n\n  // If not, mine more acacia logs and craft more acacia planks\n  if (acaciaPlanksCount < 5) {\n    await mineBlock(bot, \"acacia_log\", 5 - acaciaLogsCount);\n    bot.chat(\"Mined more acacia logs.\");\n    await craftItem(bot, \"acacia_planks\", 5 - acaciaPlanksCount);\n    bot.chat(\"Crafted more acacia planks.\");\n  }\n\n  // Craft 10 sticks from acacia planks\n  await craftItem(bot, \"stick\", 3);\n  bot.chat(\"Crafted 10 sticks.\");\n}", "description": "async function craftAcaciaPlanksAndSticks(bot) {\n    // The function is about crafting 20 acacia planks and 10 sticks. It checks if there are enough acacia logs in the inventory, and if not, it mines more acacia logs. Then it crafts 20 acacia planks from the acacia logs. If there are not enough acacia planks in the inventory to craft 10 sticks, it mines more acacia logs and crafts more acacia planks. Finally, it crafts 10 sticks from the acacia planks.\n}"}, "eatTwoCookedMutton": {"code": "async function eatTwoCookedMutton(bot) {\n  // Check if there are 2 cooked mutton in the inventory\n  const cookedMutton = bot.inventory.findInventoryItem(mcData.itemsByName.cooked_mutton.id);\n  if (!cookedMutton || cookedMutton.count < 2) {\n    bot.chat(\"Not enough cooked mutton in the inventory.\");\n    return;\n  }\n\n  // Equip the cooked mutton in the bot's hand\n  await bot.equip(cookedMutton, \"hand\");\n\n  // Consume the cooked mutton twice\n  await bot.consume();\n  await bot.consume();\n\n  // Send a chat message to indicate the task is completed\n  bot.chat(\"Ate 2 cooked mutton.\");\n}", "description": "async function eatTwoCookedMutton(bot) {\n    // The function is about eating two cooked muttons. It checks if there are at least 2 cooked muttons in the inventory, and if not, it returns. If there are 2 or more cooked muttons, it equips one in the bot's hand and consumes it twice. Finally, it sends a chat message to indicate that the task is completed.\n}"}, "collectBamboo": {"code": "async function collectBamboo(bot) {\n  // Equip the iron sword\n  const ironSword = bot.inventory.findInventoryItem(mcData.itemsByName.iron_sword.id);\n  await bot.equip(ironSword, \"hand\");\n\n  // Find bamboo plants using the exploreUntil function\n  const bambooPlants = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const bambooPlants = bot.findBlocks({\n      matching: block => block.name === \"bamboo\",\n      maxDistance: 32,\n      count: 10\n    });\n    return bambooPlants.length >= 10 ? bambooPlants : null;\n  });\n  if (!bambooPlants) {\n    bot.chat(\"Could not find enough bamboo plants.\");\n    return;\n  }\n\n  // Break 10 bamboo plants using the iron sword\n  for (const bambooPlant of bambooPlants) {\n    const block = bot.blockAt(bambooPlant);\n    await bot.dig(block);\n  }\n  bot.chat(\"Broke 10 bamboo plants.\");\n\n  // Collect the dropped bamboo items\n  for (const bambooPlant of bambooPlants) {\n    await bot.pathfinder.goto(new GoalBlock(bambooPlant.x, bambooPlant.y, bambooPlant.z));\n  }\n  bot.chat(\"Collected 10 bamboo.\");\n}", "description": "async function collectBamboo(bot) {\n    // The function is about collecting 10 bamboo plants. It equips the iron sword and uses the `exploreUntil` function to find 10 bamboo plants within a certain distance. If enough bamboo plants are found, it breaks them using the iron sword and collects the dropped bamboo items by moving to their location. If not enough bamboo plants are found, it returns an error message.\n}"}, "craftScaffolding": {"code": "async function craftScaffolding(bot) {\n  // Check if we have a crafting table in the inventory\n  const craftingTableCount = bot.inventory.count(mcData.itemsByName.crafting_table.id);\n\n  // If not, craft a crafting table\n  if (craftingTableCount === 0) {\n    await craftItem(bot, \"crafting_table\", 1);\n    bot.chat(\"Crafted a crafting table.\");\n  }\n\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft 10 scaffolding using the crafting table\n  await craftItem(bot, \"scaffolding\", 1);\n  bot.chat(\"Crafted 10 scaffolding.\");\n}", "description": "async function craftScaffolding(bot) {\n    // The function is about crafting 10 scaffolding using a crafting table. First, it checks if there is a crafting table in the inventory. If not, it crafts one. Then, it places the crafting table near the bot. After that, it crafts 10 scaffolding using the crafting table and saves the event.\n}"}, "collectFiveCactusBlocks": {"code": "async function collectFiveCactusBlocks(bot) {\n  // Equip the iron pickaxe\n  const ironPickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.iron_pickaxe.id);\n  await bot.equip(ironPickaxe, \"hand\");\n\n  // Find 5 cactus blocks using the exploreUntil function\n  const cactusBlocks = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {\n    const cactusBlocks = bot.findBlocks({\n      matching: block => block.name === \"cactus\",\n      maxDistance: 32,\n      count: 5\n    });\n    return cactusBlocks.length >= 5 ? cactusBlocks : null;\n  });\n  if (!cactusBlocks) {\n    bot.chat(\"Could not find enough cactus blocks.\");\n    return;\n  }\n\n  // Mine the 5 cactus blocks using the mineBlock function\n  await mineBlock(bot, \"cactus\", 5);\n  bot.chat(\"5 cactus blocks mined.\");\n\n  // Collect the dropped cactus items\n  for (const cactusBlock of cactusBlocks) {\n    await bot.pathfinder.goto(new GoalBlock(cactusBlock.x, cactusBlock.y, cactusBlock.z));\n  }\n  bot.chat(\"Collected 5 cactus blocks.\");\n}", "description": "async function collectFiveCactusBlocks(bot) {\n    // The function is about collecting 5 cactus blocks using an iron pickaxe. First, equip the iron pickaxe in the hand. Next, explore the environment until finding 5 cactus blocks using the `exploreUntil` function. If 5 cactus blocks are not found, return. Otherwise, mine the 5 cactus blocks using the `mineBlock` function. Finally, collect the dropped cactus items by moving to each block's location.\n}"}, "smeltCactusIntoGreenDye": {"code": "async function smeltCactusIntoGreenDye(bot) {\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);\n\n  // If not, craft a furnace using the available cobblestone\n  if (!furnaceItem) {\n    await craftFurnace(bot);\n  }\n\n  // Find a suitable position to place the furnace\n  const furnacePosition = await findSuitablePosition(bot);\n  if (!furnacePosition) {\n    bot.chat(\"Could not find a suitable position to place the furnace.\");\n    return;\n  }\n\n  // Place the furnace at the suitable position\n  await placeItem(bot, \"furnace\", furnacePosition);\n\n  // Smelt 5 cactus using the available coal as fuel\n  await smeltItem(bot, \"cactus\", \"coal\", 5);\n  bot.chat(\"5 cactus smelted into green dye.\");\n}", "description": "async function smeltCactusIntoGreenDye(bot) {\n    // The function is about smelting 5 cactus into green dye using a furnace and coal as fuel. It checks if there is a furnace in the inventory, and if not, it crafts one. Then it finds a suitable position to place the furnace and places it there. Finally, it smelts the cactus using coal as fuel and saves the event of smelting 5 cactus into green dye.\n}"}, "craftShears": {"code": "async function craftShears(bot) {\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity.position.offset(1, 0, 0);\n  await placeItem(bot, \"crafting_table\", craftingTablePosition);\n\n  // Craft a pair of shears using the crafting table\n  await craftItem(bot, \"shears\", 1);\n  bot.chat(\"Crafted a pair of shears.\");\n}", "description": "async function craftShears(bot) {\n    // The function is about crafting a pair of shears. First, place a crafting table near the bot. Then, craft a pair of shears using the crafting table. Finally, the bot will chat that it has crafted a pair of shears.\n}"}}

================================================
FILE: skill_library/trial2/skill/code/catchFiveFishSafely.js
================================================
async function catchFiveFishSafely(bot) {
  // Check if the bot has a fishing rod in its inventory
  let fishingRod = bot.inventory.findInventoryItem(mcData.itemsByName.fishing_rod.id);
  if (!fishingRod) {
    await craftFishingRod(bot);
    fishingRod = bot.inventory.findInventoryItem(mcData.itemsByName.fishing_rod.id);
  }

  // Find a nearby water block
  let waterBlock;
  while (!waterBlock) {
    waterBlock = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
      const foundWaterBlock = bot.findBlock({
        matching: mcData.blocksByName.water.id,
        maxDistance: 32
      });
      return foundWaterBlock;
    });
    if (!waterBlock) {
      bot.chat("No path to the water block. Trying to find another water block...");
    }
  }

  // Move to a block adjacent to the water block
  const adjacentBlock = waterBlock.position.offset(0, 1, 0);
  await bot.pathfinder.goto(new GoalBlock(adjacentBlock.x, adjacentBlock.y, adjacentBlock.z));

  // Look at the water block
  await bot.lookAt(waterBlock.position);

  // Equip the fishing rod
  await bot.equip(fishingRod, "hand");

  // Fish in the water 5 times
  for (let i = 0; i < 5; i++) {
    try {
      await bot.fish();
      bot.chat(`Fish ${i + 1} caught.`);
    } catch (error) {
      if (error.message === "Fishing cancelled") {
        bot.chat("Fishing was cancelled. Trying again...");
        i--; // Retry the same iteration
      } else {
        throw error;
      }
    }
  }
}

================================================
FILE: skill_library/trial2/skill/code/catchThreeFish.js
================================================
async function catchThreeFish(bot) {
  // Check if the bot has a fishing rod in its inventory
  let fishingRod = bot.inventory.findInventoryItem(mcData.itemsByName.fishing_rod.id);
  if (!fishingRod) {
    await craftFishingRod(bot);
    fishingRod = bot.inventory.findInventoryItem(mcData.itemsByName.fishing_rod.id);
  }

  // Find a nearby water block
  let waterBlock;
  while (!waterBlock) {
    waterBlock = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
      const foundWaterBlock = bot.findBlock({
        matching: mcData.blocksByName.water.id,
        maxDistance: 32
      });
      return foundWaterBlock;
    });
    if (!waterBlock) {
      bot.chat("No path to the water block. Trying to find another water block...");
    }
  }

  // Move to a block adjacent to the water block
  const adjacentBlock = waterBlock.position.offset(0, 1, 0);
  await bot.pathfinder.goto(new GoalBlock(adjacentBlock.x, adjacentBlock.y, adjacentBlock.z));

  // Look at the water block
  await bot.lookAt(waterBlock.position);

  // Equip the fishing rod
  await bot.equip(fishingRod, "hand");

  // Fish in the water 3 times
  for (let i = 0; i < 3; i++) {
    try {
      await bot.fish();
      bot.chat(`Fish ${i + 1} caught.`);
    } catch (error) {
      if (error.message === "Fishing cancelled") {
        bot.chat("Fishing was cancelled. Trying again...");
        i--; // Retry the same iteration
      } else {
        throw error;
      }
    }
  }
}

================================================
FILE: skill_library/trial2/skill/code/checkStonePickaxe.js
================================================
async function checkStonePickaxe(bot) {
  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_pickaxe.id);
  if (stonePickaxe) {
    bot.chat("The bot already has a stone pickaxe in its inventory.");
  } else {
    bot.chat("The bot does not have a stone pickaxe in its inventory.");
  }
}

================================================
FILE: skill_library/trial2/skill/code/chopDownSpruceLogs.js
================================================
async function chopDownSpruceLogs(bot) {
  const spruceLogCount = bot.inventory.count(mcData.itemsByName.spruce_log.id);
  const logsToMine = 5 - spruceLogCount;
  if (logsToMine > 0) {
    bot.chat("Chopping down spruce logs...");
    await mineBlock(bot, "spruce_log", logsToMine);
    bot.chat("Chopped down 5 spruce logs.");
  } else {
    bot.chat("Already have 5 spruce logs in inventory.");
  }
}

================================================
FILE: skill_library/trial2/skill/code/chopDownSpruceLogsV2.js
================================================
async function chopDownSpruceLogs(bot) {
  const spruceLogCount = bot.inventory.count(mcData.itemsByName.spruce_log.id);
  const logsToMine = 5 - spruceLogCount;
  if (logsToMine > 0) {
    bot.chat("Chopping down spruce logs...");
    await mineBlock(bot, "spruce_log", logsToMine);
    bot.chat("Chopped down 5 spruce logs.");
  } else {
    bot.chat("Already have 5 spruce logs in inventory.");
  }
}

================================================
FILE: skill_library/trial2/skill/code/chopSpruceLogs.js
================================================
async function chopSpruceLogs(bot) {
  const spruceLogCount = bot.inventory.count(mcData.itemsByName.spruce_log.id);
  const logsToMine = 3 - spruceLogCount;
  if (logsToMine > 0) {
    bot.chat("Chopping down spruce logs...");
    await mineBlock(bot, "spruce_log", logsToMine);
    bot.chat("Chopped down 3 spruce logs.");
  } else {
    bot.chat("Already have 3 spruce logs in inventory.");
  }
}

================================================
FILE: skill_library/trial2/skill/code/collectWaterWithBucket.js
================================================
async function collectWaterWithBucket(bot) {
  const waterBlock = bot.findBlock({
    matching: mcData.blocksByName.water.id,
    maxDistance: 32
  });
  if (!waterBlock) {
    bot.chat("No water block found nearby. Exploring...");
    await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
      const foundWaterBlock = bot.findBlock({
        matching: mcData.blocksByName.water.id,
        maxDistance: 32
      });
      return foundWaterBlock;
    });
  }
  const bucket = bot.inventory.findInventoryItem(mcData.itemsByName.bucket.id);
  await bot.equip(bucket, "hand");
  await bot.lookAt(waterBlock.position);
  await bot.activateItem();
  bot.chat("Water collected with bucket.");
}

================================================
FILE: skill_library/trial2/skill/code/cookMutton.js
================================================
async function cookMutton(bot) {
  const rawMuttonCount = bot.inventory.count(mcData.itemsByName.mutton.id);
  if (rawMuttonCount < 5) {
    bot.chat("Not enough raw mutton to cook. Please collect more first.");
    return;
  }
  const furnaceInInventory = bot.inventory.findInventoryItem(mcData.itemsByName.furnace.id);
  if (!furnaceInInventory) {
    bot.chat("No furnace found in inventory. Please craft one first.");
    return;
  }
  let furnacePosition = bot.entity.position.offset(1, 0, 0);
  const blockAtFurnacePosition = bot.blockAt(furnacePosition);
  if (blockAtFurnacePosition.name === "coal_ore") {
    furnacePosition = bot.entity.position.offset(-1, 0, 0);
  }
  await placeItem(bot, "furnace", furnacePosition);
  bot.chat("Furnace placed.");
  const requiredCoal = 5;
  const coalCount = bot.inventory.count(mcData.itemsByName.coal.id);
  if (coalCount < requiredCoal) {
    bot.chat("Not enough coal. Mining more coal...");
    await mineBlock(bot, "coal_ore", requiredCoal - coalCount);
  }
  await smeltItem(bot, "mutton", "coal", 5);
  bot.chat("5 mutton cooked.");
}

================================================
FILE: skill_library/trial2/skill/code/craftBucket.js
================================================
async function craftBucket(bot) {
  const requiredIronIngots = 3;
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  if (ironIngotsCount < requiredIronIngots) {
    bot.chat("Not enough iron ingots to craft a bucket.");
    return;
  }
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }
  await craftItem(bot, "bucket", 1);
  bot.chat("Bucket crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftChest.js
================================================
async function craftChest(bot) {
  const requiredPlanks = 8;
  const planksCount = bot.inventory.count(mcData.itemsByName.spruce_planks.id);
  if (planksCount < requiredPlanks) {
    bot.chat("Not enough spruce_planks. Mining a spruce_log and crafting more...");
    await mineBlock(bot, "spruce_log", 1);
    await craftItem(bot, "spruce_planks", 1);
    bot.chat("Spruce_planks crafted.");
  }
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }
  bot.chat("Crafting a chest...");
  await craftItem(bot, "chest", 1);
  bot.chat("Chest crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftEightSticks.js
================================================
async function craftEightSticks(bot) {
  const requiredPlanks = 2;
  const planksCount = bot.inventory.count(mcData.itemsByName.spruce_planks.id);
  if (planksCount < requiredPlanks) {
    bot.chat("Not enough spruce_planks. Mining a spruce_log and crafting more...");
    await mineBlock(bot, "spruce_log", 1);
    await craftItem(bot, "spruce_planks", 1);
    bot.chat("Spruce_planks crafted.");
  }
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }
  await craftItem(bot, "stick", 2);
  bot.chat("8 sticks crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftEightTorches.js
================================================
async function craftEightTorches(bot) {
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }
  await craftItem(bot, "torch", 1);
  bot.chat("8 torches crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftFishingRod.js
================================================
async function craftFishingRod(bot) {
  // Check if we have enough strings
  const requiredStrings = 2;
  const stringsCount = bot.inventory.count(mcData.itemsByName.string.id);
  if (stringsCount < requiredStrings) {
    // Find and kill spiders to obtain strings
    while (bot.inventory.count(mcData.itemsByName.string.id) < requiredStrings) {
      bot.chat("Finding a spider to obtain strings...");
      const spider = await exploreUntil(bot, new Vec3(1, 0, 1), 60, () => {
        const spider = bot.nearestEntity(entity => {
          return entity.name === "spider" && entity.position.distanceTo(bot.entity.position) < 32;
        });
        return spider;
      });
      if (spider) {
        bot.chat("Spider found. Killing it...");
        await killMob(bot, "spider", 300);
        bot.chat("Spider killed.");
      } else {
        bot.chat("Could not find a spider. Trying again...");
      }
    }
  }

  // Place a crafting table if not already placed
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }

  // Craft a fishing rod using the 3 sticks and 2 strings
  await craftItem(bot, "fishing_rod", 1);
  bot.chat("Fishing rod crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftFurnace.js
================================================
async function craftFurnace(bot) {
  const requiredCobblestones = 8;
  const cobblestoneCount = bot.inventory.count(mcData.itemsByName.cobblestone.id);
  if (cobblestoneCount < requiredCobblestones) {
    bot.chat("Not enough cobblestones to craft a furnace.");
    return;
  }
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }
  await craftItem(bot, "furnace", 1);
  bot.chat("Furnace crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftIronChestplate.js
================================================
async function craftIronChestplate(bot) {
  const requiredIronIngots = 8;
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  if (ironIngotsCount < requiredIronIngots) {
    bot.chat("Not enough iron ingots. Mining iron ores...");
    await mineBlock(bot, "iron_ore", requiredIronIngots - ironIngotsCount);
    bot.chat("Iron ores mined. Smelting iron ingots...");
    await smeltItem(bot, "iron_ore", "coal", requiredIronIngots - ironIngotsCount);
    bot.chat("Iron ingots smelted.");
  }
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }
  await craftItem(bot, "iron_chestplate", 1);
  bot.chat("Iron chestplate crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftIronHelmet.js
================================================
async function craftIronHelmet(bot) {
  const requiredIronIngots = 5;
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  if (ironIngotsCount < requiredIronIngots) {
    bot.chat("Not enough iron ingots to craft an iron helmet.");
    return;
  }
  let craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
    // Update the craftingTable variable after placing it
    craftingTable = bot.blockAt(craftingTablePosition);
  }
  await craftItem(bot, "iron_helmet", 1);
  bot.chat("Iron helmet crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftIronLeggingsAndBoots.js
================================================
async function craftIronLeggingsAndBoots(bot) {
  const requiredIronIngots = 11; // 7 for leggings, 4 for boots
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  if (ironIngotsCount < requiredIronIngots) {
    bot.chat("Not enough iron ingots. Mining iron ores...");
    await mineBlock(bot, "iron_ore", requiredIronIngots - ironIngotsCount);
    bot.chat("Iron ores mined. Smelting iron ingots...");
    await smeltItem(bot, "iron_ore", "coal", requiredIronIngots - ironIngotsCount);
    bot.chat("Iron ingots smelted.");
  }
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }
  await craftItem(bot, "iron_leggings", 1);
  bot.chat("Iron leggings crafted.");
  await craftItem(bot, "iron_boots", 1);
  bot.chat("Iron boots crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftIronPickaxe.js
================================================
async function craftIronPickaxe(bot) {
  const requiredIronIngots = 3;
  const requiredSticks = 2;
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);
  if (ironIngotsCount < requiredIronIngots || sticksCount < requiredSticks) {
    bot.chat("Not enough iron ingots or sticks to craft an iron pickaxe.");
    return;
  }
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }
  await craftItem(bot, "iron_pickaxe", 1);
  bot.chat("Iron pickaxe crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftIronPickaxeWithMaterials.js
================================================
async function craftIronPickaxeWithMaterials(bot) {
  const requiredIronIngots = 3;
  const requiredSticks = 2;
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);
  if (ironIngotsCount < requiredIronIngots) {
    bot.chat("Not enough iron ingots. Mining iron ores...");
    await mineBlock(bot, "iron_ore", requiredIronIngots - ironIngotsCount);
    bot.chat("Iron ores mined. Smelting iron ingots...");
    await smeltItem(bot, "iron_ore", "coal", requiredIronIngots - ironIngotsCount);
    bot.chat("Iron ingots smelted.");
  }
  if (sticksCount < requiredSticks) {
    bot.chat("Not enough sticks. Crafting more...");
    await craftItem(bot, "stick", requiredSticks - sticksCount);
    bot.chat("Sticks crafted.");
  }
  const craftingTable = bot.findBlock({
    matching: mcData.blocksByName.crafting_table.id,
    maxDistance: 32
  });
  if (!craftingTable) {
    const craftingTablePosition = bot.entity.position.offset(1, 0, 0);
    await placeItem(bot, "crafting_table", craftingTablePosition);
    bot.chat("Crafting_table placed.");
  }
  await craftItem(bot, "iron_pickaxe", 1);
  bot.chat("Iron pickaxe crafted.");
}

================================================
FILE: skill_library/trial2/skill/code/craftIronSword.js
================================================
async function craftIronSword(bot) {
  const requiredIronIngots = 2;
  const requiredSticks = 1;
  const ironIngotsCount = bot.inventory.count(mcData.itemsByName.iron_ingot.id);
  const sticksCount = bot.inventory.count(mcData.itemsByName.stick.id);
  if (ironIngotsCount < requiredIronIngots) {
    bot.chat("Not enough iron ingots. Mining iron ores...");
    await mineBlock(bot, "iron_ore", requiredIronIngots - ironIngotsCount);
    bot.chat("Iron ores mined. Smelting iron ingots...");
    await smeltItem(bot, "iron_ore", "coal", requiredIronIngots - ironIngotsCount);
    bot.chat("Iron ingots smelted.");
  }
  if (sticksCount < requiredSticks) {
    bot.chat("Not enough sticks. Crafting more...");
    await craftItem(bot, "stick", requiredSticks - sticksCount);
    bot.chat("Sticks crafted.");
  }
  const craftingTable = bot.fin
Download .txt
gitextract_fq_ns2xz/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── voyager-issue-template.md
│   └── workflows/
│       └── close_issue.yml
├── .gitignore
├── FAQ.md
├── LICENSE
├── README.md
├── installation/
│   ├── fabric_mods_install.md
│   └── minecraft_instance_install.md
├── requirements.txt
├── setup.py
├── skill_library/
│   ├── README.md
│   ├── trial1/
│   │   └── skill/
│   │       ├── code/
│   │       │   ├── collectBamboo.js
│   │       │   ├── collectFiveCactusBlocks.js
│   │       │   ├── cookPorkchops.js
│   │       │   ├── cookSevenMutton.js
│   │       │   ├── craftAcaciaPlanksAndSticks.js
│   │       │   ├── craftBucket.js
│   │       │   ├── craftChest.js
│   │       │   ├── craftCopperBlock.js
│   │       │   ├── craftCraftingTable.js
│   │       │   ├── craftFurnace.js
│   │       │   ├── craftIronAxe.js
│   │       │   ├── craftIronChestplate.js
│   │       │   ├── craftIronHelmet.js
│   │       │   ├── craftIronHelmetV2.js
│   │       │   ├── craftIronLeggingsAndBoots.js
│   │       │   ├── craftIronPickaxe.js
│   │       │   ├── craftIronPickaxeV2.js
│   │       │   ├── craftIronShovel.js
│   │       │   ├── craftIronSword.js
│   │       │   ├── craftLightningRod.js
│   │       │   ├── craftOakPlanksAndSticks.js
│   │       │   ├── craftScaffolding.js
│   │       │   ├── craftShears.js
│   │       │   ├── craftShieldImproved.js
│   │       │   ├── craftStonePickaxe.js
│   │       │   ├── craftStoneShovel.js
│   │       │   ├── craftWhiteBed.js
│   │       │   ├── craftWoodenHoe.js
│   │       │   ├── craftWoodenPickaxe.js
│   │       │   ├── craftWoodenSword.js
│   │       │   ├── eatCookedPorkchop.js
│   │       │   ├── eatTwoCookedMutton.js
│   │       │   ├── equipIronArmor.js
│   │       │   ├── equipIronChestplate.js
│   │       │   ├── equipIronSword.js
│   │       │   ├── fillBucketWithWater.js
│   │       │   ├── killFourSheep.js
│   │       │   ├── killOneEnderman.js
│   │       │   ├── killOnePig.js
│   │       │   ├── killOneSpider.js
│   │       │   ├── killOneZombie.js
│   │       │   ├── killTwoPigs.js
│   │       │   ├── mineFiveCoalOres.js
│   │       │   ├── mineFiveCoalOresV2.js
│   │       │   ├── mineFiveCopperOres.js
│   │       │   ├── mineFiveCopperOresV2.js
│   │       │   ├── mineFiveIronOres.js
│   │       │   ├── mineFiveIronOresV2.js
│   │       │   ├── mineFiveLapisLazuliOres.js
│   │       │   ├── mineTenCobblestone.js
│   │       │   ├── mineThreeMoreOakLogs.js
│   │       │   ├── mineWoodLog.js
│   │       │   ├── obtainOneMoreAcaciaLog.js
│   │       │   ├── smeltCactusIntoGreenDye.js
│   │       │   ├── smeltFiveRawIron.js
│   │       │   ├── smeltFiveRawIronV2.js
│   │       │   └── smeltRawCopper.js
│   │       ├── description/
│   │       │   ├── collectBamboo.txt
│   │       │   ├── collectFiveCactusBlocks.txt
│   │       │   ├── cookPorkchops.txt
│   │       │   ├── cookSevenMutton.txt
│   │       │   ├── craftAcaciaPlanksAndSticks.txt
│   │       │   ├── craftBucket.txt
│   │       │   ├── craftChest.txt
│   │       │   ├── craftCopperBlock.txt
│   │       │   ├── craftCraftingTable.txt
│   │       │   ├── craftFurnace.txt
│   │       │   ├── craftIronAxe.txt
│   │       │   ├── craftIronChestplate.txt
│   │       │   ├── craftIronHelmet.txt
│   │       │   ├── craftIronHelmetV2.txt
│   │       │   ├── craftIronLeggingsAndBoots.txt
│   │       │   ├── craftIronPickaxe.txt
│   │       │   ├── craftIronPickaxeV2.txt
│   │       │   ├── craftIronShovel.txt
│   │       │   ├── craftIronSword.txt
│   │       │   ├── craftLightningRod.txt
│   │       │   ├── craftOakPlanksAndSticks.txt
│   │       │   ├── craftScaffolding.txt
│   │       │   ├── craftShears.txt
│   │       │   ├── craftShieldImproved.txt
│   │       │   ├── craftStonePickaxe.txt
│   │       │   ├── craftStoneShovel.txt
│   │       │   ├── craftWhiteBed.txt
│   │       │   ├── craftWoodenHoe.txt
│   │       │   ├── craftWoodenPickaxe.txt
│   │       │   ├── craftWoodenSword.txt
│   │       │   ├── eatCookedPorkchop.txt
│   │       │   ├── eatTwoCookedMutton.txt
│   │       │   ├── equipIronArmor.txt
│   │       │   ├── equipIronChestplate.txt
│   │       │   ├── equipIronSword.txt
│   │       │   ├── fillBucketWithWater.txt
│   │       │   ├── killFourSheep.txt
│   │       │   ├── killOneEnderman.txt
│   │       │   ├── killOnePig.txt
│   │       │   ├── killOneSpider.txt
│   │       │   ├── killOneZombie.txt
│   │       │   ├── killTwoPigs.txt
│   │       │   ├── mineFiveCoalOres.txt
│   │       │   ├── mineFiveCoalOresV2.txt
│   │       │   ├── mineFiveCopperOres.txt
│   │       │   ├── mineFiveCopperOresV2.txt
│   │       │   ├── mineFiveIronOres.txt
│   │       │   ├── mineFiveIronOresV2.txt
│   │       │   ├── mineFiveLapisLazuliOres.txt
│   │       │   ├── mineTenCobblestone.txt
│   │       │   ├── mineThreeMoreOakLogs.txt
│   │       │   ├── mineWoodLog.txt
│   │       │   ├── obtainOneMoreAcaciaLog.txt
│   │       │   ├── smeltCactusIntoGreenDye.txt
│   │       │   ├── smeltFiveRawIron.txt
│   │       │   ├── smeltFiveRawIronV2.txt
│   │       │   └── smeltRawCopper.txt
│   │       ├── skills.json
│   │       └── vectordb/
│   │           ├── chroma-collections.parquet
│   │           ├── chroma-embeddings.parquet
│   │           └── index/
│   │               ├── id_to_uuid_e1bd933d-d62f-46c2-884d-d75ef3bcb09e.pkl
│   │               ├── index_metadata_e1bd933d-d62f-46c2-884d-d75ef3bcb09e.pkl
│   │               └── uuid_to_id_e1bd933d-d62f-46c2-884d-d75ef3bcb09e.pkl
│   ├── trial2/
│   │   └── skill/
│   │       ├── code/
│   │       │   ├── catchFiveFishSafely.js
│   │       │   ├── catchThreeFish.js
│   │       │   ├── checkStonePickaxe.js
│   │       │   ├── chopDownSpruceLogs.js
│   │       │   ├── chopDownSpruceLogsV2.js
│   │       │   ├── chopSpruceLogs.js
│   │       │   ├── collectWaterWithBucket.js
│   │       │   ├── cookMutton.js
│   │       │   ├── craftBucket.js
│   │       │   ├── craftChest.js
│   │       │   ├── craftEightSticks.js
│   │       │   ├── craftEightTorches.js
│   │       │   ├── craftFishingRod.js
│   │       │   ├── craftFurnace.js
│   │       │   ├── craftIronChestplate.js
│   │       │   ├── craftIronHelmet.js
│   │       │   ├── craftIronLeggingsAndBoots.js
│   │       │   ├── craftIronPickaxe.js
│   │       │   ├── craftIronPickaxeWithMaterials.js
│   │       │   ├── craftIronSword.js
│   │       │   ├── craftShieldWithFurnace.js
│   │       │   ├── craftSixteenTorches.js
│   │       │   ├── craftSpyglass.js
│   │       │   ├── craftSticks.js
│   │       │   ├── craftStoneAxe.js
│   │       │   ├── craftStoneHoe.js
│   │       │   ├── craftStonePickaxe.js
│   │       │   ├── craftStoneShovel.js
│   │       │   ├── craftStoneSword.js
│   │       │   ├── craftTorches.js
│   │       │   ├── craftTwentySprucePlanks.js
│   │       │   ├── craftWhiteBedWithExploration.js
│   │       │   ├── craftWoodenHoe.js
│   │       │   ├── craftWoodenPickaxe.js
│   │       │   ├── craftWoodenPlanks.js
│   │       │   ├── eatCookedMutton.js
│   │       │   ├── eatCookedMuttonV2.js
│   │       │   ├── eatCookedMuttonV3.js
│   │       │   ├── equipIronArmor.js
│   │       │   ├── exploreCave.js
│   │       │   ├── exploreCaveAndGatherResources.js
│   │       │   ├── exploreCaveAndGatherResourcesV2.js
│   │       │   ├── fishInNearbyWaterSafely.js
│   │       │   ├── mineCoalOre.js
│   │       │   ├── mineCopperOreWithStonePickaxe.js
│   │       │   ├── mineFiveCoalOres.js
│   │       │   ├── mineFiveCoalOresV2.js
│   │       │   ├── mineFiveCopperOres.js
│   │       │   ├── mineFiveIronOres.js
│   │       │   ├── mineLapisOre.js
│   │       │   ├── mineThreeIronOres.js
│   │       │   ├── mineWoodLog.js
│   │       │   ├── smeltOneRawIron.js
│   │       │   ├── smeltRawCopper.js
│   │       │   ├── smeltRawIron.js
│   │       │   ├── smeltSixRawIron.js
│   │       │   └── smeltTwentyFiveIronIngots.js
│   │       ├── description/
│   │       │   ├── catchFiveFishSafely.txt
│   │       │   ├── catchThreeFish.txt
│   │       │   ├── checkStonePickaxe.txt
│   │       │   ├── chopDownSpruceLogs.txt
│   │       │   ├── chopDownSpruceLogsV2.txt
│   │       │   ├── chopSpruceLogs.txt
│   │       │   ├── collectWaterWithBucket.txt
│   │       │   ├── cookMutton.txt
│   │       │   ├── craftBucket.txt
│   │       │   ├── craftChest.txt
│   │       │   ├── craftEightSticks.txt
│   │       │   ├── craftEightTorches.txt
│   │       │   ├── craftFishingRod.txt
│   │       │   ├── craftFurnace.txt
│   │       │   ├── craftIronChestplate.txt
│   │       │   ├── craftIronHelmet.txt
│   │       │   ├── craftIronLeggingsAndBoots.txt
│   │       │   ├── craftIronPickaxe.txt
│   │       │   ├── craftIronPickaxeWithMaterials.txt
│   │       │   ├── craftIronSword.txt
│   │       │   ├── craftShieldWithFurnace.txt
│   │       │   ├── craftSixteenTorches.txt
│   │       │   ├── craftSpyglass.txt
│   │       │   ├── craftSticks.txt
│   │       │   ├── craftStoneAxe.txt
│   │       │   ├── craftStoneHoe.txt
│   │       │   ├── craftStonePickaxe.txt
│   │       │   ├── craftStoneShovel.txt
│   │       │   ├── craftStoneSword.txt
│   │       │   ├── craftTorches.txt
│   │       │   ├── craftTwentySprucePlanks.txt
│   │       │   ├── craftWhiteBedWithExploration.txt
│   │       │   ├── craftWoodenHoe.txt
│   │       │   ├── craftWoodenPickaxe.txt
│   │       │   ├── craftWoodenPlanks.txt
│   │       │   ├── eatCookedMutton.txt
│   │       │   ├── eatCookedMuttonV2.txt
│   │       │   ├── eatCookedMuttonV3.txt
│   │       │   ├── equipIronArmor.txt
│   │       │   ├── exploreCave.txt
│   │       │   ├── exploreCaveAndGatherResources.txt
│   │       │   ├── exploreCaveAndGatherResourcesV2.txt
│   │       │   ├── fishInNearbyWaterSafely.txt
│   │       │   ├── mineCoalOre.txt
│   │       │   ├── mineCopperOreWithStonePickaxe.txt
│   │       │   ├── mineFiveCoalOres.txt
│   │       │   ├── mineFiveCoalOresV2.txt
│   │       │   ├── mineFiveCopperOres.txt
│   │       │   ├── mineFiveIronOres.txt
│   │       │   ├── mineLapisOre.txt
│   │       │   ├── mineThreeIronOres.txt
│   │       │   ├── mineWoodLog.txt
│   │       │   ├── smeltOneRawIron.txt
│   │       │   ├── smeltRawCopper.txt
│   │       │   ├── smeltRawIron.txt
│   │       │   ├── smeltSixRawIron.txt
│   │       │   └── smeltTwentyFiveIronIngots.txt
│   │       ├── skills.json
│   │       └── vectordb/
│   │           ├── chroma-collections.parquet
│   │           ├── chroma-embeddings.parquet
│   │           └── index/
│   │               ├── id_to_uuid_7b5fd116-0820-46cb-981a-a6d642d4f025.pkl
│   │               ├── index_metadata_7b5fd116-0820-46cb-981a-a6d642d4f025.pkl
│   │               └── uuid_to_id_7b5fd116-0820-46cb-981a-a6d642d4f025.pkl
│   └── trial3/
│       └── skill/
│           ├── code/
│           │   ├── cookChicken.js
│           │   ├── cookRawBeef.js
│           │   ├── cookRawMutton.js
│           │   ├── cookThreeRawChicken.js
│           │   ├── craftBirchBoat.js
│           │   ├── craftBoneMeal.js
│           │   ├── craftChest.js
│           │   ├── craftClock.js
│           │   ├── craftCopperBlock.js
│           │   ├── craftDiamondSword.js
│           │   ├── craftFurnace.js
│           │   ├── craftIronChestplate.js
│           │   ├── craftIronHelmet.js
│           │   ├── craftIronLeggingsAndBoots.js
│           │   ├── craftIronPickaxe.js
│           │   ├── craftIronSword.js
│           │   ├── craftShield.js
│           │   ├── craftStoneAxe.js
│           │   ├── craftStoneHoe.js
│           │   ├── craftStoneHoeV2.js
│           │   ├── craftStonePickaxe.js
│           │   ├── craftStoneShovel.js
│           │   ├── craftStoneSword.js
│           │   ├── craftStoneTools.js
│           │   ├── craftTenCobblestoneWalls.js
│           │   ├── craftWoodenPickaxe.js
│           │   ├── craftWoodenSword.js
│           │   ├── eatCookedBeef.js
│           │   ├── eatCookedBeefV2.js
│           │   ├── eatCookedBeefV3.js
│           │   ├── eatCookedMutton.js
│           │   ├── eatCookedMuttonIfHungry.js
│           │   ├── equipIronChestplate.js
│           │   ├── equipIronHelmet.js
│           │   ├── equipIronLeggingsAndBoots.js
│           │   ├── equipShield.js
│           │   ├── killChickenWithIncreasedTime.js
│           │   ├── killThreeChickens.js
│           │   ├── killThreeCows.js
│           │   ├── killThreeSheep.js
│           │   ├── mineDeepslateOres.js
│           │   ├── mineEightCobblestone.js
│           │   ├── mineFiveCoalOre.js
│           │   ├── mineFiveCopperOre.js
│           │   ├── mineFourCoalOre.js
│           │   ├── mineTenCobbledDeepslateBelowY0.js
│           │   ├── mineThreeIronOre.js
│           │   ├── mineThreeMoreOakLogs.js
│           │   ├── mineWoodLog.js
│           │   ├── obtainBirchLogs.js
│           │   ├── openChestAndCheckContents.js
│           │   ├── plantOakSapling.js
│           │   ├── smeltCopperOre.js
│           │   ├── smeltFiveRawCopper.js
│           │   ├── smeltFiveRawGold.js
│           │   ├── smeltRawIron.js
│           │   ├── smeltThreeRawCopper.js
│           │   └── waitAndEatCookedMutton.js
│           ├── description/
│           │   ├── cookChicken.txt
│           │   ├── cookRawBeef.txt
│           │   ├── cookRawMutton.txt
│           │   ├── cookThreeRawChicken.txt
│           │   ├── craftBirchBoat.txt
│           │   ├── craftBoneMeal.txt
│           │   ├── craftChest.txt
│           │   ├── craftClock.txt
│           │   ├── craftCopperBlock.txt
│           │   ├── craftDiamondSword.txt
│           │   ├── craftFurnace.txt
│           │   ├── craftIronChestplate.txt
│           │   ├── craftIronHelmet.txt
│           │   ├── craftIronLeggingsAndBoots.txt
│           │   ├── craftIronPickaxe.txt
│           │   ├── craftIronSword.txt
│           │   ├── craftShield.txt
│           │   ├── craftStoneAxe.txt
│           │   ├── craftStoneHoe.txt
│           │   ├── craftStoneHoeV2.txt
│           │   ├── craftStonePickaxe.txt
│           │   ├── craftStoneShovel.txt
│           │   ├── craftStoneSword.txt
│           │   ├── craftStoneTools.txt
│           │   ├── craftTenCobblestoneWalls.txt
│           │   ├── craftWoodenPickaxe.txt
│           │   ├── craftWoodenSword.txt
│           │   ├── eatCookedBeef.txt
│           │   ├── eatCookedBeefV2.txt
│           │   ├── eatCookedBeefV3.txt
│           │   ├── eatCookedMutton.txt
│           │   ├── eatCookedMuttonIfHungry.txt
│           │   ├── equipIronChestplate.txt
│           │   ├── equipIronHelmet.txt
│           │   ├── equipIronLeggingsAndBoots.txt
│           │   ├── equipShield.txt
│           │   ├── killChickenWithIncreasedTime.txt
│           │   ├── killThreeChickens.txt
│           │   ├── killThreeCows.txt
│           │   ├── killThreeSheep.txt
│           │   ├── mineDeepslateOres.txt
│           │   ├── mineEightCobblestone.txt
│           │   ├── mineFiveCoalOre.txt
│           │   ├── mineFiveCopperOre.txt
│           │   ├── mineFourCoalOre.txt
│           │   ├── mineTenCobbledDeepslateBelowY0.txt
│           │   ├── mineThreeIronOre.txt
│           │   ├── mineThreeMoreOakLogs.txt
│           │   ├── mineWoodLog.txt
│           │   ├── obtainBirchLogs.txt
│           │   ├── openChestAndCheckContents.txt
│           │   ├── plantOakSapling.txt
│           │   ├── smeltCopperOre.txt
│           │   ├── smeltFiveRawCopper.txt
│           │   ├── smeltFiveRawGold.txt
│           │   ├── smeltRawIron.txt
│           │   ├── smeltThreeRawCopper.txt
│           │   └── waitAndEatCookedMutton.txt
│           ├── skills.json
│           └── vectordb/
│               ├── chroma-collections.parquet
│               ├── chroma-embeddings.parquet
│               └── index/
│                   ├── id_to_uuid_2f8ccde6-89f7-422b-87ec-8e46e8f1292a.pkl
│                   ├── index_metadata_2f8ccde6-89f7-422b-87ec-8e46e8f1292a.pkl
│                   └── uuid_to_id_2f8ccde6-89f7-422b-87ec-8e46e8f1292a.pkl
└── voyager/
    ├── __init__.py
    ├── agents/
    │   ├── __init__.py
    │   ├── action.py
    │   ├── critic.py
    │   ├── curriculum.py
    │   └── skill.py
    ├── control_primitives/
    │   ├── .prettierrc.json
    │   ├── __init__.py
    │   ├── craftHelper.js
    │   ├── craftItem.js
    │   ├── exploreUntil.js
    │   ├── givePlacedItemBack.js
    │   ├── killMob.js
    │   ├── mineBlock.js
    │   ├── placeItem.js
    │   ├── shoot.js
    │   ├── smeltItem.js
    │   ├── useChest.js
    │   └── waitForMobRemoved.js
    ├── control_primitives_context/
    │   ├── .prettierrc.json
    │   ├── __init__.py
    │   ├── craftItem.js
    │   ├── exploreUntil.js
    │   ├── killMob.js
    │   ├── mineBlock.js
    │   ├── mineflayer.js
    │   ├── placeItem.js
    │   ├── smeltItem.js
    │   └── useChest.js
    ├── prompts/
    │   ├── __init__.py
    │   ├── action_response_format.txt
    │   ├── action_template.txt
    │   ├── critic.txt
    │   ├── curriculum.txt
    │   ├── curriculum_qa_step1_ask_questions.txt
    │   ├── curriculum_qa_step2_answer_questions.txt
    │   ├── curriculum_task_decomposition.txt
    │   └── skill.txt
    ├── utils/
    │   ├── __init__.py
    │   ├── file_utils.py
    │   ├── json_utils.py
    │   └── record_utils.py
    └── voyager.py
Download .txt
SYMBOL INDEX (322 symbols across 202 files)

FILE: setup.py
  function _read_file (line 12) | def _read_file(fname):
  function _read_install_requires (line 19) | def _read_install_requires():
  function _fill_extras (line 26) | def _fill_extras(extras):

FILE: skill_library/trial1/skill/code/collectBamboo.js
  function collectBamboo (line 1) | async function collectBamboo(bot) {

FILE: skill_library/trial1/skill/code/collectFiveCactusBlocks.js
  function collectFiveCactusBlocks (line 1) | async function collectFiveCactusBlocks(bot) {

FILE: skill_library/trial1/skill/code/cookPorkchops.js
  function cookPorkchops (line 1) | async function cookPorkchops(bot) {

FILE: skill_library/trial1/skill/code/cookSevenMutton.js
  function cookSevenMutton (line 1) | async function cookSevenMutton(bot) {

FILE: skill_library/trial1/skill/code/craftAcaciaPlanksAndSticks.js
  function craftAcaciaPlanksAndSticks (line 1) | async function craftAcaciaPlanksAndSticks(bot) {

FILE: skill_library/trial1/skill/code/craftBucket.js
  function craftBucket (line 1) | async function craftBucket(bot) {

FILE: skill_library/trial1/skill/code/craftChest.js
  function craftChest (line 1) | async function craftChest(bot) {

FILE: skill_library/trial1/skill/code/craftCopperBlock.js
  function craftCopperBlock (line 1) | async function craftCopperBlock(bot) {

FILE: skill_library/trial1/skill/code/craftCraftingTable.js
  function craftCraftingTable (line 1) | async function craftCraftingTable(bot) {

FILE: skill_library/trial1/skill/code/craftFurnace.js
  function craftFurnace (line 1) | async function craftFurnace(bot) {

FILE: skill_library/trial1/skill/code/craftIronAxe.js
  function craftIronAxe (line 1) | async function craftIronAxe(bot) {

FILE: skill_library/trial1/skill/code/craftIronChestplate.js
  function craftIronChestplate (line 1) | async function craftIronChestplate(bot) {

FILE: skill_library/trial1/skill/code/craftIronHelmet.js
  function craftIronHelmet (line 1) | async function craftIronHelmet(bot) {

FILE: skill_library/trial1/skill/code/craftIronHelmetV2.js
  function craftIronHelmet (line 1) | async function craftIronHelmet(bot) {

FILE: skill_library/trial1/skill/code/craftIronLeggingsAndBoots.js
  function craftIronLeggingsAndBoots (line 1) | async function craftIronLeggingsAndBoots(bot) {

FILE: skill_library/trial1/skill/code/craftIronPickaxe.js
  function craftIronPickaxe (line 1) | async function craftIronPickaxe(bot) {

FILE: skill_library/trial1/skill/code/craftIronPickaxeV2.js
  function craftIronPickaxe (line 1) | async function craftIronPickaxe(bot) {

FILE: skill_library/trial1/skill/code/craftIronShovel.js
  function craftIronShovel (line 1) | async function craftIronShovel(bot) {

FILE: skill_library/trial1/skill/code/craftIronSword.js
  function craftIronSword (line 1) | async function craftIronSword(bot) {

FILE: skill_library/trial1/skill/code/craftLightningRod.js
  function findSuitablePosition (line 1) | async function findSuitablePosition(bot) {
  function craftLightningRod (line 13) | async function craftLightningRod(bot) {

FILE: skill_library/trial1/skill/code/craftOakPlanksAndSticks.js
  function craftOakPlanksAndSticks (line 1) | async function craftOakPlanksAndSticks(bot) {

FILE: skill_library/trial1/skill/code/craftScaffolding.js
  function craftScaffolding (line 1) | async function craftScaffolding(bot) {

FILE: skill_library/trial1/skill/code/craftShears.js
  function craftShears (line 1) | async function craftShears(bot) {

FILE: skill_library/trial1/skill/code/craftShieldImproved.js
  function craftShieldImproved (line 1) | async function craftShieldImproved(bot) {

FILE: skill_library/trial1/skill/code/craftStonePickaxe.js
  function craftStonePickaxe (line 1) | async function craftStonePickaxe(bot) {

FILE: skill_library/trial1/skill/code/craftStoneShovel.js
  function craftStoneShovel (line 1) | async function craftStoneShovel(bot) {

FILE: skill_library/trial1/skill/code/craftWhiteBed.js
  function craftWhiteBed (line 1) | async function craftWhiteBed(bot) {

FILE: skill_library/trial1/skill/code/craftWoodenHoe.js
  function craftWoodenHoe (line 1) | async function craftWoodenHoe(bot) {

FILE: skill_library/trial1/skill/code/craftWoodenPickaxe.js
  function craftWoodenPickaxe (line 1) | async function craftWoodenPickaxe(bot) {

FILE: skill_library/trial1/skill/code/craftWoodenSword.js
  function craftWoodenSword (line 1) | async function craftWoodenSword(bot) {

FILE: skill_library/trial1/skill/code/eatCookedPorkchop.js
  function eatCookedPorkchop (line 1) | async function eatCookedPorkchop(bot) {

FILE: skill_library/trial1/skill/code/eatTwoCookedMutton.js
  function eatTwoCookedMutton (line 1) | async function eatTwoCookedMutton(bot) {

FILE: skill_library/trial1/skill/code/equipIronArmor.js
  function equipIronArmor (line 1) | async function equipIronArmor(bot) {

FILE: skill_library/trial1/skill/code/equipIronChestplate.js
  function equipIronChestplate (line 1) | async function equipIronChestplate(bot) {

FILE: skill_library/trial1/skill/code/equipIronSword.js
  function equipIronSword (line 1) | async function equipIronSword(bot) {

FILE: skill_library/trial1/skill/code/fillBucketWithWater.js
  function fillBucketWithWater (line 1) | async function fillBucketWithWater(bot) {

FILE: skill_library/trial1/skill/code/killFourSheep.js
  function killFourSheep (line 1) | async function killFourSheep(bot) {

FILE: skill_library/trial1/skill/code/killOneEnderman.js
  function killOneEnderman (line 1) | async function killOneEnderman(bot) {

FILE: skill_library/trial1/skill/code/killOnePig.js
  function killOnePig (line 1) | async function killOnePig(bot) {

FILE: skill_library/trial1/skill/code/killOneSpider.js
  function killOneSpider (line 1) | async function killOneSpider(bot) {

FILE: skill_library/trial1/skill/code/killOneZombie.js
  function killOneZombie (line 1) | async function killOneZombie(bot) {

FILE: skill_library/trial1/skill/code/killTwoPigs.js
  function killTwoPigs (line 1) | async function killTwoPigs(bot) {

FILE: skill_library/trial1/skill/code/mineFiveCoalOres.js
  function mineFiveCoalOres (line 1) | async function mineFiveCoalOres(bot) {

FILE: skill_library/trial1/skill/code/mineFiveCoalOresV2.js
  function mineFiveCoalOres (line 1) | async function mineFiveCoalOres(bot) {

FILE: skill_library/trial1/skill/code/mineFiveCopperOres.js
  function mineFiveCopperOres (line 1) | async function mineFiveCopperOres(bot) {

FILE: skill_library/trial1/skill/code/mineFiveCopperOresV2.js
  function mineFiveCopperOres (line 1) | async function mineFiveCopperOres(bot) {

FILE: skill_library/trial1/skill/code/mineFiveIronOres.js
  function mineFiveIronOres (line 1) | async function mineFiveIronOres(bot) {

FILE: skill_library/trial1/skill/code/mineFiveIronOresV2.js
  function mineFiveIronOres (line 1) | async function mineFiveIronOres(bot) {

FILE: skill_library/trial1/skill/code/mineFiveLapisLazuliOres.js
  function mineFiveLapisLazuliOres (line 1) | async function mineFiveLapisLazuliOres(bot) {

FILE: skill_library/trial1/skill/code/mineTenCobblestone.js
  function mineTenCobblestone (line 1) | async function mineTenCobblestone(bot) {

FILE: skill_library/trial1/skill/code/mineThreeMoreOakLogs.js
  function mineThreeMoreOakLogs (line 1) | async function mineThreeMoreOakLogs(bot) {

FILE: skill_library/trial1/skill/code/mineWoodLog.js
  function mineWoodLog (line 1) | async function mineWoodLog(bot) {

FILE: skill_library/trial1/skill/code/obtainOneMoreAcaciaLog.js
  function obtainOneMoreAcaciaLog (line 1) | async function obtainOneMoreAcaciaLog(bot) {

FILE: skill_library/trial1/skill/code/smeltCactusIntoGreenDye.js
  function smeltCactusIntoGreenDye (line 1) | async function smeltCactusIntoGreenDye(bot) {

FILE: skill_library/trial1/skill/code/smeltFiveRawIron.js
  function smeltFiveRawIron (line 1) | async function smeltFiveRawIron(bot) {

FILE: skill_library/trial1/skill/code/smeltFiveRawIronV2.js
  function findSuitablePosition (line 1) | async function findSuitablePosition(bot) {
  function smeltFiveRawIron (line 18) | async function smeltFiveRawIron(bot) {

FILE: skill_library/trial1/skill/code/smeltRawCopper.js
  function smeltRawCopper (line 1) | async function smeltRawCopper(bot) {

FILE: skill_library/trial2/skill/code/catchFiveFishSafely.js
  function catchFiveFishSafely (line 1) | async function catchFiveFishSafely(bot) {

FILE: skill_library/trial2/skill/code/catchThreeFish.js
  function catchThreeFish (line 1) | async function catchThreeFish(bot) {

FILE: skill_library/trial2/skill/code/checkStonePickaxe.js
  function checkStonePickaxe (line 1) | async function checkStonePickaxe(bot) {

FILE: skill_library/trial2/skill/code/chopDownSpruceLogs.js
  function chopDownSpruceLogs (line 1) | async function chopDownSpruceLogs(bot) {

FILE: skill_library/trial2/skill/code/chopDownSpruceLogsV2.js
  function chopDownSpruceLogs (line 1) | async function chopDownSpruceLogs(bot) {

FILE: skill_library/trial2/skill/code/chopSpruceLogs.js
  function chopSpruceLogs (line 1) | async function chopSpruceLogs(bot) {

FILE: skill_library/trial2/skill/code/collectWaterWithBucket.js
  function collectWaterWithBucket (line 1) | async function collectWaterWithBucket(bot) {

FILE: skill_library/trial2/skill/code/cookMutton.js
  function cookMutton (line 1) | async function cookMutton(bot) {

FILE: skill_library/trial2/skill/code/craftBucket.js
  function craftBucket (line 1) | async function craftBucket(bot) {

FILE: skill_library/trial2/skill/code/craftChest.js
  function craftChest (line 1) | async function craftChest(bot) {

FILE: skill_library/trial2/skill/code/craftEightSticks.js
  function craftEightSticks (line 1) | async function craftEightSticks(bot) {

FILE: skill_library/trial2/skill/code/craftEightTorches.js
  function craftEightTorches (line 1) | async function craftEightTorches(bot) {

FILE: skill_library/trial2/skill/code/craftFishingRod.js
  function craftFishingRod (line 1) | async function craftFishingRod(bot) {

FILE: skill_library/trial2/skill/code/craftFurnace.js
  function craftFurnace (line 1) | async function craftFurnace(bot) {

FILE: skill_library/trial2/skill/code/craftIronChestplate.js
  function craftIronChestplate (line 1) | async function craftIronChestplate(bot) {

FILE: skill_library/trial2/skill/code/craftIronHelmet.js
  function craftIronHelmet (line 1) | async function craftIronHelmet(bot) {

FILE: skill_library/trial2/skill/code/craftIronLeggingsAndBoots.js
  function craftIronLeggingsAndBoots (line 1) | async function craftIronLeggingsAndBoots(bot) {

FILE: skill_library/trial2/skill/code/craftIronPickaxe.js
  function craftIronPickaxe (line 1) | async function craftIronPickaxe(bot) {

FILE: skill_library/trial2/skill/code/craftIronPickaxeWithMaterials.js
  function craftIronPickaxeWithMaterials (line 1) | async function craftIronPickaxeWithMaterials(bot) {

FILE: skill_library/trial2/skill/code/craftIronSword.js
  function craftIronSword (line 1) | async function craftIronSword(bot) {

FILE: skill_library/trial2/skill/code/craftShieldWithFurnace.js
  function craftShieldWithFurnace (line 1) | async function craftShieldWithFurnace(bot) {

FILE: skill_library/trial2/skill/code/craftSixteenTorches.js
  function craftSixteenTorches (line 1) | async function craftSixteenTorches(bot) {

FILE: skill_library/trial2/skill/code/craftSpyglass.js
  function craftSpyglass (line 1) | async function craftSpyglass(bot) {

FILE: skill_library/trial2/skill/code/craftSticks.js
  function craftSticks (line 1) | async function craftSticks(bot) {

FILE: skill_library/trial2/skill/code/craftStoneAxe.js
  function craftStoneAxe (line 1) | async function craftStoneAxe(bot) {

FILE: skill_library/trial2/skill/code/craftStoneHoe.js
  function craftStoneHoe (line 1) | async function craftStoneHoe(bot) {

FILE: skill_library/trial2/skill/code/craftStonePickaxe.js
  function craftStonePickaxe (line 1) | async function craftStonePickaxe(bot) {

FILE: skill_library/trial2/skill/code/craftStoneShovel.js
  function craftStoneShovel (line 1) | async function craftStoneShovel(bot) {

FILE: skill_library/trial2/skill/code/craftStoneSword.js
  function craftStoneSword (line 1) | async function craftStoneSword(bot) {

FILE: skill_library/trial2/skill/code/craftTorches.js
  function craftTorches (line 1) | async function craftTorches(bot) {

FILE: skill_library/trial2/skill/code/craftTwentySprucePlanks.js
  function craftTwentySprucePlanks (line 1) | async function craftTwentySprucePlanks(bot) {

FILE: skill_library/trial2/skill/code/craftWhiteBedWithExploration.js
  function craftWhiteBedWithExploration (line 1) | async function craftWhiteBedWithExploration(bot) {

FILE: skill_library/trial2/skill/code/craftWoodenHoe.js
  function craftWoodenHoe (line 1) | async function craftWoodenHoe(bot) {

FILE: skill_library/trial2/skill/code/craftWoodenPickaxe.js
  function craftWoodenPickaxe (line 1) | async function craftWoodenPickaxe(bot) {

FILE: skill_library/trial2/skill/code/craftWoodenPlanks.js
  function craftWoodenPlanks (line 1) | async function craftWoodenPlanks(bot) {

FILE: skill_library/trial2/skill/code/eatCookedMutton.js
  function eatCookedMutton (line 1) | async function eatCookedMutton(bot) {

FILE: skill_library/trial2/skill/code/eatCookedMuttonV2.js
  function eatCookedMutton (line 1) | async function eatCookedMutton(bot) {

FILE: skill_library/trial2/skill/code/eatCookedMuttonV3.js
  function eatCookedMutton (line 1) | async function eatCookedMutton(bot) {

FILE: skill_library/trial2/skill/code/equipIronArmor.js
  function equipIronArmor (line 1) | async function equipIronArmor(bot) {

FILE: skill_library/trial2/skill/code/exploreCave.js
  function exploreCave (line 1) | async function exploreCave(bot) {

FILE: skill_library/trial2/skill/code/exploreCaveAndGatherResources.js
  function exploreCaveAndGatherResources (line 1) | async function exploreCaveAndGatherResources(bot) {

FILE: skill_library/trial2/skill/code/exploreCaveAndGatherResourcesV2.js
  function exploreCaveAndGatherResources (line 1) | async function exploreCaveAndGatherResources(bot) {

FILE: skill_library/trial2/skill/code/fishInNearbyWaterSafely.js
  function fishInNearbyWaterSafely (line 1) | async function fishInNearbyWaterSafely(bot) {

FILE: skill_library/trial2/skill/code/mineCoalOre.js
  function mineCoalOre (line 1) | async function mineCoalOre(bot) {

FILE: skill_library/trial2/skill/code/mineCopperOreWithStonePickaxe.js
  function mineCopperOreWithStonePickaxe (line 1) | async function mineCopperOreWithStonePickaxe(bot) {

FILE: skill_library/trial2/skill/code/mineFiveCoalOres.js
  function mineFiveCoalOres (line 1) | async function mineFiveCoalOres(bot) {

FILE: skill_library/trial2/skill/code/mineFiveCoalOresV2.js
  function mineFiveCoalOres (line 1) | async function mineFiveCoalOres(bot) {

FILE: skill_library/trial2/skill/code/mineFiveCopperOres.js
  function mineFiveCopperOres (line 1) | async function mineFiveCopperOres(bot) {

FILE: skill_library/trial2/skill/code/mineFiveIronOres.js
  function mineFiveIronOres (line 1) | async function mineFiveIronOres(bot) {

FILE: skill_library/trial2/skill/code/mineLapisOre.js
  function mineLapisOre (line 1) | async function mineLapisOre(bot) {

FILE: skill_library/trial2/skill/code/mineThreeIronOres.js
  function mineThreeIronOres (line 1) | async function mineThreeIronOres(bot) {

FILE: skill_library/trial2/skill/code/mineWoodLog.js
  function mineWoodLog (line 1) | async function mineWoodLog(bot) {

FILE: skill_library/trial2/skill/code/smeltOneRawIron.js
  function smeltOneRawIron (line 1) | async function smeltOneRawIron(bot) {

FILE: skill_library/trial2/skill/code/smeltRawCopper.js
  function smeltRawCopper (line 1) | async function smeltRawCopper(bot) {

FILE: skill_library/trial2/skill/code/smeltRawIron.js
  function smeltRawIron (line 1) | async function smeltRawIron(bot) {

FILE: skill_library/trial2/skill/code/smeltSixRawIron.js
  function smeltSixRawIron (line 1) | async function smeltSixRawIron(bot) {

FILE: skill_library/trial2/skill/code/smeltTwentyFiveIronIngots.js
  function smeltTwentyFiveIronIngots (line 1) | async function smeltTwentyFiveIronIngots(bot) {

FILE: skill_library/trial3/skill/code/cookChicken.js
  function cookChicken (line 1) | async function cookChicken(bot) {

FILE: skill_library/trial3/skill/code/cookRawBeef.js
  function cookRawBeef (line 1) | async function cookRawBeef(bot) {

FILE: skill_library/trial3/skill/code/cookRawMutton.js
  function cookRawMutton (line 1) | async function cookRawMutton(bot) {

FILE: skill_library/trial3/skill/code/cookThreeRawChicken.js
  function cookThreeRawChicken (line 1) | async function cookThreeRawChicken(bot) {

FILE: skill_library/trial3/skill/code/craftBirchBoat.js
  function findSuitablePosition (line 1) | async function findSuitablePosition(bot) {
  function craftBirchBoat (line 13) | async function craftBirchBoat(bot) {

FILE: skill_library/trial3/skill/code/craftBoneMeal.js
  function craftBoneMeal (line 1) | async function craftBoneMeal(bot) {

FILE: skill_library/trial3/skill/code/craftChest.js
  function craftChest (line 1) | async function craftChest(bot) {

FILE: skill_library/trial3/skill/code/craftClock.js
  function craftClock (line 1) | async function craftClock(bot) {

FILE: skill_library/trial3/skill/code/craftCopperBlock.js
  function craftCopperBlock (line 1) | async function craftCopperBlock(bot) {

FILE: skill_library/trial3/skill/code/craftDiamondSword.js
  function craftDiamondSword (line 1) | async function craftDiamondSword(bot) {

FILE: skill_library/trial3/skill/code/craftFurnace.js
  function craftFurnace (line 1) | async function craftFurnace(bot) {

FILE: skill_library/trial3/skill/code/craftIronChestplate.js
  function craftIronChestplate (line 1) | async function craftIronChestplate(bot) {

FILE: skill_library/trial3/skill/code/craftIronHelmet.js
  function craftIronHelmet (line 1) | async function craftIronHelmet(bot) {

FILE: skill_library/trial3/skill/code/craftIronLeggingsAndBoots.js
  function craftIronLeggingsAndBoots (line 1) | async function craftIronLeggingsAndBoots(bot) {

FILE: skill_library/trial3/skill/code/craftIronPickaxe.js
  function craftIronPickaxe (line 1) | async function craftIronPickaxe(bot) {

FILE: skill_library/trial3/skill/code/craftIronSword.js
  function craftIronSword (line 1) | async function craftIronSword(bot) {

FILE: skill_library/trial3/skill/code/craftShield.js
  function craftShield (line 1) | async function craftShield(bot) {

FILE: skill_library/trial3/skill/code/craftStoneAxe.js
  function craftStoneAxe (line 1) | async function craftStoneAxe(bot) {

FILE: skill_library/trial3/skill/code/craftStoneHoe.js
  function craftStoneHoe (line 1) | async function craftStoneHoe(bot) {

FILE: skill_library/trial3/skill/code/craftStoneHoeV2.js
  function craftStoneHoe (line 1) | async function craftStoneHoe(bot) {

FILE: skill_library/trial3/skill/code/craftStonePickaxe.js
  function craftStonePickaxe (line 1) | async function craftStonePickaxe(bot) {

FILE: skill_library/trial3/skill/code/craftStoneShovel.js
  function craftStoneShovel (line 1) | async function craftStoneShovel(bot) {

FILE: skill_library/trial3/skill/code/craftStoneSword.js
  function craftStoneSword (line 1) | async function craftStoneSword(bot) {

FILE: skill_library/trial3/skill/code/craftStoneTools.js
  function craftStoneTools (line 1) | async function craftStoneTools(bot) {

FILE: skill_library/trial3/skill/code/craftTenCobblestoneWalls.js
  function craftTenCobblestoneWalls (line 1) | async function craftTenCobblestoneWalls(bot) {

FILE: skill_library/trial3/skill/code/craftWoodenPickaxe.js
  function craftWoodenPickaxe (line 1) | async function craftWoodenPickaxe(bot) {

FILE: skill_library/trial3/skill/code/craftWoodenSword.js
  function craftWoodenSword (line 1) | async function craftWoodenSword(bot) {

FILE: skill_library/trial3/skill/code/eatCookedBeef.js
  function eatCookedBeef (line 1) | async function eatCookedBeef(bot) {

FILE: skill_library/trial3/skill/code/eatCookedBeefV2.js
  function eatCookedBeef (line 1) | async function eatCookedBeef(bot) {

FILE: skill_library/trial3/skill/code/eatCookedBeefV3.js
  function eatCookedBeef (line 1) | async function eatCookedBeef(bot) {

FILE: skill_library/trial3/skill/code/eatCookedMutton.js
  function eatCookedMutton (line 1) | async function eatCookedMutton(bot) {

FILE: skill_library/trial3/skill/code/eatCookedMuttonIfHungry.js
  function eatCookedMuttonIfHungry (line 1) | async function eatCookedMuttonIfHungry(bot) {

FILE: skill_library/trial3/skill/code/equipIronChestplate.js
  function equipIronChestplate (line 1) | async function equipIronChestplate(bot) {

FILE: skill_library/trial3/skill/code/equipIronHelmet.js
  function equipIronHelmet (line 1) | async function equipIronHelmet(bot) {

FILE: skill_library/trial3/skill/code/equipIronLeggingsAndBoots.js
  function equipIronLeggingsAndBoots (line 1) | async function equipIronLeggingsAndBoots(bot) {

FILE: skill_library/trial3/skill/code/equipShield.js
  function equipShield (line 1) | async function equipShield(bot) {

FILE: skill_library/trial3/skill/code/killChickenWithIncreasedTime.js
  function killChickenWithIncreasedTime (line 1) | async function killChickenWithIncreasedTime(bot) {

FILE: skill_library/trial3/skill/code/killThreeChickens.js
  function killThreeChickens (line 1) | async function killThreeChickens(bot) {

FILE: skill_library/trial3/skill/code/killThreeCows.js
  function killThreeCows (line 1) | async function killThreeCows(bot) {

FILE: skill_library/trial3/skill/code/killThreeSheep.js
  function killThreeSheep (line 1) | async function killThreeSheep(bot) {

FILE: skill_library/trial3/skill/code/mineDeepslateOres.js
  function mineDeepslateOres (line 1) | async function mineDeepslateOres(bot) {

FILE: skill_library/trial3/skill/code/mineEightCobblestone.js
  function mineEightCobblestone (line 1) | async function mineEightCobblestone(bot) {

FILE: skill_library/trial3/skill/code/mineFiveCoalOre.js
  function mineFiveCoalOre (line 1) | async function mineFiveCoalOre(bot) {

FILE: skill_library/trial3/skill/code/mineFiveCopperOre.js
  function mineFiveCopperOre (line 1) | async function mineFiveCopperOre(bot) {

FILE: skill_library/trial3/skill/code/mineFourCoalOre.js
  function mineFourCoalOre (line 1) | async function mineFourCoalOre(bot) {

FILE: skill_library/trial3/skill/code/mineTenCobbledDeepslateBelowY0.js
  function mineTenCobbledDeepslateBelowY0 (line 1) | async function mineTenCobbledDeepslateBelowY0(bot) {

FILE: skill_library/trial3/skill/code/mineThreeIronOre.js
  function mineThreeIronOre (line 1) | async function mineThreeIronOre(bot) {

FILE: skill_library/trial3/skill/code/mineThreeMoreOakLogs.js
  function mineThreeMoreOakLogs (line 1) | async function mineThreeMoreOakLogs(bot) {

FILE: skill_library/trial3/skill/code/mineWoodLog.js
  function mineWoodLog (line 1) | async function mineWoodLog(bot) {

FILE: skill_library/trial3/skill/code/obtainBirchLogs.js
  function obtainBirchLogs (line 1) | async function obtainBirchLogs(bot) {

FILE: skill_library/trial3/skill/code/openChestAndCheckContents.js
  function openChestAndCheckContents (line 1) | async function openChestAndCheckContents(bot) {

FILE: skill_library/trial3/skill/code/plantOakSapling.js
  function plantOakSapling (line 1) | async function plantOakSapling(bot) {

FILE: skill_library/trial3/skill/code/smeltCopperOre.js
  function smeltCopperOre (line 1) | async function smeltCopperOre(bot) {

FILE: skill_library/trial3/skill/code/smeltFiveRawCopper.js
  function smeltFiveRawCopper (line 1) | async function smeltFiveRawCopper(bot) {

FILE: skill_library/trial3/skill/code/smeltFiveRawGold.js
  function smeltFiveRawGold (line 1) | async function smeltFiveRawGold(bot) {

FILE: skill_library/trial3/skill/code/smeltRawIron.js
  function smeltRawIron (line 1) | async function smeltRawIron(bot) {

FILE: skill_library/trial3/skill/code/smeltThreeRawCopper.js
  function smeltThreeRawCopper (line 1) | async function smeltThreeRawCopper(bot) {

FILE: skill_library/trial3/skill/code/waitAndEatCookedMutton.js
  function waitAndEatCookedMutton (line 1) | async function waitAndEatCookedMutton(bot) {

FILE: voyager/agents/action.py
  class ActionAgent (line 14) | class ActionAgent:
    method __init__ (line 15) | def __init__(
    method update_chest_memory (line 40) | def update_chest_memory(self, chests):
    method render_chest_observation (line 56) | def render_chest_observation(self):
    method render_system_message (line 75) | def render_system_message(self, skills=[]):
    method render_human_message (line 102) | def render_human_message(
    method process_ai_message (line 201) | def process_ai_message(self, message):
    method summarize_chatlog (line 258) | def summarize_chatlog(self, events):

FILE: voyager/agents/critic.py
  class CriticAgent (line 7) | class CriticAgent:
    method __init__ (line 8) | def __init__(
    method render_system_message (line 23) | def render_system_message(self):
    method render_human_message (line 27) | def render_human_message(self, *, events, task, context, chest_observa...
    method human_check_task_success (line 79) | def human_check_task_success(self):
    method ai_check_task_success (line 91) | def ai_check_task_success(self, messages, max_retries=5):
    method check_task_success (line 116) | def check_task_success(

FILE: voyager/agents/curriculum.py
  class CurriculumAgent (line 15) | class CurriculumAgent:
    method __init__ (line 16) | def __init__(
    method default_warmup (line 92) | def default_warmup(self):
    method curriculum_observations (line 112) | def curriculum_observations(self):
    method progress (line 131) | def progress(self):
    method render_system_message (line 134) | def render_system_message(self):
    method render_observation (line 139) | def render_observation(self, *, events, chest_observation):
    method render_human_message (line 209) | def render_human_message(self, *, events, chest_observation):
    method propose_next_task (line 240) | def propose_next_task(self, *, events, chest_observation, max_retries=5):
    method propose_next_ai_task (line 292) | def propose_next_ai_task(self, *, messages, max_retries=5):
    method parse_ai_message (line 311) | def parse_ai_message(self, message):
    method propose_next_manual_task (line 319) | def propose_next_manual_task(self):
    method update_exploration_progress (line 329) | def update_exploration_progress(self, info):
    method clean_up_tasks (line 346) | def clean_up_tasks(self):
    method decompose_task (line 369) | def decompose_task(self, task, events):
    method run_qa (line 384) | def run_qa(self, *, events, chest_observation):
    method get_task_context (line 417) | def get_task_context(self, task):
    method render_system_message_qa_step1_ask_questions (line 436) | def render_system_message_qa_step1_ask_questions(self):
    method render_human_message_qa_step1_ask_questions (line 439) | def render_human_message_qa_step1_ask_questions(self, *, events, chest...
    method run_qa_step1_ask_questions (line 448) | def run_qa_step1_ask_questions(self, *, events, chest_observation):
    method render_system_message_qa_step2_answer_questions (line 481) | def render_system_message_qa_step2_answer_questions(self):
    method render_human_message_qa_step2_answer_questions (line 486) | def render_human_message_qa_step2_answer_questions(self, question):
    method run_qa_step2_answer_questions (line 490) | def run_qa_step2_answer_questions(self, question):

FILE: voyager/agents/skill.py
  class SkillManager (line 13) | class SkillManager:
    method __init__ (line 14) | def __init__(
    method programs (line 53) | def programs(self):
    method add_new_skill (line 61) | def add_new_skill(self, info):
    method generate_skill_description (line 102) | def generate_skill_description(self, program_name, program_code):
    method retrieve_skills (line 114) | def retrieve_skills(self, query):

FILE: voyager/control_primitives/__init__.py
  function load_control_primitives (line 6) | def load_control_primitives(primitive_names=None):

FILE: voyager/control_primitives/craftHelper.js
  function failedCraftFeedback (line 1) | function failedCraftFeedback(bot, name, item, craftingTable) {

FILE: voyager/control_primitives/craftItem.js
  function craftItem (line 1) | async function craftItem(bot, name, count = 1) {

FILE: voyager/control_primitives/exploreUntil.js
  function exploreUntil (line 2) | async function exploreUntil(

FILE: voyager/control_primitives/givePlacedItemBack.js
  function givePlacedItemBack (line 1) | async function givePlacedItemBack(bot, name, position) {

FILE: voyager/control_primitives/killMob.js
  function killMob (line 1) | async function killMob(bot, mobName, timeout = 300) {

FILE: voyager/control_primitives/mineBlock.js
  function mineBlock (line 1) | async function mineBlock(bot, name, count = 1) {

FILE: voyager/control_primitives/placeItem.js
  function placeItem (line 1) | async function placeItem(bot, name, position) {

FILE: voyager/control_primitives/shoot.js
  function shoot (line 2) | async function shoot(bot, weapon, target) {

FILE: voyager/control_primitives/smeltItem.js
  function smeltItem (line 1) | async function smeltItem(bot, itemName, fuelName, count = 1) {

FILE: voyager/control_primitives/useChest.js
  function getItemFromChest (line 1) | async function getItemFromChest(bot, chestPosition, itemsToGet) {
  function depositItemIntoChest (line 31) | async function depositItemIntoChest(bot, chestPosition, itemsToDeposit) {
  function checkItemInsideChest (line 61) | async function checkItemInsideChest(bot, chestPosition) {
  function moveToChest (line 74) | async function moveToChest(bot, chestPosition) {
  function listItemsInChest (line 99) | async function listItemsInChest(bot, chestBlock) {
  function closeChest (line 118) | async function closeChest(bot, chestBlock) {
  function itemByName (line 127) | function itemByName(items, name) {

FILE: voyager/control_primitives/waitForMobRemoved.js
  function waitForMobRemoved (line 1) | function waitForMobRemoved(bot, entity, timeout = 300) {
  function waitForMobShot (line 44) | function waitForMobShot(bot, entity, timeout = 300) {

FILE: voyager/control_primitives_context/__init__.py
  function load_control_primitives_context (line 6) | def load_control_primitives_context(primitive_names=None):

FILE: voyager/control_primitives_context/craftItem.js
  function craftItem (line 3) | async function craftItem(bot, name, count = 1) {

FILE: voyager/control_primitives_context/exploreUntil.js
  function exploreUntil (line 22) | async function exploreUntil(bot, direction, maxTime = 60, callback) {

FILE: voyager/control_primitives_context/killMob.js
  function killMob (line 2) | async function killMob(bot, mobName, timeout = 300) {

FILE: voyager/control_primitives_context/mineBlock.js
  function mineBlock (line 2) | async function mineBlock(bot, name, count = 1) {

FILE: voyager/control_primitives_context/placeItem.js
  function placeItem (line 2) | async function placeItem(bot, name, position) {

FILE: voyager/control_primitives_context/smeltItem.js
  function smeltItem (line 3) | async function smeltItem(bot, itemName, fuelName, count = 1) {

FILE: voyager/control_primitives_context/useChest.js
  function getItemFromChest (line 3) | async function getItemFromChest(bot, chestPosition, itemsToGet) {
  function depositItemIntoChest (line 16) | async function depositItemIntoChest(bot, chestPosition, itemsToDeposit) {
  function checkItemInsideChest (line 29) | async function checkItemInsideChest(bot, chestPosition) {

FILE: voyager/prompts/__init__.py
  function load_prompt (line 5) | def load_prompt(prompt):

FILE: voyager/utils/file_utils.py
  function host_name (line 34) | def host_name():
  function host_id (line 39) | def host_id():
  function utf_open (line 46) | def utf_open(fname, mode):
  function is_sequence (line 53) | def is_sequence(obj):
  function pack_varargs (line 61) | def pack_varargs(args):
  function f_not_empty (line 76) | def f_not_empty(*fpaths):
  function f_expand (line 92) | def f_expand(fpath):
  function f_exists (line 96) | def f_exists(*fpaths):
  function f_join (line 100) | def f_join(*fpaths):
  function f_listdir (line 111) | def f_listdir(
  function f_mkdir (line 156) | def f_mkdir(*fpaths):
  function f_mkdir_in_path (line 166) | def f_mkdir_in_path(*fpaths):
  function last_part_in_path (line 175) | def last_part_in_path(fpath):
  function is_abs_path (line 182) | def is_abs_path(*fpath):
  function is_relative_path (line 186) | def is_relative_path(*fpath):
  function f_time (line 190) | def f_time(*fpath):
  function f_append_before_ext (line 195) | def f_append_before_ext(fpath, suffix):
  function f_add_ext (line 203) | def f_add_ext(fpath, ext):
  function f_has_ext (line 217) | def f_has_ext(fpath, ext):
  function f_glob (line 223) | def f_glob(*fpath):
  function f_remove (line 227) | def f_remove(*fpath, verbose=False, dry_run=False):
  function f_copy (line 249) | def f_copy(fsrc, fdst, ignore=None, include=None, exists_ok=True, verbos...
  function _f_copytree (line 266) | def _f_copytree(
  function _include_patterns (line 334) | def _include_patterns(*patterns):
  function f_copytree (line 358) | def f_copytree(fsrc, fdst, symlinks=False, ignore=None, include=None, ex...
  function f_move (line 370) | def f_move(fsrc, fdst):
  function f_split_path (line 376) | def f_split_path(fpath, normpath=True):
  function get_script_dir (line 401) | def get_script_dir():
  function get_script_file_name (line 408) | def get_script_file_name():
  function get_script_self_path (line 415) | def get_script_self_path():
  function get_parent_dir (line 422) | def get_parent_dir(location, abspath=False):
  function md5_checksum (line 434) | def md5_checksum(*fpath):
  function create_tar (line 445) | def create_tar(fsrc, output_tarball, include=None, ignore=None, compress...
  function extract_tar (line 472) | def extract_tar(source_tarball, output_dir=".", members=None):
  function move_with_backup (line 484) | def move_with_backup(*fpath, suffix=".bak"):
  function insert_before_ext (line 499) | def insert_before_ext(name, insert):
  function timestamp_file_name (line 507) | def timestamp_file_name(fname):
  function get_file_lock (line 512) | def get_file_lock(*fpath, timeout: int = 15, logging_level="critical"):
  function load_pickle (line 527) | def load_pickle(*fpaths):
  function dump_pickle (line 532) | def dump_pickle(data, *fpaths):
  function load_text (line 537) | def load_text(*fpaths, by_lines=False):
  function load_text_lines (line 545) | def load_text_lines(*fpaths):
  function dump_text (line 549) | def dump_text(s, *fpaths):
  function dump_text_lines (line 554) | def dump_text_lines(lines: list[str], *fpaths, add_newline=True):

FILE: voyager/utils/json_utils.py
  function json_load (line 7) | def json_load(*file_path, **kwargs):
  function json_loads (line 13) | def json_loads(string, **kwargs):
  function json_dump (line 17) | def json_dump(data, *file_path, **kwargs):
  function json_dumps (line 23) | def json_dumps(data, **kwargs):
  function extract_char_position (line 38) | def extract_char_position(error_message: str) -> int:
  function add_quotes_to_property_names (line 55) | def add_quotes_to_property_names(json_string: str) -> str:
  function balance_braces (line 77) | def balance_braces(json_string: str) -> str:
  function fix_invalid_escape (line 104) | def fix_invalid_escape(json_str: str, error_message: str) -> str:
  function correct_json (line 116) | def correct_json(json_str: str) -> str:
  function fix_and_parse_json (line 144) | def fix_and_parse_json(

FILE: voyager/utils/record_utils.py
  class EventRecorder (line 7) | class EventRecorder:
    method __init__ (line 8) | def __init__(
    method record (line 27) | def record(self, events, task):
    method resume (line 48) | def resume(self, cutoff=None):
    method update_items (line 77) | def update_items(self, event):
    method update_elapsed_time (line 93) | def update_elapsed_time(self, event):
    method update_position (line 96) | def update_position(self, event):

FILE: voyager/voyager.py
  class Voyager (line 17) | class Voyager:
    method __init__ (line 18) | def __init__(
    method reset (line 165) | def reset(self, task, context="", reset_env=True):
    method close (line 200) | def close(self):
    method step (line 203) | def step(self):
    method rollout (line 287) | def rollout(self, *, task, context, reset_env=True):
    method learn (line 295) | def learn(self, reset_env=True):
    method decompose_task (line 370) | def decompose_task(self, task):
    method inference (line 380) | def inference(self, task=None, sub_goals=[], reset_mode="hard", reset_...
Condensed preview — 416 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (628K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/voyager-issue-template.md",
    "chars": 502,
    "preview": "---\nname: Voyager Issue Template\nabout: Create an issue to Voyager\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n### Before s"
  },
  {
    "path": ".github/workflows/close_issue.yml",
    "chars": 705,
    "preview": "name: Close inactive issues\non:\n  schedule:\n    - cron: \"30 1 * * *\"\n\njobs:\n  close-issues:\n    runs-on: ubuntu-latest\n "
  },
  {
    "path": ".gitignore",
    "chars": 1412,
    "preview": "ckpt*\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / "
  },
  {
    "path": "FAQ.md",
    "chars": 4980,
    "preview": "# Frequently Asked Questions\n* [I got connection error after I click on the Azure login link and login to Microsoft acco"
  },
  {
    "path": "LICENSE",
    "chars": 1070,
    "preview": "MIT License\n\nCopyright (c) 2023 MineDojo Team\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
  },
  {
    "path": "README.md",
    "chars": 6728,
    "preview": "# Voyager: An Open-Ended Embodied Agent with Large Language Models\n<div align=\"center\">\n\n[[Website]](https://voyager.min"
  },
  {
    "path": "installation/fabric_mods_install.md",
    "chars": 2662,
    "preview": "# Fabric Mods Install\nIn this tutorial, we will install the Fabric launcher and 5 mods. Remember to use the correct Fabr"
  },
  {
    "path": "installation/minecraft_instance_install.md",
    "chars": 3192,
    "preview": "# Minecraft Instance Install\nTo start using Voyager, you should first make sure to have an official [Minecraft](https://"
  },
  {
    "path": "requirements.txt",
    "chars": 147,
    "preview": "tqdm\nlangchain\njavascript\nsetuptools\nopenai\nchardet\ncchardet\nchromadb==0.3.29\ntiktoken\nrequests\nsetuptools\ngymnasium\npsu"
  },
  {
    "path": "setup.py",
    "chars": 1596,
    "preview": "import os\nimport pathlib\nimport pkg_resources\nfrom setuptools import setup, find_packages\n\n\nPKG_NAME = \"voyager\"\nVERSION"
  },
  {
    "path": "skill_library/README.md",
    "chars": 1381,
    "preview": "# Learned Skill Libraries\n\n## Ours\n\n* [skill_library/trial1](trial1)\n* [skill_library/trial2](trial2)\n* [skill_library/t"
  },
  {
    "path": "skill_library/trial1/skill/code/collectBamboo.js",
    "chars": 1042,
    "preview": "async function collectBamboo(bot) {\n  // Equip the iron sword\n  const ironSword = bot.inventory.findInventoryItem(mcData"
  },
  {
    "path": "skill_library/trial1/skill/code/collectFiveCactusBlocks.js",
    "chars": 994,
    "preview": "async function collectFiveCactusBlocks(bot) {\n  // Equip the iron pickaxe\n  const ironPickaxe = bot.inventory.findInvent"
  },
  {
    "path": "skill_library/trial1/skill/code/cookPorkchops.js",
    "chars": 581,
    "preview": "async function cookPorkchops(bot) {\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bot.inventor"
  },
  {
    "path": "skill_library/trial1/skill/code/cookSevenMutton.js",
    "chars": 755,
    "preview": "async function cookSevenMutton(bot) {\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bot.invent"
  },
  {
    "path": "skill_library/trial1/skill/code/craftAcaciaPlanksAndSticks.js",
    "chars": 1080,
    "preview": "async function craftAcaciaPlanksAndSticks(bot) {\n  // Check if there are enough acacia logs in the inventory\n  const aca"
  },
  {
    "path": "skill_library/trial1/skill/code/craftBucket.js",
    "chars": 800,
    "preview": "async function craftBucket(bot) {\n  // Check if there are enough iron ingots in the inventory\n  const ironIngotsCount = "
  },
  {
    "path": "skill_library/trial1/skill/code/craftChest.js",
    "chars": 911,
    "preview": "async function craftChest(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount = bot"
  },
  {
    "path": "skill_library/trial1/skill/code/craftCopperBlock.js",
    "chars": 851,
    "preview": "async function craftCopperBlock(bot) {\n  // Check if there are enough copper ingots in the inventory\n  const copperIngot"
  },
  {
    "path": "skill_library/trial1/skill/code/craftCraftingTable.js",
    "chars": 760,
    "preview": "async function craftCraftingTable(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCou"
  },
  {
    "path": "skill_library/trial1/skill/code/craftFurnace.js",
    "chars": 653,
    "preview": "async function craftFurnace(bot) {\n  // Check if there are enough cobblestones in the inventory\n  const cobblestoneCount"
  },
  {
    "path": "skill_library/trial1/skill/code/craftIronAxe.js",
    "chars": 982,
    "preview": "async function craftIronAxe(bot) {\n  // Check if there are enough iron ingots and sticks in the inventory\n  const ironIn"
  },
  {
    "path": "skill_library/trial1/skill/code/craftIronChestplate.js",
    "chars": 837,
    "preview": "async function craftIronChestplate(bot) {\n  // Check if there are enough iron ingots in the inventory\n  const ironIngots"
  },
  {
    "path": "skill_library/trial1/skill/code/craftIronHelmet.js",
    "chars": 821,
    "preview": "async function craftIronHelmet(bot) {\n  // Check if there are enough iron ingots in the inventory\n  const ironIngotsCoun"
  },
  {
    "path": "skill_library/trial1/skill/code/craftIronHelmetV2.js",
    "chars": 349,
    "preview": "async function craftIronHelmet(bot) {\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.ent"
  },
  {
    "path": "skill_library/trial1/skill/code/craftIronLeggingsAndBoots.js",
    "chars": 958,
    "preview": "async function craftIronLeggingsAndBoots(bot) {\n  // Check if there are enough iron ingots in the inventory\n  const iron"
  },
  {
    "path": "skill_library/trial1/skill/code/craftIronPickaxe.js",
    "chars": 998,
    "preview": "async function craftIronPickaxe(bot) {\n  // Check if there are enough iron ingots and sticks in the inventory\n  const ir"
  },
  {
    "path": "skill_library/trial1/skill/code/craftIronPickaxeV2.js",
    "chars": 998,
    "preview": "async function craftIronPickaxe(bot) {\n  // Check if there are enough iron ingots and sticks in the inventory\n  const ir"
  },
  {
    "path": "skill_library/trial1/skill/code/craftIronShovel.js",
    "chars": 1156,
    "preview": "async function craftIronShovel(bot) {\n  // Check if there are enough iron ingots and sticks in the inventory\n  const iro"
  },
  {
    "path": "skill_library/trial1/skill/code/craftIronSword.js",
    "chars": 990,
    "preview": "async function craftIronSword(bot) {\n  // Check if there are enough iron ingots and sticks in the inventory\n  const iron"
  },
  {
    "path": "skill_library/trial1/skill/code/craftLightningRod.js",
    "chars": 1297,
    "preview": "async function findSuitablePosition(bot) {\n  const offsets = [new Vec3(1, 0, 0), new Vec3(-1, 0, 0), new Vec3(0, 0, 1), "
  },
  {
    "path": "skill_library/trial1/skill/code/craftOakPlanksAndSticks.js",
    "chars": 904,
    "preview": "async function craftOakPlanksAndSticks(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlan"
  },
  {
    "path": "skill_library/trial1/skill/code/craftScaffolding.js",
    "chars": 660,
    "preview": "async function craftScaffolding(bot) {\n  // Check if we have a crafting table in the inventory\n  const craftingTableCoun"
  },
  {
    "path": "skill_library/trial1/skill/code/craftShears.js",
    "chars": 344,
    "preview": "async function craftShears(bot) {\n  // Place the crafting table near the bot\n  const craftingTablePosition = bot.entity."
  },
  {
    "path": "skill_library/trial1/skill/code/craftShieldImproved.js",
    "chars": 2011,
    "preview": "async function craftShieldImproved(bot) {\n  // Check if there are enough oak planks in the inventory\n  let oakPlanksCoun"
  },
  {
    "path": "skill_library/trial1/skill/code/craftStonePickaxe.js",
    "chars": 883,
    "preview": "async function craftStonePickaxe(bot) {\n  // Check if there are enough cobblestone and sticks in the inventory\n  const c"
  },
  {
    "path": "skill_library/trial1/skill/code/craftStoneShovel.js",
    "chars": 881,
    "preview": "async function craftStoneShovel(bot) {\n  // Check if there are enough cobblestone and sticks in the inventory\n  const co"
  },
  {
    "path": "skill_library/trial1/skill/code/craftWhiteBed.js",
    "chars": 1165,
    "preview": "async function craftWhiteBed(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount = "
  },
  {
    "path": "skill_library/trial1/skill/code/craftWoodenHoe.js",
    "chars": 1201,
    "preview": "async function craftWoodenHoe(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount ="
  },
  {
    "path": "skill_library/trial1/skill/code/craftWoodenPickaxe.js",
    "chars": 1451,
    "preview": "async function craftWoodenPickaxe(bot) {\n  // check if crafting table is in the inventory\n  const craftingTableCount = b"
  },
  {
    "path": "skill_library/trial1/skill/code/craftWoodenSword.js",
    "chars": 1209,
    "preview": "async function craftWoodenSword(bot) {\n  // Check if there are enough oak planks in the inventory\n  const oakPlanksCount"
  },
  {
    "path": "skill_library/trial1/skill/code/eatCookedPorkchop.js",
    "chars": 385,
    "preview": "async function eatCookedPorkchop(bot) {\n  // Equip the cooked porkchop in the bot's hand\n  const cookedPorkchop = bot.in"
  },
  {
    "path": "skill_library/trial1/skill/code/eatTwoCookedMutton.js",
    "chars": 586,
    "preview": "async function eatTwoCookedMutton(bot) {\n  // Check if there are 2 cooked mutton in the inventory\n  const cookedMutton ="
  },
  {
    "path": "skill_library/trial1/skill/code/equipIronArmor.js",
    "chars": 996,
    "preview": "async function equipIronArmor(bot) {\n  // Find the iron_leggings, iron_boots, and iron_helmet in the inventory\n  const i"
  },
  {
    "path": "skill_library/trial1/skill/code/equipIronChestplate.js",
    "chars": 404,
    "preview": "async function equipIronChestplate(bot) {\n  // Find the iron chestplate in the inventory\n  const ironChestplate = bot.in"
  },
  {
    "path": "skill_library/trial1/skill/code/equipIronSword.js",
    "chars": 706,
    "preview": "async function equipIronSword(bot) {\n  // Find the iron sword in the inventory\n  let ironSword = bot.inventory.findInven"
  },
  {
    "path": "skill_library/trial1/skill/code/fillBucketWithWater.js",
    "chars": 884,
    "preview": "async function fillBucketWithWater(bot) {\n  // Find a water block nearby\n  const waterBlock = await exploreUntil(bot, ne"
  },
  {
    "path": "skill_library/trial1/skill/code/killFourSheep.js",
    "chars": 927,
    "preview": "async function killFourSheep(bot) {\n  // Equip the wooden sword\n  const woodenSword = bot.inventory.findInventoryItem(mc"
  },
  {
    "path": "skill_library/trial1/skill/code/killOneEnderman.js",
    "chars": 857,
    "preview": "async function killOneEnderman(bot) {\n  // Equip the iron sword\n  const ironSword = bot.inventory.findInventoryItem(mcDa"
  },
  {
    "path": "skill_library/trial1/skill/code/killOnePig.js",
    "chars": 795,
    "preview": "async function killOnePig(bot) {\n  // Equip the wooden sword\n  const woodenSword = bot.inventory.findInventoryItem(mcDat"
  },
  {
    "path": "skill_library/trial1/skill/code/killOneSpider.js",
    "chars": 827,
    "preview": "async function killOneSpider(bot) {\n  // Equip the iron sword\n  const ironSword = bot.inventory.findInventoryItem(mcData"
  },
  {
    "path": "skill_library/trial1/skill/code/killOneZombie.js",
    "chars": 827,
    "preview": "async function killOneZombie(bot) {\n  // Equip the iron sword\n  const ironSword = bot.inventory.findInventoryItem(mcData"
  },
  {
    "path": "skill_library/trial1/skill/code/killTwoPigs.js",
    "chars": 859,
    "preview": "async function killTwoPigs(bot) {\n  // Equip the wooden sword\n  const woodenSword = bot.inventory.findInventoryItem(mcDa"
  },
  {
    "path": "skill_library/trial1/skill/code/mineFiveCoalOres.js",
    "chars": 694,
    "preview": "async function mineFiveCoalOres(bot) {\n  // Equip the wooden pickaxe\n  const woodenPickaxe = bot.inventory.findInventory"
  },
  {
    "path": "skill_library/trial1/skill/code/mineFiveCoalOresV2.js",
    "chars": 690,
    "preview": "async function mineFiveCoalOres(bot) {\n  // Equip the stone pickaxe\n  const stonePickaxe = bot.inventory.findInventoryIt"
  },
  {
    "path": "skill_library/trial1/skill/code/mineFiveCopperOres.js",
    "chars": 714,
    "preview": "async function mineFiveCopperOres(bot) {\n  // Equip the stone pickaxe\n  const stonePickaxe = bot.inventory.findInventory"
  },
  {
    "path": "skill_library/trial1/skill/code/mineFiveCopperOresV2.js",
    "chars": 607,
    "preview": "async function mineFiveCopperOres(bot) {\n  // Check if the bot already has 5 or more copper ores in the inventory\n  cons"
  },
  {
    "path": "skill_library/trial1/skill/code/mineFiveIronOres.js",
    "chars": 690,
    "preview": "async function mineFiveIronOres(bot) {\n  // Equip the stone pickaxe\n  const stonePickaxe = bot.inventory.findInventoryIt"
  },
  {
    "path": "skill_library/trial1/skill/code/mineFiveIronOresV2.js",
    "chars": 690,
    "preview": "async function mineFiveIronOres(bot) {\n  // Equip the stone pickaxe\n  const stonePickaxe = bot.inventory.findInventoryIt"
  },
  {
    "path": "skill_library/trial1/skill/code/mineFiveLapisLazuliOres.js",
    "chars": 733,
    "preview": "async function mineFiveLapisLazuliOres(bot) {\n  // Equip the iron pickaxe\n  const ironPickaxe = bot.inventory.findInvent"
  },
  {
    "path": "skill_library/trial1/skill/code/mineTenCobblestone.js",
    "chars": 993,
    "preview": "async function mineTenCobblestone(bot) {\n  // Check if the bot has a pickaxe in the inventory\n  const pickaxe = bot.inve"
  },
  {
    "path": "skill_library/trial1/skill/code/mineThreeMoreOakLogs.js",
    "chars": 939,
    "preview": "async function mineThreeMoreOakLogs(bot) {\n  // Check the initial inventory for oak logs\n  const initialOakLogs = bot.in"
  },
  {
    "path": "skill_library/trial1/skill/code/mineWoodLog.js",
    "chars": 577,
    "preview": "async function mineWoodLog(bot) {\n  const woodLogNames = [\"oak_log\", \"birch_log\", \"spruce_log\", \"jungle_log\", \"acacia_lo"
  },
  {
    "path": "skill_library/trial1/skill/code/obtainOneMoreAcaciaLog.js",
    "chars": 971,
    "preview": "async function obtainOneMoreAcaciaLog(bot) {\n  // Check the initial inventory for acacia logs\n  const initialAcaciaLogs "
  },
  {
    "path": "skill_library/trial1/skill/code/smeltCactusIntoGreenDye.js",
    "chars": 775,
    "preview": "async function smeltCactusIntoGreenDye(bot) {\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bo"
  },
  {
    "path": "skill_library/trial1/skill/code/smeltFiveRawIron.js",
    "chars": 583,
    "preview": "async function smeltFiveRawIron(bot) {\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bot.inven"
  },
  {
    "path": "skill_library/trial1/skill/code/smeltFiveRawIronV2.js",
    "chars": 1448,
    "preview": "async function findSuitablePosition(bot) {\n  const offsets = [\n    new Vec3(1, 0, 0),\n    new Vec3(-1, 0, 0),\n    new Ve"
  },
  {
    "path": "skill_library/trial1/skill/code/smeltRawCopper.js",
    "chars": 766,
    "preview": "async function smeltRawCopper(bot) {\n  // Check if there is a furnace in the inventory\n  const furnaceItem = bot.invento"
  },
  {
    "path": "skill_library/trial1/skill/description/collectBamboo.txt",
    "chars": 415,
    "preview": "async function collectBamboo(bot) {\n    // The function is about collecting 10 bamboo plants. It equips the iron sword a"
  },
  {
    "path": "skill_library/trial1/skill/description/collectFiveCactusBlocks.txt",
    "chars": 452,
    "preview": "async function collectFiveCactusBlocks(bot) {\n    // The function is about collecting 5 cactus blocks using an iron pick"
  },
  {
    "path": "skill_library/trial1/skill/description/cookPorkchops.txt",
    "chars": 358,
    "preview": "async function cookPorkchops(bot) {\n    // The function is about cooking 2 porkchops using a furnace and coal as fuel. F"
  },
  {
    "path": "skill_library/trial1/skill/description/cookSevenMutton.txt",
    "chars": 385,
    "preview": "async function cookSevenMutton(bot) {\n    // The function is about cooking 7 raw mutton using a furnace and coal as fuel"
  },
  {
    "path": "skill_library/trial1/skill/description/craftAcaciaPlanksAndSticks.txt",
    "chars": 458,
    "preview": "async function craftAcaciaPlanksAndSticks(bot) {\n    // The function is about crafting 20 acacia planks and 10 sticks. I"
  },
  {
    "path": "skill_library/trial1/skill/description/craftBucket.txt",
    "chars": 318,
    "preview": "async function craftBucket(bot) {\n    // The function crafts a bucket using a crafting table. It first checks if there a"
  },
  {
    "path": "skill_library/trial1/skill/description/craftChest.txt",
    "chars": 316,
    "preview": "async function craftChest(bot) {\n    // The function crafts a chest using a crafting table and oak planks. If there are "
  },
  {
    "path": "skill_library/trial1/skill/description/craftCopperBlock.txt",
    "chars": 340,
    "preview": "async function craftCopperBlock(bot) {\n    // The function crafts a copper block using a crafting table. It first checks"
  },
  {
    "path": "skill_library/trial1/skill/description/craftCraftingTable.txt",
    "chars": 269,
    "preview": "async function craftCraftingTable(bot) {\n    // The function crafts a crafting table using oak planks. It first checks i"
  },
  {
    "path": "skill_library/trial1/skill/description/craftFurnace.txt",
    "chars": 369,
    "preview": "async function craftFurnace(bot) {\n    // The function crafts a furnace using a crafting table and cobblestones. If ther"
  },
  {
    "path": "skill_library/trial1/skill/description/craftIronAxe.txt",
    "chars": 305,
    "preview": "async function craftIronAxe(bot) {\n    // The function crafts an iron axe using a crafting table. It checks if there are"
  },
  {
    "path": "skill_library/trial1/skill/description/craftIronChestplate.txt",
    "chars": 345,
    "preview": "async function craftIronChestplate(bot) {\n    // The function crafts an iron chestplate using a crafting table. It first"
  },
  {
    "path": "skill_library/trial1/skill/description/craftIronHelmet.txt",
    "chars": 333,
    "preview": "async function craftIronHelmet(bot) {\n    // The function crafts an iron helmet using a crafting table. It first checks "
  },
  {
    "path": "skill_library/trial1/skill/description/craftIronHelmetV2.txt",
    "chars": 244,
    "preview": "async function craftIronHelmet(bot) {\n    // The function is about crafting an iron helmet using a crafting table. First"
  },
  {
    "path": "skill_library/trial1/skill/description/craftIronLeggingsAndBoots.txt",
    "chars": 347,
    "preview": "async function craftIronLeggingsAndBoots(bot) {\n    // The function crafts iron leggings and boots using a crafting tabl"
  },
  {
    "path": "skill_library/trial1/skill/description/craftIronPickaxe.txt",
    "chars": 317,
    "preview": "async function craftIronPickaxe(bot) {\n    // The function crafts an iron pickaxe using a crafting table. It checks if t"
  },
  {
    "path": "skill_library/trial1/skill/description/craftIronPickaxeV2.txt",
    "chars": 317,
    "preview": "async function craftIronPickaxe(bot) {\n    // The function crafts an iron pickaxe using a crafting table. It checks if t"
  },
  {
    "path": "skill_library/trial1/skill/description/craftIronShovel.txt",
    "chars": 352,
    "preview": "async function craftIronShovel(bot) {\n    // The function crafts an iron shovel using a crafting table. It checks if the"
  },
  {
    "path": "skill_library/trial1/skill/description/craftIronSword.txt",
    "chars": 314,
    "preview": "async function craftIronSword(bot) {\n    // The function crafts an iron sword using a crafting table. It checks if there"
  },
  {
    "path": "skill_library/trial1/skill/description/craftLightningRod.txt",
    "chars": 377,
    "preview": "async function craftLightningRod(bot) {\n    // The function is about crafting a lightning rod. It first finds a suitable"
  },
  {
    "path": "skill_library/trial1/skill/description/craftOakPlanksAndSticks.txt",
    "chars": 294,
    "preview": "async function craftOakPlanksAndSticks(bot) {\n    // The function checks if there are enough oak planks and sticks in th"
  },
  {
    "path": "skill_library/trial1/skill/description/craftScaffolding.txt",
    "chars": 336,
    "preview": "async function craftScaffolding(bot) {\n    // The function is about crafting 10 scaffolding using a crafting table. Firs"
  },
  {
    "path": "skill_library/trial1/skill/description/craftShears.txt",
    "chars": 255,
    "preview": "async function craftShears(bot) {\n    // The function is about crafting a pair of shears. First, place a crafting table "
  },
  {
    "path": "skill_library/trial1/skill/description/craftShieldImproved.txt",
    "chars": 363,
    "preview": "async function craftShieldImproved(bot) {\n    // The function crafts a shield using oak planks and iron ingots. It check"
  },
  {
    "path": "skill_library/trial1/skill/description/craftStonePickaxe.txt",
    "chars": 328,
    "preview": "async function craftStonePickaxe(bot) {\n    // The function crafts a stone pickaxe using cobblestone and sticks. It chec"
  },
  {
    "path": "skill_library/trial1/skill/description/craftStoneShovel.txt",
    "chars": 414,
    "preview": "async function craftStoneShovel(bot) {\n    // The function crafts a stone shovel using cobblestone and sticks. It checks"
  },
  {
    "path": "skill_library/trial1/skill/description/craftWhiteBed.txt",
    "chars": 369,
    "preview": "async function craftWhiteBed(bot) {\n    // The function crafts a white bed using oak planks and white wool. If there are"
  },
  {
    "path": "skill_library/trial1/skill/description/craftWoodenHoe.txt",
    "chars": 318,
    "preview": "async function craftWoodenHoe(bot) {\n    // The function crafts a wooden hoe using oak planks and sticks. If there are n"
  },
  {
    "path": "skill_library/trial1/skill/description/craftWoodenPickaxe.txt",
    "chars": 319,
    "preview": "async function craftWoodenPickaxe(bot) {\n    // The function crafts a wooden pickaxe using oak planks, sticks, and a cra"
  },
  {
    "path": "skill_library/trial1/skill/description/craftWoodenSword.txt",
    "chars": 313,
    "preview": "async function craftWoodenSword(bot) {\n    // The function crafts a wooden sword using oak planks, sticks, and a craftin"
  },
  {
    "path": "skill_library/trial1/skill/description/eatCookedPorkchop.txt",
    "chars": 218,
    "preview": "async function eatCookedPorkchop(bot) {\n    // The function is about eating a cooked porkchop. It equips the cooked pork"
  },
  {
    "path": "skill_library/trial1/skill/description/eatTwoCookedMutton.txt",
    "chars": 356,
    "preview": "async function eatTwoCookedMutton(bot) {\n    // The function is about eating two cooked muttons. It checks if there are "
  },
  {
    "path": "skill_library/trial1/skill/description/equipIronArmor.txt",
    "chars": 336,
    "preview": "async function equipIronArmor(bot) {\n    // The function is about equipping iron armor (leggings, boots, and helmet) in "
  },
  {
    "path": "skill_library/trial1/skill/description/equipIronChestplate.txt",
    "chars": 296,
    "preview": "async function equipIronChestplate(bot) {\n    // The function is about equipping an iron chestplate on the bot's torso. "
  },
  {
    "path": "skill_library/trial1/skill/description/equipIronSword.txt",
    "chars": 312,
    "preview": "async function equipIronSword(bot) {\n    // The function is about equipping an iron sword. It first checks if the iron s"
  },
  {
    "path": "skill_library/trial1/skill/description/fillBucketWithWater.txt",
    "chars": 297,
    "preview": "async function fillBucketWithWater(bot) {\n    // This function fills a bucket with water by first finding a nearby water"
  },
  {
    "path": "skill_library/trial1/skill/description/killFourSheep.txt",
    "chars": 300,
    "preview": "async function killFourSheep(bot) {\n    // The function is about killing four sheep and collecting their drops. It equip"
  },
  {
    "path": "skill_library/trial1/skill/description/killOneEnderman.txt",
    "chars": 383,
    "preview": "async function killOneEnderman(bot) {\n    // The function is about killing one enderman using an iron sword. First, equi"
  },
  {
    "path": "skill_library/trial1/skill/description/killOnePig.txt",
    "chars": 368,
    "preview": "async function killOnePig(bot) {\n    // The function is about killing a pig using a wooden sword and collecting the drop"
  },
  {
    "path": "skill_library/trial1/skill/description/killOneSpider.txt",
    "chars": 368,
    "preview": "async function killOneSpider(bot) {\n    // The function is about killing a spider using an iron sword. First, equip the "
  },
  {
    "path": "skill_library/trial1/skill/description/killOneZombie.txt",
    "chars": 317,
    "preview": "async function killOneZombie(bot) {\n    // The function is about killing a single zombie using an iron sword. First, equ"
  },
  {
    "path": "skill_library/trial1/skill/description/killTwoPigs.txt",
    "chars": 454,
    "preview": "async function killTwoPigs(bot) {\n    // The function is about killing two pigs and collecting their dropped items. The "
  },
  {
    "path": "skill_library/trial1/skill/description/mineFiveCoalOres.txt",
    "chars": 505,
    "preview": "async function mineFiveCoalOres(bot) {\n    // The function is about mining 5 coal ores using a wooden pickaxe. The funct"
  },
  {
    "path": "skill_library/trial1/skill/description/mineFiveCoalOresV2.txt",
    "chars": 287,
    "preview": "async function mineFiveCoalOres(bot) {\n    // The function is about mining 5 coal ores using a stone pickaxe. First, equ"
  },
  {
    "path": "skill_library/trial1/skill/description/mineFiveCopperOres.txt",
    "chars": 295,
    "preview": "async function mineFiveCopperOres(bot) {\n    // The function is about mining 5 copper ores using a stone pickaxe. First,"
  },
  {
    "path": "skill_library/trial1/skill/description/mineFiveCopperOresV2.txt",
    "chars": 210,
    "preview": "async function mineFiveCopperOres(bot) {\n    // The function checks if the bot already has 5 or more copper ores in the "
  },
  {
    "path": "skill_library/trial1/skill/description/mineFiveIronOres.txt",
    "chars": 287,
    "preview": "async function mineFiveIronOres(bot) {\n    // The function is about mining 5 iron ores using a stone pickaxe. First, equ"
  },
  {
    "path": "skill_library/trial1/skill/description/mineFiveIronOresV2.txt",
    "chars": 287,
    "preview": "async function mineFiveIronOres(bot) {\n    // The function is about mining 5 iron ores using a stone pickaxe. First, equ"
  },
  {
    "path": "skill_library/trial1/skill/description/mineFiveLapisLazuliOres.txt",
    "chars": 316,
    "preview": "async function mineFiveLapisLazuliOres(bot) {\n    // The function is about mining 5 lapis lazuli ores using an iron pick"
  },
  {
    "path": "skill_library/trial1/skill/description/mineTenCobblestone.txt",
    "chars": 448,
    "preview": "async function mineTenCobblestone(bot) {\n    // The function is about mining 10 cobblestones using a pickaxe. First, che"
  },
  {
    "path": "skill_library/trial1/skill/description/mineThreeMoreOakLogs.txt",
    "chars": 412,
    "preview": "async function mineThreeMoreOakLogs(bot) {\n    // The function is about mining 3 oak logs. It first checks the initial i"
  },
  {
    "path": "skill_library/trial1/skill/description/mineWoodLog.txt",
    "chars": 341,
    "preview": "async function mineWoodLog(bot) {\n    // The function is about mining a single wood log block. It searches for a wood lo"
  },
  {
    "path": "skill_library/trial1/skill/description/obtainOneMoreAcaciaLog.txt",
    "chars": 289,
    "preview": "async function obtainOneMoreAcaciaLog(bot) {\n    // The function checks if there are less than 5 acacia logs in the inve"
  },
  {
    "path": "skill_library/trial1/skill/description/smeltCactusIntoGreenDye.txt",
    "chars": 402,
    "preview": "async function smeltCactusIntoGreenDye(bot) {\n    // The function is about smelting 5 cactus into green dye using a furn"
  },
  {
    "path": "skill_library/trial1/skill/description/smeltFiveRawIron.txt",
    "chars": 352,
    "preview": "async function smeltFiveRawIron(bot) {\n    // The function is about smelting 5 raw iron using a furnace and coal as fuel"
  },
  {
    "path": "skill_library/trial1/skill/description/smeltFiveRawIronV2.txt",
    "chars": 316,
    "preview": "async function smeltFiveRawIron(bot) {\n    // The function is about smelting 5 raw iron using a furnace and coal as fuel"
  },
  {
    "path": "skill_library/trial1/skill/description/smeltRawCopper.txt",
    "chars": 347,
    "preview": "async function smeltRawCopper(bot) {\n    // The function is about smelting 19 raw copper using a furnace and coal as fue"
  },
  {
    "path": "skill_library/trial1/skill/skills.json",
    "chars": 66864,
    "preview": "{\"mineWoodLog\": {\"code\": \"async function mineWoodLog(bot) {\\n  const woodLogNames = [\\\"oak_log\\\", \\\"birch_log\\\", \\\"spruc"
  },
  {
    "path": "skill_library/trial2/skill/code/catchFiveFishSafely.js",
    "chars": 1470,
    "preview": "async function catchFiveFishSafely(bot) {\n  // Check if the bot has a fishing rod in its inventory\n  let fishingRod = bo"
  },
  {
    "path": "skill_library/trial2/skill/code/catchThreeFish.js",
    "chars": 1465,
    "preview": "async function catchThreeFish(bot) {\n  // Check if the bot has a fishing rod in its inventory\n  let fishingRod = bot.inv"
  },
  {
    "path": "skill_library/trial2/skill/code/checkStonePickaxe.js",
    "chars": 315,
    "preview": "async function checkStonePickaxe(bot) {\n  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_"
  },
  {
    "path": "skill_library/trial2/skill/code/chopDownSpruceLogs.js",
    "chars": 403,
    "preview": "async function chopDownSpruceLogs(bot) {\n  const spruceLogCount = bot.inventory.count(mcData.itemsByName.spruce_log.id);"
  },
  {
    "path": "skill_library/trial2/skill/code/chopDownSpruceLogsV2.js",
    "chars": 403,
    "preview": "async function chopDownSpruceLogs(bot) {\n  const spruceLogCount = bot.inventory.count(mcData.itemsByName.spruce_log.id);"
  },
  {
    "path": "skill_library/trial2/skill/code/chopSpruceLogs.js",
    "chars": 399,
    "preview": "async function chopSpruceLogs(bot) {\n  const spruceLogCount = bot.inventory.count(mcData.itemsByName.spruce_log.id);\n  c"
  },
  {
    "path": "skill_library/trial2/skill/code/collectWaterWithBucket.js",
    "chars": 690,
    "preview": "async function collectWaterWithBucket(bot) {\n  const waterBlock = bot.findBlock({\n    matching: mcData.blocksByName.wate"
  },
  {
    "path": "skill_library/trial2/skill/code/cookMutton.js",
    "chars": 1090,
    "preview": "async function cookMutton(bot) {\n  const rawMuttonCount = bot.inventory.count(mcData.itemsByName.mutton.id);\n  if (rawMu"
  },
  {
    "path": "skill_library/trial2/skill/code/craftBucket.js",
    "chars": 662,
    "preview": "async function craftBucket(bot) {\n  const requiredIronIngots = 3;\n  const ironIngotsCount = bot.inventory.count(mcData.i"
  },
  {
    "path": "skill_library/trial2/skill/code/craftChest.js",
    "chars": 823,
    "preview": "async function craftChest(bot) {\n  const requiredPlanks = 8;\n  const planksCount = bot.inventory.count(mcData.itemsByNam"
  },
  {
    "path": "skill_library/trial2/skill/code/craftEightSticks.js",
    "chars": 797,
    "preview": "async function craftEightSticks(bot) {\n  const requiredPlanks = 2;\n  const planksCount = bot.inventory.count(mcData.item"
  },
  {
    "path": "skill_library/trial2/skill/code/craftEightTorches.js",
    "chars": 436,
    "preview": "async function craftEightTorches(bot) {\n  const craftingTable = bot.findBlock({\n    matching: mcData.blocksByName.crafti"
  },
  {
    "path": "skill_library/trial2/skill/code/craftFishingRod.js",
    "chars": 1434,
    "preview": "async function craftFishingRod(bot) {\n  // Check if we have enough strings\n  const requiredStrings = 2;\n  const stringsC"
  },
  {
    "path": "skill_library/trial2/skill/code/craftFurnace.js",
    "chars": 674,
    "preview": "async function craftFurnace(bot) {\n  const requiredCobblestones = 8;\n  const cobblestoneCount = bot.inventory.count(mcDa"
  },
  {
    "path": "skill_library/trial2/skill/code/craftIronChestplate.js",
    "chars": 934,
    "preview": "async function craftIronChestplate(bot) {\n  const requiredIronIngots = 8;\n  const ironIngotsCount = bot.inventory.count("
  },
  {
    "path": "skill_library/trial2/skill/code/craftIronHelmet.js",
    "chars": 794,
    "preview": "async function craftIronHelmet(bot) {\n  const requiredIronIngots = 5;\n  const ironIngotsCount = bot.inventory.count(mcDa"
  },
  {
    "path": "skill_library/trial2/skill/code/craftIronLeggingsAndBoots.js",
    "chars": 1044,
    "preview": "async function craftIronLeggingsAndBoots(bot) {\n  const requiredIronIngots = 11; // 7 for leggings, 4 for boots\n  const "
  },
  {
    "path": "skill_library/trial2/skill/code/craftIronPickaxe.js",
    "chars": 828,
    "preview": "async function craftIronPickaxe(bot) {\n  const requiredIronIngots = 3;\n  const requiredSticks = 2;\n  const ironIngotsCou"
  },
  {
    "path": "skill_library/trial2/skill/code/craftIronPickaxeWithMaterials.js",
    "chars": 1231,
    "preview": "async function craftIronPickaxeWithMaterials(bot) {\n  const requiredIronIngots = 3;\n  const requiredSticks = 2;\n  const "
  },
  {
    "path": "skill_library/trial2/skill/code/craftIronSword.js",
    "chars": 1212,
    "preview": "async function craftIronSword(bot) {\n  const requiredIronIngots = 2;\n  const requiredSticks = 1;\n  const ironIngotsCount"
  },
  {
    "path": "skill_library/trial2/skill/code/craftShieldWithFurnace.js",
    "chars": 1446,
    "preview": "async function craftShieldWithFurnace(bot) {\n  const requiredIronIngots = 1;\n  const requiredSprucePlanks = 6;\n  const i"
  },
  {
    "path": "skill_library/trial2/skill/code/craftSixteenTorches.js",
    "chars": 705,
    "preview": "async function craftSixteenTorches(bot) {\n  const requiredSticks = 4;\n  const sticksCount = bot.inventory.count(mcData.i"
  },
  {
    "path": "skill_library/trial2/skill/code/craftSpyglass.js",
    "chars": 874,
    "preview": "async function craftSpyglass(bot) {\n  const requiredCopperIngots = 2;\n  const requiredAmethystShards = 1;\n  const copper"
  },
  {
    "path": "skill_library/trial2/skill/code/craftSticks.js",
    "chars": 639,
    "preview": "async function craftSticks(bot) {\n  const requiredPlanks = 2;\n  const planksCount = bot.inventory.count(mcData.itemsByNa"
  },
  {
    "path": "skill_library/trial2/skill/code/craftStoneAxe.js",
    "chars": 1069,
    "preview": "async function craftStoneAxe(bot) {\n  const requiredCobblestones = 3;\n  const requiredSticks = 2;\n  const cobblestoneCou"
  },
  {
    "path": "skill_library/trial2/skill/code/craftStoneHoe.js",
    "chars": 1069,
    "preview": "async function craftStoneHoe(bot) {\n  const requiredCobblestones = 2;\n  const requiredSticks = 2;\n  const cobblestoneCou"
  },
  {
    "path": "skill_library/trial2/skill/code/craftStonePickaxe.js",
    "chars": 1079,
    "preview": "async function craftStonePickaxe(bot) {\n  const requiredCobblestones = 3;\n  const requiredSticks = 2;\n  const cobbleston"
  },
  {
    "path": "skill_library/trial2/skill/code/craftStoneShovel.js",
    "chars": 1078,
    "preview": "async function craftStoneShovel(bot) {\n  const requiredCobblestones = 1;\n  const requiredSticks = 2;\n  const cobblestone"
  },
  {
    "path": "skill_library/trial2/skill/code/craftStoneSword.js",
    "chars": 1038,
    "preview": "async function craftStoneSword(bot) {\n  const requiredCobblestones = 2;\n  const requiredSticks = 1;\n  const cobblestoneC"
  },
  {
    "path": "skill_library/trial2/skill/code/craftTorches.js",
    "chars": 972,
    "preview": "async function craftTorches(bot) {\n  const requiredCoal = 2;\n  const requiredSticks = 2;\n  const coalCount = bot.invento"
  },
  {
    "path": "skill_library/trial2/skill/code/craftTwentySprucePlanks.js",
    "chars": 531,
    "preview": "async function craftTwentySprucePlanks(bot) {\n  const requiredLogs = 5;\n  const spruceLogCount = bot.inventory.count(mcD"
  },
  {
    "path": "skill_library/trial2/skill/code/craftWhiteBedWithExploration.js",
    "chars": 1799,
    "preview": "async function craftWhiteBedWithExploration(bot) {\n  // Step 1: Explore the area to find and kill sheep to collect the r"
  },
  {
    "path": "skill_library/trial2/skill/code/craftWoodenHoe.js",
    "chars": 1055,
    "preview": "async function craftWoodenHoe(bot) {\n  const requiredPlanks = 2;\n  const requiredSticks = 2;\n  const planksCount = bot.i"
  },
  {
    "path": "skill_library/trial2/skill/code/craftWoodenPickaxe.js",
    "chars": 914,
    "preview": "async function craftWoodenPickaxe(bot) {\n  const requiredPlanks = 3;\n  const requiredSticks = 2;\n  const planksCount = b"
  },
  {
    "path": "skill_library/trial2/skill/code/craftWoodenPlanks.js",
    "chars": 749,
    "preview": "async function craftWoodenPlanks(bot) {\n  const logNames = [\"oak_log\", \"birch_log\", \"spruce_log\", \"jungle_log\", \"acacia_"
  },
  {
    "path": "skill_library/trial2/skill/code/eatCookedMutton.js",
    "chars": 232,
    "preview": "async function eatCookedMutton(bot) {\n  const cookedMutton = bot.inventory.findInventoryItem(mcData.itemsByName.cooked_m"
  },
  {
    "path": "skill_library/trial2/skill/code/eatCookedMuttonV2.js",
    "chars": 232,
    "preview": "async function eatCookedMutton(bot) {\n  const cookedMutton = bot.inventory.findInventoryItem(mcData.itemsByName.cooked_m"
  },
  {
    "path": "skill_library/trial2/skill/code/eatCookedMuttonV3.js",
    "chars": 232,
    "preview": "async function eatCookedMutton(bot) {\n  const cookedMutton = bot.inventory.findInventoryItem(mcData.itemsByName.cooked_m"
  },
  {
    "path": "skill_library/trial2/skill/code/equipIronArmor.js",
    "chars": 1097,
    "preview": "async function equipIronArmor(bot) {\n  const ironHelmet = bot.inventory.findInventoryItem(mcData.itemsByName.iron_helmet"
  },
  {
    "path": "skill_library/trial2/skill/code/exploreCave.js",
    "chars": 1388,
    "preview": "async function exploreCave(bot) {\n  const torches = bot.inventory.findInventoryItem(mcData.itemsByName.torch.id);\n  if ("
  },
  {
    "path": "skill_library/trial2/skill/code/exploreCaveAndGatherResources.js",
    "chars": 1828,
    "preview": "async function exploreCaveAndGatherResources(bot) {\n  // Equip torches\n  const torches = bot.inventory.findInventoryItem"
  },
  {
    "path": "skill_library/trial2/skill/code/exploreCaveAndGatherResourcesV2.js",
    "chars": 1828,
    "preview": "async function exploreCaveAndGatherResources(bot) {\n  // Equip torches\n  const torches = bot.inventory.findInventoryItem"
  },
  {
    "path": "skill_library/trial2/skill/code/fishInNearbyWaterSafely.js",
    "chars": 1621,
    "preview": "async function fishInNearbyWaterSafely(bot) {\n  // Check if the bot has a fishing rod in its inventory\n  let fishingRod "
  },
  {
    "path": "skill_library/trial2/skill/code/mineCoalOre.js",
    "chars": 772,
    "preview": "async function mineCoalOre(bot) {\n  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_pickax"
  },
  {
    "path": "skill_library/trial2/skill/code/mineCopperOreWithStonePickaxe.js",
    "chars": 1084,
    "preview": "async function mineCopperOreWithStonePickaxe(bot) {\n  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsB"
  },
  {
    "path": "skill_library/trial2/skill/code/mineFiveCoalOres.js",
    "chars": 363,
    "preview": "async function mineFiveCoalOres(bot) {\n  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_p"
  },
  {
    "path": "skill_library/trial2/skill/code/mineFiveCoalOresV2.js",
    "chars": 363,
    "preview": "async function mineFiveCoalOres(bot) {\n  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_p"
  },
  {
    "path": "skill_library/trial2/skill/code/mineFiveCopperOres.js",
    "chars": 382,
    "preview": "async function mineFiveCopperOres(bot) {\n  const copperOreCount = bot.inventory.count(mcData.itemsByName.copper_ore.id);"
  },
  {
    "path": "skill_library/trial2/skill/code/mineFiveIronOres.js",
    "chars": 1004,
    "preview": "async function mineFiveIronOres(bot) {\n  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_p"
  },
  {
    "path": "skill_library/trial2/skill/code/mineLapisOre.js",
    "chars": 1190,
    "preview": "async function mineLapisOre(bot) {\n  const pickaxeTypes = [mcData.itemsByName.stone_pickaxe.id, mcData.itemsByName.iron_"
  },
  {
    "path": "skill_library/trial2/skill/code/mineThreeIronOres.js",
    "chars": 953,
    "preview": "async function mineThreeIronOres(bot) {\n  const stonePickaxe = bot.inventory.findInventoryItem(mcData.itemsByName.stone_"
  },
  {
    "path": "skill_library/trial2/skill/code/mineWoodLog.js",
    "chars": 642,
    "preview": "async function mineWoodLog(bot) {\n  const logNames = [\"oak_log\", \"birch_log\", \"spruce_log\", \"jungle_log\", \"acacia_log\", "
  },
  {
    "path": "skill_library/trial2/skill/code/smeltOneRawIron.js",
    "chars": 654,
    "preview": "async function smeltOneRawIron(bot) {\n  const furnaceInInventory = bot.inventory.findInventoryItem(mcData.itemsByName.fu"
  },
  {
    "path": "skill_library/trial2/skill/code/smeltRawCopper.js",
    "chars": 872,
    "preview": "async function smeltRawCopper(bot) {\n  const furnaceInInventory = bot.inventory.findInventoryItem(mcData.itemsByName.fur"
  },
  {
    "path": "skill_library/trial2/skill/code/smeltRawIron.js",
    "chars": 902,
    "preview": "async function smeltRawIron(bot) {\n  const furnaceInInventory = bot.inventory.findInventoryItem(mcData.itemsByName.furna"
  },
  {
    "path": "skill_library/trial2/skill/code/smeltSixRawIron.js",
    "chars": 905,
    "preview": "async function smeltSixRawIron(bot) {\n  const furnaceInInventory = bot.inventory.findInventoryItem(mcData.itemsByName.fu"
  },
  {
    "path": "skill_library/trial2/skill/code/smeltTwentyFiveIronIngots.js",
    "chars": 918,
    "preview": "async function smeltTwentyFiveIronIngots(bot) {\n  const furnaceInInventory = bot.inventory.findInventoryItem(mcData.item"
  },
  {
    "path": "skill_library/trial2/skill/description/catchFiveFishSafely.txt",
    "chars": 431,
    "preview": "async function catchFiveFishSafely(bot) {\n    // The function is about catching five fish safely using a fishing rod. Fi"
  },
  {
    "path": "skill_library/trial2/skill/description/catchThreeFish.txt",
    "chars": 421,
    "preview": "async function catchThreeFish(bot) {\n    // The function is about catching three fish using a fishing rod. First, it che"
  },
  {
    "path": "skill_library/trial2/skill/description/checkStonePickaxe.txt",
    "chars": 179,
    "preview": "async function checkStonePickaxe(bot) {\n    // The function checks if the bot has a stone pickaxe in its inventory and s"
  },
  {
    "path": "skill_library/trial2/skill/description/chopDownSpruceLogs.txt",
    "chars": 376,
    "preview": "async function chopDownSpruceLogs(bot) {\n    // The function is about chopping down spruce logs until there are 5 in the"
  },
  {
    "path": "skill_library/trial2/skill/description/chopDownSpruceLogsV2.txt",
    "chars": 385,
    "preview": "async function chopDownSpruceLogs(bot) {\n    // The function is about chopping down spruce logs until there are 5 in the"
  },
  {
    "path": "skill_library/trial2/skill/description/chopSpruceLogs.txt",
    "chars": 384,
    "preview": "async function chopSpruceLogs(bot) {\n    // The function is about chopping down spruce logs until there are 3 in the inv"
  },
  {
    "path": "skill_library/trial2/skill/description/collectWaterWithBucket.txt",
    "chars": 451,
    "preview": "async function collectWaterWithBucket(bot) {\n    // The function is about collecting water with a bucket. It first searc"
  },
  {
    "path": "skill_library/trial2/skill/description/cookMutton.txt",
    "chars": 574,
    "preview": "async function cookMutton(bot) {\n    // The function is about cooking 5 raw muttons using a furnace and coal. It first c"
  },
  {
    "path": "skill_library/trial2/skill/description/craftBucket.txt",
    "chars": 244,
    "preview": "async function craftBucket(bot) {\n    // The function crafts a bucket using 3 iron ingots. If there are not enough iron "
  },
  {
    "path": "skill_library/trial2/skill/description/craftChest.txt",
    "chars": 296,
    "preview": "async function craftChest(bot) {\n    // The function crafts a chest using spruce planks and a crafting table. If there a"
  },
  {
    "path": "skill_library/trial2/skill/description/craftEightSticks.txt",
    "chars": 315,
    "preview": "async function craftEightSticks(bot) {\n    // The function crafts 8 sticks using spruce planks. If there are not enough "
  },
  {
    "path": "skill_library/trial2/skill/description/craftEightTorches.txt",
    "chars": 297,
    "preview": "async function craftEightTorches(bot) {\n    // The function is about crafting 8 torches. First, it checks if there is a "
  },
  {
    "path": "skill_library/trial2/skill/description/craftFishingRod.txt",
    "chars": 325,
    "preview": "async function craftFishingRod(bot) {\n    // The function crafts a fishing rod using 2 strings and 3 sticks. If there ar"
  },
  {
    "path": "skill_library/trial2/skill/description/craftFurnace.txt",
    "chars": 312,
    "preview": "async function craftFurnace(bot) {\n    // The function crafts a furnace using 8 cobblestones and a crafting table. If th"
  },
  {
    "path": "skill_library/trial2/skill/description/craftIronChestplate.txt",
    "chars": 420,
    "preview": "async function craftIronChestplate(bot) {\n    // The function crafts an iron chestplate using iron ingots. If there are "
  },
  {
    "path": "skill_library/trial2/skill/description/craftIronHelmet.txt",
    "chars": 286,
    "preview": "async function craftIronHelmet(bot) {\n    // The function crafts an iron helmet using 5 iron ingots. If there are not en"
  },
  {
    "path": "skill_library/trial2/skill/description/craftIronLeggingsAndBoots.txt",
    "chars": 347,
    "preview": "async function craftIronLeggingsAndBoots(bot) {\n    // The function crafts iron leggings and boots. It checks if there a"
  }
]

// ... and 216 more files (download for full content)

About this extraction

This page contains the full source code of the MineDojo/Voyager GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 416 files (559.0 KB), approximately 160.8k tokens, and a symbol index with 322 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!