iatoolkit 0.8.1__py3-none-any.whl → 0.63.4__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.

Potentially problematic release.


This version of iatoolkit might be problematic. Click here for more details.

Files changed (159) hide show
  1. iatoolkit/__init__.py +8 -34
  2. iatoolkit/base_company.py +14 -3
  3. iatoolkit/common/routes.py +83 -52
  4. iatoolkit/common/session_manager.py +0 -1
  5. iatoolkit/common/util.py +0 -27
  6. iatoolkit/iatoolkit.py +61 -46
  7. iatoolkit/infra/llm_client.py +7 -8
  8. iatoolkit/infra/openai_adapter.py +1 -1
  9. iatoolkit/infra/redis_session_manager.py +48 -2
  10. iatoolkit/repositories/database_manager.py +17 -2
  11. iatoolkit/repositories/models.py +31 -6
  12. iatoolkit/repositories/profile_repo.py +7 -2
  13. iatoolkit/services/auth_service.py +188 -0
  14. iatoolkit/services/branding_service.py +147 -0
  15. iatoolkit/services/dispatcher_service.py +10 -40
  16. iatoolkit/services/excel_service.py +15 -15
  17. iatoolkit/services/history_service.py +3 -12
  18. iatoolkit/services/jwt_service.py +15 -24
  19. iatoolkit/services/onboarding_service.py +43 -0
  20. iatoolkit/services/profile_service.py +97 -44
  21. iatoolkit/services/query_service.py +124 -81
  22. iatoolkit/services/tasks_service.py +1 -1
  23. iatoolkit/services/user_feedback_service.py +67 -31
  24. iatoolkit/services/user_session_context_service.py +112 -54
  25. iatoolkit/static/images/fernando.jpeg +0 -0
  26. iatoolkit/static/js/{chat_feedback.js → chat_feedback_button.js} +6 -11
  27. iatoolkit/static/js/chat_history_button.js +126 -0
  28. iatoolkit/static/js/chat_logout_button.js +36 -0
  29. iatoolkit/static/js/chat_main.js +130 -220
  30. iatoolkit/static/js/chat_onboarding_button.js +97 -0
  31. iatoolkit/static/js/chat_prompt_manager.js +94 -0
  32. iatoolkit/static/js/chat_reload_button.js +52 -0
  33. iatoolkit/static/styles/chat_iatoolkit.css +329 -507
  34. iatoolkit/static/styles/chat_modal.css +95 -56
  35. iatoolkit/static/styles/landing_page.css +182 -0
  36. iatoolkit/static/styles/onboarding.css +169 -0
  37. iatoolkit/system_prompts/query_main.prompt +3 -12
  38. iatoolkit/templates/_company_header.html +20 -0
  39. iatoolkit/templates/_login_widget.html +40 -0
  40. iatoolkit/templates/base.html +8 -3
  41. iatoolkit/templates/change_password.html +54 -37
  42. iatoolkit/templates/chat.html +149 -66
  43. iatoolkit/templates/chat_modals.html +47 -18
  44. iatoolkit/templates/error.html +41 -8
  45. iatoolkit/templates/forgot_password.html +37 -24
  46. iatoolkit/templates/index.html +140 -0
  47. iatoolkit/templates/login_simulation.html +34 -0
  48. iatoolkit/templates/onboarding_shell.html +105 -0
  49. iatoolkit/templates/signup.html +64 -66
  50. iatoolkit/views/base_login_view.py +81 -0
  51. iatoolkit/views/change_password_view.py +23 -12
  52. iatoolkit/views/external_login_view.py +61 -28
  53. iatoolkit/views/{file_store_view.py → file_store_api_view.py} +9 -2
  54. iatoolkit/views/forgot_password_view.py +23 -13
  55. iatoolkit/views/history_api_view.py +52 -0
  56. iatoolkit/views/home_view.py +58 -25
  57. iatoolkit/views/index_view.py +14 -0
  58. iatoolkit/views/init_context_api_view.py +68 -0
  59. iatoolkit/views/llmquery_api_view.py +45 -0
  60. iatoolkit/views/login_simulation_view.py +81 -0
  61. iatoolkit/views/login_view.py +118 -34
  62. iatoolkit/views/logout_api_view.py +45 -0
  63. iatoolkit/views/{prompt_view.py → prompt_api_view.py} +7 -7
  64. iatoolkit/views/signup_view.py +38 -29
  65. iatoolkit/views/{tasks_view.py → tasks_api_view.py} +10 -36
  66. iatoolkit/views/tasks_review_api_view.py +55 -0
  67. iatoolkit/views/{user_feedback_view.py → user_feedback_api_view.py} +16 -31
  68. iatoolkit/views/verify_user_view.py +13 -8
  69. {iatoolkit-0.8.1.dist-info → iatoolkit-0.63.4.dist-info}/METADATA +2 -2
  70. iatoolkit-0.63.4.dist-info/RECORD +113 -0
  71. {iatoolkit-0.8.1.dist-info → iatoolkit-0.63.4.dist-info}/top_level.txt +0 -1
  72. iatoolkit/common/auth.py +0 -200
  73. iatoolkit/static/images/arrow_up.png +0 -0
  74. iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
  75. iatoolkit/static/images/logo_clinica.png +0 -0
  76. iatoolkit/static/images/logo_iatoolkit.png +0 -0
  77. iatoolkit/static/images/logo_maxxa.png +0 -0
  78. iatoolkit/static/images/logo_notaria.png +0 -0
  79. iatoolkit/static/images/logo_tarjeta.png +0 -0
  80. iatoolkit/static/images/logo_umayor.png +0 -0
  81. iatoolkit/static/images/upload.png +0 -0
  82. iatoolkit/static/js/chat_history.js +0 -117
  83. iatoolkit/templates/home.html +0 -201
  84. iatoolkit/templates/login.html +0 -43
  85. iatoolkit/views/chat_token_request_view.py +0 -98
  86. iatoolkit/views/chat_view.py +0 -51
  87. iatoolkit/views/download_file_view.py +0 -58
  88. iatoolkit/views/external_chat_login_view.py +0 -88
  89. iatoolkit/views/history_view.py +0 -57
  90. iatoolkit/views/llmquery_view.py +0 -65
  91. iatoolkit/views/tasks_review_view.py +0 -83
  92. iatoolkit-0.8.1.dist-info/RECORD +0 -175
  93. tests/__init__.py +0 -5
  94. tests/common/__init__.py +0 -0
  95. tests/common/test_auth.py +0 -279
  96. tests/common/test_routes.py +0 -42
  97. tests/common/test_session_manager.py +0 -59
  98. tests/common/test_util.py +0 -444
  99. tests/companies/__init__.py +0 -5
  100. tests/conftest.py +0 -36
  101. tests/infra/__init__.py +0 -5
  102. tests/infra/connectors/__init__.py +0 -5
  103. tests/infra/connectors/test_google_drive_connector.py +0 -107
  104. tests/infra/connectors/test_local_file_connector.py +0 -85
  105. tests/infra/connectors/test_s3_connector.py +0 -95
  106. tests/infra/test_call_service.py +0 -92
  107. tests/infra/test_database_manager.py +0 -59
  108. tests/infra/test_gemini_adapter.py +0 -137
  109. tests/infra/test_google_chat_app.py +0 -68
  110. tests/infra/test_llm_client.py +0 -165
  111. tests/infra/test_llm_proxy.py +0 -122
  112. tests/infra/test_mail_app.py +0 -94
  113. tests/infra/test_openai_adapter.py +0 -105
  114. tests/infra/test_redis_session_manager_service.py +0 -117
  115. tests/repositories/__init__.py +0 -5
  116. tests/repositories/test_database_manager.py +0 -87
  117. tests/repositories/test_document_repo.py +0 -76
  118. tests/repositories/test_llm_query_repo.py +0 -340
  119. tests/repositories/test_models.py +0 -38
  120. tests/repositories/test_profile_repo.py +0 -142
  121. tests/repositories/test_tasks_repo.py +0 -76
  122. tests/repositories/test_vs_repo.py +0 -107
  123. tests/services/__init__.py +0 -5
  124. tests/services/test_dispatcher_service.py +0 -274
  125. tests/services/test_document_service.py +0 -181
  126. tests/services/test_excel_service.py +0 -208
  127. tests/services/test_file_processor_service.py +0 -121
  128. tests/services/test_history_service.py +0 -164
  129. tests/services/test_jwt_service.py +0 -255
  130. tests/services/test_load_documents_service.py +0 -112
  131. tests/services/test_mail_service.py +0 -70
  132. tests/services/test_profile_service.py +0 -379
  133. tests/services/test_prompt_manager_service.py +0 -190
  134. tests/services/test_query_service.py +0 -243
  135. tests/services/test_search_service.py +0 -39
  136. tests/services/test_sql_service.py +0 -160
  137. tests/services/test_tasks_service.py +0 -252
  138. tests/services/test_user_feedback_service.py +0 -389
  139. tests/services/test_user_session_context_service.py +0 -132
  140. tests/views/__init__.py +0 -5
  141. tests/views/test_change_password_view.py +0 -191
  142. tests/views/test_chat_token_request_view.py +0 -188
  143. tests/views/test_chat_view.py +0 -98
  144. tests/views/test_download_file_view.py +0 -149
  145. tests/views/test_external_chat_login_view.py +0 -120
  146. tests/views/test_external_login_view.py +0 -102
  147. tests/views/test_file_store_view.py +0 -128
  148. tests/views/test_forgot_password_view.py +0 -142
  149. tests/views/test_history_view.py +0 -336
  150. tests/views/test_home_view.py +0 -61
  151. tests/views/test_llm_query_view.py +0 -154
  152. tests/views/test_login_view.py +0 -114
  153. tests/views/test_prompt_view.py +0 -111
  154. tests/views/test_signup_view.py +0 -140
  155. tests/views/test_tasks_review_view.py +0 -104
  156. tests/views/test_tasks_view.py +0 -130
  157. tests/views/test_user_feedback_view.py +0 -214
  158. tests/views/test_verify_user_view.py +0 -110
  159. {iatoolkit-0.8.1.dist-info → iatoolkit-0.63.4.dist-info}/WHEEL +0 -0
@@ -1,11 +1,5 @@
1
- /* ######################################################### */
2
1
  /* Estilos generales para modales */
3
- /* ######################################################### */
4
2
 
5
- /* Separación del icono y el título del modal */
6
- .icon-spaced {
7
- margin-right: 10px;
8
- }
9
3
 
10
4
  /* Título del modal */
11
5
  .modal-title{
@@ -13,12 +7,6 @@
13
7
  font-weight: bold;
14
8
  }
15
9
 
16
- /* Texto del modal */
17
- .text-muted{
18
- font-size:16px;
19
- text-align: justify;
20
- }
21
-
22
10
  /* Estilos del header del modal*/
23
11
  .modal-header {
24
12
  display: flex;
@@ -32,6 +20,7 @@
32
20
  margin: 0;
33
21
  padding: 0;
34
22
  flex: 1;
23
+ color: inherit;
35
24
  }
36
25
 
37
26
  /* Estilos del botón de cerrar del modal*/
@@ -41,55 +30,78 @@
41
30
  margin-left: auto;
42
31
  }
43
32
 
44
- /* ######################################################### */
45
- /* Modal de historial */
46
- /* ######################################################### */
33
+ /* Estilos del header del modal con branding */
34
+ .modal-header.branded {
35
+ background-color: var(--brand-modal-header-bg);
36
+ color: var(--brand-modal-header-text);
37
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
38
+ }
39
+ .modal-header.branded .btn-close {
40
+ filter: invert(1) grayscale(100%) brightness(200%); /* Hace el botón de cerrar visible en fondos oscuros */
41
+ }
42
+
43
+ /* Estilos para botones con branding */
44
+ .btn-branded-primary {
45
+ background-color: var(--brand-primary-color);
46
+ border-color: var(--brand-primary-color);
47
+ color: var(--brand-text-on-primary);
48
+ }
49
+ .btn-branded-primary:hover {
50
+ background-color: var(--brand-text-on-primary);
51
+ color: var(--brand-primary-color);
52
+ border-color: var(--brand-primary-color);
53
+ }
54
+
55
+ .btn-branded-secondary {
56
+ background-color: var(--brand-secondary-color);
57
+ border-color: var(--brand-secondary-color);
58
+ color: var(--brand-text-on-secondary);
59
+ }
60
+ .btn-branded-secondary:hover {
61
+ background-color: var(--brand-text-on-secondary);
62
+ color: var(--brand-secondary-color);
63
+ border-color: var(--brand-secondary-color);
64
+ }
47
65
 
48
- /* Estilos cabeceras de tablas */
49
- .thead-dark th{
66
+ /* Modal de historial */
67
+ .thead-branded th {
68
+ background-color: #e9ecef; /* Un gris claro estándar de Bootstrap */
69
+ color: #212529; /* El color de texto oscuro por defecto */
50
70
  font-size: 16px;
51
71
  font-weight: bold;
52
72
  }
53
73
 
54
- /* Control de ancho de columnas en la tabla del historial */
55
- #history-content .table td:nth-child(1) {
56
- width: 5%; /* Columna del número */
74
+ /* Evita el salto de línea en la celda de la fecha */
75
+ #historyModal .date-cell {
76
+ white-space: nowrap;
57
77
  }
58
78
 
59
- #history-content .table td:nth-child(2) {
60
- width: 23%; /* Columna de la fecha */
79
+ .col-min,
80
+ .col-icon {
81
+ width: 1%;
82
+ white-space: nowrap;
61
83
  }
62
84
 
63
- #history-content .table td:nth-child(3) {
64
- width: auto; /* Columna de la consulta - ocupa el resto */
85
+ /* Estilo para el icono de copiar/editar en cada fila */
86
+ #historyModal .copy-query-icon {
87
+ color: var(--brand-secondary-color, #6c757d); /* Usa el color secundario de la marca */
88
+ text-decoration: none;
89
+ opacity: 0.6;
90
+ transition: opacity 0.2s ease-in-out;
65
91
  }
66
92
 
67
- /* ######################################################### */
68
- /* Modal de feedback */
69
- /* ######################################################### */
70
-
71
- /* Contenedor de calificación del modal de feedback */
72
- .rating-container {
73
- text-align: center;
74
- margin: 10px 0 0 0;
75
- display: flex;
76
- flex-direction: column;
77
- justify-content: center;
78
- align-items: center;
79
- gap: 5px;
80
- width: 100%;
93
+ #historyModal .copy-query-icon:hover {
94
+ opacity: 1; /* El icono se vuelve completamente opaco al pasar el ratón */
95
+ cursor: pointer; /* Asegura que el cursor cambie a una mano */
81
96
  }
82
97
 
83
- /* Contenedor de estrellas del modal de feedback */
84
- .rating-stars-container{
85
- text-align: center;
86
- margin: 2px 0 0 0;
98
+ /* Modal de feedback */
99
+ .rating-stars {
87
100
  display: flex;
88
- flex-direction: row;
89
101
  justify-content: center;
90
- align-items: center;
91
- gap: 10px;
92
- width: 100%;
102
+ gap: 5px;
103
+ margin-bottom: 15px;
104
+ padding-top: 5px;
93
105
  }
94
106
 
95
107
  /* Estilos de las estrellas del modal de feedback */
@@ -101,16 +113,35 @@
101
113
  margin: 0 2px;
102
114
  }
103
115
 
104
- /* Estilos de las estrellas del modal de feedback al pasar el mouse */
116
+ .star::before {
117
+ content: '★';
118
+ }
119
+
105
120
  .star:hover,
106
121
  .star.active,
107
122
  .star.hover-active {
108
123
  color: #ffc107;
109
124
  }
110
125
 
111
- /* ######################################################### */
126
+ .icon-spaced {
127
+ margin-right: 10px;
128
+ }
129
+
130
+ .text-muted{
131
+ font-size:16px;
132
+ text-align: justify;
133
+ }
134
+
135
+ .feedback-text{
136
+ font-size: 16px;
137
+ }
138
+
112
139
  /* Modal de listado de archivos */
113
- /* ######################################################### */
140
+ /* Estilos del nombre del archivo del modal de archivos y ordenar icono */
141
+ .file-name-modal {
142
+ flex: 1;
143
+ margin-right: 10px;
144
+ }
114
145
 
115
146
  /* Para el icono de eliminar del modal */
116
147
  .remove-file-btn i {
@@ -124,13 +155,21 @@
124
155
  align-items: center;
125
156
  }
126
157
 
127
- /* Estilos del nombre del archivo del modal de archivos y ordenar icono */
128
- .file-name-modal {
129
- flex: 1;
130
- margin-right: 10px;
131
- }
132
-
133
158
  /* Estilos del botón de eliminar del modal de archivos y ordenar icono */
134
159
  .remove-file-btn {
135
160
  flex-shrink: 0;
136
- }
161
+ }
162
+
163
+ /* Estilos para alertas informativas personalizadas */
164
+ .alert-branded-info {
165
+ background-color: var(--brand-info-bg);
166
+ color: var(--brand-info-text);
167
+ border-color: var(--brand-info-border);
168
+ }
169
+ .alert-branded-info strong,
170
+ .alert-branded-info .alert-link {
171
+ color: inherit;
172
+ }
173
+ .alert-branded-info .bi { /* Asegura que los iconos también tomen el color */
174
+ color: inherit;
175
+ }
@@ -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,169 @@
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
+ /* Navegación */
40
+ .ob-nav {
41
+ display: flex;
42
+ justify-content: space-between;
43
+ align-items: center;
44
+ margin-top: 20px;
45
+ }
46
+ .ob-btn {
47
+ background-color: var(--brand-secondary-color, #06326B);
48
+ border: none;
49
+ color: var(--brand-text-on-secondary, #FFFFFF);
50
+ border-radius: 50%;
51
+ width: 40px;
52
+ height: 40px;
53
+ cursor: pointer;
54
+ transition: opacity 0.2s;
55
+ display: inline-flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ }
59
+ .ob-btn:hover { opacity: 0.85; }
60
+
61
+ /* Dots */
62
+ .ob-dots {
63
+ display: flex;
64
+ gap: 8px;
65
+ }
66
+ .ob-dots > div {
67
+ width: 10px;
68
+ height: 10px;
69
+ border-radius: 50%;
70
+ background-color: #ddd;
71
+ transition: background-color 0.3s;
72
+ }
73
+ .ob-dots > div.active {
74
+ background-color: var(--brand-primary-color, #FF5100);
75
+ }
76
+
77
+ /* Encabezado reutilizable (si se usa) */
78
+ .ob-brand-header {
79
+ font-size: 2rem;
80
+ font-weight: 700;
81
+ margin-bottom: 24px;
82
+ color: var(--brand-secondary-color, #06326B);
83
+ text-align: center;
84
+ }
85
+ .ob-brand-header .brand-name {
86
+ color: var(--brand-primary-color, #FF5100);
87
+ }
88
+
89
+ /* Utilidades */
90
+ .ob-fade {
91
+ transition: opacity 0.5s ease-in-out;
92
+ }
93
+
94
+ /* Responsivo */
95
+ @media (max-width: 420px) {
96
+ .ob-card { padding: 24px; }
97
+ .ob-icon { font-size: 34px; }
98
+ }
99
+
100
+ /* Overlay a pantalla completa */
101
+ .onboarding-shell-root {
102
+ position: relative;
103
+ height: calc(100vh - 0px);
104
+ }
105
+
106
+ /* Centrado vertical y horizontal del contenido del loader */
107
+ #loader-wrapper {
108
+ position: absolute; inset: 0;
109
+ background-color: #f4f7f6;
110
+ z-index: 1000;
111
+ display: flex; align-items: center; justify-content: center;
112
+ padding: 20px; box-sizing: border-box;
113
+ transition: opacity 0.5s ease-in-out;
114
+ }
115
+
116
+ /* Pila vertical: header + tarjeta + banda de carga */
117
+ .ob-stack {
118
+ width: 100%;
119
+ max-width: 520px; /* ligeramente más que la tarjeta para respiración */
120
+ display: flex;
121
+ flex-direction: column;
122
+ align-items: stretch; /* la tarjeta ocupa el ancho */
123
+ gap: 16px;
124
+ }
125
+
126
+ /* Header de marca consistente */
127
+ .ob-brand-header {
128
+ font-size: 2rem;
129
+ font-weight: 700;
130
+ margin: 0;
131
+ color: var(--brand-secondary-color, #06326B);
132
+ text-align: center;
133
+ }
134
+ .ob-brand-header .brand-name {
135
+ color: var(--brand-primary-color, #FF5100);
136
+ }
137
+
138
+ /* Banda de estado integrada visualmente con la tarjeta */
139
+ .ob-loading-band {
140
+ display: flex;
141
+ align-items: center;
142
+ justify-content: center;
143
+ gap: 12px;
144
+ padding: 12px 14px;
145
+ background: #ffffff;
146
+ border-radius: 12px;
147
+ box-shadow: 0 4px 20px rgba(0,0,0,0.08);
148
+ }
149
+
150
+ /* Spinner */
151
+ .spinner {
152
+ width: 28px; height: 28px;
153
+ border: 4px solid rgba(0,0,0,0.1);
154
+ border-top-color: var(--brand-primary-color, #FF5100);
155
+ border-radius: 50%;
156
+ animation: spin 1s linear infinite;
157
+ }
158
+ @keyframes spin { to { transform: rotate(360deg); } }
159
+
160
+ #loading-status p {
161
+ font-size: 0.95rem;
162
+ font-weight: 500;
163
+ color: #555;
164
+ margin: 0;
165
+ }
166
+
167
+ /* Iframe contenedor */
168
+ #content-container { width: 100%; height: 100%; }
169
+ #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.name}}
4
+ ## Nombre: {{company}}, tambien se conoce como {{ company_short_name }}
5
5
 
6
6
  ### ** Información del usuario que esta consultando este chat**
7
- Contexto del usuario:
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
- - Empresa: {{ company_name }}
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 %}
@@ -0,0 +1,20 @@
1
+ {# El div principal ahora es un contenedor y tiene los estilos y clases de alineación #}
2
+ <div class="custom-company-header container d-flex justify-content-between align-items-center">
3
+
4
+ {% if company_short_name and branding %}
5
+ <a href="{{ url_for('home', company_short_name=company_short_name) }}"
6
+ class="brand-name"
7
+ style="{{ branding.primary_text_style }}">
8
+ {{ branding.name }} IA
9
+ </a>
10
+ {% else %}
11
+ <span class="brand-name">
12
+ IAToolkit
13
+ </span>
14
+ {% endif %}
15
+
16
+ {# Texto "Powered by" con enlace a iatoolkit.com #}
17
+ <span class="powered-by">
18
+ Powered by <a href="{{ url_for('index') }}" rel="noopener noreferrer" class="iatoolkit-link">IAToolkit</a>
19
+ </span>
20
+ </div>
@@ -0,0 +1,40 @@
1
+ <div class="branded-form-container">
2
+ <!-- 1. Encabezado de Marketing -->
3
+ <div class="text-center mb-4">
4
+ <p class="text-muted widget-intro-text">
5
+ Ingresa tus credenciales o registrate para acceder a la plataforma de {{ branding.name }}.
6
+ </p>
7
+ </div>
8
+
9
+ <!-- 2. Formulario de Inicio de Sesión -->
10
+ <form id="login-form"
11
+ action="{{ url_for('login', company_short_name=company_short_name) }}"
12
+ method="post">
13
+ <div class="mb-3">
14
+ <label for="email" class="form-label d-block">Correo Electrónico</label>
15
+ <input type="email" id="email" name="email" class="form-control"
16
+ required value="{{ form_data.email if form_data is defined else '' }}">
17
+ </div>
18
+ <div class="mb-3">
19
+ <label for="password" class="form-label d-block">Contraseña</label>
20
+ <input type="password" id="password" name="password"
21
+ class="form-control" required>
22
+ </div>
23
+ <button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2">
24
+ Iniciar Sesión
25
+ </button>
26
+ </form>
27
+
28
+ <!-- 3. Nueva Sección de Registro más Atractiva -->
29
+ <div class="mt-4 pt-3 text-center" style="border-top: 1px solid #e0e0e0;">
30
+ <span class="text-muted small">¿Eres nuevo aquí?</span>
31
+ <a href="{{ url_for('signup', company_short_name=company_short_name) }}" id="signup-link" class="fw-bold ms-1 text-decoration-none" style="color: var(--brand-primary-color);">Crea una cuenta gratis</a>
32
+ </div>
33
+
34
+ <!-- 4. Enlace de Recuperación de Contraseña (más sutil) -->
35
+ <div class="text-center mt-2">
36
+ <a href="{{ url_for('forgot_password', company_short_name=company_short_name) }}" class="text-decoration-none text-muted" style="font-size: 0.8rem;">
37
+ ¿Olvidaste tu contraseña?
38
+ </a>
39
+ </div>
40
+ </div>
@@ -9,15 +9,20 @@
9
9
  <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css" rel="stylesheet">
10
10
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/filepond/dist/filepond.min.css">
11
11
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css">
12
- <link rel="stylesheet" href="{{ url_for('static', filename='styles/chat_iatoolkit.css') }}">
13
- <link rel="stylesheet" href="{{ url_for('static', filename='styles/chat_modal.css') }}">
14
- <link rel="stylesheet" href="{{ url_for('static', filename='styles/llm_output.css') }}">
12
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/chat_iatoolkit.css', _external=True) }}">
13
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/onboarding.css', _external=True) }}">
14
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/chat_modal.css', _external=True) }}">
15
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/llm_output.css', _external=True) }}">
16
+
17
+ {% block styles %}{% endblock %}
15
18
  </head>
16
19
  <body class="d-flex flex-column p-3" style="min-height: 100vh;">
20
+
17
21
  <main class="d-flex flex-column flex-grow-1">
18
22
  {% block content %}{% endblock %}
19
23
  </main>
20
24
 
25
+
21
26
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"></script>
22
27
  <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
23
28
  <script src="https://cdn.jsdelivr.net/npm/filepond/dist/filepond.min.js"></script>