Quando o modelo precisa de uma decisão sua — qual abordagem seguir, qual alvo usar, confirmar um plano — em vez de escrever “me diga A ou B” em texto solto, ele chama a ferramenta ask_user (@ask). Você responde num overlay interativo (Bubble Tea, o mesmo motor do command palette) e as seleções voltam estruturadas ao modelo no mesmo turno. É o equivalente ao AskUserQuestion do Claude Code.
Onde funciona
| Modo | Disponível | Observação |
|---|
Agent (/agent) | ✅ | Junto das demais tools (nativo ou via XML) |
Coder (/coder) | ✅ | Idem, sob a mesma política de segurança |
| Chat | ✅ (exceção controlada) | Chat é tool-less por design; abre exceção apenas para ask_user e para a consulta read-only à knowledge base, nunca para tools de execução |
A interface
Cada chamada traz de 1 a 6 perguntas. Para cada pergunta:
- um cabeçalho curto e o texto da pergunta;
- uma lista de opções (rótulo + descrição);
- single-select (radio
(•)) ou multi-select (checkbox [x]);
- uma linha “Other” para digitar uma resposta livre.
Controles
| Tecla | Ação |
|---|
↑ / ↓ | Move o cursor |
espaço | Marca/desmarca (multi) · marca o radio (single) · foca o campo “Other” |
enter | Confirma a pergunta e avança (finaliza após a última) |
esc | Volta à pergunta anterior · cancela na primeira |
| digitar | Preenche o campo “Other” (quando focado) |
[1/2] Banco de dados
Qual banco devo usar?
❯ (•) Postgres Relacional, ACID
( ) SQLite Embarcado, zero-config
[+] Other (digite uma resposta)…
↑/↓ mover · espaço/enter selecionar · esc voltar/cancelar
Single vs múltipla escolha
Quem decide é o modelo, por pergunta, através do campo multiSelect:
multiSelect: false (ou omitido) → escolha única (radios).
multiSelect: true → múltipla escolha (checkboxes [x]); o espaço marca/desmarca vários e o enter confirma o conjunto.
Para induzir múltipla escolha, basta pedir: “me pergunte, permitindo múltipla escolha, quais ambientes…”.
Exceção no modo chat
O modo chat é tool-less por design — ele nunca executa tools. As exceções sancionadas são duas, ambas inofensivas por construção: o ask_user (interativa) e a consulta read-only à knowledge base (/config chat knowledge). Quando habilitadas, o chat oferece exclusivamente essas ferramentas (nenhuma de leitura de arquivos/escrita/execução).
Funciona com qualquer provider:
- Providers com tools nativas (Claude por API key, OpenAI…): turno de decisão estruturado.
- Providers sem tools nativas (ex.: Claude em modo OAuth): turno de decisão via XML, com o formato injetado e o markup suprimido antes de chegar à tela.
Em ambos os casos, depois que você responde, o mesmo spinner do prompt do turno normal aparece enquanto a IA elabora a resposta final.
Ligar/desligar
A exceção do chat vem ligada por padrão e pode ser controlada em runtime:
/config chat # status: modo (native/XML) e se está ativo
/config chat ask on # ativa
/config chat ask off # desativa (chat volta 100% sem tools)
/config chat ask toggle # inverte
Para um padrão permanente, defina no .env:
CHATCLI_CHAT_ASK=true # (padrão) ou false para desligar
Com a exceção ligada, cada turno de chat passa por um turno de decisão buffered (necessário para detectar/suprimir a chamada antes de exibi-la). Se preferir o streaming token-a-token no dia a dia, use /config chat ask off.
Contextos não-interativos
Em execução desassistida (gateway/daemon), pipe ou one-shot (-p) não há terminal para o overlay. Nesses casos o ask_user não trava: retorna a primeira opção de cada pergunta como fallback determinístico, deixando claro que foi auto-selecionado, e o fluxo segue.
Resultado para o modelo
A resposta volta como um resumo legível seguido de um bloco JSON canônico, para que tanto modelos fracos quanto fortes interpretem sem ambiguidade:
User answered:
- Banco de dados → Postgres
- Ambientes → staging, prod
{"answers":[
{"header":"Banco de dados","selected":["Postgres"],"other":""},
{"header":"Ambientes","selected":["staging","prod"],"other":""}
]}
Cancelar (Esc) não é erro: o modelo recebe um aviso de que você não respondeu e segue com defaults razoáveis ou pergunta de novo em texto.
Veja também