feat: migrar dashboard a React 19 + TypeScript + Vite + Tailwind v4

- Módulo HITL (/cases): 6 patrones de formularios dinámicos para 53 tipos de caso con validación Zod
- Módulo Monitor (/monitor): streaming token-a-token en tiempo real, auto-scroll y notas internas vía WebSocket
- Arquitectura híbrida: REST (canal autoritativo) + WebSocket (difusión/streaming)
- MSW para desarrollo sin backend, hooks de notificaciones/sonido/título preservados
- Backend legacy movido a legacy/, archivos residuales eliminados de raíz
This commit is contained in:
2026-07-23 18:27:03 -05:00
parent 69cc215954
commit 8f044567c0
78 changed files with 11818 additions and 1563 deletions
+59
View File
@@ -0,0 +1,59 @@
const Database = require('better-sqlite3');
const fs = require('fs');
const path = require('path');
require('dotenv').config();
const dbFile = process.env.DATABASE_FILE || 'database.sqlite';
const dbPath = path.isAbsolute(dbFile) ? dbFile : path.join(__dirname, dbFile);
let db;
try {
// better-sqlite3 creates the database file synchronously on creation
db = new Database(dbPath);
console.log(`📂 SQLite database connected via better-sqlite3: ${dbPath}`);
} catch (err) {
console.error('💥 Failed to open SQLite database:', err.message);
process.exit(1);
}
// Wrap operations in async functions to maintain compatibility with server.js
async function query(sql, params = []) {
const stmt = db.prepare(sql);
const trimmedSql = sql.trim().toUpperCase();
const isMutating = trimmedSql.startsWith('INSERT') ||
trimmedSql.startsWith('UPDATE') ||
trimmedSql.startsWith('DELETE');
if (isMutating) {
const result = stmt.run(params);
return { insertId: result.lastInsertRowid, changes: result.changes };
} else {
return stmt.all(params);
}
}
async function initializeSchema() {
try {
const schemaPath = path.join(__dirname, 'schema.sql');
if (fs.existsSync(schemaPath)) {
const sql = fs.readFileSync(schemaPath, 'utf8');
// Executes multiple SQL statements in schema.sql
db.exec(sql);
try {
db.exec('ALTER TABLE requests ADD COLUMN tipo_solicitud TEXT;');
console.log(' Added tipo_solicitud column to existing requests table');
} catch (e) {
// Ignore if column already exists
}
console.log('✅ Database schema initialized/verified successfully');
}
} catch (error) {
console.error('⚠️ Failed to initialize schema automatically:', error.message);
}
}
module.exports = {
query,
initializeSchema,
db
};