iatoolkit 2.53.1__tar.gz → 2.54.1__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.53.1/src/iatoolkit.egg-info → iatoolkit-2.54.1}/PKG-INFO +1 -1
  2. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/locales/en.yaml +43 -54
  4. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/locales/es.yaml +42 -53
  5. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/models.py +2 -0
  6. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/dispatcher_service.py +45 -0
  7. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/language_service.py +25 -4
  8. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/profile_service.py +63 -0
  9. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/tool_service.py +49 -0
  10. iatoolkit-2.54.1/src/iatoolkit/static/js/chat_header_navigation.js +72 -0
  11. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_main.js +4 -0
  12. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_model_selector.js +9 -8
  13. iatoolkit-2.54.1/src/iatoolkit/static/styles/account.css +62 -0
  14. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/chat_iatoolkit.css +8 -0
  15. iatoolkit-2.54.1/src/iatoolkit/templates/_chat_header.html +144 -0
  16. iatoolkit-2.54.1/src/iatoolkit/templates/account.html +84 -0
  17. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/chat.html +2 -142
  18. iatoolkit-2.54.1/src/iatoolkit/views/account_view.py +89 -0
  19. {iatoolkit-2.53.1 → iatoolkit-2.54.1/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  20. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit.egg-info/SOURCES.txt +3 -0
  21. iatoolkit-2.53.1/src/iatoolkit/templates/account.html +0 -617
  22. iatoolkit-2.53.1/src/iatoolkit/views/account_view.py +0 -162
  23. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/LICENSE +0 -0
  24. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/LICENSE_COMMUNITY.md +0 -0
  25. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/pyproject.toml +0 -0
  26. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/readme.md +0 -0
  27. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/setup.cfg +0 -0
  28. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/base_company.py +0 -0
  29. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/cli_commands.py +0 -0
  30. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/__init__.py +0 -0
  31. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/bridge_validation.py +0 -0
  32. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/exceptions.py +0 -0
  33. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  34. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  35. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  36. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  37. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  38. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  39. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  40. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  41. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/model_registry.py +0 -0
  42. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/routes.py +0 -0
  43. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/secret_resolver.py +0 -0
  44. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/session_manager.py +0 -0
  45. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/text_splitter.py +0 -0
  46. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/url_safety.py +0 -0
  47. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/util.py +0 -0
  48. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/company_registry.py +0 -0
  49. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/__init__.py +0 -0
  50. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  51. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  52. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  53. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  54. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  55. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  56. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  57. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  58. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  59. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  60. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  61. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  62. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  63. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  64. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  65. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  66. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  67. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  68. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  69. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  70. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  71. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  72. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  73. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  74. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  75. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  76. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  77. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  78. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  79. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/core.py +0 -0
  80. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/__init__.py +0 -0
  81. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  82. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/call_service.py +0 -0
  83. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  84. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  85. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  86. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  87. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  88. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  89. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  90. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/google_auth_client.py +0 -0
  91. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/google_chat_app.py +0 -0
  92. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  93. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/inference_handler.py +0 -0
  94. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  95. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  96. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  97. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  98. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  99. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  100. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  101. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  102. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  103. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_proxy.py +0 -0
  104. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_response.py +0 -0
  105. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  106. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/__init__.py +0 -0
  107. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  108. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  109. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/database_manager.py +0 -0
  110. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/document_repo.py +0 -0
  111. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  112. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  113. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  114. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  115. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  116. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/memory_repo.py +0 -0
  117. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/profile_repo.py +0 -0
  118. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  119. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  120. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  121. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/vs_repo.py +0 -0
  122. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/runtime_logging.py +0 -0
  123. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/__init__.py +0 -0
  124. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/api_key_service.py +0 -0
  125. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  126. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/auth_service.py +0 -0
  127. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/branding_service.py +0 -0
  128. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/company_context_service.py +0 -0
  129. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/configuration_service.py +0 -0
  130. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/context_builder_service.py +0 -0
  131. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/embedding_service.py +0 -0
  132. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/excel_service.py +0 -0
  133. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/file_processor_service.py +0 -0
  134. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/history_manager_service.py +0 -0
  135. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/http_tool_service.py +0 -0
  136. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/i18n_service.py +0 -0
  137. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/inference_service.py +0 -0
  138. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/jwt_service.py +0 -0
  139. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  140. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/license_service.py +0 -0
  141. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/llm_client_service.py +0 -0
  142. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/mail_service.py +0 -0
  143. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  144. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/mcp_token_service.py +0 -0
  145. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  146. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_lint_service.py +0 -0
  147. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  148. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_service.py +0 -0
  149. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  150. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  151. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  152. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/operator_identity_service.py +0 -0
  153. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/__init__.py +0 -0
  154. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/contracts.py +0 -0
  155. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  156. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  157. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  158. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  159. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  160. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  161. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  162. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  163. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/validator.py +0 -0
  164. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/pdf_service.py +0 -0
  165. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  166. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/prompt_service.py +0 -0
  167. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/query_service.py +0 -0
  168. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  169. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  170. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/sql_service.py +0 -0
  171. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/sql_source_service.py +0 -0
  172. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/storage_service.py +0 -0
  173. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/structured_output_service.py +0 -0
  174. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  175. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/system_tools.py +0 -0
  176. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/telemetry_service.py +0 -0
  177. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  178. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/tool_output_contract.py +0 -0
  179. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/user_feedback_service.py +0 -0
  180. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/user_session_context_service.py +0 -0
  181. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/visual_kb_service.py +0 -0
  182. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/visual_tool_service.py +0 -0
  183. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/warmup_service.py +0 -0
  184. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search/__init__.py +0 -0
  185. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  186. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  187. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  188. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search_service.py +0 -0
  189. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  190. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  191. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  192. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  193. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  194. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  195. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  196. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  197. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  198. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  199. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  200. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  201. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  202. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/chat_public.css +0 -0
  203. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/documents.css +0 -0
  204. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/landing_page.css +0 -0
  205. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/llm_output.css +0 -0
  206. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/onboarding.css +0 -0
  207. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/_company_header.html +0 -0
  208. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/_login_widget.html +0 -0
  209. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/base.html +0 -0
  210. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/change_password.html +0 -0
  211. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  212. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/chat_modals.html +0 -0
  213. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/error.html +0 -0
  214. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/forgot_password.html +0 -0
  215. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  216. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  217. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  218. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/pdf/base.html +0 -0
  219. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/pdf/letter.html +0 -0
  220. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/pdf/report.html +0 -0
  221. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/pdf/simple.html +0 -0
  222. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/signup.html +0 -0
  223. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/__init__.py +0 -0
  224. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/api_key_api_view.py +0 -0
  225. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/base_login_view.py +0 -0
  226. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/categories_api_view.py +0 -0
  227. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/change_password_view.py +0 -0
  228. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  229. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/chat_view.py +0 -0
  230. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/configuration_api_view.py +0 -0
  231. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/connectors_api_view.py +0 -0
  232. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/embedding_api_view.py +0 -0
  233. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/forgot_password_view.py +0 -0
  234. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/help_content_api_view.py +0 -0
  235. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/history_api_view.py +0 -0
  236. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/home_view.py +0 -0
  237. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/init_context_api_view.py +0 -0
  238. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  239. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/load_document_api_view.py +0 -0
  240. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/login_view.py +0 -0
  241. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/logout_api_view.py +0 -0
  242. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/memory_api_view.py +0 -0
  243. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/profile_api_view.py +0 -0
  244. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/prompt_api_view.py +0 -0
  245. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  246. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  247. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/rag_api_view.py +0 -0
  248. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/root_redirect_view.py +0 -0
  249. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/signup_view.py +0 -0
  250. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/static_page_view.py +0 -0
  251. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/tool_api_view.py +0 -0
  252. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  253. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/users_api_view.py +0 -0
  254. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/verify_user_view.py +0 -0
  255. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  256. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit.egg-info/requires.txt +0 -0
  257. {iatoolkit-2.53.1 → iatoolkit-2.54.1}/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.53.1
3
+ Version: 2.54.1
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.53.1"
6
+ __version__ = "2.54.1"
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"
@@ -360,6 +360,7 @@ class Tool(Base):
360
360
  TYPE_NATIVE = 'NATIVE' # executed by company class in Python
361
361
  TYPE_INFERENCE = 'INFERENCE' # executed by InferenceService
362
362
  TYPE_HTTP = 'HTTP' # executed by HttpToolService
363
+ TYPE_MCP = 'MCP' # executed by the handler an extension registers (Dispatcher.register_tool_type_handler)
363
364
 
364
365
  # source of the definition (Source of Truth)
365
366
  SOURCE_SYSTEM = 'SYSTEM'
@@ -367,6 +368,7 @@ class Tool(Base):
367
368
  SOURCE_YAML = 'YAML' # defined in company.yaml
368
369
  SOURCE_USER = 'USER' # defined via GUI/API
369
370
  SOURCE_PACK = 'PACK' # materialized by enterprise control-plane
371
+ SOURCE_MCP = 'MCP' # imported from an external MCP server
370
372
 
371
373
  id = Column(Integer, primary_key=True, autoincrement=True)
372
374
  company_id = Column(Integer,
@@ -31,6 +31,11 @@ class Dispatcher:
31
31
  "iat_wiki_get_page",
32
32
  }
33
33
  _tool_execution_hook = None
34
+ # Tool types this module executes itself; an extension cannot take them over.
35
+ BUILTIN_TOOL_TYPES = frozenset({"SYSTEM", "INFERENCE", "HTTP", "NATIVE"})
36
+ # Executors for tool types an extension owns (e.g. Enterprise's MCP client
37
+ # for tool_type='MCP'). This module knows nothing about what they do.
38
+ _tool_type_handlers: dict = {}
34
39
 
35
40
  @inject
36
41
  def __init__(self,
@@ -80,6 +85,33 @@ class Dispatcher:
80
85
  def clear_tool_execution_hook(cls):
81
86
  cls._tool_execution_hook = None
82
87
 
88
+ @classmethod
89
+ def register_tool_type_handler(cls, tool_type: str, handler):
90
+ """
91
+ Registers the executor for tools whose tool_type is not built in.
92
+ handler is called as:
93
+
94
+ handler(company_short_name=..., function_name=..., tool_def=...,
95
+ user_identifier=..., runtime_source=..., arguments={...})
96
+
97
+ and returns the tool result, exactly like a native tool would.
98
+ """
99
+ normalized = str(tool_type or "").strip().upper()
100
+ if not normalized:
101
+ raise ValueError("tool_type is required")
102
+ if normalized in cls.BUILTIN_TOOL_TYPES:
103
+ raise ValueError(f"Tool type '{normalized}' is built in and cannot be overridden")
104
+ if not callable(handler):
105
+ raise ValueError("handler must be callable")
106
+ cls._tool_type_handlers = {**cls._tool_type_handlers, normalized: handler}
107
+
108
+ @classmethod
109
+ def clear_tool_type_handler(cls, tool_type: str):
110
+ normalized = str(tool_type or "").strip().upper()
111
+ cls._tool_type_handlers = {
112
+ key: value for key, value in cls._tool_type_handlers.items() if key != normalized
113
+ }
114
+
83
115
  def _notify_tool_execution_hook(self, event: str, **payload) -> None:
84
116
  hook = type(self)._tool_execution_hook
85
117
  if not callable(hook):
@@ -184,6 +216,7 @@ class Dispatcher:
184
216
  function_name=function_name,
185
217
  user_identifier=user_identifier,
186
218
  tool_def=tool_def,
219
+ runtime_source=_iat_runtime_source,
187
220
  **kwargs,
188
221
  )
189
222
  self._notify_tool_execution_hook(
@@ -241,6 +274,7 @@ class Dispatcher:
241
274
  function_name: str,
242
275
  user_identifier: str | None,
243
276
  tool_def,
277
+ runtime_source: str | None = None,
244
278
  **kwargs,
245
279
  ) -> dict:
246
280
  # 2. Dispatch based on Tool Type
@@ -320,6 +354,17 @@ class Dispatcher:
320
354
  f"Error executing native tool '{method_name}': {str(e)}") from e
321
355
 
322
356
  else:
357
+ handler = type(self)._tool_type_handlers.get(str(tool_def.tool_type or "").strip().upper())
358
+ if handler:
359
+ logging.debug(f"Dispatching {tool_def.tool_type} tool: {function_name}")
360
+ return handler(
361
+ company_short_name=company_short_name,
362
+ function_name=function_name,
363
+ tool_def=tool_def,
364
+ user_identifier=user_identifier,
365
+ runtime_source=runtime_source,
366
+ arguments=dict(kwargs),
367
+ )
323
368
  raise IAToolkitException(
324
369
  IAToolkitException.ErrorType.EXTERNAL_SOURCE_ERROR,
325
370
  f"Unknown tool type '{tool_def.tool_type}'"
@@ -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.
@@ -1191,6 +1191,11 @@ class ToolService:
1191
1191
  raise IAToolkitException(IAToolkitException.ErrorType.MISSING_PARAMETER, "Name and Description are required")
1192
1192
 
1193
1193
  tool_type = tool_data.get('tool_type', Tool.TYPE_NATIVE)
1194
+ if str(tool_type or '').strip().upper() == Tool.TYPE_MCP:
1195
+ raise IAToolkitException(
1196
+ IAToolkitException.ErrorType.INVALID_OPERATION,
1197
+ "MCP tools are imported from a registered MCP server, not created by hand",
1198
+ )
1194
1199
  execution_config = tool_data.get('execution_config')
1195
1200
  output_contract = normalize_output_contract(tool_data.get('output_contract'))
1196
1201
  self._validate_tool_contract(tool_type, execution_config, output_contract, company=company)
@@ -1243,6 +1248,13 @@ class ToolService:
1243
1248
  raise IAToolkitException(IAToolkitException.ErrorType.INVALID_OPERATION, "Cannot modify System Tools")
1244
1249
  if tool.source == Tool.SOURCE_PACK:
1245
1250
  raise IAToolkitException(IAToolkitException.ErrorType.INVALID_OPERATION, "Cannot modify PACK tools")
1251
+ if tool.source == Tool.SOURCE_MCP:
1252
+ return self._update_mcp_tool(company_short_name, tool, tool_data, actor_identifier)
1253
+ if str(tool_data.get('tool_type') or '').strip().upper() == Tool.TYPE_MCP:
1254
+ raise IAToolkitException(
1255
+ IAToolkitException.ErrorType.INVALID_OPERATION,
1256
+ "A tool cannot be turned into an MCP tool; import it from its MCP server",
1257
+ )
1246
1258
 
1247
1259
  normalized_name = None
1248
1260
  if 'name' in tool_data or 'key' in tool_data:
@@ -1286,6 +1298,43 @@ class ToolService:
1286
1298
  )
1287
1299
  return tool.to_dict()
1288
1300
 
1301
+ MCP_TOOL_EDITABLE_FIELDS = ('description', 'is_active')
1302
+
1303
+ def _update_mcp_tool(self, company_short_name: str, tool, tool_data: dict,
1304
+ actor_identifier: str | None) -> dict:
1305
+ """
1306
+ An imported MCP tool mirrors a tool on its server: its name, schema and
1307
+ execution config come from there (and agents reference the name), so
1308
+ only what stays local can change here.
1309
+ """
1310
+ unsupported = sorted(
1311
+ key for key in tool_data.keys()
1312
+ if key not in self.MCP_TOOL_EDITABLE_FIELDS
1313
+ )
1314
+ if unsupported:
1315
+ raise IAToolkitException(
1316
+ IAToolkitException.ErrorType.INVALID_OPERATION,
1317
+ f"MCP tools only allow editing {list(self.MCP_TOOL_EDITABLE_FIELDS)}; "
1318
+ f"{unsupported} come from the MCP server",
1319
+ )
1320
+
1321
+ if 'description' in tool_data:
1322
+ description = str(tool_data.get('description') or '').strip()
1323
+ if not description:
1324
+ raise IAToolkitException(IAToolkitException.ErrorType.MISSING_PARAMETER, "Description is required")
1325
+ tool.description = description
1326
+ if 'is_active' in tool_data:
1327
+ tool.is_active = bool(tool_data['is_active'])
1328
+
1329
+ self.llm_query_repo.commit()
1330
+ self._notify_tool_lifecycle_hook(
1331
+ event=self.TOOL_EVENT_UPDATED,
1332
+ company_short_name=company_short_name,
1333
+ tool_obj=tool,
1334
+ actor_identifier=actor_identifier,
1335
+ )
1336
+ return tool.to_dict()
1337
+
1289
1338
  def delete_tool(
1290
1339
  self,
1291
1340
  company_short_name: str,
@@ -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
+ })();
@@ -53,6 +53,10 @@ function sanitizeHtmlFragment(html) {
53
53
  }
54
54
  });
55
55
  if (tag === 'a') {
56
+ // A link in an answer never replaces the chat: following it in
57
+ // the same tab loses the conversation on screen (e.g. the link to
58
+ // connect an external MCP account).
59
+ el.setAttribute('target', '_blank');
56
60
  el.setAttribute('rel', 'noopener noreferrer');
57
61
  }
58
62
  walk(el);