iatoolkit 2.74.3__tar.gz → 2.75.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 (283) hide show
  1. {iatoolkit-2.74.3/src/iatoolkit.egg-info → iatoolkit-2.75.1}/PKG-INFO +1 -1
  2. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/sql_core.prompt +6 -3
  4. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_tools_pack.yaml +33 -0
  5. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/company_context_service.py +42 -148
  6. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/context_builder_service.py +4 -2
  7. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/dispatcher_service.py +2 -0
  8. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/llm_client_service.py +3 -2
  9. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/prompt_service.py +3 -6
  10. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/resource_access_scope.py +11 -2
  11. iatoolkit-2.75.1/src/iatoolkit/services/sql_catalog_service.py +260 -0
  12. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/tool_service.py +30 -1
  13. {iatoolkit-2.74.3 → iatoolkit-2.75.1/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  14. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit.egg-info/SOURCES.txt +1 -1
  15. iatoolkit-2.74.3/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -1372
  16. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/LICENSE +0 -0
  17. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/LICENSE_COMMUNITY.md +0 -0
  18. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/pyproject.toml +0 -0
  19. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/readme.md +0 -0
  20. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/setup.cfg +0 -0
  21. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/base_company.py +0 -0
  22. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/cli_commands.py +0 -0
  23. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/__init__.py +0 -0
  24. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/access.py +0 -0
  25. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/bridge_validation.py +0 -0
  26. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/company_paths.py +0 -0
  27. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/exceptions.py +0 -0
  28. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  29. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  30. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  31. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/interfaces/history_compaction_trigger.py +0 -0
  32. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  33. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  34. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  35. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  36. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/memory_tools.py +0 -0
  37. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/model_registry.py +0 -0
  38. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/routes.py +0 -0
  39. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/search_terms.py +0 -0
  40. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/secret_resolver.py +0 -0
  41. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/session_manager.py +0 -0
  42. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/text_splitter.py +0 -0
  43. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/url_safety.py +0 -0
  44. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/common/util.py +0 -0
  45. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/company_registry.py +0 -0
  46. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/__init__.py +0 -0
  47. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  48. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_agents/history_compaction.prompt +0 -0
  49. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_agents/memory_compiler.prompt +0 -0
  50. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_agents/memory_correction.prompt +0 -0
  51. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_agents/memory_document_ingest.prompt +0 -0
  52. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_agents/memory_image_ingest.prompt +0 -0
  53. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_agents/memory_meeting_ingest.prompt +0 -0
  54. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_agents/memory_question_review.prompt +0 -0
  55. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_agents_pack.yaml +0 -0
  56. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  57. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  58. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  59. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  60. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  61. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  62. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  63. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  64. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  65. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  66. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  67. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  68. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  69. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  70. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  71. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  72. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  73. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  74. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  75. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  76. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  77. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  78. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  79. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  80. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  81. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/core.py +0 -0
  82. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/__init__.py +0 -0
  83. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  84. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/call_service.py +0 -0
  85. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  86. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  87. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  88. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  89. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  90. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  91. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  92. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/google_auth_client.py +0 -0
  93. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/google_chat_app.py +0 -0
  94. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  95. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/inference_handler.py +0 -0
  96. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  97. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  98. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  99. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  100. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  101. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  102. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  103. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  104. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  105. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_proxy.py +0 -0
  106. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/llm_response.py +0 -0
  107. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  108. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/locales/en.yaml +0 -0
  109. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/locales/es.yaml +0 -0
  110. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/__init__.py +0 -0
  111. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/advisory_lock.py +0 -0
  112. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  113. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  114. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/database_manager.py +0 -0
  115. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/document_repo.py +0 -0
  116. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  117. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  118. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  119. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  120. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  121. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/memory_question_repo.py +0 -0
  122. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/memory_repo.py +0 -0
  123. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/memory_usage_repo.py +0 -0
  124. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/models.py +0 -0
  125. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/profile_repo.py +0 -0
  126. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  127. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  128. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  129. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/repositories/vs_repo.py +0 -0
  130. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/runtime_logging.py +0 -0
  131. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/__init__.py +0 -0
  132. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/api_key_service.py +0 -0
  133. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  134. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/auth_service.py +0 -0
  135. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/branding_service.py +0 -0
  136. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/configuration_service.py +0 -0
  137. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/embedding_service.py +0 -0
  138. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/excel_service.py +0 -0
  139. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/file_processor_service.py +0 -0
  140. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/history_compaction_service.py +0 -0
  141. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/history_manager_service.py +0 -0
  142. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/http_tool_service.py +0 -0
  143. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/i18n_service.py +0 -0
  144. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/inference_service.py +0 -0
  145. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/jwt_service.py +0 -0
  146. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  147. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/language_service.py +0 -0
  148. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/license_service.py +0 -0
  149. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/mail_service.py +0 -0
  150. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  151. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/mcp_token_service.py +0 -0
  152. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  153. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  154. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/memory_question_service.py +0 -0
  155. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/memory_service.py +0 -0
  156. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/memory_sources.py +0 -0
  157. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/memory_usage_service.py +0 -0
  158. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  159. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/noop_history_compaction_trigger.py +0 -0
  160. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  161. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/operator_identity_service.py +0 -0
  162. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/__init__.py +0 -0
  163. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/contracts.py +0 -0
  164. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  165. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  166. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  167. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  168. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  169. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  170. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  171. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  172. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/parsers/validator.py +0 -0
  173. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/pdf_service.py +0 -0
  174. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/profile_service.py +0 -0
  175. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  176. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/query_service.py +0 -0
  177. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  178. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  179. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/sql_service.py +0 -0
  180. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/sql_source_service.py +0 -0
  181. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/storage_service.py +0 -0
  182. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/structured_output_service.py +0 -0
  183. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/system_agent_catalog.py +0 -0
  184. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/system_agent_runner.py +0 -0
  185. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  186. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/system_tools.py +0 -0
  187. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/telemetry_service.py +0 -0
  188. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  189. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/tool_output_contract.py +0 -0
  190. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/user_feedback_service.py +0 -0
  191. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/user_session_context_service.py +0 -0
  192. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/visual_kb_service.py +0 -0
  193. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/visual_tool_service.py +0 -0
  194. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/warmup_service.py +0 -0
  195. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/web_search/__init__.py +0 -0
  196. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  197. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  198. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  199. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/web_search_service.py +0 -0
  200. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/services/wiki_page_index_service.py +0 -0
  201. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/images/favicon.ico +0 -0
  202. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/images/favicon.png +0 -0
  203. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  204. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  205. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  206. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  207. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  208. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_header_navigation.js +0 -0
  209. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  210. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  211. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  212. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_main.js +0 -0
  213. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  214. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  215. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  216. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  217. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/styles/account.css +0 -0
  218. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  219. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  220. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/styles/chat_public.css +0 -0
  221. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/styles/documents.css +0 -0
  222. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/styles/landing_page.css +0 -0
  223. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/styles/llm_output.css +0 -0
  224. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/styles/onboarding.css +0 -0
  225. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/static/styles/wiki_page.css +0 -0
  226. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/_chat_header.html +0 -0
  227. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/_company_header.html +0 -0
  228. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/_login_widget.html +0 -0
  229. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/account.html +0 -0
  230. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/base.html +0 -0
  231. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/change_password.html +0 -0
  232. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/chat.html +0 -0
  233. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  234. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/chat_modals.html +0 -0
  235. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/error.html +0 -0
  236. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/forgot_password.html +0 -0
  237. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  238. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/login_global.html +0 -0
  239. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  240. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  241. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/pdf/base.html +0 -0
  242. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/pdf/letter.html +0 -0
  243. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/pdf/report.html +0 -0
  244. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/pdf/simple.html +0 -0
  245. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/signup.html +0 -0
  246. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/templates/wiki_page.html +0 -0
  247. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/__init__.py +0 -0
  248. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/account_view.py +0 -0
  249. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/api_key_api_view.py +0 -0
  250. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/base_login_view.py +0 -0
  251. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/categories_api_view.py +0 -0
  252. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/change_password_view.py +0 -0
  253. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  254. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/chat_view.py +0 -0
  255. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/configuration_api_view.py +0 -0
  256. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/connectors_api_view.py +0 -0
  257. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/embedding_api_view.py +0 -0
  258. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/forgot_password_view.py +0 -0
  259. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/help_content_api_view.py +0 -0
  260. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/history_api_view.py +0 -0
  261. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/home_view.py +0 -0
  262. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/init_context_api_view.py +0 -0
  263. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  264. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/load_document_api_view.py +0 -0
  265. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/login_view.py +0 -0
  266. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/logout_api_view.py +0 -0
  267. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/memory_api_view.py +0 -0
  268. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/profile_api_view.py +0 -0
  269. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/prompt_api_view.py +0 -0
  270. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  271. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  272. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/rag_api_view.py +0 -0
  273. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/root_redirect_view.py +0 -0
  274. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/signup_view.py +0 -0
  275. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/static_page_view.py +0 -0
  276. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/tool_api_view.py +0 -0
  277. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  278. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/users_api_view.py +0 -0
  279. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/verify_user_view.py +0 -0
  280. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit/views/wiki_page_view.py +0 -0
  281. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  282. {iatoolkit-2.74.3 → iatoolkit-2.75.1}/src/iatoolkit.egg-info/requires.txt +0 -0
  283. {iatoolkit-2.74.3 → iatoolkit-2.75.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.74.3
3
+ Version: 2.75.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.74.3"
6
+ __version__ = "2.75.1"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -3,10 +3,13 @@
3
3
  - Trabaja siempre con el dialecto SQL indicado para la base seleccionada.
4
4
  - Antes de escribir la consulta, revisa el contexto de la base y respeta su marcador
5
5
  `dialect=...` (por ejemplo `postgresql` o `mysql`).
6
- - Usa solo tablas, columnas y relaciones presentes en el schema provisto.
6
+ - El contexto lista las bases y sus tablas, sin columnas. Antes de escribir la
7
+ consulta, pide con `iat_sql_schema` las columnas de las tablas que vas a usar,
8
+ todas en una sola llamada. Si una columna no aparece, pide la tabla que la tiene
9
+ en vez de suponerla.
10
+ - Usa solo tablas de la lista y columnas que `iat_sql_schema` te haya mostrado.
7
11
  No inventes columnas ni supongas nombres parecidos.
8
- - Si la consulta requiere una base especifica, usa `iat_sql_query` con el
9
- `database_key` correcto.
12
+ - Ejecuta la consulta con `iat_sql_query` y el `database_key` correcto.
10
13
  - Si hay mas de una tabla, subconsulta o CTE, califica las columnas con alias
11
14
  en `SELECT`, `JOIN`, `ON`, `WHERE`, `GROUP BY`, `HAVING` y `ORDER BY`.
12
15
  - No mezcles sintaxis de distintos dialectos en la misma consulta.
@@ -220,6 +220,39 @@ tools:
220
220
  required:
221
221
  - database_key
222
222
  - query
223
+ - function_name: iat_sql_schema
224
+ description: "Columnas de tablas SQL: antes de escribir una consulta para iat_sql_query, pide aquí las columnas de las tablas que vas a usar. El contexto trae la lista de bases y tablas; esta herramienta trae sus columnas, tipos y descripciones. Pide varias tablas en una sola llamada."
225
+ routing:
226
+ force_include_capability: has_sql_sources
227
+ routing_profile:
228
+ tags:
229
+ - sql
230
+ - database
231
+ - schema
232
+ - columns
233
+ intents:
234
+ - Get the columns of SQL tables before writing a query.
235
+ - Inspect the structure of a configured SQL database.
236
+ examples:
237
+ - iat_sql_schema(database_key="erp", table_names=["customers", "orders"])
238
+ cost:
239
+ penalty: 0.05
240
+ latency_class: low
241
+ expensive: false
242
+ parameters:
243
+ type: object
244
+ properties:
245
+ database_key:
246
+ type: string
247
+ description: "Nombre exacto de la base, como aparece en el contexto."
248
+ table_names:
249
+ type: array
250
+ items:
251
+ type: string
252
+ description: "Tablas de esa base cuyas columnas necesitas (hasta 10)."
253
+ required:
254
+ - database_key
255
+ - table_names
223
256
  - function_name: iat_document_search
224
257
  description: Búsqueda semántica sobre documentos internos de la empresa para traer contexto adicional cuando haga falta. No usar si el usuario pide trabajar exclusivamente con un archivo ya adjunto en el turno actual. Usa metadata_filter solo cuando el usuario o el contexto indiquen un filtro de metadata concreto y necesario; si no hace falta, envía null.
225
258
  routing:
@@ -65,7 +65,6 @@ class CompanyContextService:
65
65
  sql_context = ""
66
66
  yaml_context = ""
67
67
  db_tables = []
68
- sql_source_table_scopes = {}
69
68
 
70
69
  # 1. Context from Markdown (context/*.md) files
71
70
  try:
@@ -85,7 +84,6 @@ class CompanyContextService:
85
84
  allowed_databases=allowed_databases,
86
85
  table_filter=table_filter)
87
86
  sql_context = sql_context.strip()
88
- sql_source_table_scopes = self._get_sql_source_table_scopes(company_short_name)
89
87
  except Exception as e:
90
88
  logging.warning(f"Could not generate SQL context for '{company_short_name}': {e}")
91
89
 
@@ -95,7 +93,6 @@ class CompanyContextService:
95
93
  yaml_schema_context = self._get_yaml_schema_context(
96
94
  company_short_name,
97
95
  db_tables,
98
- sql_source_table_scopes=sql_source_table_scopes,
99
96
  ).strip()
100
97
  if yaml_schema_context:
101
98
  yaml_context = f"## Esquemas adicionales\n\n{yaml_schema_context}"
@@ -153,17 +150,6 @@ class CompanyContextService:
153
150
  logging.warning(f"Could not generate SQL context for '{company_short_name}': {e}")
154
151
  return ""
155
152
 
156
- def _get_sql_source_table_scopes(self, company_short_name: str) -> dict[str, set[str] | None]:
157
- scopes: dict[str, set[str] | None] = {}
158
- sql_sources = self.sql_source_service.list_sources(company_short_name, include_inactive=False)
159
-
160
- for source in sql_sources:
161
- db_name = str(source.get("database") or "").strip()
162
- if not db_name:
163
- continue
164
- scopes[db_name] = self._resolve_allowed_tables_for_source(source)
165
- return scopes
166
-
167
153
  def _resolve_allowed_tables_for_source(self, source: dict) -> set[str] | None:
168
154
  if bool(source.get("include_all_tables", True)):
169
155
  return None
@@ -181,160 +167,59 @@ class CompanyContextService:
181
167
  return False
182
168
  return bool(cls._table_name_candidates(table_name) & allowed_tables)
183
169
 
170
+ @property
171
+ def sql_catalog(self):
172
+ """What of each SQL source a person sees (BL-017); built here, it reads this service's schema."""
173
+ if getattr(self, "_sql_catalog", None) is None:
174
+ from iatoolkit.services.sql_catalog_service import SqlCatalogService
175
+
176
+ self._sql_catalog = SqlCatalogService(self, self.sql_source_service, self.sql_service)
177
+ return self._sql_catalog
178
+
184
179
  def _get_sql_enriched_context(self, company_short_name: str, allowed_databases: List[str] | None = None,
185
180
  table_filter=None):
186
181
  """
187
- Generates the SQL context for the LLM using the enriched schema logic.
188
- It iterates over configured databases, fetches their enriched structure,
189
- and formats it into a prompt-friendly string.
190
- """
191
- sql_sources = self.sql_source_service.list_sources(company_short_name, include_inactive=False)
192
- if not sql_sources:
193
- return '', []
194
-
195
- allowed_database_set = {
196
- str(database or "").strip()
197
- for database in (allowed_databases or [])
198
- if str(database or "").strip()
199
- }
200
- if allowed_databases is not None and not allowed_database_set:
201
- return "", []
202
-
203
- context_output = []
204
- db_tables=[]
205
-
206
- for source in sql_sources:
207
- db_name = source.get('database')
208
- if not db_name:
209
- continue
210
- if allowed_database_set and db_name not in allowed_database_set:
211
- continue
212
-
213
- allowed_tables = self._resolve_allowed_tables_for_source(source)
214
-
215
- try:
216
- # 1. Get the Enriched Schema (Physical + YAML)
217
- enriched_structure = self.get_enriched_database_schema(company_short_name, db_name)
218
- if not enriched_structure:
219
- continue
220
-
221
- if allowed_tables is not None:
222
- enriched_structure = {
223
- table_name: table_data
224
- for table_name, table_data in enriched_structure.items()
225
- if self._table_is_allowed(table_name, allowed_tables)
226
- }
227
- if not enriched_structure:
228
- continue
229
- if table_filter is not None:
230
- # Tables the person may not query (enterprise's knowledge tables, BL-010).
231
- enriched_structure = {
232
- table_name: table_data
233
- for table_name, table_data in enriched_structure.items()
234
- if table_filter(db_name, table_name)
235
- }
236
- if not enriched_structure:
237
- continue
238
-
239
- # 2. Build Header for this Database
240
- dialect = self.sql_service.get_database_dialect(company_short_name, db_name)
241
- dialect_suffix = f" [dialect={dialect}]" if dialect else ""
242
- db_context = f"### Base SQL (`database_key`): {db_name}{dialect_suffix}\n"
243
-
244
- # Optional: Add DB description from config if available (useful context)
245
- db_desc = source.get('description', '')
246
- if db_desc:
247
- db_context += f"- Descripcion: {db_desc}\n"
248
-
249
- db_context += (
250
- f"- Usa `iat_sql_query` con `database_key='{db_name}'` para consultar esta base.\n"
251
- )
252
-
253
- # 3. Format Tables
254
- for table_name, table_data in enriched_structure.items():
255
- table_desc = table_data.get('description', '')
256
- columns = table_data.get('columns', [])
257
-
258
- # Table Header
259
- table_str = f"\n\n#### Tabla: `{table_name}`"
260
- if table_desc:
261
- table_str += f"\n- Descripcion: {table_desc}"
182
+ The SQL block of the base context: a map of each source the person may
183
+ query, its tables with a one-line description and no columns (BL-017).
262
184
 
263
- table_str += "\n- Columnas:"
264
-
265
- # Format Columns
266
- for col in columns:
267
- col_name = col.get('name')
268
- col_type = col.get('type', 'unknown')
269
- col_desc = col.get('description', '')
270
- col_props = col.get('properties') # Nested JSONB structure
271
-
272
- col_line = f"\n - `{col_name}` ({col_type})"
273
- if col_desc:
274
- col_line += f": {col_desc}"
275
-
276
- table_str += col_line
277
-
278
- # If it has nested properties (JSONB enriched from YAML), format them
279
- if col_props:
280
- table_str += "\n"
281
- table_str += self._format_json_schema(col_props, 2) # Indent level 2
282
-
283
- db_context += table_str
284
-
285
- # collect the table names for later use
286
- db_tables.append(
287
- {'db_name': db_name,
288
- 'table_name': table_name,
289
- }
290
- )
291
-
292
- context_output.append(db_context)
293
-
294
- except Exception as e:
295
- logging.warning(f"Could not generate enriched SQL context for '{db_name}': {e}")
296
-
297
- if not context_output:
298
- return "", []
299
-
300
- header = (
301
- "## Bases de datos SQL disponibles\n\n"
302
- "Estas son las bases SQL que puedes consultar usando `iat_sql_query`. "
303
- "El schema a continuacion incluye metadata enriquecida.\n"
185
+ The columns travel only when a question needs them, through
186
+ `iat_sql_schema`: the whole schema in the base context was resent on
187
+ every model call and never compacted (~33k tokens at Maxxa).
188
+ Returns the block and the (db_name, table_name) pairs it covers.
189
+ """
190
+ sources = self.sql_catalog.sources(
191
+ company_short_name, allowed_databases=allowed_databases, table_filter=table_filter,
304
192
  )
305
- return header + "\n\n---\n\n".join(context_output), db_tables
306
-
193
+ db_tables = [
194
+ {"db_name": source["database_key"], "table_name": table["name"]}
195
+ for source in sources
196
+ for table in source["tables"]
197
+ ]
198
+ return self.sql_catalog.render_map(sources), db_tables
307
199
 
308
200
  def _get_yaml_schema_context(
309
201
  self,
310
202
  company_short_name: str,
311
203
  db_tables: List[Dict],
312
- sql_source_table_scopes: dict[str, set[str] | None] | None = None,
313
204
  ) -> str:
314
205
  # Get context from .yaml schema files using the repository
315
206
  yaml_schema_context = ''
316
- sql_source_table_scopes = sql_source_table_scopes or {}
317
207
 
318
208
  try:
319
209
  # 1. List yaml files in the schema "folder"
320
210
  schema_files = self.asset_repo.list_files(company_short_name, AssetType.SCHEMA, extension='.yaml')
321
211
 
212
+ # A `<db>-<table>.yaml` of a configured SQL source belongs to the SQL
213
+ # schema, never to this block: it reaches the model through the
214
+ # catalogue (map + iat_sql_schema), which applies every filter. Read
215
+ # here, a table hidden from a person (a knowledge table they may not
216
+ # use) came back whole as an "additional schema".
217
+ sql_source_names = self._configured_sql_source_names(company_short_name)
218
+
322
219
  for filename in schema_files:
323
- # skip tables that are already in the SQL context
324
220
  if '-' in filename:
325
- dbname, f = filename.split("-", 1)
326
- table_name = f.split('.')[0]
327
-
328
- exists = any(
329
- item["db_name"] == dbname
330
- and bool(self._table_name_candidates(item["table_name"]) & self._table_name_candidates(table_name))
331
- for item in db_tables
332
- )
333
- if exists:
334
- continue
335
-
336
- allowed_tables = sql_source_table_scopes.get(dbname)
337
- if dbname in sql_source_table_scopes and not self._table_is_allowed(table_name, allowed_tables):
221
+ dbname = self._normalize_identifier(filename.split("-", 1)[0])
222
+ if dbname in sql_source_names:
338
223
  continue
339
224
 
340
225
  try:
@@ -357,6 +242,15 @@ class CompanyContextService:
357
242
 
358
243
  return yaml_schema_context
359
244
 
245
+ def _configured_sql_source_names(self, company_short_name: str) -> set[str]:
246
+ """Every SQL source of the company, active or not, by normalized name."""
247
+ try:
248
+ sources = self.sql_source_service.list_sources(company_short_name, include_inactive=True) or []
249
+ except Exception as e:
250
+ logging.warning(f"Could not list the SQL sources of '{company_short_name}': {e}")
251
+ return set()
252
+ return {self._normalize_identifier(s.get("database")) for s in sources if s.get("database")}
253
+
360
254
  def generate_schema_table(self, schema: dict) -> str:
361
255
  if not schema or not isinstance(schema, dict):
362
256
  return ""
@@ -403,8 +403,10 @@ class ContextBuilderService:
403
403
  company_short_name,
404
404
  allowed_databases=allowed_databases,
405
405
  table_filter=access.sql_table_filter(company_short_name, user_identifier),
406
- include_sql_context=bool(company_context_policy.get("sql_context")),
407
- include_yaml_context=bool(company_context_policy.get("yaml_context")),
406
+ # Only the Markdown block reaches an agent; its SQL is its bound sources
407
+ # (sql_context above), never the global map or the residual YAML.
408
+ include_sql_context=False,
409
+ include_yaml_context=False,
408
410
  )
409
411
  markdown_context = (
410
412
  company_context_blocks.get("markdown_context")
@@ -33,6 +33,8 @@ class Dispatcher:
33
33
  "iat_memory_answer_question",
34
34
  "iat_wiki_search",
35
35
  "iat_wiki_get_page",
36
+ # The schema shown is the person's: their sources and tables (BL-017).
37
+ "iat_sql_schema",
36
38
  }
37
39
  _tool_execution_hook = None
38
40
  # Tool types this module executes itself; an extension cannot take them over.
@@ -1606,8 +1606,9 @@ class llmClient:
1606
1606
  sql {sql_query}
1607
1607
 
1608
1608
  **INSTRUCCIÓN OBLIGATORIA:**
1609
- 1. Analiza el error y corrige la sintaxis de la consulta SQL anterior.
1610
- 2. Llama a la herramienta `{function_name}` **OTRA VEZ**, inmediatamente, con la consulta corregida.
1609
+ 1. Analiza el error y corrige la consulta SQL anterior. Si dice que una columna o una tabla
1610
+ no existe, pide primero sus columnas reales con `iat_sql_schema`; no adivines otro nombre.
1611
+ 2. Llama a la herramienta `{function_name}` **OTRA VEZ** con la consulta corregida.
1611
1612
  3. **NO** respondas al usuario con este mensaje de error. Tu ÚNICA acción debe ser volver a llamar a la herramienta con la solución.
1612
1613
  """
1613
1614
 
@@ -62,10 +62,11 @@ class PromptService:
62
62
  AGENT_ROLE_CHANNELS = PromptAgentRole.CHANNELS.value
63
63
  AGENT_ROLE_OPERATIONS = PromptAgentRole.OPERATIONS.value
64
64
  DEFAULT_CATEGORY_LABEL = "General"
65
+ # An agent's SQL comes only from the sources bound to it: "Global SQL" and
66
+ # "YAML" were removed, neither ever reached the agent's context. A stored
67
+ # policy that still names sql_context or yaml_context loads; the key is ignored.
65
68
  COMPANY_CONTEXT_BLOCK_KEYS = {
66
69
  "markdown_context",
67
- "sql_context",
68
- "yaml_context",
69
70
  }
70
71
 
71
72
  @inject
@@ -187,14 +188,10 @@ class PromptService:
187
188
  if normalized == cls.AGENT_ROLE_WORKSPACE_CHAT:
188
189
  blocks = {
189
190
  "markdown_context": True,
190
- "sql_context": True,
191
- "yaml_context": True,
192
191
  }
193
192
  else:
194
193
  blocks = {
195
194
  "markdown_context": True,
196
- "sql_context": False,
197
- "yaml_context": False,
198
195
  }
199
196
  return {
200
197
  "company_context_blocks": blocks,
@@ -32,7 +32,16 @@ from iatoolkit.common.exceptions import IAToolkitException
32
32
  from iatoolkit.repositories.database_manager import DatabaseManager
33
33
  from iatoolkit.repositories.models import CollectionType, Company, Document, KnowledgeWiki
34
34
 
35
- SQL_TOOLS = frozenset({"iat_sql_query"})
35
+ SQL_TOOLS = frozenset({"iat_sql_query", "iat_sql_schema"})
36
+ #: Tools whose access follows another tool's (BL-017): whoever may query may read
37
+ #: the schema of what they query, and nobody else. Without this a new tool falls
38
+ #: to the type default and can end up wider or narrower than the one it serves.
39
+ TOOL_ACCESS_ALIASES = {"iat_sql_schema": "iat_sql_query"}
40
+
41
+
42
+ def tool_access_key(function_name: str) -> str:
43
+ """The tool name whose access list decides this tool's access."""
44
+ return TOOL_ACCESS_ALIASES.get(function_name, function_name)
36
45
  COLLECTION_TOOLS = frozenset({"iat_document_search", "iat_document_list", "iat_image_search", "iat_visual_search"})
37
46
  DOCUMENT_READ_TOOLS = frozenset({"iat_document_read"})
38
47
  WIKI_TOOLS = frozenset({"iat_wiki_search", "iat_wiki_get_page"})
@@ -55,7 +64,7 @@ class ResourceAccessScope:
55
64
  """The call's arguments, narrowed to what the person may reach; raises PERMISSION otherwise."""
56
65
  if not user_identifier:
57
66
  return arguments
58
- if not access.can(company_short_name, user_identifier, USE, "tool", function_name):
67
+ if not access.can(company_short_name, user_identifier, USE, "tool", tool_access_key(function_name)):
59
68
  raise _denied(f"No access to the tool '{function_name}'.")
60
69
 
61
70
  scoped = dict(arguments)