npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@hed-hog/core

v0.0.318

Published

```markdown # @hed-hog/core

Downloads

2,630

Readme

# @hed-hog/core

## 1. Visão geral do módulo

O módulo `@hed-hog/core` é o núcleo do monorepo HedHog, responsável por fornecer funcionalidades centrais essenciais para o sistema, incluindo autenticação, inteligência artificial, dashboard, sistema e gerenciamento de usuários, roles, permissões e componentes de interface. Ele integra diversos submódulos que tratam desde a segurança e autenticação até a gestão de dashboards customizáveis e agentes de IA.

## 2. Escopo e responsabilidades

- Gerenciamento de autenticação e autorização, incluindo MFA, WebAuthn, recuperação de senha e sessões.
- Serviços de inteligência artificial para chat e agentes AI com suporte a OpenAI e Gemini.
- Gestão de dashboards, componentes, roles e usuários associados.
- Informações do sistema operacional, hardware, banco de dados e módulos instalados.
- Validação e manipulação de dados via DTOs e integração com Prisma ORM.
- Suporte a internacionalização e paginação.

## 3. Endpoints

### Módulo AI (`/ai`)

| Método | Path                    | Autenticação | Descrição                                         | Parâmetros / Query / Body                                                                                   | Resposta                                                                                      | Erros Comuns                          |
|--------|-------------------------|--------------|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-------------------------------------|
| POST   | `/ai/chat`              | Autenticada  | Realiza chat com IA, podendo enviar arquivo.     | Body: `ChatDTO` (message: string, provider?: 'openai'|'gemini', model?: string, systemPrompt?: string, file_id?: number)<br>File: opcional | `{ provider: string, model: string, content: string }`                                       | 400: Chave API não configurada      |
| POST   | `/ai/agent`             | Autenticada  | Cria um agente AI.                                | Body: `CreateAgentDTO` (slug: string, provider?: 'openai'|'gemini', model?: string, instructions?: string)   | Objeto agente criado ou existente                                                           | 400: Slug já existe                 |
| GET    | `/ai/agent`             | Autenticada  | Lista agentes AI com paginação.                   | Query: paginação (page?: number, pageSize?: number, search?: string)                                         | Paginação com lista de agentes                                                              | -                                   |
| GET    | `/ai/agent/id/:agentId` | Autenticada  | Obtém agente AI por ID.                           | Path param: `agentId` (int)                                                                                  | Objeto agente                                                                              | 404: Agente não encontrado          |
| GET    | `/ai/agent/:slug`       | Autenticada  | Obtém agente AI por slug.                         | Path param: `slug` (string)                                                                                  | Objeto agente                                                                              | 404: Agente não encontrado          |
| PATCH  | `/ai/agent/:agentId`    | Autenticada  | Atualiza agente AI.                               | Path param: `agentId` (int)<br>Body: `UpdateAgentDTO` (slug?: string, provider?: 'openai'|'gemini', model?: string, instructions?: string) | Objeto agente atualizado                                                                   | 404: Agente não encontrado<br>400: Slug duplicado |
| DELETE | `/ai/agent`             | Autenticada  | Deleta agentes AI em lote.                        | Body: `DeleteDTO` (ids: number[])                                                                             | `{ count: number }`                                                                         | 404: Um ou mais agentes não encontrados |
| POST   | `/ai/agent/:slug/chat`  | Autenticada  | Chat com agente AI específico, com arquivo opcional. | Path param: `slug` (string)<br>Body: `ChatAgentDTO` (message: string, file_id?: number)<br>File: opcional      | `{ slug: string, provider: string, model: string, content: string }`                        | 404: Agente não encontrado          |

### Módulo Auth (`/auth`)

| Método | Path                                | Autenticação | Descrição                                         | Parâmetros / Body                                                                                  | Resposta                                                                                      | Erros Comuns                          |
|--------|-------------------------------------|--------------|--------------------------------------------------|--------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-------------------------------------|
| GET    | `/auth/verify`                      | Autenticada  | Verifica usuário autenticado.                     | -                                                                                                | Dados do usuário autenticado                                                                | -                                   |
| GET    | `/auth/roles`                      | Pública      | Retorna roles do usuário (se autenticado).       | -                                                                                                | `{ roles: string[] }`                                                                        | -                                   |
| POST   | `/auth/refresh`                    | Pública      | Atualiza token de acesso usando refresh token.   | Body: `{ refreshToken?: string }`<br>Cookies: `rt` opcional                                      | `{ accessToken: string, refreshToken?: string }`                                            | 400: Refresh token não fornecido    |
| POST   | `/auth/login`                      | Pública      | Login com email e senha.                           | Body: `LoginDTO` (email: string, password: string, refreshToken?: boolean)                       | Tokens de acesso e refresh ou MFA requerida                                                | 400: Acesso negado                   |
| POST   | `/auth/login-email-verification`  | Pública      | Login via verificação por email e código.         | Body: `LoginEmailVerificationDTO` (token: string, code: string)                                 | Tokens de acesso e refresh                                                                  | 400: Código inválido ou desafio não encontrado |
| POST   | `/auth/login-email-verification-resend` | Pública | Reenvia código de verificação por email.          | Body: `LoginEmailVerificationResendDTO` (token: string)                                         | Novo token para verificação                                                                 | 400: Token inválido ou expirado     |
| POST   | `/auth/signup`                    | Pública      | Cadastro com email e senha.                        | Body: `CreateWithEmailAndPasswordDTO`                                                           | Usuário criado                                                                             | -                                   |
| POST   | `/auth/login-code`                | Pública      | Login com código MFA.                              | Body: `LoginWithCodeDTO` (token: string, code: string, methodType?: 'totp'|'email'|'recovery')   | Tokens de acesso e refresh                                                                  | 400: Código MFA inválido            |
| POST   | `/auth/login-recovery-code`       | Pública      | Login com código de recuperação MFA.              | Body: `LoginWithRecoveryCodeDTO` (token: string, code: string)                                  | Tokens de acesso e refresh                                                                  | 400: Código de recuperação inválido|
| POST   | `/auth/resend-mfa-code`           | Pública      | Reenvia código MFA por email.                      | Body: `ResendMfaCodeDTO` (token: string)                                                        | `{ success: true, hasEmailMfa: true }`                                                     | 400: Nenhum método MFA por email    |
| POST   | `/auth/webauthn/generate`         | Pública      | Gera opções para autenticação WebAuthn.            | Body: `{ mfaToken: string }`                                                                     | Opções WebAuthn                                                                            | 400: WebAuthn não configurado       |
| POST   | `/auth/webauthn/verify`           | Pública      | Verifica autenticação WebAuthn.                     | Body: `{ mfaToken: string, assertionResponse: any }`                                            | Tokens de acesso e refresh                                                                  | 400: Verificação falhou             |
| POST   | `/auth/forgot`                    | Pública      | Solicita recuperação de senha via email.           | Body: `ForgetDTO` (email: string)                                                                | `{ success: true }`                                                                         | -                                   |
| POST   | `/auth/logout`                    | Pública      | Logout e invalida refresh token.                    | Body: `{ refreshToken?: string }`<br>Cookies: `rt` opcional                                      | `{ success: true }`                                                                         | 400: Refresh token não fornecido    |
| POST   | `/auth/forgot-reset`              | Pública      | Reseta senha via código de recuperação.             | Body: `ResetDTO` (password: string, code: string)                                               | Tokens de acesso e refresh                                                                  | 400: Código inválido ou expirado    |

### Módulo System (`/system`)

| Método | Path       | Autenticação | Descrição                         | Parâmetros / Body | Resposta                                                                                  | Erros Comuns |
|--------|------------|--------------|---------------------------------|-------------------|------------------------------------------------------------------------------------------|--------------|
| GET    | `/system`  | Autenticada  | Retorna informações do sistema. | -                 | Informações detalhadas do sistema operacional, hardware, banco de dados, módulos e usuários | -            |

### Módulo Dashboard Core (`/dashboard-core`)

| Método | Path                      | Autenticação | Descrição                                         | Parâmetros / Body                                                                                   | Resposta                                                                                      | Erros Comuns                          |
|--------|---------------------------|--------------|--------------------------------------------------|---------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-------------------------------------|
| GET    | `/dashboard-core/home`    | Autenticada  | Retorna dashboard home do usuário.                | -                                                                                                 | Objeto dashboard ou null                                                                     | 400: Usuário não encontrado          |
| GET    | `/dashboard-core/stats/overview/users` | Autenticada | Estatísticas de usuários.                         | -                                                                                                 | Estatísticas agregadas de usuários e sessões                                                | -                                   |
| GET    | `/dashboard-core/stats/overview/mails` | Autenticada | Estatísticas de emails enviados.                  | -                                                                                                 | Estatísticas agregadas de emails enviados                                                  | -                                   |
| GET    | `/dashboard-core/stats/overview/system` | Autenticada | Estatísticas do sistema (menus e rotas).          | -                                                                                                 | Estatísticas agregadas do sistema                                                          | -                                   |
| GET    | `/dashboard-core/config/overview` | Autenticada | Visão geral das configurações do sistema.         | -                                                                                                 | Objeto com configurações                                                                    | -                                   |
| GET    | `/dashboard-core/widgets/me` | Autenticada | Dados dos widgets para o usuário.                  | -                                                                                                 | Dados agregados para widgets do usuário                                                    | -                                   |
| GET    | `/dashboard-core/user-dashboards` | Autenticada | Lista dashboards do usuário.                       | -                                                                                                 | Lista de dashboards associados ao usuário                                                  | -                                   |
| GET    | `/dashboard-core/templates` | Autenticada | Lista templates disponíveis para dashboards.      | -                                                                                                 | Lista de templates                                                                          | -                                   |
| POST   | `/dashboard-core/dashboard` | Autenticada | Cria dashboard para usuário.                        | Body: `{ name?: string; slug?: string; icon?: string | null; templateSlug?: string }`               | Dashboard criado                                                                           | -                                   |
| PATCH  | `/dashboard-core/dashboard/order` | Autenticada | Reordena dashboards do usuário.                     | Body: `{ slugs?: string[] }`                                                                      | Dashboard reordenado                                                                       | -                                   |
| PATCH  | `/dashboard-core/dashboard/:slug` | Autenticada | Renomeia dashboard do usuário.                       | Path param: `slug` (string)<br>Body: `{ name?: string; icon?: string | null }`                    | Dashboard atualizado                                                                      | -                                   |
| POST   | `/dashboard-core/dashboard/:slug/home` | Autenticada | Define dashboard como home do usuário.              | Path param: `slug` (string)                                                                       | Sucesso                                                                                   | -                                   |
| GET    | `/dashboard-core/dashboard/:slug/shares` | Autenticada | Lista compartilhamentos do dashboard.               | Path param: `slug` (string)                                                                       | Lista de usuários com acesso                                                              | -                                   |
| GET    | `/dashboard-core/shareable-users/:slug` | Autenticada | Lista usuários para compartilhar dashboard.         | Path param: `slug` (string)<br>Query: search?: string, page?: string, pageSize?: string           | Paginação de usuários                                                                     | -                                   |
| POST   | `/dashboard-core/dashboard/:slug/share` | Autenticada | Compartilha dashboard com usuários.                  | Path param: `slug` (string)<br>Body: `{ userId?: number; userIds?: number[] }`                   | Sucesso                                                                                   | -                                   |
| DELETE | `/dashboard-core/dashboard/:slug/share/:sharedUserId` | Autenticada | Revoga compartilhamento de dashboard.                | Path params: `slug` (string), `sharedUserId` (int)                                               | Sucesso                                                                                   | -                                   |
| DELETE | `/dashboard-core/dashboard/:slug` | Autenticada | Remove dashboard do usuário.                          | Path param: `slug` (string)                                                                       | Sucesso                                                                                   | -                                   |
| GET    | `/dashboard-core/access/:slug` | Autenticada | Verifica acesso do usuário a dashboard.              | Path param: `slug` (string)                                                                       | `{ hasAccess: boolean, dashboard: object|null }`                                           | -                                   |
| GET    | `/dashboard-core/layout/:slug` | Autenticada | Obtém layout do usuário para dashboard.              | Path param: `slug` (string)                                                                       | Array de widgets com posições e dimensões                                                  | -                                   |
| POST   | `/dashboard-core/layout/:slug` | Autenticada | Salva layout do usuário para dashboard.               | Body: `{ layout: Array<{ i: string; x: number; y: number; w: number; h: number }> }`               | `{ success: true }`                                                                         | 403: Acesso negado                   |
| POST   | `/dashboard-core/widget/:slug` | Autenticada | Adiciona widget ao dashboard do usuário.              | Body: `{ componentSlug: string }`                                                                 | Dados do widget adicionado                                                                  | 403: Acesso negado                   |
| DELETE | `/dashboard-core/widget/:slug/:widgetId` | Autenticada | Remove widget do dashboard do usuário.                | Path params: `slug` (string), `widgetId` (string)                                                | Erro "Not implemented yet"                                                                  | -                                   |
| GET    | `/dashboard-core/:slug`   | Autenticada  | Obtém itens do dashboard por slug.                  | Path param: `slug` (string), Query param: `locale?: string`                                       | Lista de itens do dashboard                                                                | -                                   |

### Módulo Dashboard (`/dashboard`)

| Método | Path           | Autenticação | Descrição                      | Parâmetros / Body                                      | Resposta                      | Erros Comuns               |
|--------|----------------|--------------|-------------------------------|-------------------------------------------------------|------------------------------|----------------------------|
| GET    | `/dashboard`   | Autenticada  | Lista dashboards com paginação | Query: paginação (page?: number, pageSize?: number, search?: string) | Paginação com dashboards      | -                          |
| GET    | `/dashboard/:id` | Autenticada | Obtém dashboard por ID         | Path param: `id` (int)                                 | Objeto dashboard             | 404: Dashboard não encontrado |
| POST   | `/dashboard`   | Autenticada  | Cria dashboard                | Body: `CreateDashboardDTO` (slug: string, locale: Record<string, { name: string }>) | Dashboard criado             | -                          |
| PATCH  | `/dashboard/:id` | Autenticada | Atualiza dashboard            | Path param: `id` (int), Body: `UpdateDashboardDTO`    | Dashboard atualizado         | 404: Dashboard não encontrado |
| DELETE | `/dashboard/:id` | Autenticada | Deleta dashboard             | Path param: `id` (int)                                 | `{ success: true }`          | 404: Dashboard não encontrado |

### Módulo Dashboard Component (`/dashboard-component`)

| Método | Path                   | Autenticação | Descrição                      | Parâmetros / Body                                               | Resposta                      | Erros Comuns                   |
|--------|------------------------|--------------|-------------------------------|----------------------------------------------------------------|------------------------------|-------------------------------|
| GET    | `/dashboard-component` | Autenticada  | Lista componentes com paginação | Query: paginação (page?: number, pageSize?: number, search?: string) | Paginação com componentes     | -                             |
| GET    | `/dashboard-component/user` | Autenticada | Lista componentes por roles do usuário | Query: paginação (page?: number, pageSize?: number, search?: string), User ID via token | Paginação com componentes     | -                             |
| GET    | `/dashboard-component/:id` | Autenticada | Obtém componente por ID       | Path param: `id` (int)                                         | Objeto componente             | 404: Componente não encontrado |
| POST   | `/dashboard-component` | Autenticada  | Cria componente               | Body: `CreateDashboardComponentDTO`                            | Componente criado             | -                             |
| PATCH  | `/dashboard-component/:id` | Autenticada | Atualiza componente           | Path param: `id` (int), Body: `UpdateDashboardComponentDTO`   | Componente atualizado         | 404: Componente não encontrado |
| DELETE | `/dashboard-component/:id` | Autenticada | Deleta componente             | Path param: `id` (int)                                         | `{ success: true }`           | 404: Componente não encontrado |
| POST   | `/dashboard-component/:id/preview` | Autenticada | Salva preview de componente (imagem) | Path param: `id` (int), File: imagem (image/*)                 | `{ success: true, componentId: number, slug: string, library_slug: string, fileName: string, relativeUrl: string }` | 400: Arquivo inválido<br>403: Apenas em dev |

### Módulo Dashboard Component Role (`/dashboard-component-role`)

| Método | Path                          | Autenticação | Descrição                          | Parâmetros / Body                                               | Resposta                      | Erros Comuns                   |
|--------|-------------------------------|--------------|-----------------------------------|----------------------------------------------------------------|------------------------------|-------------------------------|
| GET    | `/dashboard-component-role`   | Autenticada  | Lista relações com paginação ou por componente | Query: paginação (page?: number, pageSize?: number), Query param: componentId?: number | Paginação ou lista de relações | -                             |
| POST   | `/dashboard-component-role`   | Autenticada  | Cria relação componente-role      | Body: `CreateDashboardComponentRoleDTO`                         | Relação criada                | Erro se relação já existe      |
| POST   | `/dashboard-component-role/batch` | Autenticada | Cria relações em lote             | Body: `CreateDashboardComponentRoleBatchDTO`                    | { success: boolean, created: number, skipped: number, message: string } | -                      |
| DELETE | `/dashboard-component-role/:id` | Autenticada | Deleta relação por ID             | Path param: `id` (int)                                          | `{ success: true }`           | 404: Relação não encontrada    |
| DELETE | `/dashboard-component-role/component/:componentId/role/:roleId` | Autenticada | Deleta relação por componente e role | Path params: `componentId` (int), `roleId` (int)                | `{ success: true }`           | 404: Relação não encontrada    |

### Módulo Dashboard Item (`/dashboard-item`)

| Método | Path               | Autenticação | Descrição                      | Parâmetros / Body                                               | Resposta                      | Erros Comuns                   |
|--------|--------------------|--------------|-------------------------------|----------------------------------------------------------------|------------------------------|-------------------------------|
| GET    | `/dashboard-item`  | Autenticada  | Lista itens com paginação e filtro por dashboard | Query: paginação (page?: number, pageSize?: number), Query param: dashboardId?: number | Paginação com itens           | -                             |
| POST   | `/dashboard-item`  | Autenticada  | Cria item                     | Body: `CreateDashboardItemDTO`                                 | Item criado                  | -                             |
| DELETE | `/dashboard-item/:id` | Autenticada | Deleta item por ID            | Path param: `id` (int)                                         | `{ success: true }`           | 404: Item não encontrado       |

### Módulo Dashboard Role (`/dashboard-role`)

| Método | Path               | Autenticação | Descrição                          | Parâmetros / Body                                               | Resposta                      | Erros Comuns                   |
|--------|--------------------|--------------|-----------------------------------|----------------------------------------------------------------|------------------------------|-------------------------------|
| GET    | `/dashboard-role`  | Autenticada  | Lista relações com paginação ou por dashboard | Query: paginação (page?: number, pageSize?: number), Query param: dashboardId?: number | Paginação ou lista de relações | -                             |
| POST   | `/dashboard-role`  | Autenticada  | Cria relação dashboard-role       | Body: `CreateDashboardRoleDTO`                                 | Relação criada                | Erro se relação já existe      |
| POST   | `/dashboard-role/batch` | Autenticada | Cria relações em lote             | Body: `CreateDashboardRoleBatchDTO`                            | { success: boolean, created: number, skipped: number, message: string } | -                      |
| DELETE | `/dashboard-role/:id` | Autenticada | Deleta relação por ID             | Path param: `id` (int)                                         | `{ success: true }`           | 404: Relação não encontrada    |
| DELETE | `/dashboard-role/dashboard/:dashboardId/role/:roleId` | Autenticada | Deleta relação por dashboard e role | Path params: `dashboardId` (int), `roleId` (int)               | `{ success: true }`           | 404: Relação não encontrada    |

### Módulo Dashboard User (`/dashboard-user`)

| Método | Path               | Autenticação | Descrição                      | Parâmetros / Body                                               | Resposta                      | Erros Comuns                   |
|--------|--------------------|--------------|-------------------------------|----------------------------------------------------------------|------------------------------|-------------------------------|
| GET    | `/dashboard-user`  | Autenticada  | Lista relações com paginação   | Query: paginação (page?: number, pageSize?: number)            | Paginação com relações        | -                             |
| GET    | `/dashboard-user/:id` | Autenticada | Obtém relação por ID           | Path param: `id` (int)                                         | Objeto relação                | -                             |
| POST   | `/dashboard-user`  | Autenticada  | Cria relação                  | Body: `CreateDTO` (dashboard_id: number, user_id: number)      | Relação criada                | -                             |
| PATCH  | `/dashboard-user/:id` | Autenticada | Atualiza relação              | Path param: `id` (int), Body: `UpdateDTO`                      | Relação atualizada            | -                             |
| DELETE | `/dashboard-user`  | Autenticada  | Deleta relações em lote       | Body: `DeleteDTO` (ids: number[])                              | `{ count: number }`           | 400: Nenhum id fornecido       |

## 4. Regras de autenticação e autorização

- A maioria dos endpoints requer autenticação via token JWT.
- Endpoints públicos são indicados explicitamente.
- Controle de acesso baseado em roles e permissões.
- MFA (Multi-Factor Authentication) suportado via TOTP, email e códigos de recuperação.
- WebAuthn suportado para autenticação forte.
- Refresh tokens são gerenciados via cookies HTTP-only ou no corpo da requisição.
- Operações sensíveis (criação, atualização, deleção) requerem autenticação e permissões adequadas.

## 5. Estruturas de request/response

### DTOs principais do módulo AI

- **ChatDTO**

```ts
{
  message: string; // obrigatório
  provider?: 'openai' | 'gemini'; // opcional, padrão 'openai'
  model?: string; // opcional
  systemPrompt?: string; // opcional
  file_id?: number; // opcional
}
  • ChatAgentDTO
{
  message: string; // obrigatório
  file_id?: number; // opcional
}
  • CreateAgentDTO
{
  slug: string; // obrigatório
  provider?: 'openai' | 'gemini'; // opcional, padrão 'openai'
  model?: string; // opcional
  instructions?: string; // opcional
}
  • UpdateAgentDTO
{
  slug?: string;
  provider?: 'openai' | 'gemini';
  model?: string;
  instructions?: string;
}
  • DeleteDTO
{
  ids: number[]; // array de IDs para deleção, mínimo 1 item
}

DTOs principais do módulo Auth

  • LoginDTO
{
  email: string; // obrigatório, email válido
  password: string; // obrigatório, senha forte mínima 6 caracteres
  refreshToken?: boolean; // opcional, padrão false
}
  • LoginEmailVerificationDTO
{
  token: string; // obrigatório
  code: string; // obrigatório, código PIN
}
  • LoginEmailVerificationResendDTO
{
  token: string; // obrigatório
}
  • LoginWithCodeDTO
{
  code: string; // obrigatório
  token: string; // obrigatório, JWT
  methodType?: 'totp' | 'email' | 'recovery'; // opcional
}
  • LoginWithRecoveryCodeDTO
{
  code: string; // obrigatório
  token: string; // obrigatório, JWT
}
  • ForgetDTO
{
  email: string; // obrigatório, email válido
}
  • ResetDTO
{
  password: string; // obrigatório, mínimo 8 caracteres
  code: string; // obrigatório
}

DTOs principais do módulo Dashboard

  • CreateDashboardDTO
{
  slug: string; // obrigatório
  locale: Record<string, { name: string }>; // obrigatório
}
  • UpdateDashboardDTO
{
  slug?: string;
  locale?: Record<string, { name: string }>;
}
  • CreateDashboardComponentDTO
{
  slug: string;
  library_slug?: string;
  min_width?: number;
  max_width?: number;
  min_height?: number;
  max_height?: number;
  width: number;
  height: number;
  is_resizable?: boolean;
  locale: Record<string, { name: string; description?: string }>;
}
  • UpdateDashboardComponentDTO
{
  slug?: string;
  library_slug?: string;
  min_width?: number;
  max_width?: number;
  min_height?: number;
  max_height?: number;
  width?: number;
  height?: number;
  is_resizable?: boolean;
  locale?: Record<string, { name: string; description?: string }>;
}
  • CreateDashboardRoleDTO
{
  dashboard_id: number;
  role_id: number;
}
  • CreateDashboardRoleBatchDTO
{
  dashboard_id: number;
  role_ids: number[];
}
  • CreateDashboardComponentRoleDTO
{
  component_id: number;
  role_id: number;
}
  • CreateDashboardComponentRoleBatchDTO
{
  component_id: number;
  role_ids: number[];
}
  • CreateDashboardItemDTO
{
  component_id: number;
  dashboard_id: number;
  width: number;
  height: number;
  x_axis: number;
  y_axis: number;
}
  • UpdateDashboardLayoutDTO
{
  dashboard_id: number;
  items: Array<{
    id: number;
    width: number;
    height: number;
    x_axis: number;
    y_axis: number;
  }>;
}
  • UpdateDashboardItemDTO
{
  component_id?: number;
  dashboard_id?: number;
  width?: number;
  height?: number;
  x_axis?: number;
  y_axis?: number;
}
  • CreateDTO (DashboardUser)
{
  dashboard_id: number;
  user_id: number;
}
  • UpdateDTO (DashboardUser)
{
  dashboard_id?: number;
  user_id?: number;
}
  • DeleteDTO
{
  ids: number[];
}

6. Erros comuns

  • 400 Bad Request

    • Chave API não configurada para OpenAI ou Gemini.
    • Slug de agente AI já existente.
    • Código de verificação inválido ou expirado.
    • Refresh token não fornecido.
    • Acesso negado por credenciais inválidas.
    • MFA não configurado ou código inválido.
    • Tentativa de deletar itens inexistentes.
    • Requisição inválida para criação de relações duplicadas.
    • Arquivo inválido para preview de componente.
    • Operação de preview disponível somente em ambiente de desenvolvimento.
  • 404 Not Found

    • Agente AI não encontrado por ID ou slug.
    • Dashboard, componente ou relação não encontrada.
    • Desafio (challenge) para verificação não encontrado ou expirado.
  • 403 Forbidden

    • Acesso negado a dashboards ou recursos protegidos.
    • Tentativa de salvar preview fora do ambiente de desenvolvimento.

7. Banco de dados (tabelas YAML)

ai_agent

finalidade: Armazena agentes de inteligência artificial configurados no sistema.
colunas:
  - id: integer, PK, auto-increment
  - slug: string, único, não nulo
  - provider: enum('openai', 'gemini'), não nulo
  - model: string, nullable
  - instructions: string, nullable
  - external_agent_id: string, nullable
  - created_at: timestamp, não nulo, default NOW()
  - updated_at: timestamp, não nulo, default NOW()
defaults:
  - created_at: NOW()
  - updated_at: NOW()
nulabilidade:
  - model: nullable
  - instructions: nullable
  - external_agent_id: nullable
integridade:
  - slug único
indices:
  - id (PK)
  - slug (único)
enums:
  - provider: ['openai', 'gemini']

user

finalidade: Armazena usuários do sistema.
colunas:
  - id: integer, PK, auto-increment
  - name: string, não nulo
  - photo_id: integer, nullable
  - last_login_at: timestamp, nullable
  - created_at: timestamp, não nulo, default NOW()
  - updated_at: timestamp, não nulo, default NOW()
integridade:
  - PK em id
indices:
  - id (PK)

user_mfa

finalidade: Armazena métodos de autenticação multifator dos usuários.
colunas:
  - id: integer, PK, auto-increment
  - user_id: integer, FK para user.id, não nulo
  - name: string, não nulo
  - type: enum('totp', 'email', 'webauthn'), não nulo
  - verified_at: timestamp, nullable
  - suspended_until: timestamp, nullable
  - created_at: timestamp, não nulo, default NOW()
  - updated_at: timestamp, não nulo, default NOW()
integridade:
  - FK user_id referencia user.id
indices:
  - id (PK)
enums:
  - type: ['totp', 'email', 'webauthn']

user_identifier

finalidade: Identificadores do usuário, como emails.
colunas:
  - id: integer, PK, auto-increment
  - user_id: integer, FK para user.id, não nulo
  - type: string, não nulo (ex: 'email')
  - value: string, não nulo
  - verified_at: timestamp, nullable
  - enabled: boolean, não nulo, default true
  - created_at: timestamp, não nulo, default NOW()
  - updated_at: timestamp, não nulo, default NOW()
integridade:
  - FK user_id referencia user.id
indices:
  - id (PK)

user_session

finalidade: Sessões de usuários autenticados.
colunas:
  - id: integer, PK, auto-increment
  - user_id: integer, FK para user.id, não nulo
  - token: string, não nulo
  - ip_address: string, nullable
  - user_agent: string, nullable
  - created_at: timestamp, não nulo, default NOW()
  - expires_at: timestamp, não nulo
  - revoked_at: timestamp, nullable
integridade:
  - FK user_id referencia user.id
indices:
  - id (PK)

user_activity

finalidade: Registro de atividades dos usuários.
colunas:
  - id: integer, PK, auto-increment
  - user_id: integer, FK para user.id, não nulo
  - action: string, não nulo
  - created_at: timestamp, não nulo, default NOW()
integridade:
  - FK user_id referencia user.id
indices:
  - id (PK)

role

finalidade: Papéis (roles) do sistema para controle de acesso.
colunas:
  - id: integer, PK, auto-increment
  - slug: string, único, não nulo
  - created_at: timestamp, não nulo, default NOW()
  - updated_at: timestamp, não nulo, default NOW()
integridade:
  - slug único
indices:
  - id (PK)
  - slug (único)

role_user

finalidade: Relação muitos-para-muitos entre usuários e roles.
colunas:
  - id: integer, PK, auto-increment
  - user_id: integer, FK para user.id, não nulo
  - role_id: integer, FK para role.id, não nulo
integridade:
  - FK user_id referencia user.id
  - FK role_id referencia role.id
indices:
  - id (PK)

dashboard

finalidade: Dashboards configuráveis do sistema.
colunas:
  - id: integer, PK, auto-increment
  - slug: string, único, não nulo
  - created_at: timestamp, não nulo, default NOW()
  - updated_at: timestamp, não nulo, default NOW()
integridade:
  - slug único
indices:
  - id (PK)
  - slug (único)

dashboard_component

finalidade: Componentes que podem ser usados em dashboards.
colunas:
  - id: integer, PK, auto-increment
  - slug: string, único, não nulo
  - library_slug: string, nullable
  - min_width: integer, nullable
  - max_width: integer, nullable
  - min_height: integer, nullable
  - max_height: integer, nullable
  - width: integer, não nulo
  - height: integer, não nulo
  - is_resizable: boolean, não nulo, default true
  - created_at: timestamp, não nulo, default NOW()
  - updated_at: timestamp, não nulo, default NOW()
integridade:
  - slug único
indices:
  - id (PK)
  - slug (único)

dashboard_role

finalidade: Relação entre dashboards e roles para controle de acesso.
colunas:
  - id: integer, PK, auto-increment
  - dashboard_id: integer, FK para dashboard.id, não nulo
  - role_id: integer, FK para role.id, não nulo
integridade:
  - FK dashboard_id referencia dashboard.id
  - FK role_id referencia role.id
indices:
  - id (PK)

dashboard_user

finalidade: Relação entre dashboards e usuários.
colunas:
  - id: integer, PK, auto-increment
  - dashboard_id: integer, FK para dashboard.id, não nulo
  - user_id: integer, FK para user.id, não nulo
  - is_home: boolean, não nulo, default false
integridade:
  - FK dashboard_id referencia dashboard.id
  - FK user_id referencia user.id
indices:
  - id (PK)

dashboard_item

finalidade: Itens (widgets) dentro de dashboards.
colunas:
  - id: integer, PK, auto-increment
  - dashboard_id: integer, FK para dashboard.id, não nulo
  - component_id: integer, FK para dashboard_component.id, não nulo
  - width: integer, não nulo
  - height: integer, não nulo
  - x_axis: integer, não nulo
  - y_axis: integer, não nulo
integridade:
  - FK dashboard_id referencia dashboard.id
  - FK component_id referencia dashboard_component.id
indices:
  - id (PK)

dashboard_component_role

finalidade: Relação entre componentes de dashboard e roles.
colunas:
  - id: integer, PK, auto-increment
  - component_id: integer, FK para dashboard_component.id, não nulo
  - role_id: integer, FK para role.id, não nulo
integridade:
  - FK component_id referencia dashboard_component.id
  - FK role_id referencia role.id
indices:
  - id (PK)

8. Regras de negócio relevantes

  • Agentes AI podem ser criados, atualizados e deletados, com integração direta com APIs OpenAI e Gemini.
  • Chat com IA suporta anexos de arquivos, com extração de texto para PDFs e arquivos de texto.
  • MFA obrigatório pode ser configurado, com suporte a email, TOTP e WebAuthn.
  • Tokens de acesso e refresh são gerenciados com segurança, incluindo cookies HTTP-only.
  • Dashboards são personalizados por usuário, com controle de acesso baseado em roles.
  • Layouts de dashboards e widgets podem ser salvos e recuperados por usuário.
  • Sistema coleta estatísticas de uso, sessões, emails enviados e segurança da conta.
  • Validações rigorosas são aplicadas via DTOs e classes de validação.
  • Operações de criação em batch evitam duplicações e retornam contagem de criados e ignorados.
  • A remoção de widgets do dashboard do usuário ainda não está implementada.
  • Preview de componentes de dashboard é permitido somente em ambiente de desenvolvimento e aceita apenas imagens.
  • MFA via email envia códigos para múltiplos emails associados ao usuário.
  • WebAuthn é suportado para autenticação forte com geração e verificação de desafios.

9. Guia rápido de uso (exemplos)

Criar agente AI

POST /ai/agent
Authorization: Bearer <token>
Content-Type: application/json

{
  "slug": "meu-agente",
  "provider": "openai",
  "model": "gpt-4o-mini",
  "instructions": "Seja um assistente amigável."
}

Resposta:

{
  "id": 1,
  "slug": "meu-agente",
  "provider": "openai",
  "model": "gpt-4o-mini",
  "instructions": "Seja um assistente amigável.",
  "external_agent_id": "abc123",
  "created_at": "2024-06-01T12:00:00Z",
  "updated_at": "2024-06-01T12:00:00Z"
}

Chat com agente AI

POST /ai/agent/meu-agente/chat
Authorization: Bearer <token>
Content-Type: multipart/form-data

Form-data:
- message: "Olá, como você está?"
- file: (arquivo opcional)

Resposta:

{
  "slug": "meu-agente",
  "provider": "openai",
  "model": "gpt-4o-mini",
  "content": "Olá! Estou bem, obrigado por perguntar."
}

Login com email e senha

POST /auth/login
Content-Type: application/json

{
  "email": "[email protected]",
  "password": "senhaSegura123"
}

Resposta:

{
  "accessToken": "<jwt_access_token>",
  "refreshToken": "<jwt_refresh_token>"
}

Obter informações do sistema

GET /system
Authorization: Bearer <token>

Resposta (exemplo resumido):

{
  "os": {
    "name": "Linux",
    "platform": "linux",
    "version": "5.15.0",
    "architecture": "x64",
    "uptime": 123456,
    "cpu": {
      "model": "Intel(R) Xeon(R)",
      "speed": 2400,
      "physicalCores": 4,
      "virtualCores": 8
    },
    "memory": {
      "total": 17179869184,
      "free": 8589934592
    },
    "disk": [
      {
        "filesystem": "/dev/sda1",
        "size": 500107862016,
        "free": 250053931008,
        "mountpoint": "/"
      }
    ]
  },
  "modules": [
    {
      "name": "@hedhog/core",
      "version": "^1.0.0",
      "latestVersion": "1.0.1",
      "upToDate": false
    }
  ],
  "users": {
    "total": 100,
    "admin": 5,
    "active": 80,
    "activities": []
  },
  "database": {
    "connections": 10,
    "size": 104857600,
    "queriesPerSecond": 50
  }
}

Este README documenta o módulo @hed-hog/core com base no código-fonte e definições atuais, fornecendo uma visão técnica detalhada para desenvolvedores e integradores do sistema.