iatoolkit 2.25.1__tar.gz → 2.26.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. {iatoolkit-2.25.1/src/iatoolkit.egg-info → iatoolkit-2.26.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_tools_pack.yaml +30 -20
  4. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/file_connector.py +2 -2
  5. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +3 -2
  6. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +1 -1
  7. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/local_file_connector.py +1 -1
  8. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/s3_connector.py +46 -14
  9. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/locales/en.yaml +51 -7
  10. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/locales/es.yaml +51 -7
  11. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +8 -0
  12. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/embedding_service.py +100 -9
  13. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/markdown_wiki_service.py +66 -17
  14. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/storage_service.py +12 -1
  15. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/tenant_knowledge_wiki_service.py +161 -7
  16. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/tool_service.py +20 -4
  17. {iatoolkit-2.25.1 → iatoolkit-2.26.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  18. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/LICENSE +0 -0
  19. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/LICENSE_COMMUNITY.md +0 -0
  20. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/pyproject.toml +0 -0
  21. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/readme.md +0 -0
  22. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/requirements.txt +0 -0
  23. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/setup.cfg +0 -0
  24. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/base_company.py +0 -0
  25. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/cli_commands.py +0 -0
  26. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/__init__.py +0 -0
  27. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/exceptions.py +0 -0
  28. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  29. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  30. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  31. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  32. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  33. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  34. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  35. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  36. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/model_registry.py +0 -0
  37. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/routes.py +0 -0
  38. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  39. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/session_manager.py +0 -0
  40. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/util.py +0 -0
  41. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/company_registry.py +0 -0
  42. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/__init__.py +0 -0
  43. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  44. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  45. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  46. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  47. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  48. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  49. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  50. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  51. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  52. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  53. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  54. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  55. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  56. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  57. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  58. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  59. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  60. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  61. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  62. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  63. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  64. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  65. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  66. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  67. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  68. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  69. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  70. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  71. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/core.py +0 -0
  72. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/__init__.py +0 -0
  73. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  74. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/call_service.py +0 -0
  75. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  76. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  77. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  78. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  79. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  80. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  81. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  82. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  83. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  84. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  85. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  86. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  87. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  88. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  89. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  90. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  91. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_response.py +0 -0
  92. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  93. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/__init__.py +0 -0
  94. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  95. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  96. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  97. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  98. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  99. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  100. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  101. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  102. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/models.py +0 -0
  103. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  104. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  105. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  106. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  107. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  108. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/runtime_logging.py +0 -0
  109. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/__init__.py +0 -0
  110. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/api_key_service.py +0 -0
  111. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  112. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/auth_service.py +0 -0
  113. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  114. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/branding_service.py +0 -0
  115. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/company_context_service.py +0 -0
  116. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/configuration_service.py +0 -0
  117. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  118. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  119. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/excel_service.py +0 -0
  120. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  121. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  122. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  123. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/i18n_service.py +0 -0
  124. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/inference_service.py +0 -0
  125. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/jwt_service.py +0 -0
  126. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  127. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/language_service.py +0 -0
  128. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/license_service.py +0 -0
  129. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  130. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/mail_service.py +0 -0
  131. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  132. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  133. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  134. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  135. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_service.py +0 -0
  136. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  137. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  138. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  139. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  140. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  141. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  142. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  143. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  144. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  145. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  146. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  147. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  148. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  149. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  150. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/pdf_service.py +0 -0
  151. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/profile_service.py +0 -0
  152. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  153. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/prompt_service.py +0 -0
  154. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/query_service.py +0 -0
  155. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  156. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  157. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/sql_service.py +0 -0
  158. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  159. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  160. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  161. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/system_tools.py +0 -0
  162. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  163. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  164. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  165. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  166. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  167. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  168. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/warmup_service.py +0 -0
  169. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  170. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  171. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  172. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  173. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search_service.py +0 -0
  174. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  175. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  176. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  177. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  178. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  179. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  180. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  181. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  182. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  183. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  184. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  185. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  186. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  187. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  188. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  189. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  190. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  191. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/documents.css +0 -0
  192. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  193. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  194. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  195. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/_company_header.html +0 -0
  196. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  197. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/account.html +0 -0
  198. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/base.html +0 -0
  199. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/change_password.html +0 -0
  200. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/chat.html +0 -0
  201. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  202. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  203. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/error.html +0 -0
  204. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  205. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  206. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  207. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  208. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  209. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  210. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  211. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  212. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/signup.html +0 -0
  213. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/__init__.py +0 -0
  214. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/account_view.py +0 -0
  215. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  216. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/base_login_view.py +0 -0
  217. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  218. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/change_password_view.py +0 -0
  219. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  220. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/chat_view.py +0 -0
  221. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  222. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  223. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  224. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  225. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  226. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/history_api_view.py +0 -0
  227. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/home_view.py +0 -0
  228. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  229. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  230. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  231. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/login_view.py +0 -0
  232. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  233. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  234. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  235. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  236. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  237. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  238. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  239. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  240. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/signup_view.py +0 -0
  241. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/static_page_view.py +0 -0
  242. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  243. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  244. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/users_api_view.py +0 -0
  245. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  246. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  247. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  248. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  249. {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.25.1
3
+ Version: 2.26.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- __version__ = "2.25.1"
6
+ __version__ = "2.26.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -276,8 +276,8 @@ tools:
276
276
  description: "Opcional en la práctica. Usa null cuando no necesites filtrar por metadata. No inventes filtros ni envíes [] por defecto. Ejemplo: [{'key':'doc.type','value':'invoice'},{'key':'chunk.source_type','value':'table'}]."
277
277
  required:
278
278
  - query
279
- - function_name: iat_knowledge_wiki_search
280
- description: Busca páginas publicadas dentro de las wikis de conocimiento compartidas por la empresa. Úsala para políticas, playbooks, procesos, runbooks, conocimiento operativo, onboarding, guías por área o información curada del tenant. No es memoria personal del usuario ni búsqueda documental cruda.
279
+ - function_name: iat_wiki_search
280
+ description: Busca páginas publicadas dentro de las wikis de conocimiento compartidas por la empresa. Úsala como acelerador cuando necesites encontrar rápidamente una página relevante, pero no como punto de entrada por defecto. Si no conoces un `path` válido, primero llama `iat_wiki_get_page` con `path="/"` para leer el índice raíz de la wiki y seguir sus links exactos. `wiki_key` es el identificador estable de una wiki publicada, por ejemplo `sales`, `ops` o `hr`; úsalo cuando ya sepas en qué wiki buscar y omítelo cuando quieras buscar en todas las wikis publicadas disponibles en esta conexión MCP. Esta tool devuelve candidatos; luego usa `iat_wiki_get_page` para leer la página completa antes de responder.
281
281
  routing:
282
282
  force_include_capability: has_knowledge_wikis
283
283
  routing_profile:
@@ -292,15 +292,15 @@ tools:
292
292
  - onboarding
293
293
  - wiki
294
294
  intents:
295
- - Search curated company wiki pages for policies, processes, playbooks, runbooks, or area knowledge.
296
- - Retrieve published tenant knowledge before answering operational questions.
297
- - Find the relevant company wiki page when the user asks about internal procedures.
295
+ - Search curated company wiki pages when direct lookup is faster than browsing the root index.
296
+ - Find the relevant company wiki page after the user asks about internal procedures, policies, or runbooks.
297
+ - Narrow down which exact page to open with iat_wiki_get_page.
298
298
  examples:
299
- - iat_knowledge_wiki_search(query="politica de descuentos enterprise", wiki_key="sales", limit=5)
300
- - iat_knowledge_wiki_search(query="como escalar incidentes sev1", wiki_key="ops", limit=3)
301
- - iat_knowledge_wiki_search(query="onboarding de nuevos ejecutivos", limit=5)
299
+ - iat_wiki_search(query="politica de descuentos enterprise", wiki_key="sales", limit=5)
300
+ - iat_wiki_search(query="como escalar incidentes sev1", wiki_key="ops", limit=3)
301
+ - iat_wiki_search(query="onboarding de nuevos ejecutivos", limit=5)
302
302
  cost:
303
- penalty: 0.07
303
+ penalty: 0.09
304
304
  latency_class: low
305
305
  expensive: false
306
306
  parameters:
@@ -308,22 +308,25 @@ tools:
308
308
  properties:
309
309
  query:
310
310
  type: string
311
- description: Texto que describe el conocimiento publicado que deseas recuperar.
311
+ description: Consulta en lenguaje natural sobre políticas, playbooks, procesos, runbooks o conocimiento curado publicado en las wikis del tenant.
312
312
  wiki_key:
313
313
  anyOf:
314
314
  - type: string
315
315
  - type: "null"
316
- description: Clave opcional de la wiki a consultar. Usa null para buscar en todas las wikis publicadas.
316
+ description: Clave estable de la wiki publicada, por ejemplo `sales`, `ops` o `hr`. Debe coincidir con el `wiki_key` expuesto por el catálogo/resource. Usa null para buscar en todas las wikis publicadas disponibles.
317
317
  limit:
318
318
  type: integer
319
- description: Cantidad máxima de páginas a recuperar.
319
+ description: Cantidad máxima de páginas candidatas a recuperar antes de elegir una para leer completa.
320
320
  minimum: 1
321
321
  maximum: 25
322
322
  required:
323
323
  - query
324
324
  - limit
325
- - function_name: iat_knowledge_wiki_get_page
326
- description: Recupera una página completa de una wiki de conocimiento compartida por la empresa usando wiki_key y path/slug. Úsala después de iat_knowledge_wiki_search cuando necesites leer el contenido completo antes de responder.
325
+ - function_name: iat_wiki_get_page
326
+ description: |-
327
+ Wiki entrypoint: llama `iat_wiki_get_page` con `path="/"` para cargar el índice raíz de una wiki de conocimiento publicada del tenant.
328
+ Lee UNA página de wiki y devuelve su contenido en Markdown. La wiki documenta contexto de negocio, áreas, sistemas internos, arquitectura, procesos, políticas, runbooks, onboarding, operaciones y glosarios. Es una wiki navegable por links: la página raíz `path="/"` es el punto de entrada y lista las páginas disponibles con sus paths exactos; después abre solo las páginas relevantes siguiendo esos links o los paths devueltos por `iat_wiki_search`.
329
+ `wiki_key` identifica la wiki publicada, por ejemplo `sales`, `ops` o `hr`. Los `path` son sensibles a mayúsculas y deben coincidir EXACTAMENTE con el link o path publicado; no los inventes ni los reconstruyas de memoria. Si no conoces un path válido, vuelve a llamar con `path="/"`. Esta tool es de solo lectura y es segura de usar siempre que la documentación interna de la empresa ayude a responder. Prefiere abrir pocas páginas puntuales antes de recorrer el corpus completo. Cuando respondas usando material de la wiki, cita la página usada.
327
330
  routing:
328
331
  force_include_capability: has_knowledge_wikis
329
332
  routing_profile:
@@ -334,14 +337,21 @@ tools:
334
337
  - page
335
338
  - markdown
336
339
  - wiki
340
+ - entrypoint
341
+ - index
342
+ - root
343
+ - internal_docs
337
344
  intents:
338
- - Open a published tenant wiki page by path or slug.
345
+ - Load the root index of a tenant knowledge wiki with path="/".
346
+ - Open a published tenant wiki page by exact path or slug.
339
347
  - Read the full markdown content of a company knowledge page before answering.
348
+ - Follow links from the root index or another wiki page to retrieve the exact page content.
340
349
  examples:
341
- - iat_knowledge_wiki_get_page(wiki_key="sales", path="pricing.md")
342
- - iat_knowledge_wiki_get_page(wiki_key="ops", path="incident-response.md")
350
+ - iat_wiki_get_page(wiki_key="sales", path="/")
351
+ - iat_wiki_get_page(wiki_key="sales", path="pricing.md")
352
+ - iat_wiki_get_page(wiki_key="ops", path="incident-response.md")
343
353
  cost:
344
- penalty: 0.04
354
+ penalty: 0.01
345
355
  latency_class: low
346
356
  expensive: false
347
357
  parameters:
@@ -349,10 +359,10 @@ tools:
349
359
  properties:
350
360
  wiki_key:
351
361
  type: string
352
- description: Clave de la wiki publicada.
362
+ description: Clave estable de la wiki publicada, por ejemplo `sales`, `ops` o `hr`.
353
363
  path:
354
364
  type: string
355
- description: Path o slug de la página a recuperar.
365
+ description: Usa `"/"` para leer el índice raíz de la wiki. En cualquier otro caso, envía el path o slug exacto de la página dentro de esa wiki, idealmente uno listado en el índice raíz o devuelto por `iat_wiki_search`.
356
366
  required:
357
367
  - wiki_key
358
368
  - path
@@ -9,7 +9,7 @@ from typing import List, Optional
9
9
 
10
10
  class FileConnector(ABC):
11
11
  @abstractmethod
12
- def list_files(self) -> List[str]:
12
+ def list_files(self, prefix: str | None = None) -> List[str]:
13
13
  pass
14
14
 
15
15
  @abstractmethod
@@ -25,4 +25,4 @@ class FileConnector(ABC):
25
25
  pass
26
26
 
27
27
  def generate_presigned_url(self, file_path: str, expiration: int = 3600) -> Optional[str]:
28
- return None
28
+ return None
@@ -36,11 +36,12 @@ class GoogleCloudStorageConnector(FileConnector):
36
36
  client = storage.Client.from_service_account_json(self.service_account_path)
37
37
  return client
38
38
 
39
- def list_files(self) -> List[dict]:
39
+ def list_files(self, prefix: str | None = None) -> List[dict]:
40
40
  """
41
41
  Lista todos los archivos en el bucket de GCS como diccionarios con claves 'path', 'name' y 'metadata'.
42
42
  """
43
- blobs = self.bucket.list_blobs()
43
+ normalized_prefix = str(prefix or "").strip().strip("/") or None
44
+ blobs = self.bucket.list_blobs(prefix=normalized_prefix)
44
45
 
45
46
  return [
46
47
  {
@@ -52,7 +52,7 @@ class GoogleDriveConnector(FileConnector):
52
52
  )
53
53
  return service
54
54
 
55
- def list_files(self) -> List[dict]:
55
+ def list_files(self, prefix: str | None = None) -> List[dict]:
56
56
  """
57
57
  Estándar: Lista todos los archivos como diccionarios con claves 'path', 'name' y 'metadata'.
58
58
  """
@@ -14,7 +14,7 @@ class LocalFileConnector(FileConnector):
14
14
  local_root = os.getenv("ROOT_DIR_LOCAL_FILES", '')
15
15
  self.directory = os.path.join(local_root, directory)
16
16
 
17
- def list_files(self) -> List[dict]:
17
+ def list_files(self, prefix: str | None = None) -> List[dict]:
18
18
  """
19
19
  Estándar: Lista todos los archivos como diccionarios con claves 'path', 'name' y 'metadata'.
20
20
  """
@@ -15,21 +15,32 @@ class S3Connector(FileConnector):
15
15
  self.folder = folder
16
16
  self.s3 = boto3.client('s3', **auth)
17
17
 
18
- def list_files(self) -> List[dict]:
18
+ def list_files(self, prefix: str | None = None) -> List[dict]:
19
19
  # List only real S3 objects representing files, excluding folder placeholders.
20
- # Construimos el prefijo evitando dobles barras si folder está vacío
21
- parts = [p.strip('/') for p in [self.prefix, self.folder] if p]
22
- prefix = "/".join(parts)
23
-
24
- # Agregamos slash final solo si hay prefijo, para listar "contenido de carpeta"
25
- if prefix:
26
- prefix += "/"
27
-
28
- response = self.s3.list_objects_v2(Bucket=self.bucket, Prefix=prefix)
29
- files = [
30
- obj for obj in response.get('Contents', [])
31
- if self._is_file_key(obj.get('Key'))
32
- ]
20
+ list_prefix = self._resolve_list_prefix(prefix)
21
+ files = []
22
+ continuation_token = None
23
+
24
+ while True:
25
+ params = {
26
+ "Bucket": self.bucket,
27
+ "Prefix": list_prefix,
28
+ }
29
+ if continuation_token:
30
+ params["ContinuationToken"] = continuation_token
31
+
32
+ response = self.s3.list_objects_v2(**params)
33
+ files.extend(
34
+ obj for obj in response.get('Contents', [])
35
+ if self._is_file_key(obj.get('Key'))
36
+ )
37
+
38
+ if not response.get("IsTruncated"):
39
+ break
40
+
41
+ continuation_token = response.get("NextContinuationToken")
42
+ if not continuation_token:
43
+ break
33
44
 
34
45
  return [
35
46
  {
@@ -44,6 +55,27 @@ class S3Connector(FileConnector):
44
55
  for obj in files
45
56
  ]
46
57
 
58
+ def _resolve_list_prefix(self, requested_prefix: str | None) -> str:
59
+ base_prefix = "/".join(p.strip("/") for p in [self.prefix, self.folder] if p)
60
+ normalized_requested = str(requested_prefix or "").strip().strip("/")
61
+
62
+ if normalized_requested:
63
+ if base_prefix and (
64
+ normalized_requested == base_prefix
65
+ or normalized_requested.startswith(f"{base_prefix}/")
66
+ ):
67
+ effective_prefix = normalized_requested
68
+ elif base_prefix:
69
+ effective_prefix = "/".join([base_prefix, normalized_requested])
70
+ else:
71
+ effective_prefix = normalized_requested
72
+ else:
73
+ effective_prefix = base_prefix
74
+
75
+ if effective_prefix:
76
+ return f"{effective_prefix.rstrip('/')}/"
77
+ return ""
78
+
47
79
  def _is_file_key(self, key: str | None) -> bool:
48
80
  return isinstance(key, str) and key != "" and not key.endswith("/")
49
81
 
@@ -626,10 +626,15 @@ ui:
626
626
  title: "Knowledge wikis"
627
627
  wikis: "Wikis"
628
628
  new_wiki: "New wiki"
629
+ create_wiki: "Create wiki"
630
+ select_wiki: "Select a wiki"
631
+ workspace_placeholder: "Choose a wiki from the list or create a new one."
629
632
  configure: "Configuration"
630
633
  key: "Key"
631
634
  name: "Name"
632
635
  root: "Storage root"
636
+ edit_root: "Edit storage root"
637
+ lock_root: "Lock storage root editing"
633
638
  status: "Status"
634
639
  status_published: "Published"
635
640
  status_draft: "Draft"
@@ -638,25 +643,64 @@ ui:
638
643
  pages: "Pages"
639
644
  index: "Index"
640
645
  mcp: "MCP"
641
- lint: "Review"
646
+ mcp_status: "MCP publication"
647
+ mcp_status_published: "Published"
648
+ mcp_status_unpublished: "Not published"
649
+ mcp_status_published_help: "This wiki index is already exposed as a resource in the tenant MCP catalog."
650
+ mcp_status_unpublished_help: "This wiki does not yet expose its index as an MCP resource."
651
+ mcp_wiki_key: "MCP wiki_key"
652
+ lint: "Validate"
653
+ validate: "Validate"
654
+ validation_results: "Validation results"
642
655
  sync: "Sync"
643
656
  issues: "issues"
644
- index_resource: "Index resource"
657
+ index_resource: "Resource URI"
658
+ mcp_publish_help: "This action publishes only this wiki's markdown index resource into MCP."
659
+ mcp_tools_help: "The tools iat_wiki_search and iat_wiki_get_page are enabled separately from the MCP manager."
660
+ mcp_step_publish_title: "1. Publish resource"
661
+ mcp_step_publish_text: "The Publish to MCP button adds or updates `iat://knowledge-wikis/{wiki_key}/index` in the tenant MCP resources."
662
+ mcp_step_tools_title: "2. Enable tools"
663
+ mcp_step_tools_text: "If you want tool-based search or page reads, enable `iat_wiki_search` and `iat_wiki_get_page` from the MCP manager."
664
+ mcp_step_usage_title: "3. Use wiki_key and path"
665
+ mcp_step_usage_text: "MCP clients can read this index first to discover pages, then use `wiki_key` and `path` with the tools."
645
666
  copy_uri: "Copy URI"
646
667
  publish_mcp: "Publish to MCP"
647
- open_mcp: "Open MCP"
668
+ republish_mcp: "Update publication"
669
+ open_mcp: "Open MCP manager"
648
670
  filter_pages: "Filter pages"
649
671
  loading: "Loading..."
650
672
  empty: "No wikis configured."
651
673
  no_pages: "No pages."
652
- no_issues: "No issues."
674
+ no_issues: "No issues found."
675
+ lint_summary_clean: "Checked {count} indexed pages. No issues found."
676
+ lint_summary_issues: "Checked {count} indexed pages. Found {issues} issues."
653
677
  missing_key: "Wiki key is required."
654
678
  save_ok: "Wiki saved."
655
679
  save_error: "Could not save wiki."
656
- sync_ok: "Sync queued."
680
+ delete_confirmation: "Delete wiki"
681
+ delete_message: "This removes the wiki configuration, generated index, and indexed pages. Source markdown files in storage are not deleted."
682
+ delete_ok: "Wiki deleted."
683
+ delete_error: "Could not delete wiki."
684
+ sync_ok: "Sync completed."
685
+ sync_partial_ok: "Sync completed with errors."
657
686
  sync_error: "Could not sync wiki."
658
- lint_ok: "Review completed."
659
- lint_error: "Could not review wiki."
687
+ sync_running: "Syncing..."
688
+ sync_results: "Sync result"
689
+ sync_status_idle: "Not run"
690
+ sync_status_success: "Completed"
691
+ sync_status_partial: "Completed with errors"
692
+ sync_status_error: "Failed"
693
+ sync_seen: "Files seen"
694
+ sync_indexed: "Pages indexed"
695
+ sync_failed: "Failed"
696
+ sync_finished_at: "Finished"
697
+ sync_first_error: "First error"
698
+ sync_summary_success: "Reviewed {seen} markdown files and indexed {indexed} pages."
699
+ sync_summary_partial: "Reviewed {seen} markdown files, indexed {indexed} pages, and found {failed} failures."
700
+ sync_summary_error: "Sync failed after reviewing {seen} markdown files. {failed} files could not be indexed."
701
+ sync_summary_empty: "No markdown files were found under this storage root."
702
+ lint_ok: "Validation completed."
703
+ lint_error: "Could not validate wiki."
660
704
  mcp_ok: "Wiki published to MCP."
661
705
  mcp_error: "Could not publish to MCP."
662
706
  copy_ok: "URI copied."
@@ -626,10 +626,15 @@ ui:
626
626
  title: "Wikis de conocimiento"
627
627
  wikis: "Wikis"
628
628
  new_wiki: "Nueva wiki"
629
+ create_wiki: "Crear wiki"
630
+ select_wiki: "Selecciona una wiki"
631
+ workspace_placeholder: "Elige una wiki del listado o crea una nueva."
629
632
  configure: "Configuración"
630
633
  key: "Clave"
631
634
  name: "Nombre"
632
635
  root: "Raíz storage"
636
+ edit_root: "Editar raíz storage"
637
+ lock_root: "Bloquear edición de raíz storage"
633
638
  status: "Estado"
634
639
  status_published: "Publicada"
635
640
  status_draft: "Borrador"
@@ -638,25 +643,64 @@ ui:
638
643
  pages: "Páginas"
639
644
  index: "Índice"
640
645
  mcp: "MCP"
641
- lint: "Revisar"
646
+ mcp_status: "Publicación MCP"
647
+ mcp_status_published: "Publicado"
648
+ mcp_status_unpublished: "No publicado"
649
+ mcp_status_published_help: "El índice de esta wiki ya está expuesto como resource en el catálogo MCP del tenant."
650
+ mcp_status_unpublished_help: "Esta wiki todavía no expone su índice como resource MCP."
651
+ mcp_wiki_key: "wiki_key MCP"
652
+ lint: "Validar"
653
+ validate: "Validar"
654
+ validation_results: "Resultados de validación"
642
655
  sync: "Sincronizar"
643
656
  issues: "hallazgos"
644
- index_resource: "Resource de índice"
657
+ index_resource: "URI del resource"
658
+ mcp_publish_help: "Esta acción publica en MCP solo el resource del índice markdown de esta wiki."
659
+ mcp_tools_help: "Las tools iat_wiki_search e iat_wiki_get_page se habilitan por separado desde el gestor MCP."
660
+ mcp_step_publish_title: "1. Publicar resource"
661
+ mcp_step_publish_text: "El botón Publicar en MCP agrega o actualiza `iat://knowledge-wikis/{wiki_key}/index` dentro de los resources MCP del tenant."
662
+ mcp_step_tools_title: "2. Habilitar tools"
663
+ mcp_step_tools_text: "Si quieres búsqueda o lectura por tool, habilita `iat_wiki_search` e `iat_wiki_get_page` desde el gestor MCP."
664
+ mcp_step_usage_title: "3. Usar wiki_key y path"
665
+ mcp_step_usage_text: "Los clientes MCP pueden leer primero este índice para descubrir páginas y luego usar `wiki_key` y `path` en las tools."
645
666
  copy_uri: "Copiar URI"
646
667
  publish_mcp: "Publicar en MCP"
647
- open_mcp: "Abrir MCP"
668
+ republish_mcp: "Actualizar publicación"
669
+ open_mcp: "Abrir gestor MCP"
648
670
  filter_pages: "Filtrar páginas"
649
671
  loading: "Cargando..."
650
672
  empty: "No hay wikis configuradas."
651
673
  no_pages: "No hay páginas."
652
- no_issues: "Sin issues."
674
+ no_issues: "Sin hallazgos."
675
+ lint_summary_clean: "Se revisaron {count} páginas indexadas. No se encontraron hallazgos."
676
+ lint_summary_issues: "Se revisaron {count} páginas indexadas. Se encontraron {issues} hallazgos."
653
677
  missing_key: "Debes ingresar una key de wiki."
654
678
  save_ok: "Wiki guardada."
655
679
  save_error: "No se pudo guardar la wiki."
656
- sync_ok: "Sincronización encolada."
680
+ delete_confirmation: "Eliminar wiki"
681
+ delete_message: "Se borrará la configuración de la wiki, el índice generado y las páginas indexadas. Los archivos markdown fuente del storage no se borran."
682
+ delete_ok: "Wiki eliminada."
683
+ delete_error: "No se pudo eliminar la wiki."
684
+ sync_ok: "Sincronización completada."
685
+ sync_partial_ok: "Sincronización completada con errores."
657
686
  sync_error: "No se pudo sincronizar la wiki."
658
- lint_ok: "Revisión completada."
659
- lint_error: "No se pudo revisar la wiki."
687
+ sync_running: "Sincronizando..."
688
+ sync_results: "Resultado de sincronización"
689
+ sync_status_idle: "Sin ejecutar"
690
+ sync_status_success: "Completada"
691
+ sync_status_partial: "Con errores"
692
+ sync_status_error: "Falló"
693
+ sync_seen: "Archivos vistos"
694
+ sync_indexed: "Páginas indexadas"
695
+ sync_failed: "Fallidas"
696
+ sync_finished_at: "Finalizó"
697
+ sync_first_error: "Primer error"
698
+ sync_summary_success: "Se revisaron {seen} archivos markdown y se indexaron {indexed} páginas."
699
+ sync_summary_partial: "Se revisaron {seen} archivos markdown, se indexaron {indexed} páginas y {failed} fallaron."
700
+ sync_summary_error: "La sincronización falló después de revisar {seen} archivos markdown. {failed} archivos no pudieron indexarse."
701
+ sync_summary_empty: "No se encontraron archivos markdown bajo esta raíz de storage."
702
+ lint_ok: "Validación completada."
703
+ lint_error: "No se pudo validar la wiki."
660
704
  mcp_ok: "Wiki publicada en MCP."
661
705
  mcp_error: "No se pudo publicar en MCP."
662
706
  copy_ok: "URI copiada."
@@ -89,6 +89,14 @@ class KnowledgeWikiRepo:
89
89
  self.session.commit()
90
90
  return wiki
91
91
 
92
+ def delete_wiki(self, company_id: int, wiki_key: str) -> KnowledgeWiki | None:
93
+ wiki = self.get_wiki_by_key(company_id, wiki_key)
94
+ if wiki is None:
95
+ return None
96
+ self.session.delete(wiki)
97
+ self.session.commit()
98
+ return wiki
99
+
92
100
  def get_page_by_path(self, wiki_id: int, path: str) -> KnowledgeWikiPage | None:
93
101
  if not wiki_id or not path:
94
102
  return None
@@ -181,16 +181,73 @@ class EmbeddingClientFactory:
181
181
  )
182
182
  self._clients = {} # Cache for storing initialized client wrappers
183
183
 
184
+ @staticmethod
185
+ def _freeze_value(value):
186
+ if isinstance(value, dict):
187
+ return tuple(
188
+ (str(key), EmbeddingClientFactory._freeze_value(item))
189
+ for key, item in sorted(value.items(), key=lambda pair: str(pair[0]))
190
+ )
191
+ if isinstance(value, list):
192
+ return tuple(EmbeddingClientFactory._freeze_value(item) for item in value)
193
+ return value
194
+
195
+ def _build_cache_key(
196
+ self,
197
+ company_short_name: str,
198
+ model_type: str,
199
+ config_section: str,
200
+ provider: str,
201
+ model: str | None,
202
+ dimensions: Optional[int],
203
+ embedding_config: dict,
204
+ openai_client_config: dict | None = None,
205
+ ) -> tuple:
206
+ cache_payload = {"embedding_config": dict(embedding_config or {})}
207
+ if provider == "openai" and isinstance(openai_client_config, dict):
208
+ cache_payload["openai_client_config"] = {
209
+ "api_key": openai_client_config.get("api_key") or "",
210
+ "base_url": openai_client_config.get("base_url") or "",
211
+ "default_headers": dict(openai_client_config.get("default_headers") or {}),
212
+ }
213
+
214
+ return (
215
+ company_short_name,
216
+ model_type,
217
+ config_section,
218
+ provider,
219
+ model or "",
220
+ dimensions,
221
+ self._freeze_value(cache_payload),
222
+ )
223
+
224
+ def _drop_stale_cache_entries(self, company_short_name: str, model_type: str, active_cache_key: tuple) -> None:
225
+ stale_keys = [
226
+ key
227
+ for key in self._clients
228
+ if key[:2] == (company_short_name, model_type) and key != active_cache_key
229
+ ]
230
+ for stale_key in stale_keys:
231
+ self._clients.pop(stale_key, None)
232
+
233
+ @staticmethod
234
+ def _describe_transport(provider: str, openai_client_config: dict | None = None) -> str:
235
+ if provider != "openai":
236
+ return provider
237
+
238
+ base_url = str((openai_client_config or {}).get("base_url") or "").strip().lower()
239
+ if "gateway.ai.cloudflare.com" in base_url:
240
+ return "cloudflare/provider_native"
241
+ if base_url:
242
+ return "custom"
243
+ return "direct"
244
+
184
245
  def get_client(self, company_short_name: str, model_type: str = 'text') -> EmbeddingClientWrapper:
185
246
  """
186
247
  Retrieves a configured embedding client wrapper for a specific company.
187
248
  If the client is not in the cache, it creates and stores it.
188
249
  model_type: 'text' or 'image'
189
250
  """
190
- cache_key = (company_short_name, model_type)
191
- if cache_key in self._clients:
192
- return self._clients[cache_key]
193
-
194
251
  # Determine config section based on model type
195
252
  config_section = 'visual_embedding_provider' if model_type in ['image', 'image_query'] else 'embedding_provider'
196
253
 
@@ -213,6 +270,32 @@ class EmbeddingClientFactory:
213
270
  # Extract class path if provider is custom
214
271
  class_path = embedding_config.get('class_path')
215
272
 
273
+ openai_client_config = None
274
+ if provider == 'openai':
275
+ openai_client_config = self._get_openai_client_config(company_short_name, embedding_config)
276
+
277
+ cache_key = self._build_cache_key(
278
+ company_short_name=company_short_name,
279
+ model_type=model_type,
280
+ config_section=config_section,
281
+ provider=provider,
282
+ model=model,
283
+ dimensions=dimensions,
284
+ embedding_config=embedding_config,
285
+ openai_client_config=openai_client_config,
286
+ )
287
+ if cache_key in self._clients:
288
+ logging.debug(
289
+ "Reusing embedding client (%s) for '%s' from %s with model: %s provider=%s transport=%s",
290
+ model_type,
291
+ company_short_name,
292
+ config_section,
293
+ model,
294
+ provider,
295
+ self._describe_transport(provider, openai_client_config),
296
+ )
297
+ return self._clients[cache_key]
298
+
216
299
  # Logic to handle multiple providers
217
300
  wrapper = None
218
301
  if provider == 'custom_class':
@@ -276,11 +359,10 @@ class EmbeddingClientFactory:
276
359
  )
277
360
 
278
361
  elif provider == 'openai':
279
- client_config = self._get_openai_client_config(company_short_name, embedding_config)
280
362
  client = OpenAI(
281
- api_key=client_config["api_key"],
282
- base_url=client_config["base_url"] or None,
283
- default_headers=client_config["default_headers"] or None,
363
+ api_key=openai_client_config["api_key"],
364
+ base_url=openai_client_config["base_url"] or None,
365
+ default_headers=openai_client_config["default_headers"] or None,
284
366
  )
285
367
  if not model:
286
368
  model='text-embedding-ada-002'
@@ -288,7 +370,16 @@ class EmbeddingClientFactory:
288
370
  else:
289
371
  raise NotImplementedError(f"Embedding provider '{provider}' is not implemented.")
290
372
 
291
- logging.debug(f"Embedding client ({model_type}) for '{company_short_name}' created with model: {model}")
373
+ self._drop_stale_cache_entries(company_short_name, model_type, cache_key)
374
+ logging.debug(
375
+ "Embedding client (%s) for '%s' created from %s with model: %s provider=%s transport=%s",
376
+ model_type,
377
+ company_short_name,
378
+ config_section,
379
+ model,
380
+ provider,
381
+ self._describe_transport(provider, openai_client_config),
382
+ )
292
383
  self._clients[cache_key] = wrapper
293
384
  return wrapper
294
385