iatoolkit 2.25.0__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.0/src/iatoolkit.egg-info → iatoolkit-2.26.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_tools_pack.yaml +90 -0
  4. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/file_connector.py +2 -2
  5. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +3 -2
  6. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +1 -1
  7. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/local_file_connector.py +1 -1
  8. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/s3_connector.py +46 -14
  9. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/locales/en.yaml +84 -0
  10. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/locales/es.yaml +84 -0
  11. iatoolkit-2.26.0/src/iatoolkit/repositories/knowledge_wiki_repo.py +226 -0
  12. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/models.py +123 -0
  13. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/embedding_service.py +100 -9
  14. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/llm_client_service.py +148 -15
  15. iatoolkit-2.26.0/src/iatoolkit/services/markdown_wiki_service.py +328 -0
  16. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_wiki_service.py +16 -90
  17. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/query_service.py +1 -1
  18. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/storage_service.py +51 -0
  19. iatoolkit-2.26.0/src/iatoolkit/services/tenant_knowledge_wiki_service.py +815 -0
  20. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/tool_service.py +64 -1
  21. {iatoolkit-2.25.0 → iatoolkit-2.26.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  22. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/SOURCES.txt +3 -0
  23. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/LICENSE +0 -0
  24. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/LICENSE_COMMUNITY.md +0 -0
  25. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/pyproject.toml +0 -0
  26. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/readme.md +0 -0
  27. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/requirements.txt +0 -0
  28. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/setup.cfg +0 -0
  29. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/base_company.py +0 -0
  30. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/cli_commands.py +0 -0
  31. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/__init__.py +0 -0
  32. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/exceptions.py +0 -0
  33. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  34. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  35. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  36. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  37. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  38. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  39. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  40. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  41. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/model_registry.py +0 -0
  42. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/routes.py +0 -0
  43. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  44. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/session_manager.py +0 -0
  45. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/common/util.py +0 -0
  46. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/company_registry.py +0 -0
  47. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/__init__.py +0 -0
  48. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  49. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  50. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  51. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  52. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  53. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  54. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  55. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  56. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  57. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  58. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  59. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  60. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  61. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  62. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  63. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  64. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  65. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  66. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  67. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  68. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  69. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  70. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  71. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  72. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  73. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  74. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  75. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  76. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/core.py +0 -0
  77. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/__init__.py +0 -0
  78. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  79. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/call_service.py +0 -0
  80. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  81. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  82. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  83. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  84. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  85. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  86. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  87. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  88. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  89. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  90. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  91. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  92. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  93. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  94. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  95. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  96. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_response.py +0 -0
  97. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  98. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/__init__.py +0 -0
  99. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  100. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  101. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  102. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  103. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  104. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  105. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  106. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  107. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  108. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  109. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  110. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  111. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  112. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/runtime_logging.py +0 -0
  113. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/__init__.py +0 -0
  114. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/api_key_service.py +0 -0
  115. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  116. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/auth_service.py +0 -0
  117. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  118. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/branding_service.py +0 -0
  119. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/company_context_service.py +0 -0
  120. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/configuration_service.py +0 -0
  121. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  122. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  123. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/excel_service.py +0 -0
  124. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  125. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  126. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  127. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/i18n_service.py +0 -0
  128. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/inference_service.py +0 -0
  129. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/jwt_service.py +0 -0
  130. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  131. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/language_service.py +0 -0
  132. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/license_service.py +0 -0
  133. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/mail_service.py +0 -0
  134. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  135. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  136. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  137. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  138. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_service.py +0 -0
  139. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  140. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  141. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  142. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  143. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  144. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  145. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  146. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  147. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  148. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  149. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  150. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  151. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  152. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/pdf_service.py +0 -0
  153. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/profile_service.py +0 -0
  154. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  155. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/prompt_service.py +0 -0
  156. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  157. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  158. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/sql_service.py +0 -0
  159. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  160. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  161. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  162. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/system_tools.py +0 -0
  163. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  164. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  165. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  166. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  167. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  168. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  169. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/warmup_service.py +0 -0
  170. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  171. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  172. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  173. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  174. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search_service.py +0 -0
  175. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  176. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  177. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  178. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  179. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  180. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  181. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  182. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  183. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  184. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  185. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  186. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  187. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  188. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  189. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  190. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  191. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  192. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/documents.css +0 -0
  193. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  194. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  195. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  196. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/_company_header.html +0 -0
  197. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  198. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/account.html +0 -0
  199. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/base.html +0 -0
  200. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/change_password.html +0 -0
  201. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/chat.html +0 -0
  202. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  203. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  204. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/error.html +0 -0
  205. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  206. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  207. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  208. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  209. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  210. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  211. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  212. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  213. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/templates/signup.html +0 -0
  214. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/__init__.py +0 -0
  215. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/account_view.py +0 -0
  216. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  217. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/base_login_view.py +0 -0
  218. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  219. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/change_password_view.py +0 -0
  220. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  221. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/chat_view.py +0 -0
  222. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  223. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  224. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  225. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  226. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  227. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/history_api_view.py +0 -0
  228. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/home_view.py +0 -0
  229. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  230. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  231. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  232. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/login_view.py +0 -0
  233. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  234. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  235. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  236. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  237. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  238. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  239. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  240. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  241. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/signup_view.py +0 -0
  242. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/static_page_view.py +0 -0
  243. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  244. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  245. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/users_api_view.py +0 -0
  246. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  247. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  248. {iatoolkit-2.25.0 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  249. {iatoolkit-2.25.0 → 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.0
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.0"
6
+ __version__ = "2.26.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -276,6 +276,96 @@ 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_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
+ routing:
282
+ force_include_capability: has_knowledge_wikis
283
+ routing_profile:
284
+ tags:
285
+ - knowledge_wiki
286
+ - company_knowledge
287
+ - tenant_context
288
+ - playbook
289
+ - policy
290
+ - process
291
+ - runbook
292
+ - onboarding
293
+ - wiki
294
+ intents:
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
+ examples:
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
+ cost:
303
+ penalty: 0.09
304
+ latency_class: low
305
+ expensive: false
306
+ parameters:
307
+ type: object
308
+ properties:
309
+ query:
310
+ type: string
311
+ description: Consulta en lenguaje natural sobre políticas, playbooks, procesos, runbooks o conocimiento curado publicado en las wikis del tenant.
312
+ wiki_key:
313
+ anyOf:
314
+ - type: string
315
+ - type: "null"
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
+ limit:
318
+ type: integer
319
+ description: Cantidad máxima de páginas candidatas a recuperar antes de elegir una para leer completa.
320
+ minimum: 1
321
+ maximum: 25
322
+ required:
323
+ - query
324
+ - limit
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.
330
+ routing:
331
+ force_include_capability: has_knowledge_wikis
332
+ routing_profile:
333
+ tags:
334
+ - knowledge_wiki
335
+ - company_knowledge
336
+ - tenant_context
337
+ - page
338
+ - markdown
339
+ - wiki
340
+ - entrypoint
341
+ - index
342
+ - root
343
+ - internal_docs
344
+ intents:
345
+ - Load the root index of a tenant knowledge wiki with path="/".
346
+ - Open a published tenant wiki page by exact path or slug.
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.
349
+ examples:
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")
353
+ cost:
354
+ penalty: 0.01
355
+ latency_class: low
356
+ expensive: false
357
+ parameters:
358
+ type: object
359
+ properties:
360
+ wiki_key:
361
+ type: string
362
+ description: Clave estable de la wiki publicada, por ejemplo `sales`, `ops` o `hr`.
363
+ path:
364
+ type: string
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`.
366
+ required:
367
+ - wiki_key
368
+ - path
279
369
  - function_name: iat_memory_search
280
370
  description: Busca páginas relevantes dentro de la Memoria personal del usuario y retorna contexto compilado. Incluye la señal `has_native_files` cuando una memoria tiene archivos fuente que pueden adjuntarse nativamente al modelo. Debe usarse antes de responder preguntas sobre cosas guardadas, notas previas, memoria del usuario, continuidad entre sesiones o "lo que hablamos/guardé antes".
281
371
  routing:
@@ -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
 
@@ -621,6 +621,90 @@ ui:
621
621
  description: "Description"
622
622
  skills: "Skills"
623
623
 
624
+ knowledge_wikis:
625
+ menu_label: "Wikis"
626
+ title: "Knowledge wikis"
627
+ wikis: "Wikis"
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."
632
+ configure: "Configuration"
633
+ key: "Key"
634
+ name: "Name"
635
+ root: "Storage root"
636
+ edit_root: "Edit storage root"
637
+ lock_root: "Lock storage root editing"
638
+ status: "Status"
639
+ status_published: "Published"
640
+ status_draft: "Draft"
641
+ status_archived: "Archived"
642
+ description: "Description"
643
+ pages: "Pages"
644
+ index: "Index"
645
+ mcp: "MCP"
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"
655
+ sync: "Sync"
656
+ issues: "issues"
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."
666
+ copy_uri: "Copy URI"
667
+ publish_mcp: "Publish to MCP"
668
+ republish_mcp: "Update publication"
669
+ open_mcp: "Open MCP manager"
670
+ filter_pages: "Filter pages"
671
+ loading: "Loading..."
672
+ empty: "No wikis configured."
673
+ no_pages: "No pages."
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."
677
+ missing_key: "Wiki key is required."
678
+ save_ok: "Wiki saved."
679
+ save_error: "Could not save wiki."
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."
686
+ sync_error: "Could not sync 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."
704
+ mcp_ok: "Wiki published to MCP."
705
+ mcp_error: "Could not publish to MCP."
706
+ copy_ok: "URI copied."
707
+
624
708
  skills:
625
709
  title: "Skills"
626
710
  search_placeholder: "Search skills"
@@ -621,6 +621,90 @@ ui:
621
621
  description: "Descripción"
622
622
  skills: "Skills"
623
623
 
624
+ knowledge_wikis:
625
+ menu_label: "Wikis"
626
+ title: "Wikis de conocimiento"
627
+ wikis: "Wikis"
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."
632
+ configure: "Configuración"
633
+ key: "Clave"
634
+ name: "Nombre"
635
+ root: "Raíz storage"
636
+ edit_root: "Editar raíz storage"
637
+ lock_root: "Bloquear edición de raíz storage"
638
+ status: "Estado"
639
+ status_published: "Publicada"
640
+ status_draft: "Borrador"
641
+ status_archived: "Archivada"
642
+ description: "Descripción"
643
+ pages: "Páginas"
644
+ index: "Índice"
645
+ mcp: "MCP"
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"
655
+ sync: "Sincronizar"
656
+ issues: "hallazgos"
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."
666
+ copy_uri: "Copiar URI"
667
+ publish_mcp: "Publicar en MCP"
668
+ republish_mcp: "Actualizar publicación"
669
+ open_mcp: "Abrir gestor MCP"
670
+ filter_pages: "Filtrar páginas"
671
+ loading: "Cargando..."
672
+ empty: "No hay wikis configuradas."
673
+ no_pages: "No hay páginas."
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."
677
+ missing_key: "Debes ingresar una key de wiki."
678
+ save_ok: "Wiki guardada."
679
+ save_error: "No se pudo guardar la wiki."
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."
686
+ sync_error: "No se pudo sincronizar 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."
704
+ mcp_ok: "Wiki publicada en MCP."
705
+ mcp_error: "No se pudo publicar en MCP."
706
+ copy_ok: "URI copiada."
707
+
624
708
  skills:
625
709
  title: "Skills"
626
710
  search_placeholder: "Buscar skills"
@@ -0,0 +1,226 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from __future__ import annotations
7
+
8
+ from datetime import datetime
9
+
10
+ from injector import inject
11
+
12
+ from iatoolkit.repositories.database_manager import DatabaseManager
13
+ from iatoolkit.repositories.models import (
14
+ KnowledgeWiki,
15
+ KnowledgeWikiPage,
16
+ KnowledgeWikiPageStatus,
17
+ KnowledgeWikiStatus,
18
+ KnowledgeWikiSyncRun,
19
+ KnowledgeWikiSyncStatus,
20
+ )
21
+
22
+
23
+ class KnowledgeWikiRepo:
24
+ @inject
25
+ def __init__(self, db_manager: DatabaseManager):
26
+ self.session = db_manager.get_session()
27
+
28
+ def commit(self):
29
+ self.session.commit()
30
+
31
+ def rollback(self):
32
+ self.session.rollback()
33
+
34
+ def get_wiki_by_key(self, company_id: int, wiki_key: str) -> KnowledgeWiki | None:
35
+ if not company_id or not wiki_key:
36
+ return None
37
+ return (
38
+ self.session.query(KnowledgeWiki)
39
+ .filter_by(company_id=company_id, wiki_key=wiki_key)
40
+ .first()
41
+ )
42
+
43
+ def get_wiki(self, company_id: int, wiki_id: int) -> KnowledgeWiki | None:
44
+ if not company_id or not wiki_id:
45
+ return None
46
+ return (
47
+ self.session.query(KnowledgeWiki)
48
+ .filter_by(company_id=company_id, id=wiki_id)
49
+ .first()
50
+ )
51
+
52
+ def list_wikis(self, company_id: int, *, include_archived: bool = False) -> list[KnowledgeWiki]:
53
+ if not company_id:
54
+ return []
55
+ query = self.session.query(KnowledgeWiki).filter_by(company_id=company_id)
56
+ if not include_archived:
57
+ query = query.filter(KnowledgeWiki.status != KnowledgeWikiStatus.ARCHIVED)
58
+ return query.order_by(KnowledgeWiki.name.asc(), KnowledgeWiki.id.asc()).all()
59
+
60
+ def create_or_update_wiki(
61
+ self,
62
+ *,
63
+ company_id: int,
64
+ wiki_key: str,
65
+ name: str,
66
+ root_storage_key: str,
67
+ description: str | None = None,
68
+ status: KnowledgeWikiStatus = KnowledgeWikiStatus.PUBLISHED,
69
+ settings: dict | None = None,
70
+ ) -> KnowledgeWiki:
71
+ wiki = self.get_wiki_by_key(company_id, wiki_key)
72
+ if wiki:
73
+ wiki.name = name
74
+ wiki.description = description
75
+ wiki.root_storage_key = root_storage_key
76
+ wiki.status = status
77
+ wiki.settings = settings or {}
78
+ else:
79
+ wiki = KnowledgeWiki(
80
+ company_id=company_id,
81
+ wiki_key=wiki_key,
82
+ name=name,
83
+ description=description,
84
+ root_storage_key=root_storage_key,
85
+ status=status,
86
+ settings=settings or {},
87
+ )
88
+ self.session.add(wiki)
89
+ self.session.commit()
90
+ return wiki
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
+
100
+ def get_page_by_path(self, wiki_id: int, path: str) -> KnowledgeWikiPage | None:
101
+ if not wiki_id or not path:
102
+ return None
103
+ return (
104
+ self.session.query(KnowledgeWikiPage)
105
+ .filter_by(wiki_id=wiki_id, path=path)
106
+ .first()
107
+ )
108
+
109
+ def get_page_by_slug(self, wiki_id: int, slug: str) -> KnowledgeWikiPage | None:
110
+ if not wiki_id or not slug:
111
+ return None
112
+ return (
113
+ self.session.query(KnowledgeWikiPage)
114
+ .filter_by(wiki_id=wiki_id, slug=slug)
115
+ .first()
116
+ )
117
+
118
+ def list_pages(
119
+ self,
120
+ wiki_id: int,
121
+ *,
122
+ include_archived: bool = False,
123
+ limit: int = 500,
124
+ ) -> list[KnowledgeWikiPage]:
125
+ if not wiki_id:
126
+ return []
127
+ query = self.session.query(KnowledgeWikiPage).filter_by(wiki_id=wiki_id)
128
+ if not include_archived:
129
+ query = query.filter(KnowledgeWikiPage.status != KnowledgeWikiPageStatus.ARCHIVED)
130
+ return (
131
+ query
132
+ .order_by(KnowledgeWikiPage.path.asc(), KnowledgeWikiPage.id.asc())
133
+ .limit(limit)
134
+ .all()
135
+ )
136
+
137
+ def create_or_update_page(
138
+ self,
139
+ *,
140
+ company_id: int,
141
+ wiki_id: int,
142
+ path: str,
143
+ slug: str,
144
+ title: str,
145
+ source_storage_key: str,
146
+ summary: str | None = None,
147
+ body_text: str | None = None,
148
+ status: KnowledgeWikiPageStatus = KnowledgeWikiPageStatus.PUBLISHED,
149
+ tags: list[str] | None = None,
150
+ owner: str | None = None,
151
+ source_meta: dict | None = None,
152
+ last_synced_at: datetime | None = None,
153
+ ) -> KnowledgeWikiPage:
154
+ page = self.get_page_by_path(wiki_id, path)
155
+ if page is None:
156
+ page = self.get_page_by_slug(wiki_id, slug)
157
+
158
+ if page:
159
+ page.path = path
160
+ page.slug = slug
161
+ page.title = title
162
+ page.summary = summary
163
+ page.body_text = body_text
164
+ page.source_storage_key = source_storage_key
165
+ page.status = status
166
+ page.tags = tags or []
167
+ page.owner = owner
168
+ page.source_meta = source_meta or {}
169
+ page.last_synced_at = last_synced_at
170
+ else:
171
+ page = KnowledgeWikiPage(
172
+ company_id=company_id,
173
+ wiki_id=wiki_id,
174
+ path=path,
175
+ slug=slug,
176
+ title=title,
177
+ summary=summary,
178
+ body_text=body_text,
179
+ source_storage_key=source_storage_key,
180
+ status=status,
181
+ tags=tags or [],
182
+ owner=owner,
183
+ source_meta=source_meta or {},
184
+ last_synced_at=last_synced_at,
185
+ )
186
+ self.session.add(page)
187
+ self.session.commit()
188
+ return page
189
+
190
+ def archive_pages_not_in_paths(self, wiki_id: int, paths: set[str]) -> int:
191
+ if not wiki_id:
192
+ return 0
193
+ query = self.session.query(KnowledgeWikiPage).filter_by(wiki_id=wiki_id)
194
+ if paths:
195
+ query = query.filter(~KnowledgeWikiPage.path.in_(paths))
196
+ rows = query.all()
197
+ changed = 0
198
+ for page in rows:
199
+ if page.status != KnowledgeWikiPageStatus.ARCHIVED:
200
+ page.status = KnowledgeWikiPageStatus.ARCHIVED
201
+ changed += 1
202
+ if changed:
203
+ self.session.commit()
204
+ return changed
205
+
206
+ def create_sync_run(
207
+ self,
208
+ *,
209
+ company_id: int,
210
+ wiki_id: int,
211
+ metadata_json: dict | None = None,
212
+ ) -> KnowledgeWikiSyncRun:
213
+ run = KnowledgeWikiSyncRun(
214
+ company_id=company_id,
215
+ wiki_id=wiki_id,
216
+ status=KnowledgeWikiSyncStatus.RUNNING,
217
+ metadata_json=metadata_json or {},
218
+ )
219
+ self.session.add(run)
220
+ self.session.commit()
221
+ return run
222
+
223
+ def save_sync_run(self, run: KnowledgeWikiSyncRun) -> KnowledgeWikiSyncRun:
224
+ self.session.add(run)
225
+ self.session.commit()
226
+ return run