# Wiki Log Chronological, append-only record of everything that's happened in this wiki. **Format:** ``` ## [YYYY-MM-DD HH:MM] | <optional detail line> ``` **Types:** `session`, `ingest`, `query`, `lint`, `rebuild` **Quick access:** `grep "^## \[" log.md | tail -5` gives you the last 5 entries. --- ## [2026-05-05 23:45] session | Blueprint tabular Melissa + restore pacientes Touched: none (sem mudança de wiki — handoff em HANDOFF.md) Detalhes: criou `blueprints/melissa-table-page-blueprint.md` (~530L, 18 seções); refatorou MelissaCadastrosRecebidos pro padrão (DataTable + frozen action + view toggle list/grade); criou MelissaAgendamentosRecebidos nativa (substituindo embed); MelissaPacientes ganhou subheader, sombras, status pills coloridas, email/phone colunas próprias, mobile pencil+popover, view toggle, fix scroll mobile (`min-height: 0` em `.mp-list`), botão Restaurar pra arquivados. Repository: `restorePatient` novo. PatientsCadastroPage statusOpts: +Arquivado. A66 V2 — user não gostou design, aguarda feedback específico. ## [2026-05-06 12:00] session | MelissaCompromissos refator blueprint Touched: none (aplicacao direta do blueprint existente - sem mudanca de wiki) Detalhes: refator de MelissaCompromissos pro melissa-table-page-blueprint preservando o design do row (color stripe + name+badges + descricao + meta inline). DataTable com 3 colunas (Compromisso flex / Atividade 220px / Acoes frozen 140px com toggle+pencil+trash). Sidebar com 2 grupos de filtros: Status (Ativos verde / Inativos amber) e Tipo (Nativos blue / Meus accent), cada um com Limpar filtro proprio. Grid view com cards (color stripe 28px + toggle topo + footer com edit/trash). Subheader explicativo. View toggle persistido em mc.viewMode.v1. Removeu Popover de actions (drawer mobile cobre). Stats: Total/Ativos/Inativos/Tempo total. ESLint 0 errors. UI nao testada em browser ainda. ## [2026-05-06 14:00] session | Melissa 6 Pages blueprint + WhatsApp drawer + commits Touched: none (sem nova pagina de wiki - aplicacao do blueprint existente) Detalhes: Sprint F entregue. Blueprint tabular aplicado em MelissaCompromissos (row design preservado), MelissaGrupos, MelissaTags, MelissaMedicos, MelissaConversas, MelissaRecorrencias. Dialogs de criar/editar harmonizados (FloatLabel + IconField + section dividers espelhando PatientsCadastroPage Identidade). Dialogs "Pacientes do grupo/tag/medico" com cor primary nos avatares de letras + X de fechar igual .xx-close. ConversationDrawer redesign estilo WhatsApp (avatar primary, bg papel de parede, bolhas com tail simulada, time/status overlay no canto inferior direito, compose pill + send circular verde #00a884). Bug fix em MelissaPacientes: g.cor->g.color em 20 lugares (repository devolve camelCase, template lia PT-BR e cores nao apareciam). 5 commits criados: 957e912, 6d9b36d, 269b531, 98f7252, 15103ed. Working tree limpa. HANDOFF.md atualizado. ## [2026-05-06 17:30] session | Melissa drawers: footer pattern AppMenu Touched: none ## [2026-05-08 00:00] session | Melissa cfg-* nativas + temas + cronometro DB Touched: none ## [2026-05-08 21:00] session | MelissaPaciente iteracao pos-Fase 8 + AgendaEventDialog reuse Touched: none (iteracao de UX, sem novas paginas wiki) Detalhes: 16 commits adicionais apos Fase 8 cobrindo ajustes de UX e funcionalidades novas pedidas pelo user em sequencia: LAYOUT/CHROME - Full-width (removido right:max) — prontuario tem KPIs+tabelas+timeline, precisa espaco. Outras Melissa Pages mantem o constraint. - Sidebar: substituido botao "Configuracoes" por "Voltar para Pacientes" (prontuario nao pertence a config). X faz history.back; sidebar btn forca /melissa/pacientes. - Cards da sidebar com flex-shrink:0 (estavam encolhendo, cortando conteudo). - .mpa-tab com display:flex+gap:12px (filhos estavam colados). FUNCIONALIDADES NOVAS - editPatient abre PatientCadastroDialog INLINE (antes redirecionava pra MelissaPacientes?edit=). - openWhatsapp passa string id (era objeto) + detecta store.error pra toast warn quando paciente sem telefone. - addFinancial: dialog inline com createRecord mutation no usePatientFinancial. - goAgendar: dialog inline com createSession mutation, depois evoluiu pra usar AgendaEventDialog real via lockType/lockPatient props. - Botao "Agendar" novo na sidebar Acoes Rapidas (antes so tinha Lancamento). DIALOG NOVA SESSAO — evolucao em 4 etapas 1. Inline simples (createSession direto) 2. Frequencia integrando useRecurrence (recorrencia semanal) 3. Frequencia estilo AgendaEventDialog (chips Avulsa/Semanal/Quinzenal/ diasEspecificos + qtd sessoes 4/8/12/personalizar) 4. Header custom (icon + Nova sessao + nome paciente) 5. **Decisao final**: trocar tudo por reuso do AgendaEventDialog real. User pediu pra ver dialog completo da Agenda dentro do prontuario. Caminho A escolhido: 2 props aditivas (lockType, lockPatient) + slot #headerLeft no AgendaEventDialog. 301 specs continuam passando — zero regressao nos 5 callsites legacy. BLOCO DE RECORRENCIAS NA TAB AGENDA - 5o KPI "Recorrencias" (count de ativas). - Lista de cards mostrando regras com label legivel (fmtRecurrenceLabel) + meta (duracao/modalidade/fim/desde) + acoes inline (cancelar/reativar). - Toggle "Ver canceladas". DEBUGGING DIALOG (etapas finais) - jornada/billing/freq sumiram: causa = lockType so setava step=2 sem inicializar form.commitment_id. Fix: watch chama selectCommitment(sessao). - Resumo lateral sem nome paciente: causa = nao passar paciente_nome/ avatar/status no eventRow. Fix: pre-popular dos computeds. - Botao Salvar sumido: causa = footer tem v-if step=2; sem presetCommitmentId prop, lifecycle ia step=1. Fix: passar :preset-commitment-id no template. TOTAL: 24 commits no branch. HANDOFF.md reescrito com estado completo + historico + arquivos novos/modificados + decisoes arquiteturais + hotspots de drift. Push pendente. ## [2026-05-08 19:30] session | MelissaPaciente Fase 8 — wire-up final (Dialog -> route) Touched: none Detalhes: PLANO DE 8 FASES COMPLETO. Os 2 callsites Melissa do PatientProntuario.vue legacy (3593L Dialog) trocam por router.push pra /melissa/paciente?id=X. PatientProntuario continua intocado pros 2 callsites legacy (TherapistDashboard, PatientsListPage) quando user nao esta no layout Melissa. MELISSAPACIENTE.VUE — wire-up - useRouter + useConversationDrawerStore. - close(): emit + router.push('/melissa/pacientes') (volta pra lista). - editPatient(): emit + router.push('/melissa/pacientes', query: {edit: id}) pra MelissaPacientes detectar e abrir o cadastroFullDialog automaticamente. - openWhatsapp(): emit + conversationDrawerStore.openForPatient({id, name, phone, avatar_url}) — drawer global desce sobre Melissa sem fechar. - addFinancial(): emit + toast "Em breve" (Fase 9 — dialog inline). MELISSAPACIENTES.VUE — wire-up - Removeu import PatientProntuario, refs prontuarioOpen/prontuarioPatient, template PatientProntuario. - abrirProntuario(p): router.push('/melissa/paciente', query: {id}). - onMounted: detecta route.query.edit -> abre cadastroFullDialog + router.replace pra limpar a query. Permite navegacao MelissaPaciente -> MelissaPacientes?edit=X -> auto-open do cadastro. - Comentario header atualizado. MELISSAAGENDA.VUE — wire-up - Removeu import PatientProntuario, refs prontuarioOpen/prontuarioPatient, template PatientProntuario. - abrirProntuarioPorId(id): router.push('/melissa/paciente', query: {id}). - abrirProntuarioPaciente() / openProntuario(patient) / item kebab "Prontuario" todos delegam pra abrirProntuarioPorId. MELISSALAYOUT.VUE - Render do <MelissaPaciente> simplificado: so passa @close="fecharSecao". Acoes edit/open-whatsapp/add-financial agora ficam internas no MelissaPaciente. ESLint: 0 errors da minha mudanca (9 errors pre-existentes nos arquivos tocados, mesmos de antes do diff — confirmados via git stash baseline). PLANO COMPLETO. Status final por fase: 1. Foundation (composables + skeleton) — done (Fase 1) 2. Tab Visao Geral (KPIs ricos + timeline + msgs) — done (Fase 2) 3. Tab Perfil (6 sections stacked + anchors) — done (Fase 3) 4. Tab Prontuario MVP (evolucao via observacoes) — done (Fase 4) 5. Tab Agenda (KPIs + filtros + grupos + acoes) — done (Fase 5) 6. Tab Financeiro (KPIs + tabela + mark paid) — done (Fase 6) 7. Tabs Documentos + Conversas (KPIs + embeds) — done (Fase 7) 8. Wire-up final (Dialog -> route) — done (Fase 8) PatientProntuario.vue (3593L) NAO foi deletado — continua usado pelo TherapistDashboard.vue (homepage do role therapist) e PatientsListPage.vue (rota /therapist/patients fora do Melissa). Quando user troca pra Melissa em /account/profile, ele ve a versao nativa (MelissaPaciente). ## [2026-05-08 18:30] session | MelissaPaciente Fase 7 — Tabs Documentos + Conversas Touched: none Detalhes: Duas tabs entregues numa sessao (sao mais leves: KPIs + embed de componentes existentes ja testados). EXTENSAO patientFormatters.js: - fmtSize(bytes): B/KB/MB/GB legivel - DOC_TYPE_LABEL: atestado/receita/laudo/encaminhamento/termo/etc - chConvLabel: whatsapp/sms/email -> WhatsApp/SMS/E-mail EXTENSAO usePatientDocuments.js: - topType computed: { tipo, count, label } do mais comum (DOC_TYPE_LABEL) - pendentes computed: count de status_revisao === 'pendente' - sizeTotalFormatted computed: fmtSize(totalBytes) - Import patientFormatters dentro do composable. EXTENSAO usePatientMessages.js: - primeiraMensagem computed (mais antiga, [length-1]) - canais computed: Set de m.channel unicos MELISSAPACIENTE.VUE — script - Imports: DocumentsListPage, PatientConversationsTab, chConvLabel - Removido kpiDocumentos (nao usado mais — substituido por documentsHook.total.value direto) MELISSAPACIENTE.VUE — Tab Documentos (Fase 7) - Loading state. - 4 KPIs adaptativos (so renderizam quando ha dados): - 01 Total + sizeTotalFormatted - 02 Mais comum (label do tipo + count) — opcional - 03 Ultimo + relative + dateBR — opcional - 04 Revisao pendente (laranja) — opcional, so quando > 0 - DocumentsListPage embedded no card Melissa (mpa-embed) — reusa o componente existente que ja faz upload/preview/listagem completa. Wrapper ze-ra padding pra ele preencher tudo. MELISSAPACIENTE.VUE — Tab Conversas (Fase 7) - Loading state. - 4 KPIs (so renderizam quando ha mensagens): - 01 Mensagens total + canais ("via WhatsApp, SMS") - 02 Recebidas + % do total - 03 Enviadas + % do total - 04 Ultima relative + direction + 1ª contato dim - CTA "Abrir conversa no drawer" estilo WhatsApp (verde #25d366) que emite open-whatsapp pro parent (futuro: integra com conversationDrawerStore.openForPatient na Fase 8). - PatientConversationsTab embedded no mesmo wrapper mpa-embed — thread completa com filter/scroll/media. CSS: ~50L novos pros componentes (mpa-conv-cta + mpa-embed wrapper). Padrao Melissa: CTA WhatsApp circular pill, embed wrapper transparente. ESLint: 0 errors da minha mudanca. PROXIMA: Fase 8 (wire-up final) — substituir Dialog do PatientProntuario por router.push('/melissa/paciente?id=X') nos 4 callsites Melissa (MelissaPacientes, MelissaAgenda); decidir se TherapistDashboard e PatientsListPage tambem migram. PatientProntuario.vue pode ficar (legacy fallback) ou deletar. ## [2026-05-08 17:30] session | MelissaPaciente Fase 6 — Tab Financeiro completa + mark paid mutation Touched: none Detalhes: Tab Financeiro espelha o legacy + adiciona mutation que o legacy NAO tem (mark/unmark pago direto da tabela). EXTENSAO patientFormatters.js: - recordStatus(r): pago | vencido | pendente - RECORD_STATUS_LABEL map. - fmtPaymentMethod(v): PIX/Cartao/Dinheiro/Boleto/Transferencia/Convenio cobrindo variantes. EXTENSAO usePatientFinancial.js: - ref `busy` + `_lastPatientId` interno. - recordsOrdenados computed (DESC por due_date com fallback created_at). - markPaid(recordId): UPDATE financial_records SET paid_at=NOW() + auto- reload. Retorna {ok, error?}. - markUnpaid(recordId): UPDATE SET paid_at=NULL + auto-reload (reverte). MELISSAPACIENTE.VUE — script - Imports: recordStatus, RECORD_STATUS_LABEL, fmtPaymentMethod. - markRecordPaid(record) handler: chama markPaid + toast success/error. - revertRecordPaid(record): chama markUnpaid + toast. MELISSAPACIENTE.VUE — Tab Financeiro reescrita - Loading state. - Empty state com CTA "Novo lancamento" (botao mpa-quick-btn--cta). - 3 KPIs (Pago / Pendente com proxVenc / Em atraso com cor adaptativa). - Header "Lancamentos" com badge count + botao "+ Novo" no canto. - Tabela 6-col: Vencimento (date mono+rel) | Descricao | Forma | Valor (mono right) | Status pill colorida (pago verde / vencido vermelho / pendente azul) | Action button. - Action: pi-check (verde) pra marcar pago, pi-undo (amarelo) pra reverter. - border-left adaptativa por status (verde pago / vermelho vencido / azul pendente). - Mobile: tabela colapsa em cards 2-col 4-row (date|amount / desc / method|status / action). CSS: ~190L novos pros componentes (mpa-fin__table/row/date/desc/method/ amount/status/action + responsive). Padrao Melissa: status pills com color-mix, JetBrains Mono pra valores, header cell uppercase letter- spacing. ESLint: 0 errors da minha mudanca. ## [2026-05-08 16:30] session | MelissaPaciente Fase 5 — Tab Agenda completa Touched: none Detalhes: Tab Agenda com KPIs, filtros, agrupamento por mes e acoes rapidas (mark realizada/falta/cancelar). Espelha o legacy. EXTENSAO patientFormatters.js: +2 helpers - fmtHourShort (HH:MM 24h pt-br) e fmtDayShort (DOW abbreviado pt-br sem ponto) — usados na coluna data dos cards. EXTENSAO usePatientSessions.js: mutation + busy flag - Novo ref `busy` pra disable de buttons durante mutation. - _lastPatientId guardado pra auto-reload depois de mutation. - Nova funcao `updateStatus(sessionId, novoStatus)` que faz supabase.from('agenda_eventos').update({status}) + auto-reload da lista. Retorna {ok, error?}. MELISSAPACIENTE.VUE — script - agendaFilter ref ('all' default) + AGENDA_FILTERS array com 6 opcoes (Todas, Proximas, Passadas, Realizadas, Faltas, Canceladas). - agendaSessoesFiltradas computed: filtra sessoes por future/past/status. - agendaAgrupadas computed: agrupa por "Mes de YYYY" mantendo ordem DESC. - updateSessionStatus(ev, status, msg) handler que chama sessionsHook.updateStatus + toast de sucesso/erro. - Removido `void toast` (toast usado de verdade agora). MELISSAPACIENTE.VUE — Tab Agenda reescrita (substitui placeholder Fase 1) - 4 KPI cards no padrao Visao Geral (numerados 01-04): - 01 Total + cap "sessoes registradas" - 02 Realizadas + cap "% do total" - 03 Faltas + cap "+ N cancel." (cor vermelha quando > 0, cinza quando 0) - 04 Proxima + relative + datetime - 6 filter chips redondas (estilo Melissa: cor primary quando active). - Empty state contextual (sem sessoes vs filtro vazio). - Grupos por mes com header (label + badge count). - Cards com 3 colunas: data column (DOW + dia + hora curta) | main (status tag + chips modalidade/duracao + relative + titulo + note) | actions (3 buttons: ok/warn/danger com tooltip + cor adaptativa hover). - Mobile: stack date+main em 2 cols; actions full-width abaixo. CSS: ~150L novos pros componentes (mpa-ag__group/list/item/date/main/ actions). Padrao visual Melissa: data column estilo calendario, actions hover muda cor por intent (verde realiz / amarelo falta / vermelho cancel). ESLint: 0 errors da minha mudanca. ## [2026-05-08 15:30] session | MelissaPaciente Fase 4 — Tab Prontuario MVP Touched: none Detalhes: O legacy PatientProntuario.vue tem a aba Prontuario como PLACEHOLDER ("Em breve"). MVP entregue aqui supera o legacy: usa agenda_eventos.observacoes como nota evolutiva (pq nao tem schema de anamnese/clinical_notes ainda). ESTADO + COMPUTEDS adicionados: - pronFilter ref ('com-evolucao' default) + PRON_FILTERS array com 5 opcoes (Com evolucao, Todas, Realizadas, Faltas, Cancelamentos). - pronSessions computed: filtra sessions por status/observacoes presentes. - sessoesComEvolucao computed: count de sessoes com observacoes nao-vazia. TEMPLATE Tab Prontuario (substitui placeholder Fase 1): - Hint banner top: "Prontuario em construcao", explica que usa observacoes de sessoes como historico evolutivo. - 4 mini-stats em grid responsivo: com evolucao / realizadas / faltas / total. Cada uma colorida + icone + value 800. - 5 filter chips redondas (estilo Melissa): com-evolucao default; troca pra todas/realiz/falt/cancel. - Empty state contextual: - Se nao tem sessoes: "Quando atender este paciente..." - Se filtro 'com-evolucao' e zero: "Use o campo Observacoes ao editar sessao..." - Outro filtro: "Tente outro filtro acima." - Lista de sessoes (pron-list) com: - border-left colorida por status (verde realiz / vermelho falta / amarelo cancel / cinza default) - head com data + relative + chips status/modalidade/duracao - titulo opcional (titulo_custom || titulo) - block "Evolucao" quando tem observacoes (background medium, border- left primary, label uppercase com icone, texto pre-wrap) - mensagem "Sem evolucao registrada" italico cinza quando nao tem - Roadmap card (border-dashed) listando 4 features futuras: anamnese estruturada / plano terapeutico / evolucao por temas / assinatura digital + LGPD Art. 18. CSS: ~200L novos pros componentes (mpa-pron-hint/stats/filters/list/ item/roadmap). Padrao visual Melissa: chips redondas estilo MelissaTags, border-left adaptativa, monospace inutilizado. ESLint: 0 errors da minha mudanca. ## [2026-05-08 14:30] session | MelissaPaciente Fase 3 — Tab Perfil (6 sections stacked) Touched: none Detalhes: Substituiu o placeholder da aba Perfil por 6 sections stacked com anchors no MelissaPaciente. Diferente do PatientProntuario legacy que usava PrimeVue Accordion (1 painel aberto por vez), o Melissa nativo mostra todos os 6 cards stacked com scroll suave do sidebar sub-nav pra cada anchor. Mais legivel em desktop, mais rapido pra escanear. EXTENSAO de patientFormatters.js: +5 formatters - pickField (ja existia computed local; agora helper compartilhavel) - onlyDigits, fmtCPF (000.000.000-00), fmtRG (passthrough), fmtPhoneMobile ((XX) 9XXXX-XXXX), fmtGender (Masculino/Feminino/Nao-binario/Outro), fmtMarital (Solteiro/Casado/Divorciado/Viuvo/Uniao estavel). MELISSAPACIENTE.VUE — script: - 30+ field computeds usando pickField (cobre snake_case + camelCase do schema): birthValue, telefone/Alternativo, email/Alternativo, genero, estadoCivil, naturalidade, ondeNosConheceu, encaminhadoPor, observacoes, notasInternas + 8 campos de endereco (cep/pais/cidade/estado/endereco/ numero/bairro/complemento) + 5 dados adicionais (escolaridade/profissao/ nomeParente/grauParentesco/telefoneParente) + 4 responsavel. - groupNames/groupLabel/groupCountLabel pra Origem. - scrollToProfileSection(key) que liga sidebar sub-nav -> nextTick -> scrollIntoView do anchor #mpa-perfil-XXX. Em mobile fecha o drawer. MELISSAPACIENTE.VUE — template Tab Perfil: - 1. Informacoes Pessoais: 2-col (Dados de cadastro: nome/data nasc com idade/genero/estado civil/CPF/RG/naturalidade) + (Contato: tel/tel-alt com tel: links + e-mail principal/alt com mailto: + Origem: grupos/tags chips/onde nos conheceu/encaminhado por). Observacoes full-width quando preenchido. - 2. Endereco: grid 2-col com 8 fields (CEP/pais/cidade/estado/endereco/ numero/bairro/complemento). - 3. Dados Adicionais: grid 2-col com escolaridade/profissao/parente/grau/ tel parente. - 4. Responsavel: 1-col com nome/CPF/tel + observacao block textual. - 5. Anotacoes Internas: card com hint lock + textblock min-height. - 6. Sessoes: lista compacta scrollable (max-height 360px) com titulo/ data/duracao/modalidade chips + tag status. CSS: ~250L novos pros componentes (mpa-fields/field-row/field-grid-2/ field-block/sess/sess-list). Pattern visual Melissa: cards com label uppercase, separadores horizontais sutis, links com cor primary, monospace pra CPF/RG/CEP. ESLint: 0 errors da minha mudanca. ## [2026-05-08 13:00] session | MelissaPaciente Fase 2 — Tab Visao Geral completa Touched: none Detalhes: Reescreveu a aba Visao Geral do MelissaPaciente substituindo o placeholder por uma versao 1:1 do PatientProntuario.vue legado, mas com estilo Melissa nativo. NOVO: src/features/patients/utils/patientFormatters.js (~165L) - Helpers compartilhaveis extraidos do PatientProntuario: parseDateLoose, fmtDateBR, fmtDateTimeBR, fmtCurrency, fmtRelative, sessionDuration, calcAge. STATUS_LABEL/SEVERITY pra sessoes. tagStyle com luminance auto (texto preto/branco baseado em contraste WCAG-ish). Sera usado pelas Fases 3-7 e finalmente pelo PatientProntuario tambem (Fase 8). EXTENSAO de composables: - usePatientSessions ganha computed `ultimasAtendidas` (top 6 sessoes realizadas/faltadas/canceladas pra Timeline). Refinou totalRealizadas/ Faltas/Canceladas pra usar regex (cobre variantes pt-br). - usePatientFinancial ganha computed `statusFinanceiro` ({ emDia, proxVenc, totalPendente, totalPago, vencidos }) pra alimentar o KPI 02 com info detalhada. MELISSAPACIENTE.VUE — Visao Geral (Fase 2 done): - 4 KPI cards ricos (era 4 simples na Fase 1): - 01 Sessoes: realizadas + total + faltas + cancel. - 02 Pagamento: emDia/atraso + proxVenc + pendente, com cor adaptativa (vermelho quando atrasado, primary quando ok). - 03 Proxima sessao: relative + datetime + modalidade. - 04 Mensagens: ultimaMensagem relative + direction + count. - Grid 2-col abaixo: Timeline (1.4fr) + coluna direita (1fr) com Mensagens recentes + Notas/observacoes. - Timeline com dot colorido por status (verde/vermelho/amarelo) + STATUS_LABEL/SEVERITY do utils + chips modalidade/duracao + nota observacoes inline. - Mensagens recentes com border-left colorida (verde=in / azul=out) + meta direction + relative + body 3-line clamp. - Notas e observacoes com card papel + label uppercase + icone lock pras internas. - Removeu kpiEmAberto/Atrasado nao usados (statusFinanceiro encapsula). ESLint: 0 errors. Working tree limpa antes do commit. ## [2026-05-08 11:30] session | MelissaPaciente Fase 1 (foundation: composables + skeleton + slug) Touched: none (sem mudanca de wiki) Detalhes: User escolheu "Full rewrite Melissa nativo" pra portar PatientProntuario.vue (3593L Dialog) pro Melissa. Plano em 8 fases (2-8 sao cada tab/wireup, sessao dedicada). Fase 1 entregue: 5 COMPOSABLES NOVOS em src/features/patients/composables/: - usePatientDetail.js (108L) — patients + groups + tags via 4 queries (getPatientById, getPatientRelations, getGroupsByIds, getTagsByIds). Espelha 1:1 a logica de loadDetail() do PatientProntuario L893-953. - usePatientSessions.js (83L) — agenda_eventos limit 100 ordenado desc + computeds proximaSessao/ultimaSessao/totalSessoes/totalRealizadas/ totalFaltas/totalCanceladas. - usePatientFinancial.js (82L) — financial_records (type=receita) limit 100 + computeds totalRecebido/EmAberto/Atrasado/ultimoPago. - usePatientMessages.js (64L) — conversation_messages limit 200 + computeds recentes (top 4)/totalIn/totalOut/ultimaMensagem. - usePatientDocuments.js (70L) — documents (deleted_at IS NULL) limit 200 + computeds total/totalBytes/tiposCount/ultimo. MELISSAPACIENTE.VUE NOVO (1190L) em src/layout/melissa/: - Prefixo CSS .mpa-* (Melissa PAciente). Chrome glass + drawer mobile + right: max(...) >=1024px (mesmo padrao MelissaAgendador/Negocio). - Header: avatar + nome + ageLabel + pronomes + status/convenio Tag + risco-elevado pill + actions (Conversar / Editar / Close). - Subheader condicional: banner risco elevado. - Body 2-col: sidebar 320px (esquerda, drawer no mobile) + main flex 1. - Sidebar contém 4 cards: Acoes Rapidas (Conversar/Editar/Lancamento) + Navegacao (7 tabs com icones coloridos) + Sub-nav Perfil (visivel so quando aba Perfil ativa, 6 secoes) + Vinculos (chips de grupos+tags). - Main: 7 tabs com placeholders ("Em desenvolvimento — Fase X"). Aba Visao Geral ja mostra 4 KPIs reais via composables (sessoes totais, em aberto, mensagens, documentos). - Props :patient-id; emits close/edit/add-financial/open-whatsapp. - Watch immediate em props.patientId, dispara loadAll() via Promise.all dos 5 composables. MELISSALAYOUT.VUE atualizado: - Import MelissaPaciente. - SECOES.paciente entry novo (label/icon/descricao). - 'paciente' adicionado ao MELISSA_NON_CONFIG_SLUGS. - Render condicional com :patient-id="String(route.query.id || '')" — navegacao via /melissa/paciente?id=xxx. NAO ALTERADO: PatientProntuario.vue continua intocado nos 4 callsites (TherapistDashboard, MelissaAgenda, MelissaPacientes, PatientsListPage). Migration acontece nas Fases 2-8. Fase 8 troca os callsites no Melissa. ESLint: 0 errors da minha mudanca. 2 errors pre-existentes em MelissaLayout (duplicate key 'financeiro' L242, empty block L1130) — nao toquei aquelas linhas. PatientProntuario tem 2 outros pre-existentes. Working tree: MelissaLayout.vue + 6 arquivos novos. ## [2026-05-08 09:30] session | Chrome+preview em 7 paginas Melissa (LinkExterno preview novo) Touched: none (sem mudanca de wiki - aplicacao do pattern existente) Detalhes: Aplicou o chrome `right: max(6px, min(50%, calc(100% - 1006px)))` em 6 paginas tabulares (CadastrosRecebidos .mcr / Recorrencias .mr / Grupos .mg / Tags .mt / Compromissos .mc / Medicos .mm) - so o tamanho de janela, sem preview, conforme pedido pelo user. Adicionou novo @media (min-width: 1024px) ao final de cada arquivo (cada um nao tinha esse breakpoint ainda). MelissaLinkExterno (.ml) ganhou tratamento completo: chrome + sidebar restruturada (2-col com aside agora a ESQUERDA, antes era a direita) + mobile drawer pattern (Teleport pro #ml-mobile-drawer-target, transitions, backdrop, botao Menu mobile-only) + 3-way teleport do preview (mobile=topo do main / mid-desktop=bottom da sidebar / wide-desktop>=1340=floating glass). Sidebar agora com Como funciona + Boas praticas (movidos da .ml-side direita) + scroll proprio. Sem cfg toggle (nao havia necessidade conceitual). Componente novo: src/components/cadastro/CadastroExternoPreview.vue (~350L). Phone-frame 260px estilo AgendadorPreview replicando o CadastroPacienteExterno publico: nav (logo Psi + chip verificado), hero (avatar 38px + nome split firstName/lastName em accent + work_description label + clinic name), stepper 4 dots (1 active), card etapa 1 (numero decorativo + tag "Etapa 1 de 4" + title "Sobre voce" + 3 input bars + CTA "Continuar"), powered by. Recebe :token prop e busca info do convite via mesma edge function que o publico (get-intake-invite-info), watch refetcha quando token rotaciona. Sem token ou sem dados, fallbacks pra "Profissional" + iniciais. ESLint: 0 errors da minha mudanca. 2 errors pre-existentes em MelissaRecorrencias.vue (totalDone unused L235, v-for/v-bind:key L584) - nao toquei aquelas linhas. Working tree: 9 arquivos modificados + src/components/cadastro/ (untracked). Nao commitado, nao testado em browser. ## [2026-05-08 07:55] session | MelissaAgendador preview celular teleport 3-way Touched: none (aplicacao do padrao MelissaNegocio - sem mudanca de wiki) Detalhes: Replicou o padrao floating preview do MelissaNegocio em MelissaAgendador.vue (+145L). Importou AgendadorPreview (phone-frame ja existente do legacy ConfiguracoesAgendadorPage). Adicionou ref isWideDesktop + matchMedia('(min-width: 1340px)') + computed previewTarget com 3-way branching: mobile -> #mag-main-preview-target (topo do main, acima de tudo, DIFERENTE do MelissaNegocio que vai pro drawer); mid-desktop (1024-1339) -> #mag-sidebar-preview-target (dentro da sidebar apos Status/Resumos); wide-desktop (>=1340) -> #mag-floating-preview-target (painel flutuante glass fora do fake dialog, 320px de largura, ancorado a +14px do right edge da .mag-page). Adicionou regra `right: max(6px, min(50%, calc(100% - 1006px)))` em .mag-page no @media >=1024px (necessario pra abrir espaco a direita pro floating). CSS: .mag-floating-preview com glass igual ao fake dialog; placeholders com display:contents; hide rules por breakpoint. Card de preview usa mag-w--side e perde fundo/borda no floating (glass do painel ja faz papel). ESLint 0 errors. Working tree: src/auto-imports.d.ts (auto-gerado) + MelissaAgendador.vue. Nao commitado, nao testado em browser ainda. ## [2026-05-11 10:50] session | Recorrencia: expandir + materializar + view lista Touched: [[recorrencia-agenda]] Detalhes: 6 commits criados e pushed (8b0e633..39cf017). TIME PICKER do AgendaEventDialog (commit 988a4e5): - Header dinamico (header-dot + "Nova {commitment.name}" + subtitulo "Inicio da sessao e duracao"). Inicio + Termino lado a lado (Termino readonly via fimDateTime). Card destacado de Termino removido. - Picker virou DataTable (.aed-patient-dt) + Tags Arquivado/Inativo + sort Ativo>Inativo>Arquivado. - Cadastro completo INLINE via PatientCadastroDialog (botao pi-id-card) em vez de redirecionar pra rota nova — nao vaza do layout Melissa. Usa prop hideViewListButton adicionada antes pra esconder "Salvar e ver pacientes". - Mini calendar (.mc-mini) no time picker; chips de duracao rapida (30/50/60/90m); cards .aed-card; popovers de ajuda. EXPANSAO DE RECORRENCIA cross-layout (commit 39cf017): 3 composables compartilhados ganharam loadAndExpand — antes so AgendaTerapeutaPage e AgendaClinicaPage expandiam, deixando widgets do Melissa com 1 sessao de uma serie de 4. usePatientSessions.load (range -6mo a +12mo, filtra por patient_id), useMelissaEventos._fetchRange (range visivel), useMelissaTodasSessoesPaciente.fetch. normalizeEvent aceita shape de virtual (paciente_nome/patient_name) alem de joined query. MATERIALIZACAO em 4 caminhos: UPDATE em id virtual "rec::..." quebrava com "invalid input syntax for type uuid". Corrigido em usePatientSessions.updateStatus (aceita row inteira, materializa), useAgendaEventActions watcher (emit updateSeriesEvent com row), MelissaLayout.updateEventoStatus (detecta virtual, delega passando row: ev — sem isso dialogEventRow ficava vazio e criava row orfa sem patient_id), MelissaPaciente wire-up (@updateSeriesEvent aponta pro handler certo agora), useMelissaAgenda.onUpdateSeriesEvent (aceita row do chamador, guard contra rid null, error check no maybeSingle). VIEW LISTA MelissaAgenda (commit 279b4f7): listWeek -> custom listAll (duration { years: 2 }, centrada via gotoDate(hoje - 1 ano)). Banner showRecurrenceHint aparece em day/week/month com botao "Ver na lista". Sticky day header (.fc-list-day) com z-index 3 + bg opaco — antes .fc-event passava por cima conforme scroll. View toggle dos botoes manuais -> PrimeVue SelectButton. VISUAL EVENTO INATIVO: classNames=['ma-evt--inactive-patient'] em fcEvents quando paciente_status === Arquivado|Inativo (borda tracejada + opacidade 0.58 + italico em list view). useAgendaEventPickerBilling + AgendaEventDialogV2: picker mostra TODOS os pacientes ordenados Ativo>Inativo>Arquivado, nao-Ativos com Tag colorida + disabled + tooltip. selectPaciente bloqueia non-Ativo (defesa em camadas, 3 specs novas). OUTROS: services nome unico por owner (case-insensitive); FC touch defaults centralizados em src/features/agenda/utils/fcDefaults.js aplicado em 4 calendars; props hideViewListButton em ComponentCadastroRapido + PatientCadastroDialog pra uso in-flow. Database backup gerado: backups/2026-05-11/ (138 tabelas, 141 FKs). Dashboard regenerado.