iatoolkit 0.7.10__py3-none-any.whl → 0.7.12__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 (192) 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.10.dist-info → iatoolkit-0.7.12.dist-info}/METADATA +1 -1
  109. iatoolkit-0.7.12.dist-info/RECORD +194 -0
  110. iatoolkit-0.7.12.dist-info/top_level.txt +2 -0
  111. tests/__init__.py +5 -0
  112. tests/common/__init__.py +0 -0
  113. tests/common/test_auth.py +279 -0
  114. tests/common/test_routes.py +42 -0
  115. tests/common/test_session_manager.py +59 -0
  116. tests/common/test_util.py +444 -0
  117. tests/companies/__init__.py +5 -0
  118. tests/conftest.py +36 -0
  119. tests/infra/__init__.py +5 -0
  120. tests/infra/connectors/__init__.py +5 -0
  121. tests/infra/connectors/test_google_drive_connector.py +107 -0
  122. tests/infra/connectors/test_local_file_connector.py +85 -0
  123. tests/infra/connectors/test_s3_connector.py +95 -0
  124. tests/infra/test_call_service.py +92 -0
  125. tests/infra/test_database_manager.py +59 -0
  126. tests/infra/test_gemini_adapter.py +137 -0
  127. tests/infra/test_google_chat_app.py +68 -0
  128. tests/infra/test_llm_client.py +165 -0
  129. tests/infra/test_llm_proxy.py +122 -0
  130. tests/infra/test_mail_app.py +94 -0
  131. tests/infra/test_openai_adapter.py +105 -0
  132. tests/infra/test_redis_session_manager_service.py +117 -0
  133. tests/repositories/__init__.py +5 -0
  134. tests/repositories/test_database_manager.py +87 -0
  135. tests/repositories/test_document_repo.py +76 -0
  136. tests/repositories/test_llm_query_repo.py +340 -0
  137. tests/repositories/test_models.py +38 -0
  138. tests/repositories/test_profile_repo.py +142 -0
  139. tests/repositories/test_tasks_repo.py +76 -0
  140. tests/repositories/test_vs_repo.py +107 -0
  141. tests/services/__init__.py +5 -0
  142. tests/services/test_dispatcher_service.py +274 -0
  143. tests/services/test_document_service.py +181 -0
  144. tests/services/test_excel_service.py +208 -0
  145. tests/services/test_file_processor_service.py +121 -0
  146. tests/services/test_history_service.py +164 -0
  147. tests/services/test_jwt_service.py +255 -0
  148. tests/services/test_load_documents_service.py +112 -0
  149. tests/services/test_mail_service.py +70 -0
  150. tests/services/test_profile_service.py +379 -0
  151. tests/services/test_prompt_manager_service.py +190 -0
  152. tests/services/test_query_service.py +243 -0
  153. tests/services/test_search_service.py +39 -0
  154. tests/services/test_sql_service.py +160 -0
  155. tests/services/test_tasks_service.py +252 -0
  156. tests/services/test_user_feedback_service.py +389 -0
  157. tests/services/test_user_session_context_service.py +132 -0
  158. tests/views/__init__.py +5 -0
  159. tests/views/test_change_password_view.py +191 -0
  160. tests/views/test_chat_token_request_view.py +188 -0
  161. tests/views/test_chat_view.py +98 -0
  162. tests/views/test_download_file_view.py +149 -0
  163. tests/views/test_external_chat_login_view.py +120 -0
  164. tests/views/test_external_login_view.py +102 -0
  165. tests/views/test_file_store_view.py +128 -0
  166. tests/views/test_forgot_password_view.py +142 -0
  167. tests/views/test_history_view.py +336 -0
  168. tests/views/test_home_view.py +61 -0
  169. tests/views/test_llm_query_view.py +154 -0
  170. tests/views/test_login_view.py +114 -0
  171. tests/views/test_prompt_view.py +111 -0
  172. tests/views/test_signup_view.py +140 -0
  173. tests/views/test_tasks_review_view.py +104 -0
  174. tests/views/test_tasks_view.py +130 -0
  175. tests/views/test_user_feedback_view.py +214 -0
  176. tests/views/test_verify_user_view.py +110 -0
  177. iatoolkit-0.7.10.dist-info/RECORD +0 -80
  178. iatoolkit-0.7.10.dist-info/top_level.txt +0 -6
  179. {common → iatoolkit/common}/__init__.py +0 -0
  180. {common → iatoolkit/common}/exceptions.py +0 -0
  181. {common → iatoolkit/common}/session_manager.py +0 -0
  182. {infra → iatoolkit/infra}/__init__.py +0 -0
  183. {infra → iatoolkit/infra}/connectors/__init__.py +0 -0
  184. {infra → iatoolkit/infra}/connectors/file_connector.py +0 -0
  185. {infra → iatoolkit/infra}/llm_response.py +0 -0
  186. {infra → iatoolkit/infra}/redis_session_manager.py +0 -0
  187. {repositories → iatoolkit/repositories}/__init__.py +0 -0
  188. {repositories → iatoolkit/repositories}/models.py +0 -0
  189. {services → iatoolkit/services}/__init__.py +0 -0
  190. {services → iatoolkit/services}/jwt_service.py +0 -0
  191. {views → iatoolkit/views}/__init__.py +0 -0
  192. {iatoolkit-0.7.10.dist-info → iatoolkit-0.7.12.dist-info}/WHEEL +0 -0
@@ -6,7 +6,7 @@
6
6
  from flask.views import MethodView
7
7
  from flask import render_template, request
8
8
  from injector import inject
9
- from services.profile_service import ProfileService
9
+ from iatoolkit.services.profile_service import ProfileService
10
10
  import os
11
11
 
12
12
 
@@ -5,8 +5,8 @@
5
5
 
6
6
  from flask import request, jsonify, render_template
7
7
  from flask.views import MethodView
8
- from services.query_service import QueryService
9
- from common.auth import IAuthentication
8
+ from iatoolkit.services.query_service import QueryService
9
+ from iatoolkit.common.auth import IAuthentication
10
10
  from injector import inject
11
11
  import logging
12
12
 
@@ -6,7 +6,7 @@
6
6
  from flask.views import MethodView
7
7
  from flask import request, redirect, render_template, url_for
8
8
  from injector import inject
9
- from services.profile_service import ProfileService
9
+ from iatoolkit.services.profile_service import ProfileService
10
10
 
11
11
  class LoginView(MethodView):
12
12
  @inject
@@ -5,8 +5,8 @@
5
5
 
6
6
  from flask import jsonify
7
7
  from flask.views import MethodView
8
- from services.prompt_manager_service import PromptService
9
- from common.auth import IAuthentication
8
+ from iatoolkit.services.prompt_manager_service import PromptService
9
+ from iatoolkit.common.auth import IAuthentication
10
10
  from injector import inject
11
11
  import logging
12
12
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  from flask.views import MethodView
7
7
  from flask import render_template
8
- from services.profile_service import ProfileService
8
+ from iatoolkit.services.profile_service import ProfileService
9
9
  from injector import inject
10
10
  from itsdangerous import URLSafeTimedSerializer
11
11
  from flask import url_for, request
@@ -5,8 +5,8 @@
5
5
 
6
6
  from flask.views import MethodView
7
7
  from flask import request, jsonify
8
- from services.tasks_service import TaskService
9
- from repositories.profile_repo import ProfileRepo
8
+ from iatoolkit.services.tasks_service import TaskService
9
+ from iatoolkit.repositories.profile_repo import ProfileRepo
10
10
  from injector import inject
11
11
  import logging
12
12
  from typing import Optional
@@ -5,8 +5,8 @@
5
5
 
6
6
  from flask.views import MethodView
7
7
  from flask import request, jsonify
8
- from services.tasks_service import TaskService
9
- from repositories.profile_repo import ProfileRepo
8
+ from iatoolkit.services.tasks_service import TaskService
9
+ from iatoolkit.repositories.profile_repo import ProfileRepo
10
10
  from injector import inject
11
11
  from datetime import datetime
12
12
  import logging
@@ -5,8 +5,8 @@
5
5
 
6
6
  from flask import request, jsonify, render_template
7
7
  from flask.views import MethodView
8
- from services.user_feedback_service import UserFeedbackService
9
- from common.auth import IAuthentication
8
+ from iatoolkit.services.user_feedback_service import UserFeedbackService
9
+ from iatoolkit.common.auth import IAuthentication
10
10
  from injector import inject
11
11
  import logging
12
12
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  from flask.views import MethodView
7
7
  from flask import render_template
8
- from services.profile_service import ProfileService
8
+ from iatoolkit.services.profile_service import ProfileService
9
9
  from itsdangerous import URLSafeTimedSerializer, SignatureExpired
10
10
  from injector import inject
11
11
  import os
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 0.7.10
3
+ Version: 0.7.12
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -0,0 +1,194 @@
1
+ iatoolkit/__init__.py,sha256=yi7Uw68KajDWUUo-v4xV31Nt7hjr_-2gCXbkhdiDl44,1887
2
+ iatoolkit/base_company.py,sha256=gM3X7xedNaVLodOObvjUN9eJKPO5-HmSLaBFa9jowCk,4277
3
+ iatoolkit/cli_commands.py,sha256=lMOz5ZCuYhkIXde86Gg0cxm530lPZ7H8D1qpYj5jPPI,2286
4
+ iatoolkit/company_registry.py,sha256=tduqt3oV8iDX_IB1eA7KIgvIxE4edTcy-3qZIXh3Lzw,2549
5
+ iatoolkit/iatoolkit.py,sha256=bdw5VrMyfYWGeFGLxDR4ZJYyMJQwEXNW6BUUZxTTc3w,15841
6
+ iatoolkit/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ iatoolkit/common/auth.py,sha256=8NH6MQXfddLQd1GxrO2op3IYrrP4SMQKoKzj1o1jZmc,8486
8
+ iatoolkit/common/exceptions.py,sha256=EXx40n5htp7UiOM6P1xfJ9U6NMcADqm62dlFaKz7ICU,1154
9
+ iatoolkit/common/routes.py,sha256=zs883Xa1zoJgUYS4HKDUnnR4-fa-Sxg0SLWmU1Q1nPo,4378
10
+ iatoolkit/common/session_manager.py,sha256=7D_RuJs60w-1zDr3fOGEz9JW7IZlSXuUHgUT87CzaUo,472
11
+ iatoolkit/common/util.py,sha256=08js3KLJTXICOd5sgwDp2u_kDaZO_0xG4BIuzWZnLo8,15535
12
+ iatoolkit/infra/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
13
+ iatoolkit/infra/call_service.py,sha256=iRk9VxbXaAwlLIl8fUzGDWIAdzwfsbs1MtP84YeENxg,4929
14
+ iatoolkit/infra/gemini_adapter.py,sha256=kXV-t5i9GmWBafUPX2kAyiqvcT7GPoxHylcCUWG_c_U,15051
15
+ iatoolkit/infra/google_chat_app.py,sha256=_uKWxeacHH6C5a4FVx0YZjBn1tL-x_MIQV9gqgWGAjo,1937
16
+ iatoolkit/infra/llm_client.py,sha256=3w2BUQmnyq9Tbc9_CI2JjxZQ7pGVlMF_GmUdqBa9O7Y,18618
17
+ iatoolkit/infra/llm_proxy.py,sha256=cHyNxUpVE4UDoWUfvSGfGCrIUFPTrpWZOixELQTsGFY,5744
18
+ iatoolkit/infra/llm_response.py,sha256=YUUQPBHzmP3Ce6-t0kKMRIpowvh7de1odSoefEByIvI,904
19
+ iatoolkit/infra/mail_app.py,sha256=PLGZdEs7LQ_9bmMRRxz0iqQdNa4xToAFyf9tg75wK8U,6103
20
+ iatoolkit/infra/openai_adapter.py,sha256=Z1JSi3Tw2mXQ7JAh6yR79Ri_9yZJcJpcZLOLL3Mfda8,3530
21
+ iatoolkit/infra/redis_session_manager.py,sha256=Dkwii8fns0_Vd9hm9GmotmrKtSCxVps868U5sqj7FAE,2278
22
+ iatoolkit/infra/connectors/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
23
+ iatoolkit/infra/connectors/file_connector.py,sha256=HOjRTFd-WfDOcFyvHncAhnGNZuFgChIwC-P6osPo9ZM,352
24
+ iatoolkit/infra/connectors/file_connector_factory.py,sha256=3qvyfH4ZHKuiMxJFkawOxhW2-TGKKtsBYHgoPpZMuKU,2118
25
+ iatoolkit/infra/connectors/google_cloud_storage_connector.py,sha256=IXpL3HTo7Ft4EQsYiQq5wXRRQK854jzOEB7ZdWjLa4U,2050
26
+ iatoolkit/infra/connectors/google_drive_connector.py,sha256=WR1AlO5-Bl3W89opdja0kKgHTJzVOjTsy3H4SlIvwVg,2537
27
+ iatoolkit/infra/connectors/local_file_connector.py,sha256=hrzIgpMJOTuwTqzlQeTIU_50ZbZ6yl8lcWPv6hMnoqI,1739
28
+ iatoolkit/infra/connectors/s3_connector.py,sha256=Nj4_YaLobjfcnbZewJf21_K2EXohgcc3mJll1Pzn4zg,1123
29
+ iatoolkit/repositories/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
30
+ iatoolkit/repositories/database_manager.py,sha256=UaU7k3s7IRuXhCHTy9GoCeP9K1ad0LBdj_n1a_QjGS0,3108
31
+ iatoolkit/repositories/document_repo.py,sha256=Y7bF1kZB1HWJsAGjWdF7P2aVYeTYNufq9ngQXp7mDkY,1124
32
+ iatoolkit/repositories/llm_query_repo.py,sha256=YT_t7cYGQk8rwzH_17-28aTzO-e2jUfa2rvXy8tugvA,3612
33
+ iatoolkit/repositories/models.py,sha256=RJH0dtq2VIDJFaFDufV05NUnNW4WtNpdTjhONtfLyCw,13179
34
+ iatoolkit/repositories/profile_repo.py,sha256=ZULbh7ZOI9BFVi7HEfXtx3SaStgFnsCBVM_zuli_F8I,4062
35
+ iatoolkit/repositories/tasks_repo.py,sha256=icVO_r2oPagGnnBhwVFzznnvEEU2EAx-2dlWuWvoDC4,1745
36
+ iatoolkit/repositories/vs_repo.py,sha256=UkpmQQiocgM5IwRBmmWhw3HHzHP6zK1nN3J3TcQgjhc,5300
37
+ iatoolkit/services/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
38
+ iatoolkit/services/benchmark_service.py,sha256=CdbFYyS3FHFhNzWQEa9ZNjUlmON10DT1nKNbZQ1EUi8,5880
39
+ iatoolkit/services/dispatcher_service.py,sha256=ykR1ye6McyCCuaBgwH6r3-PqcLAr4v4ApkPazMSBzbs,14040
40
+ iatoolkit/services/document_service.py,sha256=nMXrNtbHQuc9pSaten0LvKY0kT8_WngBDmZJUP3jNPw,5936
41
+ iatoolkit/services/excel_service.py,sha256=etb77aCOiHe3_6hG7BKxXn23P1BF1tXMp6YhYYSVWA4,3579
42
+ iatoolkit/services/file_processor_service.py,sha256=B1sUUhZNFf-rT4_1wrD38GKNoBFMp2g0dYrXYMCWe2E,4122
43
+ iatoolkit/services/history_service.py,sha256=JwW958tYTrcdWSP5TRoDgDtBdGCvWIG4fnmHsrXLQ-8,1617
44
+ iatoolkit/services/jwt_service.py,sha256=YoZ9h7_o9xBko-arNQv4MbcwnxoSWVNj4VbZmMo_QGY,3908
45
+ iatoolkit/services/load_documents_service.py,sha256=ZpB0BZ3qX1fGJGBtZtMLbFdWWx0hkPoeCS3OqJKwCTs,7291
46
+ iatoolkit/services/mail_service.py,sha256=2h-fcF3swZDya_o7IpgXkmuj3iEVHVCiHi7oVxU99sQ,2182
47
+ iatoolkit/services/profile_service.py,sha256=azaCQtRJwQayg-3NV6k0lX97SFiF12emhz60S4CWv-M,17621
48
+ iatoolkit/services/prompt_manager_service.py,sha256=U-XmSpkeXvv1KRN4dytdMxSYBMRSB7y-UHcb18mk0nA,8342
49
+ iatoolkit/services/query_service.py,sha256=CI_LUBdqolvsuh7TjY23oaQcc8s6rmmr4LqnjE81ZJc,15394
50
+ iatoolkit/services/search_service.py,sha256=i1xGWu7ORKIIDH0aAQBkF86dVVbLQ0Yrooz5TiZ6aGo,1823
51
+ iatoolkit/services/sql_service.py,sha256=MIslAtpJWnTMgSD74nnqTvQj27p-lHiyRXc6OiA2C_c,2172
52
+ iatoolkit/services/tasks_service.py,sha256=g0rBku8JSRuludFKJFNfKARJoKdX9JXISKNVe7wtH5A,6850
53
+ iatoolkit/services/user_feedback_service.py,sha256=KW3VMgsH_ZNlBZIHr8eF49oO7jr75lPpr_1wWTEQYsc,2472
54
+ iatoolkit/services/user_session_context_service.py,sha256=j8mKgmSyma6k_1FyXOXwpnYi9CrdEBCpPJA1eLHYZsg,3807
55
+ iatoolkit/static/images/arrow_up.png,sha256=vPcWMebWVOOt13x5U7pzsyukysoiXO0siSyErUMleHw,2781
56
+ iatoolkit/static/images/diagrama_iatoolkit.jpg,sha256=GhauwUVqWjt9dWtsW53Uon_mo61j73brmC4ogQc6tkY,93527
57
+ iatoolkit/static/images/logo_clinica.png,sha256=vLX6X7O9RPUHYTQHvO_Fx28sI4JulpRZsRpkuJ9XIu0,56806
58
+ iatoolkit/static/images/logo_iatoolkit.png,sha256=7XSxLy8v_mGxQMM8EA0gund-MmnQoIy1RV6DkJ-eukI,185089
59
+ iatoolkit/static/images/logo_maxxa.png,sha256=X4JtTu6ooe2RUHRo1stxGGquXlkiEWcTUxH5vbFdMv0,10592
60
+ iatoolkit/static/images/logo_notaria.png,sha256=FLDK1mHydFpzudKLKQSqHdSqq6vbqs77a_bO0PI_yHE,105105
61
+ iatoolkit/static/images/logo_tarjeta.png,sha256=HQe2lp_jHFWq5hnx3SCBEcqW5IFfvSCktv9oyN--5cQ,1700
62
+ iatoolkit/static/images/logo_umayor.png,sha256=FHr1wvI8uDn1YRbRcLSRLBOc0mYusHx9Um6ZzVZUbOQ,19199
63
+ iatoolkit/static/images/upload.png,sha256=zh5FiINURpaWZQF86bF_gALBX4W1c4aLp5wPQO9xGXI,296
64
+ iatoolkit/static/js/chat_feedback.js,sha256=_izl49hFEUZYREcJoaPukpTs0YjDgJYUu-QfPt5Ll2s,4398
65
+ iatoolkit/static/js/chat_filepond.js,sha256=mzXafm7a506EpM37KATTK3zvAswO1E0KSUY1vKbwuRc,3163
66
+ iatoolkit/static/js/chat_history.js,sha256=_bmwmMl9DL37FWJgoSS74j3LSqckD93C6fktB9-PxZk,3901
67
+ iatoolkit/static/js/chat_main.js,sha256=zVDERp3_WZBTeP3N-gCf0IVTWbKToUB6L_lUaEi56A8,15149
68
+ iatoolkit/static/styles/chat_iatoolkit.css,sha256=ZPQAgLT0HIeXjZC_EY8xACmVdjEp7spdPKFsTTIB-k0,20283
69
+ iatoolkit/static/styles/chat_info.css,sha256=17DbgoNYE21VYWfb5L9-QLCpD2R1idK4imKRLwXtJLY,1058
70
+ iatoolkit/static/styles/chat_modal.css,sha256=67qwltu-QS-sU0d_fSeTIiXwcNjfAnQQtmsgStx-ezk,3047
71
+ iatoolkit/static/styles/llm_output.css,sha256=AlxgRSOleeCk2dLAqFWVaQ-jwZiJjcpC5rHuUv3T6VU,2312
72
+ iatoolkit/static/temp/024f44a9-cc7e-4bde-9a3c-11903a8f5d3d.xlsx,sha256=_6n2A4apLWkQvORpQOAAKGYlQyCHlCUDPJDzJ4Ons14,8788
73
+ iatoolkit/static/temp/0b97768e-79e8-43ec-b17e-ba3137f94e93.xlsx,sha256=hxkJNPzqfSRcYUO6sxD1X8O8o0ULO0lBCj0ifsDfwBU,6937
74
+ iatoolkit/static/temp/202883ee-763e-4b40-9bb6-bfacfc5e65fe.xlsx,sha256=reGomquStUq8iH3rByXJSPH4DH7MpdGxqy3puQ3jYHM,6103
75
+ iatoolkit/static/temp/28287491-08b7-4863-a2a3-49fcb64a0906.xlsx,sha256=7rQMpkXfXlFdyAhTWM3m_7EO-FCVNXLk1Hexd97mspk,9517
76
+ iatoolkit/static/temp/36780cac-7a46-4db4-ac98-7338a51aaf52.xlsx,sha256=DUKW7DUaMAgFbKHm3vYK6GezRMq58fHBJCNMokyuQ9k,5426
77
+ iatoolkit/static/temp/5c1b66f6-d58f-4684-8a7a-df3bb1a35eaa.xlsx,sha256=c8157lfVgtcbw94fqS1GkW2eO3VZ9MVtkWouC4jC_Lo,7605
78
+ iatoolkit/static/temp/5d5a3500-ec57-4e07-a554-8799a906d1ab.xlsx,sha256=8dnb4nba-5g2aRYXSBwVSJ5EV4Ah-4dCV7cqSxhJVgk,5794
79
+ iatoolkit/static/temp/65887e40-cf64-49aa-8d1f-651cb0f8cdf0.xlsx,sha256=_AGAhHHQo9pCXOgvDZ83K25dOrelfuxwjTJW85QcWGM,9055
80
+ iatoolkit/static/temp/6fa64b13-e8e5-40ad-8257-00fd1682dad8.xlsx,sha256=FYOJNCZOwXFK_2Ork7vL4pGqZyJR5hLv09RrH_tosJk,7339
81
+ iatoolkit/static/temp/7ab7071f-ad9b-49e6-8e63-f08410625ce7.xlsx,sha256=JWbGzhnwErg4V5jrCXGUZafxduCKcPHagM8TTsAMJro,5806
82
+ iatoolkit/static/temp/824346d9-d54d-40c6-b5c2-9e1d84d0ae90.xlsx,sha256=czRFxIL1opDDaqnDePF8aqIu7tQDmDB8hvyuZRes09w,5843
83
+ iatoolkit/static/temp/9ca80c3d-d196-4dfc-8179-582584fae04c.xlsx,sha256=DUQWwcMkq3UkUCr3TxqJuHx3ODwS5jxYCrgHnBaxcCI,6525
84
+ iatoolkit/static/temp/a34cb8a6-85fb-4ea8-aabe-889967cd83b5.xlsx,sha256=3O6b2c29sYOZ1vfW9eHnNl-7bpyxcyX9h2MC6Xlq0JA,8968
85
+ iatoolkit/static/temp/a7fc9c13-c509-4499-b4be-23bfa57cac31.xlsx,sha256=EIO1XPlO-TBQq5gd8pJ3t2SiEwDkFynkkALSXP4yMog,5379
86
+ iatoolkit/static/temp/b83084f5-fe54-4580-885e-412b4388cbda.xlsx,sha256=mQc6ZBWOLLUMhPJmsfqlb0heAVCrwjkt65mqkVg3Y7c,9041
87
+ iatoolkit/static/temp/c17c6864-34e1-448f-b0e9-380354256ea9.xlsx,sha256=WDvGGyxAhl96CeV-1Co9OGCOBmMIOD1UODHzj-wA0a0,5266
88
+ iatoolkit/static/temp/customer_clusters.parquet,sha256=vlzC453Aqu-QXOzCksgeyKleuHFctr-fEcVy4ejJJak,15177
89
+ iatoolkit/static/temp/customer_clusters.xlsx,sha256=7lN6Q0_GDj8VI5_-oMPbFHT9DxBRiK64PVH6js3PWNI,9920
90
+ iatoolkit/static/temp/d1af98b8-18a9-4b94-b9bc-607d19a87d0d.xlsx,sha256=lY4DGo1L-bLcK3j5wioLC0SwDLSw0SjyKUmISaKuSdU,5787
91
+ iatoolkit/system_prompts/format_styles.prompt,sha256=MSMe1qvR3cF_0IbFshn8R0z6Wx6VCHQq1p37rpu5wwk,3576
92
+ iatoolkit/system_prompts/query_main.prompt,sha256=w_9ybgWgiQH4V_RbAXqsvz0M7oOuiyhxcwf-D0CgfA4,3017
93
+ iatoolkit/system_prompts/sql_rules.prompt,sha256=y4nURVnb9AyFwt-lrbMNBHHtZlhk6kC9grYoOhRnrJo,59174
94
+ iatoolkit/templates/about.html,sha256=ciC08grUVz5qLzdzDDqDX31xirg5PrJIRYabWpV9oA8,294
95
+ iatoolkit/templates/base.html,sha256=LXXB8oPrcBFkf2pLfOSyAaSh66kHbs4SEujpFL3h9Nw,2163
96
+ iatoolkit/templates/change_password.html,sha256=DFfQSFcZ2YJZNFis2IXfzEKStxTf4i9f4eQ_6GiyNs8,2342
97
+ iatoolkit/templates/chat.html,sha256=YZKHn0VINtAFoyAISgahMD29iNO_oHON2N5EZkoCkE4,8219
98
+ iatoolkit/templates/chat_modals.html,sha256=9OtJHRMeBup8zojPnUqSl7Fd5StPdvOZMs2MiJPqVFY,5704
99
+ iatoolkit/templates/error.html,sha256=BNF-7z8AYL5vF4ZMUFMrOBt8c85kCFrm9qSHn9EiHWg,540
100
+ iatoolkit/templates/forgot_password.html,sha256=1lUbKg9CKnQdnySplceY_pibwYne1-mOlM38fqI1kW8,1563
101
+ iatoolkit/templates/header.html,sha256=179agI7rnYwP_rvJNXIiVde5E8Ec5649_XKq6eew2Hk,1263
102
+ iatoolkit/templates/home.html,sha256=h6qZ6d5tPYAGeHsVr-o6NFG3YMs1QeDVCxFlnPneFEA,8345
103
+ iatoolkit/templates/login.html,sha256=r4hy7MsQkfDqi6pBRNkkRiFr3GPSoHCT89R5lQLUWZc,1991
104
+ iatoolkit/templates/signup.html,sha256=J8wOjUhUe_KozyThDTWHjXpSJ1ubR2IDVobThtkSRuo,3819
105
+ iatoolkit/templates/test.html,sha256=rwNtxC83tbCl5COZFXYvmRBxxmgFJtPNuVBd_nq9KWY,133
106
+ iatoolkit/views/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
107
+ iatoolkit/views/change_password_view.py,sha256=rSebwecI1zwBgR2yvAhcfMwWpGDa4QbVAIllgtSOo9k,3940
108
+ iatoolkit/views/chat_token_request_view.py,sha256=wf32_A2Sq8NHYWshCwL10Tovd1znLoD0jQjzutR3sVE,4408
109
+ iatoolkit/views/chat_view.py,sha256=rnljdVHfe2E4E57ku6eblVgwT6SrLi1v-yqXGri68Ks,2078
110
+ iatoolkit/views/download_file_view.py,sha256=1gZ0ipqeCn39sTrJFo1-tlewlcSF7s_YNTvE4qd0HOw,2010
111
+ iatoolkit/views/external_chat_login_view.py,sha256=uh8DQRfZpZOXYr9qoxtwSwtL3PNdIJh-R5OjGgLqcoY,3782
112
+ iatoolkit/views/external_login_view.py,sha256=EHxN2omqTDkWyMp0FVCNDFt-JJ2hpg8LvprKanGR1gY,1355
113
+ iatoolkit/views/file_store_view.py,sha256=hUm5wX4E5oqJJEPEAObEj-nPiRp5EJIICULSfAWmHCs,1933
114
+ iatoolkit/views/forgot_password_view.py,sha256=Rk8Qbe9Fz7Wlgje1rt29I15gFM-a089EBi2at4FT7kA,2715
115
+ iatoolkit/views/history_view.py,sha256=8sqc9i8hN5bbRs3mSjurqKEZaXKANTQqATfwVAS4qSM,2064
116
+ iatoolkit/views/home_view.py,sha256=TihO2flkelJa9j6a0FKCMVhD-2X7BhemonB7LTne4x8,1248
117
+ iatoolkit/views/llmquery_view.py,sha256=rv2i3oeXlNc3Sv7Qu3DZGf37r-bMSa4N25FzG7_kPAI,2432
118
+ iatoolkit/views/login_view.py,sha256=MI87rGB1QpxEVxWy-tR2q7s9ms9pcFLIW8ZmNQh1EFE,2332
119
+ iatoolkit/views/prompt_view.py,sha256=l8KHlLmkSgSLK43VbhwKED7mCN9YyfeHHh4zvx0pT0E,1257
120
+ iatoolkit/views/signup_view.py,sha256=NTx_2w8F6Np88FKEpDvBvJXU-bISKpDMdhhT4XFAVfk,3805
121
+ iatoolkit/views/tasks_review_view.py,sha256=keLsLCyOTTlcoIapnB_lbuSvLwrPVZVpBiFC_7ChbLg,3388
122
+ iatoolkit/views/tasks_view.py,sha256=a3anTXrJTTvbQuc6PSpOzidLKQFL4hWa7PI2Cppcz8w,4110
123
+ iatoolkit/views/user_feedback_view.py,sha256=G37zmP8P4LvZrSymNJ5iFXhLZg1A3BEwRfTpH1Iam5w,2652
124
+ iatoolkit/views/verify_user_view.py,sha256=a3q4wHJ8mKAEmgbNTOcnX4rMikROjOR3mHvCr30qGGA,2351
125
+ tests/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
126
+ tests/conftest.py,sha256=S000Ry-rWczEDsndTtOvsj2zf2EYgjHi78oVn60hoOU,1094
127
+ tests/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
+ tests/common/test_auth.py,sha256=WViWPG3E8OldgZyPbl-lp5rosjgPQb9MlADGLr1rq4k,14338
129
+ tests/common/test_routes.py,sha256=_Fz8mYqxp8YZ39CSng0CQOIRs9fOfgC42iU9XiHLMzU,1560
130
+ tests/common/test_session_manager.py,sha256=8FLa8Z7ueLYNnJeJyTgCm8pp1DY6QvC0b0ZxZC2vpKc,2388
131
+ tests/common/test_util.py,sha256=SMh0pSIv8K-bCeMZeYBbCD70o6MpOUXHQH6kZFLLN5c,20653
132
+ tests/companies/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
133
+ tests/infra/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
134
+ tests/infra/test_call_service.py,sha256=p5kFqXFojSmHucLTyika2u3wvpQwJRCrAlVOPeohoVE,3747
135
+ tests/infra/test_database_manager.py,sha256=SMU_pcCsW89b6GyykAU2LEO8UaHL9gO5rdeWGFP3A6g,2503
136
+ tests/infra/test_gemini_adapter.py,sha256=gMjSgxh854sC08vYQpH6QSIX9w921U3g_Jrt_HU1i1Y,6292
137
+ tests/infra/test_google_chat_app.py,sha256=D1iUaGy8Z-PHufJuQ607lGEUOFueedoziXR8J9b7qmM,2363
138
+ tests/infra/test_llm_client.py,sha256=i5uRPy3k2csoNOg16dlVAaZq93MDTk5OxLgRPrsyDow,7619
139
+ tests/infra/test_llm_proxy.py,sha256=Y9F8ozVsnPLOiIt_Minr_VvANEz0x0JIPvFaWJBCLgk,5753
140
+ tests/infra/test_mail_app.py,sha256=6Mhj3HbnQ_sVaQc7wgTpIEFb2GAzc4kkFNWgPWBCmp0,3727
141
+ tests/infra/test_openai_adapter.py,sha256=4CLLIOqQLaC_zpc3clyoA9fiMu5uJmfDoPqs7hEw4Qo,4319
142
+ tests/infra/test_redis_session_manager_service.py,sha256=NbrUVxmEmWIZc9TtnFd1IiWwm1N0Ih0y7chP7z5Mx34,4914
143
+ tests/infra/connectors/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
144
+ tests/infra/connectors/test_google_drive_connector.py,sha256=UxbR64xiDpFyeE18--BHiKgvwEuaWt9b4Cf6bL6LreM,4434
145
+ tests/infra/connectors/test_local_file_connector.py,sha256=-1wpjXt2DOn_NbSUerdGFd-g-NI3rWS5vDoL3PFqxGA,3459
146
+ tests/infra/connectors/test_s3_connector.py,sha256=2hsJvKPyTWQj6kkNjtpRwsLNdvW3O5N5JlhzUM67x5Q,3512
147
+ tests/repositories/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
148
+ tests/repositories/test_database_manager.py,sha256=C6pqzxPCtk0DcZE7VNaFCT5ahONO7mWFKDo1bxb-9sU,3990
149
+ tests/repositories/test_document_repo.py,sha256=sqNL5yVM_8phPaxcYR3FupuTWN5RNG8yLfeDxR07uIM,2543
150
+ tests/repositories/test_llm_query_repo.py,sha256=Vdu85MI_L7Nh5ksNz9X3d4hORp9hXaXPwH1AUbuN5YE,13228
151
+ tests/repositories/test_models.py,sha256=CJbz3U89BgPKmP61pwGdwDW8vHvPROKwYfqcg4lx-_Q,1627
152
+ tests/repositories/test_profile_repo.py,sha256=Ex9R5JH2uyam8dt8Nl-1yiNYYj72Ma9A3Jlo_JkwktI,4981
153
+ tests/repositories/test_tasks_repo.py,sha256=ZtOOjJTb_j8dKEpirZTQAnR9fhDDO7xQWZU710So9Bk,2769
154
+ tests/repositories/test_vs_repo.py,sha256=PGN5PqQBtlwMC_UFU3qMSqxtoBSNz1YvZK4yYj0O0UU,4595
155
+ tests/services/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
156
+ tests/services/test_dispatcher_service.py,sha256=iALQx0I94SehG4eXqwvdswyYrPVShXFIlk-GwwbWyzw,13086
157
+ tests/services/test_document_service.py,sha256=Z62VjjIn1EPgDT2_2jEVI6AQoO3yOdskc_FDqlvML1Q,8085
158
+ tests/services/test_excel_service.py,sha256=7Gyy82MFqOVFIGL7RXMIOmal22ne-lsgAfY16azDAMM,8434
159
+ tests/services/test_file_processor_service.py,sha256=XzdA581hoAhevp8atqgI7jxTY1gmHE7rnMllihRS9S0,4794
160
+ tests/services/test_history_service.py,sha256=VF6IgogsgaFe64LNDeXMFcLrWjuGLf3Vj_srnFfkneM,7273
161
+ tests/services/test_jwt_service.py,sha256=3TYtuPk1ps0aa5TKGvd30Q4F7Q1FEsqK6Gr1wjW8-q8,10325
162
+ tests/services/test_load_documents_service.py,sha256=zDcHSXVQAdtAZCVWecTl-pYlkA4Sp8JLxKpu82LB69A,4640
163
+ tests/services/test_mail_service.py,sha256=PPy5XA2lYFFBNdmU1Ea-cfqszwQZrrqZSZU1OQ26lDE,2295
164
+ tests/services/test_profile_service.py,sha256=WzvVxeK5AYUDWJLBRB43vVDLHi64cIkPYPcynMEGZzM,14831
165
+ tests/services/test_prompt_manager_service.py,sha256=B6j12RNjljAKZnd7vy1CNAdZxwKiTWD5l4uxOGKVuvE,9395
166
+ tests/services/test_query_service.py,sha256=vq8dhteJOFiA0eGo1s5eBzasx7noZFrv96XdKFKhmS8,11331
167
+ tests/services/test_search_service.py,sha256=n8C5mjDDCVX4NAJvS3mKgw-WsLWu5qUA8eTOxy-g9NU,1183
168
+ tests/services/test_sql_service.py,sha256=bHDiPzjfM7-mbM4eEXlMVk3vcvefhlGCx3bdIrlriVM,7753
169
+ tests/services/test_tasks_service.py,sha256=V_WcglSX4CAtOkkKhZKl7Q92LsODHLRu66TqydiSQP4,10598
170
+ tests/services/test_user_feedback_service.py,sha256=HMU75j48jT-Chls78QEXoq92Hpq7TXP-m8xXIAL0rK0,15859
171
+ tests/services/test_user_session_context_service.py,sha256=c49RqHuoY6W_u-eR-UR05SNwDfqvRpRQWAJ6Ghyh7sQ,6799
172
+ tests/views/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
173
+ tests/views/test_change_password_view.py,sha256=5dIjx6_-rNHqj9yrkz00ajMxmZENBoTwN0gNFGUzxRE,9213
174
+ tests/views/test_chat_token_request_view.py,sha256=jwgGaNmBPTK9irKTqsDTTTIZawpYBxfGXBUv0xxvCQ0,9850
175
+ tests/views/test_chat_view.py,sha256=24dySNWlpu7EXkIeFJwUUXwb5xAq3Kdv2IVzPSVSWuY,3798
176
+ tests/views/test_download_file_view.py,sha256=l0o5DnI29ByV7N5kK4UoTKhPmStKuiAOZKFPxCSZszE,5969
177
+ tests/views/test_external_chat_login_view.py,sha256=1PLOPqVJjR-7d1DV24uuA7QOYEeKsIusjw6poBYTFB8,5405
178
+ tests/views/test_external_login_view.py,sha256=Lf4VHxTyddx_RSTvYoxcZr8cG82bvJ0pdVqU1CJpwcg,4394
179
+ tests/views/test_file_store_view.py,sha256=hT2k5-ppGNphKnQwueTvyzHQUGJ1umVXpPNOpTL8GOI,4837
180
+ tests/views/test_forgot_password_view.py,sha256=GeaGMQpY20T9_cM_kBTrwRcx-Z1zsDbytB-KoyM9p2o,6224
181
+ tests/views/test_history_view.py,sha256=AxNNjVEEYVdLDNa6aZaWdSE3FMquiqqDGxvl57UYdD8,12322
182
+ tests/views/test_home_view.py,sha256=uqPCQnDyTm25l6YLrwzINrHMd16oyY3yrqXui1LChjg,2438
183
+ tests/views/test_llm_query_view.py,sha256=3Mf_mfZNW9wTG7BivwEW0OL-QXplV2zRakl5rIUOvu8,5121
184
+ tests/views/test_login_view.py,sha256=P-6n6LGnQ87pC9a48FMz0okVm7eukpSeIKDnMUABs3I,4812
185
+ tests/views/test_prompt_view.py,sha256=y8mIXc0AqOoSe2QJJX3UdiFgA1a2TYFCcIwGiupxR0U,4563
186
+ tests/views/test_signup_view.py,sha256=WVh11rzH2MbJWS9rvYIn9R1aCWJLnpIhIK_k7MQxi0I,6534
187
+ tests/views/test_tasks_review_view.py,sha256=HXbAY99rbcdg-ZoaU3kxp-jNTPgOhgiTyKmV9rUcFyQ,3743
188
+ tests/views/test_tasks_view.py,sha256=TNdV69Vt17uc-vBI37A7qtRNqyPho2MoW7cgGxQKecU,4551
189
+ tests/views/test_user_feedback_view.py,sha256=IfKOpsncmf5ciMDsGuPtro9GdKXkxhRzsysVlEEM_HA,9181
190
+ tests/views/test_verify_user_view.py,sha256=dxQ3ibOETEuP8M50Gmwbmzj2L6UU7PAyC91Wp9Xs0K0,4772
191
+ iatoolkit-0.7.12.dist-info/METADATA,sha256=vhLpVH2zk4dOidIF2--_Z-aSRdqIj530gc-e4zSNCgo,9301
192
+ iatoolkit-0.7.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
193
+ iatoolkit-0.7.12.dist-info/top_level.txt,sha256=or0Ar3Su6BhTy86zRrUwMAWtsR8Nk-tFEwdC0CZpKCs,16
194
+ iatoolkit-0.7.12.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ iatoolkit
2
+ tests
tests/__init__.py ADDED
@@ -0,0 +1,5 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
File without changes
@@ -0,0 +1,279 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from flask import Flask, Response
7
+ from unittest.mock import patch, MagicMock
8
+ from iatoolkit.common.auth import IAuthentication
9
+ import pytest
10
+ from datetime import datetime, timezone
11
+ from iatoolkit.repositories.profile_repo import ProfileRepo
12
+ from iatoolkit.services.jwt_service import JWTService
13
+ from werkzeug.exceptions import HTTPException
14
+
15
+ CURRENT_TIME = datetime.now(timezone.utc).timestamp()
16
+
17
+
18
+ class TestAuth:
19
+
20
+ def setup_method(self):
21
+ self.app = Flask(__name__)
22
+ self.app.config['TESTING'] = True
23
+
24
+ self.profile_repo = MagicMock(spec=ProfileRepo)
25
+ self.jwt_service = MagicMock(spec=JWTService)
26
+ self.iauth_service = IAuthentication(
27
+ profile_repo=self.profile_repo,
28
+ jwt_service=self.jwt_service
29
+ )
30
+
31
+ @self.app.route('/<company_short_name>/protected')
32
+ def protected(company_short_name):
33
+ with self.app.test_request_context():
34
+ auth_result = self.iauth_service.check_if_user_is_logged_in(company_short_name)
35
+ if isinstance(auth_result, Response):
36
+ return auth_result
37
+ return "Access Granted", 200
38
+
39
+ @self.app.route('/login')
40
+ def login():
41
+ return "Login Page", 200
42
+
43
+ self.client = self.app.test_client()
44
+
45
+ def teardown_method(self):
46
+ patch.stopall()
47
+
48
+ # --- Pruebas para check_if_user_is_logged_in (de TestAuth original) ---
49
+
50
+ def test_allows_access_if_user_authenticated_and_active(self):
51
+ with patch('iatoolkit.common.auth.SessionManager.get') as mock_get, \
52
+ patch('iatoolkit.common.auth.SessionManager.set') as mock_set:
53
+ mock_get.side_effect = lambda key, default=None: {
54
+ 'user': {'id': 1, 'username': 'test_user'},
55
+ 'company_short_name': 'test_company',
56
+ 'last_activity': CURRENT_TIME
57
+ }.get(key, default)
58
+
59
+ response = self.client.get('/test_company/protected')
60
+
61
+ assert response.status_code == 200
62
+ assert response.data == b"Access Granted"
63
+ mock_set.assert_called_with("last_activity", pytest.approx(CURRENT_TIME, 1))
64
+
65
+ def test_redirect_if_user_not_authenticated(self):
66
+ with patch('iatoolkit.common.auth.SessionManager.get') as mock_get:
67
+ mock_get.side_effect = lambda key, default=None: None if key == "user" else default
68
+ response = self.client.get('/test_company/protected')
69
+ assert response.status_code == 302
70
+ assert "/login" in response.headers['Location']
71
+
72
+ def test_redirect_if_last_activity_missing(self):
73
+ with patch('iatoolkit.common.auth.SessionManager.get') as mock_get, \
74
+ patch('iatoolkit.common.auth.SessionManager.clear') as mock_clear:
75
+ mock_get.side_effect = lambda key, default=None: {
76
+ 'user': {'id': 1, 'username': 'test_user'},
77
+ 'company_short_name': 'test_company'
78
+ }.get(key, default)
79
+
80
+ response = self.client.get('/test_company/protected')
81
+
82
+ assert response.status_code == 302
83
+ assert "/login" in response.headers['Location']
84
+ mock_clear.assert_called_once()
85
+
86
+ # --- Pruebas para verify (de TestAuthVerify original) ---
87
+
88
+ def test_verify_with_jwt_success(self):
89
+ with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
90
+ patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key:
91
+ mock_auth_jwt.return_value = (123, 'ext_user_1', None)
92
+
93
+ with self.app.test_request_context():
94
+ result = self.iauth_service.verify('some_company')
95
+
96
+ assert result['success'] is True
97
+ assert result['company_id'] == 123
98
+ assert result['external_user_id'] == 'ext_user_1'
99
+ mock_auth_jwt.assert_called_once_with('some_company')
100
+ mock_auth_api_key.assert_not_called()
101
+
102
+ def test_verify_with_jwt_failure(self):
103
+ with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
104
+ patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key:
105
+ mock_auth_jwt.return_value = (None, None, "Error de JWT")
106
+
107
+ with self.app.test_request_context():
108
+ result = self.iauth_service.verify('some_company')
109
+
110
+ assert result == {"error_message": "Fallo de autenticación JWT"}
111
+ mock_auth_api_key.assert_not_called()
112
+
113
+ def test_verify_with_api_key_success(self):
114
+ with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
115
+ patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key, \
116
+ patch.object(self.iauth_service, 'check_if_user_is_logged_in') as mock_check_if_logged_in:
117
+ mock_auth_jwt.return_value = (None, None, None)
118
+ mock_auth_api_key.return_value = (456, None)
119
+
120
+ with self.app.test_request_context():
121
+ result = self.iauth_service.verify('some_company', body_external_user_id='body_user_2')
122
+
123
+ assert result['success'] is True
124
+ assert result['company_id'] == 456
125
+ assert result['external_user_id'] == 'body_user_2'
126
+ mock_auth_api_key.assert_called_once_with('some_company')
127
+ mock_check_if_logged_in.assert_not_called()
128
+
129
+ def test_verify_with_api_key_failure(self):
130
+ with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
131
+ patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key:
132
+ mock_auth_jwt.return_value = (None, None, None)
133
+ mock_auth_api_key.return_value = (None, "Error de API Key")
134
+
135
+ with self.app.test_request_context():
136
+ result = self.iauth_service.verify('some_company')
137
+
138
+ assert result == {"error_message": "Fallo de autenticación API Key"}
139
+
140
+ def test_verify_with_session_success(self):
141
+ with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
142
+ patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key, \
143
+ patch.object(self.iauth_service, 'check_if_user_is_logged_in') as mock_check_if_logged_in, \
144
+ patch('iatoolkit.common.auth.SessionManager.get') as mock_session_get:
145
+ mock_auth_jwt.return_value = (None, None, None)
146
+ mock_auth_api_key.return_value = (None, None)
147
+ mock_check_if_logged_in.return_value = None
148
+ mock_session_get.side_effect = lambda key, default=None: {'user_id': 789, 'company_id': 999}.get(key,
149
+ default)
150
+
151
+ with self.app.test_request_context():
152
+ result = self.iauth_service.verify('some_company')
153
+
154
+ assert result['success'] is True
155
+ assert result['company_id'] == 999
156
+ assert result['local_user_id'] == 789
157
+ mock_check_if_logged_in.assert_called_once_with('some_company')
158
+
159
+ def test_verify_with_session_incomplete_data(self):
160
+ with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
161
+ patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key, \
162
+ patch.object(self.iauth_service, 'check_if_user_is_logged_in') as mock_check_if_logged_in, \
163
+ patch('iatoolkit.common.auth.SessionManager.get') as mock_session_get:
164
+ mock_auth_jwt.return_value = (None, None, None)
165
+ mock_auth_api_key.return_value = (None, None)
166
+ mock_check_if_logged_in.return_value = None
167
+ mock_session_get.side_effect = lambda key, default=None: {'user_id': 789}.get(key, default)
168
+
169
+ with self.app.test_request_context():
170
+ result = self.iauth_service.verify('some_company')
171
+
172
+ assert result == {"error_message": "Fallo interno en la autenticación o no autenticado"}
173
+
174
+ def test_verify_with_session_check_fails_by_exception(self):
175
+ with patch.object(self.iauth_service, '_authenticate_via_chat_jwt') as mock_auth_jwt, \
176
+ patch.object(self.iauth_service, '_authenticate_via_api_key') as mock_auth_api_key, \
177
+ patch.object(self.iauth_service, 'check_if_user_is_logged_in') as mock_check_if_logged_in:
178
+ mock_auth_jwt.return_value = (None, None, None)
179
+ mock_auth_api_key.return_value = (None, None)
180
+ mock_check_if_logged_in.side_effect = HTTPException
181
+
182
+ with self.app.test_request_context(), pytest.raises(HTTPException):
183
+ self.iauth_service.verify('some_company')
184
+
185
+ # --- Nuevas pruebas para _authenticate_via_api_key ---
186
+
187
+ def test_authenticate_via_api_key_success(self):
188
+ with self.app.test_request_context(headers={'Authorization': 'Bearer valid_key'}):
189
+ mock_api_entry = MagicMock()
190
+ mock_api_entry.company.short_name = 'test_company'
191
+ mock_api_entry.company_id = 123
192
+ self.profile_repo.get_active_api_key_entry.return_value = mock_api_entry
193
+
194
+ company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
195
+
196
+ assert company_id == 123
197
+ assert error is None
198
+ self.profile_repo.get_active_api_key_entry.assert_called_once_with('valid_key')
199
+
200
+ def test_authenticate_via_api_key_no_header(self):
201
+ with self.app.test_request_context(headers={}):
202
+ company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
203
+ assert company_id is None
204
+ assert error is None
205
+ self.profile_repo.get_active_api_key_entry.assert_not_called()
206
+
207
+ def test_authenticate_via_api_key_wrong_scheme(self):
208
+ with self.app.test_request_context(headers={'Authorization': 'Basic some_token'}):
209
+ company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
210
+ assert company_id is None
211
+ assert error is None
212
+ self.profile_repo.get_active_api_key_entry.assert_not_called()
213
+
214
+ def test_authenticate_via_api_key_inactive_key(self):
215
+ with self.app.test_request_context(headers={'Authorization': 'Bearer inactive_key'}):
216
+ self.profile_repo.get_active_api_key_entry.return_value = None
217
+ company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
218
+ assert company_id is None
219
+ assert error == "API Key inválida o inactiva"
220
+
221
+ def test_authenticate_via_api_key_company_mismatch(self):
222
+ with self.app.test_request_context(headers={'Authorization': 'Bearer valid_key'}):
223
+ mock_api_entry = MagicMock()
224
+ mock_api_entry.company.short_name = 'other_company'
225
+ self.profile_repo.get_active_api_key_entry.return_value = mock_api_entry
226
+
227
+ company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
228
+ assert company_id is None
229
+ assert error == "API Key no es válida para la compañía test_company"
230
+
231
+ def test_authenticate_via_api_key_repo_exception(self):
232
+ with self.app.test_request_context(headers={'Authorization': 'Bearer any_key'}):
233
+ self.profile_repo.get_active_api_key_entry.side_effect = Exception("DB error")
234
+ company_id, error = self.iauth_service._authenticate_via_api_key('test_company')
235
+ assert company_id is None
236
+ assert error == "Error interno del servidor al validar API Key"
237
+
238
+ # --- Nuevas pruebas para _authenticate_via_chat_jwt ---
239
+
240
+ def test_authenticate_via_chat_jwt_success(self):
241
+ with self.app.test_request_context(headers={'X-Chat-Token': 'valid_jwt'}):
242
+ self.jwt_service.validate_chat_jwt.return_value = {'company_id': 123, 'external_user_id': 'ext_user'}
243
+ company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
244
+ assert company_id == 123
245
+ assert external_user_id == 'ext_user'
246
+ assert error is None
247
+ self.jwt_service.validate_chat_jwt.assert_called_once_with('valid_jwt', 'test_company')
248
+
249
+ def test_authenticate_via_chat_jwt_no_header(self):
250
+ with self.app.test_request_context(headers={}):
251
+ company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
252
+ assert company_id is None
253
+ assert external_user_id is None
254
+ assert error is None
255
+ self.jwt_service.validate_chat_jwt.assert_not_called()
256
+
257
+ def test_authenticate_via_chat_jwt_validation_fails(self):
258
+ with self.app.test_request_context(headers={'X-Chat-Token': 'invalid_jwt'}):
259
+ self.jwt_service.validate_chat_jwt.return_value = None
260
+ company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
261
+ assert company_id is None
262
+ assert external_user_id is None
263
+ assert error == "Token de chat expirado, debes reingresar al chat"
264
+
265
+ def test_authenticate_via_chat_jwt_incomplete_payload_no_company_id(self):
266
+ with self.app.test_request_context(headers={'X-Chat-Token': 'valid_jwt'}):
267
+ self.jwt_service.validate_chat_jwt.return_value = {'external_user_id': 'ext_user'}
268
+ company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
269
+ assert company_id is None
270
+ assert external_user_id is None
271
+ assert error == "Token de chat con formato interno incorrecto"
272
+
273
+ def test_authenticate_via_chat_jwt_incomplete_payload_no_external_id(self):
274
+ with self.app.test_request_context(headers={'X-Chat-Token': 'valid_jwt'}):
275
+ self.jwt_service.validate_chat_jwt.return_value = {'company_id': 123}
276
+ company_id, external_user_id, error = self.iauth_service._authenticate_via_chat_jwt('test_company')
277
+ assert company_id is None
278
+ assert external_user_id is None
279
+ assert error == "Token de chat con formato interno incorrecto"
@@ -0,0 +1,42 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from flask import Flask
7
+ from unittest.mock import patch
8
+
9
+
10
+ class TestRoutes:
11
+ def setup_method(self):
12
+ # Configurar la aplicación Flask para pruebas
13
+ self.app = Flask(__name__)
14
+ self.app.config['VERSION'] = "1.0.0"
15
+ self.app.secret_key = 'test_secret'
16
+
17
+ # Concentramos todos los mocks y patches aquí:
18
+
19
+ # Patch para el SessionManager (por ejemplo para evitar lecturas de sesión reales)
20
+ self.session_manager_patch = patch("common.routes.SessionManager")
21
+ self.mock_session_manager = self.session_manager_patch.start()
22
+ # Para este ejemplo, no es necesario configurar un return_value, pero se podría definir según se requiera
23
+
24
+ # Patch para la función flash, reemplazándola para que no intente enviar mensajes reales
25
+ self.flash_patch = patch("common.routes.flash")
26
+ self.mock_flash = self.flash_patch.start()
27
+
28
+ # Patch para render_template, que es usado por la ruta "/about" y otros
29
+ self.render_template_patch = patch("common.routes.render_template", return_value="<html>About</html>")
30
+ self.mock_render_template = self.render_template_patch.start()
31
+
32
+ # Registrar las rutas en la aplicación
33
+ from iatoolkit.common.routes import register_routes
34
+ register_routes(self.app)
35
+
36
+ # Crear el cliente de pruebas
37
+ self.client = self.app.test_client()
38
+
39
+ def teardown_method(self, method):
40
+ patch.stopall()
41
+
42
+