@neetru/cli 2.12.6 → 2.12.8

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.
@@ -0,0 +1,599 @@
1
+ /**
2
+ * Submenu de Chat — integrado ao menu interativo do CLI (`neetru` sem args).
3
+ *
4
+ * Exporta `runChatMenu()` que `ui.ts` chama quando o usuário seleciona "Chat"
5
+ * no menu principal.
6
+ *
7
+ * Fluxo:
8
+ * runChatMenu()
9
+ * └─ promptSubMenu "Chat"
10
+ * ├─ "Listar canais" → lista + seleciona → entrar no canal
11
+ * ├─ "Entrar em canal" → digita id ou escolhe → loop interativo
12
+ * ├─ "Abrir canal novo" → prompt nome/tipo → cria
13
+ * ├─ "Fechar canal" → prompt id → fecha (bloqueia 'global')
14
+ * └─ "Voltar"
15
+ *
16
+ * Loop interativo de canal (entrar em canal):
17
+ * - Exibe histórico das últimas 24h ao entrar.
18
+ * - readline pra enviar mensagem (Enter envia; linha em branco sai; Ctrl-C sai).
19
+ * - Ao sair volta pro submenu de chat.
20
+ *
21
+ * Ciclo de vida do stdin:
22
+ * - O `promptSubMenu` de `ui.ts` deixa o stdin "quente" (raw) antes de chamar
23
+ * `runChatMenu`. O loop interativo de canal usa `createInterface` (readline)
24
+ * que funciona sem raw mode. Antes de abrir o readline saímos do raw mode e
25
+ * restauramos ao terminar — padrão igual ao usado em `runChatLoop` de chat.ts.
26
+ * - `runChatMenu` NUNCA chama `process.exit` diretamente — a blindagem de
27
+ * `runTerminalUi` substitui `process.exit` por throw.
28
+ */
29
+ import chalk from 'chalk';
30
+ import ora from 'ora';
31
+ import inquirer from 'inquirer';
32
+ import { createInterface } from 'node:readline';
33
+ import { apiRequest } from '../lib/api-client.js';
34
+ import { resolveToken } from '../lib/cli-read.js';
35
+ import { log } from '../utils/logger.js';
36
+ import { fmtTimestamp } from '../lib/render.js';
37
+ // ─── Helpers de display ───────────────────────────────────────────────────────
38
+ function channelTypeLabel(type) {
39
+ if (type === 'global')
40
+ return chalk.cyan('global');
41
+ if (type === 'product')
42
+ return chalk.blue('produto');
43
+ return chalk.dim('custom');
44
+ }
45
+ function channelTypeLabelPlain(type) {
46
+ if (type === 'global')
47
+ return 'global';
48
+ if (type === 'product')
49
+ return 'produto';
50
+ return 'custom';
51
+ }
52
+ /** Converte createdAt (Timestamp, string, number, ou unknown) em milissegundos. */
53
+ function toMillis(value) {
54
+ if (!value)
55
+ return 0;
56
+ if (typeof value === 'number')
57
+ return value;
58
+ if (typeof value === 'string')
59
+ return Date.parse(value) || 0;
60
+ // Firestore Timestamp-like: { seconds, nanoseconds }
61
+ if (typeof value === 'object' && value !== null) {
62
+ const obj = value;
63
+ if (typeof obj['seconds'] === 'number')
64
+ return obj['seconds'] * 1000;
65
+ if (typeof obj['_seconds'] === 'number')
66
+ return obj['_seconds'] * 1000;
67
+ // Instância com método toMillis()
68
+ if (typeof obj.toMillis === 'function') {
69
+ return obj.toMillis();
70
+ }
71
+ }
72
+ return 0;
73
+ }
74
+ /** Formata createdAt como HH:MM (hora local curta). */
75
+ function fmtHHMM(value) {
76
+ const ms = toMillis(value);
77
+ if (!ms)
78
+ return '--:--';
79
+ const d = new Date(ms);
80
+ return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
81
+ }
82
+ function colorRole(role) {
83
+ if (role === 'operator')
84
+ return chalk.green('operador');
85
+ return chalk.cyan('dev');
86
+ }
87
+ function colorRoleSystem() {
88
+ return chalk.gray('sistema');
89
+ }
90
+ function actorLabel(msg) {
91
+ const email = msg.author?.email ?? msg.author?.actorId ?? '?';
92
+ const type = msg.author?.actorType ?? 'cli';
93
+ if (type === 'agent_claude')
94
+ return chalk.magenta(`[IA] ${email}`);
95
+ if (type === 'human') {
96
+ if (msg.role === 'operator')
97
+ return chalk.green(email);
98
+ return chalk.cyan(email);
99
+ }
100
+ // cli / sistema
101
+ return chalk.gray(`[cli] ${email}`);
102
+ }
103
+ /** Imprime uma mensagem individual com layout caprichado. */
104
+ function printMessage(msg) {
105
+ const ts = chalk.dim(fmtHHMM(msg.createdAt));
106
+ const type = msg.author?.actorType ?? 'cli';
107
+ const roleTag = type === 'agent_claude'
108
+ ? colorRoleSystem()
109
+ : colorRole(msg.role);
110
+ const actor = actorLabel(msg);
111
+ // Linha de cabeçalho: timestamp + role + autor
112
+ process.stdout.write(`${ts} ${roleTag} ${actor}\n`);
113
+ // Corpo indentado
114
+ const lines = msg.body.split('\n');
115
+ for (const l of lines) {
116
+ process.stdout.write(` ${l}\n`);
117
+ }
118
+ process.stdout.write('\n');
119
+ }
120
+ function printChannel(ch) {
121
+ const tag = channelTypeLabel(ch.type);
122
+ const slug = ch.productSlug ? chalk.dim(` (${ch.productSlug})`) : '';
123
+ const lastMsg = ch.lastMessageAt
124
+ ? chalk.dim(` última msg: ${fmtTimestamp(ch.lastMessageAt)}`)
125
+ : '';
126
+ console.log(` ${chalk.bold(ch.name)}${slug} ${tag} ${chalk.dim(ch.id)}${lastMsg}`);
127
+ }
128
+ // ─── API helpers ──────────────────────────────────────────────────────────────
129
+ async function fetchChannels(token) {
130
+ const res = await apiRequest('/api/cli/v1/chat/channels', { token });
131
+ return res.channels ?? [];
132
+ }
133
+ async function fetchMessages(token, channelId, sinceHours = 24) {
134
+ const qs = new URLSearchParams({ channelId, sinceHours: String(sinceHours) });
135
+ const res = await apiRequest(`/api/cli/v1/chat?${qs.toString()}`, { token });
136
+ return res.messages ?? [];
137
+ }
138
+ async function postMessage(token, channelId, text) {
139
+ const res = await apiRequest('/api/cli/v1/chat', {
140
+ method: 'POST',
141
+ token,
142
+ body: { channelId, message: text, actorType: 'cli' },
143
+ });
144
+ return res.id;
145
+ }
146
+ async function createChannel(token, name, type, productSlug) {
147
+ const res = await apiRequest('/api/cli/v1/chat/channels', {
148
+ method: 'POST',
149
+ token,
150
+ body: { name, type, ...(productSlug ? { productSlug } : {}) },
151
+ });
152
+ return res.id;
153
+ }
154
+ async function closeChannel(token, channelId) {
155
+ await apiRequest(`/api/cli/v1/chat/channels/${channelId}/close`, {
156
+ method: 'POST',
157
+ token,
158
+ body: {},
159
+ });
160
+ }
161
+ // ─── Loop interativo de canal ─────────────────────────────────────────────────
162
+ /** Largura da linha divisória ajustada ao terminal (máx 72). */
163
+ function divider(width = 72) {
164
+ const w = Math.min(width, process.stdout.columns ?? width);
165
+ return chalk.dim('─'.repeat(w));
166
+ }
167
+ /**
168
+ * Entra no loop de mensagens de um canal. Mostra histórico das últimas 24h,
169
+ * depois readline pra enviar mensagens. Linha em branco ou Ctrl-C volta pro
170
+ * menu de chat.
171
+ *
172
+ * Polling real-time: timer a cada ~2.5s busca mensagens novas (dedup por id).
173
+ * As mensagens novas são impressas ACIMA do prompt readline (re-escrevendo a
174
+ * linha de input) de forma não-intrusiva. Timer é limpo no cleanup.
175
+ *
176
+ * Gerencia raw mode: desativa raw ao entrar (readline precisa de modo canônico)
177
+ * e restaura ao sair.
178
+ */
179
+ async function runChannelLoop(token, channel) {
180
+ const POLL_INTERVAL_MS = 2500;
181
+ // `wasRaw` capturado ANTES do try pra o finally restaurar o estado correto.
182
+ const wasRaw = process.stdin.isRaw === true;
183
+ let pollTimer = null;
184
+ try {
185
+ // Sai do raw mode pra readline funcionar. DENTRO do try: se setRawMode
186
+ // lançar (ex.: TTY destacado, EIO/ENOTTY), o finally ainda roda e limpa o
187
+ // pollTimer + restaura raw. (verifier LOW 2026-06-12)
188
+ if (typeof process.stdin.setRawMode === 'function') {
189
+ process.stdin.setRawMode(false);
190
+ }
191
+ process.stdout.write('\x1B[?25h'); // mostra cursor
192
+ // ── Limpa a tela e imprime o header do canal ──────────────────────────
193
+ process.stdout.write('\x1B[2J\x1B[H'); // clear screen, cursor ao topo
194
+ const typeLabel = channelTypeLabelPlain(channel.type);
195
+ const headerLine = ` ${chalk.bold.cyan(channel.name)}` +
196
+ ` ${chalk.dim(`[${typeLabel}]`)}` +
197
+ (channel.productSlug ? chalk.dim(` produto: ${channel.productSlug}`) : '') +
198
+ ` ${chalk.dim(channel.id)}`;
199
+ process.stdout.write(`\n${divider()}\n`);
200
+ process.stdout.write(`${headerLine}\n`);
201
+ process.stdout.write(`${divider()}\n`);
202
+ process.stdout.write(chalk.dim(' Ctrl-C ou linha em branco para sair · mensagens novas aparecem automaticamente\n'));
203
+ process.stdout.write(`${divider()}\n\n`);
204
+ // ── Carrega histórico das últimas 24h ─────────────────────────────────
205
+ const spinner = ora({ text: 'Carregando histórico…', color: 'cyan' }).start();
206
+ let messages = [];
207
+ try {
208
+ messages = await fetchMessages(token, channel.id);
209
+ spinner.stop();
210
+ }
211
+ catch {
212
+ spinner.fail('Falha ao carregar histórico — continuando sem ele.');
213
+ }
214
+ // Conjunto de IDs já vistos (dedup do polling)
215
+ const seenIds = new Set(messages.map((m) => m.id));
216
+ if (messages.length > 0) {
217
+ process.stdout.write(chalk.dim(` Últimas 24h — ${messages.length} mensagem(ns):\n\n`));
218
+ for (const msg of messages)
219
+ printMessage(msg);
220
+ }
221
+ else {
222
+ process.stdout.write(chalk.dim(' Nenhuma mensagem nas últimas 24h.\n\n'));
223
+ }
224
+ if (!process.stdin.isTTY) {
225
+ log.error('Terminal não-interativo — não é possível enviar mensagens aqui.');
226
+ return;
227
+ }
228
+ // ── Readline de input ─────────────────────────────────────────────────
229
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
230
+ /**
231
+ * Imprime mensagens novas sem quebrar o prompt do readline.
232
+ * Estratégia: apaga a linha do prompt atual (ANSI), imprime as msgs,
233
+ * depois re-escreve o prompt. Degradação graciosa em terminais sem ANSI.
234
+ */
235
+ const printNewMessages = (newMsgs) => {
236
+ if (newMsgs.length === 0)
237
+ return;
238
+ // Apaga a linha do prompt atual
239
+ process.stdout.write('\r\x1B[K');
240
+ for (const msg of newMsgs)
241
+ printMessage(msg);
242
+ // Re-escreve o prompt + re-ecoa o que o usuário já digitou (rl.line) pra
243
+ // mensagens novas não apagarem visualmente a digitação em curso. O buffer
244
+ // do readline nunca é perdido; isto só repinta a linha. (verifier LOW)
245
+ process.stdout.write(chalk.cyan('> ') + (rl.line ?? ''));
246
+ };
247
+ // ── Timer de polling ──────────────────────────────────────────────────
248
+ let pollActive = true;
249
+ pollTimer = setInterval(() => {
250
+ if (!pollActive)
251
+ return;
252
+ fetchMessages(token, channel.id)
253
+ .then((all) => {
254
+ if (!pollActive)
255
+ return;
256
+ const newMsgs = all.filter((m) => !seenIds.has(m.id));
257
+ if (newMsgs.length > 0) {
258
+ // Ordena por createdAt antes de exibir
259
+ newMsgs.sort((a, b) => toMillis(a.createdAt) - toMillis(b.createdAt));
260
+ for (const m of newMsgs)
261
+ seenIds.add(m.id);
262
+ printNewMessages(newMsgs);
263
+ }
264
+ })
265
+ .catch(() => {
266
+ // Silencia erros de polling — não interrompe o uso
267
+ });
268
+ }, POLL_INTERVAL_MS);
269
+ // ── Loop de input ─────────────────────────────────────────────────────
270
+ const askLine = () => new Promise((resolve) => {
271
+ rl.question(chalk.cyan('> '), (answer) => resolve(answer.trim()));
272
+ });
273
+ // eslint-disable-next-line no-constant-condition
274
+ while (true) {
275
+ let line;
276
+ try {
277
+ line = await askLine();
278
+ }
279
+ catch {
280
+ // Ctrl-C ou fechamento do stream
281
+ break;
282
+ }
283
+ if (!line)
284
+ break;
285
+ const sendSpinner = ora({ text: 'Enviando…', color: 'cyan' }).start();
286
+ try {
287
+ const id = await postMessage(token, channel.id, line);
288
+ sendSpinner.stop();
289
+ // Adiciona o id ao seenIds para o polling não reexibir a própria msg
290
+ seenIds.add(id);
291
+ // Confirmação discreta inline
292
+ process.stdout.write(chalk.dim(` ✓ enviado\n\n`));
293
+ }
294
+ catch (error) {
295
+ sendSpinner.fail('Falha ao enviar.');
296
+ if (error instanceof Error) {
297
+ process.stdout.write(chalk.red(` ${error.message}\n`));
298
+ }
299
+ // Não encerra o loop — permite tentar de novo
300
+ }
301
+ }
302
+ pollActive = false;
303
+ rl.close();
304
+ process.stdout.write(chalk.dim('\n (Saindo do canal…)\n\n'));
305
+ }
306
+ finally {
307
+ // Para o timer de polling
308
+ if (pollTimer !== null) {
309
+ clearInterval(pollTimer);
310
+ pollTimer = null;
311
+ }
312
+ // Restaura raw mode pro menu retomar corretamente
313
+ if (typeof process.stdin.setRawMode === 'function') {
314
+ process.stdin.setRawMode(wasRaw);
315
+ }
316
+ process.stdin.resume();
317
+ }
318
+ }
319
+ // ─── Submenu: listar canais e selecionar ─────────────────────────────────────
320
+ /**
321
+ * Lista canais, exibe tabela, e oferece seleção via inquirer (modo não-raw).
322
+ * Retorna o canal selecionado ou `null` se o usuário cancelou.
323
+ */
324
+ async function promptSelectChannel(token, channels) {
325
+ if (channels.length === 0) {
326
+ log.dim('Nenhum canal aberto encontrado.');
327
+ return null;
328
+ }
329
+ console.log();
330
+ console.log(chalk.bold('Canais disponíveis:\n'));
331
+ for (const ch of channels)
332
+ printChannel(ch);
333
+ console.log();
334
+ const choices = [
335
+ ...channels.map((ch) => ({
336
+ name: `${chalk.bold(ch.name)} ${channelTypeLabel(ch.type)} ${chalk.dim(ch.id)}`,
337
+ value: ch.id,
338
+ short: ch.name,
339
+ })),
340
+ { name: chalk.dim('Cancelar'), value: '__cancel__', short: 'Cancelar' },
341
+ ];
342
+ const { selected } = await inquirer.prompt([
343
+ {
344
+ type: 'list',
345
+ name: 'selected',
346
+ message: 'Selecione um canal:',
347
+ choices,
348
+ },
349
+ ]);
350
+ if (selected === '__cancel__')
351
+ return null;
352
+ return channels.find((ch) => ch.id === selected) ?? null;
353
+ }
354
+ // ─── Submenu: criar canal ─────────────────────────────────────────────────────
355
+ async function promptCreateChannel(token) {
356
+ const { name, type } = await inquirer.prompt([
357
+ {
358
+ type: 'input',
359
+ name: 'name',
360
+ message: 'Nome do canal:',
361
+ validate: (v) => v.trim().length > 0 || 'Obrigatório.',
362
+ },
363
+ {
364
+ type: 'list',
365
+ name: 'type',
366
+ message: 'Tipo do canal:',
367
+ choices: [
368
+ { name: 'Produto (vinculado a um produto Neetru)', value: 'product', short: 'produto' },
369
+ { name: 'Geral (sem produto específico)', value: 'custom', short: 'geral' },
370
+ ],
371
+ },
372
+ ]);
373
+ let productSlug;
374
+ if (type === 'product') {
375
+ const ans = await inquirer.prompt([
376
+ {
377
+ type: 'input',
378
+ name: 'slug',
379
+ message: 'Slug do produto (ex: pdv-agiliza):',
380
+ validate: (v) => v.trim().length > 0 || 'Obrigatório.',
381
+ },
382
+ ]);
383
+ productSlug = ans.slug.trim();
384
+ }
385
+ const spinner = ora({ text: 'Criando canal…', color: 'blue' }).start();
386
+ try {
387
+ const id = await createChannel(token, name.trim(), type, productSlug);
388
+ spinner.stop();
389
+ log.success(`Canal criado com sucesso (id: ${id})`);
390
+ }
391
+ catch (error) {
392
+ spinner.fail('Falha ao criar canal.');
393
+ if (error instanceof Error)
394
+ console.error(chalk.red(` ${error.message}`));
395
+ }
396
+ }
397
+ // ─── Submenu: fechar canal ────────────────────────────────────────────────────
398
+ async function promptCloseChannel(token, channels) {
399
+ const closeable = channels.filter((ch) => ch.id !== 'global');
400
+ if (closeable.length === 0) {
401
+ log.dim('Nenhum canal disponível para fechar (o canal Global nunca pode ser fechado).');
402
+ return;
403
+ }
404
+ const choices = [
405
+ ...closeable.map((ch) => ({
406
+ name: `${chalk.bold(ch.name)} ${channelTypeLabel(ch.type)} ${chalk.dim(ch.id)}`,
407
+ value: ch.id,
408
+ short: ch.name,
409
+ })),
410
+ { name: chalk.dim('Cancelar'), value: '__cancel__', short: 'Cancelar' },
411
+ ];
412
+ const { channelId } = await inquirer.prompt([
413
+ {
414
+ type: 'list',
415
+ name: 'channelId',
416
+ message: 'Qual canal fechar?',
417
+ choices,
418
+ },
419
+ ]);
420
+ if (channelId === '__cancel__')
421
+ return;
422
+ const { confirm } = await inquirer.prompt([
423
+ {
424
+ type: 'confirm',
425
+ name: 'confirm',
426
+ message: `Confirma fechar o canal "${closeable.find((c) => c.id === channelId)?.name ?? channelId}"?`,
427
+ default: false,
428
+ },
429
+ ]);
430
+ if (!confirm) {
431
+ log.dim('Operação cancelada.');
432
+ return;
433
+ }
434
+ const spinner = ora({ text: 'Fechando canal…', color: 'blue' }).start();
435
+ try {
436
+ await closeChannel(token, channelId);
437
+ spinner.stop();
438
+ log.success('Canal fechado.');
439
+ }
440
+ catch (error) {
441
+ spinner.fail('Falha ao fechar canal.');
442
+ if (error instanceof Error)
443
+ console.error(chalk.red(` ${error.message}`));
444
+ }
445
+ }
446
+ // ─── Entrada principal do submenu de chat ─────────────────────────────────────
447
+ /**
448
+ * Submenu raiz de Chat. Chamado por `runTerminalUi` em `ui.ts`.
449
+ *
450
+ * Usa o `promptSubMenu` de `ui.ts` indiretamente por reimplementação local
451
+ * que delega ao `inquirer` list (mode não-raw) — compatível com o ciclo de
452
+ * vida do menu principal, que passa o controle com stdin "quente".
453
+ *
454
+ * O loop `for (;;)` mantém o submenu ativo até o usuário escolher "Voltar".
455
+ */
456
+ export async function runChatMenu() {
457
+ const token = await resolveToken();
458
+ if (!token) {
459
+ log.error('Sessão não encontrada. Faça login com `neetru login`.');
460
+ return;
461
+ }
462
+ for (;;) {
463
+ // Carrega canais pra ter a lista disponível nas ações que precisam.
464
+ //
465
+ // BUG owner 2026-06-12: o spinner era declarado DENTRO do try e parado só
466
+ // na linha após `fetchChannels`. Se a chamada lançasse (ex.: Core
467
+ // atualizando → 404 no /chat/channels), o `spinner.stop()` era pulado e o
468
+ // ora continuava redesenhando o frame "⠋ Carregando canais…" por cima do
469
+ // próximo prompt do inquirer — escondendo a pergunta e poluindo a tela.
470
+ // Fix: spinner FORA do try, parado SEMPRE no finally; falha vira aviso.
471
+ let channels = [];
472
+ let loadFailed = false;
473
+ const loadSpinner = ora({ text: 'Carregando canais…', color: 'blue' }).start();
474
+ try {
475
+ channels = await fetchChannels(token);
476
+ }
477
+ catch {
478
+ loadFailed = true;
479
+ }
480
+ finally {
481
+ loadSpinner.stop();
482
+ }
483
+ // Resumo rápido no topo do submenu
484
+ console.log();
485
+ if (loadFailed) {
486
+ console.log(chalk.yellow('Chat') +
487
+ chalk.dim(' — não foi possível carregar os canais agora ' +
488
+ '(o Core pode estar atualizando). As ações abaixo ainda funcionam; ' +
489
+ 'tente listar de novo em instantes.'));
490
+ }
491
+ else if (channels.length > 0) {
492
+ const globalCh = channels.find((c) => c.id === 'global');
493
+ console.log(chalk.bold('Chat — canais abertos: ') +
494
+ chalk.cyan(String(channels.length)) +
495
+ (globalCh ? chalk.dim(' (global disponível)') : ''));
496
+ }
497
+ else {
498
+ console.log(chalk.bold('Chat'));
499
+ }
500
+ console.log();
501
+ const { action } = await inquirer.prompt([
502
+ {
503
+ type: 'list',
504
+ name: 'action',
505
+ message: 'Chat — o que deseja fazer?',
506
+ choices: [
507
+ {
508
+ name: `${chalk.bold.cyan('Entrar no canal Global')} ${chalk.dim('— canal fixo, permanente, todos conversam')}`,
509
+ value: 'global',
510
+ short: 'Global',
511
+ },
512
+ {
513
+ name: `${chalk.bold('Listar canais')} ${chalk.dim('— ver lista e entrar num canal')}`,
514
+ value: 'list',
515
+ short: 'Listar canais',
516
+ },
517
+ {
518
+ name: `${chalk.bold('Entrar em canal')} ${chalk.dim('— digitar id ou escolher')}`,
519
+ value: 'enter',
520
+ short: 'Entrar em canal',
521
+ },
522
+ {
523
+ name: `${chalk.bold('Abrir canal novo')} ${chalk.dim('— criar canal de produto ou geral')}`,
524
+ value: 'new',
525
+ short: 'Abrir canal novo',
526
+ },
527
+ {
528
+ name: `${chalk.bold('Fechar canal')} ${chalk.dim('— marcar canal como encerrado')}`,
529
+ value: 'close',
530
+ short: 'Fechar canal',
531
+ },
532
+ {
533
+ name: chalk.dim('Voltar'),
534
+ value: 'back',
535
+ short: 'Voltar',
536
+ },
537
+ ],
538
+ },
539
+ ]);
540
+ if (action === 'back')
541
+ return;
542
+ if (action === 'global') {
543
+ // Entra DIRETO no canal global, sem depender da listagem (que pode
544
+ // estar 404 enquanto o Core atualiza). O canal global é fixo e
545
+ // permanente — usa o endpoint de mensagens (/chat) que já está LIVE.
546
+ // Reusa o doc real da lista se disponível; senão um sintético.
547
+ const realGlobal = channels.find((c) => c.id === 'global');
548
+ const globalChannel = realGlobal ?? { id: 'global', name: 'Global', type: 'global' };
549
+ await runChannelLoop(token, globalChannel);
550
+ continue;
551
+ }
552
+ if (action === 'list') {
553
+ if (channels.length === 0) {
554
+ log.dim('Nenhum canal aberto. Use "Abrir canal novo" pra criar um.');
555
+ continue;
556
+ }
557
+ const selected = await promptSelectChannel(token, channels);
558
+ if (selected) {
559
+ await runChannelLoop(token, selected);
560
+ }
561
+ continue;
562
+ }
563
+ if (action === 'enter') {
564
+ if (channels.length > 0) {
565
+ // Oferece seleção visual quando há canais disponíveis
566
+ const selected = await promptSelectChannel(token, channels);
567
+ if (selected) {
568
+ await runChannelLoop(token, selected);
569
+ }
570
+ }
571
+ else {
572
+ // Sem canais: pede o id manualmente
573
+ const { channelId } = await inquirer.prompt([
574
+ {
575
+ type: 'input',
576
+ name: 'channelId',
577
+ message: 'ID do canal (ex: global):',
578
+ validate: (v) => v.trim().length > 0 || 'Obrigatório.',
579
+ },
580
+ ]);
581
+ const id = channelId.trim();
582
+ // Canal sintético com mínimo de info pra entrar no loop
583
+ const synthetic = { id, name: id, type: 'custom' };
584
+ await runChannelLoop(token, synthetic);
585
+ }
586
+ continue;
587
+ }
588
+ if (action === 'new') {
589
+ await promptCreateChannel(token);
590
+ // Depois de criar, volta ao loop pra atualizar a lista
591
+ continue;
592
+ }
593
+ if (action === 'close') {
594
+ await promptCloseChannel(token, channels);
595
+ continue;
596
+ }
597
+ }
598
+ }
599
+ //# sourceMappingURL=chat-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-menu.js","sourceRoot":"","sources":["../../src/commands/chat-menu.ts"],"names":[],"mappings":"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"}