arcane-agents 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +528 -0
- package/assets/characters/README.md +114 -0
- package/assets/characters/assassin-shadow/animations/walk/east/0.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/east/1.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/east/2.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/east/3.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/east/4.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/east/5.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/east/6.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/east/7.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/north/0.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/north/1.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/north/2.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/north/3.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/north/4.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/north/5.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/north/6.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/north/7.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/south/0.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/south/1.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/south/2.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/south/3.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/south/4.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/south/5.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/south/6.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/south/7.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/west/0.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/west/1.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/west/2.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/west/3.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/west/4.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/west/5.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/west/6.png +0 -0
- package/assets/characters/assassin-shadow/animations/walk/west/7.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/0.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/1.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/10.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/11.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/12.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/13.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/14.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/15.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/2.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/3.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/4.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/5.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/6.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/7.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/8.png +0 -0
- package/assets/characters/assassin-shadow/animations/working/9.png +0 -0
- package/assets/characters/assassin-shadow/rotations/east.png +0 -0
- package/assets/characters/assassin-shadow/rotations/north.png +0 -0
- package/assets/characters/assassin-shadow/rotations/south.png +0 -0
- package/assets/characters/assassin-shadow/rotations/west.png +0 -0
- package/assets/characters/assassin-shadow/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/assassin-shadow/voice-lines/attention.mp3 +0 -0
- package/assets/characters/assassin-shadow/voice-lines/complete.mp3 +0 -0
- package/assets/characters/assassin-shadow/voice-lines/death.mp3 +0 -0
- package/assets/characters/assassin-shadow/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/assassin-shadow/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/assassin-shadow/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/assassin-shadow/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/assassin-shadow/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/assassin-shadow/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/barbarian-wild/animations/walk/east/0.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/east/1.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/east/2.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/east/3.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/east/4.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/east/5.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/east/6.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/east/7.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/north/0.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/north/1.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/north/2.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/north/3.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/north/4.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/north/5.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/north/6.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/north/7.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/south/0.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/south/1.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/south/2.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/south/3.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/south/4.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/south/5.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/south/6.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/south/7.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/west/0.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/west/1.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/west/2.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/west/3.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/west/4.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/west/5.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/west/6.png +0 -0
- package/assets/characters/barbarian-wild/animations/walk/west/7.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/0.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/1.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/10.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/11.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/12.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/13.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/14.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/15.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/2.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/3.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/4.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/5.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/6.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/7.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/8.png +0 -0
- package/assets/characters/barbarian-wild/animations/working/9.png +0 -0
- package/assets/characters/barbarian-wild/rotations/east.png +0 -0
- package/assets/characters/barbarian-wild/rotations/north.png +0 -0
- package/assets/characters/barbarian-wild/rotations/south.png +0 -0
- package/assets/characters/barbarian-wild/rotations/west.png +0 -0
- package/assets/characters/barbarian-wild/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/barbarian-wild/voice-lines/attention.mp3 +0 -0
- package/assets/characters/barbarian-wild/voice-lines/complete.mp3 +0 -0
- package/assets/characters/barbarian-wild/voice-lines/death.mp3 +0 -0
- package/assets/characters/barbarian-wild/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/barbarian-wild/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/barbarian-wild/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/barbarian-wild/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/barbarian-wild/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/barbarian-wild/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/east/0.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/east/1.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/east/2.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/east/3.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/east/4.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/east/5.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/east/6.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/east/7.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/north/0.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/north/1.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/north/2.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/north/3.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/north/4.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/north/5.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/north/6.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/north/7.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/south/0.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/south/1.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/south/2.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/south/3.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/south/4.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/south/5.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/south/6.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/south/7.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/west/0.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/west/1.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/west/2.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/west/3.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/west/4.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/west/5.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/west/6.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/walk/west/7.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/0.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/1.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/10.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/11.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/12.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/13.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/14.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/15.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/2.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/3.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/4.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/5.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/6.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/7.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/8.png +0 -0
- package/assets/characters/blood-elf-spellarcher/animations/working/9.png +0 -0
- package/assets/characters/blood-elf-spellarcher/rotations/east.png +0 -0
- package/assets/characters/blood-elf-spellarcher/rotations/north.png +0 -0
- package/assets/characters/blood-elf-spellarcher/rotations/south.png +0 -0
- package/assets/characters/blood-elf-spellarcher/rotations/west.png +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/attention.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/complete.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/death.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/blood-elf-spellarcher/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/chronomancer/animations/walk/east/0.png +0 -0
- package/assets/characters/chronomancer/animations/walk/east/1.png +0 -0
- package/assets/characters/chronomancer/animations/walk/east/2.png +0 -0
- package/assets/characters/chronomancer/animations/walk/east/3.png +0 -0
- package/assets/characters/chronomancer/animations/walk/east/4.png +0 -0
- package/assets/characters/chronomancer/animations/walk/east/5.png +0 -0
- package/assets/characters/chronomancer/animations/walk/east/6.png +0 -0
- package/assets/characters/chronomancer/animations/walk/east/7.png +0 -0
- package/assets/characters/chronomancer/animations/walk/north/0.png +0 -0
- package/assets/characters/chronomancer/animations/walk/north/1.png +0 -0
- package/assets/characters/chronomancer/animations/walk/north/2.png +0 -0
- package/assets/characters/chronomancer/animations/walk/north/3.png +0 -0
- package/assets/characters/chronomancer/animations/walk/north/4.png +0 -0
- package/assets/characters/chronomancer/animations/walk/north/5.png +0 -0
- package/assets/characters/chronomancer/animations/walk/north/6.png +0 -0
- package/assets/characters/chronomancer/animations/walk/north/7.png +0 -0
- package/assets/characters/chronomancer/animations/walk/south/0.png +0 -0
- package/assets/characters/chronomancer/animations/walk/south/1.png +0 -0
- package/assets/characters/chronomancer/animations/walk/south/2.png +0 -0
- package/assets/characters/chronomancer/animations/walk/south/3.png +0 -0
- package/assets/characters/chronomancer/animations/walk/south/4.png +0 -0
- package/assets/characters/chronomancer/animations/walk/south/5.png +0 -0
- package/assets/characters/chronomancer/animations/walk/south/6.png +0 -0
- package/assets/characters/chronomancer/animations/walk/south/7.png +0 -0
- package/assets/characters/chronomancer/animations/walk/west/0.png +0 -0
- package/assets/characters/chronomancer/animations/walk/west/1.png +0 -0
- package/assets/characters/chronomancer/animations/walk/west/2.png +0 -0
- package/assets/characters/chronomancer/animations/walk/west/3.png +0 -0
- package/assets/characters/chronomancer/animations/walk/west/4.png +0 -0
- package/assets/characters/chronomancer/animations/walk/west/5.png +0 -0
- package/assets/characters/chronomancer/animations/walk/west/6.png +0 -0
- package/assets/characters/chronomancer/animations/walk/west/7.png +0 -0
- package/assets/characters/chronomancer/animations/working/0.png +0 -0
- package/assets/characters/chronomancer/animations/working/1.png +0 -0
- package/assets/characters/chronomancer/animations/working/10.png +0 -0
- package/assets/characters/chronomancer/animations/working/11.png +0 -0
- package/assets/characters/chronomancer/animations/working/12.png +0 -0
- package/assets/characters/chronomancer/animations/working/13.png +0 -0
- package/assets/characters/chronomancer/animations/working/14.png +0 -0
- package/assets/characters/chronomancer/animations/working/15.png +0 -0
- package/assets/characters/chronomancer/animations/working/2.png +0 -0
- package/assets/characters/chronomancer/animations/working/3.png +0 -0
- package/assets/characters/chronomancer/animations/working/4.png +0 -0
- package/assets/characters/chronomancer/animations/working/5.png +0 -0
- package/assets/characters/chronomancer/animations/working/6.png +0 -0
- package/assets/characters/chronomancer/animations/working/7.png +0 -0
- package/assets/characters/chronomancer/animations/working/8.png +0 -0
- package/assets/characters/chronomancer/animations/working/9.png +0 -0
- package/assets/characters/chronomancer/rotations/east.png +0 -0
- package/assets/characters/chronomancer/rotations/north.png +0 -0
- package/assets/characters/chronomancer/rotations/south.png +0 -0
- package/assets/characters/chronomancer/rotations/west.png +0 -0
- package/assets/characters/chronomancer/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/chronomancer/voice-lines/attention.mp3 +0 -0
- package/assets/characters/chronomancer/voice-lines/complete.mp3 +0 -0
- package/assets/characters/chronomancer/voice-lines/death.mp3 +0 -0
- package/assets/characters/chronomancer/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/chronomancer/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/chronomancer/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/chronomancer/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/chronomancer/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/chronomancer/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/crystal-mage/animations/walk/east/0.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/east/1.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/east/2.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/east/3.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/east/4.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/east/5.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/east/6.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/east/7.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/north/0.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/north/1.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/north/2.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/north/3.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/north/4.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/north/5.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/north/6.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/north/7.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/south/0.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/south/1.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/south/2.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/south/3.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/south/4.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/south/5.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/south/6.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/south/7.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/west/0.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/west/1.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/west/2.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/west/3.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/west/4.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/west/5.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/west/6.png +0 -0
- package/assets/characters/crystal-mage/animations/walk/west/7.png +0 -0
- package/assets/characters/crystal-mage/animations/working/0.png +0 -0
- package/assets/characters/crystal-mage/animations/working/1.png +0 -0
- package/assets/characters/crystal-mage/animations/working/10.png +0 -0
- package/assets/characters/crystal-mage/animations/working/11.png +0 -0
- package/assets/characters/crystal-mage/animations/working/12.png +0 -0
- package/assets/characters/crystal-mage/animations/working/13.png +0 -0
- package/assets/characters/crystal-mage/animations/working/14.png +0 -0
- package/assets/characters/crystal-mage/animations/working/15.png +0 -0
- package/assets/characters/crystal-mage/animations/working/2.png +0 -0
- package/assets/characters/crystal-mage/animations/working/3.png +0 -0
- package/assets/characters/crystal-mage/animations/working/4.png +0 -0
- package/assets/characters/crystal-mage/animations/working/5.png +0 -0
- package/assets/characters/crystal-mage/animations/working/6.png +0 -0
- package/assets/characters/crystal-mage/animations/working/7.png +0 -0
- package/assets/characters/crystal-mage/animations/working/8.png +0 -0
- package/assets/characters/crystal-mage/animations/working/9.png +0 -0
- package/assets/characters/crystal-mage/rotations/east.png +0 -0
- package/assets/characters/crystal-mage/rotations/north.png +0 -0
- package/assets/characters/crystal-mage/rotations/south.png +0 -0
- package/assets/characters/crystal-mage/rotations/west.png +0 -0
- package/assets/characters/crystal-mage/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/crystal-mage/voice-lines/attention.mp3 +0 -0
- package/assets/characters/crystal-mage/voice-lines/complete.mp3 +0 -0
- package/assets/characters/crystal-mage/voice-lines/death.mp3 +0 -0
- package/assets/characters/crystal-mage/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/crystal-mage/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/crystal-mage/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/crystal-mage/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/crystal-mage/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/crystal-mage/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/east/0.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/east/1.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/east/2.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/east/3.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/east/4.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/east/5.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/east/6.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/east/7.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/north/0.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/north/1.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/north/2.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/north/3.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/north/4.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/north/5.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/north/6.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/north/7.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/south/0.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/south/1.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/south/2.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/south/3.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/south/4.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/south/5.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/south/6.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/south/7.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/west/0.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/west/1.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/west/2.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/west/3.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/west/4.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/west/5.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/west/6.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/walk/west/7.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/0.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/1.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/10.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/11.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/12.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/13.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/14.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/15.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/2.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/3.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/4.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/5.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/6.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/7.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/8.png +0 -0
- package/assets/characters/dwarf-warrior-short/animations/working/9.png +0 -0
- package/assets/characters/dwarf-warrior-short/rotations/east.png +0 -0
- package/assets/characters/dwarf-warrior-short/rotations/north.png +0 -0
- package/assets/characters/dwarf-warrior-short/rotations/south.png +0 -0
- package/assets/characters/dwarf-warrior-short/rotations/west.png +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/attention.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/complete.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/death.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/dwarf-warrior-short/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/elder-wizard/animations/walk/east/0.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/east/1.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/east/2.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/east/3.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/east/4.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/east/5.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/east/6.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/east/7.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/north/0.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/north/1.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/north/2.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/north/3.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/north/4.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/north/5.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/north/6.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/north/7.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/south/0.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/south/1.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/south/2.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/south/3.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/south/4.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/south/5.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/south/6.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/south/7.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/west/0.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/west/1.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/west/2.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/west/3.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/west/4.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/west/5.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/west/6.png +0 -0
- package/assets/characters/elder-wizard/animations/walk/west/7.png +0 -0
- package/assets/characters/elder-wizard/animations/working/0.png +0 -0
- package/assets/characters/elder-wizard/animations/working/1.png +0 -0
- package/assets/characters/elder-wizard/animations/working/10.png +0 -0
- package/assets/characters/elder-wizard/animations/working/11.png +0 -0
- package/assets/characters/elder-wizard/animations/working/12.png +0 -0
- package/assets/characters/elder-wizard/animations/working/13.png +0 -0
- package/assets/characters/elder-wizard/animations/working/14.png +0 -0
- package/assets/characters/elder-wizard/animations/working/15.png +0 -0
- package/assets/characters/elder-wizard/animations/working/2.png +0 -0
- package/assets/characters/elder-wizard/animations/working/3.png +0 -0
- package/assets/characters/elder-wizard/animations/working/4.png +0 -0
- package/assets/characters/elder-wizard/animations/working/5.png +0 -0
- package/assets/characters/elder-wizard/animations/working/6.png +0 -0
- package/assets/characters/elder-wizard/animations/working/7.png +0 -0
- package/assets/characters/elder-wizard/animations/working/8.png +0 -0
- package/assets/characters/elder-wizard/animations/working/9.png +0 -0
- package/assets/characters/elder-wizard/rotations/east.png +0 -0
- package/assets/characters/elder-wizard/rotations/north.png +0 -0
- package/assets/characters/elder-wizard/rotations/south.png +0 -0
- package/assets/characters/elder-wizard/rotations/west.png +0 -0
- package/assets/characters/elder-wizard/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/elder-wizard/voice-lines/attention.mp3 +0 -0
- package/assets/characters/elder-wizard/voice-lines/complete.mp3 +0 -0
- package/assets/characters/elder-wizard/voice-lines/death.mp3 +0 -0
- package/assets/characters/elder-wizard/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/elder-wizard/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/elder-wizard/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/elder-wizard/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/elder-wizard/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/elder-wizard/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/gothic-witch/animations/walk/east/0.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/east/1.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/east/2.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/east/3.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/east/4.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/east/5.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/east/6.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/east/7.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/north/0.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/north/1.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/north/2.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/north/3.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/north/4.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/north/5.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/north/6.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/north/7.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/south/0.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/south/1.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/south/2.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/south/3.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/south/4.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/south/5.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/south/6.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/south/7.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/west/0.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/west/1.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/west/2.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/west/3.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/west/4.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/west/5.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/west/6.png +0 -0
- package/assets/characters/gothic-witch/animations/walk/west/7.png +0 -0
- package/assets/characters/gothic-witch/animations/working/0.png +0 -0
- package/assets/characters/gothic-witch/animations/working/1.png +0 -0
- package/assets/characters/gothic-witch/animations/working/10.png +0 -0
- package/assets/characters/gothic-witch/animations/working/11.png +0 -0
- package/assets/characters/gothic-witch/animations/working/12.png +0 -0
- package/assets/characters/gothic-witch/animations/working/13.png +0 -0
- package/assets/characters/gothic-witch/animations/working/14.png +0 -0
- package/assets/characters/gothic-witch/animations/working/15.png +0 -0
- package/assets/characters/gothic-witch/animations/working/2.png +0 -0
- package/assets/characters/gothic-witch/animations/working/3.png +0 -0
- package/assets/characters/gothic-witch/animations/working/4.png +0 -0
- package/assets/characters/gothic-witch/animations/working/5.png +0 -0
- package/assets/characters/gothic-witch/animations/working/6.png +0 -0
- package/assets/characters/gothic-witch/animations/working/7.png +0 -0
- package/assets/characters/gothic-witch/animations/working/8.png +0 -0
- package/assets/characters/gothic-witch/animations/working/9.png +0 -0
- package/assets/characters/gothic-witch/rotations/east.png +0 -0
- package/assets/characters/gothic-witch/rotations/north.png +0 -0
- package/assets/characters/gothic-witch/rotations/south.png +0 -0
- package/assets/characters/gothic-witch/rotations/west.png +0 -0
- package/assets/characters/gothic-witch/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/gothic-witch/voice-lines/attention.mp3 +0 -0
- package/assets/characters/gothic-witch/voice-lines/complete.mp3 +0 -0
- package/assets/characters/gothic-witch/voice-lines/death.mp3 +0 -0
- package/assets/characters/gothic-witch/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/gothic-witch/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/gothic-witch/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/gothic-witch/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/gothic-witch/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/gothic-witch/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/east/0.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/east/1.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/east/2.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/east/3.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/east/4.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/east/5.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/east/6.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/east/7.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/north/0.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/north/1.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/north/2.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/north/3.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/north/4.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/north/5.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/north/6.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/north/7.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/south/0.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/south/1.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/south/2.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/south/3.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/south/4.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/south/5.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/south/6.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/south/7.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/west/0.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/west/1.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/west/2.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/west/3.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/west/4.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/west/5.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/west/6.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/walk/west/7.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/0.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/1.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/10.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/11.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/12.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/13.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/14.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/15.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/2.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/3.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/4.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/5.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/6.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/7.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/8.png +0 -0
- package/assets/characters/horned-helm-fighter/animations/working/9.png +0 -0
- package/assets/characters/horned-helm-fighter/rotations/east.png +0 -0
- package/assets/characters/horned-helm-fighter/rotations/north.png +0 -0
- package/assets/characters/horned-helm-fighter/rotations/south.png +0 -0
- package/assets/characters/horned-helm-fighter/rotations/west.png +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/attention.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/complete.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/death.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/horned-helm-fighter/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/east/0.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/east/1.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/east/2.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/east/3.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/east/4.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/east/5.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/east/6.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/east/7.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/north/0.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/north/1.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/north/2.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/north/3.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/north/4.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/north/5.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/north/6.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/north/7.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/south/0.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/south/1.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/south/2.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/south/3.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/south/4.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/south/5.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/south/6.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/south/7.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/west/0.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/west/1.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/west/2.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/west/3.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/west/4.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/west/5.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/west/6.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/walk/west/7.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/0.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/1.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/10.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/11.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/12.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/13.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/14.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/15.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/2.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/3.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/4.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/5.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/6.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/7.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/8.png +0 -0
- package/assets/characters/knight-blue-guardian/animations/working/9.png +0 -0
- package/assets/characters/knight-blue-guardian/rotations/east.png +0 -0
- package/assets/characters/knight-blue-guardian/rotations/north.png +0 -0
- package/assets/characters/knight-blue-guardian/rotations/south.png +0 -0
- package/assets/characters/knight-blue-guardian/rotations/west.png +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/attention.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/complete.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/death.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/knight-blue-guardian/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/launch-preview.html +298 -0
- package/assets/characters/minotaur-strategist/animations/walk/east/0.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/east/1.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/east/2.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/east/3.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/east/4.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/east/5.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/east/6.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/east/7.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/north/0.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/north/1.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/north/2.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/north/3.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/north/4.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/north/5.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/north/6.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/north/7.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/south/0.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/south/1.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/south/2.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/south/3.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/south/4.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/south/5.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/south/6.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/south/7.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/west/0.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/west/1.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/west/2.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/west/3.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/west/4.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/west/5.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/west/6.png +0 -0
- package/assets/characters/minotaur-strategist/animations/walk/west/7.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/0.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/1.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/10.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/11.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/12.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/13.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/14.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/15.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/2.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/3.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/4.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/5.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/6.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/7.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/8.png +0 -0
- package/assets/characters/minotaur-strategist/animations/working/9.png +0 -0
- package/assets/characters/minotaur-strategist/rotations/east.png +0 -0
- package/assets/characters/minotaur-strategist/rotations/north.png +0 -0
- package/assets/characters/minotaur-strategist/rotations/south.png +0 -0
- package/assets/characters/minotaur-strategist/rotations/west.png +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/attention.mp3 +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/complete.mp3 +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/death.mp3 +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/minotaur-strategist/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/east/0.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/east/1.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/east/2.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/east/3.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/east/4.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/east/5.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/east/6.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/east/7.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/north/0.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/north/1.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/north/2.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/north/3.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/north/4.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/north/5.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/north/6.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/north/7.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/south/0.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/south/1.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/south/2.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/south/3.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/south/4.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/south/5.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/south/6.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/south/7.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/west/0.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/west/1.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/west/2.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/west/3.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/west/4.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/west/5.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/west/6.png +0 -0
- package/assets/characters/moon-grove-druid/animations/walk/west/7.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/0.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/1.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/10.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/11.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/12.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/13.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/14.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/15.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/2.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/3.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/4.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/5.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/6.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/7.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/8.png +0 -0
- package/assets/characters/moon-grove-druid/animations/working/9.png +0 -0
- package/assets/characters/moon-grove-druid/rotations/east.png +0 -0
- package/assets/characters/moon-grove-druid/rotations/north.png +0 -0
- package/assets/characters/moon-grove-druid/rotations/south.png +0 -0
- package/assets/characters/moon-grove-druid/rotations/west.png +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/attention.mp3 +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/complete.mp3 +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/death.mp3 +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/moon-grove-druid/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/necromancer-male/animations/walk/east/0.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/east/1.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/east/2.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/east/3.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/east/4.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/east/5.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/east/6.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/east/7.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/north/0.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/north/1.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/north/2.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/north/3.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/north/4.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/north/5.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/north/6.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/north/7.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/south/0.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/south/1.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/south/2.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/south/3.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/south/4.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/south/5.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/south/6.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/south/7.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/west/0.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/west/1.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/west/2.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/west/3.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/west/4.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/west/5.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/west/6.png +0 -0
- package/assets/characters/necromancer-male/animations/walk/west/7.png +0 -0
- package/assets/characters/necromancer-male/animations/working/0.png +0 -0
- package/assets/characters/necromancer-male/animations/working/1.png +0 -0
- package/assets/characters/necromancer-male/animations/working/10.png +0 -0
- package/assets/characters/necromancer-male/animations/working/11.png +0 -0
- package/assets/characters/necromancer-male/animations/working/12.png +0 -0
- package/assets/characters/necromancer-male/animations/working/13.png +0 -0
- package/assets/characters/necromancer-male/animations/working/14.png +0 -0
- package/assets/characters/necromancer-male/animations/working/15.png +0 -0
- package/assets/characters/necromancer-male/animations/working/2.png +0 -0
- package/assets/characters/necromancer-male/animations/working/3.png +0 -0
- package/assets/characters/necromancer-male/animations/working/4.png +0 -0
- package/assets/characters/necromancer-male/animations/working/5.png +0 -0
- package/assets/characters/necromancer-male/animations/working/6.png +0 -0
- package/assets/characters/necromancer-male/animations/working/7.png +0 -0
- package/assets/characters/necromancer-male/animations/working/8.png +0 -0
- package/assets/characters/necromancer-male/animations/working/9.png +0 -0
- package/assets/characters/necromancer-male/rotations/east.png +0 -0
- package/assets/characters/necromancer-male/rotations/north.png +0 -0
- package/assets/characters/necromancer-male/rotations/south.png +0 -0
- package/assets/characters/necromancer-male/rotations/west.png +0 -0
- package/assets/characters/necromancer-male/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/necromancer-male/voice-lines/attention.mp3 +0 -0
- package/assets/characters/necromancer-male/voice-lines/complete.mp3 +0 -0
- package/assets/characters/necromancer-male/voice-lines/death.mp3 +0 -0
- package/assets/characters/necromancer-male/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/necromancer-male/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/necromancer-male/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/necromancer-male/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/necromancer-male/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/necromancer-male/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/oracle-seer/animations/walk/east/0.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/east/1.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/east/2.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/east/3.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/east/4.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/east/5.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/east/6.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/east/7.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/north/0.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/north/1.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/north/2.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/north/3.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/north/4.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/north/5.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/north/6.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/north/7.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/south/0.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/south/1.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/south/2.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/south/3.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/south/4.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/south/5.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/south/6.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/south/7.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/west/0.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/west/1.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/west/2.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/west/3.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/west/4.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/west/5.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/west/6.png +0 -0
- package/assets/characters/oracle-seer/animations/walk/west/7.png +0 -0
- package/assets/characters/oracle-seer/animations/working/0.png +0 -0
- package/assets/characters/oracle-seer/animations/working/1.png +0 -0
- package/assets/characters/oracle-seer/animations/working/10.png +0 -0
- package/assets/characters/oracle-seer/animations/working/11.png +0 -0
- package/assets/characters/oracle-seer/animations/working/12.png +0 -0
- package/assets/characters/oracle-seer/animations/working/13.png +0 -0
- package/assets/characters/oracle-seer/animations/working/14.png +0 -0
- package/assets/characters/oracle-seer/animations/working/15.png +0 -0
- package/assets/characters/oracle-seer/animations/working/2.png +0 -0
- package/assets/characters/oracle-seer/animations/working/3.png +0 -0
- package/assets/characters/oracle-seer/animations/working/4.png +0 -0
- package/assets/characters/oracle-seer/animations/working/5.png +0 -0
- package/assets/characters/oracle-seer/animations/working/6.png +0 -0
- package/assets/characters/oracle-seer/animations/working/7.png +0 -0
- package/assets/characters/oracle-seer/animations/working/8.png +0 -0
- package/assets/characters/oracle-seer/animations/working/9.png +0 -0
- package/assets/characters/oracle-seer/rotations/east.png +0 -0
- package/assets/characters/oracle-seer/rotations/north.png +0 -0
- package/assets/characters/oracle-seer/rotations/south.png +0 -0
- package/assets/characters/oracle-seer/rotations/west.png +0 -0
- package/assets/characters/oracle-seer/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/oracle-seer/voice-lines/attention.mp3 +0 -0
- package/assets/characters/oracle-seer/voice-lines/complete.mp3 +0 -0
- package/assets/characters/oracle-seer/voice-lines/death.mp3 +0 -0
- package/assets/characters/oracle-seer/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/oracle-seer/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/oracle-seer/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/oracle-seer/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/oracle-seer/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/oracle-seer/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/east/0.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/east/1.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/east/2.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/east/3.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/east/4.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/east/5.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/east/6.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/east/7.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/north/0.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/north/1.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/north/2.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/north/3.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/north/4.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/north/5.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/north/6.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/north/7.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/south/0.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/south/1.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/south/2.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/south/3.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/south/4.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/south/5.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/south/6.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/south/7.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/west/0.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/west/1.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/west/2.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/west/3.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/west/4.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/west/5.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/west/6.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/walk/west/7.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/0.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/1.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/10.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/11.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/12.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/13.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/14.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/15.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/2.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/3.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/4.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/5.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/6.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/7.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/8.png +0 -0
- package/assets/characters/pyromancer-wizard/animations/working/9.png +0 -0
- package/assets/characters/pyromancer-wizard/rotations/east.png +0 -0
- package/assets/characters/pyromancer-wizard/rotations/north.png +0 -0
- package/assets/characters/pyromancer-wizard/rotations/south.png +0 -0
- package/assets/characters/pyromancer-wizard/rotations/west.png +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/attention.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/complete.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/death.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/pyromancer-wizard/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/east/0.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/east/1.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/east/2.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/east/3.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/east/4.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/east/5.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/east/6.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/east/7.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/north/0.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/north/1.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/north/2.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/north/3.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/north/4.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/north/5.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/north/6.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/north/7.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/south/0.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/south/1.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/south/2.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/south/3.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/south/4.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/south/5.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/south/6.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/south/7.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/west/0.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/west/1.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/west/2.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/west/3.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/west/4.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/west/5.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/west/6.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/walk/west/7.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/0.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/1.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/10.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/11.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/12.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/13.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/14.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/15.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/2.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/3.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/4.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/5.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/6.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/7.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/8.png +0 -0
- package/assets/characters/sun-priestess-healer/animations/working/9.png +0 -0
- package/assets/characters/sun-priestess-healer/rotations/east.png +0 -0
- package/assets/characters/sun-priestess-healer/rotations/north.png +0 -0
- package/assets/characters/sun-priestess-healer/rotations/south.png +0 -0
- package/assets/characters/sun-priestess-healer/rotations/west.png +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/attention.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/complete.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/death.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/sun-priestess-healer/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/east/0.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/east/1.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/east/2.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/east/3.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/east/4.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/east/5.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/east/6.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/east/7.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/north/0.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/north/1.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/north/2.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/north/3.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/north/4.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/north/5.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/north/6.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/north/7.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/south/0.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/south/1.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/south/2.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/south/3.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/south/4.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/south/5.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/south/6.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/south/7.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/west/0.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/west/1.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/west/2.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/west/3.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/west/4.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/west/5.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/west/6.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/walk/west/7.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/0.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/1.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/10.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/11.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/12.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/13.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/14.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/15.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/2.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/3.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/4.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/5.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/6.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/7.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/8.png +0 -0
- package/assets/characters/valkyrie-spearmaid/animations/working/9.png +0 -0
- package/assets/characters/valkyrie-spearmaid/rotations/east.png +0 -0
- package/assets/characters/valkyrie-spearmaid/rotations/north.png +0 -0
- package/assets/characters/valkyrie-spearmaid/rotations/south.png +0 -0
- package/assets/characters/valkyrie-spearmaid/rotations/west.png +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/attention.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/complete.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/death.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/valkyrie-spearmaid/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/east/0.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/east/1.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/east/2.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/east/3.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/east/4.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/east/5.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/east/6.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/east/7.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/north/0.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/north/1.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/north/2.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/north/3.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/north/4.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/north/5.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/north/6.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/north/7.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/south/0.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/south/1.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/south/2.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/south/3.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/south/4.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/south/5.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/south/6.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/south/7.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/west/0.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/west/1.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/west/2.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/west/3.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/west/4.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/west/5.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/west/6.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/walk/west/7.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/0.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/1.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/10.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/11.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/12.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/13.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/14.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/15.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/2.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/3.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/4.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/5.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/6.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/7.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/8.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/animations/working/9.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/rotations/east.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/rotations/north.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/rotations/south.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/rotations/west.png +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/arrive.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/attention.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/complete.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/death.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/move_variant_1.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/move_variant_2.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/move_variant_3.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/selected_variant_1.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/selected_variant_2.mp3 +0 -0
- package/assets/characters/witch-hunter-gunslinger/voice-lines/selected_variant_3.mp3 +0 -0
- package/assets/maps/backgrounds/outpost-v1-2x.png +0 -0
- package/assets/maps/backgrounds/outpost-v1-original.png +0 -0
- package/assets/maps/backgrounds/outpost-v1-upscaled-2x-photo.png +0 -0
- package/assets/maps/backgrounds/outpost-v1.png +0 -0
- package/assets/maps/outpost.json +130 -0
- package/assets/maps/outpost.logic.json +26197 -0
- package/config.example.yaml +91 -0
- package/dist/client/assets/index-B0hs4377.js +80 -0
- package/dist/client/assets/index-TxsheMVB.css +32 -0
- package/dist/client/index.html +13 -0
- package/dist/client/map-mask-editor.html +1853 -0
- package/dist/server/server/assets/avatarCatalog.js +37 -0
- package/dist/server/server/assets/voiceLineCatalog.js +42 -0
- package/dist/server/server/bootstrap/httpApp.js +39 -0
- package/dist/server/server/bootstrap/serverContext.js +60 -0
- package/dist/server/server/bootstrap/shutdown.js +152 -0
- package/dist/server/server/bootstrap/shutdown.test.js +142 -0
- package/dist/server/server/bootstrap/websocketUpgrade.js +111 -0
- package/dist/server/server/bootstrap/websocketUpgrade.test.js +83 -0
- package/dist/server/server/bootstrapApp.js +89 -0
- package/dist/server/server/cli.js +452 -0
- package/dist/server/server/config/discovery.js +159 -0
- package/dist/server/server/config/loadConfig.js +121 -0
- package/dist/server/server/config/schema.js +121 -0
- package/dist/server/server/http/appError.js +30 -0
- package/dist/server/server/http/errorResponse.js +31 -0
- package/dist/server/server/http/errorResponse.test.js +46 -0
- package/dist/server/server/http/requestParsers.js +133 -0
- package/dist/server/server/http/requestParsers.test.js +57 -0
- package/dist/server/server/http/routes/registerApiRoutes.js +146 -0
- package/dist/server/server/index.js +9 -0
- package/dist/server/server/orchestrator/orchestratorService.js +378 -0
- package/dist/server/server/orchestrator/orchestratorService.test.js +111 -0
- package/dist/server/server/orchestrator/reconcile/isSameWorkerRecord.js +17 -0
- package/dist/server/server/orchestrator/spawn/avatarAllocator.js +20 -0
- package/dist/server/server/orchestrator/spawn/command.js +37 -0
- package/dist/server/server/orchestrator/spawn/command.test.js +39 -0
- package/dist/server/server/orchestrator/spawn/resolveSpawnPlan.js +44 -0
- package/dist/server/server/orchestrator/spawn/resolveSpawnPlan.test.js +79 -0
- package/dist/server/server/orchestrator/spawn/spawnPosition.js +147 -0
- package/dist/server/server/orchestrator/spawn/types.js +2 -0
- package/dist/server/server/orchestrator/spawn/windowName.js +12 -0
- package/dist/server/server/persistence/workerRepository.js +211 -0
- package/dist/server/server/status/activityParser.js +172 -0
- package/dist/server/server/status/claudeTranscript/accumulator.js +372 -0
- package/dist/server/server/status/claudeTranscript/constants.js +18 -0
- package/dist/server/server/status/claudeTranscript/io.js +160 -0
- package/dist/server/server/status/claudeTranscript/parser.js +50 -0
- package/dist/server/server/status/claudeTranscript/snapshot.js +82 -0
- package/dist/server/server/status/claudeTranscript/types.js +2 -0
- package/dist/server/server/status/claudeTranscriptTracker.js +59 -0
- package/dist/server/server/status/engine/signalContext.js +41 -0
- package/dist/server/server/status/engine/stateMachine/activity.js +18 -0
- package/dist/server/server/status/engine/stateMachine/constants.js +45 -0
- package/dist/server/server/status/engine/stateMachine/decision.js +213 -0
- package/dist/server/server/status/engine/stateMachine/decision.test.js +139 -0
- package/dist/server/server/status/engine/stateMachine/helpers.js +103 -0
- package/dist/server/server/status/engine/stateMachine/helpers.test.js +113 -0
- package/dist/server/server/status/engine/stateMachine/idleBlockers.js +55 -0
- package/dist/server/server/status/engine/stateMachine/parserErrorRules.js +42 -0
- package/dist/server/server/status/engine/stateMachine/types.js +2 -0
- package/dist/server/server/status/engine/stateMachine/workingEvidence.js +97 -0
- package/dist/server/server/status/engine/stateMachine.js +5 -0
- package/dist/server/server/status/engine/types.js +4 -0
- package/dist/server/server/status/paneObservation.js +35 -0
- package/dist/server/server/status/runtime/activityTextExtractors.js +189 -0
- package/dist/server/server/status/runtime/claudeSignals.js +56 -0
- package/dist/server/server/status/runtime/openCodeSignals.js +63 -0
- package/dist/server/server/status/runtime/sessionDetection.js +37 -0
- package/dist/server/server/status/runtime/textSignals.js +21 -0
- package/dist/server/server/status/runtimeSignals.js +21 -0
- package/dist/server/server/status/statusEvaluator.js +16 -0
- package/dist/server/server/status/statusHeuristics.js +146 -0
- package/dist/server/server/status/statusMonitor.js +390 -0
- package/dist/server/server/status/statusMonitor.test.js +191 -0
- package/dist/server/server/status/statusPipeline.js +45 -0
- package/dist/server/server/tmux/tmuxAdapter.js +338 -0
- package/dist/server/server/utils/appRoot.js +40 -0
- package/dist/server/server/utils/path.js +20 -0
- package/dist/server/server/ws/realtimeHub.js +44 -0
- package/dist/server/server/ws/realtimeHub.test.js +43 -0
- package/dist/server/server/ws/terminalBridge.js +153 -0
- package/dist/server/shared/types.js +2 -0
- package/package.json +68 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StatusMonitor = void 0;
|
|
4
|
+
const claudeTranscriptTracker_1 = require("./claudeTranscriptTracker");
|
|
5
|
+
const statusPipeline_1 = require("./statusPipeline");
|
|
6
|
+
const defaultDecisionFacts = {
|
|
7
|
+
command: "",
|
|
8
|
+
commandQuietForMs: 0,
|
|
9
|
+
outputQuietForMs: 0,
|
|
10
|
+
workerAgeMs: 0,
|
|
11
|
+
isClaudeSession: false,
|
|
12
|
+
isOpenCodeSession: false,
|
|
13
|
+
hasOpenCodePromptSignal: false,
|
|
14
|
+
hasOpenCodeActiveSignal: false,
|
|
15
|
+
hasClaudeProgressSignal: false,
|
|
16
|
+
hasActiveClaudeTask: false,
|
|
17
|
+
hasRuntimeActivityText: false,
|
|
18
|
+
hasParsedStrongSignal: false,
|
|
19
|
+
hasParsedNeedsInput: false,
|
|
20
|
+
hasParsedError: false
|
|
21
|
+
};
|
|
22
|
+
const maxTransitionHistoryEntries = 40;
|
|
23
|
+
const maxPollTimingHistoryEntries = 40;
|
|
24
|
+
const defaultStatusPollConcurrency = 4;
|
|
25
|
+
class StatusMonitor {
|
|
26
|
+
workers;
|
|
27
|
+
tmux;
|
|
28
|
+
pollIntervalMs;
|
|
29
|
+
onWorkerUpdated;
|
|
30
|
+
onWorkerRemoved;
|
|
31
|
+
intervalId;
|
|
32
|
+
requestedPollTimer;
|
|
33
|
+
pollInFlight = false;
|
|
34
|
+
pollRequestedWhileInFlight = false;
|
|
35
|
+
claudeTranscript = new claudeTranscriptTracker_1.ClaudeTranscriptTracker();
|
|
36
|
+
paneObservation = new Map();
|
|
37
|
+
statusDebugByWorker = new Map();
|
|
38
|
+
statusTransitionHistoryByWorker = new Map();
|
|
39
|
+
workerTimingByWorker = new Map();
|
|
40
|
+
recentPollTiming = [];
|
|
41
|
+
traceMode = resolveStatusTraceMode();
|
|
42
|
+
workerPollConcurrency = resolveStatusPollConcurrency();
|
|
43
|
+
constructor(workers, tmux, pollIntervalMs, onWorkerUpdated, onWorkerRemoved) {
|
|
44
|
+
this.workers = workers;
|
|
45
|
+
this.tmux = tmux;
|
|
46
|
+
this.pollIntervalMs = pollIntervalMs;
|
|
47
|
+
this.onWorkerUpdated = onWorkerUpdated;
|
|
48
|
+
this.onWorkerRemoved = onWorkerRemoved;
|
|
49
|
+
}
|
|
50
|
+
start() {
|
|
51
|
+
if (this.intervalId) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.intervalId = setInterval(() => {
|
|
55
|
+
void this.pollOnce();
|
|
56
|
+
}, this.pollIntervalMs);
|
|
57
|
+
void this.pollOnce();
|
|
58
|
+
}
|
|
59
|
+
stop() {
|
|
60
|
+
if (this.intervalId) {
|
|
61
|
+
clearInterval(this.intervalId);
|
|
62
|
+
this.intervalId = undefined;
|
|
63
|
+
}
|
|
64
|
+
if (this.requestedPollTimer) {
|
|
65
|
+
clearTimeout(this.requestedPollTimer);
|
|
66
|
+
this.requestedPollTimer = undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
requestPollSoon(delayMs = 35) {
|
|
70
|
+
if (this.requestedPollTimer) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this.requestedPollTimer = setTimeout(() => {
|
|
74
|
+
this.requestedPollTimer = undefined;
|
|
75
|
+
void this.pollOnce();
|
|
76
|
+
}, Math.max(0, delayMs));
|
|
77
|
+
}
|
|
78
|
+
listWorkerStatusDebug() {
|
|
79
|
+
return [...this.statusDebugByWorker.values()].sort((a, b) => a.workerName.localeCompare(b.workerName));
|
|
80
|
+
}
|
|
81
|
+
getWorkerStatusDebug(workerId) {
|
|
82
|
+
return this.statusDebugByWorker.get(workerId);
|
|
83
|
+
}
|
|
84
|
+
getWorkerStatusHistory(workerId) {
|
|
85
|
+
return this.statusTransitionHistoryByWorker.get(workerId) ?? [];
|
|
86
|
+
}
|
|
87
|
+
getStatusPerformanceDebug() {
|
|
88
|
+
return {
|
|
89
|
+
concurrency: this.workerPollConcurrency,
|
|
90
|
+
latestPoll: this.recentPollTiming[this.recentPollTiming.length - 1],
|
|
91
|
+
recentPolls: [...this.recentPollTiming],
|
|
92
|
+
workers: [...this.workerTimingByWorker.values()].sort((a, b) => a.workerName.localeCompare(b.workerName))
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async pollOnce() {
|
|
96
|
+
if (this.pollInFlight) {
|
|
97
|
+
this.pollRequestedWhileInFlight = true;
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this.pollInFlight = true;
|
|
101
|
+
try {
|
|
102
|
+
const pollStartedAtMs = Date.now();
|
|
103
|
+
const currentWorkers = this.workers.listWorkers();
|
|
104
|
+
const workerTimings = await mapWithConcurrency(currentWorkers, this.workerPollConcurrency, async (worker) => this.evaluateWorkerWithTiming(worker));
|
|
105
|
+
this.recordPollTiming(pollStartedAtMs, currentWorkers.length, workerTimings);
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
this.pollInFlight = false;
|
|
109
|
+
if (this.pollRequestedWhileInFlight) {
|
|
110
|
+
this.pollRequestedWhileInFlight = false;
|
|
111
|
+
this.requestPollSoon(0);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async evaluateWorkerWithTiming(worker) {
|
|
116
|
+
const startedAtMs = Date.now();
|
|
117
|
+
let outcome = "failed";
|
|
118
|
+
let toStatus = worker.status;
|
|
119
|
+
try {
|
|
120
|
+
const updateOutcome = await this.updateWorkerStatus(worker);
|
|
121
|
+
outcome = updateOutcome.outcome;
|
|
122
|
+
toStatus = updateOutcome.nextStatus;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
outcome = "failed";
|
|
126
|
+
toStatus = "error";
|
|
127
|
+
}
|
|
128
|
+
const snapshot = {
|
|
129
|
+
workerId: worker.id,
|
|
130
|
+
workerName: worker.displayName ?? worker.name,
|
|
131
|
+
fromStatus: worker.status,
|
|
132
|
+
toStatus,
|
|
133
|
+
outcome,
|
|
134
|
+
durationMs: Math.max(0, Date.now() - startedAtMs),
|
|
135
|
+
evaluatedAt: new Date().toISOString()
|
|
136
|
+
};
|
|
137
|
+
if (outcome === "removed") {
|
|
138
|
+
this.workerTimingByWorker.delete(worker.id);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this.workerTimingByWorker.set(worker.id, snapshot);
|
|
142
|
+
}
|
|
143
|
+
return snapshot;
|
|
144
|
+
}
|
|
145
|
+
async updateWorkerStatus(worker) {
|
|
146
|
+
const live = await this.tmux.windowExists(worker.tmuxRef);
|
|
147
|
+
if (!live) {
|
|
148
|
+
this.removeWorker(worker.id);
|
|
149
|
+
return {
|
|
150
|
+
outcome: "removed",
|
|
151
|
+
nextStatus: "stopped"
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
let evaluation = {
|
|
155
|
+
status: worker.status,
|
|
156
|
+
activityText: worker.activityText,
|
|
157
|
+
activityTool: worker.activityTool,
|
|
158
|
+
activityPath: worker.activityPath,
|
|
159
|
+
confidence: 0,
|
|
160
|
+
reasons: [{ code: "not-evaluated", message: "Status evaluation did not run." }],
|
|
161
|
+
facts: {
|
|
162
|
+
...defaultDecisionFacts
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
try {
|
|
166
|
+
const signals = await (0, statusPipeline_1.collectWorkerStatusSignals)({
|
|
167
|
+
worker,
|
|
168
|
+
tmux: this.tmux,
|
|
169
|
+
paneObservation: this.paneObservation,
|
|
170
|
+
claudeTranscript: this.claudeTranscript
|
|
171
|
+
});
|
|
172
|
+
if (!signals) {
|
|
173
|
+
this.removeWorker(worker.id);
|
|
174
|
+
return {
|
|
175
|
+
outcome: "removed",
|
|
176
|
+
nextStatus: "stopped"
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
evaluation = (0, statusPipeline_1.normalizeWorkerStatusEvaluation)((0, statusPipeline_1.evaluateWorkerStatusSignals)(worker, signals));
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
evaluation = {
|
|
183
|
+
status: "error",
|
|
184
|
+
activityText: "Status check failed",
|
|
185
|
+
activityTool: "unknown",
|
|
186
|
+
activityPath: undefined,
|
|
187
|
+
confidence: 0.25,
|
|
188
|
+
reasons: [{ code: "status-check-failed", message: "Status monitoring raised an exception." }],
|
|
189
|
+
facts: {
|
|
190
|
+
...defaultDecisionFacts
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
this.recordStatusDebug(worker, evaluation);
|
|
195
|
+
this.traceStatusEvaluation(worker, evaluation);
|
|
196
|
+
this.recordStatusTransition(worker, evaluation);
|
|
197
|
+
if (evaluation.status === worker.status &&
|
|
198
|
+
evaluation.activityText === worker.activityText &&
|
|
199
|
+
evaluation.activityTool === worker.activityTool &&
|
|
200
|
+
evaluation.activityPath === worker.activityPath) {
|
|
201
|
+
return {
|
|
202
|
+
outcome: "unchanged",
|
|
203
|
+
nextStatus: worker.status
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (evaluation.status === "stopped") {
|
|
207
|
+
this.removeWorker(worker.id);
|
|
208
|
+
return {
|
|
209
|
+
outcome: "removed",
|
|
210
|
+
nextStatus: "stopped"
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const updated = this.workers.updateStatus(worker.id, {
|
|
214
|
+
status: evaluation.status,
|
|
215
|
+
activityText: evaluation.activityText,
|
|
216
|
+
activityTool: evaluation.activityTool,
|
|
217
|
+
activityPath: evaluation.activityPath
|
|
218
|
+
});
|
|
219
|
+
if (updated) {
|
|
220
|
+
this.onWorkerUpdated(updated);
|
|
221
|
+
return {
|
|
222
|
+
outcome: "updated",
|
|
223
|
+
nextStatus: updated.status
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
outcome: "failed",
|
|
228
|
+
nextStatus: evaluation.status
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
removeWorker(workerId) {
|
|
232
|
+
const removed = this.workers.deleteWorker(workerId);
|
|
233
|
+
if (removed) {
|
|
234
|
+
this.claudeTranscript.forget(workerId);
|
|
235
|
+
this.paneObservation.delete(workerId);
|
|
236
|
+
this.statusDebugByWorker.delete(workerId);
|
|
237
|
+
this.statusTransitionHistoryByWorker.delete(workerId);
|
|
238
|
+
this.workerTimingByWorker.delete(workerId);
|
|
239
|
+
this.onWorkerRemoved(workerId);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
recordPollTiming(pollStartedAtMs, workerCount, workerTimings) {
|
|
243
|
+
const pollFinishedAtMs = Date.now();
|
|
244
|
+
const totalWorkerDurationMs = workerTimings.reduce((sum, timing) => sum + timing.durationMs, 0);
|
|
245
|
+
const maxWorkerDurationMs = workerTimings.reduce((max, timing) => Math.max(max, timing.durationMs), 0);
|
|
246
|
+
const averageWorkerDurationMs = workerTimings.length > 0 ? totalWorkerDurationMs / workerTimings.length : 0;
|
|
247
|
+
const outcomeCounts = {
|
|
248
|
+
unchanged: 0,
|
|
249
|
+
updated: 0,
|
|
250
|
+
removed: 0,
|
|
251
|
+
failed: 0
|
|
252
|
+
};
|
|
253
|
+
for (const timing of workerTimings) {
|
|
254
|
+
outcomeCounts[timing.outcome] += 1;
|
|
255
|
+
}
|
|
256
|
+
const pollTiming = {
|
|
257
|
+
startedAt: new Date(pollStartedAtMs).toISOString(),
|
|
258
|
+
finishedAt: new Date(pollFinishedAtMs).toISOString(),
|
|
259
|
+
durationMs: Math.max(0, pollFinishedAtMs - pollStartedAtMs),
|
|
260
|
+
workerCount,
|
|
261
|
+
concurrency: this.workerPollConcurrency,
|
|
262
|
+
averageWorkerDurationMs,
|
|
263
|
+
maxWorkerDurationMs,
|
|
264
|
+
outcomeCounts
|
|
265
|
+
};
|
|
266
|
+
this.recentPollTiming.push(pollTiming);
|
|
267
|
+
if (this.recentPollTiming.length > maxPollTimingHistoryEntries) {
|
|
268
|
+
this.recentPollTiming.splice(0, this.recentPollTiming.length - maxPollTimingHistoryEntries);
|
|
269
|
+
}
|
|
270
|
+
this.tracePollTiming(pollTiming);
|
|
271
|
+
}
|
|
272
|
+
tracePollTiming(timing) {
|
|
273
|
+
if (this.traceMode !== "verbose") {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
console.log(`[arcane-agents][status] poll workers=${timing.workerCount} duration=${Math.round(timing.durationMs)}ms ` +
|
|
277
|
+
`avgWorker=${Math.round(timing.averageWorkerDurationMs)}ms maxWorker=${Math.round(timing.maxWorkerDurationMs)}ms ` +
|
|
278
|
+
`outcomes={updated:${timing.outcomeCounts.updated},unchanged:${timing.outcomeCounts.unchanged},removed:${timing.outcomeCounts.removed},failed:${timing.outcomeCounts.failed}}`);
|
|
279
|
+
}
|
|
280
|
+
recordStatusDebug(worker, evaluation) {
|
|
281
|
+
this.statusDebugByWorker.set(worker.id, {
|
|
282
|
+
workerId: worker.id,
|
|
283
|
+
workerName: worker.displayName ?? worker.name,
|
|
284
|
+
previousStatus: worker.status,
|
|
285
|
+
evaluatedAt: new Date().toISOString(),
|
|
286
|
+
decision: evaluation
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
traceStatusEvaluation(worker, evaluation) {
|
|
290
|
+
if (this.traceMode === "off") {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const changed = evaluation.status !== worker.status;
|
|
294
|
+
if (this.traceMode === "transitions" && !changed) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const fromTo = changed ? `${worker.status} -> ${evaluation.status}` : `${evaluation.status}`;
|
|
298
|
+
const reasonText = evaluation.reasons.map((reason) => formatReason(reason.code, reason.detail)).join(", ");
|
|
299
|
+
const activityText = evaluation.activityText ? ` activity="${truncateForTrace(evaluation.activityText, 84)}"` : "";
|
|
300
|
+
const commandText = truncateForTrace(evaluation.facts.command, 32);
|
|
301
|
+
const traceFacts = `cmd=${JSON.stringify(commandText)} ` +
|
|
302
|
+
`outQuiet=${Math.round(evaluation.facts.outputQuietForMs)}ms ` +
|
|
303
|
+
`cmdQuiet=${Math.round(evaluation.facts.commandQuietForMs)}ms ` +
|
|
304
|
+
`claude=${evaluation.facts.isClaudeSession ? 1 : 0} ` +
|
|
305
|
+
`opencode=${evaluation.facts.isOpenCodeSession ? 1 : 0}`;
|
|
306
|
+
console.log(`[arcane-agents][status] ${worker.displayName ?? worker.name} ${fromTo} (${Math.round(evaluation.confidence * 100)}%)${activityText} reasons=[${reasonText}] ${traceFacts}`);
|
|
307
|
+
}
|
|
308
|
+
recordStatusTransition(worker, evaluation) {
|
|
309
|
+
if (evaluation.status === worker.status) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const transition = {
|
|
313
|
+
workerId: worker.id,
|
|
314
|
+
workerName: worker.displayName ?? worker.name,
|
|
315
|
+
fromStatus: worker.status,
|
|
316
|
+
toStatus: evaluation.status,
|
|
317
|
+
at: new Date().toISOString(),
|
|
318
|
+
confidence: evaluation.confidence,
|
|
319
|
+
reasons: evaluation.reasons,
|
|
320
|
+
facts: evaluation.facts
|
|
321
|
+
};
|
|
322
|
+
const history = this.statusTransitionHistoryByWorker.get(worker.id) ?? [];
|
|
323
|
+
history.push(transition);
|
|
324
|
+
if (history.length > maxTransitionHistoryEntries) {
|
|
325
|
+
history.splice(0, history.length - maxTransitionHistoryEntries);
|
|
326
|
+
}
|
|
327
|
+
this.statusTransitionHistoryByWorker.set(worker.id, history);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
exports.StatusMonitor = StatusMonitor;
|
|
331
|
+
function resolveStatusPollConcurrency() {
|
|
332
|
+
const rawValue = (process.env.ARCANE_AGENTS_STATUS_POLL_CONCURRENCY ?? "").trim();
|
|
333
|
+
const parsed = Number.parseInt(rawValue, 10);
|
|
334
|
+
if (Number.isFinite(parsed) && parsed >= 1) {
|
|
335
|
+
return Math.min(32, parsed);
|
|
336
|
+
}
|
|
337
|
+
return defaultStatusPollConcurrency;
|
|
338
|
+
}
|
|
339
|
+
async function mapWithConcurrency(items, concurrency, mapper) {
|
|
340
|
+
if (items.length === 0) {
|
|
341
|
+
return [];
|
|
342
|
+
}
|
|
343
|
+
const limit = Math.max(1, Math.min(concurrency, items.length));
|
|
344
|
+
const results = new Array(items.length);
|
|
345
|
+
let nextIndex = 0;
|
|
346
|
+
const run = async () => {
|
|
347
|
+
while (true) {
|
|
348
|
+
const currentIndex = nextIndex;
|
|
349
|
+
nextIndex += 1;
|
|
350
|
+
if (currentIndex >= items.length) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
results[currentIndex] = await mapper(items[currentIndex], currentIndex);
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
await Promise.all(Array.from({ length: limit }, () => run()));
|
|
357
|
+
return results;
|
|
358
|
+
}
|
|
359
|
+
function resolveStatusTraceMode() {
|
|
360
|
+
const rawValue = (process.env.ARCANE_AGENTS_STATUS_TRACE ?? "").trim().toLowerCase();
|
|
361
|
+
if (rawValue === "verbose" || rawValue === "2") {
|
|
362
|
+
return "verbose";
|
|
363
|
+
}
|
|
364
|
+
if (rawValue === "transitions" ||
|
|
365
|
+
rawValue === "1" ||
|
|
366
|
+
rawValue === "true" ||
|
|
367
|
+
rawValue === "on" ||
|
|
368
|
+
rawValue === "yes") {
|
|
369
|
+
return "transitions";
|
|
370
|
+
}
|
|
371
|
+
if (rawValue === "off" || rawValue === "0" || rawValue === "false" || rawValue === "no") {
|
|
372
|
+
return "off";
|
|
373
|
+
}
|
|
374
|
+
return "off";
|
|
375
|
+
}
|
|
376
|
+
function formatReason(code, detail) {
|
|
377
|
+
if (!detail) {
|
|
378
|
+
return code;
|
|
379
|
+
}
|
|
380
|
+
return `${code}:${truncateForTrace(detail, 48)}`;
|
|
381
|
+
}
|
|
382
|
+
function truncateForTrace(value, maxLength) {
|
|
383
|
+
if (value.length <= maxLength) {
|
|
384
|
+
return value;
|
|
385
|
+
}
|
|
386
|
+
if (maxLength <= 1) {
|
|
387
|
+
return value.slice(0, Math.max(0, maxLength));
|
|
388
|
+
}
|
|
389
|
+
return `${value.slice(0, maxLength - 1).trimEnd()}…`;
|
|
390
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const statusMonitor_1 = require("./statusMonitor");
|
|
5
|
+
const statusPipeline_1 = require("./statusPipeline");
|
|
6
|
+
vitest_1.vi.mock("./statusPipeline", () => ({
|
|
7
|
+
collectWorkerStatusSignals: vitest_1.vi.fn(),
|
|
8
|
+
evaluateWorkerStatusSignals: vitest_1.vi.fn(),
|
|
9
|
+
normalizeWorkerStatusEvaluation: vitest_1.vi.fn((evaluation) => evaluation)
|
|
10
|
+
}));
|
|
11
|
+
const defaultFacts = {
|
|
12
|
+
command: "claude",
|
|
13
|
+
commandQuietForMs: 0,
|
|
14
|
+
outputQuietForMs: 0,
|
|
15
|
+
workerAgeMs: 0,
|
|
16
|
+
isClaudeSession: true,
|
|
17
|
+
isOpenCodeSession: false,
|
|
18
|
+
hasOpenCodePromptSignal: false,
|
|
19
|
+
hasOpenCodeActiveSignal: false,
|
|
20
|
+
hasClaudeProgressSignal: false,
|
|
21
|
+
hasActiveClaudeTask: false,
|
|
22
|
+
hasRuntimeActivityText: false,
|
|
23
|
+
hasParsedStrongSignal: false,
|
|
24
|
+
hasParsedNeedsInput: false,
|
|
25
|
+
hasParsedError: false
|
|
26
|
+
};
|
|
27
|
+
function createWorker(workerId, status = "idle") {
|
|
28
|
+
return {
|
|
29
|
+
id: workerId,
|
|
30
|
+
name: workerId,
|
|
31
|
+
displayName: workerId,
|
|
32
|
+
projectId: "project",
|
|
33
|
+
projectPath: "/tmp/project",
|
|
34
|
+
runtimeId: "claude",
|
|
35
|
+
runtimeLabel: "Claude",
|
|
36
|
+
command: ["claude"],
|
|
37
|
+
status,
|
|
38
|
+
activityText: undefined,
|
|
39
|
+
activityTool: undefined,
|
|
40
|
+
activityPath: undefined,
|
|
41
|
+
avatarType: "wizard",
|
|
42
|
+
movementMode: "hold",
|
|
43
|
+
position: { x: 10, y: 10 },
|
|
44
|
+
tmuxRef: { session: "arcane-agents", window: workerId, pane: `%${workerId}` },
|
|
45
|
+
createdAt: "2026-03-04T00:00:00.000Z",
|
|
46
|
+
updatedAt: "2026-03-04T00:00:00.000Z"
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function createRepository(initialWorkers) {
|
|
50
|
+
const workers = new Map(initialWorkers.map((worker) => [worker.id, { ...worker }]));
|
|
51
|
+
const listWorkers = vitest_1.vi.fn(() => [...workers.values()].map((worker) => ({ ...worker })));
|
|
52
|
+
const updateStatus = vitest_1.vi.fn((workerId, update) => {
|
|
53
|
+
const existing = workers.get(workerId);
|
|
54
|
+
if (!existing) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const updated = {
|
|
58
|
+
...existing,
|
|
59
|
+
status: update.status,
|
|
60
|
+
activityText: update.activityText,
|
|
61
|
+
activityTool: update.activityTool,
|
|
62
|
+
activityPath: update.activityPath,
|
|
63
|
+
updatedAt: new Date().toISOString()
|
|
64
|
+
};
|
|
65
|
+
workers.set(workerId, updated);
|
|
66
|
+
return { ...updated };
|
|
67
|
+
});
|
|
68
|
+
const deleteWorker = vitest_1.vi.fn((workerId) => workers.delete(workerId));
|
|
69
|
+
return {
|
|
70
|
+
workers,
|
|
71
|
+
repo: {
|
|
72
|
+
listWorkers,
|
|
73
|
+
updateStatus,
|
|
74
|
+
deleteWorker
|
|
75
|
+
},
|
|
76
|
+
listWorkers,
|
|
77
|
+
updateStatus,
|
|
78
|
+
deleteWorker
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function createSignals() {
|
|
82
|
+
return {
|
|
83
|
+
currentCommand: "claude",
|
|
84
|
+
output: "",
|
|
85
|
+
observation: {
|
|
86
|
+
lastCommand: "claude",
|
|
87
|
+
lastCommandChangeAtMs: Date.now(),
|
|
88
|
+
lastOutputSignature: "",
|
|
89
|
+
lastOutputChangeAtMs: Date.now()
|
|
90
|
+
},
|
|
91
|
+
transcriptSnapshot: undefined
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function createEvaluation(status) {
|
|
95
|
+
return {
|
|
96
|
+
status,
|
|
97
|
+
activityText: status === "idle" || status === "stopped" ? undefined : `status-${status}`,
|
|
98
|
+
activityTool: status === "idle" || status === "stopped" ? undefined : "terminal",
|
|
99
|
+
activityPath: undefined,
|
|
100
|
+
confidence: 0.9,
|
|
101
|
+
reasons: [{ code: `status-${status}`, message: `Status ${status}` }],
|
|
102
|
+
facts: defaultFacts
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
(0, vitest_1.describe)("StatusMonitor", () => {
|
|
106
|
+
const collectMock = vitest_1.vi.mocked(statusPipeline_1.collectWorkerStatusSignals);
|
|
107
|
+
const evaluateMock = vitest_1.vi.mocked(statusPipeline_1.evaluateWorkerStatusSignals);
|
|
108
|
+
const normalizeMock = vitest_1.vi.mocked(statusPipeline_1.normalizeWorkerStatusEvaluation);
|
|
109
|
+
(0, vitest_1.beforeEach)(() => {
|
|
110
|
+
vitest_1.vi.clearAllMocks();
|
|
111
|
+
collectMock.mockResolvedValue(createSignals());
|
|
112
|
+
evaluateMock.mockImplementation((worker) => createEvaluation(worker.status));
|
|
113
|
+
normalizeMock.mockImplementation((evaluation) => evaluation);
|
|
114
|
+
delete process.env.ARCANE_AGENTS_STATUS_POLL_CONCURRENCY;
|
|
115
|
+
});
|
|
116
|
+
(0, vitest_1.it)("keeps expected status transitions including stopped removal", async () => {
|
|
117
|
+
const repository = createRepository([createWorker("worker-1", "idle")]);
|
|
118
|
+
const tmux = {
|
|
119
|
+
windowExists: vitest_1.vi.fn(async () => true)
|
|
120
|
+
};
|
|
121
|
+
const onWorkerUpdated = vitest_1.vi.fn();
|
|
122
|
+
const onWorkerRemoved = vitest_1.vi.fn();
|
|
123
|
+
const monitor = new statusMonitor_1.StatusMonitor(repository.repo, tmux, 1_000, onWorkerUpdated, onWorkerRemoved);
|
|
124
|
+
const statusSequence = ["working", "attention", "error", "idle", "stopped"];
|
|
125
|
+
let nextStatusIndex = 0;
|
|
126
|
+
evaluateMock.mockImplementation(() => {
|
|
127
|
+
const nextStatus = statusSequence[nextStatusIndex] ?? "stopped";
|
|
128
|
+
nextStatusIndex += 1;
|
|
129
|
+
return createEvaluation(nextStatus);
|
|
130
|
+
});
|
|
131
|
+
await monitor.pollOnce();
|
|
132
|
+
await monitor.pollOnce();
|
|
133
|
+
await monitor.pollOnce();
|
|
134
|
+
await monitor.pollOnce();
|
|
135
|
+
const transitionHistory = monitor.getWorkerStatusHistory("worker-1");
|
|
136
|
+
(0, vitest_1.expect)(transitionHistory.map((entry) => entry.toStatus)).toEqual(["working", "attention", "error", "idle"]);
|
|
137
|
+
(0, vitest_1.expect)(onWorkerUpdated).toHaveBeenCalledTimes(4);
|
|
138
|
+
await monitor.pollOnce();
|
|
139
|
+
(0, vitest_1.expect)(repository.workers.has("worker-1")).toBe(false);
|
|
140
|
+
(0, vitest_1.expect)(onWorkerRemoved).toHaveBeenCalledWith("worker-1");
|
|
141
|
+
(0, vitest_1.expect)(onWorkerRemoved).toHaveBeenCalledTimes(1);
|
|
142
|
+
});
|
|
143
|
+
(0, vitest_1.it)("bounds concurrent worker evaluations", async () => {
|
|
144
|
+
process.env.ARCANE_AGENTS_STATUS_POLL_CONCURRENCY = "2";
|
|
145
|
+
const repository = createRepository([
|
|
146
|
+
createWorker("worker-1"),
|
|
147
|
+
createWorker("worker-2"),
|
|
148
|
+
createWorker("worker-3"),
|
|
149
|
+
createWorker("worker-4"),
|
|
150
|
+
createWorker("worker-5")
|
|
151
|
+
]);
|
|
152
|
+
let inFlight = 0;
|
|
153
|
+
let maxInFlight = 0;
|
|
154
|
+
const tmux = {
|
|
155
|
+
windowExists: vitest_1.vi.fn(async () => {
|
|
156
|
+
inFlight += 1;
|
|
157
|
+
maxInFlight = Math.max(maxInFlight, inFlight);
|
|
158
|
+
await new Promise((resolve) => setTimeout(resolve, 8));
|
|
159
|
+
inFlight -= 1;
|
|
160
|
+
return true;
|
|
161
|
+
})
|
|
162
|
+
};
|
|
163
|
+
const monitor = new statusMonitor_1.StatusMonitor(repository.repo, tmux, 1_000, () => undefined, () => undefined);
|
|
164
|
+
await monitor.pollOnce();
|
|
165
|
+
(0, vitest_1.expect)(maxInFlight).toBeLessThanOrEqual(2);
|
|
166
|
+
(0, vitest_1.expect)(maxInFlight).toBeGreaterThanOrEqual(1);
|
|
167
|
+
});
|
|
168
|
+
(0, vitest_1.it)("tracks per-poll and per-worker timing metrics", async () => {
|
|
169
|
+
const repository = createRepository([createWorker("worker-1", "idle"), createWorker("worker-2", "working")]);
|
|
170
|
+
const tmux = {
|
|
171
|
+
windowExists: vitest_1.vi.fn(async () => true)
|
|
172
|
+
};
|
|
173
|
+
const monitor = new statusMonitor_1.StatusMonitor(repository.repo, tmux, 1_000, () => undefined, () => undefined);
|
|
174
|
+
evaluateMock.mockImplementation((worker) => {
|
|
175
|
+
if (worker.id === "worker-1") {
|
|
176
|
+
return createEvaluation("working");
|
|
177
|
+
}
|
|
178
|
+
return createEvaluation("stopped");
|
|
179
|
+
});
|
|
180
|
+
await monitor.pollOnce();
|
|
181
|
+
const performance = monitor.getStatusPerformanceDebug();
|
|
182
|
+
(0, vitest_1.expect)(performance.latestPoll).toBeDefined();
|
|
183
|
+
(0, vitest_1.expect)(performance.latestPoll?.workerCount).toBe(2);
|
|
184
|
+
(0, vitest_1.expect)(performance.latestPoll?.outcomeCounts.updated).toBe(1);
|
|
185
|
+
(0, vitest_1.expect)(performance.latestPoll?.outcomeCounts.removed).toBe(1);
|
|
186
|
+
(0, vitest_1.expect)(performance.recentPolls.length).toBe(1);
|
|
187
|
+
(0, vitest_1.expect)(performance.workers).toHaveLength(1);
|
|
188
|
+
(0, vitest_1.expect)(performance.workers[0]?.workerId).toBe("worker-1");
|
|
189
|
+
(0, vitest_1.expect)(performance.workers[0]?.durationMs).toBeGreaterThanOrEqual(0);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectWorkerStatusSignals = collectWorkerStatusSignals;
|
|
4
|
+
exports.evaluateWorkerStatusSignals = evaluateWorkerStatusSignals;
|
|
5
|
+
exports.normalizeWorkerStatusEvaluation = normalizeWorkerStatusEvaluation;
|
|
6
|
+
const runtimeSignals_1 = require("./runtimeSignals");
|
|
7
|
+
const statusEvaluator_1 = require("./statusEvaluator");
|
|
8
|
+
const paneObservation_1 = require("./paneObservation");
|
|
9
|
+
async function collectWorkerStatusSignals({ worker, tmux, paneObservation, claudeTranscript }) {
|
|
10
|
+
const paneState = await tmux.getPaneState(worker.tmuxRef);
|
|
11
|
+
if (paneState.isDead) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const [output, transcriptSnapshot] = await Promise.all([
|
|
15
|
+
tmux.capturePane(worker.tmuxRef, (0, runtimeSignals_1.capturePaneLineCount)(worker, paneState.currentCommand.toLowerCase())),
|
|
16
|
+
claudeTranscript.poll(worker, paneState.currentCommand, paneState.currentPath)
|
|
17
|
+
]);
|
|
18
|
+
const observation = (0, paneObservation_1.observePane)(paneObservation, worker.id, paneState.currentCommand, output);
|
|
19
|
+
return {
|
|
20
|
+
currentCommand: paneState.currentCommand,
|
|
21
|
+
output,
|
|
22
|
+
observation,
|
|
23
|
+
transcriptSnapshot
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function evaluateWorkerStatusSignals(worker, signals) {
|
|
27
|
+
return (0, statusEvaluator_1.evaluateWorkerStatus)({
|
|
28
|
+
worker,
|
|
29
|
+
currentCommand: signals.currentCommand,
|
|
30
|
+
output: signals.output,
|
|
31
|
+
observation: signals.observation,
|
|
32
|
+
transcriptSnapshot: signals.transcriptSnapshot
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function normalizeWorkerStatusEvaluation(evaluation) {
|
|
36
|
+
if (evaluation.status !== "idle") {
|
|
37
|
+
return evaluation;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
...evaluation,
|
|
41
|
+
activityText: undefined,
|
|
42
|
+
activityTool: undefined,
|
|
43
|
+
activityPath: undefined
|
|
44
|
+
};
|
|
45
|
+
}
|