⚡ CENTRO DE CONTROL DE OPERACIONES•PROTOCOL: BINARY RED/GREEN
Plataforma Unificada de Ingeniería, Workflows y Marketing
Gestiona el ciclo de vida completo de tus sistemas: desde la formulación de directivas con IA y diagramación vectorial, hasta la ejecución de grafos DAG en vivo, sincronización de tareas To-Do y despacho masivo de correos corporativos.
Esquema Relacional
15 Tablas
Neon PostgreSQL AWS Cloud
Latencia WebSockets
< 180 ms
Salas aisladas por Project ID
Validador Criptográfico
HMAC-SHA256
GitHub Webhooks Verificados
Despachador de Correos
BullMQ + Redis
RFC 8058 & Umbral ≥95%
❖ Catálogo Central de Módulos y Herramientas
Selecciona cualquier herramienta para acceder de forma instantánea a sus funciones operativas.
🕸️
DAG Engine Live
Lienzo de Workflow DAG & Telemetría
Grafo interactivo con React Flow (@xyflow/react). Visualiza los 5 nodos secuenciales de arquitectura con mutación de color binaria (Rojo y Verde), sincronización reactiva <200ms y bloqueo de edición para rol CLIENT.
React FlowWebSocket RoomsBinary Color AlgorithmRole Guard
🧠
AI Generator
Antigravity Prompt Architect
Área de trabajo en texto plano para ideas de proyectos. Procesa tu texto descriptivo y pre-rellena automáticamente el checklist interactivo de desarrollo de 5 fases para generar directivas de sistema precisas.
Idea Parser5-Phase ChecklistSystem Directive ExporterLocal Storage Sync
Gestor de tareas manuales con prioridades (Low, Medium, High, Critical) vinculado a los nodos del grafo. Cuando el 100% de las tareas de un nodo pasan a DONE, el nodo transmuta de inmediato a GREEN.
Task CRUDRole: COLLABORATORReal-time PulseNeon DB Persisted
✉
BullMQ + Redis
Motor de Mercadotecnia y Envíos Masivos
Segmentación de audiencias con verificación contra listas de supresión, cabeceras RFC 8058 One-Click Unsubscribe, inyección de píxel 1x1, enlaces 302 y regla de completado ≥95% para validar el nodo de marketing a GREEN.
Suite visual de diseño vectorial para generar lockups de arquitectura, sellos técnicos, diagramas de ingeniería y exportación limpia en formatos SVG de alta precisión y rasterizados PNG.
SVG EngineTechnical LockupsVector ExportsCanvas Studio
Documentación ejecutiva y modelo de retorno de inversión para el proyecto de modernización MPS Ayala. Incluye cálculo de optimización operativa, amortización fiscal y desglose de servicios.
ROI ProjectionsTax StrategyExecutive ReportsClient Facing
Especificación de endpoints backend, validador de firmas HMAC-SHA256 para GitHub Webhooks (X-Hub-Signature-256), y conexión en vivo a la base de datos distribuida Neon PostgreSQL.
Hola, soy Nexus, la inteligencia operativa y memoria técnica de TSolutions IPIDD.
Accedo directamente a la memoria semántica en Neon PostgreSQL con pgvector e índice HNSW para capitalizar el conocimiento histórico de proyectos cerrados: lecciones aprendidas, correlaciones de Ishikawa/5W y topologías DAG estables. ¿Qué desafío técnico deseas resolver hoy?
Sugerencias:
BIBLIOTECA DE PROYECTOS ARCHIVADOS
SNAPSHOT INMUTABLE • SOLO LECTURA
Repositorio histórico de proyectos cerrados, actas ejecutivas auditadas y vectores asimilados por Nexus.
Auditoría y Sellado Formal
ACTA DE CIERRE & ARCHIVADO INMUTABLE
Aviso de Inmutabilidad: Al confirmar el cierre, el proyecto pasará al estado ARCHIVED. Todas las mutaciones en tareas, DAG y OPEX quedarán bloqueadas de forma inmutable. Se generará el Snapshot JSONB final y BullMQ asimilará los aprendizajes en el cerebro continuo de Nexus.
El espacio de trabajo ha sido aislado con RLS, el contrato legal oficial ha sido sellado con tokens de marca y el grafo DAG ha sido sembrado en estado RED para inicio de desarrollo.
function filterCards(category) {
document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active'));
event.target.classList.add('active');
const cards = document.querySelectorAll('.app-card');
cards.forEach(card => {
if (category === 'all' || card.dataset.category === category) {
card.style.display = 'flex';
} else {
card.style.display = 'none';
}
});
}
function scrollToShowcase() {
document.getElementById('interactive-demo').scrollIntoView({ behavior: 'smooth' });
}
// LOGGING SYSTEM
function addLog(msg, type = 'normal') {
const consoleBox = document.getElementById('log-console');
const time = new Date().toTimeString().split(' ')[0];
const div = document.createElement('div');
div.className = `log-entry ${type === 'pulse' ? 'event-pulse' : (type === 'transition' ? 'event-transition' : '')}`;
div.innerHTML = `[${time}] ${msg}`;
consoleBox.appendChild(div);
consoleBox.scrollTop = consoleBox.scrollHeight;
}
function clearLogs() {
document.getElementById('log-console').innerHTML = '';
addLog('Consola reiniciada.', 'normal');
}
// SIMULACIÓN DE NODOS Y REGLA BINARIA
const nodeStates = {
'node-infra': true,
'node-backend': false,
'node-frontend': false,
'node-telemetry': false,
'node-marketing': false
};
function updateOverallMetrics() {
let completed = Object.values(nodeStates).filter(Boolean).length;
let pct = (completed / 5) * 100;
document.getElementById('overall-status-text').innerText = `${completed} DE 5 COMPLETADOS (${pct}%)`;
}
// CONFIGURACIÓN CENTRALIZADA Y ESTADO EN VIVO
const ACTIVE_PROJECT_ID = '59b89995-9684-4de6-9291-f7a6806b999a';
let currentRole = 'COLLABORATOR';
let liveTasks = [];
let liveNodes = [];
let lastGeneratedSubtasks = [];
function changeActiveRole(newRole) {
currentRole = newRole;
addLog(`[RBAC] Rol de usuario establecido a: ${currentRole}`, 'pulse');
if (currentRole === 'CLIENT') {
addLog('[RBAC ALERTA] Modo CLIENT activado: Mutaciones y creación de tareas restringidas (403 Forbidden).', 'transition');
}
}
// SINCRONIZACIÓN EN VIVO CON NEON POSTGRESQL
async function syncWithNeonDB() {
const lbl = document.getElementById('lbl-db-status');
const dot = document.getElementById('dot-db-status');
if (lbl) lbl.innerText = 'SINCRONIZANDO...';
try {
const [wfRes, tasksRes] = await Promise.all([
fetch(`/api/v1/projects/${ACTIVE_PROJECT_ID}/workflow`, {
headers: { 'x-user-role': currentRole }
}).then(r => r.json()),
fetch(`/api/v1/projects/${ACTIVE_PROJECT_ID}/tasks`, {
headers: { 'x-user-role': currentRole }
}).then(r => r.json())
]);
if (wfRes && wfRes.nodes) {
liveNodes = wfRes.nodes;
}
if (Array.isArray(tasksRes)) {
liveTasks = tasksRes;
}
const categoryMap = {
'infra': 'node-infra',
'backend': 'node-backend',
'frontend': 'node-frontend',
'devops': 'node-telemetry',
'marketing': 'node-marketing'
};
liveNodes.forEach(node => {
const elId = categoryMap[node.category];
if (!elId) return;
const el = document.getElementById(elId);
const pill = document.getElementById(`pill-${elId}`);
const countEl = document.getElementById(`count-${elId}`);
nodeStates[elId] = (node.status === 'GREEN');
if (el) {
if (node.status === 'GREEN') {
el.classList.add('green');
} else {
el.classList.remove('green');
}
}
if (pill) {
pill.innerText = node.status;
}
if (countEl) {
if (node.category === 'devops') {
countEl.innerText = node.status === 'GREEN' ? '1/1 workflow_run exitoso' : '0/1 workflow_run (Pendiente)';
} else if (node.category === 'marketing') {
countEl.innerText = node.status === 'GREEN' ? '98.5% tasa de entrega (≥95%)' : '0% tasa de entrega (Requiere ≥95%)';
} else {
const nodeTasks = liveTasks.filter(t => t.node_id === node.id || (t.title && t.title.toLowerCase().includes(node.category)));
const done = nodeTasks.filter(t => t.status === 'DONE').length;
countEl.innerText = `${done}/${Math.max(nodeTasks.length, 2)} tareas completadas`;
}
}
});
updateOverallMetrics();
if (lbl) {
lbl.innerText = `ONLINE (${liveTasks.length} tareas)`;
lbl.style.color = 'var(--accent-green)';
}
if (dot) dot.classList.remove('red');
} catch (err) {
if (lbl) {
lbl.innerText = 'CONEXIÓN INTERMITENTE';
lbl.style.color = 'var(--accent-red)';
}
if (dot) dot.classList.add('red');
addLog(`[NEON SYNC WARN] ${err.message}`, 'normal');
}
}
// MUTACIÓN REAL DE TAREAS EN NEON POSTGRESQL
async function mutateTaskReal(taskId, newStatus, taskName) {
if (currentRole === 'CLIENT') {
addLog(`[HTTP 403 FORBIDDEN] Mutación rechazada para tarea '${taskName}'. El rol CLIENT es de sólo lectura.`, 'pulse');
alert('Acceso Denegado (HTTP 403 Forbidden): El rol CLIENT tiene permisos estrictamente de sólo lectura según las directivas del sistema.');
return;
}
addLog(`[HTTP PATCH /api/v1/tasks/${taskId}/status] status: ${newStatus} (Rol: ${currentRole})...`, 'normal');
try {
const res = await fetch(`/api/v1/tasks/${taskId}/status`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
'x-user-role': currentRole
},
body: JSON.stringify({ status: newStatus, user_role: currentRole })
});
if (!res.ok) {
const errData = await res.json().catch(() => ({}));
throw new Error(errData.error || `HTTP ${res.status}`);
}
const data = await res.json();
addLog(`[NEON DB] Tarea '${taskName}' -> ${newStatus} guardada en PostgreSQL.`, 'pulse');
if (data.nodeTransitions && data.nodeTransitions.length > 0) {
data.nodeTransitions.forEach(trans => {
addLog(`[WS EMIT] WORKFLOW_NODE_TRANSITION: Transición binaria -> Nodo ${trans.status}`, 'transition');
});
}
await syncWithNeonDB();
} catch (err) {
addLog(`[MUTATION ERROR]: ${err.message}`, 'pulse');
alert(`Error al actualizar tarea: ${err.message}`);
}
}
// ACCIONES ESPECÍFICAS PARA EL PANEL
function toggleBackendTaskNeon() {
const task = liveTasks.find(t => t.id === 'f17dcbf9-8ac8-44d6-bf51-8cab5999a840') || { status: 'TODO' };
const target = task.status === 'DONE' ? 'TODO' : 'DONE';
mutateTaskReal('f17dcbf9-8ac8-44d6-bf51-8cab5999a840', target, 'Rutas CRUD de tareas');
}
function toggleInfraTaskNeon() {
const task = liveTasks.find(t => t.id === '3af53ce9-b025-47d9-ad62-1b029cb80b2d') || { status: 'TODO' };
const target = task.status === 'DONE' ? 'TODO' : 'DONE';
mutateTaskReal('3af53ce9-b025-47d9-ad62-1b029cb80b2d', target, 'Ejecutar esquema DDL');
}
function toggleNodeState(nodeId, nodeName) {
if (nodeId === 'node-backend') {
toggleBackendTaskNeon();
return;
}
if (nodeId === 'node-infra') {
toggleInfraTaskNeon();
return;
}
nodeStates[nodeId] = !nodeStates[nodeId];
const el = document.getElementById(nodeId);
const pill = document.getElementById(`pill-${nodeId}`);
if (nodeStates[nodeId]) {
el.classList.add('green');
pill.innerText = 'GREEN';
addLog(`[SIMULACIÓN] Nodo '${nodeName}' -> GREEN`, 'transition');
} else {
el.classList.remove('green');
pill.innerText = 'RED';
addLog(`[SIMULACIÓN] Nodo '${nodeName}' -> RED`, 'transition');
}
updateOverallMetrics();
}
function simulateGitHubWebhook() {
const el = document.getElementById('node-telemetry');
const pill = document.getElementById(`pill-node-telemetry`);
const count = document.getElementById(`count-node-telemetry`);
nodeStates['node-telemetry'] = true;
el.classList.add('green');
pill.innerText = 'GREEN';
count.innerText = '1/1 workflow_run exitoso (sha: 032064f)';
addLog("[HTTP POST /api/v1/telemetry/github] HMAC-SHA256 firma criptográfica verificada OK (Status 200)", 'pulse');
addLog("[WS EMIT] TELEMETRY_PULSE: workflow_run 'CI Build' conclusion: success (34s)", 'pulse');
addLog("[WS EMIT] WORKFLOW_NODE_TRANSITION: Node 'Telemetría GitHub' -> GREEN", 'transition');
updateOverallMetrics();
}
function simulateGitHubWebhookFail() {
const el = document.getElementById('node-telemetry');
const pill = document.getElementById(`pill-node-telemetry`);
const count = document.getElementById(`count-node-telemetry`);
nodeStates['node-telemetry'] = false;
el.classList.remove('green');
pill.innerText = 'RED';
count.innerText = '0/1 workflow_run (Falló o pendiente)';
addLog("[HTTP POST /api/v1/telemetry/github] workflow_run conclusion: failure", 'pulse');
addLog("[WS EMIT] WORKFLOW_NODE_TRANSITION: Node 'Telemetría GitHub' -> RED", 'transition');
updateOverallMetrics();
}
function simulateMarketingCampaign() {
const el = document.getElementById('node-marketing');
const pill = document.getElementById(`pill-node-marketing`);
const count = document.getElementById(`count-node-marketing`);
nodeStates['node-marketing'] = true;
el.classList.add('green');
pill.innerText = 'GREEN';
count.innerText = '98.5% tasa de entrega exitosa (≥95%)';
addLog("[BULLMQ QUEUE] Job #8491 completado: 250 enviados, 0 rebotes, 2 bajas", 'pulse');
addLog("[WS EMIT] CAMPAIGN_TELEMETRY_PULSE: Campaña alcanzó 98.5% de entrega", 'pulse');
addLog("[WS EMIT] WORKFLOW_NODE_TRANSITION: Node 'Campaña Masiva' -> GREEN (≥95% umbral superado)", 'transition');
updateOverallMetrics();
}
function resetMarketingCampaign() {
const el = document.getElementById('node-marketing');
const pill = document.getElementById(`pill-node-marketing`);
const count = document.getElementById(`count-node-marketing`);
nodeStates['node-marketing'] = false;
el.classList.remove('green');
pill.innerText = 'RED';
count.innerText = '0% de entrega (Requiere ≥95%)';
addLog("[BULLMQ QUEUE] Estado reiniciado a DRAFT", 'normal');
addLog("[WS EMIT] WORKFLOW_NODE_TRANSITION: Node 'Campaña Masiva' -> RED", 'transition');
updateOverallMetrics();
}
// MODAL: 1. AI TASK PLANNER (DESGLOSAR TAREAS CON IA)
function triggerAIDecomposeTask() {
document.getElementById('modal-title').innerText = '🤖 AI Task Planner: Desglosar Requerimientos';
document.getElementById('modal-content').innerHTML = `
Fallback Engine: Activo
`;
document.getElementById('guide-modal').classList.add('open');
}
async function executeAIDecomposeTask() {
const title = document.getElementById('ai-task-title-input').value.trim();
const desc = document.getElementById('ai-task-desc-input').value.trim();
const btn = document.getElementById('btn-run-ai-task');
const resultsBox = document.getElementById('ai-task-results');
if (!title) {
alert('Por favor ingresa un título para la tarea.');
return;
}
btn.disabled = true;
btn.innerHTML = ` Consultando AI Gateway...`;
addLog(`[AI GATEWAY] Desglosando tarea: "${title}"...`, 'pulse');
try {
const res = await fetch('/api/v1/ai/tasks/breakdown', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
projectId: ACTIVE_PROJECT_ID,
taskTitle: title,
taskDescription: desc
})
});
if (!res.ok) {
const err = await res.json().catch(() => ({}));
throw new Error(err.error || `HTTP ${res.status}`);
}
const data = await res.json();
const plan = data.plan;
lastGeneratedSubtasks = plan.subtasks || [];
let subtasksHtml = lastGeneratedSubtasks.map((st, i) => `
${subtasksHtml}
`;
addLog(`[AI GATEWAY] ${lastGeneratedSubtasks.length} subtareas generadas con éxito y validadas con Zod.`, 'transition');
} catch (err) {
addLog(`[AI ERROR] Falló el desglose: ${err.message}`, 'pulse');
resultsBox.innerHTML = `
Error: ${err.message}
`;
} finally {
btn.disabled = false;
btn.innerHTML = `✨ Desglosar con Gemini AI`;
}
}
async function saveSubtasksToNeon() {
if (currentRole === 'CLIENT') {
alert('Acceso Denegado (HTTP 403 Forbidden): El rol CLIENT no puede crear tareas.');
return;
}
if (!lastGeneratedSubtasks || lastGeneratedSubtasks.length === 0) {
alert('No hay subtareas generadas para guardar.');
return;
}
addLog(`[NEON DB] Insertando ${lastGeneratedSubtasks.length} subtareas en PostgreSQL...`, 'pulse');
try {
let inserted = 0;
for (const st of lastGeneratedSubtasks) {
await fetch(`/api/v1/projects/${ACTIVE_PROJECT_ID}/tasks`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-user-role': currentRole
},
body: JSON.stringify({
title: st.title,
description: st.acceptance_criteria,
priority: 'MEDIUM',
user_role: currentRole
})
});
inserted++;
}
addLog(`[NEON DB] ${inserted} subtareas persistidas correctamente en project_tasks.`, 'transition');
alert(`¡Éxito! Se insertaron ${inserted} subtareas en la base de datos Neon.`);
await syncWithNeonDB();
} catch (err) {
alert(`Error al guardar en Neon: ${err.message}`);
}
}
// MODAL: 2. AI EXECUTIVE REPORT (CONSULTA VIVA DE POSTGRESQL + GEMINI)
function triggerAIExecutiveReport() {
document.getElementById('modal-title').innerText = '📊 Reporte Ejecutivo en Vivo para Clientes';
document.getElementById('modal-content').innerHTML = `
Este reporte consulta el estado real de los nodos en Neon PostgreSQL, métricas de avance y CI/CD, sintetizándolos mediante el AI Gateway en un formato comprensible para directores de negocio.
`;
document.getElementById('guide-modal').classList.add('open');
}
async function executeAIExecutiveReport() {
const btn = document.getElementById('btn-run-exec-report');
const box = document.getElementById('ai-exec-results');
btn.disabled = true;
btn.innerHTML = ` Consultando Neon DB & AI Gateway...`;
addLog(`[AI GATEWAY] Consultando estado consolidado en PostgreSQL para reporte ejecutivo...`, 'pulse');
try {
const res = await fetch(`/api/v1/ai/executive-report/${ACTIVE_PROJECT_ID}`);
if (!res.ok) {
const err = await res.json().catch(() => ({}));
throw new Error(err.error || `HTTP ${res.status}`);
}
const data = await res.json();
const rep = data.report;
const healthColor = rep.overall_health === 'ON_TRACK' ? 'var(--accent-green)' : (rep.overall_health === 'AT_RISK' ? 'var(--accent-amber)' : 'var(--accent-red)');
box.innerHTML = `
`;
addLog(`[AI GATEWAY] Grafo DAG generado exitosamente y formateado para @xyflow/react.`, 'transition');
} catch (err) {
addLog(`[AI ERROR] Falló Blueprint: ${err.message}`, 'pulse');
box.innerHTML = `
Error: ${err.message}
`;
} finally {
btn.disabled = false;
btn.innerHTML = `📐 Generar Grafo DAG & Nodos con IA`;
}
}
// =========================================================================
// 6. AI SLIDE ENGINE: DIAPOSITIVAS EJECUTIVAS TSOLUTIONS IPIDD (TERA / GAMMA)
// =========================================================================
let currentPresentationSlides = [];
let currentPresentationIndex = 0;
let currentPresentationTitle = '';
async function triggerAISlideEngine() {
document.getElementById('modal-title').innerText = '📽️ AI Slide Engine: Diapositivas Ejecutivas TSolutions IPIDD';
document.getElementById('modal-content').innerHTML = `
Lema Rector:"Tecnología instalada. Conocimiento transferido. Negocios escalados."
Generador de diapositivas ejecutivas 16:9 bloqueado bajo los tokens corporativos de TSolutions IPIDD.
`;
document.getElementById('guide-modal').classList.add('open');
}
async function executeAISlideEngine() {
const title = document.getElementById('ai-slide-title').value.trim();
const objective = document.getElementById('ai-slide-objective').value.trim();
const context = document.getElementById('ai-slide-context').value.trim();
const btn = document.getElementById('btn-run-slides');
const box = document.getElementById('ai-slide-results');
if (!title || !objective) {
alert('Por favor completa el título y el objetivo.');
return;
}
btn.disabled = true;
btn.innerHTML = ` Orquestando con AI Gateway & Persistiendo en Neon...`;
addLog(`[AI GATEWAY] Generando diapositivas ejecutivas para: "${title}"...`, 'pulse');
try {
const res = await fetch('/api/v1/presentations/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
projectId: ACTIVE_PROJECT_ID,
title,
objective,
contextSummary: context
})
});
if (!res.ok) {
const err = await res.json().catch(() => ({}));
throw new Error(err.error || `HTTP ${res.status}`);
}
const data = await res.json();
currentPresentationSlides = data.slides || [];
currentPresentationTitle = data.deck.title;
currentPresentationIndex = 0;
box.innerHTML = `
${data.deck.title}
✓ ${currentPresentationSlides.length} diapositivas modulares generadas y persistidas en Neon PostgreSQL
`;
overlay.style.display = 'flex';
// Atajos de teclado en pantalla completa
window.onkeydown = function(e) {
if (overlay.style.display === 'flex') {
if (e.key === 'ArrowRight' || e.key === ' ' || e.key === 'PageDown') {
e.preventDefault();
fullscreenNextSlide();
} else if (e.key === 'ArrowLeft' || e.key === 'PageUp') {
e.preventDefault();
fullscreenPrevSlide();
} else if (e.key === 'Escape') {
closeFullscreenPresenter();
}
}
};
}
function fullscreenNextSlide() {
if (currentPresentationIndex < currentPresentationSlides.length - 1) {
currentPresentationIndex++;
const target = document.getElementById('fullscreen-slide-body');
if (target) {
target.innerHTML = renderSlideHTML(currentPresentationSlides[currentPresentationIndex], currentPresentationIndex + 1, currentPresentationSlides.length);
}
}
}
function fullscreenPrevSlide() {
if (currentPresentationIndex > 0) {
currentPresentationIndex--;
const target = document.getElementById('fullscreen-slide-body');
if (target) {
target.innerHTML = renderSlideHTML(currentPresentationSlides[currentPresentationIndex], currentPresentationIndex + 1, currentPresentationSlides.length);
}
}
}
function closeFullscreenPresenter() {
const overlay = document.getElementById('ts-fullscreen-presenter-overlay');
if (overlay) overlay.style.display = 'none';
window.onkeydown = null;
}
// MODAL DE INFORMACIÓN RÁPIDA / GUÍA
function openQuickGuideModal() {
document.getElementById('modal-title').innerText = 'Guía Integral del Ecosistema Nexus';
document.getElementById('modal-content').innerHTML = `
Bienvenido a Nexus Architect Suite. Esta plataforma centraliza todas las herramientas desarrolladas para la ingeniería, diseño y comercialización del proyecto:
Lienzo de Workflow DAG: Grafo de 5 nodos con algoritmo binario de color (Rojo si falta alguna tarea o webhook, Verde cuando el 100% de requerimientos se cumple).
Prompt Architect: Redactor en texto plano de ideas que auto-rellena checklists de 5 fases y formula directivas de sistema para LLMs.
Gestor To-Do: Sincronización colaborativa de tareas con tiempo de respuesta inferior a 200 ms y protección contra mutaciones por rol CLIENT.
Motor de Marketing BullMQ: Cola de envíos masivos por Redis, filtrado de listas de supresión, cabeceras RFC 8058 y métricas de apertura/clics.
Generador de Lockups CAD: Plataforma SVG para creación de esquemas técnicos vectoriales y marcas de agua.
Modelos ROI y Comerciales: Informes financieros con ROI y desgravación fiscal para MPS Ayala.
Tip: En el simulador inferior puedes accionar los botones de simulación para observar las transiciones de eventos y logs de WebSocket en tiempo real.
`;
document.getElementById('guide-modal').classList.add('open');
}
function openManualModal() {
document.getElementById('modal-title').innerText = 'Manual Integral & Sugerencias de Optimización';
document.getElementById('modal-content').innerHTML = `
📘 Documento de Arquitectura y Manual Operativo
El manual exhaustivo con todas las funciones, endpoints y esquemas está persistido en el archivo raíz MANUAL_DE_USUARIO_Y_ARQUITECTURA.md.
1. Resumen de Módulos y Funcionalidades
Lienzo DAG (React Flow): Grafo de 5 nodos secuenciales con algoritmo binario de color (RED / GREEN) y bloqueo estructural para rol CLIENT.
Antigravity Prompt Architect: Workspace de texto plano con analizador léxico, checklist de 5 fases y generador de directivas de sistema para LLMs.
Gestor To-Do: Control de tareas con prioridades (Low a Critical), latencia <200ms en WebSocket y regla 100% DONE para activación de nodos.
Motor de Marketing BullMQ: Colas asíncronas con Redis, verificación contra lista de supresión, cabeceras RFC 8058, píxel 1x1 y regla de aprobación ≥95%.
Estudio CAD Vectorial SVG: Diseñador técnico de lockups y diagramas con exportación SVG y rasterizado.
Modelos Financieros y ROI: Documentación ejecutiva de amortización y mitigación fiscal para MPS Ayala.
2. Sugerencias Clave de Optimización
• Caché de Grafos en Redis: Almacenar en memoria la estructura del DAG para reducir consultas repetitivas a Neon PostgreSQL, invalidando la clave solo ante eventos WORKFLOW_NODE_TRANSITION.
• Despacho por Lotes (Batching) en BullMQ: Empaquetar envíos en bloques de 50 correos por job para optimizar el rendimiento de la cola y conexiones concurrentes.
• Validación Estricta con Zod: Proteger todos los controladores REST y Webhooks con schemas Zod para tipado seguro en tiempo de ejecución.
• Virtualización de Tareas (React Virtual): Implementar @tanstack/react-virtual en la lista To-Do para soportar proyectos con cientos de tareas sin degradación del DOM.
• Autenticación Robusta con Neon Auth: Integrar sesiones JWT y rotación de credenciales para reemplazar el paso de headers de rol en peticiones API.
`;
}
let sourcesHtml = '';
if (data.sources && data.sources.length > 0) {
sourcesHtml = `
Ver ${data.sources.length} fragmentos recuperados de la memoria vectorial