iatoolkit 2.53.0__tar.gz → 2.54.0__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 (252) hide show
  1. {iatoolkit-2.53.0/src/iatoolkit.egg-info → iatoolkit-2.54.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/core.py +7 -0
  4. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_proxy.py +21 -0
  5. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/locales/en.yaml +7 -0
  6. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/locales/es.yaml +7 -0
  7. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/database_manager.py +31 -0
  8. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/models.py +2 -0
  9. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/dispatcher_service.py +45 -0
  10. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/tool_service.py +49 -0
  11. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_main.js +4 -0
  12. {iatoolkit-2.53.0 → iatoolkit-2.54.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  13. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/LICENSE +0 -0
  14. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/LICENSE_COMMUNITY.md +0 -0
  15. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/pyproject.toml +0 -0
  16. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/readme.md +0 -0
  17. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/setup.cfg +0 -0
  18. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/base_company.py +0 -0
  19. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/cli_commands.py +0 -0
  20. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/__init__.py +0 -0
  21. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/bridge_validation.py +0 -0
  22. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/exceptions.py +0 -0
  23. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  24. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  25. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  26. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  27. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  28. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  29. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  30. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  31. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/model_registry.py +0 -0
  32. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/routes.py +0 -0
  33. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  34. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/session_manager.py +0 -0
  35. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/text_splitter.py +0 -0
  36. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/url_safety.py +0 -0
  37. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/common/util.py +0 -0
  38. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/company_registry.py +0 -0
  39. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/__init__.py +0 -0
  40. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  41. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  42. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  43. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  44. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  45. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  46. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  47. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  48. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  49. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  50. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  51. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  52. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  53. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  54. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  55. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  56. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  57. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  58. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  59. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  60. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  61. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  62. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  63. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  64. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  65. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  66. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  67. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  68. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  69. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/__init__.py +0 -0
  70. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  71. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/call_service.py +0 -0
  72. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  73. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  74. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  75. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  76. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  77. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  78. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  79. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  80. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  81. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  82. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  83. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  84. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  85. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  86. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  87. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  88. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  89. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  90. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  91. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  92. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/llm_response.py +0 -0
  93. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  94. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/__init__.py +0 -0
  95. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  96. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  97. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  98. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  99. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  100. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  101. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  102. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  103. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  104. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  105. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  106. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  107. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  108. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  109. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/runtime_logging.py +0 -0
  110. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/__init__.py +0 -0
  111. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/api_key_service.py +0 -0
  112. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  113. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/auth_service.py +0 -0
  114. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/branding_service.py +0 -0
  115. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/company_context_service.py +0 -0
  116. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/configuration_service.py +0 -0
  117. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  118. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/embedding_service.py +0 -0
  119. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/excel_service.py +0 -0
  120. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  121. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  122. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  123. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/i18n_service.py +0 -0
  124. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/inference_service.py +0 -0
  125. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/jwt_service.py +0 -0
  126. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  127. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/language_service.py +0 -0
  128. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/license_service.py +0 -0
  129. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  130. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/mail_service.py +0 -0
  131. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  132. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  133. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  134. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  135. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  136. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/memory_service.py +0 -0
  137. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  138. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  139. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  140. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/operator_identity_service.py +0 -0
  141. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  142. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  143. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  144. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  145. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  146. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  147. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  148. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  149. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  150. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  151. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  152. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/pdf_service.py +0 -0
  153. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/profile_service.py +0 -0
  154. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  155. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/prompt_service.py +0 -0
  156. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/query_service.py +0 -0
  157. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  158. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  159. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/sql_service.py +0 -0
  160. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  161. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/storage_service.py +0 -0
  162. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  163. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  164. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/system_tools.py +0 -0
  165. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  166. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  167. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  168. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  169. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  170. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  171. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  172. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/warmup_service.py +0 -0
  173. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  174. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  175. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  176. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  177. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/services/web_search_service.py +0 -0
  178. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  179. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  180. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  181. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  182. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  183. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  184. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  185. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  186. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  187. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  188. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  189. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  190. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  191. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  192. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  193. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  194. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/styles/documents.css +0 -0
  195. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  196. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  197. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  198. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/_company_header.html +0 -0
  199. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  200. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/account.html +0 -0
  201. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/base.html +0 -0
  202. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/change_password.html +0 -0
  203. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/chat.html +0 -0
  204. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  205. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  206. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/error.html +0 -0
  207. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  208. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  209. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  210. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  211. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  212. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  213. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  214. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  215. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/templates/signup.html +0 -0
  216. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/__init__.py +0 -0
  217. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/account_view.py +0 -0
  218. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  219. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/base_login_view.py +0 -0
  220. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  221. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/change_password_view.py +0 -0
  222. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  223. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/chat_view.py +0 -0
  224. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  225. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  226. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  227. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  228. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  229. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/history_api_view.py +0 -0
  230. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/home_view.py +0 -0
  231. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  232. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  233. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  234. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/login_view.py +0 -0
  235. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  236. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  237. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  238. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  239. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  240. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  241. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  242. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  243. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/signup_view.py +0 -0
  244. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/static_page_view.py +0 -0
  245. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  246. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  247. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/users_api_view.py +0 -0
  248. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  249. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  250. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  251. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  252. {iatoolkit-2.53.0 → iatoolkit-2.54.0}/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.0
3
+ Version: 2.54.0
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.0"
6
+ __version__ = "2.54.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -175,6 +175,13 @@ class IAToolkit:
175
175
  logging.info("🔥 Startup warm-up completed for endpoints=%s", woken_endpoints)
176
176
  except Exception:
177
177
  logging.exception("⚠️ Startup warm-up failed.")
178
+ finally:
179
+ # The scoped session is per thread: whatever this thread read
180
+ # (the endpoint's credentials, from the secrets table) keeps its
181
+ # connection "idle in transaction" until the thread's own session
182
+ # is removed - and nothing else ever removes it.
183
+ if self.db_manager is not None:
184
+ self.db_manager.remove_session()
178
185
 
179
186
  thread = threading.Thread(target=_run_warmup, name="iatoolkit-startup-warmup", daemon=True)
180
187
  thread.start()
@@ -89,6 +89,23 @@ class LLMProxy:
89
89
  self._telemetry_service = NoopTelemetryService()
90
90
  return self._telemetry_service
91
91
 
92
+ @staticmethod
93
+ def _release_database_transaction() -> None:
94
+ """
95
+ Hands the request's database connection back to the pool before the
96
+ provider call. Resolved lazily, like telemetry: the proxy is also built
97
+ outside a running toolkit (tests, scripts), where there is nothing to
98
+ release.
99
+ """
100
+ try:
101
+ from iatoolkit import current_iatoolkit
102
+ from iatoolkit.repositories.database_manager import DatabaseManager
103
+
104
+ db_manager = current_iatoolkit().get_injector().get(DatabaseManager)
105
+ except Exception:
106
+ return
107
+ db_manager.release_idle_transaction()
108
+
92
109
  # -------------------------------------------------------------------------
93
110
  # Public API
94
111
  # -------------------------------------------------------------------------
@@ -146,6 +163,10 @@ class LLMProxy:
146
163
  if telemetry_execution is not None:
147
164
  request_kwargs["telemetry_execution"] = telemetry_execution
148
165
 
166
+ # Everything the call needs from the database is resolved by now; the
167
+ # model can take minutes, and the connection should not wait with it.
168
+ self._release_database_transaction()
169
+
149
170
  # Delegate to the adapter (OpenAI, Gemini, DeepSeek, xAI, Anthropic, etc.)
150
171
  return adapter.create_response(
151
172
  model=self._wire_model(model, model_config),
@@ -1247,6 +1247,13 @@ ui:
1247
1247
  run_duration_seconds: "Duration (s)"
1248
1248
  run_duration_minutes: "Duration (min)"
1249
1249
  duration_minutes_suffix: "mins."
1250
+ timing_duration: "Duration"
1251
+ timing_rate: "Rate"
1252
+ timing_eta: "ETA"
1253
+ timing_eta_after_discovery: "ETA after discovery"
1254
+ timing_eta_pending: "ETA pending"
1255
+ timing_processed_rate_suffix: "processed"
1256
+ timing_submitted_rate_suffix: "submitted"
1250
1257
  run_finished: "Finished"
1251
1258
  run_actions: "Actions"
1252
1259
  run_discovered: "Discovered"
@@ -1262,6 +1262,13 @@ ui:
1262
1262
  run_duration_seconds: "Duración (s)"
1263
1263
  run_duration_minutes: "Duración (min)"
1264
1264
  duration_minutes_suffix: "mins."
1265
+ timing_duration: "Duración"
1266
+ timing_rate: "Ritmo"
1267
+ timing_eta: "ETA"
1268
+ timing_eta_after_discovery: "ETA después de discovery"
1269
+ timing_eta_pending: "ETA pendiente"
1270
+ timing_processed_rate_suffix: "procesados"
1271
+ timing_submitted_rate_suffix: "enviados"
1265
1272
  run_finished: "Fin"
1266
1273
  run_actions: "Acciones"
1267
1274
  run_discovered: "Descubiertos"
@@ -324,6 +324,37 @@ class DatabaseManager(DatabaseProvider):
324
324
  def remove_session(self):
325
325
  self.scoped_session.remove()
326
326
 
327
+ def release_idle_transaction(self) -> bool:
328
+ """
329
+ Ends the current session's transaction and returns its connection to the
330
+ pool, before a call that waits on something other than the database.
331
+
332
+ Any read opens a transaction that lasts until the next commit, so a
333
+ session that read config or secrets and then waited minutes on an LLM
334
+ held its connection "idle in transaction" the whole time. A web process
335
+ serves many requests from one small pool, and a few such waits were
336
+ enough to time out every other request.
337
+
338
+ Commits rather than rolls back: a rollback expires every loaded object
339
+ and would discard writes already flushed. The session factory keeps
340
+ objects on commit, so callers go on using what they loaded. Leaves the
341
+ session alone when it has pending changes - committing them here would
342
+ be the caller's decision, not ours.
343
+ """
344
+ try:
345
+ if not self.scoped_session.registry.has():
346
+ return False
347
+ session = self.scoped_session.registry()
348
+ if not session.in_transaction():
349
+ return False
350
+ if session.new or session.dirty or session.deleted:
351
+ return False
352
+ session.commit()
353
+ return True
354
+ except Exception as e:
355
+ logging.debug("Could not release the idle database transaction: %s", e)
356
+ return False
357
+
327
358
  # -- execution methods ----
328
359
 
329
360
  def execute_query(self, query: str, commit: bool = False, params: dict | None = None) -> list[dict] | dict:
@@ -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}'"
@@ -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,
@@ -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);
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.53.0
3
+ Version: 2.54.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes