m meuAgente
🎓
F

🎓 Documentação do meuAgente

Gerada a partir do próprio código — sempre atualizada. Última carga: agora.
8
Módulos
125
Rotas
31
Tabelas
30
Modelos
56
Funções de serviço

Visão geral

O meuAgente é o hub de trabalho pessoal do Flávio: um lugar só para organizar as várias organizações em que atua, acompanhar projetos, agenda, e-mails e finanças — com um assistente de IA que lê os dados, avisa o que importa e executa ações.

Fluxo pensado para o dia a dia: entrar → bater o olho no briefing e nos alertas → saber o norte → agir (pelas telas ou falando com o assistente).

Módulos

🏢 Organizações (ambientes)

Cada empresa/contexto é uma organização. Tudo no app é escopado por ela.

  • O seletor no topo troca o ambiente atual (guardado na sessão). O padrão ao entrar é Grupo Orletti.
  • Dentro de uma organização você só vê os dados dela (mais itens sem organização). A visão cruzada fica no Painel (ver todos).
  • Cada org tem cor, logo, cargo e um tipo (Empresa ou Pessoal) que define o plano de categorias do financeiro.
  • O módulo Financeiro é ligado/desligado por organização.

📁 Projetos → Etapas → Tarefas

A hierarquia de trabalho. Etapas medem o andamento; tarefas são as ações datadas.

  • Projeto pertence a uma organização e pode ter um Tipo (Desenvolvimento, Implantação, Treinamento, Reimplantação) que já cria as etapas padrão.
  • Etapa é a fase do projeto, exibida num quadro Kanban (A fazer / Em andamento / Bloqueada / Concluída) com arrastar e soltar.
  • O % de andamento do projeto = etapas concluídas ÷ total de etapas.
  • Tarefa é a ação a fazer: fica dentro de uma etapa ou é avulsa. Tem data, hora, prioridade e responsáveis.
  • Tarefa com data aparece na Agenda e no Calendário; com data + hora, também pode virar evento na sua agenda do Google/Outlook.

📅 Agenda e Calendário

O que fazer hoje e nos próximos dias, com conflitos de horário.

  • Ao entrar numa organização, o topo mostra a Agenda — próximos dias (atrasadas + agrupadas por dia).
  • O Calendário mensal mostra as tarefas e, quando as agendas estão conectadas, também as reuniões reais do Google/Outlook (coloridas por organização).
  • Ao agendar algo com hora, o assistente avisa conflitos considerando tarefas de todas as organizações e as reuniões reais.

✉️ E-mails (Gmail, Outlook e IMAP)

Lê as caixas, classifica por IA e transforma e-mail em tarefa ou lançamento financeiro.

  • Cada organização pode ter várias contas: Gmail (OAuth, leitura), Outlook/Microsoft (OAuth via Graph, lê e envia) e IMAP/SMTP (qualquer provedor, lê e envia).
  • A IA classifica cada e-mail (cobrança, família, compras, assinaturas, trabalho, newsletter…), gera um resumo curto e extrai o vencimento de boletos. Sem chave de IA, usa regras por palavra-chave.
  • O leitor interno abre o corpo do e-mail dentro do app (Gmail, Outlook e IMAP).
  • Botões: 📅 virar tarefa (vai para a agenda) e 💰 virar financeiro (cria o lançamento, com anexo).

💰 Financeiro

Contas a pagar/receber, cartões, contas bancárias, reembolsos e posição do mês.

  • Habilitado por organização. As categorias mudam conforme o tipo: Empresa (Faturamento, Folha, Impostos, Ocupação…) ou Pessoal (Moradia, Mobilidade, Alimentação…), cada uma com subcategorias.
  • Lançamento pode ser avulso, parcelado (gera uma linha por parcela) ou fixo/recorrente (gera mês a mês entre início e fim).
  • Registra forma de pagamento, de onde saiu (conta bancária), cartão, fornecedor e anexo (nota/cupom/comprovante).
  • Reembolsável: marca quem reembolsa; o valor entra em A receber e não conta como gasto seu. Ao dar baixa, lança automaticamente a receita correspondente.
  • Cartões: limite, dia de fechamento e vencimento, com usado / disponível. Contas bancárias: saldo e saldo projetado (saldo − contas em aberto).
  • IA no comprovante: envie a foto/PDF e ela extrai valor, data, fornecedor e categoria.
  • A tela mostra a posição do mês: a pagar, pago, gasto líquido, a receber, receitas e vencidas, além do gasto por categoria.

🤖 Assistente (IA) e voz

Conversa que lê seus dados e executa ações — por texto ou por voz.

  • Usa o Claude com ferramentas: ele consulta seus dados e age no banco.
  • Pergunte: “quais minhas ações para hoje?”, “como estão os projetos e percentuais?”, “tenho contas vencendo?”.
  • Mande fazer: “crie um projeto de Implantação na FLS com as etapas padrão”, “agende reunião amanhã às 15h” (avisa conflito e cria o evento na agenda).
  • Voz: microfone (fala → texto → envia), leitura das respostas em voz alta e escuta contínua com a palavra de ativação “meuAgente”.
  • Briefing do dia: ao entrar numa organização, a IA resume o seu “norte” — contas vencidas primeiro, depois tarefas, prazos e projetos travados. Fica em cache por dia.

🩺 Saúde

Acompanhamento de saúde da família: remédios, medições, exames e consultas.

  • Habilitado por organização (mesmo padrão do Financeiro). Cada pessoa acompanhada é um perfil, então dá para cuidar da família toda.
  • Medicamentos com horários e frequência, registro de doses tomadas/puladas, adesão dos últimos 30 dias e estoque que desconta a cada dose.
  • Medições (pressão, glicemia, peso e outras) com faixas de referência: a glicemia é avaliada pelo contexto (jejum/pós-prandial) e a pressão pela pior entre sistólica e diastólica. Metas do médico substituem a faixa geral.
  • Jornada de exames: envie as folhas de pedido, a IA separa exame por exame (preparo, motivo, urgência) e cada um segue a esteira pendente → agendado → realizado → resultado → analisado. Ao anexar um resultado, ele é casado automaticamente com o pedido.
  • O plano mostra a sequência de idas agrupada por preparo (ex.: tudo que é em jejum no mesmo dia), o que já voltou, o que falta e o que conversar com o médico.
  • Consultas viram tarefa na agenda. Há ainda registro de refeições e atividades.
  • Regra de segurança: a IA explica e organiza, mas nunca diagnostica nem prescreve — essa instrução vai em todos os prompts.

💾 Backup

Cópia do banco e do código, local e no Google Drive.

  • Gera dump do PostgreSQL + tar do código, com retenção e envio opcional ao Google Drive.
  • Roda automaticamente no primeiro acesso do dia (desligável por BACKUP_ON_ENTRY=0) e tem tela própria em /backup.

Stack e decisões técnicas

BackendPython 3.13 + Flask (app factory + blueprints)
BancoPostgreSQL 17 via SQLAlchemy (psycopg3)
IAAnthropic Claude — classificação de e-mail, briefing, assistente com ferramentas e leitura de comprovantes
E-mailGmail API (OAuth), Microsoft Graph (OAuth) e IMAP/SMTP
AgendaGoogle Calendar API e Microsoft Graph (ler e criar eventos)
FrontJinja2 + CSS próprio (visual estilo Google, degradê azul→preto), Web Speech API para voz
Porta5001 (a 5000 é usada pelo AirPlay no macOS)

Rotas (125)

Todas as URLs do app, com método HTTP, parâmetros e o que fazem.

/backup — 5 rota(s)

MétodoURLParâmetrosO que faz
GET /backup/
POST /backup/executar
GET /backup/google/callback
GET /backup/google/conectar
POST /backup/google/desconectar

/chat — 3 rota(s)

MétodoURLParâmetrosO que faz
GET /chat/
POST /chat/clear
POST /chat/send

/docs — 1 rota(s)

MétodoURLParâmetrosO que faz
GET /docs/

/documentos — 11 rota(s)

MétodoURLParâmetrosO que faz
GET /documentos/
GET /documentos/<int:doc_id> doc_id
POST /documentos/<int:doc_id>/analisar doc_id
GET /documentos/<int:doc_id>/arquivo doc_id Serve o arquivo do disco (fora de static).
POST /documentos/<int:doc_id>/delete doc_id
POST /documentos/<int:doc_id>/edit doc_id
POST /documentos/<int:doc_id>/mover doc_id Atalho para arrastar um documento para outra categoria (usado no painel).
POST /documentos/categoria/<int:cat_id>/delete cat_id
POST /documentos/categoria/<int:cat_id>/edit cat_id
POST /documentos/categoria/new
POST /documentos/upload Recebe 1+ arquivos, salva na pasta 'A organizar' e (se pedido) manda a IA

/emails — 12 rota(s)

MétodoURLParâmetrosO que faz
GET /emails/
POST /emails/<int:account_id>/disconnect account_id
POST /emails/<int:msg_id>/to-tarefa msg_id
GET /emails/<int:msg_id>/view msg_id
GET /emails/callback
GET /emails/connect
GETPOST /emails/imap/new
GET /emails/outlook/callback
GET /emails/outlook/connect
GET /emails/reclassify
POST /emails/send
GET /emails/sync

/etapas — 5 rota(s)

MétodoURLParâmetrosO que faz
GET /etapas/<int:etapa_id> etapa_id
POST /etapas/<int:etapa_id>/delete etapa_id
POST /etapas/<int:etapa_id>/edit etapa_id
POST /etapas/<int:etapa_id>/status etapa_id
POST /etapas/new

/financeiro — 15 rota(s)

MétodoURLParâmetrosO que faz
GET /financeiro/
POST /financeiro/<int:lanc_id>/delete lanc_id
POST /financeiro/<int:lanc_id>/edit lanc_id
POST /financeiro/<int:lanc_id>/pagar lanc_id
POST /financeiro/<int:lanc_id>/reembolsado lanc_id Dá baixa no reembolso: marca como recebido e lança a entrada (receita).
POST /financeiro/cartao/<int:cartao_id>/delete cartao_id
POST /financeiro/cartao/<int:cartao_id>/edit cartao_id
POST /financeiro/cartao/new
POST /financeiro/conta/<int:conta_id>/delete conta_id
POST /financeiro/conta/<int:conta_id>/edit conta_id
POST /financeiro/conta/new
POST /financeiro/extrair Recebe um arquivo e devolve os dados extraídos (para pré-preencher).
GET /financeiro/lancamento/<int:lanc_id> lanc_id
POST /financeiro/lancamento/<int:lanc_id>/anexo lanc_id Anexa (ou troca) o arquivo de um lançamento existente.
POST /financeiro/novo

/main — 4 rota(s)

MétodoURLParâmetrosO que faz
GET / Entrada do app: abre direto no ambiente atual — padrão Grupo Orletti.
GET /calendario Calendário mensal — mostra TODAS as organizações para evitar conflitos.
GET /env/<int:org_id> org_id
GET /painel

/orgs — 5 rota(s)

MétodoURLParâmetrosO que faz
GET /orgs/<int:org_id> org_id
GET /orgs/<int:org_id>/briefing org_id
POST /orgs/<int:org_id>/delete org_id
POST /orgs/<int:org_id>/edit org_id
POST /orgs/new

/people — 4 rota(s)

MétodoURLParâmetrosO que faz
GET /people/
POST /people/<int:person_id>/delete person_id
POST /people/<int:person_id>/edit person_id
POST /people/new

/project_types — 4 rota(s)

MétodoURLParâmetrosO que faz
GET /tipos/
POST /tipos/<int:type_id>/delete type_id
POST /tipos/<int:type_id>/edit type_id
POST /tipos/new

/projects — 4 rota(s)

MétodoURLParâmetrosO que faz
GET /projects/<int:project_id> project_id
POST /projects/<int:project_id>/delete project_id
POST /projects/<int:project_id>/edit project_id
POST /projects/new

/saude — 45 rota(s)

MétodoURLParâmetrosO que faz
GET /saude/
GET /saude/alimentacao
GET /saude/analise Panorama da IA (cacheado por dia; ?refresh=1 regera).
POST /saude/atividade/<int:ativ_id>/delete ativ_id
POST /saude/atividade/new
POST /saude/condicao/<int:cond_id>/delete cond_id
POST /saude/condicao/<int:cond_id>/edit cond_id
POST /saude/condicao/new
POST /saude/consulta/<int:consulta_id>/delete consulta_id
POST /saude/consulta/<int:consulta_id>/edit consulta_id
POST /saude/consulta/new
GET /saude/consultas
POST /saude/dose Marca/desmarca uma dose (tomada ou pulada). Chamado por fetch no painel.
GET /saude/dossie O dossiê em texto puro — útil para levar impresso ao médico.
GET /saude/exame/<int:exame_id> exame_id
POST /saude/exame/<int:exame_id>/analisar exame_id Manda o anexo para a IA ler: transcreve os itens, resume e alerta.
POST /saude/exame/<int:exame_id>/delete exame_id
POST /saude/exame/<int:exame_id>/edit exame_id
POST /saude/exame/<int:exame_id>/item/<int:item_id>/monitorar exame_id item_id Joga um analito do exame para o monitoramento, virando ponto no gráfico.
POST /saude/exame/new Aceita várias folhas de uma vez — cada arquivo vira um exame.
GET /saude/exames
POST /saude/item/<int:item_id>/status item_id Anda (ou volta) a esteira de um exame pedido.
GET /saude/jornada A esteira dos exames pedidos, agrupada por tipo de ida.
POST /saude/jornada/casar Reprocessa o casamento entre resultados já anexados e exames pedidos.
GET /saude/medicamento/<int:med_id> med_id
POST /saude/medicamento/<int:med_id>/delete med_id
POST /saude/medicamento/<int:med_id>/edit med_id
POST /saude/medicamento/<int:med_id>/estoque med_id Repor a caixa: soma (ou define) a quantidade em casa.
POST /saude/medicamento/<int:med_id>/toggle med_id
POST /saude/medicamento/new
POST /saude/medicao/<int:med_id>/delete med_id
POST /saude/medicao/new
GET /saude/medicoes Histórico de um tipo, com gráfico e estatísticas.
POST /saude/meta/<int:meta_id>/delete meta_id
POST /saude/meta/new
POST /saude/perfil/<int:perfil_id>/delete perfil_id
POST /saude/perfil/<int:perfil_id>/edit perfil_id
GET /saude/perfil/<int:perfil_id>/focar perfil_id
POST /saude/perfil/new
POST /saude/pergunta/<int:pergunta_id>/delete pergunta_id
POST /saude/pergunta/<int:pergunta_id>/responder pergunta_id
POST /saude/plano Gera (ou regera) o plano da jornada de exames.
POST /saude/refeicao/<int:ref_id>/analisar ref_id
POST /saude/refeicao/<int:ref_id>/delete ref_id
POST /saude/refeicao/new

/tarefas — 7 rota(s)

MétodoURLParâmetrosO que faz
GET /tarefas/
GET /tarefas/<int:tarefa_id> tarefa_id
POST /tarefas/<int:tarefa_id>/delete tarefa_id
POST /tarefas/<int:tarefa_id>/edit tarefa_id
POST /tarefas/<int:tarefa_id>/schedule tarefa_id Agendar/reagendar rapidamente uma tarefa para uma data.
POST /tarefas/<int:tarefa_id>/toggle tarefa_id
POST /tarefas/new

Modelos de dados (30)

Cada tabela, suas colunas, tipos, chaves, relações e campos calculados.

AnaliseSaude · tabela analises_saude

Panorama gerado pela IA (cacheado por dia, igual ao Briefing).

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
dia DATE obrigatório
conteudo TEXT
created_at DATETIME
Relações: perfil → PerfilSaude
Campos calculados:
  • dados

Atividade · tabela atividades_fisicas

Exercício físico — parte do tratamento de diabetes e hipertensão.

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
tipo VARCHAR(20)
data DATE obrigatório
duracao_min INTEGER
intensidade VARCHAR(20)
calorias INTEGER
notas TEXT
created_at DATETIME
Relações: perfil → PerfilSaude
Campos calculados:
  • intensidade_label
  • tipo_label

Briefing · tabela briefings

Resumo diário (IA) por organização — o 'norte do dia'.

ColunaTipoDetalhes
id INTEGER PK obrigatório
organization_id INTEGER FK → organizations.id obrigatório
day DATE obrigatório
content TEXT
created_at DATETIME
Relações: organization → Organization

Cartao · tabela cartoes

Cartão de crédito — limite, fechamento e vencimento.

ColunaTipoDetalhes
id INTEGER PK obrigatório
organization_id INTEGER FK → organizations.id obrigatório
nome VARCHAR(120) obrigatório
limite NUMERIC(12, 2)
dia_fechamento INTEGER
dia_vencimento INTEGER
cor VARCHAR(7)
created_at DATETIME
Relações: organization → Organization lancamentos → Lancamento
Campos calculados:
  • disponivel_f
  • limite_f
  • usado_f

CategoriaDocumento · tabela categorias_documento

Uma pasta de documentos. Vira uma pasta de verdade no disco.

ColunaTipoDetalhes
id INTEGER PK obrigatório
organization_id INTEGER FK → organizations.id obrigatório
nome VARCHAR(120) obrigatório
pasta VARCHAR(120) obrigatório
icone VARCHAR(8)
descricao VARCHAR(300)
criada_pela_ia BOOLEAN
created_at DATETIME
Relações: organization → Organization documentos → Documento
Campos calculados:
  • total

ChatMessage · tabela chat_messages

Histórico de conversa com o assistente (agente IA).

ColunaTipoDetalhes
id INTEGER PK obrigatório
role VARCHAR(20) obrigatório
content TEXT obrigatório
actions TEXT
created_at DATETIME

Condicao · tabela condicoes_saude

Condição de saúde acompanhada (ex.: Diabetes tipo 2, Hipertensão).

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
nome VARCHAR(200) obrigatório
cid VARCHAR(20)
data_diagnostico DATE
medico VARCHAR(200)
status VARCHAR(20)
notas TEXT
created_at DATETIME
Relações: perfil → PerfilSaude medicamentos → Medicamento
Campos calculados:
  • status_label
  • tone

Consulta · tabela consultas_saude

Consulta médica — o que foi orientado é o que vira plano de ação.

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
condicao_id INTEGER FK → condicoes_saude.id
especialidade VARCHAR(120)
medico VARCHAR(200)
local VARCHAR(200)
data DATE
hora TIME
motivo VARCHAR(300)
status VARCHAR(20)
diagnostico TEXT
orientacoes TEXT
anexo_path VARCHAR(300)
notas TEXT
tarefa_id INTEGER FK → tarefas.id
created_at DATETIME
Relações: perfil → PerfilSaude condicao → Condicao tarefa → Tarefa
Campos calculados:
  • anexo_url
  • is_futura
  • quando_label
  • status_label

ContaBancaria · tabela contas_bancarias

Conta bancária / carteira — de onde o dinheiro sai e entra.

ColunaTipoDetalhes
id INTEGER PK obrigatório
organization_id INTEGER FK → organizations.id obrigatório
nome VARCHAR(120) obrigatório
banco VARCHAR(120)
tipo VARCHAR(20)
saldo NUMERIC(12, 2)
cor VARCHAR(7)
ativa BOOLEAN
created_at DATETIME
Relações: organization → Organization lancamentos → Lancamento
Campos calculados:
  • a_pagar_f — Contas em aberto que sairão desta conta.
  • saldo_f
  • saldo_projetado_f
  • tipo_label

Despesa · tabela despesas

Despesa fixa/recorrente (modelo que gera lançamentos por período).

ColunaTipoDetalhes
id INTEGER PK obrigatório
organization_id INTEGER FK → organizations.id obrigatório
descricao VARCHAR(300) obrigatório
categoria VARCHAR(30)
subcategoria VARCHAR(60)
valor NUMERIC(12, 2)
dia_vencimento INTEGER
data_inicio DATE
data_fim DATE
recorrente BOOLEAN
ativo BOOLEAN
created_at DATETIME
Relações: organization → Organization lancamentos → Lancamento

Documento · tabela documentos

Um arquivo guardado no cofre, com o que a IA entendeu dele.

ColunaTipoDetalhes
id INTEGER PK obrigatório
organization_id INTEGER FK → organizations.id obrigatório
categoria_id INTEGER FK → categorias_documento.id
nome_original VARCHAR(400)
nome_arquivo VARCHAR(400)
caminho_rel VARCHAR(700)
mime VARCHAR(120)
tamanho INTEGER
titulo VARCHAR(400)
tipo_doc VARCHAR(40)
emissor VARCHAR(200)
titular VARCHAR(200)
numero VARCHAR(120)
data_documento DATE
data_tipo VARCHAR(30)
valor NUMERIC(12, 2)
resumo TEXT
tags TEXT
analisado BOOLEAN
ai_analisado_em DATETIME
tarefa_id INTEGER FK → tarefas.id
created_at DATETIME
Relações: organization → Organization categoria → CategoriaDocumento tarefa → Tarefa
Campos calculados:
  • data_futura — A data principal ainda está por vir? (para lembrete de voo/vencimento)
  • data_tipo_label
  • ext
  • is_image
  • is_pdf
  • tags_list
  • tamanho_label
  • tipo_label
  • valor_f

DoseRegistro · tabela doses_registro

Registro de uma dose: prevista para tal dia/hora, tomada ou pulada.

ColunaTipoDetalhes
id INTEGER PK obrigatório
medicamento_id INTEGER FK → medicamentos.id obrigatório
data DATE obrigatório
horario VARCHAR(5) obrigatório
tomado BOOLEAN
pulado BOOLEAN
hora_registro DATETIME
observacao VARCHAR(300)
Relações: medicamento → Medicamento

EmailAccount · tabela email_accounts

Conta de e-mail conectada a uma organização (Gmail agora, Outlook depois).

ColunaTipoDetalhes
id INTEGER PK obrigatório
provider VARCHAR(20)
email VARCHAR(200)
token_json TEXT
connected_at DATETIME
last_sync DATETIME
organization_id INTEGER FK → organizations.id obrigatório
Relações: organization → Organization messages → EmailMessage
Campos calculados:
  • can_send — True se a conta pode enviar (Gmail não; Outlook sim; IMAP se tiver SMTP).
  • label

EmailMessage · tabela email_messages

E-mail sincronizado (cache local) com categoria atribuída pela IA.

ColunaTipoDetalhes
id INTEGER PK obrigatório
provider_id VARCHAR(512)
sender VARCHAR(400)
sender_email VARCHAR(320)
subject VARCHAR(1000)
snippet TEXT
received_at DATETIME
is_unread BOOLEAN
category VARCHAR(30)
importance VARCHAR(10)
due_date DATE
ai_summary VARCHAR(400)
classified BOOLEAN
account_id INTEGER FK → email_accounts.id obrigatório
tarefa_id INTEGER FK → tarefas.id
Relações: account → EmailAccount tarefa → Tarefa
Campos calculados:
  • category_icon
  • category_label

Etapa · tabela etapas

Fase de um projeto (cartão do quadro Kanban).

ColunaTipoDetalhes
id INTEGER PK obrigatório
title VARCHAR(300) obrigatório
description TEXT
status VARCHAR(30)
priority VARCHAR(20)
due_date DATE
position INTEGER
created_at DATETIME
project_id INTEGER FK → projects.id obrigatório
Relações: project → Project tarefas → Tarefa
Campos calculados:
  • is_overdue
  • organization
  • priority_label
  • progress
  • status_label

Exame · tabela exames

Solicitação ou resultado de exame, com anexo e leitura pela IA.

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
condicao_id INTEGER FK → condicoes_saude.id
tipo VARCHAR(20)
titulo VARCHAR(300) obrigatório
data DATE
medico VARCHAR(200)
laboratorio VARCHAR(200)
especialidade VARCHAR(120)
status VARCHAR(20)
arquivo_path VARCHAR(300)
notas TEXT
analisado BOOLEAN
ai_resumo TEXT
ai_alertas TEXT
ai_perguntas TEXT
ai_preparo TEXT
ai_analisado_em DATETIME
created_at DATETIME
Relações: perfil → PerfilSaude condicao → Condicao itens → ExameItem medicoes → Medicao
Campos calculados:
  • alertas_list
  • arquivo_is_image
  • arquivo_is_pdf
  • arquivo_url
  • is_solicitacao
  • itens_alterados
  • perguntas_list
  • status_label
  • tipo_label

ExameItem · tabela exame_itens

Um exame individual.

ColunaTipoDetalhes
id INTEGER PK obrigatório
exame_id INTEGER FK → exames.id obrigatório
nome VARCHAR(200) obrigatório
valor VARCHAR(120)
valor_num NUMERIC(12, 3)
unidade VARCHAR(40)
referencia VARCHAR(160)
flag VARCHAR(20)
explicacao TEXT
status VARCHAR(20)
data_agendada DATE
local VARCHAR(200)
preparo TEXT
motivo TEXT
urgencia VARCHAR(10)
grupo VARCHAR(120)
observacao TEXT
atendido_por_id INTEGER FK → exame_itens.id
Relações: atendido_por → ExameItem exame → Exame
Campos calculados:
  • atrasado — Agendado para uma data que já passou, e nada foi registrado depois.
  • concluido
  • cor
  • flag_label
  • progresso — 0-100 na esteira — quanto deste exame já andou.
  • resultado_label — O valor que atendeu este pedido, se já chegou.
  • status_icon
  • status_label

Lancamento · tabela lancamentos

Conta a pagar / pagamento — a unidade do financeiro.

ColunaTipoDetalhes
id INTEGER PK obrigatório
organization_id INTEGER FK → organizations.id obrigatório
tipo VARCHAR(10)
descricao VARCHAR(300) obrigatório
categoria VARCHAR(30)
subcategoria VARCHAR(60)
fornecedor VARCHAR(200)
valor NUMERIC(12, 2)
vencimento DATE
pago BOOLEAN
data_pagamento DATE
forma_pagamento VARCHAR(30)
origem VARCHAR(120)
parcelas INTEGER
parcela_num INTEGER
grupo VARCHAR(40)
reembolsavel BOOLEAN
reembolso_origem VARCHAR(120)
reembolsado BOOLEAN
anexo_path VARCHAR(300)
notas TEXT
cartao_id INTEGER FK → cartoes.id
conta_id INTEGER FK → contas_bancarias.id
despesa_id INTEGER FK → despesas.id
email_message_id INTEGER FK → email_messages.id
created_at DATETIME
Relações: cartao → Cartao conta → ContaBancaria despesa → Despesa email → EmailMessage organization → Organization
Campos calculados:
  • anexo_is_image
  • anexo_is_pdf
  • anexo_url
  • category_icon
  • category_label
  • forma_label
  • is_overdue
  • is_receita
  • parcela_label
  • valor_f

Medicamento · tabela medicamentos

Medicamento em uso, com frequência, horários e controle de estoque.

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
condicao_id INTEGER FK → condicoes_saude.id
nome VARCHAR(200) obrigatório
principio_ativo VARCHAR(200)
dosagem VARCHAR(60)
forma VARCHAR(20)
via VARCHAR(20)
quantidade_dose NUMERIC(8, 2)
frequencia VARCHAR(20)
horarios TEXT
data_inicio DATE
data_fim DATE
continuo BOOLEAN
estoque_atual NUMERIC(8, 2)
estoque_alerta NUMERIC(8, 2)
prescrito_por VARCHAR(200)
instrucoes TEXT
ativo BOOLEAN
created_at DATETIME
Relações: perfil → PerfilSaude condicao → Condicao doses → DoseRegistro
Campos calculados:
  • dias_de_estoque — Para quantos dias ainda dá o estoque, no ritmo atual.
  • doses_por_dia
  • em_uso_hoje
  • estoque_baixo
  • estoque_f
  • forma_label
  • frequencia_label
  • horarios_list
  • rotulo — 'Losartana 50 mg' — como o usuário chama o remédio.
  • via_label

Medicao · tabela medicoes

Um monitoramento pontual: glicemia, pressão, peso, exame laboratorial…

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
tipo VARCHAR(30) obrigatório
valor NUMERIC(9, 2) obrigatório
valor2 NUMERIC(9, 2)
contexto VARCHAR(30)
data_hora DATETIME obrigatório
notas TEXT
exame_id INTEGER FK → exames.id
created_at DATETIME
Relações: perfil → PerfilSaude exame → Exame
Campos calculados:
  • alerta
  • classificacao — normal | atencao | alto | baixo | critico | None (sem referência).
  • classificacao_label
  • contexto_label
  • cor
  • icon
  • meta
  • tipo_label
  • unidade
  • valor2_f
  • valor_f
  • valor_label

MetaSaude · tabela metas_saude

Meta definida com o médico (ex.: glicemia de jejum entre 80 e 130).

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
tipo VARCHAR(30) obrigatório
contexto VARCHAR(30)
alvo_min NUMERIC(9, 2)
alvo_max NUMERIC(9, 2)
descricao VARCHAR(300)
definida_por VARCHAR(200)
ativa BOOLEAN
created_at DATETIME
Relações: perfil → PerfilSaude
Campos calculados:
  • faixa_label
  • tipo_label
  • unidade

Organization · tabela organizations

The base class of the :attr:`.SQLAlchemy.Model` declarative model class.

ColunaTipoDetalhes
id INTEGER PK obrigatório
name VARCHAR(120) obrigatório
role VARCHAR(120)
color VARCHAR(7)
logo_path VARCHAR(300)
tipo VARCHAR(20)
financeiro_enabled BOOLEAN
saude_enabled BOOLEAN
documentos_enabled BOOLEAN
created_at DATETIME
Relações: projects → Project people → Person
Campos calculados:
  • active_projects
  • logo_url
  • pasta_documentos — Nome da subpasta desta organização dentro da raiz de Documentos.

PerfilSaude · tabela perfis_saude

Pessoa acompanhada (você, cônjuge, filho…). Raiz de tudo no módulo.

ColunaTipoDetalhes
id INTEGER PK obrigatório
organization_id INTEGER FK → organizations.id obrigatório
nome VARCHAR(160) obrigatório
data_nascimento DATE
sexo VARCHAR(20)
tipo_sanguineo VARCHAR(5)
altura_cm NUMERIC(5, 1)
plano_saude VARCHAR(120)
carteirinha VARCHAR(60)
alergias TEXT
contato_emergencia VARCHAR(200)
observacoes TEXT
principal BOOLEAN
created_at DATETIME
Relações: organization → Organization condicoes → Condicao medicamentos → Medicamento medicoes → Medicao exames → Exame consultas → Consulta refeicoes → Refeicao atividades → Atividade metas → MetaSaude
Campos calculados:
  • altura_m
  • condicoes_ativas
  • idade
  • imc
  • imc_label
  • medicamentos_ativos
  • peso_atual — Último peso registrado (medição do tipo `peso`).

PerguntaSaude · tabela perguntas_saude

Pergunta que a IA faz ao paciente para fechar as lacunas do acompanhamento.

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
pergunta TEXT obrigatório
por_que TEXT
resposta TEXT
respondida BOOLEAN
created_at DATETIME
respondida_em DATETIME
Relações: perfil → PerfilSaude

Person · tabela people

Responsável — pessoa atribuída a tarefas (e futuramente notificada por e-mail).

ColunaTipoDetalhes
id INTEGER PK obrigatório
name VARCHAR(160) obrigatório
email VARCHAR(200)
role VARCHAR(160)
created_at DATETIME
organization_id INTEGER FK → organizations.id
Relações: organization → Organization tarefas → Tarefa
Campos calculados:
  • initials
  • open_task_count

PlanoSaude · tabela planos_saude

Plano de acompanhamento gerado pela IA a partir das solicitações + resultados.

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
conteudo TEXT
created_at DATETIME
Relações: perfil → PerfilSaude
Campos calculados:
  • dados

Project · tabela projects

The base class of the :attr:`.SQLAlchemy.Model` declarative model class.

ColunaTipoDetalhes
id INTEGER PK obrigatório
name VARCHAR(200) obrigatório
description TEXT
status VARCHAR(30)
created_at DATETIME
organization_id INTEGER FK → organizations.id obrigatório
project_type_id INTEGER FK → project_types.id
Relações: organization → Organization project_type → ProjectType etapas → Etapa tarefas → Tarefa
Campos calculados:
  • progress — % de andamento do projeto = percentual de etapas concluídas.
  • total_tarefas

ProjectType · tabela project_types

Tipo de projeto com etapas padrão (boas práticas, enxutas).

ColunaTipoDetalhes
id INTEGER PK obrigatório
name VARCHAR(120) obrigatório
default_etapas TEXT
created_at DATETIME
Campos calculados:
  • etapas_list

Refeicao · tabela refeicoes

Registro alimentar — com estimativa da IA de carboidratos, sódio etc.

ColunaTipoDetalhes
id INTEGER PK obrigatório
perfil_id INTEGER FK → perfis_saude.id obrigatório
tipo VARCHAR(20)
data_hora DATETIME obrigatório
descricao TEXT obrigatório
foto_path VARCHAR(300)
calorias INTEGER
carboidratos_g NUMERIC(7, 1)
proteinas_g NUMERIC(7, 1)
gorduras_g NUMERIC(7, 1)
acucar_g NUMERIC(7, 1)
sodio_mg INTEGER
fibras_g NUMERIC(7, 1)
ai_analise TEXT
ai_risco VARCHAR(10)
notas TEXT
created_at DATETIME
Relações: perfil → PerfilSaude
Campos calculados:
  • foto_url
  • icon
  • risco_cor
  • tipo_label

Tarefa · tabela tarefas

Ação que o usuário precisa fazer, com data agendada. Pode pertencer a uma

ColunaTipoDetalhes
id INTEGER PK obrigatório
title VARCHAR(300) obrigatório
description TEXT
done BOOLEAN
priority VARCHAR(20)
due_date DATE
due_time TIME
position INTEGER
created_at DATETIME
etapa_id INTEGER FK → etapas.id
project_id INTEGER FK → projects.id
organization_id INTEGER FK → organizations.id
Relações: etapa → Etapa project → Project organization → Organization assignees → Person
Campos calculados:
  • context_label
  • is_overdue
  • is_scheduled
  • is_standalone — Avulsa = fora de qualquer etapa/projeto.
  • org_effective — Organização efetiva (própria, do projeto ou da etapa).
  • priority_label
  • time_label

Serviços (56 funções)

A camada que fala com o mundo externo (IA, Google, Microsoft, IMAP, backup) — com assinatura e parâmetros.

services/agent.py

Assistente (agente IA) do meuAgente.

  • generate_briefing(org)
  • run_chat(history, user_message, current_org)
    history: lista de {role, content} (texto). Retorna (texto, acoes[]).

services/backup.py

Backup diário do meuAgente — banco de dados + código da aplicação.

  • archive_app(dest_dir: pathlib.Path) -> pathlib.Path
    Compacta o código da aplicação (inclui o `.env`, que guarda as chaves).
  • dump_database(dest_dir: pathlib.Path) -> pathlib.Path
    Grava o dump do banco em `dest_dir` e devolve o caminho do arquivo.
  • last_backup() -> dict | None
    Metadados do último backup concluído (ou None se nunca rodou).
  • list_backups() -> list[dict]
    Backups locais existentes, do mais recente para o mais antigo.
  • maybe_daily_backup(app)
    Se ainda não houve backup hoje, dispara um em segundo plano.
  • prune_old(keep=14)
    Mantém apenas os `keep` backups locais mais recentes.
  • ran_today() -> bool
  • run_backup(upload=True) -> dict
    Executa um backup completo. Devolve o manifest (também salvo em disco).

services/calendars.py

Camada unificada de calendários (Google Agenda + Outlook/Graph).

  • contas_com_agenda(org=None)
  • criar_evento(org, titulo, inicio, fim=None, descricao=None)
    Cria o evento na primeira conta com agenda da organização. Devolve (ok, mensagem/link).
  • eventos(inicio, fim, org=None)
    Eventos de todas as contas (ou de uma org), já normalizados.
  • eventos_do_dia(dia, org=None)
  • eventos_do_mes(ano, mes, org=None)

services/classify.py

Classificação de e-mails por IA (Claude) com fallback por regras.

  • classify_batch(items)
    Classifica uma lista de e-mails.

services/documentos_ai.py

IA do cofre de Documentos (Claude).

  • classificar(file_bytes: bytes, media_type: str, categorias_existentes=None, contexto: str = '')
    Lê o documento e devolve o dict conforme _SCHEMA, ou None se o formato do arquivo não for suportado (não é imagem nem PDF).

services/finance_ai.py

Extração de dados de nota fiscal / cupom / comprovante via IA (Claude vision).

  • extract_receipt(file_bytes: bytes, media_type: str)
    Devolve dict {valor, data, fornecedor, categoria, descricao} ou None.

services/gdrive.py

Envio dos backups para o Google Drive.

  • account_email() -> str | None
    E-mail da conta conectada (para mostrar na tela).
  • authorization_url()
  • build_flow(state=None)
  • disconnect()
  • exchange_code(code, state=None, code_verifier=None)
    Troca o `code` do callback pelas credenciais e salva o token em disco.
  • is_connected() -> bool
  • upload_folder(folder_name: str, files: list[pathlib.Path]) -> list[dict]
    Sobe `files` para `meuAgente Backups/<folder_name>/` no Drive.

services/gmail.py

Integração com o Gmail — OAuth 2.0 (somente leitura) e busca de e-mails.

  • authorization_url()
  • build_flow(state=None)
  • counts(account)
    Contadores rápidos: total estimado e não lidos na caixa de entrada.
  • create_event(account, titulo, inicio, fim, descricao=None)
    Cria um evento na agenda principal.
  • exchange_code(code, state=None, code_verifier=None)
    Troca o `code` do callback por credenciais e devolve (token_json, email).
  • fetch_body(account, provider_id)
    Busca o corpo (texto) de um e-mail específico do Gmail.
  • fetch_recent(account, max_results=25)
    Busca metadados dos e-mails recentes da caixa de entrada.
  • list_events(account, inicio, fim)
    Eventos entre dois datetimes. Devolve lista normalizada.
  • refreshed_token_json(account)
    Garante um access token válido; devolve token_json atualizado (ou o mesmo).

services/health_ai.py

IA do módulo de Saúde (Claude).

  • analisar_exame(file_bytes: bytes, media_type: str, contexto: str = '')
    Lê o anexo do exame. Devolve dict conforme _EXAME_SCHEMA, ou None se o formato do arquivo não for suportado.
  • analisar_refeicao(descricao: str, contexto: str = '', file_bytes: bytes = None, media_type: str = None)
    Estima nutrientes e comenta a refeição. Devolve dict conforme _REFEICAO_SCHEMA.
  • gerar_panorama(dossie: str)
    Recebe o dossiê em texto e devolve dict conforme _PANORAMA_SCHEMA.
  • montar_plano(dossie: str, exames_texto: str)
    Devolve o plano da jornada de exames conforme _PLANO_SCHEMA.

services/imap_mail.py

Contas de e-mail genéricas via IMAP (receber) + SMTP (enviar).

  • can_send(account)
  • config(account)
  • fetch_body(account, provider_id)
    Busca o corpo (texto) de um e-mail específico via IMAP, pelo Message-ID.
  • fetch_recent(account, max_results=50)
    Busca os e-mails recentes da INBOX (headers + flags).
  • imap_cfg(account)
  • make_token_json(imap, smtp=None)
  • send_email(account, to_addr, subject, body)
    Envia um e-mail simples pela conta (SMTP).
  • smtp_cfg(account)
  • test_imap(cfg)
    Levanta exceção se não conseguir logar; devolve True se OK.
  • test_smtp(cfg)

services/mailutil.py

Utilitários comuns de e-mail.

  • html_to_text(html: str) -> str

services/outlook.py

Integração Microsoft/Outlook via OAuth (Microsoft Graph).

  • build_auth_flow()
    Inicia o fluxo OAuth; devolve o dict do MSAL (guardar na sessão).
  • create_event(account, titulo, inicio, fim, descricao=None)
  • exchange_code(flow, args)
    Conclui o login. Devolve (token_json, email).
  • fetch_body(account, provider_id)
  • fetch_recent(account, max_results=50)
  • list_events(account, inicio, fim)
    Eventos entre dois datetimes (calendarView).
  • send_email(account, to_addr, subject, body)

Regras do projeto

  • Testes nunca rodam no banco real: usam o PostgreSQL meuagente_test.
  • As integrações degradam com elegância: sem credencial/permissão, a tela continua funcionando.
  • Migrações leves rodam na subida do app (adicionam colunas sem apagar dados).
  • O .env guarda as credenciais e nunca é versionado.

Guias passo a passo em docs/EMAIL_SETUP.md, docs/OUTLOOK_SETUP.md, docs/BACKUP.md e docs/ARQUITETURA.md.