iatoolkit 0.11.0__py3-none-any.whl → 0.71.2__py3-none-any.whl
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.
- iatoolkit/__init__.py +2 -6
- iatoolkit/base_company.py +9 -29
- iatoolkit/cli_commands.py +1 -1
- iatoolkit/common/routes.py +96 -52
- iatoolkit/common/session_manager.py +2 -1
- iatoolkit/common/util.py +17 -27
- iatoolkit/company_registry.py +1 -2
- iatoolkit/iatoolkit.py +97 -53
- iatoolkit/infra/llm_client.py +15 -20
- iatoolkit/infra/llm_proxy.py +38 -10
- iatoolkit/infra/openai_adapter.py +1 -1
- iatoolkit/infra/redis_session_manager.py +48 -2
- iatoolkit/locales/en.yaml +167 -0
- iatoolkit/locales/es.yaml +163 -0
- iatoolkit/repositories/database_manager.py +23 -3
- iatoolkit/repositories/document_repo.py +1 -1
- iatoolkit/repositories/models.py +35 -10
- iatoolkit/repositories/profile_repo.py +3 -2
- iatoolkit/repositories/vs_repo.py +26 -20
- iatoolkit/services/auth_service.py +193 -0
- iatoolkit/services/branding_service.py +70 -25
- iatoolkit/services/company_context_service.py +155 -0
- iatoolkit/services/configuration_service.py +133 -0
- iatoolkit/services/dispatcher_service.py +80 -105
- iatoolkit/services/document_service.py +5 -2
- iatoolkit/services/embedding_service.py +146 -0
- iatoolkit/services/excel_service.py +30 -26
- iatoolkit/services/file_processor_service.py +4 -12
- iatoolkit/services/history_service.py +7 -16
- iatoolkit/services/i18n_service.py +104 -0
- iatoolkit/services/jwt_service.py +18 -29
- iatoolkit/services/language_service.py +83 -0
- iatoolkit/services/load_documents_service.py +100 -113
- iatoolkit/services/mail_service.py +9 -4
- iatoolkit/services/profile_service.py +152 -76
- iatoolkit/services/prompt_manager_service.py +20 -16
- iatoolkit/services/query_service.py +208 -96
- iatoolkit/services/search_service.py +11 -4
- iatoolkit/services/sql_service.py +57 -25
- iatoolkit/services/tasks_service.py +1 -1
- iatoolkit/services/user_feedback_service.py +72 -34
- iatoolkit/services/user_session_context_service.py +112 -54
- iatoolkit/static/images/fernando.jpeg +0 -0
- iatoolkit/static/js/chat_feedback_button.js +80 -0
- iatoolkit/static/js/chat_help_content.js +124 -0
- iatoolkit/static/js/chat_history_button.js +110 -0
- iatoolkit/static/js/chat_logout_button.js +36 -0
- iatoolkit/static/js/chat_main.js +135 -222
- iatoolkit/static/js/chat_onboarding_button.js +103 -0
- iatoolkit/static/js/chat_prompt_manager.js +94 -0
- iatoolkit/static/js/chat_reload_button.js +35 -0
- iatoolkit/static/styles/chat_iatoolkit.css +289 -210
- iatoolkit/static/styles/chat_modal.css +63 -77
- iatoolkit/static/styles/chat_public.css +107 -0
- iatoolkit/static/styles/landing_page.css +182 -0
- iatoolkit/static/styles/onboarding.css +176 -0
- iatoolkit/system_prompts/query_main.prompt +5 -22
- iatoolkit/templates/_company_header.html +20 -0
- iatoolkit/templates/_login_widget.html +42 -0
- iatoolkit/templates/base.html +40 -20
- iatoolkit/templates/change_password.html +57 -36
- iatoolkit/templates/chat.html +180 -86
- iatoolkit/templates/chat_modals.html +138 -68
- iatoolkit/templates/error.html +44 -8
- iatoolkit/templates/forgot_password.html +40 -23
- iatoolkit/templates/index.html +145 -0
- iatoolkit/templates/login_simulation.html +45 -0
- iatoolkit/templates/onboarding_shell.html +107 -0
- iatoolkit/templates/signup.html +63 -65
- iatoolkit/views/base_login_view.py +91 -0
- iatoolkit/views/change_password_view.py +56 -31
- iatoolkit/views/embedding_api_view.py +65 -0
- iatoolkit/views/external_login_view.py +61 -28
- iatoolkit/views/{file_store_view.py → file_store_api_view.py} +10 -3
- iatoolkit/views/forgot_password_view.py +27 -21
- iatoolkit/views/help_content_api_view.py +54 -0
- iatoolkit/views/history_api_view.py +56 -0
- iatoolkit/views/home_view.py +50 -23
- iatoolkit/views/index_view.py +14 -0
- iatoolkit/views/init_context_api_view.py +74 -0
- iatoolkit/views/llmquery_api_view.py +58 -0
- iatoolkit/views/login_simulation_view.py +93 -0
- iatoolkit/views/login_view.py +130 -37
- iatoolkit/views/logout_api_view.py +49 -0
- iatoolkit/views/profile_api_view.py +46 -0
- iatoolkit/views/{prompt_view.py → prompt_api_view.py} +10 -10
- iatoolkit/views/signup_view.py +41 -36
- iatoolkit/views/{tasks_view.py → tasks_api_view.py} +10 -36
- iatoolkit/views/tasks_review_api_view.py +55 -0
- iatoolkit/views/user_feedback_api_view.py +60 -0
- iatoolkit/views/verify_user_view.py +34 -29
- {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/METADATA +41 -23
- iatoolkit-0.71.2.dist-info/RECORD +122 -0
- iatoolkit-0.71.2.dist-info/licenses/LICENSE +21 -0
- iatoolkit/common/auth.py +0 -200
- iatoolkit/static/images/arrow_up.png +0 -0
- iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
- iatoolkit/static/images/logo_clinica.png +0 -0
- iatoolkit/static/images/logo_iatoolkit.png +0 -0
- iatoolkit/static/images/logo_maxxa.png +0 -0
- iatoolkit/static/images/logo_notaria.png +0 -0
- iatoolkit/static/images/logo_tarjeta.png +0 -0
- iatoolkit/static/images/logo_umayor.png +0 -0
- iatoolkit/static/images/upload.png +0 -0
- iatoolkit/static/js/chat_feedback.js +0 -115
- iatoolkit/static/js/chat_history.js +0 -117
- iatoolkit/static/styles/chat_info.css +0 -53
- iatoolkit/templates/header.html +0 -31
- iatoolkit/templates/home.html +0 -199
- iatoolkit/templates/login.html +0 -43
- iatoolkit/templates/test.html +0 -9
- iatoolkit/views/chat_token_request_view.py +0 -98
- iatoolkit/views/chat_view.py +0 -58
- iatoolkit/views/download_file_view.py +0 -58
- iatoolkit/views/external_chat_login_view.py +0 -95
- iatoolkit/views/history_view.py +0 -57
- iatoolkit/views/llmquery_view.py +0 -65
- iatoolkit/views/tasks_review_view.py +0 -83
- iatoolkit/views/user_feedback_view.py +0 -74
- iatoolkit-0.11.0.dist-info/RECORD +0 -110
- {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/WHEEL +0 -0
- {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/top_level.txt +0 -0
|
@@ -1,52 +1,4 @@
|
|
|
1
|
-
/* ######################################################### */
|
|
2
1
|
/* Estilos generales para modales */
|
|
3
|
-
/* ######################################################### */
|
|
4
|
-
|
|
5
|
-
/* Estilos del header del modal con branding */
|
|
6
|
-
.modal-header.branded {
|
|
7
|
-
background-color: var(--brand-modal-header-bg);
|
|
8
|
-
color: var(--brand-modal-header-text);
|
|
9
|
-
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
|
10
|
-
}
|
|
11
|
-
.modal-header.branded .btn-close {
|
|
12
|
-
filter: invert(1) grayscale(100%) brightness(200%); /* Hace el botón de cerrar visible en fondos oscuros */
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/* Estilos para botones con branding */
|
|
16
|
-
.btn-branded-primary {
|
|
17
|
-
background-color: var(--brand-primary-color);
|
|
18
|
-
border-color: var(--brand-primary-color);
|
|
19
|
-
color: var(--brand-text-on-primary);
|
|
20
|
-
}
|
|
21
|
-
.btn-branded-primary:hover {
|
|
22
|
-
filter: brightness(90%);
|
|
23
|
-
color: var(--brand-text-on-primary);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
.btn-branded-secondary {
|
|
27
|
-
background-color: var(--brand-secondary-color);
|
|
28
|
-
border-color: var(--brand-secondary-color);
|
|
29
|
-
color: var(--brand-text-on-secondary);
|
|
30
|
-
}
|
|
31
|
-
.btn-branded-secondary:hover {
|
|
32
|
-
filter: brightness(90%);
|
|
33
|
-
color: var(--brand-text-on-secondary);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/* Estilos para alertas informativas personalizadas */
|
|
37
|
-
.alert-branded-info {
|
|
38
|
-
background-color: var(--brand-info-bg);
|
|
39
|
-
color: var(--brand-info-text);
|
|
40
|
-
border-color: var(--brand-info-border);
|
|
41
|
-
}
|
|
42
|
-
.alert-branded-info strong,
|
|
43
|
-
.alert-branded-info .alert-link {
|
|
44
|
-
color: inherit;
|
|
45
|
-
}
|
|
46
|
-
.alert-branded-info .bi { /* Asegura que los iconos también tomen el color */
|
|
47
|
-
color: inherit;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
2
|
|
|
51
3
|
/* Título del modal */
|
|
52
4
|
.modal-title{
|
|
@@ -54,7 +6,6 @@
|
|
|
54
6
|
font-weight: bold;
|
|
55
7
|
}
|
|
56
8
|
|
|
57
|
-
|
|
58
9
|
/* Estilos del header del modal*/
|
|
59
10
|
.modal-header {
|
|
60
11
|
display: flex;
|
|
@@ -68,6 +19,7 @@
|
|
|
68
19
|
margin: 0;
|
|
69
20
|
padding: 0;
|
|
70
21
|
flex: 1;
|
|
22
|
+
color: inherit;
|
|
71
23
|
}
|
|
72
24
|
|
|
73
25
|
/* Estilos del botón de cerrar del modal*/
|
|
@@ -77,31 +29,36 @@
|
|
|
77
29
|
margin-left: auto;
|
|
78
30
|
}
|
|
79
31
|
|
|
80
|
-
/*
|
|
81
|
-
|
|
82
|
-
|
|
32
|
+
/* Estilos del header del modal con branding */
|
|
33
|
+
.modal-header.branded {
|
|
34
|
+
background-color: var(--brand-modal-header-bg);
|
|
35
|
+
color: var(--brand-modal-header-text);
|
|
36
|
+
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
|
37
|
+
}
|
|
38
|
+
.modal-header.branded .btn-close {
|
|
39
|
+
filter: invert(1) grayscale(100%) brightness(200%); /* Hace el botón de cerrar visible en fondos oscuros */
|
|
40
|
+
}
|
|
41
|
+
|
|
83
42
|
|
|
84
|
-
/*
|
|
43
|
+
/* Tabla con el resultado del historial */
|
|
85
44
|
.thead-branded th {
|
|
86
|
-
background-color:
|
|
87
|
-
color:
|
|
45
|
+
background-color: #e9ecef; /* Un gris claro estándar de Bootstrap */
|
|
46
|
+
color: #212529; /* El color de texto oscuro por defecto */
|
|
88
47
|
font-size: 16px;
|
|
89
48
|
font-weight: bold;
|
|
90
49
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
#history-content .table td:nth-child(1) { width: 5%; }
|
|
94
|
-
#history-content .table td:nth-child(2) { width: 23%; }
|
|
95
|
-
|
|
96
|
-
#history-content .table td:nth-child(3) {
|
|
97
|
-
width: auto; /* Columna de la consulta - ocupa el resto */
|
|
50
|
+
.col-icon {
|
|
51
|
+
width: 1%;
|
|
98
52
|
}
|
|
99
53
|
|
|
100
|
-
/* ######################################################### */
|
|
101
54
|
/* Modal de feedback */
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
55
|
+
.rating-stars {
|
|
56
|
+
display: flex;
|
|
57
|
+
justify-content: center;
|
|
58
|
+
gap: 5px;
|
|
59
|
+
margin-bottom: 15px;
|
|
60
|
+
padding-top: 5px;
|
|
61
|
+
}
|
|
105
62
|
|
|
106
63
|
/* Estilos de las estrellas del modal de feedback */
|
|
107
64
|
.star {
|
|
@@ -112,16 +69,51 @@
|
|
|
112
69
|
margin: 0 2px;
|
|
113
70
|
}
|
|
114
71
|
|
|
115
|
-
|
|
72
|
+
.star::before {
|
|
73
|
+
content: '★';
|
|
74
|
+
}
|
|
75
|
+
|
|
116
76
|
.star:hover,
|
|
117
77
|
.star.active,
|
|
118
78
|
.star.hover-active {
|
|
119
|
-
color:
|
|
79
|
+
color: var(--brand-primary-color);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* model de help */
|
|
83
|
+
.modal-body .accordion-button:not(.collapsed) {
|
|
84
|
+
background-color: var(--brand-primary-color);
|
|
85
|
+
color: var(--brand-text-on-primary);
|
|
86
|
+
font-weight: 600;
|
|
87
|
+
box-shadow: none;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Estilo para el anillo de foco, aplicado ÚNICAMENTE cuando el botón está CERRADO y tiene foco. */
|
|
91
|
+
.modal-body .accordion-button.collapsed:focus {
|
|
92
|
+
background-color: #fff; /* Asegura fondo blanco al hacer foco en un item cerrado */
|
|
93
|
+
border-color: transparent; /* Evita bordes no deseados */
|
|
94
|
+
/* La única regla que debe estar aquí es la que dibuja el anillo de foco. */
|
|
95
|
+
box-shadow: 0 0 0 0.25rem rgba(var(--brand-primary-color-rgb), 0.25);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.icon-spaced {
|
|
99
|
+
margin-right: 10px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.text-muted{
|
|
103
|
+
font-size:16px;
|
|
104
|
+
text-align: justify;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.feedback-text{
|
|
108
|
+
font-size: 16px;
|
|
120
109
|
}
|
|
121
110
|
|
|
122
|
-
/* ######################################################### */
|
|
123
111
|
/* Modal de listado de archivos */
|
|
124
|
-
/*
|
|
112
|
+
/* Estilos del nombre del archivo del modal de archivos y ordenar icono */
|
|
113
|
+
.file-name-modal {
|
|
114
|
+
flex: 1;
|
|
115
|
+
margin-right: 10px;
|
|
116
|
+
}
|
|
125
117
|
|
|
126
118
|
/* Para el icono de eliminar del modal */
|
|
127
119
|
.remove-file-btn i {
|
|
@@ -135,13 +127,7 @@
|
|
|
135
127
|
align-items: center;
|
|
136
128
|
}
|
|
137
129
|
|
|
138
|
-
/* Estilos del nombre del archivo del modal de archivos y ordenar icono */
|
|
139
|
-
.file-name-modal {
|
|
140
|
-
flex: 1;
|
|
141
|
-
margin-right: 10px;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
130
|
/* Estilos del botón de eliminar del modal de archivos y ordenar icono */
|
|
145
131
|
.remove-file-btn {
|
|
146
132
|
flex-shrink: 0;
|
|
147
|
-
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* Estos estilos son para las paginas publicas: home, signup, olvide la clave, etc */
|
|
2
|
+
|
|
3
|
+
/* --- Encabezado (top) de company --- */
|
|
4
|
+
.custom-company-header {
|
|
5
|
+
height: 78px;
|
|
6
|
+
margin-bottom: 20px;
|
|
7
|
+
padding: 0 1.5rem; /* Padding interno para que el texto no toque los bordes */
|
|
8
|
+
border-radius: 0.375rem; /* Bordes redondeados para que coincida con los formularios */
|
|
9
|
+
|
|
10
|
+
/* Los estilos de color y sombra se mantienen */
|
|
11
|
+
background-color: var(--brand-header-bg);
|
|
12
|
+
color: var(--brand-header-text);
|
|
13
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); /* Sombra ligeramente más suave */
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Estilo específico para el nombre de la marca en el encabezado (Letra más grande) */
|
|
17
|
+
.custom-company-header .brand-name {
|
|
18
|
+
font-size: 1.8rem; /* Tamaño de fuente aumentado */
|
|
19
|
+
font-weight: 600;
|
|
20
|
+
color: inherit;
|
|
21
|
+
text-decoration: none;
|
|
22
|
+
transition: opacity 0.2s ease-in-out;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Efecto hover para el enlace del nombre de la marca */
|
|
26
|
+
.custom-company-header .brand-name:hover {
|
|
27
|
+
opacity: 0.85;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Estilo para el texto "Powered by" --- */
|
|
31
|
+
.custom-company-header .powered-by {
|
|
32
|
+
font-size: 0.9rem;
|
|
33
|
+
font-weight: 400;
|
|
34
|
+
opacity: 0.75; /* Menos prominente que el nombre de la marca */
|
|
35
|
+
color: inherit;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* --- Estilo para el enlace de IAToolkit --- */
|
|
39
|
+
.custom-company-header .iatoolkit-link {
|
|
40
|
+
color: inherit; /* Hereda el color del texto padre */
|
|
41
|
+
text-decoration: none; /* ¡Elimina el subrayado! */
|
|
42
|
+
font-weight: 600; /* Un poco más de peso para diferenciarlo */
|
|
43
|
+
transition: opacity 0.2s ease-in-out;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.custom-company-header .form-container {
|
|
47
|
+
display: flex;
|
|
48
|
+
flex-direction: column;
|
|
49
|
+
gap: 1rem;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* titulo en home */
|
|
53
|
+
.home-title {
|
|
54
|
+
font-size: 3.2rem;
|
|
55
|
+
font-weight: 800;
|
|
56
|
+
line-height: 1.2;
|
|
57
|
+
color: var(--brand-primary-color);
|
|
58
|
+
}
|
|
59
|
+
.list-example {
|
|
60
|
+
display: block; /* Coloca el ejemplo en su propia línea */
|
|
61
|
+
font-size: 0.9rem; /* Lo hace ligeramente más pequeño */
|
|
62
|
+
color: #6c757d; /* Color gris (muted) para texto secundario */
|
|
63
|
+
font-style: italic; /* Cursiva para diferenciarlo */
|
|
64
|
+
padding-left: 1.75rem; /* Lo indenta para alinearlo con el texto del tema */
|
|
65
|
+
margin-top: 0.25rem; /* Pequeño espacio superior */
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.text-brand-primary {
|
|
69
|
+
font-weight: 800;
|
|
70
|
+
color: var(--brand-primary-color);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* contenedor de formularios: login, signup, forgot password, etc. */
|
|
74
|
+
.branded-form-container {
|
|
75
|
+
background-color: #ffffff;
|
|
76
|
+
border: 1px solid #dee2e6;
|
|
77
|
+
border-top: 4px solid #adb5bd;
|
|
78
|
+
border-radius: 0.375rem;
|
|
79
|
+
padding: 2rem;
|
|
80
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.08);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.branded-form-label {
|
|
84
|
+
font-size: 0.85rem;
|
|
85
|
+
font-weight: 600;
|
|
86
|
+
color: #495057; /* Un gris oscuro profesional */
|
|
87
|
+
text-transform: uppercase;
|
|
88
|
+
letter-spacing: 0.05em; /* Un poco de espacio extra entre letras */
|
|
89
|
+
margin-bottom: 0.3rem;
|
|
90
|
+
display: block;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Efecto de foco brandeado para todos los form-control */
|
|
94
|
+
.form-control:focus {
|
|
95
|
+
border-color: var(--brand-primary-color);
|
|
96
|
+
box-shadow: 0 0 0 0.25rem rgba(var(--brand-primary-color-rgb), 0.25); /* Usa la variable RGB para el shadow */
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.branded-form-title {
|
|
100
|
+
color: var(--brand-primary-color);
|
|
101
|
+
font-size: 1.75rem; /* Un tamaño más prominente */
|
|
102
|
+
font-weight: 700; /* Equivalente a fw-bold de Bootstrap */
|
|
103
|
+
text-align: center;
|
|
104
|
+
margin-bottom: 1.5rem; /* Espacio consistente debajo del título */
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/* static/styles/landing_page.css */
|
|
2
|
+
|
|
3
|
+
/* --- Variables y Estilos Globales --- */
|
|
4
|
+
:root {
|
|
5
|
+
--website-primary-color: #4A55A2;
|
|
6
|
+
--website-primary-color-dark: #3A448A;
|
|
7
|
+
--website-gradient-start: #4A55A2;
|
|
8
|
+
--website-gradient-end: #7895CB;
|
|
9
|
+
--website-dark-text: #212529;
|
|
10
|
+
--website-light-bg: #f8f9fa;
|
|
11
|
+
--website-muted-text: #6c757d;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
body {
|
|
15
|
+
background-color: #fff;
|
|
16
|
+
color: var(--website-dark-text);
|
|
17
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* --- Encabezado Propio (sin usar .navbar) --- */
|
|
21
|
+
.website-header {
|
|
22
|
+
margin-top: 1rem;
|
|
23
|
+
padding: 1rem 1.5rem; /* Padding vertical y horizontal */
|
|
24
|
+
border-radius: 0.5rem;
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
|
|
28
|
+
/* Estilos de color (se mantienen) */
|
|
29
|
+
background-color: var(--website-primary-color);
|
|
30
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.website-brand {
|
|
34
|
+
font-weight: 700;
|
|
35
|
+
font-size: 1.75rem;
|
|
36
|
+
color: #ffffff;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* --- Sección Principal (Hero) --- */
|
|
40
|
+
.hero-section {
|
|
41
|
+
padding: 2rem 0 1rem; /* Ajustado: 5rem arriba, 0 a los lados, 2.5rem abajo */
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.hero-title {
|
|
45
|
+
font-size: 3rem;
|
|
46
|
+
font-weight: 800;
|
|
47
|
+
line-height: 1.2;
|
|
48
|
+
margin-bottom: 1.5rem;
|
|
49
|
+
}
|
|
50
|
+
.gradient-text {
|
|
51
|
+
background: linear-gradient(90deg, var(--website-gradient-start), var(--website-gradient-end));
|
|
52
|
+
-webkit-background-clip: text;
|
|
53
|
+
-webkit-text-fill-color: transparent;
|
|
54
|
+
background-clip: text;
|
|
55
|
+
text-fill-color: transparent;
|
|
56
|
+
}
|
|
57
|
+
.hero-bullets {
|
|
58
|
+
list-style: none;
|
|
59
|
+
padding-left: 0;
|
|
60
|
+
font-size: 1.1rem;
|
|
61
|
+
}
|
|
62
|
+
.hero-bullets li {
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
gap: 0.75rem;
|
|
66
|
+
margin-bottom: 1rem;
|
|
67
|
+
color: var(--website-muted-text);
|
|
68
|
+
}
|
|
69
|
+
.hero-bullets .bi {
|
|
70
|
+
color: var(--website-primary-color);
|
|
71
|
+
font-size: 1.5rem;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* --- Botón de Llamada a la Acción (CTA) --- */
|
|
75
|
+
.hero-section .btn-primary {
|
|
76
|
+
background-color: var(--website-primary-color);
|
|
77
|
+
border-color: var(--website-primary-color);
|
|
78
|
+
transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out;
|
|
79
|
+
}
|
|
80
|
+
.hero-section .btn-primary:hover {
|
|
81
|
+
background-color: var(--website-primary-color-dark);
|
|
82
|
+
border-color: var(--website-primary-color-dark);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.bg-light h3 {
|
|
86
|
+
color: var(--website-primary-color);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.features-section {
|
|
90
|
+
padding: 5rem 0;
|
|
91
|
+
background-color: var(--website-light-bg);
|
|
92
|
+
}
|
|
93
|
+
.feature-item {
|
|
94
|
+
background-color: #fff;
|
|
95
|
+
padding: 2rem;
|
|
96
|
+
border-radius: 0.75rem;
|
|
97
|
+
border: 1px solid #e9ecef;
|
|
98
|
+
height: 100%;
|
|
99
|
+
transition: all 0.3s ease;
|
|
100
|
+
}
|
|
101
|
+
.feature-item:hover {
|
|
102
|
+
transform: translateY(-5px);
|
|
103
|
+
box-shadow: 0 8px 25px rgba(0,0,0,0.08);
|
|
104
|
+
}
|
|
105
|
+
.feature-icon {
|
|
106
|
+
font-size: 2.5rem;
|
|
107
|
+
margin-bottom: 1rem;
|
|
108
|
+
color: var(--website-primary-color);
|
|
109
|
+
}
|
|
110
|
+
.feature-item h3 {
|
|
111
|
+
font-weight: 600;
|
|
112
|
+
margin-bottom: 0.5rem;
|
|
113
|
+
}
|
|
114
|
+
.feature-item p {
|
|
115
|
+
color: var(--website-muted-text);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Estilo especial para la caja de Open Source */
|
|
119
|
+
.opensource-box {
|
|
120
|
+
background: var(--website-dark-text);
|
|
121
|
+
color: #fff;
|
|
122
|
+
padding: 2rem;
|
|
123
|
+
border-radius: 0.75rem;
|
|
124
|
+
height: 100%;
|
|
125
|
+
display: flex;
|
|
126
|
+
flex-direction: column;
|
|
127
|
+
justify-content: space-between;
|
|
128
|
+
border: 1px solid transparent;
|
|
129
|
+
transition: all 0.3s ease;
|
|
130
|
+
}
|
|
131
|
+
.opensource-box:hover {
|
|
132
|
+
transform: translateY(-5px);
|
|
133
|
+
box-shadow: 0 8px 25px rgba(0,0,0,0.15);
|
|
134
|
+
}
|
|
135
|
+
.opensource-icon .bi-github {
|
|
136
|
+
font-size: 2.5rem;
|
|
137
|
+
margin-bottom: 1rem;
|
|
138
|
+
}
|
|
139
|
+
.opensource-box h3 {
|
|
140
|
+
font-weight: 600;
|
|
141
|
+
}
|
|
142
|
+
.opensource-box p {
|
|
143
|
+
color: #ced4da;
|
|
144
|
+
margin-bottom: 1.5rem;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* --- Sección del Autor --- */
|
|
148
|
+
.author-section {
|
|
149
|
+
background-color: #fff;
|
|
150
|
+
}
|
|
151
|
+
.author-card {
|
|
152
|
+
background-color: var(--website-light-bg);
|
|
153
|
+
border-radius: 0.75rem;
|
|
154
|
+
border: 1px solid #e9ecef;
|
|
155
|
+
}
|
|
156
|
+
.author-card h5 {
|
|
157
|
+
color: var(--website-primary-color);
|
|
158
|
+
font-weight: 600;
|
|
159
|
+
}
|
|
160
|
+
.author-bio {
|
|
161
|
+
color: var(--website-muted-text);
|
|
162
|
+
line-height: 1.6;
|
|
163
|
+
}
|
|
164
|
+
.author-linkedin {
|
|
165
|
+
text-decoration: none;
|
|
166
|
+
color: #0077b5;
|
|
167
|
+
font-weight: 500;
|
|
168
|
+
transition: opacity 0.2s;
|
|
169
|
+
}
|
|
170
|
+
.author-linkedin:hover {
|
|
171
|
+
opacity: 0.8;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* --- Footer --- */
|
|
175
|
+
.landing-footer {
|
|
176
|
+
background-color: var(--website-light-bg);
|
|
177
|
+
color: var(--website-muted-text);
|
|
178
|
+
padding: 2rem 0;
|
|
179
|
+
text-align: center;
|
|
180
|
+
margin-top: 4rem;
|
|
181
|
+
border-top: 1px solid #e9ecef;
|
|
182
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/* static/css/onboarding.css */
|
|
2
|
+
|
|
3
|
+
/* Fuente base para ambos contextos */
|
|
4
|
+
.ob-root {
|
|
5
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/* Tarjeta */
|
|
9
|
+
.ob-card {
|
|
10
|
+
background-color: #fff;
|
|
11
|
+
border-radius: 12px;
|
|
12
|
+
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
|
|
13
|
+
padding: 30px;
|
|
14
|
+
width: 90%;
|
|
15
|
+
max-width: 450px;
|
|
16
|
+
text-align: center;
|
|
17
|
+
transition: opacity 0.3s ease-in-out;
|
|
18
|
+
margin: 0 auto;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* Contenido de tarjeta */
|
|
22
|
+
.ob-icon {
|
|
23
|
+
font-size: 40px;
|
|
24
|
+
color: var(--brand-primary-color, #FF5100);
|
|
25
|
+
margin-bottom: 15px;
|
|
26
|
+
}
|
|
27
|
+
.ob-title {
|
|
28
|
+
font-size: 1.25rem;
|
|
29
|
+
color: #333;
|
|
30
|
+
margin-bottom: 10px;
|
|
31
|
+
}
|
|
32
|
+
.ob-text {
|
|
33
|
+
font-size: 0.95rem;
|
|
34
|
+
color: #666;
|
|
35
|
+
line-height: 1.5;
|
|
36
|
+
min-height: 60px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.ob-example {
|
|
40
|
+
font-size: 0.95rem;
|
|
41
|
+
color: #444;
|
|
42
|
+
line-height: 1.5;
|
|
43
|
+
min-height: 60px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* Navegación */
|
|
47
|
+
.ob-nav {
|
|
48
|
+
display: flex;
|
|
49
|
+
justify-content: space-between;
|
|
50
|
+
align-items: center;
|
|
51
|
+
margin-top: 20px;
|
|
52
|
+
}
|
|
53
|
+
.ob-btn {
|
|
54
|
+
background-color: var(--brand-secondary-color, #06326B);
|
|
55
|
+
border: none;
|
|
56
|
+
color: var(--brand-text-on-secondary, #FFFFFF);
|
|
57
|
+
border-radius: 50%;
|
|
58
|
+
width: 40px;
|
|
59
|
+
height: 40px;
|
|
60
|
+
cursor: pointer;
|
|
61
|
+
transition: opacity 0.2s;
|
|
62
|
+
display: inline-flex;
|
|
63
|
+
align-items: center;
|
|
64
|
+
justify-content: center;
|
|
65
|
+
}
|
|
66
|
+
.ob-btn:hover { opacity: 0.85; }
|
|
67
|
+
|
|
68
|
+
/* Dots */
|
|
69
|
+
.ob-dots {
|
|
70
|
+
display: flex;
|
|
71
|
+
gap: 8px;
|
|
72
|
+
}
|
|
73
|
+
.ob-dots > div {
|
|
74
|
+
width: 10px;
|
|
75
|
+
height: 10px;
|
|
76
|
+
border-radius: 50%;
|
|
77
|
+
background-color: #ddd;
|
|
78
|
+
transition: background-color 0.3s;
|
|
79
|
+
}
|
|
80
|
+
.ob-dots > div.active {
|
|
81
|
+
background-color: var(--brand-primary-color, #FF5100);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Encabezado reutilizable (si se usa) */
|
|
85
|
+
.ob-brand-header {
|
|
86
|
+
font-size: 2rem;
|
|
87
|
+
font-weight: 700;
|
|
88
|
+
margin-bottom: 24px;
|
|
89
|
+
color: var(--brand-secondary-color, #06326B);
|
|
90
|
+
text-align: center;
|
|
91
|
+
}
|
|
92
|
+
.ob-brand-header .brand-name {
|
|
93
|
+
color: var(--brand-primary-color, #FF5100);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Utilidades */
|
|
97
|
+
.ob-fade {
|
|
98
|
+
transition: opacity 0.5s ease-in-out;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Responsivo */
|
|
102
|
+
@media (max-width: 420px) {
|
|
103
|
+
.ob-card { padding: 24px; }
|
|
104
|
+
.ob-icon { font-size: 34px; }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Overlay a pantalla completa */
|
|
108
|
+
.onboarding-shell-root {
|
|
109
|
+
position: relative;
|
|
110
|
+
height: calc(100vh - 0px);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* Centrado vertical y horizontal del contenido del loader */
|
|
114
|
+
#loader-wrapper {
|
|
115
|
+
position: absolute; inset: 0;
|
|
116
|
+
background-color: #f4f7f6;
|
|
117
|
+
z-index: 1000;
|
|
118
|
+
display: flex; align-items: center; justify-content: center;
|
|
119
|
+
padding: 20px; box-sizing: border-box;
|
|
120
|
+
transition: opacity 0.5s ease-in-out;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Pila vertical: header + tarjeta + banda de carga */
|
|
124
|
+
.ob-stack {
|
|
125
|
+
width: 100%;
|
|
126
|
+
max-width: 520px; /* ligeramente más que la tarjeta para respiración */
|
|
127
|
+
display: flex;
|
|
128
|
+
flex-direction: column;
|
|
129
|
+
align-items: stretch; /* la tarjeta ocupa el ancho */
|
|
130
|
+
gap: 16px;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* Header de marca consistente */
|
|
134
|
+
.ob-brand-header {
|
|
135
|
+
font-size: 2rem;
|
|
136
|
+
font-weight: 700;
|
|
137
|
+
margin: 0;
|
|
138
|
+
color: var(--brand-secondary-color, #06326B);
|
|
139
|
+
text-align: center;
|
|
140
|
+
}
|
|
141
|
+
.ob-brand-header .brand-name {
|
|
142
|
+
color: var(--brand-primary-color, #FF5100);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* Banda de estado integrada visualmente con la tarjeta */
|
|
146
|
+
.ob-loading-band {
|
|
147
|
+
display: flex;
|
|
148
|
+
align-items: center;
|
|
149
|
+
justify-content: center;
|
|
150
|
+
gap: 12px;
|
|
151
|
+
padding: 12px 14px;
|
|
152
|
+
background: #ffffff;
|
|
153
|
+
border-radius: 12px;
|
|
154
|
+
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* Spinner */
|
|
158
|
+
.spinner {
|
|
159
|
+
width: 28px; height: 28px;
|
|
160
|
+
border: 4px solid rgba(0,0,0,0.1);
|
|
161
|
+
border-top-color: var(--brand-primary-color, #FF5100);
|
|
162
|
+
border-radius: 50%;
|
|
163
|
+
animation: spin 1s linear infinite;
|
|
164
|
+
}
|
|
165
|
+
@keyframes spin { to { transform: rotate(360deg); } }
|
|
166
|
+
|
|
167
|
+
#loading-status p {
|
|
168
|
+
font-size: 0.95rem;
|
|
169
|
+
font-weight: 500;
|
|
170
|
+
color: #555;
|
|
171
|
+
margin: 0;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* Iframe contenedor */
|
|
175
|
+
#content-container { width: 100%; height: 100%; }
|
|
176
|
+
#content-container iframe { width: 100%; height: 100%; border: none; }
|
|
@@ -1,24 +1,15 @@
|
|
|
1
1
|
Eres un asistente que responde preguntas o ejecuta tareas según el contexto de la empresa.
|
|
2
2
|
|
|
3
3
|
### **Nombre de la empresa**
|
|
4
|
-
## Nombre: {{company
|
|
4
|
+
## Nombre: {{company}}, tambien se conoce como {{ company_short_name }}
|
|
5
5
|
|
|
6
6
|
### ** Información del usuario que esta consultando este chat**
|
|
7
|
-
|
|
7
|
+
- Identificador unico de usuario: {{ user_identifier }}
|
|
8
8
|
- Nombre: {{ user_fullname }}
|
|
9
9
|
- Email: {{ user_email }}
|
|
10
10
|
- Tipo de usuario: {% if user_is_local %}Interno{% else %}Externo{% endif %}
|
|
11
|
-
-
|
|
11
|
+
- Rol de usuario: {{ user_rol }}
|
|
12
12
|
|
|
13
|
-
{% if user_name %}
|
|
14
|
-
El usuario que consulta se identifica con la variable `user_name` y tiene el
|
|
15
|
-
siguiente valor: {{ user_name }}.
|
|
16
|
-
|
|
17
|
-
Este usuario tiene el rol: {{ user_rol }} en el producto {{ user_product }}.
|
|
18
|
-
|
|
19
|
-
{% else %}
|
|
20
|
-
El usuario que consulta se identifica como: {{ user_id }}
|
|
21
|
-
{% endif %}
|
|
22
13
|
|
|
23
14
|
## Servicios de datos (function calls) disponibles en {{company.name}}:
|
|
24
15
|
{% for service in service_list %}
|
|
@@ -28,19 +19,11 @@ El usuario que consulta se identifica como: {{ user_id }}
|
|
|
28
19
|
Eres un asistente que responde preguntas sobre empresas y sus clientes.
|
|
29
20
|
|
|
30
21
|
**Reglas obligatorias de contexto:**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
2. Si el usuario hace una pregunta **sin especificar un cliente**,
|
|
34
|
-
siempre debes asumir que la pregunta se refiere al **último cliente identificado** en la conversación.
|
|
35
|
-
3. Nunca cambies de cliente de contexto a menos que el usuario especifique uno nuevo.
|
|
36
|
-
4. Si el usuario pregunta por un cliente que no está en tus registros, responde indicando que no tienes información, pero **no borres el contexto anterior**.
|
|
37
|
-
5. No respondas con “no se encontró información del cliente” salvo que nunca se haya identificado ningún cliente antes en la conversación.
|
|
38
|
-
6. No debes incluir explicaciones, comentarios o texto adicional.
|
|
22
|
+
En caso que te hagan preguntas especificas sobre un cliente, debes asumir que la pregunta se
|
|
23
|
+
refiere al **último cliente identificado** en la conversación.
|
|
39
24
|
|
|
40
25
|
**IMPORTANTE:**
|
|
41
26
|
|
|
42
|
-
No respondas nunca sobre un cliente anterior si ya se identificó uno nuevo, y nunca pierdas el contexto salvo que el usuario lo cambie explícitamente.
|
|
43
|
-
|
|
44
27
|
### **Instrucciones**
|
|
45
28
|
1. Devuelve siempre la respuesta en formato JSON.
|
|
46
29
|
2. Usa la información de contexto para responder la consulta del usuario de forma clara y concisa.
|