diff --git a/agents.md b/agents.md
index 3f56060..57de2d7 100644
--- a/agents.md
+++ b/agents.md
@@ -19,9 +19,9 @@
- Para DEV: rode `pnpm convex:dev` e acesse `/dev/seed` uma vez para popular dados realistas.
## Stack atual (16/10/2025)
-- **Next.js**: `16.0.0-beta.0` (Turbopack em produção + cache de filesystem em DEV).
- - `next.config.ts` mantém `experimental.turbopackFileSystemCacheForDev` e `experimental.trustHostHeader`; a lista de domínios válidos mora em `src/config/allowed-hosts.ts` e é aplicada pelo `middleware.ts`.
-- **React / React DOM**: `19.2.0`.
+- **Next.js**: `15.5.5` (Turbopack em produção + cache de filesystem em DEV).
+ - `next.config.ts` mantém `experimental.turbopackFileSystemCacheForDev`; whitelist de domínios em `src/config/allowed-hosts.ts` usada tanto no `server.allowedHosts` quanto no `middleware.ts`.
+- **React / React DOM**: `18.2.0`.
- **Trilha de testes**: Vitest (`pnpm test`) sem modo watch por padrão (`--run --passWithNoTests`).
- **CI**: workflow `Quality Checks` (`.github/workflows/quality-checks.yml`) roda `pnpm install`, `prisma:generate`, `lint`, `test`, `build`. Variáveis críticas (`BETTER_AUTH_SECRET`, `NEXT_PUBLIC_APP_URL`, etc.) são definidas apenas no runner — não afetam a VPS.
- **Deploy**: pipeline `ci-cd-web-desktop.yml` (runner self-hosted). Build roda com pnpm 9, Node 20. Web é publicado em `/home/renan/apps/sistema` e o Swarm aponta `sistema_web` para essa pasta.
@@ -91,7 +91,7 @@ pnpm build
- **CI**: falhas mais comuns
- `ERR_PNPM_OUTDATED_LOCKFILE`: mantenha `pnpm-lock.yaml` atualizado (principalmente após alterar dependências do desktop).
- Variáveis Better Auth ausentes (`BETTER_AUTH_SECRET`): definidas no workflow (`Quality Checks`).
- - Falha de host (Next 16): confira `src/config/allowed-hosts.ts`; o middleware retorna 403 quando o domínio do Traefik não está listado.
+ - Falha de host: confira `src/config/allowed-hosts.ts`; o middleware retorna 403 quando o domínio do Traefik não está listado.
## Produção / Deploy
- Runner self-hosted (VPS). Build roda fora de `/srv/apps/sistema` e rsync publica em `/home/renan/apps/sistema`.
@@ -155,4 +155,4 @@ pnpm build
- `docs/admin-inventory-ui.md`, `docs/plano-app-desktop-maquinas.md` — detalhes do inventário/agente.
---
-_Última atualização: 16/10/2025 (Next.js 16 beta, Turbopack, fluxos desktop + portal documentados)._
+_Última atualização: 16/10/2025 (Next.js 15.5.5 estável, Turbopack, fluxos desktop + portal documentados)._
diff --git a/docs/DEV.md b/docs/DEV.md
index 996297d..0b8a49c 100644
--- a/docs/DEV.md
+++ b/docs/DEV.md
@@ -4,8 +4,8 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve
## Resumo rápido
-- **Node/PNPM**: Node 20.9+ (Next.js 16 exige essa versão mínima) + pnpm 9 (habilite via `corepack enable && corepack prepare pnpm@9 --activate`).
-- **Next.js 16 (beta)**: Projeto já está em `next@16.0.0-beta.0`, com Turbopack como bundler padrão, cache de filesystem habilitado e `experimental.trustHostHeader` + middleware validando os domínios expostos pelo Traefik.
+- **Node/PNPM**: Node 20.9+ (alinhado ao requisito do Next 15) + pnpm 9 (habilite via `corepack enable && corepack prepare pnpm@9 --activate`).
+- **Next.js 15.5.5**: Projeto voltou para a versão estável (`next@15.5.5`) com Turbopack como bundler padrão, cache de filesystem habilitado e whitelist de domínios via `server.allowedHosts` + middleware.
- **Lint/Test/Build**: `pnpm lint`, `pnpm test`, `pnpm build`. O script de testes usa `vitest --run --passWithNoTests`, eliminando o modo watch interativo.
- **Banco DEV**: SQLite em `prisma/prisma/db.dev.sqlite`. Defina `DATABASE_URL="file:./prisma/db.dev.sqlite"` ao chamar CLI do Prisma.
- **Desktop (Tauri)**: fonte em `apps/desktop`. Usa Radix tabs + componentes shadcn-like, integra com os endpoints `/api/machines/*` e suporta atualização automática via GitHub Releases.
@@ -31,12 +31,12 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve
> **Por quê inline?** Evitamos declarar `DATABASE_URL` em `prisma/.env` porque o Prisma lê também o `.env` da raiz (produção). O override inline garante isolamento do banco DEV.
-## Next.js 16 (beta)
+## Next.js 15 (estável)
-- Comportamento sujeito a mudanças; acompanhe o changelog antes da GA. Breaking changes relevantes já mitigados: `params`/`searchParams` assíncronos, `cookies()`/`headers()` com await e `revalidateTag` aguardando novo perfil (não utilizamos).
-- **Turbopack** é o bundler padrão. Mantemos `experimental.turbopackFileSystemCacheForDev = true` no `next.config.ts` para acelerar reinicializações do `pnpm dev`.
-- **React Compiler (opcional)**: habilite com `reactCompiler: true` no `next.config.ts` e instale `babel-plugin-react-compiler`. Use apenas para experiências controladas (a compilação fica mais lenta).
-- **Caching APIs**: considere `updateTag()`/`refresh()` em novas Server Actions. Atualmente não usamos `revalidateTag`.
+- Mantemos o projeto em `next@15.5.5`, priorizando estabilidade enquanto acompanhamos as novidades do 16.
+- **React 18.2**: voltamos para a versão suportada oficialmente pelo Next 15. Evite APIs exclusivas do React 19 (`use(...)`, `useActionState`, etc.).
+- **Turbopack** segue como bundler padrão. Mantemos `experimental.turbopackFileSystemCacheForDev = true` no `next.config.ts` para acelerar reinicializações do `pnpm dev`.
+- **Whitelist de hosts**: `server.allowedHosts` + middleware em `middleware.ts` garantem que apenas os domínios Traefik/localhost sejam aceitos.
## Comandos de qualidade
diff --git a/next.config.ts b/next.config.ts
index 1790907..87f03a1 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -1,9 +1,14 @@
import type { NextConfig } from "next"
+import { ALLOWED_HOSTS } from "./src/config/allowed-hosts"
const nextConfig = {
experimental: {
turbopackFileSystemCacheForDev: true,
- trustHostHeader: true,
+ },
+ // No Next 16 specific trustHostHeader flag; we whitelist via classic server.allowedHosts.
+ // @ts-expect-error server.allowedHosts disponível na linha 15.x
+ server: {
+ allowedHosts: [...ALLOWED_HOSTS],
},
} satisfies NextConfig
diff --git a/package.json b/package.json
index 0b524f3..c62e1ec 100644
--- a/package.json
+++ b/package.json
@@ -52,12 +52,12 @@
"date-fns": "^4.1.0",
"dotenv": "^16.4.5",
"lucide-react": "^0.544.0",
- "next": "16.0.0-beta.0",
+ "next": "15.5.5",
"next-themes": "^0.4.6",
"pdfkit": "^0.17.2",
"postcss": "^8.5.6",
- "react": "19.2.0",
- "react-dom": "19.2.0",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
"react-hook-form": "^7.64.0",
"recharts": "^2.15.4",
"sanitize-html": "^2.17.0",
@@ -75,12 +75,12 @@
"@tauri-apps/cli": "^2.8.4",
"@types/node": "^20",
"@types/pdfkit": "^0.17.3",
- "@types/react": "^19",
- "@types/react-dom": "^19",
+ "@types/react": "^18",
+ "@types/react-dom": "^18",
"@types/sanitize-html": "^2.16.0",
"@types/three": "^0.180.0",
"eslint": "^9",
- "eslint-config-next": "16.0.0-beta.0",
+ "eslint-config-next": "15.5.5",
"eslint-plugin-react-hooks": "^5.0.0",
"prisma": "^6.16.2",
"tailwindcss": "^4",
diff --git a/src/app/admin/machines/[id]/page.tsx b/src/app/admin/machines/[id]/page.tsx
index e72806d..507cf11 100644
--- a/src/app/admin/machines/[id]/page.tsx
+++ b/src/app/admin/machines/[id]/page.tsx
@@ -1,5 +1,3 @@
-"use client"
-import { use } from "react"
import { AppShell } from "@/components/app-shell"
import { SiteHeader } from "@/components/site-header"
import { DEFAULT_TENANT_ID } from "@/lib/constants"
@@ -9,8 +7,8 @@ import { MachineBreadcrumbs } from "@/components/admin/machines/machine-breadcru
export const runtime = "nodejs"
export const dynamic = "force-dynamic"
-export default function AdminMachineDetailsPage({ params }: { params: Promise<{ id: string }> }) {
- const { id } = use(params)
+export default function AdminMachineDetailsPage({ params }: { params: { id: string } }) {
+ const { id } = params
return (