iatoolkit 2.45.3__tar.gz → 2.46.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 (253) hide show
  1. {iatoolkit-2.45.3/src/iatoolkit.egg-info → iatoolkit-2.46.1}/PKG-INFO +1 -1
  2. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/util.py +12 -0
  4. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_providers/openai_adapter.py +6 -2
  5. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/locales/en.yaml +18 -13
  6. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/locales/es.yaml +30 -13
  7. iatoolkit-2.46.1/src/iatoolkit/services/operator_identity_service.py +136 -0
  8. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/base.html +20 -9
  9. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/home_view.py +4 -1
  10. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/login_view.py +5 -1
  11. {iatoolkit-2.45.3 → iatoolkit-2.46.1/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  12. iatoolkit-2.45.3/src/iatoolkit/services/operator_identity_service.py +0 -114
  13. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/LICENSE +0 -0
  14. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/LICENSE_COMMUNITY.md +0 -0
  15. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/pyproject.toml +0 -0
  16. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/readme.md +0 -0
  17. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/requirements.txt +0 -0
  18. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/setup.cfg +0 -0
  19. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/base_company.py +0 -0
  20. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/cli_commands.py +0 -0
  21. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/__init__.py +0 -0
  22. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/bridge_validation.py +0 -0
  23. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/exceptions.py +0 -0
  24. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  25. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  26. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  27. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  28. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  29. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  30. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  31. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  32. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/model_registry.py +0 -0
  33. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/routes.py +0 -0
  34. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/secret_resolver.py +0 -0
  35. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/common/session_manager.py +0 -0
  36. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/company_registry.py +0 -0
  37. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/__init__.py +0 -0
  38. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  39. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  40. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  41. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  42. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  43. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  44. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  45. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  46. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  47. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  48. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  49. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  50. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  51. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  52. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  53. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  54. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  55. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  56. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  57. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  58. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  59. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  60. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  61. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  62. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  63. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  64. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  65. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  66. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  67. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/core.py +0 -0
  68. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/__init__.py +0 -0
  69. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  70. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/call_service.py +0 -0
  71. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  72. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  73. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  74. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  75. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  76. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  77. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  78. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/google_auth_client.py +0 -0
  79. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/google_chat_app.py +0 -0
  80. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  81. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/inference_handler.py +0 -0
  82. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  83. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  84. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  85. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  86. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  87. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  88. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  89. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  90. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_proxy.py +0 -0
  91. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/llm_response.py +0 -0
  92. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  93. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/__init__.py +0 -0
  94. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  95. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  96. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/database_manager.py +0 -0
  97. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/document_repo.py +0 -0
  98. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  99. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  100. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  101. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  102. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  103. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/memory_repo.py +0 -0
  104. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/models.py +0 -0
  105. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/profile_repo.py +0 -0
  106. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  107. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  108. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  109. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/repositories/vs_repo.py +0 -0
  110. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/runtime_logging.py +0 -0
  111. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/__init__.py +0 -0
  112. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/api_key_service.py +0 -0
  113. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  114. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/auth_service.py +0 -0
  115. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/benchmark_service.py +0 -0
  116. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/branding_service.py +0 -0
  117. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/company_context_service.py +0 -0
  118. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/configuration_service.py +0 -0
  119. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/context_builder_service.py +0 -0
  120. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/dispatcher_service.py +0 -0
  121. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/embedding_service.py +0 -0
  122. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/excel_service.py +0 -0
  123. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/file_processor_service.py +0 -0
  124. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/history_manager_service.py +0 -0
  125. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/http_tool_service.py +0 -0
  126. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/i18n_service.py +0 -0
  127. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/inference_service.py +0 -0
  128. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/jwt_service.py +0 -0
  129. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  130. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/language_service.py +0 -0
  131. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/license_service.py +0 -0
  132. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/llm_client_service.py +0 -0
  133. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/mail_service.py +0 -0
  134. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  135. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/mcp_token_service.py +0 -0
  136. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  137. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/memory_lint_service.py +0 -0
  138. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  139. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/memory_service.py +0 -0
  140. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  141. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  142. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  143. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/__init__.py +0 -0
  144. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/contracts.py +0 -0
  145. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  146. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  147. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  148. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  149. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  150. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  151. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  152. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  153. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/parsers/validator.py +0 -0
  154. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/pdf_service.py +0 -0
  155. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/profile_service.py +0 -0
  156. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  157. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/prompt_service.py +0 -0
  158. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/query_service.py +0 -0
  159. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  160. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  161. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/sql_service.py +0 -0
  162. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/sql_source_service.py +0 -0
  163. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/storage_service.py +0 -0
  164. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/structured_output_service.py +0 -0
  165. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  166. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/system_tools.py +0 -0
  167. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/telemetry_service.py +0 -0
  168. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  169. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/tool_output_contract.py +0 -0
  170. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/tool_service.py +0 -0
  171. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/user_feedback_service.py +0 -0
  172. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/user_session_context_service.py +0 -0
  173. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/visual_kb_service.py +0 -0
  174. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/visual_tool_service.py +0 -0
  175. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/warmup_service.py +0 -0
  176. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/web_search/__init__.py +0 -0
  177. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  178. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  179. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  180. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/services/web_search_service.py +0 -0
  181. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  182. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  183. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  184. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  185. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  186. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  187. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  188. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  189. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_main.js +0 -0
  190. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  191. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  192. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  193. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  194. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  195. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  196. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  197. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/styles/chat_public.css +0 -0
  198. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/styles/documents.css +0 -0
  199. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/styles/landing_page.css +0 -0
  200. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/styles/llm_output.css +0 -0
  201. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/static/styles/onboarding.css +0 -0
  202. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/_company_header.html +0 -0
  203. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/_login_widget.html +0 -0
  204. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/account.html +0 -0
  205. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/change_password.html +0 -0
  206. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/chat.html +0 -0
  207. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  208. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/chat_modals.html +0 -0
  209. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/error.html +0 -0
  210. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/forgot_password.html +0 -0
  211. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  212. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  213. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  214. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/pdf/base.html +0 -0
  215. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/pdf/letter.html +0 -0
  216. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/pdf/report.html +0 -0
  217. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/pdf/simple.html +0 -0
  218. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/templates/signup.html +0 -0
  219. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/__init__.py +0 -0
  220. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/account_view.py +0 -0
  221. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/api_key_api_view.py +0 -0
  222. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/base_login_view.py +0 -0
  223. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/categories_api_view.py +0 -0
  224. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/change_password_view.py +0 -0
  225. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  226. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/chat_view.py +0 -0
  227. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/configuration_api_view.py +0 -0
  228. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/connectors_api_view.py +0 -0
  229. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/embedding_api_view.py +0 -0
  230. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/forgot_password_view.py +0 -0
  231. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/help_content_api_view.py +0 -0
  232. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/history_api_view.py +0 -0
  233. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/init_context_api_view.py +0 -0
  234. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  235. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/load_document_api_view.py +0 -0
  236. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/logout_api_view.py +0 -0
  237. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/memory_api_view.py +0 -0
  238. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/profile_api_view.py +0 -0
  239. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/prompt_api_view.py +0 -0
  240. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  241. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  242. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/rag_api_view.py +0 -0
  243. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/root_redirect_view.py +0 -0
  244. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/signup_view.py +0 -0
  245. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/static_page_view.py +0 -0
  246. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/tool_api_view.py +0 -0
  247. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  248. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/users_api_view.py +0 -0
  249. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit/views/verify_user_view.py +0 -0
  250. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  251. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  252. {iatoolkit-2.45.3 → iatoolkit-2.46.1}/src/iatoolkit.egg-info/requires.txt +0 -0
  253. {iatoolkit-2.45.3 → iatoolkit-2.46.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.45.3
3
+ Version: 2.46.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.45.3"
6
+ __version__ = "2.46.1"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -103,6 +103,18 @@ class Utility:
103
103
  logging.exception(e)
104
104
  return None
105
105
 
106
+ @staticmethod
107
+ def is_hosted_company_record(company) -> bool:
108
+ if not company:
109
+ return False
110
+
111
+ runtime_mode = str(getattr(company, "runtime_mode", "") or "").strip().lower()
112
+ if runtime_mode == "hosted":
113
+ return True
114
+
115
+ service_model = str(getattr(company, "service_model", "") or "").strip().lower()
116
+ return service_model == "hosted"
117
+
106
118
  def is_hosted_company_runtime(self, company_short_name: str) -> bool:
107
119
  try:
108
120
  from iatoolkit.company_registry import get_company_instance
@@ -92,12 +92,16 @@ class OpenAIAdapter:
92
92
  Important cases:
93
93
  - Assistant messages with `tool_calls` must become top-level `function_call` items.
94
94
  - `function_call_output` items must not include internal-only fields such as `status`.
95
+ - Without `previous_response_id`, include client-side `context_history` before
96
+ the current turn so OpenAI can run from locally managed history if needed.
95
97
  - When continuing from a prior response with `previous_response_id`, tool follow-ups
96
98
  should only append the `function_call_output` items because the previous response
97
99
  already contains the originating user/assistant turns on OpenAI's side.
98
100
  """
99
- _ = context_history
100
- combined_input: List[Dict[str, Any]] = list(input_items or [])
101
+ combined_input: List[Dict[str, Any]] = []
102
+ if not previous_response_id:
103
+ combined_input.extend(context_history or [])
104
+ combined_input.extend(input_items or [])
101
105
 
102
106
  has_function_outputs = any(
103
107
  isinstance(item, dict) and item.get("type") == "function_call_output"
@@ -2064,9 +2064,9 @@ ui:
2064
2064
  mcp:
2065
2065
  menu_label: "MCP"
2066
2066
  title: "MCP"
2067
- subtitle: "Define the tenant MCP catalog, review access, and manage advanced credentials from one workspace."
2067
+ subtitle: "Choose what this tenant publishes through MCP, review access, and manage advanced credentials from one workspace."
2068
2068
  tab_overview: "Overview"
2069
- tab_catalog: "Catalog"
2069
+ tab_catalog: "Publication"
2070
2070
  tab_apps: "Apps"
2071
2071
  tab_resources: "Resources"
2072
2072
  tab_settings: "Settings"
@@ -2082,7 +2082,7 @@ ui:
2082
2082
  legacy_banner_title: "A legacy MCP configuration was found in company.yaml"
2083
2083
  legacy_banner_body: "You can migrate it into the new database-backed MCP configuration and continue managing it from this screen."
2084
2084
  migrate_button: "Migrate from YAML"
2085
- card_tools: "Tools"
2085
+ card_tools: "Capabilities"
2086
2086
  card_agents: "Agents"
2087
2087
  card_data: "Data sources"
2088
2088
  card_apps: "Apps"
@@ -2090,20 +2090,22 @@ ui:
2090
2090
  card_prompts: "Prompts"
2091
2091
  card_warnings: "Warnings"
2092
2092
  items_label: "items"
2093
- surface_label: "MCP surface"
2094
- surface_title: "Published catalog"
2095
- surface_help: "Define the MCP primitives visible to external clients: tools, resources, and prompts."
2096
- tools_help: "Select the MCP tools this tenant publishes to external clients."
2097
- agents_help: "Select Tool for model-invoked use and Prompt for user-loaded MCP templates."
2098
- data_sources_help: "Publish SQL sources and knowledge collections that MCP tools can use."
2093
+ surface_label: "MCP publication"
2094
+ surface_title: "Published capabilities"
2095
+ surface_help: "Choose the capabilities, apps, resources, and prompts external MCP clients can see for this tenant."
2096
+ capabilities_title: "Published capabilities"
2097
+ capabilities_help: "Select what MCP clients can call. Data sources and company context are configured in the sections below."
2098
+ tools_help: "Select built-in MCP capabilities that users or models can call directly."
2099
+ agents_help: "Expose agents as callable tools for model use, as prompts for MCP clients, or both."
2100
+ data_sources_help: "Connect the SQL sources and retrieval collections required by the selected capabilities."
2099
2101
  prompts_help: "MCP prompts are selected from the IAToolkit agents list."
2100
2102
  prompts_empty_title: "No agents available"
2101
2103
  prompts_empty_body: "Create an active agent to publish it as an MCP tool or prompt."
2102
2104
  prompt_arguments_count: "{count} args"
2103
2105
  prompt_arguments_none: "No arguments"
2104
2106
  prompt_required_count: "{count} required"
2105
- expose_as_tool: "Tool"
2106
- expose_as_prompt: "Prompt"
2107
+ expose_as_tool: "As tool"
2108
+ expose_as_prompt: "As prompt"
2107
2109
  agent_role_operations: "Operations"
2108
2110
  agent_role_workspace_chat: "Workspace chat"
2109
2111
  agent_role_workspace_agent: "Workspace agent"
@@ -2121,8 +2123,11 @@ ui:
2121
2123
  enabled_help: "Expose this company's MCP catalog."
2122
2124
  interactive_auth_provider: "Interactive auth provider"
2123
2125
  service_api_key_name: "Legacy API key"
2124
- catalog_tools: "Exposed tools"
2125
- catalog_agents: "IAToolkit agents"
2126
+ catalog_tools: "Base MCP capabilities"
2127
+ catalog_agents: "Published agents"
2128
+ catalog_native_tools: "Company actions"
2129
+ native_tools_help: "Publish active IAToolkit tools that are not already covered by the base MCP capabilities."
2130
+ automatic_tools_note: "Automatic discovery capabilities included:"
2126
2131
  catalog_sql_sources: "Exposed SQL sources"
2127
2132
  catalog_collections: "Exposed RAG collections"
2128
2133
  catalog_resources: "MCP context resources"
@@ -1,5 +1,17 @@
1
1
  # locales/es.yaml
2
2
  emails:
3
+ invoice_issued:
4
+ subject: "Factura {invoice_id} · {company_name}"
5
+ title: "Tu factura del período"
6
+ greeting: "Hola,"
7
+ intro: "Emitimos la factura del período {period_start} al {period_end} para {company_name}."
8
+ total_label: "Total a pagar"
9
+ period_label: "Período"
10
+ due_label: "Pagar antes del"
11
+ invoice_label: "Factura"
12
+ transfer_title: "Datos para transferir"
13
+ reference_note: "Indica el número de factura {invoice_id} en la referencia de la transferencia."
14
+ footer: "Si ya realizaste el pago, ignora este correo."
3
15
  google_welcome:
4
16
  subject: "Bienvenido a IAToolkit"
5
17
  title: "Tu cuenta IAToolkit está lista"
@@ -2070,9 +2082,9 @@ ui:
2070
2082
  mcp:
2071
2083
  menu_label: "MCP"
2072
2084
  title: "MCP"
2073
- subtitle: "Define el catálogo MCP del tenant, revisa accesos y gestiona credenciales avanzadas desde una sola vista."
2085
+ subtitle: "Elige qué publica este tenant por MCP, revisa accesos y gestiona credenciales avanzadas desde una sola vista."
2074
2086
  tab_overview: "Overview"
2075
- tab_catalog: "Catálogo"
2087
+ tab_catalog: "Publicación"
2076
2088
  tab_apps: "Apps"
2077
2089
  tab_resources: "Resources"
2078
2090
  tab_settings: "Configuración"
@@ -2088,7 +2100,7 @@ ui:
2088
2100
  legacy_banner_title: "Se detectó configuración MCP legacy en company.yaml"
2089
2101
  legacy_banner_body: "Puedes migrarla a la nueva configuración persistida en base de datos y seguir administrándola desde esta pantalla."
2090
2102
  migrate_button: "Migrar desde YAML"
2091
- card_tools: "Tools"
2103
+ card_tools: "Capacidades"
2092
2104
  card_agents: "Agentes"
2093
2105
  card_data: "Fuentes de datos"
2094
2106
  card_apps: "Apps"
@@ -2096,20 +2108,22 @@ ui:
2096
2108
  card_prompts: "Prompts"
2097
2109
  card_warnings: "Alertas"
2098
2110
  items_label: "items"
2099
- surface_label: "Superficie MCP"
2100
- surface_title: "Catálogo publicado"
2101
- surface_help: "Define las primitivas MCP visibles para clientes externos: tools, resources y prompts."
2102
- tools_help: "Selecciona las tools MCP que el tenant publicará para clientes externos."
2103
- agents_help: "Marca Tool para permitir invocación automática por el modelo y Prompt para que el usuario lo cargue desde el cliente MCP."
2104
- data_sources_help: "Publica fuentes SQL y colecciones de conocimiento que las tools podrán utilizar."
2111
+ surface_label: "Publicación MCP"
2112
+ surface_title: "Capacidades publicadas"
2113
+ surface_help: "Elige qué capacidades, apps, resources y prompts podrán ver los clientes MCP externos de este tenant."
2114
+ capabilities_title: "Capacidades publicadas"
2115
+ capabilities_help: "Selecciona qué podrán invocar los clientes MCP. Las fuentes de datos y el contexto empresa se configuran en las secciones siguientes."
2116
+ tools_help: "Selecciona capacidades MCP base que usuarios o modelos podrán invocar directamente."
2117
+ agents_help: "Expone agentes como tools invocables por el modelo, como prompts para clientes MCP, o ambos."
2118
+ data_sources_help: "Conecta las fuentes SQL y colecciones de retrieval que necesitan las capacidades seleccionadas."
2105
2119
  prompts_help: "Los prompts MCP se eligen desde la lista de agentes IAToolkit."
2106
2120
  prompts_empty_title: "No hay agentes disponibles"
2107
2121
  prompts_empty_body: "Crea un agente activo para publicarlo como tool o prompt MCP."
2108
2122
  prompt_arguments_count: "{count} args"
2109
2123
  prompt_arguments_none: "Sin argumentos"
2110
2124
  prompt_required_count: "{count} requeridos"
2111
- expose_as_tool: "Tool"
2112
- expose_as_prompt: "Prompt"
2125
+ expose_as_tool: "Como tool"
2126
+ expose_as_prompt: "Como prompt"
2113
2127
  agent_role_operations: "Operaciones"
2114
2128
  agent_role_workspace_chat: "Chat workspace"
2115
2129
  agent_role_workspace_agent: "Agente workspace"
@@ -2127,8 +2141,11 @@ ui:
2127
2141
  enabled_help: "Expone el catálogo MCP de esta empresa."
2128
2142
  interactive_auth_provider: "Proveedor de autenticación interactiva"
2129
2143
  service_api_key_name: "API key legacy"
2130
- catalog_tools: "Tools expuestas"
2131
- catalog_agents: "Agentes IAToolkit"
2144
+ catalog_tools: "Capacidades base MCP"
2145
+ catalog_agents: "Agentes publicados"
2146
+ catalog_native_tools: "Acciones de la empresa"
2147
+ native_tools_help: "Publica tools IAToolkit activas que no están cubiertas por las capacidades base MCP."
2148
+ automatic_tools_note: "Capacidades automáticas de discovery incluidas:"
2132
2149
  catalog_sql_sources: "Fuentes SQL expuestas"
2133
2150
  catalog_collections: "Colecciones RAG expuestas"
2134
2151
  catalog_resources: "Resources de contexto MCP"
@@ -0,0 +1,136 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ import logging
7
+ import os
8
+
9
+ from injector import inject, singleton
10
+
11
+ from iatoolkit.common.exceptions import IAToolkitException
12
+
13
+
14
+ @singleton
15
+ class OperatorIdentityService:
16
+ """Who operates this deployment, and who collects from it — two questions.
17
+
18
+ They were one, answered by one name, and that held only because on our own
19
+ deployment the answers coincide. They came apart the first time a customer ran
20
+ IAToolkit on its own infrastructure: that installation *is* operated by its
21
+ company — its accounts live there, its console belongs to it — and it collects
22
+ from nobody. The monthly close refused to run because it asked for a merchant
23
+ account that had no reason to exist.
24
+
25
+ So:
26
+
27
+ * **The operator** is identity. Where this deployment's own accounts live,
28
+ which company you must be signed into to reach the control center, and which
29
+ company the console leaves out of its own portfolio. Every installation has
30
+ one.
31
+ * **The billing company** is money. Whose merchant account charges a card,
32
+ whose bank details sign a transfer notice, whose Stripe configuration holds
33
+ the webhook secret. Only an installation that collects has one, and it
34
+ defaults to the operator because usually they are the same company — but not
35
+ always: the company that runs the deployment and the entity that issues the
36
+ invoices can be in different countries.
37
+
38
+ Lives in the core because the core, Enterprise and the website all ask it, and
39
+ a rule restated in three repositories drifts. Same reason ``ServiceModel`` is
40
+ here.
41
+ """
42
+
43
+ #: Identity. Read on every request that reaches the console.
44
+ SETTING_NAME = "IAT_OPERATOR_COMPANY"
45
+
46
+ #: Money. Optional: absent means "the operator collects", which is the common
47
+ #: case. Named separately so an installation that collects for a different
48
+ #: legal entity can say so, and so one that collects for nobody can leave it
49
+ #: empty instead of inventing a merchant.
50
+ BILLING_SETTING_NAME = "IAT_BILLING_COMPANY_SHORT_NAME"
51
+
52
+ #: Held on the class, not the instance. Callers that have a repository at hand
53
+ #: build their own instance rather than asking the injector, so an instance
54
+ #: cache resolved — and logged, and queried the database — once per request
55
+ #: instead of once per process.
56
+ _resolved: str | None = None
57
+
58
+ @classmethod
59
+ def reset_cache(cls) -> None:
60
+ """Forget the resolved name. For tests: it cannot change at runtime."""
61
+ OperatorIdentityService._resolved = None
62
+
63
+ @classmethod
64
+ def stated_name(cls) -> str:
65
+ """The operator, as this deployment names it. Empty when nothing names it.
66
+
67
+ For callers with no database at hand — and there is nothing to verify: an
68
+ explicitly configured name was never checked against the database, and a
69
+ company that does not exist cannot authenticate anyone.
70
+
71
+ Empty rather than a guess. The name of another deployment travelling into
72
+ this one is what made a monthly close resolve the payment configuration of
73
+ a company that was not there and mark every invoice failed.
74
+ """
75
+ return (os.getenv(cls.SETTING_NAME) or "").strip().lower()
76
+
77
+ @classmethod
78
+ def stated_billing_name(cls) -> str:
79
+ """Who collects, as this deployment names it. Empty when nobody does."""
80
+ explicit = (os.getenv(cls.BILLING_SETTING_NAME) or "").strip().lower()
81
+ return explicit or cls.stated_name()
82
+
83
+ @inject
84
+ def __init__(self):
85
+ # No database: since the legacy fallback went away there is nothing to
86
+ # verify. The answers are two environment variables and a cache.
87
+ pass
88
+
89
+ def company_short_name(self) -> str:
90
+ """The operator company, resolved once per process.
91
+
92
+ Cached because the answer cannot change without a deployment, and this is
93
+ read on paths that run per request.
94
+ """
95
+ if OperatorIdentityService._resolved:
96
+ return OperatorIdentityService._resolved
97
+
98
+ configured = self.stated_name()
99
+ if configured:
100
+ OperatorIdentityService._resolved = configured
101
+ logging.info("Operator company: '%s' (from %s).", configured, self.SETTING_NAME)
102
+ return configured
103
+
104
+ # Deliberately loud, and about identity rather than money: without this
105
+ # name nobody can be signed in as the operator and the console has no
106
+ # portfolio to show.
107
+ raise IAToolkitException(
108
+ IAToolkitException.ErrorType.CONFIG_ERROR,
109
+ f"This deployment does not say who operates it. Set {self.SETTING_NAME} "
110
+ f"to the short name of the company that runs it.",
111
+ )
112
+
113
+ def billing_company_short_name(self) -> str:
114
+ """The company whose merchant account collects.
115
+
116
+ Falls back to the operator, because usually they are the same company.
117
+ Asked for only where money moves — a card being charged, a transfer notice
118
+ being signed, a webhook secret being read — so an installation that
119
+ collects from nobody never has to answer it.
120
+ """
121
+ explicit = (os.getenv(self.BILLING_SETTING_NAME) or "").strip().lower()
122
+ if explicit:
123
+ return explicit
124
+
125
+ try:
126
+ return self.company_short_name()
127
+ except IAToolkitException:
128
+ # The message has to be about collecting, because that is what the
129
+ # caller was doing. Pointing at the operator setting here sends
130
+ # somebody to configure identity for a payment problem.
131
+ raise IAToolkitException(
132
+ IAToolkitException.ErrorType.CONFIG_ERROR,
133
+ f"This deployment has no company to collect with. Set "
134
+ f"{self.BILLING_SETTING_NAME} to the company whose merchant "
135
+ f"account charges, or {self.SETTING_NAME} if the operator collects.",
136
+ )
@@ -57,17 +57,28 @@
57
57
  "target": "#page-content-wrapper"
58
58
  };
59
59
 
60
- {% if flashed_messages %}
60
+ {# Una plantilla puede dibujar sus propios avisos y apagar este camino:
61
+ la consola de hosting lo hace, porque un mensaje que obliga a actuar no
62
+ puede irse solo a los siete segundos. #}
63
+ {% if flashed_messages and not suppress_toasts %}
61
64
  {% for category, message in flashed_messages %}
62
- var toastClass = 'toast-info'; // default class
63
- if ('{{ category }}' === 'error') {
64
- toastClass = 'toast-error';
65
- } else if ('{{ category }}' === 'success') {
66
- toastClass = 'toast-success';
65
+ // El método, no solo la clase: `toastr.info` agrega `toast-info`
66
+ // al final y le ganaba a la clase que veníamos calculando, así
67
+ // que un error se veía igual que un aviso cualquiera.
68
+ var category = '{{ category }}';
69
+ var show = toastr.info;
70
+ if (category === 'error') {
71
+ show = toastr.error;
72
+ } else if (category === 'success') {
73
+ show = toastr.success;
74
+ } else if (category === 'warning') {
75
+ show = toastr.warning;
67
76
  }
68
-
69
- // Llama a Toastr usando la opción 'toastClass' para aplicar nuestro estilo
70
- toastr.info("{{ message }}", null, { "toastClass": "toast " + toastClass });
77
+ show("{{ message }}", null, { "toastClass": "toast toast-" + (
78
+ category === 'error' ? 'error' :
79
+ category === 'success' ? 'success' :
80
+ category === 'warning' ? 'warning' : 'info'
81
+ ) });
71
82
 
72
83
  {% endfor %}
73
84
  {% endif %}
@@ -43,7 +43,10 @@ class HomeView(MethodView):
43
43
  # 2. Verificamos si el archivo de plantilla personalizado no existe.
44
44
  if not home_template:
45
45
  # Hosted tenants do not require filesystem home templates.
46
- if self.util.is_hosted_company_runtime(company_short_name):
46
+ if (
47
+ Utility.is_hosted_company_record(company)
48
+ or self.util.is_hosted_company_runtime(company_short_name)
49
+ ):
47
50
  return render_template(
48
51
  "home_hosted_default.html",
49
52
  company_short_name=company_short_name,
@@ -17,6 +17,7 @@ from iatoolkit.services.branding_service import BrandingService
17
17
  from iatoolkit.services.configuration_service import ConfigurationService
18
18
  from iatoolkit.services.i18n_service import I18nService
19
19
  from iatoolkit.views.base_login_view import BaseLoginView
20
+ from iatoolkit.common.util import Utility
20
21
  import logging
21
22
  import secrets
22
23
  from urllib.parse import urljoin, urlparse
@@ -73,7 +74,10 @@ class LoginView(BaseLoginView):
73
74
  home_template = self.utility.get_company_template(company_short_name, template_name)
74
75
 
75
76
  if not home_template:
76
- if self.utility.is_hosted_company_runtime(company_short_name):
77
+ if (
78
+ Utility.is_hosted_company_record(company)
79
+ or self.utility.is_hosted_company_runtime(company_short_name)
80
+ ):
77
81
  return render_template(
78
82
  "home_hosted_default.html",
79
83
  company_short_name=company_short_name,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.45.3
3
+ Version: 2.46.1
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -1,114 +0,0 @@
1
- # Copyright (c) 2024 Fernando Libedinsky
2
- # Product: IAToolkit
3
- #
4
- # IAToolkit is open source software.
5
-
6
- import logging
7
- import os
8
-
9
- from injector import inject, singleton
10
-
11
- from iatoolkit.common.exceptions import IAToolkitException
12
- from iatoolkit.repositories.profile_repo import ProfileRepo
13
-
14
-
15
- @singleton
16
- class OperatorIdentityService:
17
- """Which company operates this deployment.
18
-
19
- One question that four places used to answer with the same typed string: where
20
- the operator's own accounts live, which company you must be signed into to
21
- reach the control center, whose portfolio the console lists, and — the one that
22
- handles money — whose merchant account collects invoices.
23
-
24
- Lives in the core because the core, Enterprise and the website all ask it, and
25
- a rule restated in three repositories drifts. Same reason ``ServiceModel`` is
26
- here.
27
- """
28
-
29
- #: The name this deployment used before the question was a setting. Kept as a
30
- #: fallback so nothing has to be configured here, but only honoured when the
31
- #: company actually exists: on any other deployment the name is meaningless,
32
- #: and silently accepting it is what made a monthly close resolve the payment
33
- #: configuration of a company that was not there and mark every invoice failed.
34
- LEGACY_COMPANY_SHORT_NAME = "iat_store"
35
-
36
- #: In order. The second name predates this service and is honoured by the
37
- #: Stripe webhook, so a deployment that already set it keeps working without
38
- #: being asked to set a second variable for the same fact.
39
- SETTING_NAMES = ("IAT_OPERATOR_COMPANY", "IAT_BILLING_COMPANY_SHORT_NAME")
40
- SETTING_NAME = SETTING_NAMES[0]
41
-
42
- #: Held on the class, not the instance. Callers that have a repository at hand
43
- #: build their own instance rather than asking the injector, so an instance
44
- #: cache resolved — and logged, and queried the database — once per request
45
- #: instead of once per process.
46
- _resolved: str | None = None
47
-
48
- @classmethod
49
- def reset_cache(cls) -> None:
50
- """Forget the resolved name. For tests: it cannot change at runtime."""
51
- OperatorIdentityService._resolved = None
52
-
53
- @classmethod
54
- def stated_name(cls) -> str:
55
- """What this deployment calls its operator, without checking it exists.
56
-
57
- For callers with no database at hand. The verification belongs on the
58
- money path — see ``company_short_name`` — and skipping it here is safe
59
- because those callers fail in the open: a company that does not exist
60
- cannot authenticate anyone and holds no payment configuration.
61
- """
62
- for setting in cls.SETTING_NAMES:
63
- value = (os.getenv(setting) or "").strip().lower()
64
- if value:
65
- return value
66
- return cls.LEGACY_COMPANY_SHORT_NAME
67
-
68
- @inject
69
- def __init__(self, profile_repo: ProfileRepo):
70
- self.profile_repo = profile_repo
71
-
72
- def company_short_name(self) -> str:
73
- """The operator company, resolved once per process.
74
-
75
- Cached because the answer cannot change without a deployment, and this is
76
- read on paths that run per request and per invoice.
77
- """
78
- if OperatorIdentityService._resolved:
79
- return OperatorIdentityService._resolved
80
-
81
- for setting in self.SETTING_NAMES:
82
- configured = (os.getenv(setting) or "").strip().lower()
83
- if configured:
84
- OperatorIdentityService._resolved = configured
85
- logging.info("Operator company: '%s' (from %s).", configured, setting)
86
- return configured
87
-
88
- if self._company_exists(self.LEGACY_COMPANY_SHORT_NAME):
89
- OperatorIdentityService._resolved = self.LEGACY_COMPANY_SHORT_NAME
90
- logging.info(
91
- "Operator company: '%s' (default). Set %s to name it explicitly.",
92
- OperatorIdentityService._resolved,
93
- self.SETTING_NAME,
94
- )
95
- return OperatorIdentityService._resolved
96
-
97
- # Deliberately loud. The alternative is what used to happen: a name from
98
- # another deployment travels down to the payment configuration and the
99
- # close writes failed invoices, which reads as a collection problem.
100
- raise IAToolkitException(
101
- IAToolkitException.ErrorType.CONFIG_ERROR,
102
- f"This deployment has no operator company. Set {self.SETTING_NAME} to the "
103
- f"short name of the company that operates it (there is no "
104
- f"'{self.LEGACY_COMPANY_SHORT_NAME}' company in this database).",
105
- )
106
-
107
- def _company_exists(self, short_name: str) -> bool:
108
- try:
109
- return self.profile_repo.get_company_by_short_name(short_name) is not None
110
- except Exception as exc:
111
- # Unreadable is not the same as absent, and guessing either way here is
112
- # worse than saying so: the caller gets the explicit error below.
113
- logging.warning("Could not check whether company '%s' exists: %s", short_name, exc)
114
- return False
File without changes
File without changes
File without changes
File without changes
File without changes