feat(ask): calendário ao vivo p/ perguntas de agenda + indicador 'Zinom digitando'#161
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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