noiton 2.0.0 โ†’ 2.0.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "noiton",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "๐Ÿ™ Universal AI Agent Connector - one key, many agents (OpenCode, Hermes, OpenClaw, Cline, Aider, Kilo, Kimi)",
5
5
  "keywords": [
6
6
  "noiton",
@@ -1,18 +1,20 @@
1
1
  /**
2
2
  * NOITON init command - the universal multi-agent wizard
3
3
  *
4
- * Flow:
4
+ * Flow (with proper pacing and step-by-step reveals):
5
5
  * 1. Print banner with octopus mascot
6
- * 2. Detect all installed agents
7
- * 3. If OpenCode installed, check version & offer update
8
- * 4. If no agents, offer to install OpenCode or Hermes (based on use case)
9
- * 5. Show checklist of detected agents
6
+ * 2. Detect all installed agents (with spinner + gradual reveal)
7
+ * 3. If no agents, offer to install OpenCode or Hermes
8
+ * 4. If OpenCode installed, check version & offer update
9
+ * 5. Show checklist of detected agents (one by one)
10
10
  * 6. Ask which agents to configure
11
- * 7. Ask for NOITON API key (once)
12
- * 8. Validate key + fetch models
13
- * 9. Ask which model to use as primary (for single-model agents)
14
- * 10. Configure each selected agent
15
- * 11. Show funny success message + easter egg
11
+ * 7. Check if already configured, ask to overwrite
12
+ * 8. Ask for NOITON API key (once)
13
+ * 9. Validate key + fetch models (with spinner)
14
+ * 10. Show models list
15
+ * 11. Ask which model to use as primary
16
+ * 12. Configure each selected agent (with per-agent spinner)
17
+ * 13. Show summary + funny success message + easter egg
16
18
  */
17
19
 
18
20
  import { input, confirm, select, checkbox } from "@inquirer/prompts";
@@ -29,7 +31,8 @@ import {
29
31
  step,
30
32
  checklist,
31
33
  divider,
32
- withSpinner,
34
+ sleep,
35
+ line,
33
36
  } from "../ui.js";
34
37
  import {
35
38
  successMessage,
@@ -44,30 +47,38 @@ import { getDetectedAgents, getAgent } from "../lib/agents/index.js";
44
47
  import {
45
48
  detectAgents,
46
49
  getOpenCodeStatus,
47
- getRecommendedAgent,
48
50
  } from "../lib/detect.js";
49
51
  import { installAgent, updateAgent, offerInstall } from "../lib/install.js";
50
52
 
51
53
  export async function initCommand() {
52
54
  // ============= STEP 1: BANNER =============
53
55
  printBanner("happy");
56
+ await sleep(400);
54
57
 
55
58
  // ============= STEP 2: DETECT AGENTS =============
56
59
  step(1, "Procurando agentes de IA instalados...");
60
+ await sleep(300);
57
61
 
62
+ const detectSpinner = spinner("Escaneando seu sistema...");
63
+ await sleep(800);
58
64
  const detected = getDetectedAgents();
59
65
  const opencodeStatus = getOpenCodeStatus();
66
+ detectSpinner.succeed("Escaneamento concluรญdo!");
67
+ await sleep(300);
60
68
 
69
+ // ============= STEP 2a: NO AGENTS FOUND =============
61
70
  if (detected.length === 0) {
62
- // ============= STEP 2a: NO AGENTS - OFFER INSTALL =============
63
71
  console.log();
72
+ await sleep(200);
64
73
  box(noAgentMessage(), "warning");
74
+ await sleep(500);
65
75
  console.log();
66
76
 
67
77
  const installChoice = await offerInstall();
68
78
  if (!installChoice) {
69
79
  console.log();
70
80
  info(cancelMessage());
81
+ await sleep(200);
71
82
  console.log();
72
83
  console.log(c.dim(" ๐Ÿ’ก Dica: instale OpenCode ou Hermes e rode noiton novamente!"));
73
84
  console.log(c.dim(" OpenCode: curl -fsSL https://opencode.ai/install | bash"));
@@ -85,6 +96,7 @@ export async function initCommand() {
85
96
  return;
86
97
  }
87
98
 
99
+ await sleep(500);
88
100
  // Re-detect after install
89
101
  const reDetected = getDetectedAgents();
90
102
  if (reDetected.length === 0) {
@@ -96,8 +108,9 @@ export async function initCommand() {
96
108
  detected.push(...reDetected);
97
109
  }
98
110
 
99
- // ============= STEP 2b: CHECK OPENCODE VERSION =============
111
+ // ============= STEP 3: CHECK OPENCODE VERSION =============
100
112
  if (opencodeStatus?.updateAvailable) {
113
+ await sleep(400);
101
114
  console.log();
102
115
  box(
103
116
  `๐Ÿ”„ OpenCode v${opencodeStatus.latest} disponรญvel!\n` +
@@ -105,6 +118,7 @@ export async function initCommand() {
105
118
  ` Atualizar agora?`,
106
119
  "warning"
107
120
  );
121
+ await sleep(300);
108
122
  const wantUpdate = await confirm({
109
123
  message: "Atualizar OpenCode?",
110
124
  default: true,
@@ -116,22 +130,36 @@ export async function initCommand() {
116
130
  } else {
117
131
  warn(`Nรฃo foi possรญvel atualizar: ${updateResult.error}`);
118
132
  }
133
+ await sleep(300);
119
134
  }
120
135
  }
121
136
 
122
- // ============= STEP 3: SHOW CHECKLIST =============
137
+ // ============= STEP 4: SHOW DETECTED AGENTS ONE BY ONE =============
123
138
  step(2, "Agentes detectados");
139
+ await sleep(300);
124
140
 
141
+ // Reveal each agent with a small delay
125
142
  const items = detected.map((a) => ({
126
143
  label: a.name,
127
144
  ok: true,
128
145
  detail: a.version ? `v${a.version}` : "(config encontrado)",
129
146
  }));
130
- checklist(items);
147
+
148
+ // Print one by one for a "checking" feel
149
+ for (const item of items) {
150
+ const mark = c.green("โœ“");
151
+ const label = c.white(item.label);
152
+ const detail = c.dim(` ${item.detail}`);
153
+ process.stdout.write(` ${mark} ${label}${detail}`);
154
+ await sleep(250);
155
+ process.stdout.write("\n");
156
+ }
131
157
  console.log();
158
+ await sleep(300);
132
159
 
133
- // ============= STEP 4: CHOOSE AGENTS TO CONFIGURE =============
160
+ // ============= STEP 5: CHOOSE AGENTS TO CONFIGURE =============
134
161
  step(3, "Escolha quais agentes configurar");
162
+ await sleep(200);
135
163
 
136
164
  const agentChoices = detected.map((a) => ({
137
165
  name: `${a.name}${a.version ? ` (v${a.version})` : ""}`,
@@ -143,6 +171,7 @@ export async function initCommand() {
143
171
  if (detected.length === 1) {
144
172
  selectedIds = [detected[0].id];
145
173
  info(`Configurando: ${detected[0].name}`);
174
+ await sleep(200);
146
175
  } else {
147
176
  selectedIds = await checkbox({
148
177
  message: "Quais agentes vocรช quer conectar ao NOITON?",
@@ -155,7 +184,7 @@ export async function initCommand() {
155
184
  .map((id) => getAgent(id))
156
185
  .filter(Boolean);
157
186
 
158
- // ============= STEP 5: CHECK EXISTING CONFIG =============
187
+ // ============= STEP 6: CHECK EXISTING CONFIG =============
159
188
  const alreadyConfigured = selectedAgents.filter((a) => {
160
189
  try {
161
190
  return a.isConfigured();
@@ -165,10 +194,12 @@ export async function initCommand() {
165
194
  });
166
195
 
167
196
  if (alreadyConfigured.length > 0) {
197
+ await sleep(300);
168
198
  console.log();
169
199
  warn(
170
200
  `NOITON jรก estรก configurado em: ${alreadyConfigured.map((a) => a.name).join(", ")}`
171
201
  );
202
+ await sleep(200);
172
203
  const overwrite = await confirm({
173
204
  message: "Sobrescrever configuraรงรฃo existente?",
174
205
  default: false,
@@ -180,22 +211,26 @@ export async function initCommand() {
180
211
  }
181
212
  }
182
213
 
183
- // ============= STEP 6: ASK FOR API KEY =============
214
+ // ============= STEP 7: ASK FOR API KEY =============
184
215
  step(4, "Cole sua chave NOITON");
216
+ await sleep(200);
185
217
  console.log(c.dim(" Uma chave sรณ serve para todos os agentes! ๐Ÿ™"));
218
+ await sleep(200);
186
219
  console.log();
187
220
 
188
221
  const apiKey = await input({
189
- message: " Chave NOITON:",
222
+ message: " Chave:",
190
223
  validate: (v) => (v.trim().length >= 10 ? true : "Chave muito curta"),
191
224
  transformer: (v) => maskKey(v),
192
225
  });
193
226
 
194
227
  const trimmedKey = apiKey.trim();
195
228
 
196
- // ============= STEP 7: VALIDATE KEY + FETCH MODELS =============
229
+ // ============= STEP 8: VALIDATE KEY + FETCH MODELS =============
197
230
  console.log();
231
+ await sleep(200);
198
232
  const s = spinner(`${thinkingMessage()} Validando chave...`);
233
+ await sleep(500);
199
234
  const { valid, models, error } = await validateKey(trimmedKey);
200
235
 
201
236
  if (!valid) {
@@ -206,32 +241,38 @@ export async function initCommand() {
206
241
  }
207
242
 
208
243
  s.succeed("Chave vรกlida!");
209
- console.log();
244
+ await sleep(300);
210
245
 
211
246
  if (!models || models.length === 0) {
247
+ console.log();
212
248
  warn("Nenhum modelo disponรญvel para esta chave.");
213
249
  return;
214
250
  }
215
251
 
216
- // ============= STEP 8: SHOW MODELS =============
252
+ // ============= STEP 9: SHOW MODELS =============
217
253
  step(5, `Modelos disponรญveis (${models.length})`);
254
+ await sleep(200);
218
255
 
219
256
  for (const m of models) {
220
257
  const ctx = m.context_window
221
258
  ? c.dim(` (${Math.round(m.context_window / 1000)}K ctx)`)
222
259
  : "";
223
- console.log(` ${c.cyan("โ€ข")} ${m.id}${ctx}`);
260
+ process.stdout.write(` ${c.cyan("โ€ข")} ${m.id}${ctx}`);
261
+ await sleep(120);
262
+ process.stdout.write("\n");
224
263
  }
225
264
  console.log();
265
+ await sleep(300);
226
266
 
227
- // ============= STEP 9: CHOOSE PRIMARY MODEL =============
228
- // For agents that only support one model, ask which to use
267
+ // ============= STEP 10: CHOOSE PRIMARY MODEL =============
229
268
  const needsPrimaryModel = selectedAgents.some((a) => !a.supportsMultipleModels);
230
269
 
231
270
  let primaryModel = null;
232
271
  if (needsPrimaryModel) {
233
272
  step(6, "Escolha o modelo principal");
273
+ await sleep(200);
234
274
  console.log(c.dim(" Alguns agentes usam apenas 1 modelo por vez."));
275
+ await sleep(200);
235
276
  console.log();
236
277
 
237
278
  const modelChoices = models.map((m) => ({
@@ -245,14 +286,17 @@ export async function initCommand() {
245
286
  default: models[0]?.id,
246
287
  });
247
288
  console.log();
289
+ await sleep(200);
248
290
  }
249
291
 
250
- // ============= STEP 10: CONFIGURE EACH AGENT =============
251
- step(7, "Configurando agentes...");
292
+ // ============= STEP 11: CONFIGURE EACH AGENT =============
293
+ step(needsPrimaryModel ? 7 : 6, "Configurando agentes...");
294
+ await sleep(300);
252
295
 
253
296
  const results = [];
254
297
  for (const agent of selectedAgents) {
255
298
  const s = spinner(`Configurando ${agent.name}...`);
299
+ await sleep(400);
256
300
  try {
257
301
  const result = agent.configure({
258
302
  apiKey: trimmedKey,
@@ -265,13 +309,16 @@ export async function initCommand() {
265
309
  s.fail(`Erro em ${agent.name}: ${err.message}`);
266
310
  results.push({ agent: agent.name, ok: false, error: err.message });
267
311
  }
312
+ await sleep(200);
268
313
  }
269
314
 
270
- // ============= STEP 11: SUMMARY =============
315
+ // ============= STEP 12: SUMMARY =============
271
316
  console.log();
272
317
  divider();
318
+ await sleep(300);
273
319
  console.log();
274
320
  printBanner("dancing");
321
+ await sleep(400);
275
322
 
276
323
  const successCount = results.filter((r) => r.ok).length;
277
324
  if (successCount > 0) {
@@ -281,28 +328,33 @@ export async function initCommand() {
281
328
  "success"
282
329
  );
283
330
  console.log();
331
+ await sleep(200);
284
332
  for (const r of results) {
285
333
  if (r.ok) {
286
334
  ok(`${r.agent} ${c.dim(`โ†’ ${r.path}`)}`);
287
335
  } else {
288
336
  fail(`${r.agent} ${c.dim(`โ†’ ${r.error}`)}`);
289
337
  }
338
+ await sleep(150);
290
339
  }
291
340
  } else {
292
341
  box("Nenhum agente foi configurado. Tente novamente!", "error");
293
342
  return;
294
343
  }
295
344
 
296
- // ============= STEP 12: EASTER EGG + FAREWELL =============
345
+ // ============= STEP 13: EASTER EGG + FAREWELL =============
297
346
  const egg = getEasterEgg();
298
347
  if (egg) {
299
348
  console.log();
349
+ await sleep(200);
300
350
  console.log(c.yellow(` ๐ŸŽ ${egg}`));
301
351
  }
302
352
 
303
353
  console.log();
354
+ await sleep(200);
304
355
  console.log(c.dim(" ๐Ÿ’ก Reinicie os agentes para aplicar as mudanรงas."));
305
356
  console.log();
357
+ await sleep(200);
306
358
  console.log(c.purple(` ${farewellMessage()}`));
307
359
  console.log();
308
360
  }
package/src/octopus.js CHANGED
@@ -1,257 +1,241 @@
1
1
  /**
2
2
  * NOITON Octopus Mascot - "O Polvo NOITON"
3
- * A beautiful refined octopus that appears throughout the CLI.
4
3
  *
5
4
  * Design philosophy:
6
- * - Soft, organic curves (not blocky)
7
- * - Visible 8 tentacles spread gracefully
8
- * - Friendly expressive eyes
9
- * - Brand gradient: purple โ†’ magenta โ†’ cyan
5
+ * - Smooth organic curves using โ•ญโ•ฎโ•ฐโ•ฏ โ—  โ—ก โŒ’ ~ characters
6
+ * - Round bulbous head with expressive eyes
7
+ * - 8 graceful flowing tentacles (not blocky)
8
+ * - Brand gradient: purple โ†’ magenta โ†’ pink โ†’ cyan
10
9
  */
11
10
 
12
11
  import gradient from "gradient-string";
13
12
 
14
- // NOITON brand gradient (purple โ†’ magenta โ†’ cyan โ†’ teal)
13
+ // NOITON brand gradient
15
14
  const brandGradient = gradient([
16
15
  "#A78BFA", // light purple
17
16
  "#C084FC", // purple
18
17
  "#E879F9", // magenta
19
18
  "#F472B6", // pink
20
19
  "#22D3EE", // cyan
21
- "#2DD4BF", // teal
22
20
  ]);
23
21
 
24
- const successGradient = gradient(["#10B981", "#34D399", "#22D3EE", "#A78BFA"]);
25
- const errorGradient = gradient(["#F87171", "#EF4444", "#DC2626"]);
26
- const warningGradient = gradient(["#FBBF24", "#F59E0B", "#FB923C"]);
22
+ const successGradient = gradient(["#34D399", "#22D3EE", "#A78BFA"]);
23
+ const errorGradient = gradient(["#F87171", "#EF4444"]);
27
24
 
28
25
  /**
29
- * The main NOITON Octopus - smiling, tentacles spread, ready to help
30
- * Refined organic design with graceful curves
26
+ * Main happy octopus - graceful, friendly, ready to help
27
+ * Clean organic curves, expressive eyes, flowing tentacles
31
28
  */
32
29
  export function octopusHappy() {
33
30
  return brandGradient.multiline(`
34
- โ–„โ–„โ–„โ–„โ–„
35
- โ–„โ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–„
36
- โ–„โ–ˆโ–€ โ–„โ–„โ–„โ–„โ–„ โ–€โ–ˆโ–„
37
- โ–ˆโ–ˆ โ–ˆ o o โ–ˆ โ–ˆโ–ˆ
38
- โ–ˆโ–ˆ โ–ˆ โ–ผ โ–ˆ โ–ˆโ–ˆ
39
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
40
- โ–ˆโ–ˆ โ•ฒ___โ•ฑ โ–ˆโ–ˆ
41
- โ–ˆโ–ˆ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–ˆโ–ˆ
42
- โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ
43
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
44
- โ–„โ–ˆโ–„ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–„โ–ˆโ–„
45
- โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„ โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„
46
- โ–ˆโ–ˆโ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–ˆโ–„ โ–„โ–ˆโ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–ˆโ–ˆ
47
- โ–ˆโ–ˆโ–€ โ–„โ–„ โ–€โ–ˆโ–ˆโ–„ โ–„โ–ˆโ–ˆโ–€ โ–„โ–„ โ–€โ–ˆโ–ˆ
48
- โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆ โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€ โ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ
49
- โ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–€โ–ˆโ–ˆโ–ˆโ–€ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆ
50
- โ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆ
51
- โ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆ โ–ˆ โ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆ
52
- โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆ
53
- โ–ˆ โ–ˆ โ–ˆ โ–ˆ
54
- โ–€ โ–ˆ โ™ฅ โ–ˆ โ–€
55
- โ–ˆ โ–ˆ
31
+ โ•ญโ”โ”โ”โ”โ”โ”โ”โ”โ”โ•ฎ
32
+ โ•ฑ โ•ฒ
33
+ โ”‚ โ—‰ โ—‰ โ”‚
34
+ โ”‚ โ—ก โ”‚
35
+ โ•ฒ___________โ•ฑ
36
+ โ”‚ โ•ฒ___โ•ฑ โ”‚
37
+ โ•ญโ”ค โ”œโ•ฎ
38
+ โ•ญโ”˜โ•ฐโ” โ•ญโ”โ”˜โ•ฐโ”
39
+ โ•ญโ”˜ โ•ฐโ•ฎ โ•ญโ”˜ โ•ฐโ”
40
+ โ•ญโ”˜ โ—  โ•ฐโ”โ•ฏ โ—  โ•ฐโ”
41
+ โ•ญโ”˜ โ•ฐโ”
42
+ โ•ญโ”˜ โ™ฅ โœฆ โ™ฅ โ•ฐโ”
43
+ โ”‚ โ”‚
44
+ โ•ฐโ•ฎ โ•ญโ•ฏ
45
+ โ•ฐโ•ฎ โœฆ โ™ฅ โ•ญโ•ฏ
46
+ โ•ฐโ•ฎ โ•ญโ•ฏ
47
+ โ•ฐโ”€โœฆโ”€โ”€โ”€โ™ฅโ”€โœฆโ”€โ•ฏ
56
48
  `);
57
49
  }
58
50
 
59
51
  /**
60
- * Compact octopus for inline use (small status)
52
+ * Compact octopus for tight spaces
61
53
  */
62
54
  export function octopusMini() {
63
55
  return brandGradient.multiline(`
64
- โ–„โ–„โ–„
65
- โ–„โ–ˆโ–€โ–€โ–€โ–ˆโ–„
66
- โ–ˆโ–ˆ o o โ–ˆโ–ˆ
67
- โ–ˆโ–ˆ โ–ผ โ–ˆโ–ˆ
68
- โ–€โ–€โ–€โ–€โ–€โ–€
69
- โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„
70
- โ–„โ–ˆโ–€ โ•ฒโ•ฑ โ–€โ–ˆโ–„
71
- โ–ˆโ–Œ โ–ˆโ–ˆโ–ˆ โ–โ–ˆ
72
- โ–€โ–„ โ–ˆโ–ˆโ–ˆ โ–„โ–€
73
- โ–€โ–€โ–€โ–€โ–€โ–€โ–€
56
+ โ•ญโ”โ”โ”โ”โ”โ•ฎ
57
+ โ•ฑ โ—‰ โ—‰ โ•ฒ
58
+ โ”‚ โ—ก โ”‚
59
+ โ•ฒ_______โ•ฑ
60
+ โ•ญโ•ฏ โ•ฐโ•ฎ
61
+ โ•ญโ”˜ โ—  โ—  โ•ฐโ”
62
+ โ•ฐโ•ฎ โ™ฅ โ•ญโ•ฏ
63
+ โ•ฐโ”€โ”€โ”€โ•ฏ
74
64
  `);
75
65
  }
76
66
 
77
67
  /**
78
- * Curious octopus (no agents detected - looking around)
68
+ * Curious octopus - looking around with question marks
79
69
  */
80
70
  export function octopusCurious() {
81
71
  return brandGradient.multiline(`
82
- โ–„โ–„โ–„โ–„โ–„
83
- โ–„โ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–„
84
- โ–„โ–ˆโ–€ โ–„โ–„โ–„โ–„โ–„ โ–€โ–ˆโ–„
85
- โ–ˆโ–ˆ โ–ˆ ? ? โ–ˆ โ–ˆโ–ˆ
86
- โ–ˆโ–ˆ โ–ˆ โ–ผ โ–ˆ โ–ˆโ–ˆ
87
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
88
- โ–ˆโ–ˆ โ•ฒ___โ•ฑ โ–ˆโ–ˆ
89
- โ–ˆโ–ˆ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–ˆโ–ˆ
90
- โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ
91
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
92
- โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€
93
- โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™
94
- โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™
95
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
96
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
97
- โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€
98
- โ–€โ–€โ–€โ–€
72
+ โ•ญโ”โ”โ”โ”โ”โ”โ”โ”โ”โ•ฎ
73
+ โ•ฑ โ•ฒ
74
+ โ”‚ ? ? โ”‚
75
+ โ”‚ โ—ก โ”‚
76
+ โ•ฒ___________โ•ฑ
77
+ โ”‚ โ•ฒ___โ•ฑ โ”‚
78
+ โ•ญโ”ค โ”œโ•ฎ
79
+ โ•ญโ”˜โ•ฐโ” โ•ญโ”โ”˜โ•ฐโ”
80
+ โ•ญโ”˜ โ•ฐโ•ฎ โ•ญโ”˜ โ•ฐโ”
81
+ โ•ญโ”˜ โ•ฐโ”โ•ฏ โ•ฐโ”
82
+ โ•ญโ”˜ โ•ฐโ”
83
+ โ•ญโ”˜ ? ? ? โ•ฐโ”
84
+ โ”‚ โ”‚
85
+ โ•ฐโ•ฎ โ•ญโ•ฏ
86
+ โ•ฐโ•ฎ โ•ญโ•ฏ
87
+ โ•ฐโ•ฎ ? ? โ•ญโ•ฏ
88
+ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
99
89
  `);
100
90
  }
101
91
 
102
92
  /**
103
- * Working octopus (during long operations - tentacles busy)
93
+ * Working octopus - focused, with swirly eyes
104
94
  */
105
95
  export function octopusWorking() {
106
96
  return brandGradient.multiline(`
107
- โ–„โ–„โ–„โ–„โ–„
108
- โ–„โ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–„
109
- โ–„โ–ˆโ–€ โ–„โ–„โ–„โ–„โ–„ โ–€โ–ˆโ–„
110
- โ–ˆโ–ˆ โ–ˆ ~ ~ โ–ˆ โ–ˆโ–ˆ
111
- โ–ˆโ–ˆ โ–ˆ โ–ผ โ–ˆ โ–ˆโ–ˆ
112
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
113
- โ–ˆโ–ˆ โ•ฒ___โ•ฑ โ–ˆโ–ˆ
114
- โ–ˆโ–ˆ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–ˆโ–ˆ
115
- โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ
116
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
117
- โ–„โ–„โ–„โ–„ โ–„โ–„ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–„โ–„ โ–„โ–„โ–„โ–„
118
- โ–ˆโ–€โ–€โ–€โ–ˆโ–„โ–ˆโ–€ โ–ผ โ–€โ–ˆโ–„โ–ˆโ–€โ–€โ–€โ–ˆ
119
- โ–ˆ โ–โ–ˆโ–ˆ โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„ โ–ˆโ–ˆโ–Œ โ–ˆ
120
- โ–ˆ โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ โ–ˆ
121
- โ–ˆ โ–ˆโ–Œ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–โ–ˆ โ–ˆ
122
- โ–ˆ โ–โ–ˆ โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€ โ–ˆโ–Œ โ–ˆ
123
- โ–ˆ โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ โ–ˆ
124
- โ–ˆ โ–ˆโ–ˆโ–Œ โ–โ–ˆโ–ˆ โ–ˆ
125
- โ–โ–„โ–ˆโ–ˆ โ–ˆโ–ˆโ–„โ–Œ
126
- โ–€โ–€ โ–€โ–€
97
+ โ•ญโ”โ”โ”โ”โ”โ”โ”โ”โ”โ•ฎ
98
+ โ•ฑ โ•ฒ
99
+ โ”‚ @ @ โ”‚
100
+ โ”‚ โ–ฌ โ”‚
101
+ โ•ฒ___________โ•ฑ
102
+ โ”‚ โ•ฒ___โ•ฑ โ”‚
103
+ โ•ญโ”ค โ”œโ•ฎ
104
+ โ•ญโ”˜โ•ฐโ” โ•ญโ”โ”˜โ•ฐโ”
105
+ โ•ญโ”˜ โ•ฐโ•ฎ โ•ญโ”˜ โ•ฐโ”
106
+ โ•ญโ”˜ โ—  โ•ฐโ”โ•ฏ โ—  โ•ฐโ”
107
+ โ•ญโ”˜ โš™ โ•ฐโ”
108
+ โ•ญโ”˜ โš™ โš™ โš™ โ•ฐโ”
109
+ โ”‚ โš™ โš™ โ”‚
110
+ โ•ฐโ•ฎ โš™ โš™ โ•ญโ•ฏ
111
+ โ•ฐโ•ฎ โ•ญโ•ฏ
112
+ โ•ฐโ•ฎโ”€โ”€โš™โ”€โ”€โ”€โš™โ”€โ”€โš™โ”€โ•ญโ•ฏ
113
+ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
127
114
  `);
128
115
  }
129
116
 
130
117
  /**
131
- * Happy dancing octopus (success state - celebrating)
118
+ * Dancing/celebrating octopus - happy eyes, hearts and stars
132
119
  */
133
120
  export function octopusDancing() {
134
121
  return successGradient.multiline(`
135
- โ–„โ–„โ–„โ–„โ–„
136
- โ–„โ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–„
137
- โ–„โ–ˆโ–€ โ–„โ–„โ–„โ–„โ–„ โ–€โ–ˆโ–„
138
- โ–ˆโ–ˆ โ–ˆ ^ ^ โ–ˆ โ–ˆโ–ˆ
139
- โ–ˆโ–ˆ โ–ˆ โ—ก โ–ˆ โ–ˆโ–ˆ
140
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
141
- โ–ˆโ–ˆ โ•ฒ___โ•ฑ โ–ˆโ–ˆ
142
- โ–ˆโ–ˆ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–ˆโ–ˆ
143
- โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ
144
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
145
- โœฆ โ–„โ–„ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–„โ–„ โœฆ
146
- โ˜… โ–„โ–ˆโ–ˆโ–Œ โ–โ–ˆโ–ˆโ–„ โ˜…
147
- โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–Œ โ•ฒ โ•ฑ โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–„
148
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ•ฒ โ•ฑ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
149
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ•ฒ โ•ฑ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
150
- โ–€โ–ˆโ–ˆโ–ˆโ–ˆ โ•ฒโ•ฑ โ–ˆโ–ˆโ–ˆโ–ˆโ–€
151
- โ–€โ–€โ–Œ โ˜… โ•ฒโ•ฑ โ•ฒโ•ฑ โ˜… โ–โ–€โ–€
152
- โ–ˆ โ•ฒโ•ฑ โ–ˆ
153
- โ–€ โ–€
154
- โ™ฅ โ™ช โ™ฅ โ™ช โ™ฅ
122
+ โ•ญโ”โ”โ”โ”โ”โ”โ”โ”โ”โ•ฎ
123
+ โ•ฑ โ•ฒ
124
+ โ”‚ โ—  โ—  โ”‚
125
+ โ”‚ โ—ก โ”‚
126
+ โ•ฒ___________โ•ฑ
127
+ โ”‚ โ•ฒ___โ•ฑ โ”‚
128
+ โ•ญโ”ค โ”œโ•ฎ
129
+ โœฆ โ•ญโ”˜โ•ฐโ” โ•ญโ”โ”˜โ•ฐโ” โœฆ
130
+ โ•ญโ”โ”โ”โ•ญโ”˜ โ•ฐโ•ฎ โ•ญโ”˜ โ•ฐโ”โ”โ”โ”โ•ฎ
131
+ โ•ญโ”โ”โ”โ•ญโ”˜ โ—  โ•ฐโ”โ•ฏ โ—  โ•ฐโ”โ”โ”โ”โ•ฎ
132
+ โ•ญโ”โ”โ”โ•ญโ”˜ โ•ฐโ”โ”โ”โ”โ•ฎ
133
+ โ•ญโ”โ”โ”โ•ญโ”˜ โ™ฅ โ˜… โ™ฅ โ•ฐโ”โ”โ”โ”โ•ฎ
134
+ โ”‚ โ”‚
135
+ โ•ฐโ•ฎ โ˜… โ™ฅ โ˜… โ™ฅ โ•ญโ•ฏ
136
+ โ•ฐโ•ฎ โ•ญโ•ฏ
137
+ โ˜… โ•ฐโ•ฎ โ™ฅ โ˜… โ™ฅ โ•ญโ•ฏ โ˜…
138
+ โ•ฐโ”€โ˜…โ”€โ”€โ™ฅโ”€โ”€โ”€โ˜…โ”€โ”€โ™ฅโ”€โ”€โ˜…โ•ฏ
139
+ โ™ช โ™ฅ โ™ช
155
140
  `);
156
141
  }
157
142
 
158
143
  /**
159
- * Sad octopus (on errors - drooping tentacles)
144
+ * Sad octopus - drooping tentacles
160
145
  */
161
146
  export function octopusSad() {
162
147
  return errorGradient.multiline(`
163
- โ–„โ–„โ–„โ–„โ–„
164
- โ–„โ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–„
165
- โ–„โ–ˆโ–€ โ–„โ–„โ–„โ–„โ–„ โ–€โ–ˆโ–„
166
- โ–ˆโ–ˆ โ–ˆ . . โ–ˆ โ–ˆโ–ˆ
167
- โ–ˆโ–ˆ โ–ˆ โ–ฝ โ–ˆ โ–ˆโ–ˆ
168
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
169
- โ–ˆโ–ˆ โ•ฒ___โ•ฑ โ–ˆโ–ˆ
170
- โ–ˆโ–ˆ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–ˆโ–ˆ
171
- โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ
172
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
173
- โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€
174
- โ–Ÿโ–™ โ–Ÿโ–™
175
- โ–Ÿโ–ˆโ–ˆโ–ˆโ–™ โ–Ÿโ–ˆโ–ˆโ–ˆโ–™
176
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™ โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
177
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™ โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
178
- โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™ โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€
179
- โ–€โ–€โ–€โ–ˆโ–ˆโ–™โ–Ÿโ–ˆโ–ˆโ–€โ–€โ–€
180
- โ–€โ–€โ–€
148
+ โ•ญโ”โ”โ”โ”โ”โ”โ”โ”โ”โ•ฎ
149
+ โ•ฑ โ•ฒ
150
+ โ”‚ . . โ”‚
151
+ โ”‚ โ•ฒ โ”‚
152
+ โ•ฒ___________โ•ฑ
153
+ โ”‚ โ•ฒ___โ•ฑ โ”‚
154
+ โ•ญโ”ค โ”œโ•ฎ
155
+ โ•ญโ”˜โ•ฐโ” โ•ญโ”โ”˜โ•ฐโ”
156
+ โ•ญโ”โ”˜ โ•ฐโ•ฎ โ•ญโ”˜ โ•ฐโ”โ•—
157
+ โ•ญโ”˜ โ•ฐโ”โ•ฏ โ•ฐโ”
158
+ โ•ญโ”˜ โ•ฐโ”
159
+ โ”‚ โ”‚
160
+ โ•ฐโ•ฎ โ•ญโ•ฏ
161
+ โ•ฐโ•ฎ โ•ญโ•ฏ
162
+ โ•ฐโ•ฎ โ•ญโ•ฏ
163
+ โ•ฐโ•ฎ โ•ญโ•ฏ
164
+ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
181
165
  `);
182
166
  }
183
167
 
184
168
  /**
185
- * Sleeping octopus (idle/loading)
169
+ * Sleeping octopus - zzz floating
186
170
  */
187
171
  export function octopusSleeping() {
188
172
  return brandGradient.multiline(`
189
- โ–„โ–„โ–„โ–„โ–„
190
- โ–„โ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–„
191
- โ–„โ–ˆโ–€ โ–„โ–„โ–„โ–„โ–„ โ–€โ–ˆโ–„
192
- โ–ˆโ–ˆ โ–ˆ - - โ–ˆ โ–ˆโ–ˆ
193
- โ–ˆโ–ˆ โ–ˆ โ–ฌ โ–ˆ โ–ˆโ–ˆ
194
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
195
- โ–ˆโ–ˆ โ•ฒ___โ•ฑ โ–ˆโ–ˆ
196
- โ–ˆโ–ˆ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–ˆโ–ˆ
197
- โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ
198
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
199
- โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„
200
- โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™โ–ˆโ–„
201
- โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™
202
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
203
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
204
- โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€ z
205
- โ–€โ–€โ–€โ–€ zZ
206
- zZZ
173
+ โ•ญโ”โ”โ”โ”โ”โ”โ”โ”โ”โ•ฎ
174
+ โ•ฑ โ•ฒ
175
+ โ”‚ - - โ”‚
176
+ โ”‚ โ–ฌ โ”‚
177
+ โ•ฒ___________โ•ฑ z
178
+ โ”‚ โ•ฒ___โ•ฑ โ”‚ zZ
179
+ โ•ญโ”ค โ”œโ•ฎ zZZ
180
+ โ•ญโ”˜โ•ฐโ” โ•ญโ”โ”˜โ•ฐโ”
181
+ โ•ญโ”˜ โ•ฐโ•ฎ โ•ญโ”˜ โ•ฐโ”
182
+ โ•ญโ”˜ โ•ฐโ”โ•ฏ โ•ฐโ”
183
+ โ•ญโ”˜ z โ•ฐโ”
184
+ โ•ญโ”˜ zZ โ•ฐโ”
185
+ โ”‚ zZZ โ”‚
186
+ โ•ฐโ•ฎ โ•ญโ•ฏ
187
+ โ•ฐโ•ฎ โ•ญโ•ฏ
188
+ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
207
189
  `);
208
190
  }
209
191
 
210
192
  /**
211
- * Octopus typing code (during configuration)
193
+ * Coding octopus - typing on keyboard
212
194
  */
213
195
  export function octopusCoding() {
214
196
  return brandGradient.multiline(`
215
- โ–„โ–„โ–„โ–„โ–„
216
- โ–„โ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–„
217
- โ–„โ–ˆโ–€ โ–„โ–„โ–„โ–„โ–„ โ–€โ–ˆโ–„
218
- โ–ˆโ–ˆ โ–ˆ @ @ โ–ˆ โ–ˆโ–ˆ
219
- โ–ˆโ–ˆ โ–ˆ โ–ผ โ–ˆ โ–ˆโ–ˆ
220
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
221
- โ–ˆโ–ˆ โ•ฒ___โ•ฑ โ–ˆโ–ˆ
222
- โ–ˆโ–ˆ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–ˆโ–ˆ
223
- โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ
224
- โ–ˆโ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆโ–ˆ
225
- โ–Ÿโ–ˆโ–™ โ–„โ–„ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–„โ–„ โ–Ÿโ–ˆโ–™
226
- โ–Ÿโ–ˆโ–ˆโ–ˆโ–™ โ–โ–ˆโ–ˆโ–™ โ–Ÿโ–ˆโ–ˆโ–Œ โ–Ÿโ–ˆโ–ˆโ–ˆโ–™
227
- โ–ˆโ–€โ–€โ–€โ–ˆโ–„ โ–โ–ˆโ–ˆโ–ˆโ–™ โ–Ÿโ–ˆโ–ˆโ–ˆโ–Œ โ–„โ–ˆโ–€โ–€โ–€โ–ˆ
228
- โ–ˆ โ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–™ โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆ โ–ˆ
229
- โ–ˆ โ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™ โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆ โ–ˆ
230
- โ–ˆ โ–โ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–Œ โ–ˆ
231
- โ–ˆ โ–ˆโ–Œ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–โ–ˆ โ–ˆ
232
- โ–โ–ˆ โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€ โ–ˆโ–Œ
233
- โ–ˆ โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ–ˆ
234
- โ–ˆ < / > < / > โ–ˆ
235
- โ–€ โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™ โ–€
197
+ โ•ญโ”โ”โ”โ”โ”โ”โ”โ”โ”โ•ฎ
198
+ โ•ฑ โ•ฒ
199
+ โ”‚ โ—‰ โ—‰ โ”‚
200
+ โ”‚ โ—ก โ”‚
201
+ โ•ฒ___________โ•ฑ
202
+ โ”‚ โ•ฒ___โ•ฑ โ”‚
203
+ โ•ญโ”ค โ”œโ•ฎ
204
+ โ•ญโ”€โ”€โ”€โ•ญโ”˜โ•ฐโ” โ•ญโ”โ”˜โ•ฐโ”โ”€โ”€โ”€โ•ฎ
205
+ โ•ญโ”˜ โ•ญโ”˜ โ•ฐโ•ฎ โ•ญโ”˜ โ•ฐโ” โ•ฐโ”
206
+ โ•ญโ”˜ โ•ญโ”˜ โ—  โ•ฐโ”โ•ฏ โ—  โ•ฐโ” โ•ฐโ”
207
+ โ•ญโ”˜ โ•ญโ”˜ โ•ฐโ” โ•ฐโ”
208
+ โ•ญโ”˜ โ•ญโ”˜ โ•ฐโ” โ•ฐโ”
209
+ โ”‚ โ”‚ [ / / / / ] โ”‚ โ”‚
210
+ โ•ฐโ•ฎ โ•ฐโ•ฎ โ•ญโ•ฏ โ•ญโ•ฏ
211
+ โ•ฐโ•ฎ โ•ฐโ•ฎ โ–“โ–“โ–“โ–“โ–“โ–“โ–“ โ•ญโ•ฏ โ•ญโ•ฏ
212
+ โ•ฐโ•ฎ โ•ฐโ•ฎ โ•ญโ•ฏ โ•ญโ•ฏ
213
+ โ•ฐโ•ฎโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ•ญโ•ฏ
214
+ โ•ฐโ•ฎ โ–“โ–“ โ•ญโ•ฏ
215
+ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
236
216
  `);
237
217
  }
238
218
 
239
219
  /**
240
- * NOITON logo with octopus
220
+ * NOITON wordmark logo with small octopus on top
241
221
  */
242
222
  export function octopusLogo() {
243
223
  return brandGradient.multiline(`
244
- โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™ โ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—
245
- โ–Ÿโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–™ โ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ•šโ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘
246
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘
247
- โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘
248
- โ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–“โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ•šโ•โ–ˆโ–ˆโ–ˆโ•”โ•โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•‘
249
- โ–ˆโ–ˆโ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“ โ•šโ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•
250
- โ–ˆโ–ˆโ–“โ–“โ–“โ–“โ–“โ–“โ–ˆโ–ˆโ–“โ–“โ–“โ–“โ–“โ–“โ–ˆโ–ˆ Universal AI Agent Connector
251
- โ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–“โ–ˆโ–ˆโ–“โ–“โ–“โ–“โ–ˆโ–ˆโ–ˆโ–ˆ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
252
- โ–ˆโ–ˆโ–“โ–“โ–ˆโ–ˆโ–“โ–“โ–ˆโ–ˆโ–“โ–“โ–ˆโ–ˆ
253
- โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
254
- โ–ˆโ–ˆ โ–ˆโ–ˆ โ–ˆโ–ˆ
224
+ โ•ญโ”โ”โ”โ”โ”โ•ฎ
225
+ โ•ฑ โ—‰ โ—‰ โ•ฒ
226
+ โ”‚ โ—ก โ”‚
227
+ โ•ฒ_______โ•ฑ
228
+ โ•ญโ•ฏ โ•ฐโ•ฎ
229
+ โ•ญโ”˜ โ—  โ—  โ•ฐโ”
230
+ โ•ฐโ•ฎ โ™ฅ โ•ญโ•ฏ
231
+ โ•ฐโ”€โ”€โ”€โ•ฏ
232
+
233
+ โ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—
234
+ โ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ•šโ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘
235
+ โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘
236
+ โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘
237
+ โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•‘
238
+ โ•šโ•โ• โ•šโ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•
255
239
  `);
256
240
  }
257
241
 
@@ -259,14 +243,12 @@ export function octopusLogo() {
259
243
  * Get a random octopus pose
260
244
  */
261
245
  export function randomOctopus() {
262
- const poses = [octopusHappy, octopusDancing, octopusCoding, octopusSleeping];
263
- const pick = poses[Math.floor(Math.random() * poses.length)];
264
- return pick();
246
+ const poses = [octopusHappy, octopusDancing, octopusCoding];
247
+ return poses[Math.floor(Math.random() * poses.length)]();
265
248
  }
266
249
 
267
250
  export {
268
251
  brandGradient,
269
252
  successGradient,
270
253
  errorGradient,
271
- warningGradient,
272
254
  };
package/src/ui.js CHANGED
@@ -181,6 +181,40 @@ export function clear() {
181
181
  process.stdout.write("\x1B[2J\x1B[3J\x1B[H");
182
182
  }
183
183
 
184
+ // ============= SLEEP =============
185
+
186
+ /**
187
+ * Pause execution for ms milliseconds.
188
+ * @param {number} ms
189
+ * @returns {Promise<void>}
190
+ */
191
+ export function sleep(ms) {
192
+ return new Promise((resolve) => setTimeout(resolve, ms));
193
+ }
194
+
195
+ /**
196
+ * Type out text character by character (typewriter effect).
197
+ * @param {string} text
198
+ * @param {number} [delay=8] - ms per char
199
+ */
200
+ export async function typeOut(text, delay = 8) {
201
+ for (const ch of text) {
202
+ process.stdout.write(ch);
203
+ await sleep(delay);
204
+ }
205
+ process.stdout.write("\n");
206
+ }
207
+
208
+ /**
209
+ * Print a line with a small delay (feels like "thinking").
210
+ * @param {string} text
211
+ * @param {number} [delay=150]
212
+ */
213
+ export async function line(text, delay = 150) {
214
+ await sleep(delay);
215
+ console.log(text);
216
+ }
217
+
184
218
  // ============= HEADER (small) =============
185
219
 
186
220
  /**