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

@@ -13,16 +13,14 @@ import os
13
13
  def logout(company_short_name: str):
14
14
  SessionManager.clear()
15
15
  flash("Has cerrado sesión correctamente", "info")
16
- if company_short_name:
17
- return redirect(url_for('login', company_short_name=company_short_name))
18
- else:
19
- return redirect(url_for('home'))
16
+ return redirect(url_for('index', company_short_name=company_short_name))
20
17
 
21
18
 
22
19
  # this function register all the views
23
20
  def register_views(injector, app):
24
21
 
25
22
  from iatoolkit.views.index_view import IndexView
23
+ from iatoolkit.views.init_context_view import InitContextView
26
24
  from iatoolkit.views.llmquery_view import LLMQueryView
27
25
  from iatoolkit.views.tasks_view import TaskView
28
26
  from iatoolkit.views.tasks_review_view import TaskReviewView
@@ -39,15 +37,16 @@ def register_views(injector, app):
39
37
  from iatoolkit.views.chat_token_request_view import ChatTokenRequestView
40
38
  from iatoolkit.views.download_file_view import DownloadFileView
41
39
 
42
- # landing page
40
+ # iatoolkit home page
43
41
  app.add_url_rule('/<company_short_name>', view_func=IndexView.as_view('index'))
44
42
 
45
- # login testing /login_testing
46
- app.add_url_rule('/login_testing', view_func=HomeView.as_view('home'))
43
+ # init (ir reset) the context (with api-key)
44
+ app.add_url_rule('/<company_short_name>/<external_user_id>/init-context',
45
+ view_func=InitContextView.as_view('init-context'))
47
46
 
48
- # login for external portals
47
+ # external login (with api-key)
49
48
  app.add_url_rule('/<company_short_name>/initiate_external_chat',
50
- view_func=InitiateExternalChatView.as_view('initiate_external_chat'))
49
+ view_func=InitiateExternalChatView.as_view('initiate_external_chat'))
51
50
  app.add_url_rule('/<company_short_name>/external_login',
52
51
  view_func=ExternalChatLoginView.as_view('external_login'))
53
52
  app.add_url_rule('/auth/chat_token',
@@ -73,6 +72,9 @@ def register_views(injector, app):
73
72
  app.add_url_rule('/tasks/review/<int:task_id>', view_func=TaskReviewView.as_view('tasks-review'))
74
73
  app.add_url_rule('/load', view_func=FileStoreView.as_view('load'))
75
74
 
75
+ # login testing /login_testing
76
+ app.add_url_rule('/login_testing', view_func=HomeView.as_view('home'))
77
+
76
78
  app.add_url_rule(
77
79
  '/about', # URL de la ruta
78
80
  view_func=lambda: render_template('about.html'))
@@ -0,0 +1,156 @@
1
+ /* static/styles/landing_page.css */
2
+
3
+ /* --- Configuración General --- */
4
+ body {
5
+ background-color: #ffffff; /* Cambiado a blanco para que el hero destaque */
6
+ }
7
+
8
+ /* --- 1. Barra de Navegación Superior --- */
9
+ .landing-navbar {
10
+ background-color: var(--brand-primary-color, #0d6efd);
11
+ padding: 1rem 1.5rem;
12
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
13
+ }
14
+
15
+ .landing-navbar .navbar-brand {
16
+ color: var(--brand-text-on-primary, #FFFFFF);
17
+ font-weight: 700;
18
+ font-size: 1.8rem; /* Aumentado el tamaño del texto */
19
+ }
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 */
25
+ }
26
+
27
+ /* Estilos para el texto de la propuesta de valor */
28
+ .value-proposition {
29
+ display: flex;
30
+ flex-direction: column;
31
+ justify-content: center;
32
+ height: 100%;
33
+ /* Se ajusta el padding para la nueva posición a la izquierda */
34
+ padding-left: 2rem;
35
+ }
36
+
37
+ .value-proposition .hero-title {
38
+ font-size: 2.8rem;
39
+ font-weight: 700;
40
+ line-height: 1.2;
41
+ color: #212529;
42
+ }
43
+
44
+ .value-proposition .hero-accelerator {
45
+ color: var(--brand-primary-color, #0d6efd);
46
+ }
47
+
48
+ .value-proposition .hero-subtitle {
49
+ font-size: 1.1rem;
50
+ color: #6c757d;
51
+ margin-top: 1.5rem;
52
+ }
53
+
54
+ /* --- Estilo para el título del widget de login --- */
55
+ .hero-section .bg-light h4 {
56
+ color: var(--brand-primary-color, #0d6efd);
57
+ }
58
+
59
+ /* --- Estilo para el texto introductorio del widget --- */
60
+ .widget-intro-text {
61
+ font-style: italic;
62
+ font-size: 0.9rem;
63
+ line-height: 1.4;
64
+ }
65
+
66
+
67
+ /* --- 3. Sección de Características --- */
68
+ .features-section {
69
+ padding: 5rem 0;
70
+ background-color: #ffffff; /* Fondo blanco para esta sección */
71
+ }
72
+
73
+ /* (El resto del archivo CSS permanece sin cambios) */
74
+ .feature-item {
75
+ text-align: center;
76
+ padding: 2rem;
77
+ background-color: #f8f9fa; /* Fondo gris claro para cada tarjeta */
78
+ border: 1px solid #dee2e6;
79
+ border-radius: 0.5rem;
80
+ height: 100%; /* CLAVE: Asegura que todas las tarjetas en una fila tengan el mismo alto */
81
+ }
82
+
83
+ .feature-icon {
84
+ font-size: 3rem;
85
+ color: var(--brand-primary-color); /* Usar color primario para más impacto */
86
+ margin-bottom: 1.5rem;
87
+ display: inline-block;
88
+ }
89
+
90
+ .feature-item h3 {
91
+ font-size: 1.4rem;
92
+ font-weight: 600;
93
+ margin-bottom: 1rem;
94
+ }
95
+
96
+ .feature-item p {
97
+ color: #6c757d;
98
+ }
99
+
100
+ .opensource-box {
101
+ background-color: #343a40;
102
+ color: #f8f9fa;
103
+ padding: 2rem;
104
+ border-radius: 0.5rem;
105
+ height: 100%; /* CLAVE: Asegura que tenga el mismo alto */
106
+ display: flex;
107
+ flex-direction: column;
108
+ justify-content: space-between;
109
+ text-align: center;
110
+ }
111
+
112
+ .opensource-icon {
113
+ font-size: 3rem; /* Tamaño consistente con los otros iconos */
114
+ color: var(--brand-text-on-primary, #FFFFFF);
115
+ opacity: 0.9;
116
+ margin-bottom: 1.5rem;
117
+ }
118
+
119
+ .opensource-content h3 {
120
+ font-weight: 600;
121
+ font-size: 1.4rem; /* Tamaño consistente */
122
+ margin-bottom: 1rem;
123
+ }
124
+
125
+ .opensource-content p {
126
+ margin-bottom: 1.5rem;
127
+ color: #adb5bd;
128
+ }
129
+
130
+ .opensource-content .btn {
131
+ width: 100%;
132
+ }
133
+
134
+ .pypi-link {
135
+ margin-top: 1.5rem;
136
+ padding-top: 1.5rem;
137
+ border-top: 1px solid #495057;
138
+ font-size: 0.9rem;
139
+ color: #ced4da;
140
+ }
141
+
142
+ .pypi-link code {
143
+ background-color: #212529;
144
+ padding: 0.2rem 0.5rem;
145
+ border-radius: 4px;
146
+ color: #e83e8c;
147
+ }
148
+
149
+ /* --- 4. Footer --- */
150
+ .landing-footer {
151
+ background-color: #343a40;
152
+ color: #adb5bd;
153
+ padding: 2rem 0;
154
+ text-align: center;
155
+ font-size: 0.9rem;
156
+ }
@@ -1,3 +1,4 @@
1
+ <!-- templates/_branding_styles.html -->
1
2
  <style>
2
3
  {{ branding.css_variables | safe }}
3
4
 
@@ -9,9 +10,8 @@
9
10
  transition: all 0.2s ease-in-out;
10
11
  }
11
12
  .btn-branded-primary:hover {
12
- background-color: #e9ecef;
13
- color: var(--brand-primary-color);
14
- border-color: var(--brand-primary-color);
13
+ color: var(--brand-text-on-primary);
14
+ box-shadow: inset 0 0 0 200px rgba(0, 0, 0, 0.15);
15
15
  }
16
16
  .btn-branded-secondary {
17
17
  background-color: var(--brand-secondary-color);
@@ -20,11 +20,34 @@
20
20
  transition: all 0.2s ease-in-out;
21
21
  }
22
22
  .btn-branded-secondary:hover {
23
- background-color: #e9ecef;
24
- color: var(--brand-secondary-color);
25
- border-color: var(--brand-secondary-color);
23
+ color: var(--brand-text-on-secondary);
24
+ box-shadow: inset 0 0 0 200px rgba(0, 0, 0, 0.15);
26
25
  }
27
26
  .form-title {
28
27
  color: var(--brand-primary-color);
29
28
  }
29
+
30
+ /* --- ESTILOS CORREGIDOS Y MÁS ESPECÍFICOS PARA SWEETALERT2 --- */
31
+
32
+ /* Botón de Confirmar (OK) */
33
+ .swal2-confirm.custom-confirm-button {
34
+ background-color: var(--brand-primary-color) !important;
35
+ color: var(--brand-text-on-primary) !important;
36
+ border: 1px solid var(--brand-primary-color) !important;
37
+ box-shadow: none !important;
38
+ }
39
+ .swal2-confirm.custom-confirm-button:hover {
40
+ box-shadow: inset 0 0 0 200px rgba(0, 0, 0, 0.15) !important;
41
+ }
42
+
43
+ /* Botón de Cancelar */
44
+ .swal2-cancel.custom-cancel-button {
45
+ background-color: var(--brand-secondary-color) !important;
46
+ color: var(--brand-text-on-secondary) !important;
47
+ border: 1px solid var(--brand-secondary-color) !important;
48
+ box-shadow: none !important;
49
+ }
50
+ .swal2-cancel.custom-cancel-button:hover {
51
+ box-shadow: inset 0 0 0 200px rgba(0, 0, 0, 0.15) !important;
52
+ }
30
53
  </style>
@@ -19,7 +19,8 @@
19
19
  </div>
20
20
  <div class="mb-3">
21
21
  <label for="password" class="form-label d-block text-muted">Contraseña</label>
22
- <input type="password" id="password" name="password" class="form-control" required>
22
+ <input type="password" id="password" name="password"
23
+ class="form-control" required>
23
24
  </div>
24
25
  <button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2">
25
26
  Ingresar
@@ -1,45 +1,64 @@
1
1
  {% extends "base.html" %}
2
2
 
3
- {% block title %}Cambiar Contraseña{% endblock %}
3
+ {% block title %}Cambiar Contraseña - {{ company.name }}{% endblock %}
4
4
 
5
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>
6
+ <!-- 1. Incluimos los estilos de branding reutilizables -->
7
+ {% include '_branding_styles.html' %}
27
8
 
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>
9
+ <!-- Enlazamos la hoja de estilos de la landing page para reutilizar estilos -->
10
+ <link rel="stylesheet" href="{{ iatoolkit_base_url }}/static/styles/landing_page.css">
11
+
12
+ <!-- 2. Incluimos la barra de navegación reutilizable -->
13
+ {% include '_navbar.html' %}
14
+
15
+ <!-- 3. Sección contenedora para centrar el contenido -->
16
+ <section class="hero-section">
17
+ <div class="container">
18
+ <div class="row justify-content-center">
19
+ <div class="col-lg-6 col-md-8">
20
+ <div class="border rounded p-4 p-md-5 shadow-sm bg-light">
21
+ <h4 class="form-title fw-bold mb-3 text-center">Crear Nueva Contraseña</h4>
22
+
23
+ <p class="text-muted text-center mb-4">
24
+ Estás cambiando la contraseña para <strong>{{ email }}</strong>.
25
+ </p>
36
26
 
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>
27
+ <form action="{{ url_for('change_password', company_short_name=company_short_name, token=token) }}" method="post">
41
28
 
42
- </form>
43
- </div>
44
- </div>
29
+ <!-- CAMPO RESTAURADO: Código Temporal -->
30
+ <div class="mb-3">
31
+ <label for="temp_code" class="form-label text-secondary">Código Temporal</label>
32
+ <input type="text" id="temp_code" name="temp_code" class="form-control"
33
+ required value="{{ form_data.temp_code if form_data else '' }}"
34
+ placeholder="Revisa tu correo electrónico">
35
+ </div>
36
+
37
+ <div class="mb-3">
38
+ <label for="new_password" class="form-label text-secondary">Nueva Contraseña</label>
39
+ <input type="password" id="new_password" name="new_password" class="form-control" required>
40
+ <div class="d-flex align-items-start text-muted mt-2" style="font-size: 0.8rem;">
41
+ <i class="bi bi-info-circle me-2" style="font-size: 0.9rem; line-height: 1.4;"></i>
42
+ <span>Debe contener al menos 8 caracteres, mayúscula, minúscula, número y un carácter especial.</span>
43
+ </div>
44
+ </div>
45
+
46
+ <div class="mb-3">
47
+ <label for="confirm_password" class="form-label text-secondary">Confirmar Nueva Contraseña</label>
48
+ <input type="password" id="confirm_password" name="confirm_password" class="form-control" required>
49
+ </div>
50
+
51
+ <button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2 mt-3">Guardar Contraseña</button>
52
+ </form>
53
+
54
+ <div class="text-center mt-4 pt-3" style="border-top: 1px solid #e0e0e0;">
55
+ <a href="{{ url_for('index', company_short_name=company_short_name) }}" class="text-muted text-decoration-none fw-semibold">
56
+ <i class="bi bi-arrow-left me-1"></i>Volver al inicio
57
+ </a>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </section>
45
64
  {% endblock %}
@@ -4,8 +4,9 @@
4
4
  # IAToolkit is open source software.
5
5
 
6
6
  from flask.views import MethodView
7
- from flask import render_template, request
7
+ from flask import render_template, request, url_for, session, redirect
8
8
  from iatoolkit.services.profile_service import ProfileService
9
+ from iatoolkit.services.branding_service import BrandingService
9
10
  from itsdangerous import URLSafeTimedSerializer, SignatureExpired
10
11
  from flask_bcrypt import Bcrypt
11
12
  from injector import inject
@@ -14,8 +15,11 @@ import os
14
15
 
15
16
  class ChangePasswordView(MethodView):
16
17
  @inject
17
- def __init__(self, profile_service: ProfileService):
18
+ def __init__(self,
19
+ profile_service: ProfileService,
20
+ branding_service: BrandingService):
18
21
  self.profile_service = profile_service
22
+ self.branding_service = branding_service # 3. Guardar la instancia
19
23
 
20
24
  self.serializer = URLSafeTimedSerializer(os.getenv("PASS_RESET_KEY"))
21
25
  self.bcrypt = Bcrypt()
@@ -26,16 +30,20 @@ class ChangePasswordView(MethodView):
26
30
  if not company:
27
31
  return render_template('error.html', message=f"Empresa no encontrada: {company_short_name}"), 404
28
32
 
33
+ branding_data = self.branding_service.get_company_branding(company)
34
+
29
35
  try:
30
36
  # Decodificar el token
31
37
  email = self.serializer.loads(token, salt='password-reset', max_age=3600)
32
38
  except SignatureExpired as e:
33
39
  return render_template('forgot_password.html',
40
+ branding=branding_data,
34
41
  alert_message="El enlace de cambio de contraseña ha expirado. Por favor, solicita uno nuevo.")
35
42
 
36
43
  return render_template('change_password.html',
37
44
  company_short_name=company_short_name,
38
45
  company=company,
46
+ branding=branding_data,
39
47
  token=token, email=email)
40
48
 
41
49
  def post(self, company_short_name: str, token: str):
@@ -44,6 +52,7 @@ class ChangePasswordView(MethodView):
44
52
  if not company:
45
53
  return render_template('error.html', message=f"Empresa no encontrada: {company_short_name}"), 404
46
54
 
55
+ branding_data = self.branding_service.get_company_branding(company)
47
56
  try:
48
57
  # Decodificar el token
49
58
  email = self.serializer.loads(token, salt='password-reset', max_age=3600)
@@ -51,6 +60,7 @@ class ChangePasswordView(MethodView):
51
60
  return render_template('forgot_password.html',
52
61
  company_short_name=company_short_name,
53
62
  company=company,
63
+ branding=branding_data,
54
64
  alert_message="El enlace de cambio de contraseña ha expirado. Por favor, solicita uno nuevo.")
55
65
 
56
66
  try:
@@ -72,17 +82,16 @@ class ChangePasswordView(MethodView):
72
82
  token=token,
73
83
  company_short_name=company_short_name,
74
84
  company=company,
85
+ branding=branding_data,
75
86
  form_data={"temp_code": temp_code,
76
87
  "new_password": new_password,
77
88
  "confirm_password": confirm_password},
78
89
  alert_message=response["error"]), 400
79
90
 
80
-
81
- return render_template('login.html',
82
- company_short_name=company_short_name,
83
- company=company,
84
- alert_icon='success',
85
- alert_message="Tu contraseña ha sido restablecida exitosamente. Ahora puedes iniciar sesión.")
91
+ # Éxito: Guardar mensaje en sesión y redirigir
92
+ session['alert_message'] = "Tu contraseña ha sido restablecida exitosamente. Ahora puedes iniciar sesión."
93
+ session['alert_icon'] = 'success'
94
+ return redirect(url_for('index', company_short_name=company_short_name))
86
95
 
87
96
  except Exception as e:
88
97
  return render_template("error.html",
@@ -4,7 +4,7 @@
4
4
  # IAToolkit is open source software.
5
5
 
6
6
  from flask.views import MethodView
7
- from flask import render_template, request, url_for, flash, redirect, session
7
+ from flask import render_template, request, url_for, redirect, session
8
8
  from injector import inject
9
9
  from iatoolkit.services.profile_service import ProfileService
10
10
  from iatoolkit.services.branding_service import BrandingService
@@ -0,0 +1,35 @@
1
+ from flask.views import MethodView
2
+ from injector import inject
3
+ from iatoolkit.common.auth import IAuthentication
4
+ from iatoolkit.services.query_service import QueryService
5
+ from flask import jsonify
6
+ import logging
7
+
8
+ class InitContextView(MethodView):
9
+
10
+ @inject
11
+ def __init__(self,
12
+ iauthentication: IAuthentication,
13
+ query_service: QueryService
14
+ ):
15
+ self.iauthentication = iauthentication
16
+ self.query_service = query_service
17
+
18
+ def get(self, company_short_name: str, external_user_id: str):
19
+ # 1. get access credentials
20
+ iaut = self.iauthentication.verify(company_short_name, external_user_id)
21
+ if not iaut.get("success"):
22
+ return jsonify(iaut), 401
23
+
24
+ try:
25
+ # initialize the context
26
+ self.query_service.llm_init_context(
27
+ company_short_name=company_short_name,
28
+ external_user_id=external_user_id
29
+ )
30
+
31
+ return {'status': 'OK'}, 200
32
+ except Exception as e:
33
+ logging.exception(
34
+ f"Error inesperado al inicializar el contexto durante el login para company {company_short_name}: {e}")
35
+ return jsonify({"error_message": str(e)}), 500
@@ -55,7 +55,7 @@ class InitiateLoginView(MethodView):
55
55
  "email": email,
56
56
  "password": password,
57
57
  },
58
- alert_message=response["error"]), 400
58
+ alert_message=response["message"]), 400
59
59
 
60
60
  # 2. Get branding and onboarding data for the shell page
61
61
  branding_data = self.branding_service.get_company_branding(company)
@@ -4,7 +4,7 @@
4
4
  # IAToolkit is open source software.
5
5
 
6
6
  from flask.views import MethodView
7
- from flask import render_template
7
+ from flask import render_template, url_for, redirect, session
8
8
  from iatoolkit.services.profile_service import ProfileService
9
9
  from itsdangerous import URLSafeTimedSerializer, SignatureExpired
10
10
  from injector import inject
@@ -43,11 +43,11 @@ class VerifyAccountView(MethodView):
43
43
  token=token,
44
44
  alert_message=response["error"]), 400
45
45
 
46
- return render_template('login.html',
47
- company=company,
48
- company_short_name=company_short_name,
49
- alert_icon='success',
50
- alert_message=response['message'])
46
+ # Guardamos el mensaje y el icono en la sesión manualmente
47
+ session['alert_message'] = response['message']
48
+ session['alert_icon'] = "success"
49
+ return redirect(url_for('index', company_short_name=company_short_name))
50
+
51
51
  except Exception as e:
52
52
  return render_template("error.html",
53
53
  company=company,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 0.19.0
3
+ Version: 0.21.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -6,7 +6,7 @@ iatoolkit/iatoolkit.py,sha256=7VR04Pl5HsgcrLHfFaxiFJTqF2NZj3eeOgz5EiZIDyY,17321
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=F7jKOgiXNxbnh1nwhiZ-_wOTJo2HMVwN0JL708J8o6s,5349
9
+ iatoolkit/common/routes.py,sha256=7GC_KdyJuOw4CGOHYZP1_fBnLNciSNQAsF1g4O5Tq2k,5544
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
@@ -70,16 +70,17 @@ 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
74
  iatoolkit/static/styles/llm_output.css,sha256=AlxgRSOleeCk2dLAqFWVaQ-jwZiJjcpC5rHuUv3T6VU,2312
74
75
  iatoolkit/system_prompts/format_styles.prompt,sha256=MSMe1qvR3cF_0IbFshn8R0z6Wx6VCHQq1p37rpu5wwk,3576
75
76
  iatoolkit/system_prompts/query_main.prompt,sha256=w_9ybgWgiQH4V_RbAXqsvz0M7oOuiyhxcwf-D0CgfA4,3017
76
77
  iatoolkit/system_prompts/sql_rules.prompt,sha256=y4nURVnb9AyFwt-lrbMNBHHtZlhk6kC9grYoOhRnrJo,59174
77
- iatoolkit/templates/_branding_styles.html,sha256=LWNEdNzsD9oJeUFkGiE1CumfIcXDcdbvpYJN_JZs698,984
78
- iatoolkit/templates/_login_widget.html,sha256=nPNbPKSLN8OulXab9m-sCJpKhmkR6N9LEEoZy2QFp_8,1949
78
+ iatoolkit/templates/_branding_styles.html,sha256=x0GJmY1WWpPxKBUoqmxh685_1c6-4uLJWNPU6r81uAc,1912
79
+ iatoolkit/templates/_login_widget.html,sha256=hQgRZgBjEuJP5cFFdnC9YHJLt5SVZXIyqpQg-Xh64f4,1964
79
80
  iatoolkit/templates/_navbar.html,sha256=o1PvZE5ueLmVpGUAmsjtu-vS_WPROTlJc2sTXl6AS4Y,360
80
81
  iatoolkit/templates/about.html,sha256=ciC08grUVz5qLzdzDDqDX31xirg5PrJIRYabWpV9oA8,294
81
82
  iatoolkit/templates/base.html,sha256=Bd_dBk_wiAhX0DPQHJAdPtCBBq2xK1J1Z2b9p3Wn0e8,2214
82
- iatoolkit/templates/change_password.html,sha256=DFfQSFcZ2YJZNFis2IXfzEKStxTf4i9f4eQ_6GiyNs8,2342
83
+ iatoolkit/templates/change_password.html,sha256=G5a3hYLTpz_5Q_eZ4LNcYSqLeW-CuT4NCHD8bkhAd9k,3573
83
84
  iatoolkit/templates/chat.html,sha256=UeVY2K2DIgK5N5MR-8HcAK97reMdSYE-wL2Xrg3JgUA,9485
84
85
  iatoolkit/templates/chat_modals.html,sha256=ngKk0L8qnWteBDLAqCKv8-55LWNH3-HwVyk2of6ylWo,5510
85
86
  iatoolkit/templates/error.html,sha256=BNF-7z8AYL5vF4ZMUFMrOBt8c85kCFrm9qSHn9EiHWg,540
@@ -92,24 +93,25 @@ iatoolkit/templates/onboarding_shell.html,sha256=at7VXh9vQmDiWu2mJbc6NkzEVlu8I8X
92
93
  iatoolkit/templates/signup.html,sha256=9ArDvcNQgHFR2dwxy-37AXzGUOeOsT7Nz5u0y6fAB3U,4385
93
94
  iatoolkit/templates/test.html,sha256=rwNtxC83tbCl5COZFXYvmRBxxmgFJtPNuVBd_nq9KWY,133
94
95
  iatoolkit/views/__init__.py,sha256=5JqK9sZ6jBuK83zDQokUhxQ0wuJJJ9DXB8pYCLkX7X4,102
95
- iatoolkit/views/change_password_view.py,sha256=rSebwecI1zwBgR2yvAhcfMwWpGDa4QbVAIllgtSOo9k,3940
96
+ iatoolkit/views/change_password_view.py,sha256=tM0woZyKdhY4XYjS_YXg2sKq3RYkXGfcq_eVAKrNvNM,4498
96
97
  iatoolkit/views/chat_token_request_view.py,sha256=wf32_A2Sq8NHYWshCwL10Tovd1znLoD0jQjzutR3sVE,4408
97
98
  iatoolkit/views/download_file_view.py,sha256=1gZ0ipqeCn39sTrJFo1-tlewlcSF7s_YNTvE4qd0HOw,2010
98
99
  iatoolkit/views/external_login_view.py,sha256=VyDrncAbtowZ_gOmk1kXoWhNw78xHGaz4LijIRmtWY8,6562
99
100
  iatoolkit/views/file_store_view.py,sha256=hUm5wX4E5oqJJEPEAObEj-nPiRp5EJIICULSfAWmHCs,1933
100
- iatoolkit/views/forgot_password_view.py,sha256=CjMIW5LblPAyTZ3uqL1_mqRTXCYTT1O8qCyVhztm5HY,3166
101
+ iatoolkit/views/forgot_password_view.py,sha256=-qKJeeOBqJFdvDUk7rCNg1E1cDQnJQkozPpb0T0FgwA,3159
101
102
  iatoolkit/views/history_view.py,sha256=fzZrnC-RySa7ngcPe2Hmf9_s3imx6VB6MKROMcNpjoU,2064
102
103
  iatoolkit/views/home_view.py,sha256=TihO2flkelJa9j6a0FKCMVhD-2X7BhemonB7LTne4x8,1248
103
104
  iatoolkit/views/index_view.py,sha256=P5aVdEWxsYOZGbzcXd6WFE733qZ7YXIoeqriUMAM6V8,1527
105
+ iatoolkit/views/init_context_view.py,sha256=ndN56lE10XLj5yxUF0d53zf2ibpZZ20XzcdicNlo-Pk,1251
104
106
  iatoolkit/views/llmquery_view.py,sha256=rv2i3oeXlNc3Sv7Qu3DZGf37r-bMSa4N25FzG7_kPAI,2432
105
- iatoolkit/views/login_view.py,sha256=tSJiSTT7gKHediAAD2IGdVTUfkTNI1aWMt-d9J-S4lk,5562
107
+ iatoolkit/views/login_view.py,sha256=2KI94fBIK-tkpJFnd1eR4vAa3J379Trb1e6jRUQGW7E,5564
106
108
  iatoolkit/views/prompt_view.py,sha256=l8KHlLmkSgSLK43VbhwKED7mCN9YyfeHHh4zvx0pT0E,1257
107
109
  iatoolkit/views/signup_view.py,sha256=BCjhM2lMiDPwYrlW_eEwPl-ZLupblbFfsonWtq0E4vU,3922
108
110
  iatoolkit/views/tasks_review_view.py,sha256=keLsLCyOTTlcoIapnB_lbuSvLwrPVZVpBiFC_7ChbLg,3388
109
111
  iatoolkit/views/tasks_view.py,sha256=a3anTXrJTTvbQuc6PSpOzidLKQFL4hWa7PI2Cppcz8w,4110
110
112
  iatoolkit/views/user_feedback_view.py,sha256=G37zmP8P4LvZrSymNJ5iFXhLZg1A3BEwRfTpH1Iam5w,2652
111
- iatoolkit/views/verify_user_view.py,sha256=a3q4wHJ8mKAEmgbNTOcnX4rMikROjOR3mHvCr30qGGA,2351
112
- iatoolkit-0.19.0.dist-info/METADATA,sha256=su7PqytEmn9LgAOYFOmZ9-fbqX8v33jE7KmjZK_9Jqk,9301
113
- iatoolkit-0.19.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
114
- iatoolkit-0.19.0.dist-info/top_level.txt,sha256=V_w4QvDx0b1RXiy8zTCrD1Bp7AZkFe3_O0-9fMiwogg,10
115
- iatoolkit-0.19.0.dist-info/RECORD,,
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,,