pi-character 0.0.0-stage → 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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dominic Fezzie
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,240 @@
1
- # Temporary Holding Version
1
+ # pi-character
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Animated ASCII companions for your Pi terminal. Pick a bundled character or generate your own.
4
+
5
+ ![Pi character demo: Cray at startup, live character previews, and a saved character in pink.](https://github.com/dfezzie/pi-character/raw/refs/heads/main/docs/media/demo.gif)
6
+
7
+ Captured from a real Pi session: startup, live previews, saving a selection, and changing its color.
8
+ The terminal view is cropped to the character and controls. No model tokens were used.
9
+
10
+ Characters play locally, with no model calls or token usage at startup. Requires **Pi 1.4.0+**;
11
+ no custom Pi build or additional runtime dependencies are needed.
12
+
13
+ ## Quick start
14
+
15
+ Install from a local checkout using its absolute path:
16
+
17
+ ```sh
18
+ pi install /path/to/pi-character
19
+ ```
20
+
21
+ Restart Pi or run `/reload`. **Cray the Crawfish** appears alongside Pi's original startup header.
22
+
23
+ Open the character menu:
24
+
25
+ ```text
26
+ /character
27
+ ```
28
+
29
+ Choose **Choose character**, then use **↑ / ↓** to preview the animations. Press **Enter** to save
30
+ your choice, or **Escape** to return to your previous character.
31
+
32
+ The package is not published to npm yet. Once published, installation will be
33
+ `pi install npm:pi-character`.
34
+
35
+ ## Meet the characters
36
+
37
+ Five characters are included and ready to use:
38
+
39
+ - **Cray the Crawfish** — the default welcome character.
40
+ - **Dozy the Fox Wizard** — a sleepy fox in a wizard hat.
41
+ - **Arlo the Armadillo** — an armored companion with a tail wag.
42
+ - **Ori the Oriole** — a little bird perched on a twig.
43
+ - **Fern the Fox** — a woodland fox with a bushy tail.
44
+
45
+ Your selection and color preference are remembered across restarts.
46
+
47
+ ## Everyday controls
48
+
49
+ | Command | What it does |
50
+ | ------------------- | ------------------------------------------------------ |
51
+ | `/character` | Open the menu |
52
+ | `/character select` | Browse bundled and saved characters with live previews |
53
+ | `/character color` | Choose a color |
54
+ | `/character show` | Enable and display your selected character |
55
+ | `/character off` | Hide the character, including on future starts |
56
+
57
+ In the character picker:
58
+
59
+ | Key | What it does |
60
+ | ---------- | -------------------------------------------------------------------- |
61
+ | **↑ / ↓** | Preview the highlighted character |
62
+ | **Enter** | Save your selection |
63
+ | **Escape** | Restore your previous character and visibility |
64
+ | **r** | Generate a new version of the highlighted character; **uses tokens** |
65
+ | **d** | Delete the highlighted character after confirmation |
66
+
67
+ Characters hide while you type or when the terminal is too small. Starting an agent task hides
68
+ the character for the rest of that session; use `/character show` to bring it back. It appears
69
+ again in a new session unless you turned it off.
70
+
71
+ ### Colors
72
+
73
+ By default, the artwork and name follow Pi's theme accent. Use the color menu or set one directly:
74
+
75
+ ```text
76
+ /character color default
77
+ /character color original
78
+ /character color pink
79
+ ```
80
+
81
+ `original` uses the character's own palette color. Fixed colors are `cyan`, `orange`, `green`,
82
+ `pink`, `blue`, and `yellow`. Colors persist across character changes and restarts.
83
+ Setting `NO_COLOR` disables the character's ANSI palette.
84
+
85
+ ## Generate your own
86
+
87
+ **Generation and rerolls use model tokens.** Playing saved or bundled characters is local.
88
+
89
+ Describe a character using Pi's current model and authentication:
90
+
91
+ ```text
92
+ /character generate a tiny moon wearing headphones
93
+ ```
94
+
95
+ Each result is animated for preview before you decide:
96
+
97
+ - **Keep character** saves it to your library and selects it.
98
+ - **Reroll (uses tokens)** generates another attempt.
99
+ - **Cancel** restores your previous character without saving the preview.
100
+
101
+ To stop an in-progress request:
102
+
103
+ ```text
104
+ /character cancel
105
+ ```
106
+
107
+ Cancellation is available during generation and preview. Once the final preferences
108
+ write begins after **Keep character**, saving finishes before character commands
109
+ are available again. If a command arrives during that brief step, Pi asks you to
110
+ retry after the save finishes.
111
+
112
+ You can also press **r** in the picker to reroll an existing character. This reuses its description
113
+ and original generation model when available. The saved version is replaced only after you keep
114
+ a valid result.
115
+
116
+ ### Choose a generation model
117
+
118
+ List models registered in Pi, then select one for a single generation:
119
+
120
+ ```text
121
+ /character models
122
+ /character generate --model provider/model-id a tiny moon wearing headphones
123
+ ```
124
+
125
+ The override applies only to that request; it leaves your Pi session model and global settings
126
+ unchanged. A model's presence in the catalog does not guarantee that your provider account can
127
+ use it.
128
+
129
+ ### What gets sent and saved
130
+
131
+ Generation sends a dedicated character prompt and your description through Pi's model registry.
132
+ It does not send your coding conversation or tools, and the result is not added to conversation
133
+ history. Requests time out after two minutes and are never retried automatically. Failed or
134
+ invalid results leave your existing character usable.
135
+
136
+ Only previews you keep enter your library. Generated artwork is validated JSON data and is never
137
+ executed as code.
138
+
139
+ ## Import and storage
140
+
141
+ Import a character JSON file in the original Codex prototype format or as a bare sprite:
142
+
143
+ ```text
144
+ /character import /path/to/character.json
145
+ ```
146
+
147
+ Characters and preferences live in `~/.pi/agent/characters/`, or in `characters/` under
148
+ `PI_CODING_AGENT_DIR` when set. The directory contains JSON assets with generation metadata and
149
+ `settings.json` for your selection, color, and enabled state.
150
+
151
+ Deleting a character from the picker archives it in `characters/.trash/`. Deleted characters stay
152
+ out of the picker across restarts, including bundled presets.
153
+
154
+ ## Uninstall
155
+
156
+ For an installation from a local checkout:
157
+
158
+ ```sh
159
+ pi remove /path/to/pi-character
160
+ ```
161
+
162
+ Your saved characters and preferences remain. To reset them as well, separately delete the
163
+ characters directory described above.
164
+
165
+ ## Development
166
+
167
+ Use Node **22.19+**. Install development dependencies, then run the checks and offline tests:
168
+
169
+ ```sh
170
+ npm ci --legacy-peer-deps
171
+ npm run build
172
+ ```
173
+
174
+ To load the checkout for a single Pi session before installing it:
175
+
176
+ ```sh
177
+ pi -e /path/to/pi-character
178
+ ```
179
+
180
+ Pass the package directory so Pi reads its manifest and loads only `src/index.ts`. Avoid loading
181
+ the same package through both an installation and `-e`.
182
+
183
+ ### Project layout
184
+
185
+ ```text
186
+ src/
187
+ index.ts Pi lifecycle, widget, menus, and commands
188
+ character.ts Character validation, storage, and frame layout
189
+ generation.ts Model requests, cancellation, and errors
190
+ assets/ Bundled character JSON presets
191
+ test/ Unit tests, fixtures, and terminal smoke harness
192
+ ```
193
+
194
+ Application code lives in `src/`, tests in `test/`, and presets in `assets/`. Tooling configuration
195
+ stays at the package root. Pi loads TypeScript source directly, so no compilation or `dist/`
196
+ directory is needed. Pi supplies its API and terminal UI packages at runtime.
197
+
198
+ ### Code reviews
199
+
200
+ In a repository checkout, ask **review the current changes** (or name a commit range or
201
+ component). [The review workflow](docs/code-review.md) runs three independent Orca reviewers
202
+ for correctness, maintainability, and verification, followed by a separate pragmatic decider.
203
+ Reviews are read-only by default. The decider accepts or rejects suggestions based on evidence,
204
+ readability, maintenance cost, and this package's small scope.
205
+
206
+ ### Checks
207
+
208
+ | Command | What it checks |
209
+ | ----------------------------------------- | ------------------------------------------------------------------------- |
210
+ | `npm run build` | Lint, formatting, types, and offline tests |
211
+ | `npm run check` | Lint, formatting, and types |
212
+ | `npm test` | Offline asset, generation, storage, lifecycle, and terminal-harness tests |
213
+ | `npm run test:smoke` | This checkout in a real Pi PTY with isolated temporary configuration |
214
+ | `npm run lint` / `npm run lint:fix` | ESLint checks / fixes |
215
+ | `npm run format` / `npm run format:check` | Prettier formatting / checks |
216
+ | `npm run typecheck` | TypeScript checks for source, tests, and tooling |
217
+
218
+ Run `node test/smoke.ts` to check the local package already installed in Pi. Add
219
+ `--generate --model provider/model-id` to spend tokens on one generation; this copies provider
220
+ credentials into temporary state, which is removed after the run. Add `--output /path/to/evidence`
221
+ to save terminal snapshots and generated assets.
222
+
223
+ The terminal harness uses `node-pty` and `@xterm/headless` and has been verified on macOS. Platforms
224
+ without a compatible prebuilt PTY binary require native build tools to install `node-pty`.
225
+
226
+ ### Presets and packaging
227
+
228
+ To ship a preset, add its reviewed JSON to `assets/` and the startup preset list in `src/index.ts`.
229
+ Personal generations live outside the repository. Local `generated/` exports and `validation/`
230
+ test artifacts are gitignored.
231
+
232
+ Assets are limited to 64 KiB, printable ASCII, 4–12 frames, 4–14 rows, 36 columns, a fixed palette,
233
+ and 80–600 ms frame durations. Animation timers are released on widget replacement, task start,
234
+ reload, and exit.
235
+
236
+ Run `npm pack --dry-run` or `npm pack` to review release contents. Packing runs `npm run build`;
237
+ the package includes source, presets, demo media, README, and license. Asset paths resolve relative to the
238
+ extension module, so playback works from any working directory.
239
+
240
+ Licensed under [MIT](LICENSE).
@@ -0,0 +1,78 @@
1
+ {
2
+ "version": 1,
3
+ "description": "Arlo the armadillo, adapted from the original Dillo prototype: domed armored shell, low pointed face, blink and tail wag.",
4
+ "model": null,
5
+ "sprite": {
6
+ "name": "Arlo the Armadillo",
7
+ "color": "orange",
8
+ "frame_ms": 200,
9
+ "frames": [
10
+ [
11
+ " .-======-.",
12
+ " .' / / / / '.",
13
+ " / / / / / / \\",
14
+ " /__/__/__/__/___\\",
15
+ " | / / / | o '--.",
16
+ " ___|_/__/__/___| _>",
17
+ " /___/ '---'",
18
+ " || ||",
19
+ " ^^ ^^"
20
+ ],
21
+ [
22
+ " .-======-.",
23
+ " .' / / / / '.",
24
+ " / / / / / / \\",
25
+ " /__/__/__/__/___\\",
26
+ " _ | / / / | o '--.",
27
+ " / \\_|_/__/__/___| _>",
28
+ " / '---'",
29
+ " || ||",
30
+ " ^^ ^^"
31
+ ],
32
+ [
33
+ " .-======-.",
34
+ " .' / / / / '.",
35
+ " / / / / / / \\",
36
+ " _ /__/__/__/__/___\\",
37
+ " / | | / / / | - '--.",
38
+ " \\_|_/__/__/___| _>",
39
+ " / '---'",
40
+ " || ||",
41
+ " ^^ ^^"
42
+ ],
43
+ [
44
+ " .-======-.",
45
+ " .' / / / / '.",
46
+ " / / / / / / \\",
47
+ " /__/__/__/__/___\\",
48
+ " _ | / / / | o '--.",
49
+ " / \\_|_/__/__/___| _>",
50
+ " / '---'",
51
+ " || ||",
52
+ " ^^ ^^"
53
+ ],
54
+ [
55
+ " .-======-.",
56
+ " .' / / / / '.",
57
+ " / / / / / / \\",
58
+ " /__/__/__/__/___\\",
59
+ " | / / / | o '--.",
60
+ " ___|_/__/__/___| _>",
61
+ " /___/ '---'",
62
+ " || ||",
63
+ " ^^ ^^"
64
+ ],
65
+ [
66
+ " .-======-.",
67
+ " .' / / / / '.",
68
+ " / / / / / / \\",
69
+ " /__/__/__/__/___\\",
70
+ " | / / / | o '--.",
71
+ " |_/__/__/___| _>",
72
+ " __/ '---'",
73
+ " /_/ || ||",
74
+ " ^^ ^^"
75
+ ]
76
+ ]
77
+ }
78
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "version": 1,
3
+ "description": "crawfish",
4
+ "model": null,
5
+ "sprite": {
6
+ "name": "Cray the Crawfish",
7
+ "color": "orange",
8
+ "frame_ms": 200,
9
+ "frames": [
10
+ [
11
+ " \\ / ",
12
+ " \\ / ",
13
+ " (\\ o o /) ",
14
+ " ( > /----\\ < ) ",
15
+ " \\_/| |\\_/ ",
16
+ " /|----|\\ ",
17
+ " / |----| \\ ",
18
+ " |----| ",
19
+ " \\==/ ",
20
+ " /_||_\\ "
21
+ ],
22
+ [
23
+ " \\ / ",
24
+ " \\ / ",
25
+ " (\\ o o /) ",
26
+ " ( > /----\\ < ) ",
27
+ " \\_/| |\\_/ ",
28
+ " /|----|\\ ",
29
+ " / |----| \\ ",
30
+ " |----| ",
31
+ " \\==/ ",
32
+ " /_||_\\ "
33
+ ],
34
+ [
35
+ " \\ / ",
36
+ " \\ / /) ",
37
+ " (\\ o o < ) ",
38
+ " ( > /----\\ / ",
39
+ " \\_/| |/ ",
40
+ " /|----|\\ ",
41
+ " / |----| \\ ",
42
+ " |----| ",
43
+ " \\==/ ",
44
+ " /_||_\\ "
45
+ ],
46
+ [
47
+ " \\ / ",
48
+ " \\ / /) ",
49
+ " (\\ - - < ) ",
50
+ " ( > /----\\ / ",
51
+ " \\_/| |/ ",
52
+ " /|----|\\ ",
53
+ " / |----| \\ ",
54
+ " |----| ",
55
+ " \\==/ ",
56
+ " /_||_\\ "
57
+ ],
58
+ [
59
+ " \\ / ",
60
+ " \\ / /) ",
61
+ " (\\ o o < ) ",
62
+ " ( > /----\\ / ",
63
+ " \\_/| |/ ",
64
+ " /|----|\\ ",
65
+ " / |----| \\ ",
66
+ " |----| ",
67
+ " \\==/ ",
68
+ " /_||_\\ "
69
+ ],
70
+ [
71
+ " \\ / ",
72
+ " \\ / ",
73
+ " (\\ o o /) ",
74
+ " ( > /----\\ < ) ",
75
+ " \\_/| |\\_/ ",
76
+ " /|----|\\ ",
77
+ " / |----| \\ ",
78
+ " |----| ",
79
+ " \\==/ ",
80
+ " /_||_\\ "
81
+ ]
82
+ ]
83
+ },
84
+ "usage": {
85
+ "input_tokens": 17065,
86
+ "cached_input_tokens": 0,
87
+ "cache_write_input_tokens": 0,
88
+ "output_tokens": 568,
89
+ "reasoning_output_tokens": 43
90
+ }
91
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "version": 1,
3
+ "description": "a sleepy orange fox wearing a wizard hat",
4
+ "model": null,
5
+ "sprite": {
6
+ "name": "Dozy the Fox Wizard",
7
+ "color": "orange",
8
+ "frame_ms": 220,
9
+ "frames": [
10
+ [
11
+ " /\\",
12
+ " / .\\",
13
+ " / * \\",
14
+ " /______\\",
15
+ " /\\ /\\",
16
+ " / o o \\",
17
+ " \\ \\/ /",
18
+ " \\______/_ /\\",
19
+ " / \\ \\_/ /",
20
+ " (_/____\\_)___/"
21
+ ],
22
+ [
23
+ " /\\",
24
+ " / .\\",
25
+ " / * \\",
26
+ " /______\\",
27
+ " /\\ /\\",
28
+ " / o o \\",
29
+ " \\ \\/ /",
30
+ " \\______/_ /\\",
31
+ " / \\ \\__/ /",
32
+ " (_/____\\_)____/"
33
+ ],
34
+ [
35
+ " /\\",
36
+ " / .\\",
37
+ " / * \\",
38
+ " /______\\",
39
+ " /\\ /\\",
40
+ " / - - \\",
41
+ " \\ \\/ /",
42
+ " \\______/_ /\\",
43
+ " / \\ \\___/ /",
44
+ " (_/____\\_)_____/"
45
+ ],
46
+ [
47
+ " /\\",
48
+ " / .\\",
49
+ " / * \\",
50
+ " /______\\",
51
+ " /\\ /\\",
52
+ " / - - \\",
53
+ " \\ \\/ /",
54
+ " \\______/_ /\\",
55
+ " / \\ \\__/ /",
56
+ " (_/____\\_)____/"
57
+ ],
58
+ [
59
+ " /\\",
60
+ " / .\\",
61
+ " / * \\",
62
+ " /______\\",
63
+ " /\\ /\\",
64
+ " / - o \\",
65
+ " \\ \\/ /",
66
+ " \\______/_ /\\",
67
+ " / \\ \\_/ /",
68
+ " (_/____\\_)___/"
69
+ ],
70
+ [
71
+ " /\\",
72
+ " / .\\",
73
+ " / * \\",
74
+ " /______\\",
75
+ " /\\ /\\",
76
+ " / o o \\",
77
+ " \\ \\/ /",
78
+ " \\______/_ /\\",
79
+ " / \\ \\_/ /",
80
+ " (_/____\\_)___/"
81
+ ]
82
+ ]
83
+ },
84
+ "usage": {
85
+ "input_tokens": 17066,
86
+ "cached_input_tokens": 0,
87
+ "cache_write_input_tokens": 0,
88
+ "output_tokens": 505,
89
+ "reasoning_output_tokens": 54
90
+ }
91
+ }
@@ -0,0 +1,84 @@
1
+ {
2
+ "version": 1,
3
+ "description": "A friendly ordinary woodland fox named Fern, seated with tall pointed ears, narrow muzzle and a large bushy tail curling beside its paws. No wizard hat or clothing, distinct from Dozy the wizard fox. Use orange color. Animate a blink and a tail tip wag.",
4
+ "model": "openai/gpt-6.1-sol",
5
+ "sprite": {
6
+ "name": "Fern the Fox",
7
+ "color": "orange",
8
+ "frame_ms": 200,
9
+ "frames": [
10
+ [
11
+ " /\\ /\\",
12
+ " / \\_/ \\",
13
+ " / o o \\",
14
+ " \\ ^ /",
15
+ " \\ \\_/ / __",
16
+ " /`-----'\\ .' )",
17
+ " / | | \\ / /",
18
+ " / | | \\ ( /",
19
+ " \\___|___|___/--\\ (",
20
+ " /_/ \\_\\ \\___`--'"
21
+ ],
22
+ [
23
+ " /\\ /\\",
24
+ " / \\_/ \\",
25
+ " / o o \\",
26
+ " \\ ^ /",
27
+ " \\ \\_/ / __",
28
+ " /`-----'\\ .' /",
29
+ " / | | \\ / /",
30
+ " / | | \\ ( /",
31
+ " \\___|___|___/--\\ (",
32
+ " /_/ \\_\\ \\___`--'"
33
+ ],
34
+ [
35
+ " /\\ /\\",
36
+ " / \\_/ \\",
37
+ " / - - \\",
38
+ " \\ ^ /",
39
+ " \\ \\_/ / __",
40
+ " /`-----'\\ .' /",
41
+ " / | | \\ / /",
42
+ " / | | \\ ( /",
43
+ " \\___|___|___/--\\ (",
44
+ " /_/ \\_\\ \\___`--'"
45
+ ],
46
+ [
47
+ " /\\ /\\",
48
+ " / \\_/ \\",
49
+ " / o o \\",
50
+ " \\ ^ /",
51
+ " \\ \\_/ / __",
52
+ " /`-----'\\ .' )",
53
+ " / | | \\ / /",
54
+ " / | | \\ ( /",
55
+ " \\___|___|___/--\\ (",
56
+ " /_/ \\_\\ \\___`--'"
57
+ ],
58
+ [
59
+ " /\\ /\\",
60
+ " / \\_/ \\",
61
+ " / o o \\",
62
+ " \\ ^ /",
63
+ " \\ \\_/ / __",
64
+ " /`-----'\\ .' )",
65
+ " / | | \\ / /",
66
+ " / | | \\ ( /",
67
+ " \\___|___|___/--\\ (",
68
+ " /_/ \\_\\ \\___`--'"
69
+ ],
70
+ [
71
+ " /\\ /\\",
72
+ " / \\_/ \\",
73
+ " / o o \\",
74
+ " \\ ^ /",
75
+ " \\ \\_/ / __",
76
+ " /`-----'\\ .' )",
77
+ " / | | \\ / /",
78
+ " / | | \\ ( /",
79
+ " \\___|___|___/--\\ (",
80
+ " /_/ \\_\\ \\___`--'"
81
+ ]
82
+ ]
83
+ }
84
+ }
@@ -0,0 +1,78 @@
1
+ {
2
+ "version": 1,
3
+ "description": "A charming Baltimore oriole bird named Ori perched on a twig, side profile with a pointed beak, rounded breast, wing and tail. Use orange color. Animate a blink and a tiny wing flutter. Clearly bird shaped, compact ASCII.",
4
+ "model": "openai/gpt-6.1-sol",
5
+ "sprite": {
6
+ "name": "Ori the Oriole",
7
+ "color": "orange",
8
+ "frame_ms": 200,
9
+ "frames": [
10
+ [
11
+ " ___",
12
+ " / o \\",
13
+ " ___/ _>",
14
+ " / /\\ )",
15
+ " /___/ \\ /",
16
+ " /___/____/",
17
+ " ||",
18
+ " -----^^-------",
19
+ " /"
20
+ ],
21
+ [
22
+ " ___",
23
+ " / o \\",
24
+ " ___/ _>",
25
+ " / __ )",
26
+ " /___/ \\ /",
27
+ " /___/____/",
28
+ " ||",
29
+ " -----^^-------",
30
+ " /"
31
+ ],
32
+ [
33
+ " ___",
34
+ " / o \\",
35
+ " ___/ _>",
36
+ " / \\/ )",
37
+ " /___/ \\ /",
38
+ " /___/____/",
39
+ " ||",
40
+ " -----^^-------",
41
+ " /"
42
+ ],
43
+ [
44
+ " ___",
45
+ " / o \\",
46
+ " ___/ _>",
47
+ " / __ )",
48
+ " /___/ \\ /",
49
+ " /___/____/",
50
+ " ||",
51
+ " -----^^-------",
52
+ " /"
53
+ ],
54
+ [
55
+ " ___",
56
+ " / - \\",
57
+ " ___/ _>",
58
+ " / /\\ )",
59
+ " /___/ \\ /",
60
+ " /___/____/",
61
+ " ||",
62
+ " -----^^-------",
63
+ " /"
64
+ ],
65
+ [
66
+ " ___",
67
+ " / o \\",
68
+ " ___/ _>",
69
+ " / /\\ )",
70
+ " /___/ \\ /",
71
+ " /___/____/",
72
+ " ||",
73
+ " -----^^-------",
74
+ " /"
75
+ ]
76
+ ]
77
+ }
78
+ }