herm-tui 1.6.0-dev.1 → 1.6.0-dev.11
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/assets/eikons/ares.eikon +1 -1
- package/assets/eikons/default.eikon +1 -1
- package/assets/eikons/mono.eikon +1 -1
- package/assets/skills/eikon/SKILL.md +83 -0
- package/bin/herm.cjs +62 -0
- package/db.worker.js +1 -1
- package/index.js +81 -70
- package/package.json +2 -2
package/assets/eikons/ares.eikon
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{"eikon":1,"name":"ares","width":48,"height":24,"author":"kaio","created":"2026-05-04T02:34:15.333Z"}
|
|
1
|
+
{"eikon":1,"name":"ares","width":48,"height":24,"author":"kaio","created":"2026-05-04T02:34:15.333Z","source_url":"https://raw.githubusercontent.com/liftaris/eikon/main/eikons/ares/"}
|
|
2
2
|
{"state":"idle","fps":16,"color":"#7aa2f7","frame_count":65,"loop_from":0}
|
|
3
3
|
{"f":0,"data":"⠿⢿⣦⣌⡻⣷⣟⢯⡈⢞⣿⣿⡯⣞⡧⣿⣵⣴⣶⣾⣿⣿⠿⠾⣦⣴⣼⣻⣿⣦⢹⡿⣣⣟⣾⣿⣿⣿⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠈⠉⠹⠾⢿⢝⢳⣄⠫⣻⣷⣷⣿⡿⠟⣋⣽⣿⣿⣿⣶⣾⣶⣾⣿⣽⣿⡾⣟⡲⣼⡾⡿⣿⣿⢗⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢀⠑⣴⣿⣿⣿⢟⣽⣾⣿⣿⣿⠿⠿⢿⡛⠛⣿⣿⢿⢿⣿⣿⣮⣷⣽⢯⣾⡻⣟⣯⣯⠿⣆⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠰⣬⡿⠟⢛⣥⣿⣿⣿⠟⣿⣶⣶⣾⣿⣿⣴⣿⣿⣾⣶⣭⡻⢿⣿⣿⡻⣝⣭⣿⣶⣾⣷⣤⣄⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠈⠁⢠⠀⠸⣿⣿⡿⣻⣶⣟⣿⣏⣿⢿⣭⣽⣿⣿⣿⣿⣯⣿⣮⠊⣿⣿⣿⣯⢕⣲⣾⣿⡿⢫⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣾⣿⣿⣿⣿⣧⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⡟⢮⢿⡿⣯⣿⣿⣿⣿⣷⣢⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⠃⢀⣾⣿⣿⣿⣿⣿⣿⢫⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣄⠹⢿⡔⢿⣿⣿⡻⣿⡆⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡼⠁⣄⣨⣭⣭⣭⣟⣛⣿⠿⢰⣾⣽⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠉⣷⢿⣳⢿⣿⡪⡅⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢘⣵⣭⣷⣾⣿⣿⣿⣷⣾⣯⣝⡓⠧⣭⣻⣿⣿⣿⣿⣿⣿⣹⣟⣿⣿⣿⣿⣿⣷⡘⠉⣺⣄⣻⣻⣮⠆⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⡔⢁⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣾⣿⣽⣛⠿⠅⠿⣿⢿⣿⣿⣿⣿⣧⠄⢱⣫⢞⢽⣿⠧⠀⠀⠀\n⠀⠀⠀⠀⠀⠈⠄⢘⣿⣿⡿⣿⠿⠿⣿⡿⠿⠿⠿⠛⣿⣿⣿⣿⣿⣿⣿⣿⣿⣫⣷⣾⣿⢿⣿⣿⣿⣷⠅⠘⣡⣿⣍⣾⢿⡂⠀⠀\n⠀⠀⠀⠀⠀⠀⣃⡘⠛⢉⣶⣿⣿⣿⣿⠿⠶⣿⣿⣿⣿⣿⣷⣿⣟⣿⣻⣿⣿⠿⢿⣯⢟⣖⢺⣻⣿⣿⡃⢨⢤⢞⣿⣏⣷⣃⠀⠀\n⠀⠀⠀⢀⠠⠪⠊⢴⢾⣽⣿⣿⣏⣥⣷⠾⠟⠋⠉⠁⠀⠀⠀⠀⠀⠈⠉⣉⡩⢽⣏⡱⣼⡿⣡⣻⡿⣿⠃⠘⣴⣿⡞⣿⣩⢷⡀⠀\n⠀⣠⣰⣷⣶⣶⣶⡿⢿⠟⠛⠋⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⣾⢿⡿⣟⣟⣾⣿⣿⣿⣦⠈⢿⣿⣿⣿⣷⣿⡆⠀\n⠘⠉⠋⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣷⣿⢼⣿⣿⣿⣯⣿⣿⣎⡸⣿⡖⢴⣯⣧⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣽⣿⣿⣿⡿⠿⠿⠿⣿⣭⣽⣾⣿⣻⡜⠙⢝⣯⢻⡀\n⠀⠀⠀⠀⠀⠀⠀⠀⢂⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⣴⣶⣿⣿⣿⣾⣿⣿⣿⣿⠇⠀⠀⠀⠈⠉⠀⠉⠉⠉⠿⠛⠶⢮⡟⣦\n⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⠄⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⡟⣯⣿⣿⣿⣿⣿⣿⣷⣿⣿⠀⠀⠀⠀⠀⠀⢀⡔⡶⡠⢤⣤⣯⠈⣿⡞\n⠀⠀⠀⠀⠀⠀⠀⠀⠉⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⢾⡟⠀⠀⠀⠀⠀⠀⠀⠉⢰⠪⡘⣿⣽⡏⠌⢿\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠴⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⢽⡇⠀⠀⠀⠀⠀⠀⠀⠐⢘⣸⣟⣿⣿⣷⡇⢹\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡇⡄⠀⠀⠀⠀⠀⠀⠀⠀⣿⣧⣿⣿⣿⣿⣿⣿⣿⣝⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠈⠱⣿⣿⣿⣿⣧⠊\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣷⢁⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⡿⣣⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢿⡿⣿⣿⣿⣂\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡘⠀⠀⠀⠀⠀⠀⠀⢸⣿⢿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⢿⣿⣷\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣧⠂⠀⠀⠀⠀⠀⠀⣾⣿⣾⣿⣿⣿⣯⣷⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙"}
|
|
4
4
|
{"f":1,"data":"⠻⢿⢶⣬⡻⢿⣿⢯⡘⢞⣿⢿⡭⣞⡣⢯⣵⣶⣶⣾⣿⣿⠿⠶⣦⣶⣼⣹⣿⣤⢳⣿⣳⣟⣾⣿⣿⣯⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠈⠘⠙⠖⢿⢖⢷⡤⠻⣻⣷⣷⣿⣿⣟⣫⣽⣿⣿⣿⣿⣿⣷⣾⣿⣽⣿⣯⣟⣿⣽⡿⡿⣿⣿⣗⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢀⠑⣵⣿⣿⣿⢟⣽⣾⣿⣿⣿⠿⠿⢿⡛⠛⣿⣿⣿⣿⣿⣿⣮⣷⣽⣫⣿⡫⣟⣟⣯⠿⣆⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢀⣬⡿⠟⢛⣥⣿⣿⣿⠿⣻⣶⣶⣶⣿⣿⣷⣿⣿⣾⣾⣭⠿⢿⣿⣿⡻⣝⣭⣿⣶⣾⣷⣦⣄⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠁⢠⠀⢸⣿⣿⡿⣯⣾⣟⣿⣏⣿⢿⣭⣽⣿⣿⣿⣿⣧⣶⣮⡊⣿⣿⣟⣯⢴⣺⣾⣿⡿⢫⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣾⣿⣿⣿⣿⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣟⣟⢮⢿⣾⣯⣿⣿⣿⣿⣷⡦⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⠃⢀⣾⣿⣿⣿⣿⣿⣿⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠹⣿⡔⢿⣿⡿⡻⣿⡆⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡼⠁⣄⣌⣭⣭⣭⣟⣛⣿⠿⢰⣾⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠉⣷⢿⣳⢿⣯⡪⡑⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢈⣴⣽⣅⣾⣿⣿⣿⣷⣿⣭⣽⡓⠧⣯⣻⣿⣿⣿⣿⣿⣿⣸⣻⣿⣿⣿⣿⣿⣷⡘⠸⣚⡄⣻⣿⣎⠆⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⡔⠁⣿⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣽⣛⠿⠇⠿⣿⢿⣿⣿⣿⣿⣷⠆⢱⣫⣞⡿⣷⡧⠀⠀⠀\n⠀⠀⠀⠀⠀⠈⡄⠰⣿⣿⡿⣿⠿⠿⣿⡿⣛⠻⠿⣻⣿⣿⣿⣿⣿⣿⣿⣷⣿⣫⣷⣶⣿⢿⣿⣿⣿⣿⠄⠸⣟⣟⣿⣾⢿⡀⠀⠀\n⠀⠀⠀⠀⠀⠀⣃⡘⠛⢉⣺⣿⣿⣿⣿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⡿⢿⣯⢟⣑⢺⣻⣿⣿⡃⢸⢽⣾⣿⡿⢷⡃⠀⠀\n⠀⠀⠀⢀⠠⠮⠊⢴⣿⣽⣿⣿⣯⣥⣶⠾⠟⠛⠉⠁⠀⠀⠀⠀⠀⠀⢉⣉⡩⢽⣋⣱⣼⡿⣡⣻⣿⣟⠂⠘⣮⣿⠚⣿⣻⢷⡀⠀\n⠀⣠⣰⣷⣶⣶⣾⡿⢿⠟⠛⠋⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⣾⢿⡿⣟⣯⣾⣿⣿⣿⣧⠘⢣⣾⣷⢟⣷⣿⡆⠀\n⠘⠉⠋⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣷⣿⢽⣿⣿⣿⣿⣿⣿⣎⡘⣿⡏⢳⣫⣣⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⡿⠿⠿⠿⣿⣭⣽⣾⣿⣻⡝⠙⢭⣯⣟⡀\n⠀⠀⠀⠀⠀⠀⠀⠀⢂⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⣶⣶⣿⣿⣿⣿⣿⣿⡿⣿⠇⠀⠀⠀⠈⠉⠀⠉⠉⠉⠽⠛⠷⢯⣏⣆\n⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⠄⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⡟⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⢀⣔⣆⢤⢠⣦⣯⢬⣯⡜\n⠀⠀⠀⠀⠀⠀⠀⠀⠉⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⣾⣿⣿⣿⣿⣿⣿⣿⢾⡏⠀⠀⠀⠀⠀⠀⠀⠁⢰⠒⠐⣿⣿⡆⢉⢶\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠴⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⢽⡇⠀⠀⠀⠀⠀⠀⠀⠐⢸⣜⢊⣿⣿⣿⡇⢸\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡇⡄⠀⠀⠀⠀⠀⠀⠀⠀⣿⣧⣿⣿⣿⣿⣿⣿⣿⣽⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⡷⢌\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣷⢁⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⡿⣧⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣾⣿⣿⣔\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡊⠀⠀⠀⠀⠀⠀⠀⢸⣿⢿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⢲⣿⣿\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣧⠂⠀⠀⠀⠀⠀⠀⣾⣿⣾⣿⣿⣿⣿⣷⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{"eikon":1,"name":"Nous","width":48,"height":24,"author":"kaio","created":"2026-05-04T02:32:53.930Z"}
|
|
1
|
+
{"eikon":1,"name":"Nous","width":48,"height":24,"author":"kaio","created":"2026-05-04T02:32:53.930Z","source_url":"https://raw.githubusercontent.com/liftaris/eikon/main/eikons/nous/"}
|
|
2
2
|
{"state":"idle","fps":16,"color":"#7aa2f7","frame_count":64,"loop_from":0}
|
|
3
3
|
{"f":0,"data":"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣠⣤⣤⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⣬⣥⣄⣀⠀⠉⠙⠻⣿⣿⣿⣿⣷⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀⠀⠈⠻⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡿⢦⡀⠀⠈⢿⣿⣿⣿⣿⣿⢿⡗⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⡰⣻⣿⣿⣿⢏⣿⣿⣿⣿⣿⣿⣿⡿⠙⠏⠀⠀⣮⡳⠀⠀⠈⢿⢿⠻⠿⡏⠁⠁⣸⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠌⠈⠉⢺⠻⢃⠊⠙⠛⢠⡀⢀⠙⠁⠁⠀⡘⣶⣷⣿⣷⣾⠀⠀⠈⣶⣆⣳⣶⣮⢔⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⡼⣴⢶⣤⣶⣾⣼⣿⣿⣿⣿⢿⣿⣿⣿⣾⣶⣿⣿⣿⣿⣿⣿⡇⣀⣠⣸⣿⣷⣻⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢯⣿⣚⣿⣿⣿⢿⣿⣿⣿⣿⣗⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⡘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⡿⠧⠻⠟⣻⠟⡓⠈⠛⠛⠛⠛⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣹⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠻⣿⡿⣿⣿⣉⣁⠀⠀⠀⠀⠸⢻⣿⡷⢦⡄⠀⠀⠀⢹⣿⣿⣿⣿⢟⣛⡻⣿⣿⣿⣯⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠈⠙⠊⢻⣏⢿⠇⠀⠀⠀⠀⠬⠿⠥⠊⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡼⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣸⣯⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⢿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡾⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣿⣇⠰⣄⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⡆⠣⠄⠈⠁⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣼⣿⣿⢹⣿⣇⠀⠀⠀⠀\n⠀⠀⢠⠀⠀⠀⠀⢸⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⡏⢈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠄⣿⣿⡀⠀⠀⠀\n⠀⠀⣟⠀⠀⠀⠀⣿⣿⣿⣿⣿⣦⣀⣀⣀⣀⣠⣄⡀⠀⠀⢸⣿⣿⣿⡾⠟⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⣹⣿⡇⠐⡄⠀\n⠀⢀⣿⣦⣀⣠⣼⣿⣿⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⠀⣸⣿⣿⣯⡀⣀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢀⣿⣿⡇⠀⣷⠀\n⠀⠘⣜⠿⣿⣿⠿⠋⣱⣿⣿⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⡾⠋⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣣⣾⣿⣿⡇⢠⣿⠀\n⠀⠀⠙⠿⣶⣤⣶⣾⣿⣿⢋⣿⣿⣿⣿⣿⣿⣿⣿⠛⢋⡠⢆⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢠⣿⠏⠀\n⠀⠀⠀⠀⠀⠉⢯⣉⣉⣡⣾⣿⣿⣿⣿⣿⣿⣿⣿⣧⡀⢋⠝⠃⣀⣴⠟⠫⢛⣭⡿⠚⠋⠉⠁⠒⠫⣝⠻⣿⣿⣿⢟⣵⡿⠋⠀⠀\n⠀⠀⠀⠀⠀⠀⠈⠛⠿⠿⠛⢁⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⡶⠟⠉⠀⢀⣴⡟⠁⠀⠀⠀⠀⠀⠀⠀⠈⠳⣜⢿⡿⠟⠋⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⠿⣿⢯⡾⠋⠀⠀⢀⡔⠀⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠮⠅⠀⠀⠀⠀⠀⠀"}
|
|
4
4
|
{"f":1,"data":"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣠⣠⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣤⣤⣥⣤⣀⠀⠉⠉⠻⢿⣿⣿⣿⣷⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣄⠀⠀⠙⢿⣿⣿⣿⣿⣿⣷⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⡿⢷⡀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣧⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⡠⣫⡿⣿⣿⢟⣾⣿⡟⣿⣿⣿⣿⣿⠎⠟⠀⠀⢴⡻⠄⠀⠀⢻⣿⠿⢿⣿⠃⠉⢠⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠔⠄⠀⠙⠳⠋⠎⠉⠚⢁⣄⣀⢸⠉⠁⠀⡈⢶⣾⣿⣷⣾⡀⠀⠀⢶⣦⡴⣦⣶⣂⣦⢿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⣸⣵⣦⣧⣶⣾⣿⣿⣿⣿⣿⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⢀⣀⡸⣿⣿⣻⣿⣷⢾⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⢠⣷⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣏⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣌⣿⣰⢿⣿⣷⢿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⡜⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⣿⣿⣿⣿⣿⡃⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⠿⠇⠙⠛⡻⢟⣋⠉⠛⠛⠛⠛⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣹⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠙⢿⣟⢿⣿⣁⣐⠀⠀⠀⠀⠘⢻⣿⡷⢦⡄⠀⠀⠀⣸⣿⣿⣿⣿⠟⠛⠻⣿⣿⣿⣯⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠉⠃⢹⣏⢻⠇⠀⠀⠀⠀⠨⠽⠥⠊⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣹⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⢸⣏⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⢿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣼⠇⠠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡾⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣿⣇⠸⣄⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣏⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⡆⠫⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢻⣿⡇⠀⠀⠀⠀\n⠀⠀⡠⠀⠀⠀⠀⣸⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⠃⢘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠈⣿⣿⠀⠀⠀⠀\n⠀⢠⣧⠀⠀⠀⢀⣿⣿⣿⣿⣿⣦⣀⣀⣀⣀⣠⣄⡀⠀⠀⣿⣿⣿⣯⡶⠟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⢹⣿⡇⢠⠀⠀\n⠀⠈⣿⣶⣤⣤⣾⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⠀⣿⣿⣿⣏⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢀⣿⣿⡇⠀⣧⠀\n⠀⠘⣌⡻⠿⠿⠟⢋⣼⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡾⠛⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣣⣾⣿⣿⡇⢰⣿⠀\n⠀⠀⠘⠻⣷⣶⣾⣿⣿⡿⢳⣿⣿⣿⣿⣿⣿⣿⣿⠛⢋⡠⢆⠈⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢠⣿⠇⠀\n⠀⠀⠀⠀⠀⠈⣯⣉⣁⣴⣿⡿⣿⣿⣿⣿⣿⣿⣿⣧⡀⢋⠝⠃⣀⣴⠟⠻⢛⣭⡿⠚⠋⠉⠁⠒⠫⣙⠻⣿⣿⣿⡟⣱⣿⠋⠀⠀\n⠀⠀⠀⠀⠀⠀⠈⠛⠛⠛⠋⣰⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⡶⠟⠉⠀⢀⣴⠟⠁⠀⠀⠀⠀⠀⠀⠀⠈⠳⣜⢿⣿⠿⠋⠁⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⠿⣿⢯⡾⠋⠀⠀⢀⡔⢀⡾⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠺⠅⠀⠀⠀⠀⠀⠀"}
|
package/assets/eikons/mono.eikon
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{"eikon":1,"name":"mono","width":48,"height":24,"author":"kaio","created":"2026-05-04T00:57:25.119Z"}
|
|
1
|
+
{"eikon":1,"name":"mono","width":48,"height":24,"author":"kaio","created":"2026-05-04T00:57:25.119Z","source_url":"https://raw.githubusercontent.com/liftaris/eikon/main/eikons/mono/"}
|
|
2
2
|
{"state":"idle","fps":16,"frame_count":49,"loop_from":0}
|
|
3
3
|
{"f":0,"data":"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣿⣿⣿⣿⣿⣶⣦⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⢿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣏⢁⠰⣌⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣡⣟⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠞⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠁⠁⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡿⠟⠋⢉⠛⠻⠿⠿⠿⠿⢿⡥⠁⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠁⠁⠁⠥⠁⠁⠂⠁⠁⢀⣼⡇⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣦⢀⢀⢀⠄⢀⢠⣾⣿⣥⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡇⢀⠂⠁⢀⣾⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡇⠁⠁⢀⢸⣿⣿⣿⣿⣿⣿⣿⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣿⣇⣾⢀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣶⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⢿⠿⢟⡿⠿⠟⠓⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⢟⠛⢉⢑⣀⢀⢉⠊⠉⢀⢀⠂⢀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⠻⠛⠛⠛⠋⠉⠃⠂⠂⠁⠉⠁⠁⠁⠁⠁⠁⠁⠁⠁⠁⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀"}
|
|
4
4
|
{"f":1,"data":"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣿⣿⣿⣿⣿⣶⣦⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⢿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣏⢁⠰⣌⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣡⣟⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠁⠁⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠂⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡿⠟⠛⢉⠛⠻⠿⠿⠿⠿⢿⡥⠁⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠁⠁⠁⠥⠁⠂⠂⠁⠁⢀⣼⡏⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣦⢀⠁⢀⠄⢀⢠⣾⣿⣥⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡇⢀⠂⠁⢀⣾⣿⣽⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡇⠂⠁⢀⢸⣿⣿⣿⣿⣿⣿⣿⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣿⣇⣾⢀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣶⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⢿⡿⣿⡿⠿⠿⠓⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⢟⠛⢉⢐⡒⢀⠉⠊⠉⢀⢀⠂⢀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⠻⠛⠛⠛⠋⠉⠁⠁⠂⠁⠉⠁⠁⠁⠁⠁⠁⠁⠁⠁⠁⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eikon
|
|
3
|
+
description: Author a sidebar eikon avatar — produce/adopt a source image into ~/.hermes/eikons/<name>/, seed studio.json, then coach the user on the in-app Eikon tab controls. Filesystem is the API; no WIP files, no event polling.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Eikon — author a herm sidebar avatar
|
|
7
|
+
|
|
8
|
+
## When this fires
|
|
9
|
+
|
|
10
|
+
User asks for a new avatar, to "make an eikon", to turn an image into their sidebar avatar, or references `~/.hermes/eikons/`.
|
|
11
|
+
|
|
12
|
+
## Folder contract
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
~/.hermes/eikons/<name>/
|
|
16
|
+
<name>.eikon packed NDJSON (48×24, 6 states)
|
|
17
|
+
studio.json { rasterizer, spatial:{zoom,ox,oy}, base:{}, per:{}, glyph, sources:{} }
|
|
18
|
+
source/ base.png (or .jpg/.webp); optionally idle.png, error.png …
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Herm's Eikon tab reads `studio.json` on open and re-renders from `source/`. Ctrl+S in the tab rewrites both files. The sidebar follows `eikon` (a bare name) in `~/.hermes/herm/tui.json`, resolved against `<profile>/eikons/` then bundled.
|
|
22
|
+
|
|
23
|
+
## Steps
|
|
24
|
+
|
|
25
|
+
1. **Get a source image.** User-supplied path → use as-is. Otherwise `image_generate` a square mono portrait (prompt should specify: high contrast, centered subject, plain background, 1:1). Save to a temp path.
|
|
26
|
+
|
|
27
|
+
2. **Pick a name.** Slugify what the user asked for (`lowercase, [a-z0-9-]`). Default `custom` if unclear.
|
|
28
|
+
|
|
29
|
+
3. **Adopt + seed.** One shell block:
|
|
30
|
+
```bash
|
|
31
|
+
NAME=…; SRC=…
|
|
32
|
+
mkdir -p ~/.hermes/eikons/$NAME/source
|
|
33
|
+
cp "$SRC" ~/.hermes/eikons/$NAME/source/base.${SRC##*.}
|
|
34
|
+
cat > ~/.hermes/eikons/$NAME/studio.json <<EOF
|
|
35
|
+
{"rasterizer":"chafa","spatial":{"zoom":1,"ox":0.5,"oy":0.5},"base":{},"per":{},"glyph":"◆","sources":{"base":"base.${SRC##*.}"}}
|
|
36
|
+
EOF
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
4. **Seed a starter `.eikon`** so the tab and gallery have something to show before the user's first Ctrl+S. If `chafa` + `ffmpeg` are installed:
|
|
40
|
+
```bash
|
|
41
|
+
ffmpeg -hide_banner -loglevel error -i ~/.hermes/eikons/$NAME/source/base.* \
|
|
42
|
+
-vf "crop=min(iw\,ih):min(iw\,ih),eq=contrast=1.0" -frames:v 1 -f image2pipe -vcodec png - \
|
|
43
|
+
| chafa --size=48x24 --format=symbols --stretch --symbols=braille --colors=none --invert --preprocess off - \
|
|
44
|
+
> /tmp/eikon-frame.txt
|
|
45
|
+
```
|
|
46
|
+
Then write six copies as NDJSON:
|
|
47
|
+
```bash
|
|
48
|
+
python3 - <<'PY'
|
|
49
|
+
import json,os
|
|
50
|
+
n=os.environ["NAME"]; f=open("/tmp/eikon-frame.txt").read().rstrip("\n")
|
|
51
|
+
rows=(f.split("\n")+[""]*24)[:24]; data="\n".join(r.ljust(48)[:48] for r in rows)
|
|
52
|
+
out=[json.dumps({"eikon":1,"name":n,"width":48,"height":24,"author":os.environ.get("USER","")})]
|
|
53
|
+
for s in ["idle","listening","thinking","speaking","working","error"]:
|
|
54
|
+
out+=[json.dumps({"state":s,"fps":12,"frame_count":1,"loop_from":1}),json.dumps({"f":0,"data":data})]
|
|
55
|
+
open(os.path.expanduser(f"~/.hermes/eikons/{n}/{n}.eikon"),"w").write("\n".join(out)+"\n")
|
|
56
|
+
PY
|
|
57
|
+
```
|
|
58
|
+
If chafa/ffmpeg aren't installed, skip this step — the tab's `native` rasterizer will render on first open.
|
|
59
|
+
|
|
60
|
+
5. **Point the sidebar at it** (optional — user can do this from Gallery):
|
|
61
|
+
```bash
|
|
62
|
+
python3 -c "import json,os; p=os.path.expanduser('~/.hermes/herm/tui.json'); d=json.load(open(p)) if os.path.exists(p) else {}; d['eikon']='$NAME'; open(p,'w').write(json.dumps(d,indent=2))"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
6. **Coach.** Tell the user:
|
|
66
|
+
> Wrote `<name>`. Open the **Eikon** tab (Alt+5 or type `/eikon`). Drag the preview to reframe, scroll to zoom. If it's too dark, nudge **contrast** up in the Knobs panel; if detail is mushy, try **symbols → block**. Tab cycles panes; ←→ on a knob row adjusts it. **Ctrl+S** saves and the sidebar updates.
|
|
67
|
+
|
|
68
|
+
## Knob vocabulary (for coaching — chafa rasterizer)
|
|
69
|
+
|
|
70
|
+
- `symbols`: braille · block · ascii · sextant · quad · half · wedge
|
|
71
|
+
- `fill`: none · stipple · ascii · braille (gradient class, layers under symbols)
|
|
72
|
+
- `dither`: none · ordered · diffusion · noise (diffusion = halftone grain)
|
|
73
|
+
- `invert`: on/off (most photos want on against a dark terminal)
|
|
74
|
+
- `flip`: none · h · v · hv
|
|
75
|
+
- `contrast`: 0.5–3.0
|
|
76
|
+
|
|
77
|
+
Spatial (preview pane, not knob rows): wheel zooms; zoom/pan x/pan y sliders below the frame.
|
|
78
|
+
|
|
79
|
+
## Don't
|
|
80
|
+
|
|
81
|
+
- Write a WIP file or poll for `tool.complete` — that flow is gone.
|
|
82
|
+
- Write tonal knob values into `studio.json.base` beyond `{}` — user owns tuning.
|
|
83
|
+
- Re-run the pipeline to "adjust contrast" for the user — tell them which knob to move.
|
package/bin/herm.cjs
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Launcher shim: locate a bun runtime and exec dist/index.js under it.
|
|
3
|
+
// Node shebang so npm's cmd-shim generates a .ps1 that invokes node.exe,
|
|
4
|
+
// which is always resolvable (npm itself is running under it). A bun
|
|
5
|
+
// shebang produces a .ps1 that looks for a literal bun.exe in PATH and
|
|
6
|
+
// fails when bun was installed via `npm i -g bun` (npm/cmd-shim#95).
|
|
7
|
+
|
|
8
|
+
const cp = require("child_process")
|
|
9
|
+
const fs = require("fs")
|
|
10
|
+
const path = require("path")
|
|
11
|
+
|
|
12
|
+
const win = process.platform === "win32"
|
|
13
|
+
const exe = win ? "bun.exe" : "bun"
|
|
14
|
+
const here = path.dirname(fs.realpathSync(__filename))
|
|
15
|
+
const entry = [path.join(here, "..", "index.js"), path.join(here, "..", "dist", "index.js")]
|
|
16
|
+
.find(fs.existsSync) ?? path.join(here, "..", "src", "index.tsx")
|
|
17
|
+
|
|
18
|
+
function walk(dir, rel) {
|
|
19
|
+
for (;;) {
|
|
20
|
+
const p = path.join(dir, "node_modules", ...rel)
|
|
21
|
+
if (fs.existsSync(p)) return p
|
|
22
|
+
const up = path.dirname(dir)
|
|
23
|
+
if (up === dir) return null
|
|
24
|
+
dir = up
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// BUN_INSTALL (official installer) → node_modules/bun (npm -g bun sibling)
|
|
29
|
+
// → node_modules/.bin (pm-local) → PATH.
|
|
30
|
+
const bun = (() => {
|
|
31
|
+
if (process.env.HERM_BUN) return process.env.HERM_BUN
|
|
32
|
+
const inst = process.env.BUN_INSTALL
|
|
33
|
+
if (inst) {
|
|
34
|
+
const p = path.join(inst, "bin", exe)
|
|
35
|
+
if (fs.existsSync(p)) return p
|
|
36
|
+
}
|
|
37
|
+
return walk(here, ["bun", "bin", exe])
|
|
38
|
+
?? walk(here, [".bin", win ? "bun.cmd" : "bun"])
|
|
39
|
+
?? "bun"
|
|
40
|
+
})()
|
|
41
|
+
|
|
42
|
+
const child = cp.spawn(bun, [entry, ...process.argv.slice(2)], {
|
|
43
|
+
stdio: "inherit",
|
|
44
|
+
shell: win && bun.endsWith(".cmd"),
|
|
45
|
+
})
|
|
46
|
+
child.on("error", (e) => {
|
|
47
|
+
if (e.code === "ENOENT") {
|
|
48
|
+
console.error("herm: bun runtime not found.")
|
|
49
|
+
console.error(win
|
|
50
|
+
? ' install: powershell -c "irm bun.sh/install.ps1 | iex"'
|
|
51
|
+
: " install: curl -fsSL https://bun.sh/install | bash")
|
|
52
|
+
} else {
|
|
53
|
+
console.error(e.message)
|
|
54
|
+
}
|
|
55
|
+
process.exit(1)
|
|
56
|
+
})
|
|
57
|
+
for (const sig of ["SIGINT", "SIGTERM", "SIGHUP"])
|
|
58
|
+
process.on(sig, () => { try { child.kill(sig) } catch {} })
|
|
59
|
+
child.on("exit", (code, sig) => {
|
|
60
|
+
if (sig) return process.kill(process.pid, sig)
|
|
61
|
+
process.exit(code ?? 0)
|
|
62
|
+
})
|
package/db.worker.js
CHANGED
|
@@ -26,7 +26,7 @@ var __create=Object.create;var{getPrototypeOf:__getProtoOf,defineProperty:__defP
|
|
|
26
26
|
SUBSTR(tool_calls,1,400) AS tool_calls, timestamp AS at
|
|
27
27
|
FROM (SELECT * FROM messages WHERE session_id = ?
|
|
28
28
|
ORDER BY id DESC LIMIT ?)
|
|
29
|
-
ORDER BY id ASC`)?.all(sid,n)??[]}finally{end()}}function goalState(sid){let row=q("SELECT value FROM state_meta WHERE key = ?")?.get(`goal:${sid}`);if(!row)return null;try{let j=JSON.parse(row.value),checklist=(Array.isArray(j.checklist)?j.checklist:[]).map(parseItem).filter((x)=>x!==null);return{goal:String(j.goal??""),status:j.status??"active",turn_count:typeof j.turn_count==="number"?j.turn_count:void 0,max_turns:j.max_turns??null,checklist:checklist.length>0?checklist:void 0,decomposed:j.decomposed===!0?!0:void 0}}catch{return null}}function search(query,limit=30){let m=fts(query);if(!m)return[];let end=mark("io:sessions.search");try{let raw=q(`SELECT m.session_id, m.role,
|
|
29
|
+
ORDER BY id ASC`)?.all(sid,n)??[]}finally{end()}}function goalState(sid){let row=q("SELECT value FROM state_meta WHERE key = ?")?.get(`goal:${sid}`);if(!row)return null;try{let j=JSON.parse(row.value),checklist=(Array.isArray(j.checklist)?j.checklist:[]).map(parseItem).filter((x)=>x!==null),subgoals=(Array.isArray(j.subgoals)?j.subgoals:[]).map((s)=>typeof s==="string"?s.trim():"").filter((s)=>s.length>0);return{goal:String(j.goal??""),status:j.status??"active",turn_count:typeof j.turn_count==="number"?j.turn_count:void 0,max_turns:j.max_turns??null,checklist:checklist.length>0?checklist:void 0,subgoals:subgoals.length>0?subgoals:void 0,decomposed:j.decomposed===!0?!0:void 0}}catch{return null}}function search(query,limit=30){let m=fts(query);if(!m)return[];let end=mark("io:sessions.search");try{let raw=q(`SELECT m.session_id, m.role,
|
|
30
30
|
snippet(messages_fts, 0, '>>>', '<<<', '...', 40) AS snippet,
|
|
31
31
|
s.source, s.model, s.started_at,
|
|
32
32
|
COALESCE(s.title, SUBSTR(m.content, 1, 120)) AS title
|