blackcoffee2 2.1.0 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/.env.example +67 -0
  2. package/CHANGELOG.md +167 -0
  3. package/README.md +1 -3
  4. package/config/database.json +11 -0
  5. package/controllers/admin/AuthController.js +2 -1
  6. package/core/ViewHelper.js +75 -0
  7. package/core/hotReload.js +1 -1
  8. package/data/blackcoffee_admin.db-shm +0 -0
  9. package/data/blackcoffee_admin.db-wal +0 -0
  10. package/includes/adminAuth.js +5 -3
  11. package/includes/sessions.js +1 -1
  12. package/otrack.tar.gz +0 -0
  13. package/package.json +4 -2
  14. package/programatically/initFlow.js +2 -2
  15. package/test-aplicacion.con-logisession/BlackCoffee.js +0 -226
  16. package/test-aplicacion.con-logisession/SSL_SETUP.md +0 -53
  17. package/test-aplicacion.con-logisession/certs/ca-certificate.pem +0 -32
  18. package/test-aplicacion.con-logisession/certs/ca-private-key.pem +0 -52
  19. package/test-aplicacion.con-logisession/certs/certificate-2048.pem +0 -22
  20. package/test-aplicacion.con-logisession/certs/certificate.pem +0 -32
  21. package/test-aplicacion.con-logisession/certs/private-key-2048.pem +0 -28
  22. package/test-aplicacion.con-logisession/certs/private-key.pem +0 -52
  23. package/test-aplicacion.con-logisession/config/iaQueueSetup.js +0 -84
  24. package/test-aplicacion.con-logisession/config/qwen-rules.json +0 -39
  25. package/test-aplicacion.con-logisession/controllers/analyticsController.js +0 -117
  26. package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +0 -142
  27. package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +0 -439
  28. package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +0 -223
  29. package/test-aplicacion.con-logisession/controllers/endpointController.js +0 -66
  30. package/test-aplicacion.con-logisession/controllers/example.js +0 -183
  31. package/test-aplicacion.con-logisession/controllers/iaQueueController.js +0 -367
  32. package/test-aplicacion.con-logisession/controllers/queueController.js +0 -206
  33. package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +0 -197
  34. package/test-aplicacion.con-logisession/controllers/test.js +0 -0
  35. package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +0 -78
  36. package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +0 -412
  37. package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +0 -437
  38. package/test-aplicacion.con-logisession/hooks/admin-hooks.js +0 -20
  39. package/test-aplicacion.con-logisession/hooks/general-hooks.js +0 -97
  40. package/test-aplicacion.con-logisession/hooks/queue-hooks.js +0 -64
  41. package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +0 -38
  42. package/test-aplicacion.con-logisession/hooks/security-hooks.js +0 -24
  43. package/test-aplicacion.con-logisession/insitu-admin-client/README.md +0 -69
  44. package/test-aplicacion.con-logisession/insitu-admin-client/package.json +0 -23
  45. package/test-aplicacion.con-logisession/insitu-admin-client.js +0 -257
  46. package/test-aplicacion.con-logisession/models/ExampleModel.js +0 -88
  47. package/test-aplicacion.con-logisession/models/QueueJobModel.js +0 -263
  48. package/test-aplicacion.con-logisession/models/TokenModel.js +0 -207
  49. package/test-aplicacion.con-logisession/models/auth/AuthModel.js +0 -66
  50. package/test-aplicacion.con-logisession/models/auth/UserModel.js +0 -189
  51. package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +0 -213
  52. package/test-aplicacion.con-logisession/models/tracking/EventModel.js +0 -366
  53. package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +0 -131
  54. package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +0 -360
  55. package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +0 -286
  56. package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +0 -207
  57. package/test-aplicacion.con-logisession/package-lock.json +0 -3313
  58. package/test-aplicacion.con-logisession/package.json +0 -32
  59. package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +0 -1339
  60. package/test-aplicacion.con-logisession/public/css/style.css +0 -64
  61. package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +0 -18
  62. package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +0 -16
  63. package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +0 -43
  64. package/test-aplicacion.con-logisession/public/images/logo.svg +0 -7
  65. package/test-aplicacion.con-logisession/public/js/main.js +0 -67
  66. package/test-aplicacion.con-logisession/routes/analytics-routes.json +0 -8
  67. package/test-aplicacion.con-logisession/routes/auth-routes.json +0 -98
  68. package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +0 -20
  69. package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +0 -16
  70. package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +0 -11
  71. package/test-aplicacion.con-logisession/routes/endpoints-routes.json +0 -8
  72. package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +0 -26
  73. package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +0 -20
  74. package/test-aplicacion.con-logisession/routes/queue-routes.json +0 -32
  75. package/test-aplicacion.con-logisession/routes/qwen-routes.json +0 -14
  76. package/test-aplicacion.con-logisession/routes/static-routes.json +0 -29
  77. package/test-aplicacion.con-logisession/routes/tracking-routes.json +0 -58
  78. package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +0 -51
  79. package/test-aplicacion.con-logisession/utils/dbAdapter.js +0 -88
  80. package/test-aplicacion.con-logisession/utils/qbWrapper.js +0 -4
  81. package/test-aplicacion.con-logisession/utils/queueProcessor.js +0 -305
  82. package/test-aplicacion.con-logisession/utils/qwenRulesService.js +0 -131
  83. package/test-aplicacion.con-logisession/utils/tokenHelper.js +0 -22
  84. package/test-aplicacion.con-logisession/views/auth/dashboard.html +0 -443
  85. package/test-aplicacion.con-logisession/views/auth/forgot-password.html +0 -200
  86. package/test-aplicacion.con-logisession/views/auth/login.html +0 -213
  87. package/test-aplicacion.con-logisession/views/auth/register.html +0 -294
  88. package/test-aplicacion.con-logisession/views/contact/form.html +0 -47
  89. package/test-aplicacion.con-logisession/views/products/index.html +0 -39
@@ -1,88 +0,0 @@
1
- /**
2
- * Módulo de adaptador centralizado para la base de datos
3
- * dbAdapter.js
4
- *
5
- * Proporciona una instancia singleton del adaptador MariaDB
6
- * para ser utilizada por todos los modelos del sistema
7
- */
8
-
9
- const { MariaDBAdapter } = require('insitu-js');
10
-
11
- // Variable para almacenar la instancia única del adaptador
12
- let sharedAdapterInstance = null;
13
-
14
- /**
15
- * Obtiene la instancia del adaptador de base de datos
16
- * Si no existe una instancia activa, crea una nueva
17
- * @returns {Object} - Instancia del adaptador de base de datos
18
- */
19
- function getSharedAdapter() {
20
- if (!sharedAdapterInstance) {
21
- // Configuración de la conexión desde variables de entorno
22
- const dbConfig = {
23
- host: process.env.DB_HOST || 'localhost',
24
- user: process.env.DB_USER || 'root',
25
- password: process.env.DB_PASSWORD || '',
26
- database: process.env.DB_NAME || 'BlackCoffee_db',
27
- connectionLimit: parseInt(process.env.DB_CONNECTION_LIMIT) || 10,
28
- acquireTimeout: 10000, // Reducido para evitar cuelgues
29
- timeout: 10000, // Reducido para evitar cuelgues
30
- // Opciones adicionales para mejorar la estabilidad
31
- connectTimeout: 10000, // Reducido para evitar cuelgues
32
- allowLocalInfiles: true,
33
- initSql: 'SET SESSION sql_mode = "TRADITIONAL"',
34
- extraFiles: [],
35
- insertIdAsNumber: false,
36
- bigIntAsNumber: false,
37
- dateStrings: false
38
- };
39
-
40
- // Crear una nueva instancia del adaptador MariaDB
41
- sharedAdapterInstance = new MariaDBAdapter(dbConfig);
42
-
43
- // Guardar la función original de query
44
- const originalQuery = sharedAdapterInstance.query;
45
-
46
- // Reemplazar el método query con uno que maneje la desconexión
47
- sharedAdapterInstance.query = async function(query, params = []) {
48
- try {
49
- // Intentar la consulta directamente
50
- return await originalQuery.call(this, query, params);
51
- } catch (error) {
52
- // Si hay un error de conexión, lanzar un error más específico
53
- if (error.errno || error.code === 'ECONNREFUSED' ||
54
- error.code === 'ENOTFOUND' || error.code === 'PROTOCOL_CONNECTION_LOST') {
55
- console.error('[DB_ADAPTER] Error de conexión a la base de datos:', error.message);
56
- throw new Error('No hay conexión disponible a la base de datos. Por favor, verifique que el servidor de base de datos esté activo.');
57
- }
58
- // Si es otro tipo de error, lanzarlo tal cual
59
- throw error;
60
- }
61
- };
62
-
63
- console.log('[DB_ADAPTER] Adaptador centralizado creado exitosamente');
64
- }
65
-
66
- return sharedAdapterInstance;
67
- }
68
-
69
- /**
70
- * Cierra la conexión del adaptador centralizado
71
- */
72
- async function closeSharedAdapter() {
73
- if (sharedAdapterInstance && sharedAdapterInstance.pool) {
74
- try {
75
- await sharedAdapterInstance.pool.end();
76
- console.log('[DB_ADAPTER] Adaptador centralizado cerrado exitosamente');
77
- sharedAdapterInstance = null;
78
- } catch (error) {
79
- console.error('[DB_ADAPTER] Error cerrando el adaptador centralizado:', error.message);
80
- throw error;
81
- }
82
- }
83
- }
84
-
85
- module.exports = {
86
- getSharedAdapter,
87
- closeSharedAdapter
88
- };
@@ -1,4 +0,0 @@
1
- // Wrapper para usar qbuilderjs sin conflictos con insitu-js
2
- const { QueryBuilder } = require('qbuilderjs');
3
-
4
- module.exports = { QueryBuilder };
@@ -1,305 +0,0 @@
1
- const QueueJobModel = require('../models/QueueJobModel');
2
- const { hooks } = require('insitu-js');
3
-
4
- class QueueProcessor {
5
- constructor() {
6
- this.jobModel = QueueJobModel;
7
- this.isRunning = false;
8
- this.processingDelay = 1000; // Milisegundos entre procesamientos
9
- this.workers = new Map(); // Mapa de workers por cola
10
- }
11
-
12
- // Iniciar el procesador de colas
13
- start() {
14
- if (this.isRunning) {
15
- console.log('El procesador de colas ya está en ejecución');
16
- return;
17
- }
18
-
19
- // Disparar hook antes de iniciar el procesador
20
- hooks.doAction('queue_processor_started');
21
-
22
- this.isRunning = true;
23
- console.log('Iniciando procesador de colas...');
24
- this.run();
25
- }
26
-
27
- // Detener el procesador de colas
28
- stop() {
29
- // Disparar hook antes de detener el procesador
30
- hooks.doAction('queue_processor_stopped');
31
-
32
- this.isRunning = false;
33
- console.log('Deteniendo procesador de colas...');
34
- }
35
-
36
- // Ejecutar el bucle principal del procesador
37
- async run() {
38
- if (!this.isRunning) return;
39
-
40
- try {
41
- // Disparar hook al comienzo de cada iteración del bucle principal
42
- await hooks.doActionAsync('queue_processor_iteration_start');
43
-
44
- // Filtrar las colas que se van a procesar
45
- const queuesToProcess = await hooks.applyFiltersAsync('filter_queue_names_to_process', Array.from(this.jobModel.queues.keys()));
46
-
47
- // Procesar trabajos de todas las colas
48
- for (const queueName of queuesToProcess) {
49
- await this.processQueue(queueName);
50
- }
51
-
52
- // Disparar hook al final de cada iteración del bucle principal
53
- await hooks.doActionAsync('queue_processor_iteration_end');
54
- } catch (error) {
55
- console.error('Error en el procesador de colas:', error);
56
- }
57
-
58
- // Continuar ejecutando después de un delay
59
- setTimeout(() => this.run(), this.processingDelay);
60
- }
61
-
62
- // Procesar una cola específica
63
- async processQueue(queueName) {
64
- // Disparar hook antes de procesar una cola específica
65
- await hooks.doActionAsync('queue_before_process_specific', queueName);
66
-
67
- // Obtener el siguiente trabajo pendiente
68
- const job = await this.jobModel.getNextPendingJob(queueName);
69
-
70
- if (job) {
71
- // Disparar hook antes de marcar como en proceso
72
- await hooks.doActionAsync('queue_job_mark_processing_before', job);
73
-
74
- // Marcar como en proceso
75
- await this.jobModel.markJobAsProcessing(job.id);
76
-
77
- // Disparar hook después de marcar como en proceso
78
- await hooks.doActionAsync('queue_job_mark_processing_after', job);
79
-
80
- // Ejecutar el trabajo
81
- await this.executeJob(job);
82
- }
83
-
84
- // Disparar hook después de procesar una cola específica
85
- await hooks.doActionAsync('queue_after_process_specific', queueName);
86
- }
87
-
88
- // Ejecutar un trabajo específico
89
- async executeJob(job) {
90
- try {
91
- // Disparar hook antes de ejecutar un trabajo específico
92
- await hooks.doActionAsync('queue_job_execute_start', job);
93
-
94
- // Simular un delay para dar tiempo a otros procesos
95
- await this.delay(100);
96
-
97
- // Obtener el manejador de trabajo para esta cola
98
- const handler = this.getHandlerForQueue(job.queue);
99
-
100
- if (handler) {
101
- // Filtrar el payload antes de ejecutarlo
102
- const filteredPayload = await hooks.applyFiltersAsync('filter_job_payload_before_execution', job.payload, job);
103
-
104
- // Ejecutar el manejador con los datos del trabajo
105
- const result = await handler(filteredPayload);
106
-
107
- // Filtrar el resultado antes de guardarlo
108
- const filteredResult = await hooks.applyFiltersAsync('filter_job_result_before_save', result, job);
109
-
110
- // Marcar como completado
111
- await this.jobModel.markJobAsCompleted(job.id, filteredResult);
112
- console.log(`Trabajo ${job.id} completado exitosamente`);
113
-
114
- // Disparar hook después de completar un trabajo exitosamente
115
- await hooks.doActionAsync('queue_job_execute_end', job, filteredResult, 'success');
116
- } else {
117
- // Si no hay manejador, marcar como fallido
118
- const error = `No se encontró un manejador para la cola: ${job.queue}`;
119
- await this.jobModel.markJobAsFailed(job.id, error);
120
- console.error(error);
121
-
122
- // Disparar hook después de completar un trabajo con error
123
- await hooks.doActionAsync('queue_job_execute_end', job, error, 'failure');
124
- }
125
- } catch (error) {
126
- // Disparar hook cuando ocurre un error durante la ejecución de un trabajo
127
- await hooks.doActionAsync('queue_job_error_occurred', job, error);
128
-
129
- // Manejar error en la ejecución del trabajo
130
- console.error(`Error ejecutando el trabajo ${job.id}:`, error);
131
-
132
- // Verificar si se debe reintentar
133
- if (await this.jobModel.shouldRetryJob(job.id, error.message)) {
134
- // Disparar hook antes de reintentar un trabajo
135
- await hooks.doActionAsync('queue_job_retry', job, error);
136
-
137
- // Si se debe reintentar, volver a poner en cola pendiente
138
- const originalJob = this.jobModel.jobs.get(job.id);
139
- if (originalJob) {
140
- originalJob.status = 'pending';
141
- originalJob.updated_at = new Date().toISOString();
142
-
143
- // Añadir de nuevo a la cola
144
- const queue = this.jobModel.queues.get(originalJob.queue);
145
- if (queue) {
146
- queue.push(originalJob);
147
-
148
- // Reordenar la cola
149
- queue.sort((a, b) => {
150
- if (b.priority !== a.priority) {
151
- return b.priority - a.priority;
152
- }
153
- return new Date(a.created_at) - new Date(b.created_at);
154
- });
155
- }
156
- }
157
- } else {
158
- // Si no se debe reintentar, marcar como fallido permanentemente
159
- await this.jobModel.markJobAsFailed(job.id, error.message);
160
- }
161
- }
162
- }
163
-
164
- // Obtener el manejador de trabajo para una cola específica
165
- getHandlerForQueue(queueName) {
166
- // Disparar hook antes de seleccionar un manejador
167
- hooks.doAction('queue_job_handler_selected_before', queueName);
168
-
169
- // Manejadores predeterminados para colas comunes
170
- const defaultHandlers = {
171
- 'default': this.defaultHandler.bind(this),
172
- 'analytics': this.analyticsHandler.bind(this),
173
- 'email': this.emailHandler.bind(this),
174
- 'notifications': this.notificationsHandler.bind(this),
175
- 'qwen': this.qwenHandler.bind(this)
176
- };
177
-
178
- // Obtener el manejador
179
- const handler = defaultHandlers[queueName] || defaultHandlers['default'];
180
-
181
- // Disparar hook después de seleccionar un manejador
182
- hooks.doAction('queue_job_handler_selected', queueName, handler);
183
-
184
- // Devolver el manejador específico o el predeterminado
185
- return handler;
186
- }
187
-
188
- // Manejador predeterminado
189
- async defaultHandler(payload) {
190
- console.log('Ejecutando trabajo predeterminado con payload:', payload);
191
- // Simular trabajo
192
- await this.delay(500);
193
- return { success: true, message: 'Trabajo predeterminado completado', payload };
194
- }
195
-
196
- // Manejador para trabajos de analytics
197
- async analyticsHandler(payload) {
198
- console.log('Ejecutando trabajo de analytics con payload:', payload);
199
- // Simular análisis de datos
200
- await this.delay(1000);
201
- return { success: true, message: 'Análisis completado', payload };
202
- }
203
-
204
- // Manejador para trabajos de correo electrónico
205
- async emailHandler(payload) {
206
- console.log('Ejecutando trabajo de email con payload:', payload);
207
- // Simular envío de correo
208
- await this.delay(800);
209
- return { success: true, message: 'Correo enviado', payload };
210
- }
211
-
212
- // Manejador para trabajos de notificaciones
213
- async notificationsHandler(payload) {
214
- console.log('Ejecutando trabajo de notificaciones con payload:', payload);
215
- // Simular envío de notificación
216
- await this.delay(300);
217
- return { success: true, message: 'Notificación enviada', payload };
218
- }
219
-
220
- // Manejador para trabajos de Qwen
221
- async qwenHandler(payload) {
222
- console.log('Ejecutando trabajo de Qwen con payload:', payload);
223
-
224
- // Disparar hook antes de la verificación de seguridad
225
- await hooks.doActionAsync('qwen_queue_before_security_check', payload);
226
-
227
- try {
228
- // Importar el servicio de reglas
229
- const { qwenRulesService } = require('../utils/qwenRulesService');
230
-
231
- // Verificar si el prompt original es seguro ANTES de aplicar reglas
232
- if (!qwenRulesService.isPromptSafe(payload.prompt)) {
233
- // Si el prompt es inseguro, lanzar un error específico que no se reintente
234
- throw new Error('SECURITY_ERROR: El prompt contiene patrones no seguros según las reglas de seguridad');
235
- }
236
-
237
- // Disparar hook después de la verificación de seguridad
238
- await hooks.doActionAsync('qwen_queue_after_security_check', payload);
239
-
240
- // Aplicar reglas al prompt
241
- const securedPrompt = qwenRulesService.applyRulesToPrompt(payload.prompt, payload.data);
242
-
243
- // Disparar hook antes de ejecutar el comando Qwen
244
- await hooks.doActionAsync('qwen_queue_before_command_execution', securedPrompt, payload);
245
-
246
- // Importar exec aquí para evitar problemas de dependencias
247
- const { exec } = require('child_process');
248
- const util = require('util');
249
- const execAsync = util.promisify(exec);
250
-
251
- // Preparar el comando para Qwen con el prompt modificado
252
- const dataString = JSON.stringify(payload.data).replace(/"/g, '\\"');
253
- const qwenCommand = `qwen -p "${securedPrompt} ${dataString}"`;
254
-
255
- // Ejecutar el comando de Qwen
256
- const result = await execAsync(qwenCommand);
257
-
258
- // Disparar hook después de ejecutar el comando Qwen
259
- await hooks.doActionAsync('qwen_queue_after_command_execution', result, qwenCommand);
260
-
261
- // Validar la respuesta según las reglas
262
- const validatedResponse = qwenRulesService.validateResponse(result.stdout);
263
-
264
- // Disparar hook después de validar la respuesta
265
- await hooks.doActionAsync('qwen_queue_response_validated', validatedResponse, payload);
266
-
267
- return {
268
- success: true,
269
- response: validatedResponse,
270
- command: qwenCommand,
271
- userId: payload.userId,
272
- requestId: payload.requestId
273
- };
274
- } catch (error) {
275
- console.error('Error executing Qwen command:', error);
276
- throw new Error(`Qwen execution failed: ${error.message}`);
277
- }
278
- }
279
-
280
- // Método para registrar un manejador personalizado
281
- registerHandler(queueName, handlerFunction) {
282
- if (typeof handlerFunction !== 'function') {
283
- throw new Error('El manejador debe ser una función');
284
- }
285
-
286
- // Disparar hook antes de registrar un manejador
287
- hooks.doAction('queue_handler_registered_before', queueName, handlerFunction);
288
-
289
- // Añadir el manejador al mapa de workers
290
- this.workers.set(queueName, handlerFunction);
291
-
292
- // Disparar hook después de registrar un manejador
293
- hooks.doAction('queue_handler_registered', queueName, handlerFunction);
294
- }
295
-
296
- // Método de utilidad para crear un delay
297
- delay(ms) {
298
- return new Promise(resolve => setTimeout(resolve, ms));
299
- }
300
- }
301
-
302
- // Instancia global del procesador de colas
303
- const queueProcessor = new QueueProcessor();
304
-
305
- module.exports = { QueueProcessor, queueProcessor };
@@ -1,131 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
-
4
- class QwenRulesService {
5
- constructor(configPath = './config/qwen-rules.json') {
6
- // Construir la ruta absoluta desde la raíz del proyecto
7
- this.configPath = path.join(__dirname, '..', 'config', 'qwen-rules.json');
8
- this.rulesConfig = this.loadConfig();
9
- }
10
-
11
- // Cargar la configuración de reglas
12
- loadConfig() {
13
- try {
14
- const configData = fs.readFileSync(this.configPath, 'utf8');
15
- return JSON.parse(configData);
16
- } catch (error) {
17
- console.error('Error loading Qwen rules configuration:', error.message);
18
- // Devolver configuración por defecto si hay error
19
- return {
20
- qwenRules: {
21
- restrictSystemInfo: true,
22
- preventDataLeakage: true,
23
- allowExternalContext: false,
24
- maxResponseTokens: 2000,
25
- prohibitedTopics: [
26
- "sistema de archivos",
27
- "estructura de directorios",
28
- "archivos del sistema",
29
- "información interna",
30
- "código fuente del sistema",
31
- "configuración interna"
32
- ],
33
- customInstructions: [
34
- "Solo responde sobre los datos que se te proporcionan explícitamente",
35
- "No hagas suposiciones sobre la estructura interna del sistema",
36
- "Si se te pregunta sobre archivos o estructura del sistema, redirige a los datos proporcionados"
37
- ]
38
- },
39
- queueSettings: {
40
- defaultPriority: 0,
41
- maxRetries: 3,
42
- processingTimeout: 60000,
43
- maxPayloadSize: 1048576
44
- },
45
- security: {
46
- sanitizeInputs: true,
47
- validateOutputs: true,
48
- blockSuspiciousPatterns: true
49
- }
50
- };
51
- }
52
- }
53
-
54
- // Aplicar reglas al prompt antes de enviarlo a Qwen
55
- applyRulesToPrompt(prompt, data) {
56
- const { qwenRules } = this.rulesConfig;
57
- let enhancedPrompt = prompt;
58
-
59
- // Añadir instrucciones personalizadas al principio del prompt
60
- if (qwenRules.customInstructions && qwenRules.customInstructions.length > 0) {
61
- const instructions = qwenRules.customInstructions.join('\n');
62
- enhancedPrompt = `Instrucciones de seguridad:\n${instructions}\n\nPrompt original: ${enhancedPrompt}`;
63
- }
64
-
65
- // Añadir restricciones si están habilitadas
66
- if (qwenRules.restrictSystemInfo) {
67
- enhancedPrompt += "\n\nImportante: No proporciones información sobre el sistema, archivos o estructura interna. Responde solo basándote en los datos proporcionados.";
68
- }
69
-
70
- return enhancedPrompt;
71
- }
72
-
73
- // Validar la respuesta de Qwen según las reglas
74
- validateResponse(response) {
75
- const { qwenRules } = this.rulesConfig;
76
-
77
- // Verificar si la respuesta contiene temas prohibidos
78
- if (qwenRules.prohibitedTopics) {
79
- for (const topic of qwenRules.prohibitedTopics) {
80
- if (response.toLowerCase().includes(topic.toLowerCase())) {
81
- throw new Error(`La respuesta contiene información prohibida sobre: ${topic}`);
82
- }
83
- }
84
- }
85
-
86
- return response;
87
- }
88
-
89
- // Verificar si un prompt es seguro para procesar
90
- isPromptSafe(prompt) {
91
- const { qwenRules } = this.rulesConfig;
92
-
93
- if (!qwenRules || !qwenRules.preventDataLeakage) {
94
- return true;
95
- }
96
-
97
- // Verificar si el prompt solicita información sensible
98
- const unsafePatterns = [
99
- /archivo.*sistema/i,
100
- /estructura.*interna/i,
101
- /configuraci.n.*interna/i,
102
- /c.digo.*fuente/i,
103
- /sistema.*archivo/i,
104
- /directorio.*interno/i,
105
- /informaci.n.*interna/i
106
- ];
107
-
108
- for (const pattern of unsafePatterns) {
109
- if (pattern.test(prompt)) {
110
- return false;
111
- }
112
- }
113
-
114
- return true;
115
- }
116
-
117
- // Obtener configuración de cola
118
- getQueueSettings() {
119
- return this.rulesConfig.queueSettings || {};
120
- }
121
-
122
- // Obtener configuración de seguridad
123
- getSecuritySettings() {
124
- return this.rulesConfig.security || {};
125
- }
126
- }
127
-
128
- // Instancia global del servicio de reglas
129
- const qwenRulesService = new QwenRulesService();
130
-
131
- module.exports = { QwenRulesService, qwenRulesService };
@@ -1,22 +0,0 @@
1
- /**
2
- * Helper para la validación de tokens en el framework JERK
3
- * tokenHelper.js
4
- */
5
-
6
- const TokenModel = require('../models/tracking/TokenModel');
7
-
8
- // Instancia del modelo de tokens
9
- const tokenModel = new TokenModel();
10
-
11
- /**
12
- * Valida un token contra la base de datos
13
- * @param {string} token - Token a validar
14
- * @returns {Promise<boolean>} - True si el token es válido, false en caso contrario
15
- */
16
- async function validateToken(token) {
17
- return await tokenModel.validateToken(token);
18
- }
19
-
20
- module.exports = {
21
- validateToken
22
- };