Skip to content

feat(ask): calendário ao vivo p/ perguntas de agenda + indicador 'Zinom digitando'#161

Merged
BrunooMoniz merged 2 commits into
mainfrom
feat/ask-calendar
Jun 19, 2026
Merged

feat(ask): calendário ao vivo p/ perguntas de agenda + indicador 'Zinom digitando'#161
BrunooMoniz merged 2 commits into
mainfrom
feat/ask-calendar

Conversation

@BrunooMoniz

Copy link
Copy Markdown
Owner

Feedback do Bruno (screenshots): perguntas de agenda eram respondidas via brain_search do snapshot indexado (devia ser uma consulta direta/ao vivo ao calendário), e o chat não mostrava que estava gerando.

A — Calendário AO VIVO (backend, ask.ts): quando isCalendarIntent(pergunta), o Consultar busca os eventos dos feeds iCal do usuário ao vivo (fetchIcsCalendarDocuments) na janela pedida (parseAskWindow: hoje/amanhã/semana/default 14d), e responde só com eles via generateAnswer (assinatura), citando [n]. Fallback: sem iCal → busca normal; janela vazia → resposta honesta. route fica 'search' (sem mudança de contrato do front). (Google OAuth ao vivo é owner-only — fica como extra; friends usam iCal.)
B — Indicador 'Zinom está digitando' (frontend): Thread mostra o cabeçalho Zinom + 'digitando…' animado enquanto a /portal/ask está em voo (busy + última msg = user), role=status/aria-live.

1467 testes engine + 255 web verdes; typecheck + build + base-path build OK.

🤖 Generated with Claude Code

BrunooMoniz and others added 2 commits June 19, 2026 15:15
…ultar

Perguntas de agenda/calendário no /portal/ask agora fazem fetch on-demand
dos feeds iCal que o usuário configurou, em vez de varrer o cérebro com
brain_search. Mais direto e exato. Fallback: conta sem iCal cai na busca
normal; iCal mas zero eventos na janela responde honestamente.

- isCalendarIntent(q): detector conservador (termos fortes calendário/agenda/
  compromisso disparam sozinhos; evento/reunião só com cue temporal ou 'tenho').
- parseAskWindow(q, now): hoje/amanhã/semana(7d)/default(14d).
- AskDeps.loadIcalConfigs + fetchLiveCalendar (injetáveis, sem rede no teste).
- Rota reusa generateAnswer (assinatura→central→degradado) com CALENDAR_SYSTEM;
  route fica 'search' (front só conhece meta/search); credit gate + recordUsage.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
O chat Consultar não sinalizava que a resposta estava sendo gerada, dando
impressão de travado enquanto a requisição /portal/ask estava em voo.

Adiciona um TypingIndicator com o mesmo cabeçalho visual de uma resposta do
Zinom (ZinomLogo + label "ZINOM") e um "Zinom está digitando…" com pontinhos
pulsando (animate-pulse, tokens text-faint/bg-faint já existentes). Renderizado
no Thread logo antes do endRef, só quando busy=true E a última mensagem é do
usuário (esperando o turno do assistente); some quando busy=false e a resposta
é renderizada. aria-live=polite via role=status pra leitores de tela.
O auto-scroll (endRef) inclui o indicador na dependência do efeito.

Teste de componente novo (Thread.test.tsx): indicador aparece com busy=true +
última msg user; ausente com busy=false e após a resposta do assistente.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@BrunooMoniz BrunooMoniz merged commit 2cfb4cf into main Jun 19, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant