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

iatoolkit/base_company.py CHANGED
@@ -88,7 +88,7 @@ class BaseCompany(ABC):
88
88
 
89
89
  @abstractmethod
90
90
  # get context specific for this company
91
- def get_user_info(self, **kwargs) -> str:
91
+ def get_user_info(self, user_identifier: str) -> str:
92
92
  raise NotImplementedError("La subclase debe implementar el método get_user_info()")
93
93
 
94
94
  @abstractmethod
@@ -40,22 +40,27 @@ def register_views(injector, app):
40
40
  # iatoolkit home page
41
41
  app.add_url_rule('/<company_short_name>', view_func=IndexView.as_view('index'))
42
42
 
43
- # init (ir reset) the context (with api-key)
43
+ # init (reset) the company context (with api-key)
44
44
  app.add_url_rule('/<company_short_name>/<external_user_id>/init-context',
45
45
  view_func=InitContextView.as_view('init-context'))
46
46
 
47
- # external login (with api-key)
47
+ # this functions are for login external users (with api-key)
48
+ # only the first one should be used from an external app
48
49
  app.add_url_rule('/<company_short_name>/initiate_external_chat',
49
50
  view_func=InitiateExternalChatView.as_view('initiate_external_chat'))
50
51
  app.add_url_rule('/<company_short_name>/external_login',
51
52
  view_func=ExternalChatLoginView.as_view('external_login'))
53
+
54
+ # this endpoint is for requesting a chat token for external users
52
55
  app.add_url_rule('/auth/chat_token',
53
56
  view_func=ChatTokenRequestView.as_view('chat-token'))
54
57
 
55
58
  # login for the iatoolkit integrated frontend
59
+ # this is the main login endpoint for the frontend
60
+ app.add_url_rule('/<company_short_name>/chat', view_func=InitiateLoginView.as_view('chat'))
56
61
  app.add_url_rule('/<company_short_name>/login', view_func=LoginView.as_view('login'))
57
- app.add_url_rule('/<company_short_name>/initiate_login', view_func=InitiateLoginView.as_view('initiate_login'))
58
62
 
63
+ # register new user, account verification and forgot password
59
64
  app.add_url_rule('/<company_short_name>/signup',view_func=SignupView.as_view('signup'))
60
65
  app.add_url_rule('/<company_short_name>/logout', 'logout', logout)
61
66
  app.add_url_rule('/logout', 'logout', logout)
@@ -63,16 +68,27 @@ def register_views(injector, app):
63
68
  app.add_url_rule('/<company_short_name>/forgot-password', view_func=ForgotPasswordView.as_view('forgot_password'))
64
69
  app.add_url_rule('/<company_short_name>/change-password/<token>', view_func=ChangePasswordView.as_view('change_password'))
65
70
 
66
- # this are backend endpoints mainly
71
+ # main chat query, used by the JS in the browser (with credentials)
72
+ # can be used also for executing iatoolkit prompts
67
73
  app.add_url_rule('/<company_short_name>/llm_query', view_func=LLMQueryView.as_view('llm_query'))
68
- app.add_url_rule('/<company_short_name>/feedback', view_func=UserFeedbackView.as_view('feedback'))
74
+
75
+ # chat buttons are here
76
+
77
+ # open the promt directory
69
78
  app.add_url_rule('/<company_short_name>/prompts', view_func=PromptView.as_view('prompt'))
79
+
80
+ # feedback and history
81
+ app.add_url_rule('/<company_short_name>/feedback', view_func=UserFeedbackView.as_view('feedback'))
70
82
  app.add_url_rule('/<company_short_name>/history', view_func=HistoryView.as_view('history'))
83
+
84
+ # tasks management endpoints: create task, and review answer
71
85
  app.add_url_rule('/tasks', view_func=TaskView.as_view('tasks'))
72
86
  app.add_url_rule('/tasks/review/<int:task_id>', view_func=TaskReviewView.as_view('tasks-review'))
87
+
88
+ # this endpoint is for upload documents into the vector store (api-key)
73
89
  app.add_url_rule('/load', view_func=FileStoreView.as_view('load'))
74
90
 
75
- # login testing /login_testing
91
+ # login testing (old home page)
76
92
  app.add_url_rule('/login_testing', view_func=HomeView.as_view('home'))
77
93
 
78
94
  app.add_url_rule(
@@ -106,7 +122,7 @@ def register_views(injector, app):
106
122
  except FileNotFoundError:
107
123
  abort(404)
108
124
 
109
- # Redirección opcional: hacer que la raíz '/' vaya a la landing de sample_company
125
+ # hacer que la raíz '/' vaya al home de iatoolkit
110
126
  @app.route('/')
111
127
  def root_redirect():
112
128
  return redirect(url_for('index', company_short_name='sample_company'))
iatoolkit/iatoolkit.py CHANGED
@@ -16,11 +16,10 @@ import os
16
16
  from typing import Optional, Dict, Any
17
17
  from iatoolkit.repositories.database_manager import DatabaseManager
18
18
  from werkzeug.middleware.proxy_fix import ProxyFix
19
-
20
-
21
19
  from injector import Binder, singleton, Injector
22
20
  from importlib.metadata import version as _pkg_version, PackageNotFoundError
23
21
 
22
+ IATOOLKIT_VERSION = "0.21.0"
24
23
 
25
24
  # global variable for the unique instance of IAToolkit
26
25
  _iatoolkit_instance: Optional['IAToolkit'] = None
@@ -53,7 +52,7 @@ class IAToolkit:
53
52
  self.app = None
54
53
  self.db_manager = None
55
54
  self._injector = None
56
- self.version = "0.0.0+dev"
55
+ self.version = IATOOLKIT_VERSION
57
56
 
58
57
  @classmethod
59
58
  def get_instance(cls) -> 'IAToolkit':
@@ -21,6 +21,7 @@ import tiktoken
21
21
  from typing import Dict, Optional, List
22
22
  from iatoolkit.services.dispatcher_service import Dispatcher
23
23
 
24
+ CONTEXT_ERROR_MESSAGE = 'Tu consulta supera el límite de contexto, recarga la página para limpiarlo (esto demora un poco ...)'
24
25
 
25
26
  class llmClient:
26
27
  _llm_clients_cache = {} # class attribute, for the clients cache
@@ -116,7 +117,7 @@ class llmClient:
116
117
 
117
118
  # in case of context error
118
119
  if "context_length_exceeded" in str(e):
119
- error_message = 'Tu consulta supera el limite de contexto, sale e ingresa de nuevo a IAToolkit'
120
+ error_message = CONTEXT_ERROR_MESSAGE
120
121
 
121
122
  raise IAToolkitException(IAToolkitException.ErrorType.LLM_ERROR, error_message)
122
123
 
@@ -256,9 +257,9 @@ class llmClient:
256
257
 
257
258
  # in case of context error
258
259
  if "context_length_exceeded" in str(e):
259
- error_message = 'Tu consulta supera el limite de contexto, sale e ingresa de nuevo a IAToolkit'
260
+ error_message = CONTEXT_ERROR_MESSAGE
260
261
  elif "string_above_max_length" in str(e):
261
- error_message = 'La respuesta es muy larga, trata de filtrar/restringuir tu consulta'
262
+ error_message = 'La respuesta es muy extensa, trata de filtrar/restringuir tu consulta'
262
263
 
263
264
  raise IAToolkitException(IAToolkitException.ErrorType.LLM_ERROR, error_message)
264
265
 
@@ -200,6 +200,7 @@ class Dispatcher:
200
200
  # default values
201
201
  normalized_user = {
202
202
  "id": raw_data.get("id", 0),
203
+ "username": raw_data.get("id", 0),
203
204
  "user_email": raw_data.get("email", ""),
204
205
  "user_fullname": raw_data.get("user_fullname", ""),
205
206
  "company_id": raw_data.get("company_id", 0),
@@ -18,10 +18,19 @@ body {
18
18
  font-size: 1.8rem; /* Aumentado el tamaño del texto */
19
19
  }
20
20
 
21
- /* --- 2. Sección Principal (Hero) --- */
22
- .hero-section {
23
- padding: 5rem 0; /* <-- ESTA LÍNEA RESTAURA EL ESPACIADO SUPERIOR E INFERIOR */
24
- background-color: #f8f9fa; /* Fondo gris claro para la sección principal */
21
+ .gradient-text {
22
+ /* Define un gradiente como fondo */
23
+ background: linear-gradient(90deg, #4F46E5, #818CF8);
24
+
25
+ /* Recorta el fondo para que solo sea visible donde hay texto */
26
+ -webkit-background-clip: text;
27
+ background-clip: text;
28
+
29
+ /* Hace que el color del texto sea transparente para que se vea el fondo */
30
+ color: transparent;
31
+
32
+ /* Asegura que el fondo no se repita */
33
+ background-size: 100%;
25
34
  }
26
35
 
27
36
  /* Estilos para el texto de la propuesta de valor */
@@ -30,19 +39,18 @@ body {
30
39
  flex-direction: column;
31
40
  justify-content: center;
32
41
  height: 100%;
33
- /* Se ajusta el padding para la nueva posición a la izquierda */
34
42
  padding-left: 2rem;
35
43
  }
36
44
 
37
- .value-proposition .hero-title {
38
- font-size: 2.8rem;
39
- font-weight: 700;
40
- line-height: 1.2;
41
- color: #212529;
45
+ /* --- 2. Sección Principal (Hero) --- */
46
+ .hero-section {
47
+ padding: 1rem 0;
48
+ background-color: #f8f9fa; /* Fondo gris claro para la sección principal */
42
49
  }
43
50
 
44
- .value-proposition .hero-accelerator {
45
- color: var(--brand-primary-color, #0d6efd);
51
+ .hero-title {
52
+ font-weight: 700;
53
+ color: #111827;
46
54
  }
47
55
 
48
56
  .value-proposition .hero-subtitle {
@@ -51,6 +59,11 @@ body {
51
59
  margin-top: 1.5rem;
52
60
  }
53
61
 
62
+
63
+ .value-proposition .hero-accelerator {
64
+ color: var(--brand-primary-color, #0d6efd);
65
+ }
66
+
54
67
  /* --- Estilo para el título del widget de login --- */
55
68
  .hero-section .bg-light h4 {
56
69
  color: var(--brand-primary-color, #0d6efd);
@@ -63,7 +76,6 @@ body {
63
76
  line-height: 1.4;
64
77
  }
65
78
 
66
-
67
79
  /* --- 3. Sección de Características --- */
68
80
  .features-section {
69
81
  padding: 5rem 0;
@@ -5,13 +5,14 @@
5
5
  <h4 class="form-title fw-bold">Acceso a la Plataforma</h4>
6
6
  <!-- Párrafo modificado con nuevo texto y nueva clase CSS -->
7
7
  <p class="text-muted widget-intro-text">
8
- Ingresa a la plataforma o regístrate y prueba una demo interactiva con nuestra empresa de ejemplo.
8
+ Aca puedes mirar como funciona IAToolkit con una empresa ficticia (Sample Company).
9
+ Pregunta por clientes, productos, ventas, etc.
9
10
  </p>
10
11
  </div>
11
12
 
12
13
  <!-- 2. Formulario de Inicio de Sesión -->
13
14
  <form id="login-form"
14
- action="{{ url_for('initiate_login', company_short_name=company_short_name) }}"
15
+ action="{{ url_for('chat', company_short_name=company_short_name) }}"
15
16
  method="post">
16
17
  <div class="mb-3">
17
18
  <label for="email" class="form-label d-block text-muted">Correo Electrónico</label>
@@ -13,7 +13,7 @@
13
13
  <div class="border rounded p-4 shadow-sm bg-light">
14
14
  <h4 class="text-muted fw-semibold text-start mb-3">login integrado (IAToolkit)</h4>
15
15
  <form id="login-form"
16
- action="{{ url_for('initiate_login', company_short_name=company_short_name, external_login=True) }}"
16
+ action="{{ url_for('chat', company_short_name=company_short_name, external_login=True) }}"
17
17
  method="post">
18
18
  <div class="mb-3">
19
19
  <label for="company_short_name" class="form-label d-block text-muted">Empresa</label>
@@ -112,7 +112,7 @@
112
112
 
113
113
  // Actualizar action del formulario "Iniciar Sesión"
114
114
  if (selectedCompany && selectedCompany.trim() !== '') {
115
- const loginAction = '/' + selectedCompany + '/initiate_login';
115
+ const loginAction = '/' + selectedCompany + '/chat';
116
116
  $('#login-form').attr('action', loginAction); // Actualizamos la URL del form
117
117
  } else {
118
118
  $('#login-form').attr('action', '#'); // URL genérica si no hay selección
@@ -23,14 +23,16 @@
23
23
  <div class="row align-items-center">
24
24
  <div class="col-lg-7">
25
25
  <div class="value-proposition">
26
- <h1 class="hero-title">El <span class="hero-accelerator">Acelerador</span> de IA para tu Empresa</h1>
26
+ <h1 class="hero-title gradient-text">Construye IA que entiende tu Negocio</h1>
27
27
  <p class="hero-subtitle">IAToolkit es la plataforma de código abierto que conecta de forma segura tus
28
- datos internos —bases de datos, documentos y sistemaspara crear un asistente de IA
28
+ datos internos —bases de datos SQL, API's y documentoscon un un asistente de IA
29
29
  que entiende tu negocio desde el primer día.</p>
30
30
  <p class="hero-subtitle">
31
31
  Es un producto para ingenieros de software que quieren construir aplicaciones de IA
32
- a gran velocidad. Proveemos la infraestructura fundamental y extensible construida en Python
33
- para que tú te puedas enfocar en conectar tus datos y crear la lógica de negocio.</p>
32
+ a gran velocidad. Provee la infraestructura fundamental
33
+ para que tú te puedas enfocar en conectar tus datos y crear tus prompts.</p>
34
+ <p class="hero-subtitle">
35
+ Te invito a descargarlo y probar el "hello, world" de IAToolkit.</p>
34
36
  </div>
35
37
  </div>
36
38
  <div class="col-lg-5">
@@ -53,7 +55,13 @@
53
55
  <div class="opensource-content">
54
56
  <h3>100% Open Source</h3>
55
57
  <p>Construido en Python, IAToolkit te da control total. Audita el código, adáptalo y contribuye a una comunidad en crecimiento.</p>
56
- <a href="https://github.com/tu-usuario/iatoolkit" target="_blank" class="btn btn-light"><i class="bi bi-github me-2"></i>Ir a GitHub</a>
58
+
59
+ <a href="https://github.com/flibedinsky/iatoolkit" target="_blank" class="btn btn-light">
60
+ <i class="bi bi-github me-2"></i>Ir a GitHub
61
+ {% if iatoolkit_version %}
62
+ <span class="badge bg-dark ms-2">{{ iatoolkit_version }}</span>
63
+ {% endif %}
64
+ </a>
57
65
  </div>
58
66
  </div>
59
67
 
@@ -6,6 +6,7 @@
6
6
  from flask.views import MethodView
7
7
  from flask import request, jsonify
8
8
  from iatoolkit.services.load_documents_service import LoadDocumentsService
9
+ from iatoolkit.common.auth import IAuthentication
9
10
  from iatoolkit.repositories.profile_repo import ProfileRepo
10
11
  from injector import inject
11
12
  import base64
@@ -14,8 +15,10 @@ import base64
14
15
  class FileStoreView(MethodView):
15
16
  @inject
16
17
  def __init__(self,
18
+ iauthentication: IAuthentication,
17
19
  doc_service: LoadDocumentsService,
18
20
  profile_repo: ProfileRepo,):
21
+ self.iauthentication = iauthentication
19
22
  self.doc_service = doc_service
20
23
  self.profile_repo = profile_repo
21
24
 
@@ -29,6 +32,7 @@ class FileStoreView(MethodView):
29
32
  return jsonify({"error": f"El campo {field} es requerido"}), 400
30
33
 
31
34
  company_short_name = req_data.get('company', '')
35
+ requested_name = req_data.get('username', 'external_user')
32
36
  filename = req_data.get('filename', False)
33
37
  base64_content = req_data.get('content', '')
34
38
  metadata = req_data.get('metadata', {})
@@ -38,6 +42,11 @@ class FileStoreView(MethodView):
38
42
  if not company:
39
43
  return jsonify({"error": f"La empresa {company_short_name} no existe"}), 400
40
44
 
45
+ # get access credentials
46
+ iaut = self.iauthentication.verify(company_short_name, requested_name)
47
+ if not iaut.get("success"):
48
+ return jsonify(iaut), 401
49
+
41
50
  # get the file content from base64
42
51
  content = base64.b64decode(base64_content)
43
52
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 0.21.0
3
+ Version: 0.22.1
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -1,19 +1,19 @@
1
1
  iatoolkit/__init__.py,sha256=4PWjMJjktixtrxF6BY405qyA50Sv967kEP2x-oil6qk,1120
2
- iatoolkit/base_company.py,sha256=GacYVVujoxAwUhofRn5eZcR-s1bHtSQXLD-0SRnWSC0,4595
2
+ iatoolkit/base_company.py,sha256=uFJmy77LPAceVqkTeuJqo15-auDiq4aTwvC_bbBD0mQ,4607
3
3
  iatoolkit/cli_commands.py,sha256=G5L9xQXZ0lVFXQWBaE_KEZHyfuiT6PL1nTQRoSdnBzc,2302
4
4
  iatoolkit/company_registry.py,sha256=tduqt3oV8iDX_IB1eA7KIgvIxE4edTcy-3qZIXh3Lzw,2549
5
- iatoolkit/iatoolkit.py,sha256=7VR04Pl5HsgcrLHfFaxiFJTqF2NZj3eeOgz5EiZIDyY,17321
5
+ iatoolkit/iatoolkit.py,sha256=ByINe4luvUU0C5ERGt6M8keymVgMwJSNR9_eb_34L5s,17354
6
6
  iatoolkit/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  iatoolkit/common/auth.py,sha256=83WsyHF7TdjPYfAA-da-waizlWLIqSTx-2z4pI4LAnw,8471
8
8
  iatoolkit/common/exceptions.py,sha256=EXx40n5htp7UiOM6P1xfJ9U6NMcADqm62dlFaKz7ICU,1154
9
- iatoolkit/common/routes.py,sha256=7GC_KdyJuOw4CGOHYZP1_fBnLNciSNQAsF1g4O5Tq2k,5544
9
+ iatoolkit/common/routes.py,sha256=st_IC0pSddbkmQb-zb5sSk7n2_WVLGZgKCg645ADzcM,6097
10
10
  iatoolkit/common/session_manager.py,sha256=7D_RuJs60w-1zDr3fOGEz9JW7IZlSXuUHgUT87CzaUo,472
11
11
  iatoolkit/common/util.py,sha256=08js3KLJTXICOd5sgwDp2u_kDaZO_0xG4BIuzWZnLo8,15535
12
12
  iatoolkit/infra/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
13
13
  iatoolkit/infra/call_service.py,sha256=iRk9VxbXaAwlLIl8fUzGDWIAdzwfsbs1MtP84YeENxg,4929
14
14
  iatoolkit/infra/gemini_adapter.py,sha256=kXV-t5i9GmWBafUPX2kAyiqvcT7GPoxHylcCUWG_c_U,15051
15
15
  iatoolkit/infra/google_chat_app.py,sha256=_uKWxeacHH6C5a4FVx0YZjBn1tL-x_MIQV9gqgWGAjo,1937
16
- iatoolkit/infra/llm_client.py,sha256=3w2BUQmnyq9Tbc9_CI2JjxZQ7pGVlMF_GmUdqBa9O7Y,18618
16
+ iatoolkit/infra/llm_client.py,sha256=6kSbhgWjH9ENxCzVSpMRg_6uPTHvCuGB0cwSGFDtrZ4,18633
17
17
  iatoolkit/infra/llm_proxy.py,sha256=cHyNxUpVE4UDoWUfvSGfGCrIUFPTrpWZOixELQTsGFY,5744
18
18
  iatoolkit/infra/llm_response.py,sha256=YUUQPBHzmP3Ce6-t0kKMRIpowvh7de1odSoefEByIvI,904
19
19
  iatoolkit/infra/mail_app.py,sha256=PLGZdEs7LQ_9bmMRRxz0iqQdNa4xToAFyf9tg75wK8U,6103
@@ -37,7 +37,7 @@ iatoolkit/repositories/vs_repo.py,sha256=UkpmQQiocgM5IwRBmmWhw3HHzHP6zK1nN3J3TcQ
37
37
  iatoolkit/services/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
38
38
  iatoolkit/services/benchmark_service.py,sha256=CdbFYyS3FHFhNzWQEa9ZNjUlmON10DT1nKNbZQ1EUi8,5880
39
39
  iatoolkit/services/branding_service.py,sha256=gXj9Lj6EIFNIHT6wAHia5lr4_2a2sD-ExMbewno5YD8,7505
40
- iatoolkit/services/dispatcher_service.py,sha256=ykR1ye6McyCCuaBgwH6r3-PqcLAr4v4ApkPazMSBzbs,14040
40
+ iatoolkit/services/dispatcher_service.py,sha256=ygdaaTbt2mEIzWwPcJ-PbgzW6W16BbguR5U4Ne4oqjM,14087
41
41
  iatoolkit/services/document_service.py,sha256=nMXrNtbHQuc9pSaten0LvKY0kT8_WngBDmZJUP3jNPw,5936
42
42
  iatoolkit/services/excel_service.py,sha256=CJGhu7cQl9J6y_ZWSJ-M63Xm-RXR9Zs66oOR2NJErZQ,3868
43
43
  iatoolkit/services/file_processor_service.py,sha256=B1sUUhZNFf-rT4_1wrD38GKNoBFMp2g0dYrXYMCWe2E,4122
@@ -70,13 +70,13 @@ iatoolkit/static/js/chat_main.js,sha256=lpTM_E2HBJMdh1d43nT6niecCDrLbACKkPLcQbBI
70
70
  iatoolkit/static/styles/chat_iatoolkit.css,sha256=WgzKKyFRuQU8SozX1sWSN7b66SxVoKIHDwpK6V-xL6g,11417
71
71
  iatoolkit/static/styles/chat_info.css,sha256=17DbgoNYE21VYWfb5L9-QLCpD2R1idK4imKRLwXtJLY,1058
72
72
  iatoolkit/static/styles/chat_modal.css,sha256=mdfjrJtmUn3O9rKwIGjJc-oSNmJGnzUY1aAJqEfPh38,4301
73
- iatoolkit/static/styles/landing_page.css,sha256=Dbu5LwyPpHJf4-IxvWvMGdWd4c1SEL0xWd6_iosvdPU,3590
73
+ iatoolkit/static/styles/landing_page.css,sha256=O0LJv4MQbYDbiAG2O0UHGfk6vBU3QBsq-VRorAUuaSU,3802
74
74
  iatoolkit/static/styles/llm_output.css,sha256=AlxgRSOleeCk2dLAqFWVaQ-jwZiJjcpC5rHuUv3T6VU,2312
75
75
  iatoolkit/system_prompts/format_styles.prompt,sha256=MSMe1qvR3cF_0IbFshn8R0z6Wx6VCHQq1p37rpu5wwk,3576
76
76
  iatoolkit/system_prompts/query_main.prompt,sha256=w_9ybgWgiQH4V_RbAXqsvz0M7oOuiyhxcwf-D0CgfA4,3017
77
77
  iatoolkit/system_prompts/sql_rules.prompt,sha256=y4nURVnb9AyFwt-lrbMNBHHtZlhk6kC9grYoOhRnrJo,59174
78
78
  iatoolkit/templates/_branding_styles.html,sha256=x0GJmY1WWpPxKBUoqmxh685_1c6-4uLJWNPU6r81uAc,1912
79
- iatoolkit/templates/_login_widget.html,sha256=hQgRZgBjEuJP5cFFdnC9YHJLt5SVZXIyqpQg-Xh64f4,1964
79
+ iatoolkit/templates/_login_widget.html,sha256=3SyzFgqCjkfBD1zepFuhfdUOSTuCHem6fS3BdgqN4Nw,1998
80
80
  iatoolkit/templates/_navbar.html,sha256=o1PvZE5ueLmVpGUAmsjtu-vS_WPROTlJc2sTXl6AS4Y,360
81
81
  iatoolkit/templates/about.html,sha256=ciC08grUVz5qLzdzDDqDX31xirg5PrJIRYabWpV9oA8,294
82
82
  iatoolkit/templates/base.html,sha256=Bd_dBk_wiAhX0DPQHJAdPtCBBq2xK1J1Z2b9p3Wn0e8,2214
@@ -86,8 +86,8 @@ iatoolkit/templates/chat_modals.html,sha256=ngKk0L8qnWteBDLAqCKv8-55LWNH3-HwVyk2
86
86
  iatoolkit/templates/error.html,sha256=BNF-7z8AYL5vF4ZMUFMrOBt8c85kCFrm9qSHn9EiHWg,540
87
87
  iatoolkit/templates/forgot_password.html,sha256=NRZqbNHJXSLNArF_KLbzuem-U57v07awS0ikI_DJbfM,2360
88
88
  iatoolkit/templates/header.html,sha256=179agI7rnYwP_rvJNXIiVde5E8Ec5649_XKq6eew2Hk,1263
89
- iatoolkit/templates/home.html,sha256=Bq4wSWrd9E2VRFQ4Br_nqbhipYxZTJfRMiD0hjaSNsM,7942
90
- iatoolkit/templates/index.html,sha256=S0fraGK1zgygbCPRi4BlDgduNcOJZDmwqJVmYuh8hF0,6029
89
+ iatoolkit/templates/home.html,sha256=76DwD8joOLphNyV13JgBQgGhVH1Nx-q5-pBPhrAxZHw,7922
90
+ iatoolkit/templates/index.html,sha256=TRSV9HN7lqbvnWYSk7hwXOZ2evrDg23Kq5FUqIQnWNc,6390
91
91
  iatoolkit/templates/login.html,sha256=r4hy7MsQkfDqi6pBRNkkRiFr3GPSoHCT89R5lQLUWZc,1991
92
92
  iatoolkit/templates/onboarding_shell.html,sha256=at7VXh9vQmDiWu2mJbc6NkzEVlu8I8Xgn6_31JltrW0,7477
93
93
  iatoolkit/templates/signup.html,sha256=9ArDvcNQgHFR2dwxy-37AXzGUOeOsT7Nz5u0y6fAB3U,4385
@@ -97,7 +97,7 @@ iatoolkit/views/change_password_view.py,sha256=tM0woZyKdhY4XYjS_YXg2sKq3RYkXGfcq
97
97
  iatoolkit/views/chat_token_request_view.py,sha256=wf32_A2Sq8NHYWshCwL10Tovd1znLoD0jQjzutR3sVE,4408
98
98
  iatoolkit/views/download_file_view.py,sha256=1gZ0ipqeCn39sTrJFo1-tlewlcSF7s_YNTvE4qd0HOw,2010
99
99
  iatoolkit/views/external_login_view.py,sha256=VyDrncAbtowZ_gOmk1kXoWhNw78xHGaz4LijIRmtWY8,6562
100
- iatoolkit/views/file_store_view.py,sha256=hUm5wX4E5oqJJEPEAObEj-nPiRp5EJIICULSfAWmHCs,1933
100
+ iatoolkit/views/file_store_view.py,sha256=mmr8U4_ycSe22kdGmVfzXpJPJffo5JRGNjk3-bUdVRw,2355
101
101
  iatoolkit/views/forgot_password_view.py,sha256=-qKJeeOBqJFdvDUk7rCNg1E1cDQnJQkozPpb0T0FgwA,3159
102
102
  iatoolkit/views/history_view.py,sha256=fzZrnC-RySa7ngcPe2Hmf9_s3imx6VB6MKROMcNpjoU,2064
103
103
  iatoolkit/views/home_view.py,sha256=TihO2flkelJa9j6a0FKCMVhD-2X7BhemonB7LTne4x8,1248
@@ -111,7 +111,7 @@ iatoolkit/views/tasks_review_view.py,sha256=keLsLCyOTTlcoIapnB_lbuSvLwrPVZVpBiFC
111
111
  iatoolkit/views/tasks_view.py,sha256=a3anTXrJTTvbQuc6PSpOzidLKQFL4hWa7PI2Cppcz8w,4110
112
112
  iatoolkit/views/user_feedback_view.py,sha256=G37zmP8P4LvZrSymNJ5iFXhLZg1A3BEwRfTpH1Iam5w,2652
113
113
  iatoolkit/views/verify_user_view.py,sha256=7XLSaxvs8LjBr3cYOUDa9B8DqW_50IGlq0IvmOQcD0Y,2340
114
- iatoolkit-0.21.0.dist-info/METADATA,sha256=pJi-Qawe3-ZHeYgPwA-M_atWI7ZCnEPhLs-1xZ54e3U,9301
115
- iatoolkit-0.21.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
- iatoolkit-0.21.0.dist-info/top_level.txt,sha256=V_w4QvDx0b1RXiy8zTCrD1Bp7AZkFe3_O0-9fMiwogg,10
117
- iatoolkit-0.21.0.dist-info/RECORD,,
114
+ iatoolkit-0.22.1.dist-info/METADATA,sha256=15bveuUgweJKf_HYeL36lKc6kQytFpKAusbzEUR6TEo,9301
115
+ iatoolkit-0.22.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
+ iatoolkit-0.22.1.dist-info/top_level.txt,sha256=V_w4QvDx0b1RXiy8zTCrD1Bp7AZkFe3_O0-9fMiwogg,10
117
+ iatoolkit-0.22.1.dist-info/RECORD,,