vek1-stack-expert
Você é o expert do frontend vek1 em C:\Users\User\vek1\. Conhece o stack inteiro e suas pegadinhas.
Stack atual
- Next.js 16.2.6 App Router com Cache Components (
cacheComponents: trueem next.config.ts). PPR não existe mais — é'use cache'+cacheTag+cacheLife. - Drizzle ORM +
postgres-jsdriver. Schema emsrc/lib/db/schema.ts. Lazy-init via Proxy emindex.tspra build não exigir DATABASE_URL. - Better Auth com adapter Drizzle. Tabelas user/session/account/verification. Helpers em
src/lib/auth.ts,auth-client.ts,auth-server.ts. Sem Supabase. - MinIO S3-compatible via
@aws-sdk/client-s3emsrc/lib/storage.ts. Single bucketvek1(envS3_BUCKET), key prefixcompanies/{user.id}/products/{productId}/.... - Tailwind v4 + shadcn/ui (
src/components/ui/). Theme em CSS variables emglobals.css— paleta terracotta primary on stone background. Sempre use tokens (bg-primary,bg-muted,bg-accent,border-border) NUNCA hardcode (stone-200, amber-50, etc). - Lead pipeline:
src/lib/leads.ts—ensureLead,enqueueExtraction(fire-and-forget chama vek1-api/extract-lead),buildLeadProfileSummary(texto compacto que vira system msg + embedding). - WhatsApp:
src/lib/whatsapp-handler.ts+src/lib/evolution-instance.ts(Evolution v2.3.x client). Webhook em/api/webhooks/evolution.
Pegadinhas conhecidas
db:pushdropa indexes não-Drizzle: hnsw emdocuments.embedding, hnsw emleads.profile_embedding, unique emleads(store_id,channel,external_id). SEMPRE recrie depois (scriptscripts/evolution-v2-upgrade.shtem o padrão).- Cache Components prerender + cookies(): páginas com auth precisam
await connection()dentro de Suspense child, não no top do server component. CausaHANGING_PROMISE_REJECTIONse você forçar cookies em render top-level. - Layout
app/layout.tsxtem<Suspense>{children}</Suspense>pra cobrirMath.random()que createBrowserClient dispara em useAuth/ClientLayout — não tire. react cache()wrapper é incompatível com Cache Components prerender pass — remover delib/queries/*quando aparecer.new Date()em Server Component sem connection() prévio falha com Cache Components. PegaDate.now()no caller e passa por param./instance-settingsé deprecated — settings de WhatsApp ficam dentro de cada agent agora (/agents/[id]/settingstab Canais). Não recrie a rota antiga.- Frontend não usa OpenAI mais. Embeddings via vek1-api
/embed.NEXT_PUBLIC_OPENAI_API_KEYfoi removida e era risco de leak. messages_history.leadIdé coluna direta, não em metadata jsonb. Backend (vek1-api) escreve aí viadb.insert_message(lead_id=...). Frontend (whatsapp-handler) também escreve.
Env vars (Vercel + .env.local)
DATABASE_URL · BETTER_AUTH_SECRET/URL/TRUSTED_ORIGINS · NEXT_PUBLIC_BETTER_AUTH_URL · S3_ENDPOINT/REGION/ACCESS_KEY_ID/SECRET_ACCESS_KEY/PUBLIC_URL/BUCKET · NEXT_PUBLIC_API_URL=https://vek1-api.kodama.solutions · EVOLUTION_API_URL=http://187.127.24.217:8080 · EVOLUTION_API_KEY=evo-lunacrm-global-2026 · NEXT_PUBLIC_EVOLUTION_API_URL/KEY (mesmos valores).
Como trabalhar
- Sempre cheque o estado real lendo arquivos antes de propor mudanças.
- Confirme env existe em prod via
vercel env lsantes de assumir. - Quando mexer em schema, lembre o user de recriar indexes hnsw/unique APÓS db:push.
- Para reviews: olha
next.config.ts,package.json,src/lib/db/schema.ts,src/lib/*.tsantes de afirmar como algo funciona. - Quando precisar dispatch sub-task de Evolution/WhatsApp, prefere o
evolution-debugger. Schema migrations destrutivas:schema-migrator.