iatoolkit 2.54.0__tar.gz → 2.54.2__tar.gz

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.
Files changed (257) hide show
  1. {iatoolkit-2.54.0/src/iatoolkit.egg-info → iatoolkit-2.54.2}/PKG-INFO +1 -1
  2. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/locales/en.yaml +43 -54
  4. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/locales/es.yaml +42 -53
  5. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/language_service.py +25 -4
  6. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/profile_service.py +63 -0
  7. iatoolkit-2.54.2/src/iatoolkit/static/js/chat_header_navigation.js +72 -0
  8. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_model_selector.js +9 -8
  9. iatoolkit-2.54.2/src/iatoolkit/static/styles/account.css +62 -0
  10. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/chat_iatoolkit.css +8 -0
  11. iatoolkit-2.54.2/src/iatoolkit/templates/_chat_header.html +144 -0
  12. iatoolkit-2.54.2/src/iatoolkit/templates/account.html +84 -0
  13. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/chat.html +2 -142
  14. iatoolkit-2.54.2/src/iatoolkit/views/account_view.py +89 -0
  15. {iatoolkit-2.54.0 → iatoolkit-2.54.2/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  16. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit.egg-info/SOURCES.txt +3 -0
  17. iatoolkit-2.54.0/src/iatoolkit/templates/account.html +0 -617
  18. iatoolkit-2.54.0/src/iatoolkit/views/account_view.py +0 -162
  19. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/LICENSE +0 -0
  20. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/LICENSE_COMMUNITY.md +0 -0
  21. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/pyproject.toml +0 -0
  22. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/readme.md +0 -0
  23. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/setup.cfg +0 -0
  24. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/base_company.py +0 -0
  25. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/cli_commands.py +0 -0
  26. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/__init__.py +0 -0
  27. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/bridge_validation.py +0 -0
  28. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/exceptions.py +0 -0
  29. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  30. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  31. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  32. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  33. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  34. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  35. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  36. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  37. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/model_registry.py +0 -0
  38. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/routes.py +0 -0
  39. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/secret_resolver.py +0 -0
  40. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/session_manager.py +0 -0
  41. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/text_splitter.py +0 -0
  42. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/url_safety.py +0 -0
  43. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/util.py +0 -0
  44. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/company_registry.py +0 -0
  45. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/__init__.py +0 -0
  46. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  47. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  48. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  49. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  50. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  51. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  52. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  53. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  54. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  55. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  56. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  57. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  58. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  59. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  60. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  61. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  62. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  63. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  64. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  65. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  66. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  67. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  68. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  69. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  70. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  71. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  72. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  73. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  74. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  75. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/core.py +0 -0
  76. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/__init__.py +0 -0
  77. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  78. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/call_service.py +0 -0
  79. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  80. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  81. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  82. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  83. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  84. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  85. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  86. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/google_auth_client.py +0 -0
  87. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/google_chat_app.py +0 -0
  88. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  89. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/inference_handler.py +0 -0
  90. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  91. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  92. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  93. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  94. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  95. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  96. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  97. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  98. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  99. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_proxy.py +0 -0
  100. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_response.py +0 -0
  101. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  102. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/__init__.py +0 -0
  103. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  104. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  105. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/database_manager.py +0 -0
  106. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/document_repo.py +0 -0
  107. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  108. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  109. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  110. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  111. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  112. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/memory_repo.py +0 -0
  113. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/models.py +0 -0
  114. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/profile_repo.py +0 -0
  115. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  116. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  117. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  118. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/vs_repo.py +0 -0
  119. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/runtime_logging.py +0 -0
  120. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/__init__.py +0 -0
  121. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/api_key_service.py +0 -0
  122. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  123. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/auth_service.py +0 -0
  124. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/branding_service.py +0 -0
  125. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/company_context_service.py +0 -0
  126. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/configuration_service.py +0 -0
  127. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/context_builder_service.py +0 -0
  128. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/dispatcher_service.py +0 -0
  129. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/embedding_service.py +0 -0
  130. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/excel_service.py +0 -0
  131. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/file_processor_service.py +0 -0
  132. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/history_manager_service.py +0 -0
  133. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/http_tool_service.py +0 -0
  134. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/i18n_service.py +0 -0
  135. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/inference_service.py +0 -0
  136. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/jwt_service.py +0 -0
  137. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  138. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/license_service.py +0 -0
  139. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/llm_client_service.py +0 -0
  140. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/mail_service.py +0 -0
  141. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  142. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/mcp_token_service.py +0 -0
  143. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  144. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_lint_service.py +0 -0
  145. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  146. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_service.py +0 -0
  147. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  148. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  149. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  150. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/operator_identity_service.py +0 -0
  151. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/__init__.py +0 -0
  152. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/contracts.py +0 -0
  153. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  154. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  155. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  156. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  157. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  158. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  159. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  160. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  161. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/validator.py +0 -0
  162. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/pdf_service.py +0 -0
  163. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  164. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/prompt_service.py +0 -0
  165. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/query_service.py +0 -0
  166. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  167. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  168. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/sql_service.py +0 -0
  169. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/sql_source_service.py +0 -0
  170. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/storage_service.py +0 -0
  171. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/structured_output_service.py +0 -0
  172. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  173. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/system_tools.py +0 -0
  174. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/telemetry_service.py +0 -0
  175. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  176. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/tool_output_contract.py +0 -0
  177. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/tool_service.py +0 -0
  178. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/user_feedback_service.py +0 -0
  179. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/user_session_context_service.py +0 -0
  180. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/visual_kb_service.py +0 -0
  181. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/visual_tool_service.py +0 -0
  182. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/warmup_service.py +0 -0
  183. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search/__init__.py +0 -0
  184. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  185. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  186. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  187. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search_service.py +0 -0
  188. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  189. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  190. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  191. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  192. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  193. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  194. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  195. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  196. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_main.js +0 -0
  197. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  198. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  199. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  200. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  201. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  202. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/chat_public.css +0 -0
  203. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/documents.css +0 -0
  204. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/landing_page.css +0 -0
  205. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/llm_output.css +0 -0
  206. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/onboarding.css +0 -0
  207. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/_company_header.html +0 -0
  208. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/_login_widget.html +0 -0
  209. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/base.html +0 -0
  210. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/change_password.html +0 -0
  211. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  212. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/chat_modals.html +0 -0
  213. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/error.html +0 -0
  214. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/forgot_password.html +0 -0
  215. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  216. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  217. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  218. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/pdf/base.html +0 -0
  219. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/pdf/letter.html +0 -0
  220. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/pdf/report.html +0 -0
  221. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/pdf/simple.html +0 -0
  222. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/signup.html +0 -0
  223. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/__init__.py +0 -0
  224. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/api_key_api_view.py +0 -0
  225. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/base_login_view.py +0 -0
  226. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/categories_api_view.py +0 -0
  227. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/change_password_view.py +0 -0
  228. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  229. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/chat_view.py +0 -0
  230. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/configuration_api_view.py +0 -0
  231. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/connectors_api_view.py +0 -0
  232. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/embedding_api_view.py +0 -0
  233. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/forgot_password_view.py +0 -0
  234. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/help_content_api_view.py +0 -0
  235. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/history_api_view.py +0 -0
  236. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/home_view.py +0 -0
  237. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/init_context_api_view.py +0 -0
  238. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  239. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/load_document_api_view.py +0 -0
  240. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/login_view.py +0 -0
  241. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/logout_api_view.py +0 -0
  242. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/memory_api_view.py +0 -0
  243. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/profile_api_view.py +0 -0
  244. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/prompt_api_view.py +0 -0
  245. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  246. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  247. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/rag_api_view.py +0 -0
  248. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/root_redirect_view.py +0 -0
  249. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/signup_view.py +0 -0
  250. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/static_page_view.py +0 -0
  251. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/tool_api_view.py +0 -0
  252. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  253. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/users_api_view.py +0 -0
  254. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/verify_user_view.py +0 -0
  255. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  256. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit.egg-info/requires.txt +0 -0
  257. {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.54.0
3
+ Version: 2.54.2
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- __version__ = "2.54.0"
6
+ __version__ = "2.54.2"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -327,58 +327,47 @@ ui:
327
327
  init_context: "Initializing the context ..."
328
328
 
329
329
  account:
330
- title: "My Account"
330
+ title: "My account"
331
331
  back_to_chat: "Back to chat"
332
- menu_getting_started: "Getting Started"
333
- menu_general: "General"
334
- menu_mcp_tokens: "MCP Tokens"
335
- general_title: "Personal settings"
336
- general_description: "Manage your personal access, integrations, and the settings connected to your account."
337
- general_tag: "Personal workspace"
338
- general_profile_label: "Profile"
339
- general_tokens_label: "Integrations"
340
- general_tokens_title: "MCP access tokens"
341
- general_tokens_description: "Create and manage your personal bearer tokens for MCP clients that do not complete the OAuth flow directly."
342
- general_tokens_action: "Open MCP tokens"
343
- mcp_tokens_create_title: "Create MCP token"
344
- mcp_tokens_create_description: "Generate personal MCP tokens. The bearer token and full JSON config are shown only when the token is created."
345
- mcp_tokens_list_title: "MCP access tokens"
346
- mcp_tokens_count_suffix: "tokens"
347
- mcp_tokens_empty: "You have not created any MCP tokens yet."
348
- mcp_connection_title: "Connection snippet"
349
- mcp_connection_description: "The full snippet is shown when a personal MCP token is created."
350
- mcp_connection_tag: "Ready to paste"
351
- mcp_connection_server_url: "Server URL"
352
- mcp_connection_json_label: "JSON config"
353
- mcp_connection_copy_url_button: "Copy URL"
354
- mcp_connection_copy_json_button: "Copy JSON"
355
- mcp_connection_url_copy_success: "Server URL copied."
356
- mcp_connection_json_copy_success: "JSON config copied."
357
- mcp_connection_copy_error: "Could not copy the MCP connection snippet."
358
- mcp_connection_placeholder_help: "The bearer token cannot be recovered later; create a new token if you need to generate the JSON again."
359
- mcp_token_name: "Token name"
360
- mcp_token_name_placeholder: "Claude Desktop, PyCharm, Codex..."
361
- mcp_token_expiry_days: "Expires in (days)"
362
- mcp_token_created_at: "Created"
363
- mcp_token_expires_at: "Expires"
364
- mcp_token_last_used_at: "Last used"
365
- mcp_token_status: "Status"
366
- mcp_token_actions: "Actions"
367
- mcp_token_status_active: "Active"
368
- mcp_token_status_revoked: "Revoked"
369
- mcp_token_status_expired: "Expired"
370
- mcp_token_create_button: "Create token"
371
- mcp_token_copy_button: "Copy"
372
- mcp_token_copy_success: "Token copied."
373
- mcp_token_copy_error: "Could not copy the token."
374
- mcp_token_revoke_button: "Revoke"
375
- mcp_token_created_title: "Copy this token now"
376
- mcp_token_created_help: "For security reasons, this token is shown only once."
377
- mcp_token_created_token_label: "Bearer token"
378
- mcp_token_created_json_label: "Ready-to-paste JSON config"
379
- mcp_token_created_flash: "MCP token created."
380
- mcp_token_revoked_flash: "MCP token revoked."
381
- mcp_token_unknown_action: "Unknown account action."
332
+ profile: "Profile"
333
+ preferences: "Preferences"
334
+ connections: "Connections"
335
+ first_name: "First name"
336
+ last_name: "Last name"
337
+ full_name: "Full name"
338
+ email: "Email / identifier"
339
+ organization: "Organization"
340
+ role: "Role"
341
+ sign_in: "Sign-in method"
342
+ auth_local: "Email and password"
343
+ auth_google: "Google"
344
+ auth_corporate: "Corporate sign-in"
345
+ role_user: "User"
346
+ role_editor: "Editor"
347
+ role_admin: "Administrator"
348
+ role_owner: "Owner"
349
+ language: "Interface language"
350
+ browser_language: "This preference is kept in this browser for your account and organization."
351
+ save: "Save changes"
352
+ saved: "Changes saved."
353
+ managed_identity: "Your name is managed by your identity provider."
354
+ invalid_name: "Enter a first and last name, up to 100 characters each."
355
+ update_failed: "Could not save your changes. Please try again."
356
+ not_available: "Not available"
357
+ connected: "Connected"
358
+ expired: "Reconnect required"
359
+ not_connected: "Not connected"
360
+ connect: "Connect"
361
+ reconnect: "Reconnect"
362
+ disconnect: "Disconnect"
363
+ empty_connections: "No personal services are available in this organization."
364
+ confirm_disconnect: "Disconnect this account?"
365
+ loading: "Loading connections..."
366
+ load_error: "Could not load connections."
367
+ connection_error: "Could not complete the operation."
368
+ retry: "Retry"
369
+ last_used: "Last used"
370
+ never_used: "No recorded use"
382
371
 
383
372
  memory:
384
373
  title: "Memory"
@@ -2132,7 +2121,7 @@ ui:
2132
2121
  mcp_service_tokens:
2133
2122
  menu_label: "MCP Tokens"
2134
2123
  title: "MCP Tokens"
2135
- subtitle: "Manage tenant-level MCP bearer tokens for services and users."
2124
+ subtitle: "Manage MCP service credentials for organization automations."
2136
2125
  new_btn: "New MCP Token"
2137
2126
  search_placeholder: "Filter MCP tokens..."
2138
2127
  empty_state: "No MCP tokens registered yet."
@@ -2142,8 +2131,8 @@ ui:
2142
2131
  subject_type: "Type"
2143
2132
  subject_type_service: "Service"
2144
2133
  subject_type_user: "User"
2145
- subject_identifier: "Subject"
2146
- subject_identifier_placeholder: "e.g. service:mcp or user@company.com"
2134
+ subject_identifier: "Service identity"
2135
+ subject_identifier_placeholder: "e.g. service:mcp"
2147
2136
  created_by_identifier: "Created by"
2148
2137
  service_subject_placeholder: "e.g. service:mcp"
2149
2138
  user_subject_placeholder: "e.g. user@company.com"
@@ -343,56 +343,45 @@ ui:
343
343
  account:
344
344
  title: "Mi cuenta"
345
345
  back_to_chat: "Volver al chat"
346
- menu_getting_started: "Primeros pasos"
347
- menu_general: "General"
348
- menu_mcp_tokens: "Tokens MCP"
349
- general_title: "Configuración personal"
350
- general_description: "Administra tu acceso personal, tus integraciones y la configuración asociada a tu cuenta."
351
- general_tag: "Espacio personal"
352
- general_profile_label: "Perfil"
353
- general_tokens_label: "Integraciones"
354
- general_tokens_title: "Tokens de acceso MCP"
355
- general_tokens_description: "Crea y administra tus bearer tokens personales para clientes MCP que no completan el flujo OAuth directamente."
356
- general_tokens_action: "Abrir tokens MCP"
357
- mcp_tokens_create_title: "Crear token MCP"
358
- mcp_tokens_create_description: "Genera tokens MCP personales. El bearer token y el JSON completo se muestran sólo al crearlo."
359
- mcp_tokens_list_title: "Tokens de acceso MCP"
360
- mcp_tokens_count_suffix: "tokens"
361
- mcp_tokens_empty: "Todavía no has creado tokens MCP."
362
- mcp_connection_title: "Snippet de conexión"
363
- mcp_connection_description: "El snippet completo se muestra al crear un token MCP personal."
364
- mcp_connection_tag: "Listo para pegar"
365
- mcp_connection_server_url: "URL del servidor"
366
- mcp_connection_json_label: "Configuración JSON"
367
- mcp_connection_copy_url_button: "Copiar URL"
368
- mcp_connection_copy_json_button: "Copiar JSON"
369
- mcp_connection_url_copy_success: "URL del servidor copiada."
370
- mcp_connection_json_copy_success: "Configuración JSON copiada."
371
- mcp_connection_copy_error: "No se pudo copiar el snippet de conexión MCP."
372
- mcp_connection_placeholder_help: "El bearer token no se puede recuperar después; crea uno nuevo si necesitas volver a generar el JSON."
373
- mcp_token_name: "Nombre del token"
374
- mcp_token_name_placeholder: "Claude Desktop, PyCharm, Codex..."
375
- mcp_token_expiry_days: "Expira en (días)"
376
- mcp_token_created_at: "Creado"
377
- mcp_token_expires_at: "Expira"
378
- mcp_token_last_used_at: "Último uso"
379
- mcp_token_status: "Estado"
380
- mcp_token_actions: "Acciones"
381
- mcp_token_status_active: "Activo"
382
- mcp_token_status_revoked: "Revocado"
383
- mcp_token_status_expired: "Expirado"
384
- mcp_token_create_button: "Crear token"
385
- mcp_token_copy_button: "Copiar"
386
- mcp_token_copy_success: "Token copiado."
387
- mcp_token_copy_error: "No se pudo copiar el token."
388
- mcp_token_revoke_button: "Revocar"
389
- mcp_token_created_title: "Copia este token ahora"
390
- mcp_token_created_help: "Por seguridad, este token se muestra solo una vez."
391
- mcp_token_created_token_label: "Bearer token"
392
- mcp_token_created_json_label: "Configuración JSON lista para pegar"
393
- mcp_token_created_flash: "Token MCP creado."
394
- mcp_token_revoked_flash: "Token MCP revocado."
395
- mcp_token_unknown_action: "Acción de cuenta desconocida."
346
+ profile: "Perfil"
347
+ preferences: "Preferencias"
348
+ connections: "Conexiones"
349
+ first_name: "Nombre"
350
+ last_name: "Apellido"
351
+ full_name: "Nombre completo"
352
+ email: "Correo / identificador"
353
+ organization: "Organización"
354
+ role: "Rol"
355
+ sign_in: "Método de acceso"
356
+ auth_local: "Correo y contraseña"
357
+ auth_google: "Google"
358
+ auth_corporate: "Acceso corporativo"
359
+ role_user: "Usuario"
360
+ role_editor: "Editor"
361
+ role_admin: "Administrador"
362
+ role_owner: "Propietario"
363
+ language: "Idioma de la interfaz"
364
+ browser_language: "Esta preferencia se conserva en este navegador para tu cuenta y organización."
365
+ save: "Guardar cambios"
366
+ saved: "Cambios guardados."
367
+ managed_identity: "Tu nombre está gestionado por tu proveedor de identidad."
368
+ invalid_name: "Completa nombre y apellido, con un máximo de 100 caracteres por campo."
369
+ update_failed: "No se pudieron guardar los cambios. Intenta nuevamente."
370
+ not_available: "No disponible"
371
+ connected: "Conectada"
372
+ expired: "Requiere reconexión"
373
+ not_connected: "No conectada"
374
+ connect: "Conectar"
375
+ reconnect: "Reconectar"
376
+ disconnect: "Desconectar"
377
+ empty_connections: "No hay servicios personales disponibles en esta organización."
378
+ confirm_disconnect: "¿Desconectar esta cuenta?"
379
+ loading: "Cargando conexiones..."
380
+ load_error: "No se pudieron cargar las conexiones."
381
+ connection_error: "No se pudo completar la operación."
382
+ retry: "Reintentar"
383
+ last_used: "Último uso"
384
+ never_used: "Sin uso registrado"
396
385
 
397
386
  memory:
398
387
  title: "Memoria"
@@ -2150,7 +2139,7 @@ ui:
2150
2139
  mcp_service_tokens:
2151
2140
  menu_label: "Tokens MCP"
2152
2141
  title: "Tokens MCP"
2153
- subtitle: "Administra tokens bearer MCP a nivel de tenant para servicios y usuarios."
2142
+ subtitle: "Administra credenciales MCP de servicio para automatizaciones de la organización."
2154
2143
  new_btn: "Nuevo token MCP"
2155
2144
  search_placeholder: "Filtrar tokens MCP..."
2156
2145
  empty_state: "Todavía no hay tokens MCP registrados."
@@ -2160,8 +2149,8 @@ ui:
2160
2149
  subject_type: "Tipo"
2161
2150
  subject_type_service: "Servicio"
2162
2151
  subject_type_user: "Usuario"
2163
- subject_identifier: "Subject"
2164
- subject_identifier_placeholder: "ej. service:mcp o usuario@empresa.com"
2152
+ subject_identifier: "Identidad de servicio"
2153
+ subject_identifier_placeholder: "ej. service:mcp"
2165
2154
  created_by_identifier: "Creado por"
2166
2155
  service_subject_placeholder: "ej. service:mcp"
2167
2156
  user_subject_placeholder: "ej. usuario@empresa.com"
@@ -75,9 +75,10 @@ class LanguageService:
75
75
  def get_current_language(self) -> str:
76
76
  """
77
77
  Determines and caches the language for the current request using a priority order:
78
- 1. Company's default language from company.yaml ('locale').
79
- 2. Query parameter '?lang=<code>' (e.g., 'en', 'es').
80
- 3. System-wide fallback language ('es').
78
+ 1. The signed-in user's saved preference.
79
+ 2. Company's default language from company.yaml ('locale').
80
+ 3. Query parameter '?lang=<code>' (e.g., 'en', 'es').
81
+ 4. System-wide fallback language ('es').
81
82
  """
82
83
  if 'locale_ctx' in g:
83
84
  return g.lang
@@ -111,8 +112,28 @@ class LanguageService:
111
112
  return g.locale_ctx
112
113
 
113
114
  def _resolve_locale_string(self) -> str:
114
- # Priority 1: Company Config (source of truth)
115
+ # Personal preferences apply only to the signed-in identity in this tenant.
115
116
  company_short_name = self._get_company_short_name()
117
+ sessions = SessionManager.get('company_sessions')
118
+ entry = sessions.get(company_short_name, {}) if isinstance(sessions, dict) else {}
119
+ identifier = entry.get('user_identifier')
120
+ if identifier:
121
+ preferences = SessionManager.get('account_languages')
122
+ selected = (preferences.get(company_short_name, {}).get(identifier)
123
+ if isinstance(preferences, dict) else None)
124
+ if selected in self.LOCALE_DEFINITIONS:
125
+ return selected
126
+ try:
127
+ user = self.profile_repo.get_user_by_email(identifier)
128
+ company = self.profile_repo.get_company_by_short_name(company_short_name)
129
+ if (user and company and user.preferred_language in self.LOCALE_DEFINITIONS
130
+ and self.profile_repo.get_user_role_in_company(company.id, user.id)):
131
+ return user.preferred_language
132
+ except Exception:
133
+ self._safe_rollback()
134
+ logging.warning('Could not load personal language preference')
135
+
136
+ # Company locale remains the default for visitors and unset preferences.
116
137
  if company_short_name:
117
138
  # cnfig returns something like 'es_ES' o 'en_US'
118
139
  try:
@@ -295,6 +295,69 @@ class ProfileService:
295
295
  "profile": profile
296
296
  }
297
297
 
298
+ def _account_user(self, company_short_name: str, session_info: dict):
299
+ profile = session_info.get("profile") or {}
300
+ method = (profile.get("extras") or {}).get("auth_method")
301
+ if not profile.get("user_is_local") and method != "google":
302
+ return None
303
+ user = self.profile_repo.get_user_by_email(session_info["user_identifier"])
304
+ company = self.profile_repo.get_company_by_short_name(company_short_name)
305
+ if not user or not company or not self.profile_repo.get_user_role_in_company(company.id, user.id):
306
+ return None
307
+ return user
308
+
309
+ def get_account_profile(self, company_short_name: str, session_info: dict) -> dict:
310
+ profile = session_info.get("profile") or {}
311
+ user = self._account_user(company_short_name, session_info)
312
+ method = str(user.auth_method or "local") if user else "corporate"
313
+ return {
314
+ "first_name": user.first_name if user else "",
315
+ "last_name": user.last_name if user else "",
316
+ "full_name": f"{user.first_name} {user.last_name}" if user else profile.get("user_fullname", ""),
317
+ "email": profile.get("user_email") or session_info["user_identifier"],
318
+ "role": profile.get("user_role") or "user",
319
+ "auth_method": method,
320
+ "can_edit_name": bool(user and method == "local"),
321
+ "language": self.lang_service.get_current_language(),
322
+ "language_is_browser_only": user is None,
323
+ }
324
+
325
+ def update_account(self, company_short_name: str, session_info: dict, *, action: str,
326
+ first_name: str = "", last_name: str = "", language: str = "") -> dict:
327
+ if session_info.get("company_short_name") != company_short_name or not session_info.get("profile"):
328
+ return {"error": "ui.account.update_failed", "status_code": 403}
329
+ user = self._account_user(company_short_name, session_info)
330
+ profile = dict(session_info["profile"])
331
+ identifier = session_info["user_identifier"]
332
+ try:
333
+ if action == "update_profile":
334
+ if not user or str(user.auth_method or "local") != "local":
335
+ return {"error": "ui.account.managed_identity", "status_code": 403}
336
+ first_name, last_name = first_name.strip(), last_name.strip()
337
+ if not all(0 < len(value) <= 100 and not any(ord(c) < 32 for c in value)
338
+ for value in (first_name, last_name)):
339
+ return {"error": "ui.account.invalid_name"}
340
+ self.profile_repo.update_user(identifier, first_name=first_name, last_name=last_name)
341
+ profile["user_fullname"] = f"{first_name} {last_name}"
342
+ elif action == "update_preferences":
343
+ if language not in {"es", "en"}:
344
+ return {"error": "errors.general.unsupported_language"}
345
+ if user:
346
+ self.profile_repo.update_user(identifier, preferred_language=language)
347
+ else:
348
+ preferences = SessionManager.get("account_languages", {})
349
+ preferences.setdefault(company_short_name, {})[identifier] = language
350
+ SessionManager.set("account_languages", preferences)
351
+ profile["language"] = language
352
+ else:
353
+ return {"error": "ui.account.update_failed"}
354
+ self.session_context.save_profile_data(company_short_name, identifier, profile)
355
+ return {"success": True}
356
+ except Exception:
357
+ self._safe_rollback()
358
+ logging.exception("Failed to update account for %s/%s", company_short_name, identifier)
359
+ return {"error": "ui.account.update_failed", "status_code": 500}
360
+
298
361
  def update_user_language(self, user_identifier: str, new_lang: str) -> dict:
299
362
  """
300
363
  Business logic to update a user's preferred language.
@@ -0,0 +1,72 @@
1
+ (function () {
2
+ const actions = new Set([
3
+ 'history-button', 'memory-button', 'force-reload-button',
4
+ 'send-feedback-button', 'open-help-button', 'logout-button'
5
+ ]);
6
+ const storageKey = 'iatoolkit.pending_chat_action';
7
+ const header = document.querySelector('[data-chat-header]');
8
+ if (!header) return;
9
+ const selectionKey = 'iatoolkit.chat_header_selection';
10
+ function isCurrent(value) {
11
+ return value && value.company === header.dataset.company && value.user === header.dataset.user &&
12
+ Number.isFinite(value.created) && Date.now() - value.created >= 0 && Date.now() - value.created < 30000;
13
+ }
14
+ try {
15
+ const selection = JSON.parse(sessionStorage.getItem(selectionKey) || 'null');
16
+ sessionStorage.removeItem(selectionKey);
17
+ if (isCurrent(selection)) window.chatHeaderSelection = selection;
18
+ } catch (_) {}
19
+
20
+ // Carry the current selection only across navigation within this workspace.
21
+ const workspacePaths = ['chat', 'account', 'mcp-connections'].map(
22
+ page => '/' + encodeURIComponent(header.dataset.company) + '/' + page
23
+ );
24
+ function rememberSelection(url) {
25
+ if (url.origin !== location.origin || !workspacePaths.includes(url.pathname)) return;
26
+ try {
27
+ sessionStorage.setItem(selectionKey, JSON.stringify({
28
+ company: header.dataset.company, user: header.dataset.user, created: Date.now(),
29
+ model: window.currentLlmModel, reasoningEffort: window.currentLlmReasoningEffort
30
+ }));
31
+ } catch (_) {}
32
+ }
33
+ document.addEventListener('click', event => {
34
+ const link = event.target.closest('a[href]');
35
+ if (!link || link.target === '_blank' || event.button !== 0 ||
36
+ event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;
37
+ rememberSelection(new URL(link.href));
38
+ });
39
+ document.addEventListener('submit', event => {
40
+ if (event.target instanceof HTMLFormElement) {
41
+ rememberSelection(new URL(event.target.getAttribute('action') || location.href, location.href));
42
+ }
43
+ });
44
+
45
+ if (header.dataset.accountPage === 'true') {
46
+ header.addEventListener('click', event => {
47
+ const link = event.target.closest('[data-chat-action]');
48
+ if (!link || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;
49
+ try {
50
+ sessionStorage.setItem(storageKey, JSON.stringify({
51
+ company: header.dataset.company, user: header.dataset.user,
52
+ action: link.dataset.chatAction, created: Date.now()
53
+ }));
54
+ } catch (_) {
55
+ // The link still returns to the chat when browser storage is unavailable.
56
+ }
57
+ });
58
+ return;
59
+ }
60
+
61
+ // Registered after the chat's handlers, including its jQuery ready callbacks.
62
+ $(function () {
63
+ try {
64
+ const pending = JSON.parse(sessionStorage.getItem(storageKey) || 'null');
65
+ sessionStorage.removeItem(storageKey);
66
+ if (!isCurrent(pending) || !actions.has(pending.action)) return;
67
+ document.getElementById(pending.action)?.click();
68
+ } catch (_) {
69
+ // A stale or invalid navigation intent must not prevent the chat from opening.
70
+ }
71
+ });
72
+ })();
@@ -127,12 +127,8 @@ window.currentLlmReasoningEffort = window.currentLlmReasoningEffort || null;
127
127
  }
128
128
 
129
129
  /**
130
- * Inicializa el estado de currentLlmModel usando SIEMPRE la config de company.yaml:
131
- * 1) defaultLlmModel (company.yaml)
132
- * 2) si no existe o no está en la lista, usa el primer modelo disponible.
133
- *
134
- * No se lee nada de localStorage en este punto: cada apertura de chat
135
- * arranca desde la configuración de la compañía.
130
+ * Internal navigation between chat and account preserves the selection.
131
+ * A fresh chat still starts from company.yaml, never from localStorage.
136
132
  */
137
133
  function initCurrentModel() {
138
134
  const models = getAvailableModels();
@@ -140,7 +136,10 @@ window.currentLlmReasoningEffort = window.currentLlmReasoningEffort || null;
140
136
 
141
137
  let resolved = null;
142
138
 
143
- if (defaultId && models.some(m => m.id === defaultId)) {
139
+ const carriedId = window.chatHeaderSelection?.model;
140
+ if (carriedId && models.some(m => m.id === carriedId)) {
141
+ resolved = carriedId;
142
+ } else if (defaultId && models.some(m => m.id === defaultId)) {
144
143
  resolved = defaultId;
145
144
  } else if (models.length > 0) {
146
145
  resolved = models[0].id;
@@ -151,7 +150,9 @@ window.currentLlmReasoningEffort = window.currentLlmReasoningEffort || null;
151
150
  }
152
151
 
153
152
  function initCurrentReasoningEffort() {
154
- const candidate = String(window.defaultLlmReasoningEffort || '').trim().toLowerCase();
153
+ const effort = window.chatHeaderSelection?.model === window.currentLlmModel
154
+ ? window.chatHeaderSelection.reasoningEffort : window.defaultLlmReasoningEffort;
155
+ const candidate = String(effort || '').trim().toLowerCase();
155
156
  const allowed = getAllowedReasoningEfforts(getActiveModelMetadata());
156
157
  window.currentLlmReasoningEffort = allowed.includes(candidate) ? candidate : null;
157
158
  if (!modelSupportsReasoning(getActiveModelMetadata())) {
@@ -0,0 +1,62 @@
1
+ .account-page {
2
+ --account-line: #e2e5e8;
3
+ --account-muted: #60666d;
4
+ max-width: 1120px;
5
+ margin: 0 auto;
6
+ padding: 0 32px 48px;
7
+ color: #25292d;
8
+ font: 15px/1.5 system-ui, sans-serif;
9
+ letter-spacing: 0;
10
+ }
11
+ .account-page * { box-sizing: border-box; min-width: 0; }
12
+ .account-workspace { padding-top: 1rem; }
13
+ .account-page a { text-decoration: none; }
14
+ .account-layout { display: grid; grid-template-columns: 232px minmax(0, 1fr); gap: 40px; padding-top: 36px; }
15
+ .account-sidebar { padding-right: 24px; border-right: 1px solid var(--account-line); }
16
+ .account-sidebar h1 { font-size: 18px; line-height: 1.4; margin: 0 0 6px; padding: 0 12px; font-weight: 650; }
17
+ .account-identity { color: var(--account-muted); font-size: 13px; overflow-wrap: anywhere; padding: 0 12px 20px; margin-bottom: 16px; border-bottom: 1px solid var(--account-line); }
18
+ .account-sidebar nav { display: grid; gap: 4px; }
19
+ .account-sidebar nav a { display: grid; grid-template-columns: 20px minmax(0, 1fr); gap: 12px; align-items: center; min-height: 44px; padding: 10px 12px; font-size: 14px; color: #4b5158; border-radius: 4px; }
20
+ .account-sidebar nav a i { width: 20px; text-align: center; line-height: 20px; }
21
+ .account-sidebar nav a span { overflow-wrap: anywhere; }
22
+ .account-sidebar nav a:hover { background: #f5f6f7; }
23
+ .account-sidebar nav a[aria-current] { background: #edf3f1; color: #225548; font-weight: 600; box-shadow: inset 3px 0 #285e50; }
24
+ .account-main { max-width: 720px; }
25
+ .account-main h2 { font-size: 21px; line-height: 1.3; font-weight: 650; margin: 0 0 28px; }
26
+ .account-form label { display: block; font-size: 14px; font-weight: 550; margin-bottom: 8px; }
27
+ .account-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
28
+ .account-page .form-control, .account-page .form-select { border-radius: 6px; min-height: 42px; font-size: 15px; }
29
+ .account-save { display: inline-flex; gap: 8px; align-items: center; background: var(--brand-primary-color, #285e50); color: var(--brand-text-on-primary, #fff); border-radius: 6px; min-height: 40px; margin: 22px 0 28px; }
30
+ .account-save:hover, .account-save:focus { color: var(--brand-text-on-primary, #fff); background: color-mix(in srgb, var(--brand-primary-color, #285e50) 85%, black); }
31
+ .account-details { margin: 0; }
32
+ .account-details > div { display: grid; grid-template-columns: 180px minmax(0, 1fr); padding: 19px 0; border-top: 1px solid var(--account-line); gap: 16px; }
33
+ .account-details dt { font-weight: 450; color: var(--account-muted); }
34
+ .account-details dd { margin: 0; overflow-wrap: anywhere; }
35
+ .account-language { max-width: 320px; }
36
+ .account-muted { color: var(--account-muted); font-size: 13px; }
37
+ .account-notice { padding: 12px 16px; border-left: 3px solid #287153; background: #f0f7f3; margin-bottom: 24px; overflow-wrap: anywhere; }
38
+ .account-notice.is-error { border-color: #b43d41; background: #fdf2f2; }
39
+ .account-connection { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 22px 0; border-top: 1px solid var(--account-line); }
40
+ .account-connection-name { font-size: 16px; font-weight: 600; overflow-wrap: anywhere; }
41
+ .account-connection-meta { font-size: 13px; color: var(--account-muted); margin-top: 5px; overflow-wrap: anywhere; }
42
+ .account-connection-state { font-size: 13px; margin-top: 5px; }
43
+ .account-connection-state.connected { color: #287153; }
44
+ .account-connection-state.expired { color: #975708; }
45
+ .account-connection-actions { display: flex; gap: 8px; flex-wrap: wrap; flex-shrink: 0; }
46
+ .account-connection-actions .btn { display: inline-flex; gap: 6px; align-items: center; border-radius: 6px; min-height: 38px; font-size: 13px; }
47
+ .account-empty { padding: 32px 0; border-top: 1px solid var(--account-line); color: var(--account-muted); }
48
+ .account-empty i { display: block; font-size: 28px; margin-bottom: 12px; }
49
+ .account-page :focus-visible { outline: 2px solid #287153; outline-offset: 3px; }
50
+ @media (max-width: 720px) {
51
+ .account-page { padding: 0 20px 32px; }
52
+ .account-layout { grid-template-columns: minmax(0, 1fr); gap: 28px; padding-top: 24px; }
53
+ .account-sidebar { padding: 0; border-right: 0; }
54
+ .account-sidebar h1 { padding: 0; }
55
+ .account-identity { padding: 0 0 16px; margin-bottom: 12px; }
56
+ .account-sidebar nav { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; }
57
+ .account-sidebar nav a { display: flex; flex-direction: column; justify-content: center; text-align: center; min-height: 64px; font-size: 12px; gap: 6px; padding: 8px 4px; }
58
+ .account-sidebar nav a[aria-current] { box-shadow: inset 0 -2px #285e50; }
59
+ .account-fields { grid-template-columns: minmax(0, 1fr); gap: 16px; }
60
+ .account-details > div { grid-template-columns: minmax(0, 1fr); gap: 4px; padding: 16px 0; }
61
+ .account-connection { align-items: flex-start; flex-direction: column; gap: 12px; }
62
+ }
@@ -67,6 +67,14 @@ li {
67
67
  color: var(--brand-header-text);
68
68
  }
69
69
 
70
+ .chat-shared-header { gap: 8px 16px; flex-wrap: wrap; }
71
+ .chat-shared-header > div { min-width: 0; max-width: 100%; }
72
+ .chat-shared-header > div:last-child { flex-wrap: wrap; gap: 8px 0; }
73
+ .chat-shared-header > div:last-child > a { overflow-wrap: anywhere; }
74
+ .chat-shared-header > div:last-child > div:last-child { flex-wrap: wrap; justify-content: center; row-gap: 8px; max-width: 100%; }
75
+ .chat-brand-link, .chat-brand-link:hover { color: inherit; text-decoration: none; }
76
+ .chat-brand-link:focus-visible { outline: 2px solid currentColor; outline-offset: 4px; }
77
+
70
78
  /* Estilos para el contenedor del chat y mensajes para que exista scroll */
71
79
  #chat-container {
72
80
  flex-grow: 1;