feat: adicionar 5 novos painéis ao dashboard (MCPs, n8n, Paperclip, IA, Operações)
Expansão do dashboard de 3 para 8 páginas com dados reais do stack: - MCPs: monitorização de 33 MCPs no gateway com ping e estado online/offline - n8n: 14 workflows com último run, duração e falhas 24h - Paperclip: 16 agentes operacionais, routines e issues (PostgreSQL) - IA/Claude: visão das 3 camadas (189 skills, 72 agents, 39 MCPs, CARL) - Operações: tickets Desk CRM por departamento + cobertura PROCs 16 ficheiros novos (3042 linhas), 3 existentes editados. Nova dependência: pg (PostgreSQL client para Paperclip). Audit: 0 vulnerabilidades (npm audit fix aplicado). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* AI Stack API Route
|
||||
* GET /api/ai
|
||||
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
|
||||
*/
|
||||
import { Router } from 'express'
|
||||
import type { Request, Response } from 'express'
|
||||
import { getAiDashboard } from '../services/ai.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
router.get('/', async (_req: Request, res: Response) => {
|
||||
try {
|
||||
const data = await getAiDashboard()
|
||||
res.json(data)
|
||||
} catch (error: unknown) {
|
||||
console.error('AI API error:', error)
|
||||
res.status(500).json({ error: 'Internal server error' })
|
||||
}
|
||||
})
|
||||
|
||||
export default router
|
||||
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* MCPs API Route
|
||||
* GET /api/mcps - Estado de todos os MCPs via gateway
|
||||
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
|
||||
*/
|
||||
import { Router } from 'express'
|
||||
import type { Request, Response } from 'express'
|
||||
import * as mcpsService from '../services/mcps.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
// Obter estado de todos os MCPs
|
||||
router.get('/', async (_req: Request, res: Response) => {
|
||||
try {
|
||||
const data = await mcpsService.getMcpDashboard()
|
||||
res.json(data)
|
||||
} catch (error: unknown) {
|
||||
console.error('MCPs API error:', error)
|
||||
res.status(500).json({ error: 'Internal server error' })
|
||||
}
|
||||
})
|
||||
|
||||
export default router
|
||||
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* n8n API Route
|
||||
* GET /api/n8n
|
||||
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
|
||||
*/
|
||||
import { Router } from 'express'
|
||||
import type { Request, Response } from 'express'
|
||||
import { getN8nDashboard } from '../services/n8n.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
router.get('/', async (_req: Request, res: Response) => {
|
||||
try {
|
||||
const data = await getN8nDashboard()
|
||||
res.json(data)
|
||||
} catch (error: unknown) {
|
||||
const message = error instanceof Error ? error.message : 'Erro interno do servidor'
|
||||
console.error('n8n API error:', error)
|
||||
res.status(500).json({ error: message })
|
||||
}
|
||||
})
|
||||
|
||||
export default router
|
||||
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* Rota /api/operations — Painel de Operações
|
||||
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
|
||||
*/
|
||||
import { Router } from 'express'
|
||||
import { getOperationsDashboard } from '../services/operations.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
/**
|
||||
* GET /api/operations
|
||||
* Retorna dados operacionais: tickets abertos, alta prioridade,
|
||||
* tempo médio de resposta, tickets por departamento e cobertura de PROCs.
|
||||
*/
|
||||
router.get('/', async (_req, res) => {
|
||||
try {
|
||||
const data = await getOperationsDashboard()
|
||||
res.json(data)
|
||||
} catch (err) {
|
||||
console.error('[operations] Erro ao obter dados:', err)
|
||||
res.status(500).json({ error: 'Erro interno ao obter dados de operações' })
|
||||
}
|
||||
})
|
||||
|
||||
export default router
|
||||
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Paperclip Router — GET /api/paperclip
|
||||
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
|
||||
*/
|
||||
import { Router, Request, Response } from 'express'
|
||||
import { getPaperclipDashboard } from '../services/paperclip.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
/**
|
||||
* GET /api/paperclip
|
||||
* Retorna dados dos agentes, routines e issues do Paperclip.
|
||||
* Se a BD não estiver configurada ou acessível, retorna dados de fallback (zeros) sem erro 500.
|
||||
*/
|
||||
router.get('/', async (_req: Request, res: Response) => {
|
||||
try {
|
||||
const data = await getPaperclipDashboard()
|
||||
res.json(data)
|
||||
} catch (err) {
|
||||
console.error('[route/paperclip] Erro inesperado:', (err as Error).message)
|
||||
res.status(500).json({
|
||||
error: 'Erro interno ao obter dados do Paperclip',
|
||||
message: (err as Error).message,
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
export default router
|
||||
Reference in New Issue
Block a user