Commit Graph

192 Commits

Author SHA1 Message Date
VPS 4 Deploy Agent ab6038ccaf chore(scoreodonto): bump submódulo — /wa-sessions sidebar + tema claro
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 03:56:25 +02:00
VPS 4 Deploy Agent 35188b4f9a feat(ext-api): chave de satélite e-mail-capable (REST + WS)
A integration_key do satélite (nwk_) passa a resolver por x-nw-email quando
presente (preserva multi-conta: cada usuário vê o WhatsApp do seu e-mail),
caindo no tenant dono do par quando ausente — igual no middleware REST e no
handshake do WS bridge. Valida o par (revoke) antes de resolver por email.
Permite migrar o scoreodonto da EXT_MASTER_KEY global p/ chave própria
(revogável/auditada), sem mudança de comportamento.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 03:56:25 +02:00
VPS 4 Deploy Agent 89758a0e6b feat(ext-api): gerenciador de satélites — auth por integration_key + gestão
Torna o registry de satélites (PluginPair) o gatekeeper do ext-api, em vez de
uma única EXT_MASTER_KEY global:
- satellites.ts: serviço + router /api/ext/v1/satellites (listar/provisionar/
  revogar/rotacionar), montado fora do authMiddleware com gate de chave mestra.
- apikey-auth: resolvePairKey aceita a chave do satélite (nwk_) no REST e no WS,
  resolvendo o tenant do par; checa revoke no banco a cada request (revoke
  instantâneo) + throttle de lastSeenAt.
- Chave mestra e ApiKey por-tenant seguem funcionando (não-quebra).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 03:29:43 +02:00
VPS 4 Deploy Agent c18b956a56 chore(scoreodonto): bump submódulo — ponte de agenda + tema claro da Secretária
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 00:51:47 +02:00
VPS 4 Deploy Agent 28b9ba899c feat(secretaria): kill-switch do auto-reply (secretaria.auto_reply=false)
Bloqueia SÓ o disparo automático da Secretária (envios manuais seguem normais).
Só desliga quando a config é explicitamente false — sem a flag, inalterado.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 00:51:47 +02:00
VPS 4 Deploy Agent d09155613c feat(secretaria): tools de agenda operam na agenda real do satélite via ponte
listar_horarios/agendar_horario chamam a ponte do scoreodonto (/api/nw/agenda
slots|book) quando configurada — slot_id sintético (dentista|start|end), telefone
derivado do JID do contato — com fallback ao calendário interno preservado.
brain.ts injeta a config da agenda (agenda_url/secret/clinica_id) no toolCtx.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 00:51:47 +02:00
VPS 4 Deploy Agent 80dc5dd135 chore(scoreodonto): bump submódulo — satélite newwhats (proxy/frontend/realtime)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 20:59:01 +02:00
VPS 4 Deploy Agent 6045f17390 chore(dev): corrige caminhos do ecosystem.dev p/ /home/deploy/stack
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 20:55:32 +02:00
VPS 4 Deploy Agent 007c300cb0 fix(secretaria): fallback resiliente a erros de rede no callAI
isRecoverableError inclui fetch failed/timeout/econnreset/etimedout/und_err —
um blip de rede no primeiro provider agora cai para o próximo da chain (openai→
gemini→anthropic→ollama) em vez de virar "[Erro ao chamar IA: fetch failed]".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 20:55:22 +02:00
VPS 4 Deploy Agent a1eec8dac2 feat(ext-api): inbox ordenado, avatar self-heal, /sec/keys e guard de grupo
- GET /inbox: orderBy lastMessageAt DESC NULLS LAST (Postgres põe NULLS FIRST
  em DESC → chats-stub sem mensagem tomavam o topo; parecia lista de contatos).
- GET /contacts/:jid/avatar/refresh: re-busca a foto pela conexão Baileys viva
  (URLs do CDN expiram/404), com timeout de 5s e limpeza da URL obsoleta.
- GET/PUT /sec/keys: passam a ler/gravar na config do plugin 'secretaria'
  (config é por-plugin: set(pluginName, obj)); antes gravava em plugin errado
  e o brain nunca via as chaves. Corrige TS2345.
- auto-reply da Secretária: nunca responde em grupos (@g.us).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 20:55:22 +02:00
VPS 4 Deploy Agent dbb4da8220 feat(ext-api): chave mestra + x-nw-email (middleware REST + WS bridge)
Satélite confiável acessa a conta de qualquer email via EXT_MASTER_KEY:
- apikey-auth: helpers isMasterKey/resolveMasterEmail resolvem o tenant pelo
  User.email; middleware REST refatorado para usá-los.
- ws-bridge: handshake do /api/ext/v1/stream trata a chave mestra + x-nw-email
  (antes só tabela apiKey → o túnel WS tomava 401).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 20:55:10 +02:00
VPS 4 Deploy Agent 7c54309aa8 feat(whatsapp): detecta conta Business no connect e persiste isBusiness
No evento 'open', chama getBusinessProfile(selfJid) (fire-and-forget) — só contas
Business retornam perfil (descrição/categoria/horário/etc.). Persiste
Instance.isBusiness e emite 'instance:business' para o tenant. O SettingsPanel já
exibe isBusiness lido de /api/instances.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 17:03:49 +02:00
VPS 4 Deploy Agent 62ba985ebe fix(ext-api): /secretaria/ask usa chat.jid (não remoteJid inexistente)
prisma.chat.findFirst filtrava por remoteJid, que não existe no model Chat (é jid)
→ 500 em todo /secretaria/ask. Corrigido; endpoint retorna o reply normalmente.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 16:53:13 +02:00
VPS 4 Deploy Agent 9ba3c78752 fix(secretaria): embeddings Gemini usam gemini-embedding-001 (768d)
text-embedding-004 foi descontinuado (404 'model not found'). Migra para
gemini-embedding-001 com outputDimensionality=768 (vetores leves p/ JSON+cosseno).
Validado: embed() retorna vetor 768d via Gemini.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 15:29:09 +02:00
VPS 4 Deploy Agent f51785bace fix(secretaria): embed() cai para Gemini se OpenAI falhar (não derruba RAG)
Antes, com openai_key presente, qualquer falha (ex.: 429 insufficient_quota)
retornava null sem tentar o Gemini. Agora tenta OpenAI e, em falha, usa Gemini.
Aviso documentado: OpenAI (1536d) e Gemini (768d) são incompatíveis — trocar de
provider exige reindexar (sync-knowledge + memória de contato).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 15:23:45 +02:00
VPS 4 Deploy Agent bfa320b280 feat(instances): POST /provision — trajeto inteligente e idempotente
Cria+configura a conta no motor em um passo: instância (engine 'baileys7' = API
estável por padrão), setor default (idempotente por [tenantId,name]), webhook
opcional e connect opcional (emite QR). Devolve o 'trajeto' com cada passo
visível (instancia/engine/setor/webhook/conexao/business/secretaria/conhecimento),
marcando como pendentes os passos de plugin/satélite. Re-rodar não duplica.

InstanceRepository: provision() (upsert por unique [tenantId,name]) e ensureSector().

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 14:57:56 +02:00
VPS 4 Deploy Agent e47b64a5b5 feat(media): index e delete em lote de mídias (Wasabi, coordenado DB↔storage)
- StorageProvider.deleteObjects(paths): delete seletivo em lote (chunks de 1000),
  no provider concreto (Wasabi DeleteObjectsCommand + fallback local).
- GET /api/instances/:id/media-index: index/auditoria por chat/tipo/período
  (baseado no DB, com agregado byType, paginado).
- POST /api/instances/:id/media-batch-delete: delete coordenado DB↔Wasabi,
  dryRun por padrão (precisa dryRun:false p/ apagar); limpa mediaPath/mediaUrl.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 14:52:25 +02:00
VPS 4 Deploy Agent 809e378117 feat(inbox): exibir transcrição de áudio/descrição de imagem na conversa
Mostra o texto gerado pelo motor (messages.transcription, Gemini) abaixo do
player de áudio (🎤) e abaixo da imagem (👁). Propaga o campo transcription
por inboxTypes.Message, chatStore.Message e o bridge messagesToLegacy, e
atualiza em tempo real via novo listener socket message:transcription.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 08:46:50 +02:00
VPS 4 Deploy Agent 7893a05f63 feat(media): transcrição de áudio + descrição de imagem no motor (via Gemini)
Move a transcrição para o motor (genérica p/ todos os tenants/satélites):
- media-transcribe.ts: Gemini 2.0 Flash (áudio→texto, imagem→descrição) a partir
  do buffer já baixado; limite inline 18MB; fallback silencioso.
- MessageHandler.processMedia: após salvar a mídia, transcreve fire-and-forget e
  grava em messages.transcription, emitindo 'message:transcription' p/ a UI.
- schema: campo Message.transcription (coluna aplicada nos bancos).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 08:33:42 +02:00
VPS 4 Deploy Agent 734b250238 feat(ext-api): alias GET /secretaria/numbers (sincroniza contrato com satélite)
O satélite (mercado, webhook-receiver) chama /api/ext/v1/secretaria/numbers, mas
o ext-api só tinha /sec/*. Adiciona o alias que espelha a rota interna
/api/secretaria/numbers (lista sec_numbers) — retrocompatível, não altera o satélite.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 08:27:41 +02:00
VPS 4 Deploy Agent 42a04efe14 feat(secretaria): memória de longo prazo por contato (a partir das conversas)
A secretária passa a "lembrar" do cliente entre conversas:
- tabela sec_contact_memory (fato + embedding JSON), chave = ext_chat_id/contact_name.
- na sumarização (a cada ~10 trocas) extrai fatos duradouros do cliente via LLM
  e salva com embedding + dedup por similaridade (>0.92).
- buildSystemPrompt injeta "MEMÓRIA DO CLIENTE" com os fatos mais relevantes à
  pergunta (cosseno); sem chave de embedding usa os mais recentes; tudo com
  fallback silencioso (não regride).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 08:05:42 +02:00
VPS 4 Deploy Agent 31bf45faf5 feat(secretaria): RAG sem pgvector no conhecimento (embeddings + cosseno)
Adiciona busca semântica na Base de Conhecimento da secretária:
- embeddings.ts: chunking, embed (OpenAI text-embedding-3-small ou Gemini
  text-embedding-004) e similaridade cosseno — tudo na aplicação, sem pgvector.
- tabela sec_knowledge_chunks (vetor em JSON/text) com índices.
- brain.ts: no nó 'knowledge', injeta só os top-4 trechos relevantes à pergunta
  do usuário; indexação lazy por hash do conteúdo. Fallback para o conteúdo
  inteiro se não houver chave de embedding ou em qualquer falha (não regride).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 07:08:42 +02:00
VPS 4 Deploy Agent 36405a46f0 feat(secretaria): botão "Usar este modelo" nos modelos de ajuda
Cada modelo do modal de ajuda ganha um botão que cria o nó correspondente no
Cérebro (persona/knowledge/rules/calendar/escalation) já preenchido com o
conteúdo de exemplo. Desabilitado se nenhum agente estiver selecionado.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 06:59:57 +02:00
VPS 4 Deploy Agent 7d191c0cf7 feat(secretaria): ícone de ajuda com modelos de uso e configuração
Adiciona botão de ajuda (HelpCircle) na barra da /secretaria que abre um modal
detalhado: como funciona (agente + cérebro) + modelos prontos para Persona,
Conhecimento, Regras, Agenda e Escalada (copie e adapte) + dicas de uso.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 06:50:43 +02:00
VPS 4 Deploy Agent fdae8beb06 feat(inbox): prioriza nome da agenda + ícone Secretária na ThinSidebar
- Nome exibido: contact.name (agenda) → verifiedName/notify (nome do WhatsApp)
  → pushName da última msg, em vez de cair direto no número quando não há
  nome salvo na agenda.
- ThinSidebar: ícone (BrainCircuit) que direciona para /secretaria.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 06:32:58 +02:00
VPS 4 Deploy Agent 8d35fa1fdf fix(media): deriva extensão/content-type do mimetype (corrige arquivos .bin)
Documentos sem nome/extensão eram salvos como .bin mesmo tendo mimetype
conhecido. Agora a extensão vem de: nome original → mimetype (pdf/docx/xlsx/
mp3/...) → .bin só como último recurso. O serve do Wasabi (/api/storage/view)
também passa a mapear content-type para muitos tipos, não só octet-stream.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 06:11:00 +02:00
VPS 4 Deploy Agent 6d08a5b044 feat(baileys): oculta termo "Baileys" na página para não-admin
Título e textos da página /baileys ficam genéricos ("Monitor de Eventos")
para usuários comuns; "Baileys Engine"/"servidor Baileys" só p/ admin ou
ruibto@gmail.com.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 05:57:02 +02:00
VPS 4 Deploy Agent f75dba0a8f feat(settings): oculta termos técnicos (Baileys/Infinity) para não-admin
Os rótulos técnicos das engines só aparecem para admin ou ruibto@gmail.com:
- usuário comum vê "API estável" e "API com botões";
- admin/ruibto vê "API estável (Baileys 7)" e "InfinityAPI".
(O item 'Baileys' na Sidebar e a página /baileys já são admin-only.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 05:53:45 +02:00
VPS 4 Deploy Agent 43f519e7aa feat(settings): selo Conta Business, aviso de re-scan ao trocar API, log de erro de botões
- Detecta WhatsApp Business (app) via getBusinessProfile no pós-conexão e
  persiste em instances.isBusiness; painel mostra "Conta Business: sim/não"
  (com nota Business App ≠ Business API).
- Painel avisa que trocar de API desconecta e exige escanear o QR novamente,
  com confirmação antes de aplicar a troca.
- sendRichMessage agora monitora e loga erros especificamente quando a mensagem
  tem botões/lista/carrossel (diagnóstico de rejeição de interativos por engine).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 05:45:34 +02:00
VPS 4 Deploy Agent c801d8d820 feat(settings): painel mostra API estável + InfinityAPI (não remove a infinite)
Ajuste: o painel de configurações lista as DUAS engines selecionáveis —
"API estável" (baileys7) e "InfinityAPI" (infinite) — além da versão.
Apenas a 'official' (Baileys 6, que dá 401) fica de fora da UI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 05:12:03 +02:00
VPS 4 Deploy Agent c8c58c3a35 feat(settings): painel central de configurações (API estável + versão)
O ícone de configurações deixa de abrir popover flutuante e passa a abrir um
painel grande na área central (no lugar das mensagens). O painel mostra apenas:
- "API estável" (= engine Baileys 7 oficial/baileys7, a que conecta), com ação
  de ativar na instância;
- a versão do sistema (lida de /version.json).
ThinSidebar simplificada (sem o seletor flutuante); as engines seguem
selecionáveis no backend para teste.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 05:07:50 +02:00
VPS 4 Deploy Agent 5170a31aac feat(engine): adiciona 3ª engine Baileys 7 oficial (baileys7) para teste
Instala baileys@7.0.0-rc13 sob alias 'baileys-official' (coexiste com a
'infinite' = baileys 7.0.0-rc.9 e a 'official' = @whiskeysockets/baileys 6.x).
Nova engine 'baileys7' (LID/username, app-state moderno) selecionável por
instância; validação do PATCH /engine e rich-message (botões nativos v7)
atualizados; opção adicionada ao seletor da ThinSidebar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 04:42:42 +02:00
VPS 4 Deploy Agent e980097fbe feat(chats): sincroniza chats fixados (pin/arquivo) via app-state
Pin/arquivo/mute não vêm no history sync nem em chats.upsert — vivem no
app-state do WhatsApp. Adiciona syncChatStates() que faz resyncAppState das
collections critical_unblock_low/regular_high/regular (isoladas: uma falha não
derruba as outras); os pins chegam como chats.update e já são aplicados em
isPinned, subindo os fixados ao topo (ordenação já existente). Roda no
pós-conexão e reexecuta (3s/15s/40s) pois as app-state keys chegam após parear.
Obs.: depende da engine 'official' (a InfiniteAPI não sincroniza app-state).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 00:53:57 +02:00
VPS 4 Deploy Agent 9d2412df21 feat(safety): kill switch de saída (DISABLE_OUTBOUND) p/ ambientes de teste
Quando DISABLE_OUTBOUND=true, envolve sock.sendMessage na criação da sessão e
bloqueia QUALQUER envio ao WhatsApp — backstop universal, pois todo envio
(rotas, IA/secretária, chatbot, scheduler, warmer, plugins) usa este sock.
Evita que automações disparem mensagens a contatos/grupos reais ao conectar uma
sessão real em dev. Em produção a flag fica ausente/false (envios normais).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 00:17:10 +02:00
VPS 4 Deploy Agent 58583db63d chore(backend): remove .js/.js.map artefatos versionados em src + gitignore
src/ continha 114 artefatos (.js + .js.map) de builds antigos mal-configurados,
commitados por engano. Não são usados em runtime (dev usa tsx sobre .ts; prod usa
dist/, gerado por tsc com rootDir=src/outDir=dist). Remove todos e adiciona
backend/.gitignore para impedir que voltem.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 23:49:56 +02:00
VPS 4 Deploy Agent 2a15e8ea1e fix(secretaria): migra colunas de telemetria em sec_messages (42703)
O createTable de sec_messages não tinha usage_tokens/provider_used/model_used,
mas brain.ts insere esses campos — quebrando com "column does not exist" em
qualquer banco criado antes dessas colunas (ex.: clones). Adiciona as colunas
ao createTable e um bloco idempotente hasColumn/alterTable (padrão já usado no
arquivo) que garante as colunas em tabelas pré-existentes no boot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 23:43:37 +02:00
VPS 4 Deploy Agent 93be34d463 feat(avatar): sincroniza TODOS os avatares (remove caps de enfileiramento)
Os avatares "não vinham todos" porque o enfileiramento era capado em 3
pontos, embora a fila (processAvatarQueue) já seja rate-limited e processe
tudo que entra:
- upsert: cap de 50 por batch (randomizado) -> enfileira todos os pendentes
- syncMissingAvatars: take 80 -> cobre TODOS (chats recentes primeiro +
  varredura paginada de todos os contatos sem avatar)
- syncExpiredAvatars: take 200 + slice 80 -> varre paginado e renova todos
  os avatares com URL do CDN do WhatsApp expirando (<48h)

A cobertura total não dispara ban: a fila mantém ~1 req/s (lotes + delay);
apenas leva mais tempo, em background.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 23:36:18 +02:00
VPS 4 Deploy Agent b04f9cdafc fix(icon): troca BotOff (inexistente no lucide-react) por Bot
BotOff não é exportado pelo lucide-react e gerava "Attempted import error"
no build. O indicador de "bot pausado" no ChatListItem agora usa Bot —
o title e a cor âmbar já comunicam o estado.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 19:15:39 +02:00
VPS 4 Deploy Agent fb974a0dc3 fix(avatar): sidebar não usa mais URL crua do WhatsApp (403)
O avatar da instância na ThinSidebar caía no fallback
activeInstance.avatar/profilePictureUrl — URL do CDN pps.whatsapp.net que
expira e responde 403 (hotlink) no navegador. Agora usa só o proxy do
backend (/proxy-avatar → /api/inbox/avatar, que baixa server-side); sem
proxy resolvível, mostra o ícone em vez da URL crua.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 19:11:50 +02:00
VPS 4 Deploy Agent 7124ec790e perf(whatsapp): índices em FKs + delete de instância em lotes
- Adiciona @@index nas FKs que sofrem cascade/SET NULL ao deletar instância:
  messages.replyToId (self-ref, evitava O(n²) no SET NULL), chats.instanceId,
  chats.contactId, contacts.instanceId, broadcasts.instanceId.
- InstanceRepository.delete agora apaga 'messages' em lotes (5k) antes do
  cascade, evitando transação/locks gigantes em instâncias com dezenas de
  milhares de mensagens. O restante (chats/contacts/...) sai pelo cascade,
  agora rápido com os índices.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 18:58:06 +02:00
VPS 4 Deploy Agent e4a7e79ab1 chore(worktrees): remove worktrees Claude versionados por engano
optimistic-chebyshev-8b2ae4 e suspicious-shockley-980a1e estavam
commitados na main indevidamente; limpa o git status.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 05:17:06 +02:00
VPS 4 Deploy Agent 65118bd467 chore(infra): bump scoreodonto.com -> 8f9177a (status: fila A concluída)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 00:36:57 +02:00
VPS 4 Deploy Agent 7803d4b1ad chore(infra): bump scoreodonto.com -> 715b2dc (fix CI build desbloqueado)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 00:03:21 +02:00
VPS 4 Deploy Agent 34d9921d2c chore(infra): bump scoreodonto.com -> 8a27f3b (status corrigido + versão em DEV)
Atualiza o ponteiro do submódulo: doc STATUS-SEGURANCA-E-PRODUCAO.md
(JWT sem commit + contagem) e novo dev-build.sh (carimba versão em DEV).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:27:41 +02:00
VPS 4 Deploy Agent 6621d77487 docs(LEIA): ponteiro para Documentos-Unicos (base-scoreodonto + newwhats)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 19:25:07 +02:00
VPS 4 Deploy Agent ab86d3876d chore(infra): bump scoreodonto.com (fix sino z-index + RX dev isolado)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 13:11:12 +02:00
VPS 4 Deploy Agent f9e14c0b23 feat(infra): banco DEV isolado (pg-dev) + bump scoreodonto.com/subdominio
- pg-dev/: container PostGIS único multi-DB (ref+dev por template) p/ desgrudar dev da produção; scripts refresh/reset + manifesto (secrets fora do git)
- bump scoreodonto.com e subdominio.clube67.com (backends dev apontam p/ pgdev via .env)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 12:46:37 +02:00
VPS 4 Deploy Agent c98f9c05a1 chore(infra): bump scoreodonto.com (estratégia banco DEV)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 12:18:41 +02:00
VPS 4 Deploy Agent 2d302cf1ae chore(infra): bump scoreodonto.com -> a89eed3 (docs CI/CD por tag — Etapa 6)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 10:16:35 +02:00
VPS 4 Deploy Agent 54dd112365 chore(infra): bump scoreodonto.com -> 081985c (v1.0.14, deploy por tag validado)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 10:13:16 +02:00