iatoolkit 0.7.9__py3-none-any.whl → 0.7.11__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 (126) hide show
  1. iatoolkit/__init__.py +18 -14
  2. iatoolkit/base_company.py +5 -5
  3. iatoolkit/cli_commands.py +5 -3
  4. {common → iatoolkit/common}/auth.py +3 -3
  5. {common → iatoolkit/common}/routes.py +19 -19
  6. {common → iatoolkit/common}/util.py +2 -2
  7. iatoolkit/iatoolkit.py +37 -38
  8. {infra → iatoolkit/infra}/call_service.py +1 -1
  9. {infra → iatoolkit/infra}/connectors/file_connector_factory.py +5 -5
  10. {infra → iatoolkit/infra}/connectors/google_cloud_storage_connector.py +1 -1
  11. {infra → iatoolkit/infra}/connectors/google_drive_connector.py +1 -1
  12. {infra → iatoolkit/infra}/connectors/local_file_connector.py +2 -2
  13. {infra → iatoolkit/infra}/connectors/s3_connector.py +1 -1
  14. {infra → iatoolkit/infra}/gemini_adapter.py +2 -2
  15. {infra → iatoolkit/infra}/google_chat_app.py +1 -1
  16. {infra → iatoolkit/infra}/llm_client.py +7 -7
  17. {infra → iatoolkit/infra}/llm_proxy.py +6 -6
  18. {infra → iatoolkit/infra}/mail_app.py +1 -1
  19. {infra → iatoolkit/infra}/openai_adapter.py +2 -2
  20. {repositories → iatoolkit/repositories}/database_manager.py +1 -1
  21. {repositories → iatoolkit/repositories}/document_repo.py +3 -3
  22. {repositories → iatoolkit/repositories}/llm_query_repo.py +2 -2
  23. {repositories → iatoolkit/repositories}/profile_repo.py +2 -2
  24. {repositories → iatoolkit/repositories}/tasks_repo.py +2 -2
  25. {repositories → iatoolkit/repositories}/vs_repo.py +3 -3
  26. {services → iatoolkit/services}/benchmark_service.py +3 -3
  27. {services → iatoolkit/services}/dispatcher_service.py +9 -8
  28. {services → iatoolkit/services}/document_service.py +1 -1
  29. {services → iatoolkit/services}/excel_service.py +2 -2
  30. {services → iatoolkit/services}/file_processor_service.py +2 -2
  31. {services → iatoolkit/services}/history_service.py +4 -3
  32. {services → iatoolkit/services}/load_documents_service.py +11 -10
  33. {services → iatoolkit/services}/mail_service.py +2 -2
  34. {services → iatoolkit/services}/profile_service.py +6 -6
  35. {services → iatoolkit/services}/prompt_manager_service.py +5 -4
  36. {services → iatoolkit/services}/query_service.py +12 -11
  37. {services → iatoolkit/services}/search_service.py +2 -2
  38. {services → iatoolkit/services}/sql_service.py +4 -3
  39. {services → iatoolkit/services}/tasks_service.py +6 -6
  40. {services → iatoolkit/services}/user_feedback_service.py +3 -3
  41. {services → iatoolkit/services}/user_session_context_service.py +1 -1
  42. iatoolkit/static/images/arrow_up.png +0 -0
  43. iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
  44. iatoolkit/static/images/logo_clinica.png +0 -0
  45. iatoolkit/static/images/logo_iatoolkit.png +0 -0
  46. iatoolkit/static/images/logo_maxxa.png +0 -0
  47. iatoolkit/static/images/logo_notaria.png +0 -0
  48. iatoolkit/static/images/logo_tarjeta.png +0 -0
  49. iatoolkit/static/images/logo_umayor.png +0 -0
  50. iatoolkit/static/images/upload.png +0 -0
  51. iatoolkit/static/js/chat_feedback.js +115 -0
  52. iatoolkit/static/js/chat_filepond.js +85 -0
  53. iatoolkit/static/js/chat_history.js +117 -0
  54. iatoolkit/static/js/chat_main.js +436 -0
  55. iatoolkit/static/styles/chat_iatoolkit.css +701 -0
  56. iatoolkit/static/styles/chat_info.css +53 -0
  57. iatoolkit/static/styles/chat_modal.css +136 -0
  58. iatoolkit/static/styles/llm_output.css +115 -0
  59. iatoolkit/static/temp/024f44a9-cc7e-4bde-9a3c-11903a8f5d3d.xlsx +0 -0
  60. iatoolkit/static/temp/0b97768e-79e8-43ec-b17e-ba3137f94e93.xlsx +0 -0
  61. iatoolkit/static/temp/202883ee-763e-4b40-9bb6-bfacfc5e65fe.xlsx +0 -0
  62. iatoolkit/static/temp/28287491-08b7-4863-a2a3-49fcb64a0906.xlsx +0 -0
  63. iatoolkit/static/temp/36780cac-7a46-4db4-ac98-7338a51aaf52.xlsx +0 -0
  64. iatoolkit/static/temp/5c1b66f6-d58f-4684-8a7a-df3bb1a35eaa.xlsx +0 -0
  65. iatoolkit/static/temp/5d5a3500-ec57-4e07-a554-8799a906d1ab.xlsx +0 -0
  66. iatoolkit/static/temp/65887e40-cf64-49aa-8d1f-651cb0f8cdf0.xlsx +0 -0
  67. iatoolkit/static/temp/6fa64b13-e8e5-40ad-8257-00fd1682dad8.xlsx +0 -0
  68. iatoolkit/static/temp/7ab7071f-ad9b-49e6-8e63-f08410625ce7.xlsx +0 -0
  69. iatoolkit/static/temp/824346d9-d54d-40c6-b5c2-9e1d84d0ae90.xlsx +0 -0
  70. iatoolkit/static/temp/9ca80c3d-d196-4dfc-8179-582584fae04c.xlsx +0 -0
  71. iatoolkit/static/temp/a34cb8a6-85fb-4ea8-aabe-889967cd83b5.xlsx +0 -0
  72. iatoolkit/static/temp/a7fc9c13-c509-4499-b4be-23bfa57cac31.xlsx +0 -0
  73. iatoolkit/static/temp/b83084f5-fe54-4580-885e-412b4388cbda.xlsx +0 -0
  74. iatoolkit/static/temp/c17c6864-34e1-448f-b0e9-380354256ea9.xlsx +0 -0
  75. iatoolkit/static/temp/customer_clusters.parquet +0 -0
  76. iatoolkit/static/temp/customer_clusters.xlsx +0 -0
  77. iatoolkit/static/temp/d1af98b8-18a9-4b94-b9bc-607d19a87d0d.xlsx +0 -0
  78. iatoolkit/templates/about.html +13 -0
  79. iatoolkit/templates/base.html +45 -0
  80. iatoolkit/templates/change_password.html +45 -0
  81. iatoolkit/templates/chat.html +180 -0
  82. iatoolkit/templates/chat_modals.html +115 -0
  83. iatoolkit/templates/error.html +15 -0
  84. iatoolkit/templates/forgot_password.html +33 -0
  85. iatoolkit/templates/header.html +31 -0
  86. iatoolkit/templates/home.html +201 -0
  87. iatoolkit/templates/login.html +43 -0
  88. iatoolkit/templates/signup.html +78 -0
  89. iatoolkit/templates/test.html +9 -0
  90. {views → iatoolkit/views}/change_password_view.py +1 -1
  91. {views → iatoolkit/views}/chat_token_request_view.py +2 -2
  92. {views → iatoolkit/views}/chat_view.py +3 -3
  93. {views → iatoolkit/views}/download_file_view.py +3 -3
  94. {views → iatoolkit/views}/external_chat_login_view.py +5 -5
  95. {views → iatoolkit/views}/external_login_view.py +2 -2
  96. {views → iatoolkit/views}/file_store_view.py +2 -2
  97. {views → iatoolkit/views}/forgot_password_view.py +1 -1
  98. {views → iatoolkit/views}/history_view.py +2 -2
  99. {views → iatoolkit/views}/home_view.py +1 -1
  100. {views → iatoolkit/views}/llmquery_view.py +2 -2
  101. {views → iatoolkit/views}/login_view.py +1 -1
  102. {views → iatoolkit/views}/prompt_view.py +2 -2
  103. {views → iatoolkit/views}/signup_view.py +1 -1
  104. {views → iatoolkit/views}/tasks_review_view.py +2 -2
  105. {views → iatoolkit/views}/tasks_view.py +2 -2
  106. {views → iatoolkit/views}/user_feedback_view.py +2 -2
  107. {views → iatoolkit/views}/verify_user_view.py +1 -1
  108. {iatoolkit-0.7.9.dist-info → iatoolkit-0.7.11.dist-info}/METADATA +1 -1
  109. iatoolkit-0.7.11.dist-info/RECORD +128 -0
  110. iatoolkit-0.7.11.dist-info/top_level.txt +1 -0
  111. iatoolkit-0.7.9.dist-info/RECORD +0 -80
  112. iatoolkit-0.7.9.dist-info/top_level.txt +0 -6
  113. {common → iatoolkit/common}/__init__.py +0 -0
  114. {common → iatoolkit/common}/exceptions.py +0 -0
  115. {common → iatoolkit/common}/session_manager.py +0 -0
  116. {infra → iatoolkit/infra}/__init__.py +0 -0
  117. {infra → iatoolkit/infra}/connectors/__init__.py +0 -0
  118. {infra → iatoolkit/infra}/connectors/file_connector.py +0 -0
  119. {infra → iatoolkit/infra}/llm_response.py +0 -0
  120. {infra → iatoolkit/infra}/redis_session_manager.py +0 -0
  121. {repositories → iatoolkit/repositories}/__init__.py +0 -0
  122. {repositories → iatoolkit/repositories}/models.py +0 -0
  123. {services → iatoolkit/services}/__init__.py +0 -0
  124. {services → iatoolkit/services}/jwt_service.py +0 -0
  125. {views → iatoolkit/views}/__init__.py +0 -0
  126. {iatoolkit-0.7.9.dist-info → iatoolkit-0.7.11.dist-info}/WHEEL +0 -0
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Estilo para el encabezado de la tabla (thead).
3
+ * Se usa un fondo gris claro, texto en mayúsculas y
4
+ * un espaciado de letras para un look más profesional.
5
+ */
6
+
7
+ .table{
8
+ background-color: white;
9
+ }
10
+
11
+ .title-info-page{
12
+ color: #495057;
13
+ font-size: 24px;
14
+ font-weight: bold;
15
+ margin-bottom: 10px;
16
+ }
17
+
18
+ .table thead th {
19
+ background-color: #f8f9fa;
20
+ color: #495057;
21
+ text-transform: uppercase;
22
+ letter-spacing: 0.5px;
23
+ border-bottom-width: 2px;
24
+ }
25
+
26
+ /*
27
+ * Columna 1: Ancho mínimo, sin salto de línea y en negrita.
28
+ */
29
+ .table th:nth-child(1),
30
+ .table td:nth-child(1) {
31
+ width: 1%;
32
+ white-space: nowrap;
33
+ font-weight: bold;
34
+ }
35
+
36
+ /*
37
+ * Columna 2: Ancho mínimo y sin salto de línea.
38
+ */
39
+ .table th:nth-child(2),
40
+ .table td:nth-child(2) {
41
+ width: 1%;
42
+ white-space: nowrap;
43
+ }
44
+
45
+ /*
46
+ * Columna 3 (Descripción): Limita su ancho máximo
47
+ * y ajusta el texto largo para que no se desborde.
48
+ */
49
+ .table th:nth-child(3),
50
+ .table td:nth-child(3) {
51
+ max-width: 450px;
52
+ word-wrap: break-word;
53
+ }
@@ -0,0 +1,136 @@
1
+ /* ######################################################### */
2
+ /* Estilos generales para modales */
3
+ /* ######################################################### */
4
+
5
+ /* Separación del icono y el título del modal */
6
+ .icon-spaced {
7
+ margin-right: 10px;
8
+ }
9
+
10
+ /* Título del modal */
11
+ .modal-title{
12
+ font-size: 20px;
13
+ font-weight: bold;
14
+ }
15
+
16
+ /* Texto del modal */
17
+ .text-muted{
18
+ font-size:16px;
19
+ text-align: justify;
20
+ }
21
+
22
+ /* Estilos del header del modal*/
23
+ .modal-header {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: space-between;
27
+ width: 100%;
28
+ }
29
+
30
+ /* Estilos del título del modal*/
31
+ .modal-header .modal-title {
32
+ margin: 0;
33
+ padding: 0;
34
+ flex: 1;
35
+ }
36
+
37
+ /* Estilos del botón de cerrar del modal*/
38
+ .modal-header .close {
39
+ margin: 0;
40
+ padding: 0;
41
+ margin-left: auto;
42
+ }
43
+
44
+ /* ######################################################### */
45
+ /* Modal de historial */
46
+ /* ######################################################### */
47
+
48
+ /* Estilos cabeceras de tablas */
49
+ .thead-dark th{
50
+ font-size: 16px;
51
+ font-weight: bold;
52
+ }
53
+
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 */
57
+ }
58
+
59
+ #history-content .table td:nth-child(2) {
60
+ width: 23%; /* Columna de la fecha */
61
+ }
62
+
63
+ #history-content .table td:nth-child(3) {
64
+ width: auto; /* Columna de la consulta - ocupa el resto */
65
+ }
66
+
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%;
81
+ }
82
+
83
+ /* Contenedor de estrellas del modal de feedback */
84
+ .rating-stars-container{
85
+ text-align: center;
86
+ margin: 2px 0 0 0;
87
+ display: flex;
88
+ flex-direction: row;
89
+ justify-content: center;
90
+ align-items: center;
91
+ gap: 10px;
92
+ width: 100%;
93
+ }
94
+
95
+ /* Estilos de las estrellas del modal de feedback */
96
+ .star {
97
+ font-size: 3rem;
98
+ color: #ddd;
99
+ cursor: pointer;
100
+ transition: color 0.2s ease;
101
+ margin: 0 2px;
102
+ }
103
+
104
+ /* Estilos de las estrellas del modal de feedback al pasar el mouse */
105
+ .star:hover,
106
+ .star.active,
107
+ .star.hover-active {
108
+ color: #ffc107;
109
+ }
110
+
111
+ /* ######################################################### */
112
+ /* Modal de listado de archivos */
113
+ /* ######################################################### */
114
+
115
+ /* Para el icono de eliminar del modal */
116
+ .remove-file-btn i {
117
+ color: #c82333
118
+ }
119
+
120
+ /* Estilos para el modal de archivos y ordenar icono */
121
+ .list-group-item {
122
+ display: flex;
123
+ justify-content: space-between;
124
+ align-items: center;
125
+ }
126
+
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
+ /* Estilos del botón de eliminar del modal de archivos y ordenar icono */
134
+ .remove-file-btn {
135
+ flex-shrink: 0;
136
+ }
@@ -0,0 +1,115 @@
1
+ /* BLOQUE GENERAL */
2
+ .llm-output {
3
+ margin: 0;
4
+ padding: 20px;
5
+ font-family: Arial, sans-serif;
6
+ font-size: 16px;
7
+ line-height: 1.5;
8
+ color: #333;
9
+ }
10
+
11
+
12
+ /* estilo especial para desplegar a ancho completo */
13
+ .llm-output-full-width {
14
+ max-width: 100%; /* Anula cualquier max-width anterior como 70% o 75% */
15
+ width: 100%;
16
+ align-self: center; /* Se asegura que se centre en el contenedor flex */
17
+ box-sizing: border-box; /* Para que el padding y borde no afecten el ancho total */
18
+ }
19
+
20
+
21
+ /* BLOQUES de categorías */
22
+ .llm-output .categoria {
23
+ margin-bottom: 40px;
24
+ }
25
+
26
+ /* TÍTULO del bloque de categoría */
27
+ .llm-output .categoria h4 {
28
+ font-size: 15px; /* tamaño consistente */
29
+ color: #337ab7; /* azul Bootstrap 3 */
30
+ margin-top: 0;
31
+ margin-bottom: 10px;
32
+ font-weight: bold;
33
+ border-bottom: 2px solid #337ab7; /* línea azul más visible */
34
+ padding-bottom: 5px;
35
+ }
36
+
37
+ /* TEXTOS normales dentro */
38
+ .llm-output p {
39
+ margin-bottom: 10px;
40
+ }
41
+
42
+ /* LISTAS */
43
+ .llm-output ul {
44
+ padding-left: 0;
45
+ margin: 0 0 10px 0;
46
+ list-style: none;
47
+ }
48
+
49
+ .llm-output ul li {
50
+ margin-bottom: 8px;
51
+ }
52
+
53
+ .llm-output li strong {
54
+ display: inline-block;
55
+ margin-right: 8px;
56
+ font-weight: bold;
57
+ color: #333;
58
+ min-width: 0;
59
+ white-space: nowrap;
60
+ }
61
+
62
+ /* TABLAS */
63
+ .llm-output table {
64
+ width: 100%;
65
+ border-collapse: collapse;
66
+ font-size: 14px;
67
+ }
68
+
69
+ .llm-output th,
70
+ .llm-output td {
71
+ padding: 6px 10px;
72
+ border: 1px solid #ddd;
73
+ text-align: left !important;
74
+ vertical-align: middle;
75
+ }
76
+
77
+ .llm-output thead {
78
+ background-color: #f5f5f5;
79
+ }
80
+
81
+ .llm-output .table-striped tbody tr:nth-of-type(odd) {
82
+ background-color: #f9f9f9;
83
+ }
84
+
85
+ .llm-output .table-hover tbody tr:hover {
86
+ background-color: #f5f5f5;
87
+ }
88
+
89
+ .llm-output .tabla-licitaciones-container {
90
+ width: 100%;
91
+ overflow-x: auto; /* Añade scroll horizontal si la tabla no cabe */
92
+ margin-bottom: 15px; /* Espacio extra debajo */
93
+ border: 1px solid #ddd; /* Opcional: un borde sutil alrededor */
94
+ }
95
+
96
+ .llm-output .tabla-licitaciones th,
97
+ .llm-output .tabla-licitaciones td {
98
+ vertical-align: top;
99
+ }
100
+
101
+ .llm-output .tabla-licitaciones tbody tr:hover {
102
+ background-color: #f5f5f5; /* Mismo color que el hover genérico */
103
+ }
104
+
105
+ .text-center {
106
+ text-align: center !important;
107
+ }
108
+
109
+ .text-right {
110
+ text-align: right !important;
111
+ }
112
+
113
+ .nowrap {
114
+ white-space: nowrap;
115
+ }
@@ -0,0 +1,13 @@
1
+ <!-- templates/about.html -->
2
+ <!DOCTYPE html>
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>About</title>
8
+ </head>
9
+ <body>
10
+ <h1>AI Toolkit</h1>
11
+ <p>This is a static page in Flask.</p>
12
+ </body>
13
+ </html>
@@ -0,0 +1,45 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{% block title %}Chatbot{% endblock %}</title>
7
+ <!-- Bootstrap 5 CSS -->
8
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet">
9
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css" rel="stylesheet">
10
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/filepond/dist/filepond.min.css">
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') }}">
15
+ </head>
16
+ <body class="d-flex flex-column p-3" style="min-height: 100vh;">
17
+ <main class="d-flex flex-column flex-grow-1">
18
+ {% block content %}{% endblock %}
19
+ </main>
20
+
21
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"></script>
22
+ <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
23
+ <script src="https://cdn.jsdelivr.net/npm/filepond/dist/filepond.min.js"></script>
24
+ <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
25
+
26
+
27
+ <!-- Mostrar alertas SweetAlert2 si existe el mensaje -->
28
+ <script>
29
+ {% if alert_message %}
30
+ Swal.fire({
31
+ text: "{{ alert_message }}", // Mensaje pasado desde Flask
32
+ icon: "{{ alert_icon | default('error') }}", // Ícono por defecto "error"
33
+ confirmButtonText: "OK",
34
+ cancelButtonText: 'Cancelar',
35
+ customClass: {
36
+ confirmButton: 'custom-confirm-button', // Clase personalizada para el botón
37
+ cancelButton: 'custom-cancel-button' // Clase personalizada para el botón de cancelar
38
+ }
39
+ });
40
+ {% endif %}
41
+ </script>
42
+
43
+ {% block scripts %}{% endblock %}
44
+ </body>
45
+ </html>
@@ -0,0 +1,45 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Cambiar Contraseña{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="container vh-100 d-flex justify-content-center align-items-center">
7
+ <div class="col-11 col-md-8 col-lg-5 border rounded p-3 shadow-sm">
8
+ <h4 class="text-muted fw-semibold text-start mb-3">Cambiar Contraseña</h4>
9
+ <h6 class="text-muted text-start mb-4">{{ email }}</h6>
10
+
11
+ <form action="{{ url_for('change_password', company_short_name=company_short_name, token=token) }}" method="post">
12
+ <div class="mb-3">
13
+ <label for="temp_code" class="form-label text-muted">Código Temporal recibido</label>
14
+ <input type="text" name="temp_code" id="temp_code"
15
+ class="form-control text-muted" required
16
+ autocomplete="off"
17
+ value="{{ form_data.temp_code if form_data else '' }}">
18
+ </div>
19
+ <div class="mb-3">
20
+ <label for="new_password" class="form-label text-muted">Nueva Contraseña</label>
21
+ <input type="password" name="new_password" id="new_password"
22
+ class="form-control text-muted" required
23
+ value="{{ form_data.new_password if form_data else '' }}">
24
+ <small class="form-text text-muted">
25
+ La contraseña debe contener al menos 8 caracteres, una letra mayúscula, una letra minúscula, un número y un carácter especial.
26
+ </small>
27
+
28
+ </div>
29
+ <div class="mb-3">
30
+ <label for="confirm_password" class="form-label text-muted">Confirmar Nueva Contraseña</label>
31
+ <input type="password" name="confirm_password" id="confirm_password"
32
+ class="form-control text-muted" required
33
+ value="{{ form_data.password if form_data else '' }}">
34
+ </div>
35
+ <button type="submit" class="btn btn-primary w-100">Cambiar Contraseña</button>
36
+
37
+ <p class="text-muted text-start mt-3" style="text-align: justify;">
38
+ Ingresa el código de seguridad que recibiste por correo y elige una nueva contraseña.
39
+ Asegúrate de que sea segura y fácil de recordar.
40
+ </p>
41
+
42
+ </form>
43
+ </div>
44
+ </div>
45
+ {% endblock %}
@@ -0,0 +1,180 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}IAToolkit{% endblock %}
4
+
5
+ {% block content %}
6
+ <!-- Sección de encabezado con el usuario conectado -->
7
+ <div class="company-section d-flex justify-content-between align-items-center">
8
+ <!-- Izquierda: Datos del usuario -->
9
+ <span class="text-muted small fw-bold">
10
+ {{ company_short_name }} - {{ external_user_id or user.email }}
11
+ </span>
12
+
13
+ <!-- Derecha: Grupo de iconos de acción -->
14
+ <div class="d-flex align-items-center">
15
+ <!-- "Powered by" -->
16
+ <span class="text-muted" style="font-size: 0.75rem;">
17
+ Powered by <strong>IAToolkit</strong>
18
+ </span>
19
+
20
+ <!-- Icono de Historial -->
21
+ <a href="javascript:void(0);" id="history-button"
22
+ class="ms-3 action-icon-style" title="Historial con mis consultas">
23
+ <i class="bi bi-clock-history"></i>
24
+ </a>
25
+
26
+ <!-- Icono de Feedback -->
27
+ <a href="javascript:void(0);" id="send-feedback-button"
28
+ class="ms-3 action-icon-style" title="Tu feedback es muy importante">
29
+ <i class="bi bi-emoji-smile"></i>
30
+ </a>
31
+
32
+ <!-- Icono de cerrar sesión -->
33
+ {% if user.email %}
34
+ <a href="{{ url_for('logout', company_short_name=company_short_name) }}"
35
+ class="ms-3 action-icon-style" title="Cerrar sesión">
36
+ <i class="bi bi-box-arrow-right"></i>
37
+ </a>
38
+ {% endif %}
39
+ </div>
40
+ </div>
41
+
42
+ <div id="chat-container"
43
+ class="mt-2 p-3 border border-2 rounded flex-grow-1"
44
+ style="overflow-y: auto;">
45
+ <div id="chat-messages">
46
+ <!-- Mensaje de bienvenida estático -->
47
+ <div class="answer-section">
48
+ ¡Hola! en que te puedo ayudar hoy?
49
+ </div>
50
+ </div>
51
+ </div>
52
+
53
+ <!-- Input oculto de FilePond -->
54
+ <div class="filepond-container" style="display: none;">
55
+ <input type="file" id="file-upload" class="filepond" data-max-files="5" multiple>
56
+ </div>
57
+
58
+ <div class="input-area mt-2 mb-2">
59
+
60
+ <!-- 1. Contenido Colapsable del Asistente de prompts -->
61
+ <div class="collapse" id="prompt-assistant-collapse">
62
+ <div class="card card-body mb-2">
63
+ <div class="row g-2">
64
+ {% set prompt_col_class = 'col-md-4' %}
65
+ <div class="{{ prompt_col_class }}">
66
+ <div class="position-relative h-100">
67
+ <div class="input-group dropup h-100">
68
+ <button type="button" id="prompt-select-button" class="btn btn-light border dropdown-toggle w-100 text-start" data-bs-toggle="dropdown" aria-expanded="false">
69
+ Prompts disponibles ....
70
+ </button>
71
+ <ul class="dropdown-menu dropdown-menu-soft w-100">
72
+ {% if prompts and prompts.message %}
73
+ {% for category_group in prompts.message %}
74
+ <li><h6 class="dropdown-header">{{ category_group.category_name }}</h6></li>
75
+ {% for prompt in category_group.prompts %}
76
+ <li>
77
+ <a class="dropdown-item" href="#"
78
+ data-prompt-name="{{ prompt.prompt }}"
79
+ data-prompt-description="{{ prompt.description }}"
80
+ data-custom-fields='{{ prompt.custom_fields | tojson }}'>
81
+ {{ prompt.description }}
82
+ </a>
83
+ </li> {% endfor %}
84
+ {% if not loop.last %}<li><hr class="dropdown-divider"></li>{% endif %}
85
+ {% endfor %}
86
+ {% endif %}
87
+ </ul>
88
+ </div>
89
+ <button type="button" id="clear-selection-button" class="btn clear-specific-data-button" style="display: none;"><i class="bi bi-x-circle-fill"></i></button>
90
+ </div>
91
+ <input type="hidden" id="prompt-select-value" name="prompt_select_value">
92
+ <input type="hidden" id="prompt-select-description" name="prompt-select-description">
93
+ </div>
94
+ <!-- Contenedor donde JavaScript inyectará los inputs dinámicos -->
95
+ <div id="dynamic-inputs-container" class="col-md">
96
+ <!-- aca se renderizarán los customs_fields del prompt seleccionado -->
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+
102
+ <!-- 2. La Barra de Entrada Principal -->
103
+ <div class="chat-input-bar d-flex align-items-center">
104
+ <!-- Iconos de la izquierda -->
105
+ <div class="d-flex align-items-center">
106
+ <!-- BOTÓN PARA CONTROLAR EL COLLAPSE -->
107
+ <a class="p-2" href="#prompt-assistant-collapse" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="prompt-assistant-collapse" title="Usar Asistente de Prompts">
108
+ <i class="bi bi-magic"></i>
109
+ </a>
110
+ <a class="p-2" href="javascript:void(0);" id="paperclip-button" title="Adjuntar archivos">
111
+ <i class="bi bi-plus-circle"></i>
112
+ </a>
113
+ <div id="view-files-button-container" style="display: none;">
114
+ <a class="p-2" href="javascript:void(0);" id="view-files-button" title="Ver archivos adjuntos">
115
+ <i class="bi bi-file-earmark-text"></i>
116
+ </a>
117
+ </div>
118
+ </div>
119
+
120
+ <!-- Textarea Central -->
121
+ <textarea id="question" placeholder="Escribe tu consulta aquí..." class="form-control chat-textarea" style="resize: none;" rows="1"></textarea>
122
+
123
+ <!-- Botón de Enviar a la derecha -->
124
+ <div class="d-flex align-items-center">
125
+ <div id="send-button-container">
126
+ <a href="javascript:void(0);" id="send-button"
127
+ class="p-2 send-button-icon" title="Enviar">
128
+ <i class="bi bi-arrow-up-circle-fill"></i>
129
+ </a>
130
+ </div>
131
+ <div id="stop-button-container" style="display: none;">
132
+ <a href="javascript:void(0);" id="stop-button"
133
+ class="p-2 text-danger" title="Detener">
134
+ <i class="bi bi-stop-circle-fill"></i>
135
+ </a>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ </div>
140
+
141
+ <!-- Incluir los modales desde un archivo externo -->
142
+ {% include 'chat_modals.html' %}
143
+
144
+ {% endblock %}
145
+
146
+ {% block scripts %}
147
+ <script>
148
+ // --- Global Configuration from Backend ---
149
+ window.companyShortName = "{{ company_short_name }}";
150
+ window.iatoolkit_base_url = "{{ iatoolkit_base_url }}";
151
+ window.externalUserId = "{{ external_user_id }}";
152
+ window.availablePrompts = {{ prompts.message | tojson }};
153
+
154
+ {% if auth_method == 'jwt' and session_jwt %}
155
+ // Store session JWT if it exists, defined in the same global scope
156
+ window.sessionJWT = "{{ session_jwt }}";
157
+ {% endif %}
158
+ </script>
159
+
160
+ <!-- Carga de los scripts JS externos después de definir las variables globales -->
161
+ <script src="{{ url_for('static', filename='js/chat_filepond.js') }}"></script>
162
+ <script src="{{ url_for('static', filename='js/chat_history.js') }}"></script>
163
+ <script src="{{ url_for('static', filename='js/chat_feedback.js') }}"></script>
164
+ <script src="{{ url_for('static', filename='js/chat_main.js') }}"></script>
165
+
166
+ <script>
167
+ document.addEventListener('DOMContentLoaded', function() {
168
+ const promptCollapse = document.getElementById('prompt-assistant-collapse');
169
+ if (promptCollapse) {
170
+ promptCollapse.addEventListener('shown.bs.collapse', function () {
171
+ // Desplazar la ventana al final de la página para mantener visible el área de entrada.
172
+ window.scrollTo({
173
+ top: document.body.scrollHeight,
174
+ behavior: 'smooth'
175
+ });
176
+ });
177
+ }
178
+ });
179
+ </script>
180
+ {% endblock %}