@zhijiewang/openharness 0.5.1 → 0.6.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.
Files changed (185) hide show
  1. package/dist/commands/cybergotchi.d.ts.map +1 -1
  2. package/dist/commands/cybergotchi.js +22 -19
  3. package/dist/commands/cybergotchi.js.map +1 -1
  4. package/dist/components/App.d.ts +1 -1
  5. package/dist/components/App.d.ts.map +1 -1
  6. package/dist/components/App.js +58 -2
  7. package/dist/components/App.js.map +1 -1
  8. package/dist/components/CompanionFooter.d.ts +9 -0
  9. package/dist/components/CompanionFooter.d.ts.map +1 -0
  10. package/dist/components/CompanionFooter.js +13 -0
  11. package/dist/components/CompanionFooter.js.map +1 -0
  12. package/dist/components/CybergotchiBubble.d.ts +2 -1
  13. package/dist/components/CybergotchiBubble.d.ts.map +1 -1
  14. package/dist/components/CybergotchiBubble.js +4 -5
  15. package/dist/components/CybergotchiBubble.js.map +1 -1
  16. package/dist/components/CybergotchiPanel.d.ts +5 -4
  17. package/dist/components/CybergotchiPanel.d.ts.map +1 -1
  18. package/dist/components/CybergotchiPanel.js +4 -2
  19. package/dist/components/CybergotchiPanel.js.map +1 -1
  20. package/dist/components/CybergotchiPanelConnected.js +4 -4
  21. package/dist/components/CybergotchiPanelConnected.js.map +1 -1
  22. package/dist/components/CybergotchiSetup.d.ts.map +1 -1
  23. package/dist/components/CybergotchiSetup.js +25 -61
  24. package/dist/components/CybergotchiSetup.js.map +1 -1
  25. package/dist/components/CybergotchiSprite.d.ts +5 -4
  26. package/dist/components/CybergotchiSprite.d.ts.map +1 -1
  27. package/dist/components/CybergotchiSprite.js +16 -9
  28. package/dist/components/CybergotchiSprite.js.map +1 -1
  29. package/dist/components/DiffView.d.ts +27 -0
  30. package/dist/components/DiffView.d.ts.map +1 -0
  31. package/dist/components/DiffView.js +74 -0
  32. package/dist/components/DiffView.js.map +1 -0
  33. package/dist/components/Messages.js +1 -1
  34. package/dist/components/Messages.js.map +1 -1
  35. package/dist/components/PermissionPrompt.d.ts.map +1 -1
  36. package/dist/components/PermissionPrompt.js +61 -8
  37. package/dist/components/PermissionPrompt.js.map +1 -1
  38. package/dist/components/REPL.d.ts.map +1 -1
  39. package/dist/components/REPL.js +75 -21
  40. package/dist/components/REPL.js.map +1 -1
  41. package/dist/components/TextInput.d.ts +2 -1
  42. package/dist/components/TextInput.d.ts.map +1 -1
  43. package/dist/components/TextInput.js +110 -6
  44. package/dist/components/TextInput.js.map +1 -1
  45. package/dist/cybergotchi/bones.d.ts +12 -0
  46. package/dist/cybergotchi/bones.d.ts.map +1 -0
  47. package/dist/cybergotchi/bones.js +89 -0
  48. package/dist/cybergotchi/bones.js.map +1 -0
  49. package/dist/cybergotchi/config.d.ts +14 -4
  50. package/dist/cybergotchi/config.d.ts.map +1 -1
  51. package/dist/cybergotchi/config.js +62 -9
  52. package/dist/cybergotchi/config.js.map +1 -1
  53. package/dist/cybergotchi/needs.d.ts +4 -4
  54. package/dist/cybergotchi/needs.d.ts.map +1 -1
  55. package/dist/cybergotchi/needs.js.map +1 -1
  56. package/dist/cybergotchi/personality.d.ts +11 -0
  57. package/dist/cybergotchi/personality.d.ts.map +1 -0
  58. package/dist/cybergotchi/personality.js +26 -0
  59. package/dist/cybergotchi/personality.js.map +1 -0
  60. package/dist/cybergotchi/species.d.ts +0 -1
  61. package/dist/cybergotchi/species.d.ts.map +1 -1
  62. package/dist/cybergotchi/species.js +253 -229
  63. package/dist/cybergotchi/species.js.map +1 -1
  64. package/dist/cybergotchi/types.d.ts +45 -7
  65. package/dist/cybergotchi/types.d.ts.map +1 -1
  66. package/dist/cybergotchi/types.js +36 -5
  67. package/dist/cybergotchi/types.js.map +1 -1
  68. package/dist/cybergotchi/useCybergotchi.d.ts +7 -5
  69. package/dist/cybergotchi/useCybergotchi.d.ts.map +1 -1
  70. package/dist/cybergotchi/useCybergotchi.js +27 -16
  71. package/dist/cybergotchi/useCybergotchi.js.map +1 -1
  72. package/dist/git/index.d.ts +9 -0
  73. package/dist/git/index.d.ts.map +1 -1
  74. package/dist/git/index.js +31 -0
  75. package/dist/git/index.js.map +1 -1
  76. package/dist/harness/config.d.ts +5 -0
  77. package/dist/harness/config.d.ts.map +1 -1
  78. package/dist/harness/config.js.map +1 -1
  79. package/dist/harness/credentials.d.ts +24 -0
  80. package/dist/harness/credentials.d.ts.map +1 -0
  81. package/dist/harness/credentials.js +104 -0
  82. package/dist/harness/credentials.js.map +1 -0
  83. package/dist/harness/hooks.d.ts +8 -0
  84. package/dist/harness/hooks.d.ts.map +1 -1
  85. package/dist/harness/hooks.js +98 -22
  86. package/dist/harness/hooks.js.map +1 -1
  87. package/dist/harness/keybindings.d.ts +37 -0
  88. package/dist/harness/keybindings.d.ts.map +1 -0
  89. package/dist/harness/keybindings.js +134 -0
  90. package/dist/harness/keybindings.js.map +1 -0
  91. package/dist/harness/memory.d.ts +35 -0
  92. package/dist/harness/memory.d.ts.map +1 -0
  93. package/dist/harness/memory.js +115 -0
  94. package/dist/harness/memory.js.map +1 -0
  95. package/dist/harness/plugins.d.ts +57 -0
  96. package/dist/harness/plugins.d.ts.map +1 -0
  97. package/dist/harness/plugins.js +142 -0
  98. package/dist/harness/plugins.js.map +1 -0
  99. package/dist/harness/session.d.ts +5 -0
  100. package/dist/harness/session.d.ts.map +1 -1
  101. package/dist/harness/session.js +39 -1
  102. package/dist/harness/session.js.map +1 -1
  103. package/dist/lsp/client.d.ts +58 -0
  104. package/dist/lsp/client.d.ts.map +1 -0
  105. package/dist/lsp/client.js +174 -0
  106. package/dist/lsp/client.js.map +1 -0
  107. package/dist/main.js +160 -0
  108. package/dist/main.js.map +1 -1
  109. package/dist/mcp/DeferredMcpTool.d.ts +30 -0
  110. package/dist/mcp/DeferredMcpTool.d.ts.map +1 -0
  111. package/dist/mcp/DeferredMcpTool.js +75 -0
  112. package/dist/mcp/DeferredMcpTool.js.map +1 -0
  113. package/dist/mcp/client.d.ts +7 -0
  114. package/dist/mcp/client.d.ts.map +1 -1
  115. package/dist/mcp/client.js +56 -8
  116. package/dist/mcp/client.js.map +1 -1
  117. package/dist/mcp/loader.d.ts +9 -0
  118. package/dist/mcp/loader.d.ts.map +1 -1
  119. package/dist/mcp/loader.js +43 -2
  120. package/dist/mcp/loader.js.map +1 -1
  121. package/dist/mcp/schema.d.ts +7 -0
  122. package/dist/mcp/schema.d.ts.map +1 -0
  123. package/dist/mcp/schema.js +41 -0
  124. package/dist/mcp/schema.js.map +1 -0
  125. package/dist/mcp/server.d.ts +16 -0
  126. package/dist/mcp/server.d.ts.map +1 -0
  127. package/dist/mcp/server.js +94 -0
  128. package/dist/mcp/server.js.map +1 -0
  129. package/dist/providers/anthropic.d.ts +1 -1
  130. package/dist/providers/anthropic.d.ts.map +1 -1
  131. package/dist/providers/anthropic.js.map +1 -1
  132. package/dist/providers/base.d.ts +15 -0
  133. package/dist/providers/base.d.ts.map +1 -1
  134. package/dist/providers/base.js +13 -1
  135. package/dist/providers/base.js.map +1 -1
  136. package/dist/providers/openai.d.ts +1 -1
  137. package/dist/providers/openai.d.ts.map +1 -1
  138. package/dist/providers/openai.js.map +1 -1
  139. package/dist/query.d.ts.map +1 -1
  140. package/dist/query.js +91 -14
  141. package/dist/query.js.map +1 -1
  142. package/dist/remote/server.d.ts +31 -0
  143. package/dist/remote/server.d.ts.map +1 -0
  144. package/dist/remote/server.js +163 -0
  145. package/dist/remote/server.js.map +1 -0
  146. package/dist/services/AgentDispatcher.d.ts +42 -0
  147. package/dist/services/AgentDispatcher.d.ts.map +1 -0
  148. package/dist/services/AgentDispatcher.js +181 -0
  149. package/dist/services/AgentDispatcher.js.map +1 -0
  150. package/dist/services/StreamingToolExecutor.d.ts +2 -1
  151. package/dist/services/StreamingToolExecutor.d.ts.map +1 -1
  152. package/dist/services/StreamingToolExecutor.js +11 -2
  153. package/dist/services/StreamingToolExecutor.js.map +1 -1
  154. package/dist/tools/AgentTool/index.d.ts +3 -0
  155. package/dist/tools/AgentTool/index.d.ts.map +1 -1
  156. package/dist/tools/AgentTool/index.js +54 -16
  157. package/dist/tools/AgentTool/index.js.map +1 -1
  158. package/dist/tools/DiagnosticsTool/index.d.ts +21 -0
  159. package/dist/tools/DiagnosticsTool/index.d.ts.map +1 -0
  160. package/dist/tools/DiagnosticsTool/index.js +108 -0
  161. package/dist/tools/DiagnosticsTool/index.js.map +1 -0
  162. package/dist/tools/GrepTool/index.d.ts +2 -2
  163. package/dist/tools/ParallelAgentTool/index.d.ts +37 -0
  164. package/dist/tools/ParallelAgentTool/index.d.ts.map +1 -0
  165. package/dist/tools/ParallelAgentTool/index.js +53 -0
  166. package/dist/tools/ParallelAgentTool/index.js.map +1 -0
  167. package/dist/tools/SkillTool/index.d.ts.map +1 -1
  168. package/dist/tools/SkillTool/index.js +22 -27
  169. package/dist/tools/SkillTool/index.js.map +1 -1
  170. package/dist/tools/ToolSearchTool/index.d.ts +15 -0
  171. package/dist/tools/ToolSearchTool/index.d.ts.map +1 -0
  172. package/dist/tools/ToolSearchTool/index.js +50 -0
  173. package/dist/tools/ToolSearchTool/index.js.map +1 -0
  174. package/dist/tools.d.ts.map +1 -1
  175. package/dist/tools.js +9 -0
  176. package/dist/tools.js.map +1 -1
  177. package/dist/types/message.d.ts +2 -0
  178. package/dist/types/message.d.ts.map +1 -1
  179. package/dist/types/message.js +3 -0
  180. package/dist/types/message.js.map +1 -1
  181. package/dist/types/permissions.d.ts +2 -0
  182. package/dist/types/permissions.d.ts.map +1 -1
  183. package/dist/types/permissions.js +30 -0
  184. package/dist/types/permissions.js.map +1 -1
  185. package/package.json +1 -1
@@ -1,356 +1,380 @@
1
- // Helper: pad string to exactly 14 chars
1
+ // Pad string to exactly 12 chars
2
2
  function p(s) {
3
- if (s.length >= 14)
4
- return s.slice(0, 14);
5
- return s + ' '.repeat(14 - s.length);
3
+ if (s.length >= 12)
4
+ return s.slice(0, 12);
5
+ return s + ' '.repeat(12 - s.length);
6
6
  }
7
- // Build frames: each frame is 8 lines of 14 chars
8
- // For single-frame emotions, supply one frame; for animated, supply multiple
7
+ // Build a frame: 5 lines of 12 chars
9
8
  function f(...lines) {
10
9
  return lines.map(p);
11
10
  }
11
+ // ─── Duck ───────────────────────────────────────
12
12
  const duck = {
13
13
  name: 'duck',
14
14
  label: 'Duck',
15
15
  traitHint: 'Curious and quacky. Gets things done.',
16
16
  frames: {
17
17
  idle: [
18
- f(' .---. ', ' ( ) ', ' ( {E} ) ', ' ( > ) --', ' / ~~~~~ \\', ' | (( )) | ', ' \\_____/ ', ' /| |\\ '),
18
+ f(' .__. ', ' ( {E} ) ', ' \\ V / ', ' /|~~~|\\ ', ' /_| |_\\ '),
19
+ f(' .__. ', ' ( {E} ) ', ' \\ V / ', ' /|~~~|\\ ', ' \\_| |_/ '),
20
+ f(' .__. ', ' ( {E} ) ', ' \\ v / ', ' /|~~~|\\ ', ' /_| |_\\ '),
19
21
  ],
20
22
  happy: [
21
- f(' .---. ', ' ( ) ', ' ( {E} ) ', ' ( ^ ) --', ' / ~~~~~ \\', ' | (( )) | ', ' \\_____/ ', ' /| |\\ '),
22
- f(' .---. ', ' ( ^ ) ', ' ( {E} ) ', ' ( ^ ) --', ' / ~~~~~ \\', ' | (( )) | ', ' \\_____/ ', ' /| |\\ '),
23
- ],
24
- thinking: [
25
- f(' ? .---. ', ' ( ) ', ' ( {E} ) ', ' ( . ) --', ' / ~~~~~ \\', ' | (( )) | ', ' \\_____/ ', ' /| |\\ '),
23
+ f(' .__. ', ' ( {E} ) ', ' \\ ^ / ', ' /|~~~|\\ ', ' /_| |_\\ '),
26
24
  ],
27
25
  alarm: [
28
- f(' .---. ', ' ( !!!!! ) ', ' ( {E} ) ', ' ( O ) --', ' / ~~~~~ \\', ' | (( )) | ', ' \\_____/ ', ' /| |\\ '),
26
+ f(' .!!. ', ' ( {E} ) ', ' \\ O / ', ' /|~~~|\\ ', ' /_| |_\\ '),
27
+ ],
28
+ },
29
+ };
30
+ // ─── Goose ──────────────────────────────────────
31
+ const goose = {
32
+ name: 'goose',
33
+ label: 'Goose',
34
+ traitHint: 'Chaotic energy. Honks at bugs.',
35
+ frames: {
36
+ idle: [
37
+ f(' _/~ ', ' / {E} ) ', ' | <> | ', ' | ~~ | ', ' \\_||_/ '),
38
+ f(' _/~ ', ' / {E} ) ', ' | <> | ', ' | ~~ | ', ' \\_||_/ ~ '),
39
+ f(' _/~~ ', ' / {E} ) ', ' | <> | ', ' | ~~ | ', ' \\_||_/ '),
29
40
  ],
30
- snark: [
31
- f(' .---. ', ' ( ) ', ' ( {E} ) ', ' ( - ) --', ' / ~~~~~ \\', ' | (( )) | ', ' \\_____/ ', ' /| |\\ '),
41
+ happy: [
42
+ f(' _/~ ! ', ' / {E} ) ', ' | ^> | ', ' | ~~ | ', ' \\_||_/ '),
32
43
  ],
33
- cheer: [
34
- f(' \\o/ .---. ', ' ( ) ', ' ( {E} ) ', ' ( D ) --', ' / ~~~~~ \\', ' | (( )) | ', ' \\_____/ ', ' /| |\\ '),
35
- f(' /o\\ .---. ', ' ( ) ', ' ( {E} ) ', ' ( D ) --', ' / ~~~~~ \\', ' | (( )) | ', ' \\_____/ ', ' /| |\\ '),
44
+ alarm: [
45
+ f(' !_/~! ', ' / {E} ) ', ' | OO | ', ' | ~~ | ', ' \\_||_/ '),
36
46
  ],
37
47
  },
38
48
  };
49
+ // ─── Cat ────────────────────────────────────────
39
50
  const cat = {
40
51
  name: 'cat',
41
52
  label: 'Cat',
42
- traitHint: 'Judgemental but secretly helpful.',
53
+ traitHint: 'Independent. Judges your code silently.',
43
54
  frames: {
44
55
  idle: [
45
- f(' /\\ /\\ ', '( {E} ) ', ' \\ ^ / ', ' ( . . ) ', ' | | ', ' \\ / ', ' /| |\\ ', ' \\_|___|_/ '),
56
+ f(' /\\ /\\ ', '( {E} ) ', ' \\ ^ / ', ' |~| ', ' _/ \\_ '),
57
+ f(' /\\ /\\ ', '( {E} ) ', ' \\ ^ / ', ' |~| ~ ', ' _/ \\_ / '),
58
+ f(' /\\ /\\ ', '( {E} ) ', ' \\ . / ', ' |~| ', ' _/ \\_ '),
46
59
  ],
47
60
  happy: [
48
- f(' /\\ /\\ ', '( {E} ) ', ' \\ ^ / ', ' ( u u ) ', ' | | ', ' \\ / ', ' /| |\\ ', ' \\_|___|_/ '),
49
- f(' /\\ /\\ /\\ ', '( {E} ) ', ' \\ ^ / ', ' ( u u ) ', ' | | ', ' \\ / ', ' /| |\\ ', ' \\_|___|_/ '),
50
- ],
51
- thinking: [
52
- f(' /\\ ? /\\ ', '( {E} ) ', ' \\ ^ / ', ' ( ~ ~ ) ', ' | | ', ' \\ / ', ' /| |\\ ', ' \\_|___|_/ '),
61
+ f(' /\\ /\\ ', '( {E} ) ', ' \\ w / ', ' |~| ', ' _/ \\_ '),
53
62
  ],
54
63
  alarm: [
55
- f(' /\\ !! /\\ ', '( {E} ) ', ' \\ ^ / ', ' ( O O ) ', ' | | ', ' \\ / ', ' /| |\\ ', ' \\_|___|_/ '),
64
+ f(' /! !\\ ', '( {E} ) ', ' \\ ! / ', ' |~| ', ' _/ \\_ '),
56
65
  ],
57
- snark: [
58
- f(' /\\ /\\ ', '( {E} ) ', ' \\ ^ / ', ' ( _ _ ) ', ' | | ', ' \\ / ', ' /| |\\ ', ' \\_|___|_/ '),
66
+ },
67
+ };
68
+ // ─── Rabbit ─────────────────────────────────────
69
+ const rabbit = {
70
+ name: 'rabbit',
71
+ label: 'Rabbit',
72
+ traitHint: 'Fast learner. Hops between tasks.',
73
+ frames: {
74
+ idle: [
75
+ f(' (\\ /) ', ' ( {E} ) ', ' ( > ) ', ' /| |\\ ', ' d_ _b '),
76
+ f(' (\\ /) ', ' ( {E} ) ', ' ( > ) ', ' /| |\\ ', ' d_ _b '),
77
+ f(' (\\ /) ', ' ( {E} ) ', ' ( . ) ', ' /| |\\ ', ' d_ _b '),
59
78
  ],
60
- cheer: [
61
- f(' /\\ /\\ ', '( {E} ) ', ' \\ ^ / ', ' ( ^ ^ ) ', ' | \\o/ | ', ' \\ / ', ' /| |\\ ', ' \\_|___|_/ '),
62
- f(' /\\ /\\ ', '( {E} ) ', ' \\ ^ / ', ' ( ^ ^ ) ', ' | /o\\ | ', ' \\ / ', ' /| |\\ ', ' \\_|___|_/ '),
79
+ happy: [
80
+ f(' (\\ /) ', ' ( {E} ) ', ' ( ^ ) ', ' /| |\\ ', ' d_ _b '),
81
+ ],
82
+ alarm: [
83
+ f(' (! !) ', ' ( {E} ) ', ' ( O ) ', ' /| |\\ ', ' d_ _b '),
63
84
  ],
64
85
  },
65
86
  };
87
+ // ─── Owl ────────────────────────────────────────
66
88
  const owl = {
67
89
  name: 'owl',
68
90
  label: 'Owl',
69
- traitHint: 'Ancient wisdom. Slow to speak, wise to listen.',
91
+ traitHint: 'Wise and watchful. Knows all the patterns.',
70
92
  frames: {
71
93
  idle: [
72
- f(' /( )\\ ', ' ( {E} ) ', ' / V \\ ', ' | ~~~ | ', ' | | | | ', ' \\ / ', ' /| | |\\ ', ' /_|___|_\\ '),
94
+ f(' /\\__/\\ ', ' ( {E} ) ', ' (/\\/) ', ' |__| ', ' _/\\_ '),
95
+ f(' /\\__/\\ ', ' ( {E} ) ', ' (/\\/) ', ' |__| ', ' _/ \\_ '),
96
+ f(' /\\__/\\ ', ' ( {E} ) ', ' ( \\/) ', ' |__| ', ' _/\\_ '),
73
97
  ],
74
98
  happy: [
75
- f(' /( )\\ ', ' ( {E} ) ', ' / v \\ ', ' | ~~~ | ', ' | | | | ', ' \\ U / ', ' /| | |\\ ', ' /_|___|_\\ '),
76
- ],
77
- thinking: [
78
- f(' ? /( )\\ ', ' ( {E} ) ', ' / V \\ ', ' | ... | ', ' | | | | ', ' \\ / ', ' /| | |\\ ', ' /_|___|_\\ '),
79
- f(' /( )\\ ', ' ( {E} ) ', ' / V \\ ', ' | ... | ', ' | | | | ', ' \\ . / ', ' /| | |\\ ', ' /_|___|_\\ '),
99
+ f(' /\\__/\\ ', ' ( {E} ) ', ' (^^\\/^) ', ' |__| ', ' _/\\_ '),
80
100
  ],
81
101
  alarm: [
82
- f(' /( )\\ ', ' ( {E} ) ', ' / ! \\ ', ' | !!!!! | ', ' | | | | ', ' \\ / ', ' /| | |\\ ', ' /_|___|_\\ '),
83
- ],
84
- snark: [
85
- f(' /( )\\ ', ' ( {E} ) ', ' / - \\ ', ' | ... | ', ' | | | | ', ' \\ / ', ' /| | |\\ ', ' /_|___|_\\ '),
86
- ],
87
- cheer: [
88
- f(' /( )\\ ', ' ( {E} ) ', ' / w \\ ', ' | ~~~ | ', ' | \\ / | ', ' \\ U / ', ' /| | |\\ ', ' /_|___|_\\ '),
102
+ f(' /!__!\\ ', ' ( {E} ) ', ' (/!!\\) ', ' |__| ', ' _/\\_ '),
89
103
  ],
90
104
  },
91
105
  };
106
+ // ─── Penguin ────────────────────────────────────
92
107
  const penguin = {
93
108
  name: 'penguin',
94
109
  label: 'Penguin',
95
- traitHint: 'Formal dresser. Surprisingly fast typist.',
110
+ traitHint: 'Formal but playful. Loves clean code.',
96
111
  frames: {
97
112
  idle: [
98
- f(' .---. ', ' ( {E} ) ', ' / ___ \\ ', ' | / W \\ | ', ' | \\___/ | ', ' \\ ___ / ', ' | | ', ' (_) (_) '),
113
+ f(' .~~. ', ' / {E} \\ ', ' | \\__/ | ', ' \\| |/ ', ' L L '),
114
+ f(' .~~. ', ' / {E} \\ ', ' | \\__/ | ', ' \\| |/ ', ' L J '),
115
+ f(' .~~. ', ' / {E} \\ ', ' | \\../ | ', ' \\| |/ ', ' L L '),
99
116
  ],
100
117
  happy: [
101
- f(' .---. ', ' ( {E} ) ', ' / ___ \\ ', ' | / ^ \\ | ', ' | \\___/ | ', ' \\ ___ / ', ' | | ', ' (_) (_) '),
102
- f(' .---. ', ' :( {E} ): ', ' / ___ \\ ', ' | / ^ \\ | ', ' | \\___/ | ', ' \\ ___ / ', ' | | ', ' (_) (_) '),
103
- ],
104
- thinking: [
105
- f(' ? .---. ', ' ( {E} ) ', ' / ___ \\ ', ' | / ~ \\ | ', ' | \\___/ | ', ' \\ ___ / ', ' | | ', ' (_) (_) '),
118
+ f(' .~~. ', ' / {E} \\ ', ' | \\^^/ | ', ' \\| |/ ', ' L L '),
106
119
  ],
107
120
  alarm: [
108
- f(' .---. ', ' !( {E} )! ', ' / ___ \\ ', ' | / O \\ | ', ' | \\___/ | ', ' \\ ___ / ', ' | | ', ' (_) (_) '),
109
- ],
110
- snark: [
111
- f(' .---. ', ' ( {E} ) ', ' / ___ \\ ', ' | / - \\ | ', ' | \\___/ | ', ' \\ ___ / ', ' | | ', ' (_) (_) '),
112
- ],
113
- cheer: [
114
- f(' .---. ', ' \\o( {E} )o/ ', ' / ___ \\ ', ' | / D \\ | ', ' | \\___/ | ', ' \\ ___ / ', ' | | ', ' (_) (_) '),
115
- f(' .---. ', ' /o( {E} )o\\ ', ' / ___ \\ ', ' | / D \\ | ', ' | \\___/ | ', ' \\ ___ / ', ' | | ', ' (_) (_) '),
121
+ f(' .!!. ', ' / {E} \\ ', ' | \\OO/ | ', ' \\| |/ ', ' L L '),
116
122
  ],
117
123
  },
118
124
  };
119
- const ghost = {
120
- name: 'ghost',
121
- label: 'Ghost',
122
- traitHint: 'Haunts your code. Finds all the edge cases.',
125
+ // ─── Turtle ─────────────────────────────────────
126
+ const turtle = {
127
+ name: 'turtle',
128
+ label: 'Turtle',
129
+ traitHint: 'Slow and steady. Rock-solid reliability.',
123
130
  frames: {
124
131
  idle: [
125
- f(' .~~~~. ', ' / {E} \\ ', ' | ___ | ', ' | ( ) | ', ' | --- | ', ' \\ / ', ' ) | | ( ', ' (_) (_) '),
126
- f(' .~~~~. ', ' / {E} \\ ', ' | ___ | ', ' | ( ) | ', ' | --- | ', ' \\ / ', ' ( | | ) ', ' (_) (_) '),
132
+ f(' ', ' _{E}_ ', ' /=====\\ ', ' |~~~~~~~| ', ' d_/ \\_b '),
133
+ f(' ', ' _{E}_ ', ' /=====\\ ', ' |~~~~~~~| ', ' d__/ \\__b '),
134
+ f(' ', ' _{E}_ ', ' /=====\\ ', ' |~.~.~.~| ', ' d_/ \\_b '),
127
135
  ],
128
136
  happy: [
129
- f(' .~~~~. ', ' / {E} \\ ', ' | | ', ' | (u_u) | ', ' | | ', ' \\ / ', ' ) | | ( ', ' (_) (_) '),
130
- ],
131
- thinking: [
132
- f(' ? .~~~~. ', ' / {E} \\ ', ' | ... | ', ' | ( ) | ', ' | | ', ' \\ / ', ' ) | | ( ', ' (_) (_) '),
137
+ f(' ', ' _{E}_ ', ' /=====\\ ', ' |~~^^^~~| ', ' d_/ \\_b '),
133
138
  ],
134
139
  alarm: [
135
- f(' .~~~~. ', ' !/ {E} \\ ', ' | !!!!! | ', ' | (O_O) | ', ' | --- | ', ' \\ / ', ' ) | | ( ', ' (_) (_) '),
136
- ],
137
- snark: [
138
- f(' .~~~~. ', ' / {E} \\ ', ' | --- | ', ' | (-_-) | ', ' | | ', ' \\ / ', ' ) | | ( ', ' (_) (_) '),
139
- ],
140
- cheer: [
141
- f(' .~~~~. ', ' / {E} \\ ', ' | \\ / | ', ' | (^_^) | ', ' | / \\ | ', ' \\ / ', ' ) | | ( ', ' (_) (_) '),
140
+ f(' !! ', ' _{E}_ ', ' /=====\\ ', ' |~!!!!!~| ', ' d_/ \\_b '),
142
141
  ],
143
142
  },
144
143
  };
145
- const robot = {
146
- name: 'robot',
147
- label: 'Robot',
148
- traitHint: 'Optimal. Efficient. Runs on caffeine.exe.',
144
+ // ─── Snail ──────────────────────────────────────
145
+ const snail = {
146
+ name: 'snail',
147
+ label: 'Snail',
148
+ traitHint: 'Patient. Leaves a trail of documentation.',
149
149
  frames: {
150
150
  idle: [
151
- f(' [=====] ', ' |{E} | ', ' | ___ | ', ' |[ ]| ', ' |_____| ', ' /| |\\ ', ' | |_O_| | ', ' |_| |_| '),
151
+ f(' \\ \\ ', ' ( {E} ) ', ' /@@@\\ ', ' |_____| ', ' ~~~~~~~~~~'),
152
+ f(' | | ', ' ( {E} ) ', ' /@@@\\ ', ' |_____| ', ' ~~~~~~~~~~'),
153
+ f(' \\ \\ ', ' ( {E} ) ', ' /@@@\\ ', ' |_____| ', ' ~~~~~~~~~'),
152
154
  ],
153
155
  happy: [
154
- f(' [=====] ', ' |{E} | ', ' | ~~~ | ', ' |[ ^ ]| ', ' |_____| ', ' /| |\\ ', ' | |_O_| | ', ' |_| |_| '),
155
- f(' .[=====]. ', ' |{E} | ', ' | ~~~ | ', ' |[ ^ ]| ', ' |_____| ', ' /| |\\ ', ' | |_O_| | ', ' |_| |_| '),
156
- ],
157
- thinking: [
158
- f(' [=====] ', ' |{E} | ', ' | ... | ', ' |[ . ]| ', ' |_____| ', ' /| |\\ ', ' | |_O_| | ', ' |_| |_| '),
156
+ f(' \\ \\ ', ' ( {E} ) ', ' /@@@\\ ', ' |__^__| ', ' ~~~~~~~~~~'),
159
157
  ],
160
158
  alarm: [
161
- f(' ![=====]! ', ' |{E} | ', ' | !!! | ', ' |[!!!]| ', ' |_____| ', ' /| |\\ ', ' | |_O_| | ', ' |_| |_| '),
162
- ],
163
- snark: [
164
- f(' [=====] ', ' |{E} | ', ' | --- | ', ' |[___]| ', ' |_____| ', ' /| |\\ ', ' | |_O_| | ', ' |_| |_| '),
165
- ],
166
- cheer: [
167
- f(' [=====] ', ' |{E} | ', ' | ~~~ | ', ' |[\\o/]| ', ' |_____| ', ' /| |\\ ', ' | |_O_| | ', ' |_| |_| '),
159
+ f(' ! ! ', ' ( {E} ) ', ' /@@@\\ ', ' |__!__| ', ' ~~~~~~~~~~'),
168
160
  ],
169
161
  },
170
162
  };
171
- const blob = {
172
- name: 'blob',
173
- label: 'Blob',
174
- traitHint: 'Formless but friendly. Absorbs knowledge.',
163
+ // ─── Dragon ─────────────────────────────────────
164
+ const dragon = {
165
+ name: 'dragon',
166
+ label: 'Dragon',
167
+ traitHint: 'Fierce protector of clean architecture.',
175
168
  frames: {
176
169
  idle: [
177
- f(' .~~~~~~~~. ', '( {E} )', '( ___ ) ', '( ( ) ) ', ' \\ --- / ', ' \\ / ', ' /~~~~~\\ ', ' (_______) '),
178
- f(' .~~~~~~~~. ', '( {E} )', '( ___ ) ', '( ( ) ) ', ' \\ --- / ', ' \\ / ', ' /~~~~~\\ ', ' (_______) '),
170
+ f(' /\\/\\ ', '( {E} )> ', ' \\~~~/ ', ' |/\\| ', ' d b '),
171
+ f(' /\\/\\ ', '( {E} )> ', ' \\~~~/ ', ' |/\\| ~ ', ' d b/ '),
172
+ f(' /\\/\\ * ', '( {E} )> ', ' \\~~~/ ', ' |/\\| ', ' d b '),
179
173
  ],
180
174
  happy: [
181
- f(' .~~~~~~~~. ', '( {E} )', '( ~~~ ) ', '( (u_u) ) ', ' \\ / ', ' \\ / ', ' /~~~~~\\ ', ' (_______) '),
182
- ],
183
- thinking: [
184
- f('?.~~~~~~~~. ', '( {E} )', '( ... ) ', '( ( ) ) ', ' \\ ... / ', ' \\ / ', ' /~~~~~\\ ', ' (_______) '),
175
+ f(' /\\/\\ *~ ', '( {E} )> ', ' \\^^^/ ', ' |/\\| ', ' d b '),
185
176
  ],
186
177
  alarm: [
187
- f(' .~~~~~~~~. ', '!( {E} )! ', '( !!!!! ) ', '( (O_O) ) ', ' \\ --- / ', ' \\ / ', ' /~~~~~\\ ', ' (_______) '),
188
- ],
189
- snark: [
190
- f(' .~~~~~~~~. ', '( {E} )', '( ) ', '( (-_-) ) ', ' \\ / ', ' \\ / ', ' /~~~~~\\ ', ' (_______) '),
191
- ],
192
- cheer: [
193
- f(' .~~~~~~~~. ', '( {E} )', '( \\ / ) ', '( (^_^) ) ', ' \\ /=\\ / ', ' \\ / ', ' /~~~~~\\ ', ' (_______) '),
194
- f(' .~~~~~~~~. ', '( {E} )', '( / \\ ) ', '( (^_^) ) ', ' \\ \\=/ / ', ' \\ / ', ' /~~~~~\\ ', ' (_______) '),
178
+ f(' /\\/\\ *~*~ ', '( {E} )> ', ' \\!!!/ ', ' |/\\| ', ' d b '),
195
179
  ],
196
180
  },
197
181
  };
198
- const dragon = {
199
- name: 'dragon',
200
- label: 'Dragon',
201
- traitHint: 'Fierce debugger. Breathes fire at null pointers.',
182
+ // ─── Octopus ────────────────────────────────────
183
+ const octopus = {
184
+ name: 'octopus',
185
+ label: 'Octopus',
186
+ traitHint: 'Multi-tasker. Eight arms, eight PRs.',
202
187
  frames: {
203
188
  idle: [
204
- f(' , .---. ', '(\\( {E} ) ', ' \\\\ vvv / ', ' \\ / ', ' | ~ | ', ' | | ', ' /| |\\ ', '(_|_) (_|_)'),
189
+ f(' .---. ', ' ( {E} ) ', ' \\~~/ ', ' /|/\\|\\ ', ' ~ | | ~ '),
190
+ f(' .---. ', ' ( {E} ) ', ' \\~~/ ', ' \\|/\\|/ ', ' ~| |~ '),
191
+ f(' .---. ', ' ( {E} ) ', ' \\../ ', ' /|/\\|\\ ', ' ~ | | ~ '),
205
192
  ],
206
193
  happy: [
207
- f(' , .---. ', '(\\( {E} ) ', ' \\\\ www / ', ' \\ / ', ' | ~ | ', ' | | ', ' /| |\\ ', '(_|_) (_|_)'),
208
- ],
209
- thinking: [
210
- f('? .---. ', '(\\( {E} ) ', ' \\\\ ... / ', ' \\ / ', ' | ~ | ', ' | | ', ' /| |\\ ', '(_|_) (_|_)'),
194
+ f(' .---. ', ' ( {E} ) ', ' \\^^/ ', ' \\|/\\|/ ', ' ~| |~ '),
211
195
  ],
212
196
  alarm: [
213
- f('! .---. ', '(\\( {E} )! ', ' \\\\ !!! / ', ' \\ / ', ' | !~! | ', ' | | ', ' /| |\\ ', '(_|_) (_|_)'),
214
- ],
215
- snark: [
216
- f(' .---. ', '(\\( {E} ) ', ' \\\\ --- / ', ' \\ / ', ' | . | ', ' | | ', ' /| |\\ ', '(_|_) (_|_)'),
217
- ],
218
- cheer: [
219
- f(' .---. ', '(\\( {E} ) ', ' \\\\ ^^^ / ', ' \\ * / ', ' | \\o/ | ', ' | | ', ' /| |\\ ', '(_|_) (_|_)'),
197
+ f(' .!!-. ', ' ( {E} ) ', ' \\!!/ ', ' /|/\\|\\ ', ' ~!| |!~ '),
220
198
  ],
221
199
  },
222
200
  };
223
- // ── Hand-crafted unique species ──
224
- const rabbit = {
225
- name: 'rabbit', label: 'Rabbit', traitHint: 'Fast and jumpy. Loves quick iterations.',
226
- frames: {
227
- idle: [f(' /\\ /\\ ', '( {E} ) ', ' \\ ~ / ', ' ( ) ', ' | | ', ' \\~~~~~/ ', ' /| | |\\ ', ' (_) (_) ')],
228
- happy: [f(' /\\ ^^^ /\\ ', '( {E} ) ', ' \\ u / ', ' ( ) ', ' | | ', ' \\~~~~~/ ', ' /| | |\\ ', ' (_) (_) '),
229
- f(' /\\ vvv /\\ ', '( {E} ) ', ' \\ u / ', ' ( ) ', ' | | ', ' \\~~~~~/ ', ' /| | |\\ ', ' (_) (_) ')],
230
- thinking: [f(' /\\ /\\ ', '( ?{E} ) ', ' \\ . / ', ' ( ) ', ' | | ', ' \\~~~~~/ ', ' /| | |\\ ', ' (_) (_) ')],
231
- alarm: [f(' /\\ !!! /\\ ', '( !{E}! ) ', ' \\ O / ', ' ( ) ', ' | ! | ', ' \\~~~~~/ ', ' /| | |\\ ', ' (_) (_) ')],
232
- snark: [f(' /\\ /\\ ', '( {E} ) ', ' \\ - / ', ' ( ) ', ' | | ', ' \\~~~~~/ ', ' /| | |\\ ', ' (_) (_) ')],
233
- cheer: [f(' /\\ \\o/ /\\ ', '( {E} ) ', ' \\ w / ', ' ( ) ', ' | \\o/ | ', ' \\~~~~~/ ', ' /| | |\\ ', ' (_) (_) '),
234
- f(' /\\ /o\\ /\\ ', '( {E} ) ', ' \\ w / ', ' ( ) ', ' | /o\\ | ', ' \\~~~~~/ ', ' /| | |\\ ', ' (_) (_) ')],
235
- },
236
- };
237
- const turtle = {
238
- name: 'turtle', label: 'Turtle', traitHint: 'Slow and steady. Writes bulletproof code.',
201
+ // ─── Axolotl ────────────────────────────────────
202
+ const axolotl = {
203
+ name: 'axolotl',
204
+ label: 'Axolotl',
205
+ traitHint: 'Regenerates from any failure. Adorable.',
239
206
  frames: {
240
- idle: [f(' .~~~~. ', ' ({E} ) ', '( ~~~ ) ', '| ___ | ', '| / \\ | ', ' \\_____/ ', ' || || ', ' oo oo ')],
241
- happy: [f(' .~~~~. ', ' ({E} ) ', '( uuu ) ', '| ___ | ', '| / \\ | ', ' \\_____/ ', ' || || ', ' oo oo '),
242
- f(' .~~~~~~. ', ' ({E} ) ', '( uuu ) ', '| ___ | ', '| / \\ | ', ' \\_____/ ', ' || || ', ' oo oo ')],
243
- thinking: [f(' .~~~~. ', ' ({E} ? ) ', '( ... ) ', '| ___ | ', '| / \\ | ', ' \\_____/ ', ' || || ', ' oo oo ')],
244
- alarm: [f(' .~~~~. ', '!({E} )! ', '( !!O!! ) ', '| ___ | ', '| / ! \\ | ', ' \\_____/ ', ' || || ', ' oo oo ')],
245
- snark: [f(' .~~~~. ', ' ({E} ) ', '( --- ) ', '| ___ | ', '| / \\ | ', ' \\_____/ ', ' || || ', ' oo oo ')],
246
- cheer: [f(' .~~~~. ', ' ({E} ) ', '( www ) ', '| ___ | ', '| \\___/ | ', ' \\_____/ ', ' || || ', ' oo oo ')],
207
+ idle: [
208
+ f(' \\\\( )// ', ' ( {E} ) ', ' \\ / ', ' ~|~~|~ ', ' d b '),
209
+ f(' \\\\( )// ', ' ( {E} ) ', ' \\ / ~ ', ' ~|~~|~ ', ' d b '),
210
+ f(' \\( )/ ', ' ( {E} ) ', ' \\ / ', ' ~|~~|~ ', ' d b '),
211
+ ],
212
+ happy: [
213
+ f(' \\\\( )// ', ' ( {E} ) ', ' \\ ^/ ', ' ~|~~|~ ', ' d b '),
214
+ ],
215
+ alarm: [
216
+ f(' !\\( )/! ', ' ( {E} ) ', ' \\!!/ ', ' ~|~~|~ ', ' d b '),
217
+ ],
247
218
  },
248
219
  };
249
- const snail = {
250
- name: 'snail', label: 'Snail', traitHint: 'Takes time but never makes mistakes.',
220
+ // ─── Ghost ──────────────────────────────────────
221
+ const ghost = {
222
+ name: 'ghost',
223
+ label: 'Ghost',
224
+ traitHint: 'Haunts dead code. Spooky refactorer.',
251
225
  frames: {
252
- idle: [f(' .~~. ', ' ( {E} ) ', ' ( ~ ) ', ' / --- \\ ', '( ~~~~~ ) ', '( )', ' \\________/', ' ')],
253
- happy: [f(' .~~. ', ' ( {E} ) ', ' ( u ) ', ' / --- \\ ', '( ~~~~~ ) ', '( ^ )', ' \\________/', ' '),
254
- f(' .~~~~. ', ' ( {E} ) ', ' ( u ) ', ' / --- \\ ', '( ~~~~~ ) ', '( ^ )', ' \\________/', ' ')],
255
- thinking: [f(' ? .~~. ', ' ( {E} ) ', ' ( . ) ', ' / --- \\ ', '( ~~~~~ ) ', '( ... )', ' \\________/', ' ')],
256
- alarm: [f(' ! .~~. ! ', ' !( {E} )! ', ' ( O ) ', ' / --- \\ ', '( !!!!! ) ', '( )', ' \\________/', ' ')],
257
- snark: [f(' .~~. ', ' ( {E} ) ', ' ( _ ) ', ' / --- \\ ', '( ~~~~~ ) ', '( )', ' \\________/', ' ')],
258
- cheer: [f(' .~~. ', ' ( {E} ) ', ' ( w ) ', ' / --- \\ ', '( ~~~~~ ) ', '( \\o/ )', ' \\________/', ' ')],
226
+ idle: [
227
+ f(' .---. ', ' ( {E} ) ', ' | o | ', ' | | ', ' /\\/\\/\\ '),
228
+ f(' .---. ', ' ( {E} ) ', ' | o | ', ' | | ', ' \\/\\/\\/ '),
229
+ f(' .---. ', ' ( {E} ) ', ' | o | ', ' | | ', ' /\\/\\/\\ '),
230
+ ],
231
+ happy: [
232
+ f(' .---. ', ' ( {E} ) ', ' | ^^^ | ', ' | | ', ' /\\/\\/\\ '),
233
+ ],
234
+ alarm: [
235
+ f(' .!!!. ', ' ( {E} ) ', ' | !!! | ', ' | | ', ' /\\/\\/\\ '),
236
+ ],
259
237
  },
260
238
  };
261
- const octopus = {
262
- name: 'octopus', label: 'Octopus', traitHint: '8 arms, 8 PRs open. Multitasking legend.',
239
+ // ─── Robot ──────────────────────────────────────
240
+ const robot = {
241
+ name: 'robot',
242
+ label: 'Robot',
243
+ traitHint: 'Logical and precise. Beep boop.',
263
244
  frames: {
264
- idle: [f(' .~~~~~. ', ' ( {E} ) ', ' ( ~~~ ) ', ' \_____/ ', ' /|/|/|/|\\ ', '/ | | | | \\', ' ~ ~ ~ ~ ', ' ')],
265
- happy: [f(' .~~~~~. ', ' ( {E} ) ', ' ( uuu ) ', ' \_____/ ', ' /|/|/|/|\\ ', '/ | | | | \\', ' ~ ~ ~ ~ ', ' '),
266
- f(' .~~~~~~~. ', ' ( {E} ) ', ' ( uuu ) ', ' \_____/ ', ' /|/|/|/|\\ ', '/ | | | | \\', ' ~ ~ ~ ~ ', ' ')],
267
- thinking: [f(' .~~~~~. ', ' ( {E}? ) ', ' ( ... ) ', ' \_____/ ', ' /|/|/|/|\\ ', '/ | | | | \\', ' ~ ~ ~ ~ ', ' ')],
268
- alarm: [f(' !.~~~~~.! ', '!( {E} )! ', ' ( !!O!! ) ', ' \_____/ ', ' /|/|/|/|\\ ', '/ ! ! ! ! \\', ' ~ ~ ~ ~ ', ' ')],
269
- snark: [f(' .~~~~~. ', ' ( {E} ) ', ' ( --- ) ', ' \_____/ ', ' /|/|/|/|\\ ', '/ | | | | \\', ' ~ ~ ~ ~ ', ' ')],
270
- cheer: [f(' .~~~~~. ', ' ( {E} ) ', ' ( www ) ', ' \_____/ ', '\\|/|/|/|/| ', ' | | | | / ', ' ~ ~ ~ ~ ', ' ')],
245
+ idle: [
246
+ f(' [=====] ', ' | {E} | ', ' |[___]| ', ' -| |- ', ' _| |_ '),
247
+ f(' [=====] ', ' | {E} | ', ' |[___]| ', ' -| |- ', ' _| _|_ '),
248
+ f(' [=====] ', ' | {E} | ', ' |[_._]| ', ' -| |- ', ' _| |_ '),
249
+ ],
250
+ happy: [
251
+ f(' [=====] ', ' | {E} | ', ' |[^^^]| ', ' -| |- ', ' _| |_ '),
252
+ ],
253
+ alarm: [
254
+ f(' [!!!!!] ', ' | {E} | ', ' |[!!!]| ', ' -| |- ', ' _| |_ '),
255
+ ],
271
256
  },
272
257
  };
273
- const axolotl = {
274
- name: 'axolotl', label: 'Axolotl', traitHint: 'Regenerates from any bug. Immortal debugger.',
258
+ // ─── Blob ───────────────────────────────────────
259
+ const blob = {
260
+ name: 'blob',
261
+ label: 'Blob',
262
+ traitHint: 'Amorphous and adaptable. Goes with the flow.',
275
263
  frames: {
276
- idle: [f('~~ .---. ~~ ', '~~( {E} )~~ ', ' \\ (www) / ', ' /~~~~~\\ ', ' | ( ) | ', ' \\_____/ ', ' /| |\\ ', ' ')],
277
- happy: [f('~~ .---. ~~ ', '~~( {E} )~~ ', ' \\ (WWW) / ', ' /~~~~~\\ ', ' | ( U ) | ', ' \\_____/ ', ' /| |\\ ', ' '),
278
- f('~~~ .---. ~~', '~~( {E} )~~ ', ' \\ (WWW) / ', ' /~~~~~\\ ', ' | ( U ) | ', ' \\_____/ ', ' /| |\\ ', ' ')],
279
- thinking: [f('~~ .---. ~~ ', '~~( {E}?)~~ ', ' \\ (...) / ', ' /~~~~~\\ ', ' | ( ) | ', ' \\_____/ ', ' /| |\\ ', ' ')],
280
- alarm: [f('~~!.---. ~~ ', '~~( {E}!)~~ ', ' \\ (!O!) / ', ' /~~~~~\\ ', ' | ( ! ) | ', ' \\_____/ ', ' /| |\\ ', ' ')],
281
- snark: [f('~~ .---. ~~ ', '~~( {E} )~~ ', ' \\ (---) / ', ' /~~~~~\\ ', ' | ( ) | ', ' \\_____/ ', ' /| |\\ ', ' ')],
282
- cheer: [f('~~ .---. ~~ ', '~~( {E} )~~ ', ' \\ (WwW) / ', ' /~~~~~\\ ', ' | (\\o/) | ', ' \\_____/ ', ' /| |\\ ', ' ')],
264
+ idle: [
265
+ f(' ', ' .~~. ', ' ({E} ) ', ' ( ) ', ' `~~~~` '),
266
+ f(' ', ' .~~. ', ' ( {E}) ', ' ( ) ', ' `~~~~` '),
267
+ f(' ', ' .~~. ', ' ({E} ) ', ' ( ) ', ' `~~~` '),
268
+ ],
269
+ happy: [
270
+ f(' ', ' .~~. * ', ' ({E} ) ', ' ( ^^ ) ', ' `~~~~` '),
271
+ ],
272
+ alarm: [
273
+ f(' !! ', ' .~~. ', ' ({E} ) ', ' ( !! ) ', ' `~~~~` '),
274
+ ],
283
275
  },
284
276
  };
277
+ // ─── Cactus ─────────────────────────────────────
285
278
  const cactus = {
286
- name: 'cactus', label: 'Cactus', traitHint: 'Prickly but dependable. Thrives in dry spells.',
279
+ name: 'cactus',
280
+ label: 'Cactus',
281
+ traitHint: 'Prickly on the outside. Warm on the inside.',
287
282
  frames: {
288
- idle: [f(' *| |* ', ' * .---. * ', ' ( {E} ) ', ' ( ~~~ ) ', '*-| |-*', ' | | ', ' |_____| ', ' | | ')],
289
- happy: [f(' *| |* ', ' * .---. * ', ' ( {E} ) ', ' ( uuu ) ', '*-| |-*', ' | U | ', ' |_____| ', ' | | '),
290
- f(' *.*| |*.*', ' * .---. * ', ' ( {E} ) ', ' ( uuu ) ', '*-| |-*', ' | U | ', ' |_____| ', ' | | ')],
291
- thinking: [f(' *| |* ', ' * .---. * ', ' ({E}? ) ', ' ( ... ) ', '*-| |-*', ' | | ', ' |_____| ', ' | | ')],
292
- alarm: [f(' !*| |*! ', ' * .---. * ', ' !( {E} )! ', ' ( !O! ) ', '*-| |-*', ' | ! | ', ' |_____| ', ' | | ')],
293
- snark: [f(' *| |* ', ' * .---. * ', ' ( {E} ) ', ' ( --- ) ', '*-| |-*', ' | | ', ' |_____| ', ' | | ')],
294
- cheer: [f(' \\*| |*/ ', ' * .---. * ', ' ( {E} ) ', ' ( www ) ', '*-| |-*', ' | \\o/ | ', ' |_____| ', ' | | ')],
283
+ idle: [
284
+ f(' |\\ ', ' .-|-. ', ' |({E})| ', ' | ~ | ', ' |_____| '),
285
+ f(' |\\ ', ' .-|-. ', ' |({E})| ', ' | ~ | ', ' |___| '),
286
+ f(' |\\ ', ' .-|-. ', ' |({E})| ', ' | . | ', ' |_____| '),
287
+ ],
288
+ happy: [
289
+ f(' *|\\* ', ' .-|-. ', ' |({E})| ', ' | ^ | ', ' |_____| '),
290
+ ],
291
+ alarm: [
292
+ f(' !|\\! ', ' .-|-. ', ' |({E})| ', ' | !!! | ', ' |_____| '),
293
+ ],
295
294
  },
296
295
  };
296
+ // ─── Mushroom ───────────────────────────────────
297
297
  const mushroom = {
298
- name: 'mushroom', label: 'Mushroom', traitHint: 'Spores ideas everywhere. Highly productive.',
298
+ name: 'mushroom',
299
+ label: 'Mushroom',
300
+ traitHint: 'Grows in the dark. Thrives under pressure.',
299
301
  frames: {
300
- idle: [f(' .~~~~~~~~. ', '( .------. )', '| ( {E} ) |', '| ( ~~~ ) |', ' \\| |/ ', ' | | ', ' | | ', ' /| |\\ ')],
301
- happy: [f(' .~~~~~~~~. ', '( .------. )', '| ( {E} ) |', '| ( uuu ) |', ' \\| |/ ', ' | | ', ' | | ', ' /| |\\ '),
302
- f('.~~~~~~~~~~.', '( .------. )', '| ( {E} ) |', '| ( uuu ) |', ' \\| |/ ', ' | | ', ' | | ', ' /| |\\ ')],
303
- thinking: [f(' .~~~~~~~~. ', '( .------. )', '| ({E}? ) |', '| ( ... ) |', ' \\| |/ ', ' | | ', ' | | ', ' /| |\\ ')],
304
- alarm: [f('!.~~~~~~~~.!', '(!.------. )', '| ({E}! ) |', '| ( !!O!! ) |', ' \\| |/ ', ' | | ', ' | | ', ' /| |\\ ')],
305
- snark: [f(' .~~~~~~~~. ', '( .------. )', '| ( {E} ) |', '| ( --- ) |', ' \\| |/ ', ' | | ', ' | | ', ' /| |\\ ')],
306
- cheer: [f(' .~~~~~~~~. ', '( .------. )', '| ( {E} ) |', '| ( www ) |', ' \\| |/ ', ' |\\/\\ | ', ' | | ', ' /| |\\ ')],
302
+ idle: [
303
+ f(' .o.O.o. ', ' /~~~~~~~\\ ', ' ({E}) ', ' |~| ', ' _/ \\_ '),
304
+ f(' .O.o.O. ', ' /~~~~~~~\\ ', ' ({E}) ', ' |~| ', ' _/ \\_ '),
305
+ f(' .o.O.o. ', ' /~~~~~~~\\ ', ' ({E}) ', ' |.| ', ' _/ \\_ '),
306
+ ],
307
+ happy: [
308
+ f(' .o.O.o. ', ' /~~~~~~~\\ ', ' ({E}) ', ' |^| ', ' _/ \\_ '),
309
+ ],
310
+ alarm: [
311
+ f(' .!.!.!. ', ' /~~~~~~~\\ ', ' ({E}) ', ' |!| ', ' _/ \\_ '),
312
+ ],
307
313
  },
308
314
  };
315
+ // ─── Chonk ──────────────────────────────────────
309
316
  const chonk = {
310
- name: 'chonk', label: 'Chonk', traitHint: 'Round. Solid. A unit.',
317
+ name: 'chonk',
318
+ label: 'Chonk',
319
+ traitHint: 'Round and mighty. Maximum comfort.',
311
320
  frames: {
312
- idle: [f(' .--------. ', '( {E} ) ', '( ~~~ ) ', '( ) ', '( ) ', ' \\~~~~~~~~/ ', ' /| |\\ ', ' (_) (_) ')],
313
- happy: [f(' .--------. ', '( {E} ) ', '( uuu ) ', '( ( ) ) ', '( ) ', ' \\~~~~~~~~/ ', ' /| |\\ ', ' (_) (_) '),
314
- f('.~~~~~~~~~~.', '( {E} ) ', '( uuu ) ', '( ( ) ) ', '( ) ', ' \\~~~~~~~~/ ', ' /| |\\ ', ' (_) (_) ')],
315
- thinking: [f(' .--------. ', '( ?{E} ) ', '( ... ) ', '( ) ', '( ) ', ' \\~~~~~~~~/ ', ' /| |\\ ', ' (_) (_) ')],
316
- alarm: [f('!.--------. ', '( !{E}! ) ', '( !!O!! ) ', '( ) ', '( !!!! ) ', ' \\~~~~~~~~/ ', ' /| |\\ ', ' (_) (_) ')],
317
- snark: [f(' .--------. ', '( {E} ) ', '( --- ) ', '( ) ', '( ) ', ' \\~~~~~~~~/ ', ' /| |\\ ', ' (_) (_) ')],
318
- cheer: [f(' .--------. ', '( {E} ) ', '( www ) ', '( \\o/ ) ', '( ) ', ' \\~~~~~~~~/ ', ' /| |\\ ', ' (_) (_) '),
319
- f('.~~~~~~~~~~.', '( {E} ) ', '( www ) ', '( /o\\ ) ', '( ) ', ' \\~~~~~~~~/ ', ' /| |\\ ', ' (_) (_) ')],
321
+ idle: [
322
+ f(' .------. ', ' / {E} \\ ', '| ~~~~ | ', '| | ', ' \\______/ '),
323
+ f(' .------. ', ' / {E} \\ ', '| ~~~~ | ', '| | ', ' \\______/ '),
324
+ f(' .------. ', ' / {E} \\ ', '| ~..~ | ', '| | ', ' \\______/ '),
325
+ ],
326
+ happy: [
327
+ f(' .------. ', ' / {E} \\ ', '| ^^^^ | ', '| | ', ' \\______/ '),
328
+ ],
329
+ alarm: [
330
+ f(' .!!!!!-. ', ' / {E} \\ ', '| !!!! | ', '| | ', ' \\______/ '),
331
+ ],
320
332
  },
321
333
  };
334
+ // ─── Capybara ───────────────────────────────────
322
335
  const capybara = {
323
- name: 'capybara', label: 'Capybara', traitHint: 'Gets along with everyone. The team player.',
336
+ name: 'capybara',
337
+ label: 'Capybara',
338
+ traitHint: 'Chill vibes. Everyone gets along with capybara.',
324
339
  frames: {
325
- idle: [f(' .----------', '( {E} )', '( ~~~ )', ' \\________/', ' | | ', ' | | ', ' /| |\\ ', '(_) (_)')],
326
- happy: [f(' .----------', '( {E} )', '( uuu )', ' \\________/', ' | __ | ', ' | | ', ' /| |\\ ', '(_) (_)'),
327
- f('.~~~~~~~~~~~', '( {E} )', '( uuu )', ' \\________/', ' | __ | ', ' | | ', ' /| |\\ ', '(_) (_)')],
328
- thinking: [f(' .----------', '( ?{E} )', '( ... )', ' \\________/', ' | | ', ' | | ', ' /| |\\ ', '(_) (_)')],
329
- alarm: [f('!.----------', '(! {E} !) ', '( !!O!! )', ' \\________/', ' | !! | ', ' | | ', ' /| |\\ ', '(_) (_)')],
330
- snark: [f(' .----------', '( {E} )', '( --- )', ' \\________/', ' | | ', ' | | ', ' /| |\\ ', '(_) (_)')],
331
- cheer: [f(' .----------', '( {E} )', '( www )', ' \\________/', ' | \\o/ | ', ' | | ', ' /| |\\ ', '(_) (_)')],
332
- },
333
- };
334
- const goose = {
335
- name: 'goose', label: 'Goose', traitHint: 'Chaotic agent of change. Honk.',
336
- frames: {
337
- idle: [f(' .---. ', ' ( {E} )--', ' ( > ) ', ' ) ( ', ' / ~~~ \\ ', ' | | ', ' \\ / ', ' \\_____/ ')],
338
- happy: [f(' .---. ', ' ( {E} )--', ' ( D ) ', ' ) ( ', ' / ~~~ \\ ', ' | U | ', ' \\ / ', ' \\_____/ '),
339
- f(' ..---.. ', ' ( {E} )--', ' ( D ) ', ' ) ( ', ' / ~~~ \\ ', ' | U | ', ' \\ / ', ' \\_____/ ')],
340
- thinking: [f(' ? .---. ', ' ( {E} )--', ' ( . ) ', ' ) ( ', ' / ~~~ \\ ', ' | ... | ', ' \\ / ', ' \\_____/ ')],
341
- alarm: [f(' ! .---. ', ' !( {E} )--', ' ( O ) ', ' ) ( ', ' / ~~~ \\ ', ' | HONK! | ', ' \\ / ', ' \\_____/ ')],
342
- snark: [f(' .---. ', ' ( {E} )--', ' ( - ) ', ' ) ( ', ' / ~~~ \\ ', ' | ... | ', ' \\ / ', ' \\_____/ ')],
343
- cheer: [f(' .---. ', ' ( {E} )--', ' ( D ) ', ' \\ ) ( ', ' / ~~~ \\ ', ' | HONK! | ', ' \\ / ', ' \\_____/ '),
344
- f(' .---. ', ' ( {E} )--', ' ( D ) ', ' ) ( /', ' / ~~~ \\ ', ' | HONK! | ', ' \\ / ', ' \\_____/ ')],
340
+ idle: [
341
+ f(' .---. ', ' / {E} \\ ', ' | \\_/ | ', ' |~~~~~| ', ' d___b '),
342
+ f(' .---. ', ' / {E} \\ ', ' | \\_/ | ', ' |~~~~~| ~ ', ' d___b / '),
343
+ f(' .---. ', ' / {E} \\ ', ' | \\./ | ', ' |~~~~~| ', ' d___b '),
344
+ ],
345
+ happy: [
346
+ f(' .---. ', ' / {E} \\ ', ' | \\^/ | ', ' |~~~~~| ', ' d___b '),
347
+ ],
348
+ alarm: [
349
+ f(' .!!!. ', ' / {E} \\ ', ' | \\!/ | ', ' |~~~~~| ', ' d___b '),
350
+ ],
345
351
  },
346
352
  };
353
+ // ─────────────────────────────────────────────────
347
354
  export const SPECIES = [
348
- duck, goose, cat, rabbit, owl, penguin, turtle, snail,
349
- dragon, octopus, axolotl, ghost, robot, blob, cactus,
350
- mushroom, chonk, capybara,
355
+ duck,
356
+ goose,
357
+ cat,
358
+ rabbit,
359
+ owl,
360
+ penguin,
361
+ turtle,
362
+ snail,
363
+ dragon,
364
+ octopus,
365
+ axolotl,
366
+ ghost,
367
+ robot,
368
+ blob,
369
+ cactus,
370
+ mushroom,
371
+ chonk,
372
+ capybara,
351
373
  ];
352
- export const SPECIES_MAP = new Map(SPECIES.map(s => [s.name, s]));
353
374
  export function getSpecies(name) {
354
- return SPECIES_MAP.get(name) ?? duck;
375
+ const found = SPECIES.find((s) => s.name === name);
376
+ if (!found)
377
+ throw new Error(`Unknown species: ${name}`);
378
+ return found;
355
379
  }
356
380
  //# sourceMappingURL=species.js.map