iatoolkit 2.62.1__tar.gz → 2.63.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 (262) hide show
  1. {iatoolkit-2.62.1/src/iatoolkit.egg-info → iatoolkit-2.63.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/routes.py +9 -0
  4. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_tools_pack.yaml +2 -2
  5. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/locales/en.yaml +8 -0
  6. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/locales/es.yaml +8 -0
  7. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/tenant_wiki_service.py +53 -12
  8. iatoolkit-2.63.0/src/iatoolkit/static/styles/wiki_page.css +35 -0
  9. iatoolkit-2.63.0/src/iatoolkit/templates/wiki_page.html +29 -0
  10. iatoolkit-2.63.0/src/iatoolkit/views/wiki_page_view.py +110 -0
  11. {iatoolkit-2.62.1 → iatoolkit-2.63.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  12. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit.egg-info/SOURCES.txt +4 -1
  13. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/LICENSE +0 -0
  14. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/LICENSE_COMMUNITY.md +0 -0
  15. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/pyproject.toml +0 -0
  16. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/readme.md +0 -0
  17. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/setup.cfg +0 -0
  18. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/base_company.py +0 -0
  19. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/cli_commands.py +0 -0
  20. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/__init__.py +0 -0
  21. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/bridge_validation.py +0 -0
  22. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/company_paths.py +0 -0
  23. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/exceptions.py +0 -0
  24. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  25. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  26. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  27. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  28. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  29. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  30. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  31. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/model_registry.py +0 -0
  32. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/search_terms.py +0 -0
  33. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  34. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/session_manager.py +0 -0
  35. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/text_splitter.py +0 -0
  36. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/url_safety.py +0 -0
  37. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/common/util.py +0 -0
  38. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/company_registry.py +0 -0
  39. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/__init__.py +0 -0
  40. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  41. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  42. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  43. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  44. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  45. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  46. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  47. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  48. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  49. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  50. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  51. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  52. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  53. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  54. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  55. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  56. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  57. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  58. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  59. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  60. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  61. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  62. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  63. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  64. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  65. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  66. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  67. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  68. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/core.py +0 -0
  69. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/__init__.py +0 -0
  70. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  71. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/call_service.py +0 -0
  72. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  73. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  74. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  75. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  76. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  77. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  78. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  79. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  80. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  81. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  82. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  83. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  84. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  85. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  86. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  87. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  88. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  89. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  90. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  91. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  92. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  93. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/llm_response.py +0 -0
  94. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  95. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/__init__.py +0 -0
  96. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  97. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  98. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  99. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  100. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  101. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  102. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  103. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  104. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  105. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/memory_question_repo.py +0 -0
  106. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  107. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/models.py +0 -0
  108. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  109. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  110. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  111. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  112. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  113. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/runtime_logging.py +0 -0
  114. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/__init__.py +0 -0
  115. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/api_key_service.py +0 -0
  116. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  117. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/auth_service.py +0 -0
  118. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/branding_service.py +0 -0
  119. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/company_context_service.py +0 -0
  120. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/configuration_service.py +0 -0
  121. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  122. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  123. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/embedding_service.py +0 -0
  124. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/excel_service.py +0 -0
  125. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  126. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  127. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  128. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/i18n_service.py +0 -0
  129. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/inference_service.py +0 -0
  130. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/jwt_service.py +0 -0
  131. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  132. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/language_service.py +0 -0
  133. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/license_service.py +0 -0
  134. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  135. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/mail_service.py +0 -0
  136. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  137. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  138. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  139. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  140. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/memory_question_service.py +0 -0
  141. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/memory_service.py +0 -0
  142. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  143. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  144. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/operator_identity_service.py +0 -0
  145. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  146. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  147. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  148. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  149. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  150. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  151. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  152. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  153. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  154. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  155. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  156. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/pdf_service.py +0 -0
  157. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/profile_service.py +0 -0
  158. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  159. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/prompt_service.py +0 -0
  160. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/query_service.py +0 -0
  161. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  162. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  163. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/sql_service.py +0 -0
  164. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  165. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/storage_service.py +0 -0
  166. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  167. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  168. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/system_tools.py +0 -0
  169. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  170. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  171. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/tool_service.py +0 -0
  172. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  173. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  174. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  175. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  176. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/warmup_service.py +0 -0
  177. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  178. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  179. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  180. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  181. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/services/web_search_service.py +0 -0
  182. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/images/favicon.ico +0 -0
  183. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/images/favicon.png +0 -0
  184. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  185. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  186. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  187. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  188. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  189. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_header_navigation.js +0 -0
  190. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  191. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  192. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  193. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  194. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  195. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  196. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  197. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  198. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  199. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/styles/account.css +0 -0
  200. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  201. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  202. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  203. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/styles/documents.css +0 -0
  204. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  205. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  206. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  207. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/_chat_header.html +0 -0
  208. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/_company_header.html +0 -0
  209. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  210. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/account.html +0 -0
  211. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/base.html +0 -0
  212. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/change_password.html +0 -0
  213. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/chat.html +0 -0
  214. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  215. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  216. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/error.html +0 -0
  217. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  218. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  219. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/login_global.html +0 -0
  220. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  221. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  222. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  223. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  224. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  225. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  226. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/templates/signup.html +0 -0
  227. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/__init__.py +0 -0
  228. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/account_view.py +0 -0
  229. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  230. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/base_login_view.py +0 -0
  231. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  232. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/change_password_view.py +0 -0
  233. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  234. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/chat_view.py +0 -0
  235. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  236. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  237. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  238. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  239. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  240. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/history_api_view.py +0 -0
  241. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/home_view.py +0 -0
  242. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  243. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  244. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  245. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/login_view.py +0 -0
  246. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  247. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  248. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  249. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  250. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  251. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  252. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  253. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  254. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/signup_view.py +0 -0
  255. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/static_page_view.py +0 -0
  256. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  257. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  258. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/users_api_view.py +0 -0
  259. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  260. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  261. {iatoolkit-2.62.1 → iatoolkit-2.63.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  262. {iatoolkit-2.62.1 → iatoolkit-2.63.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.62.1
3
+ Version: 2.63.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.62.1"
6
+ __version__ = "2.63.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -52,6 +52,7 @@ def register_views(app):
52
52
  from iatoolkit.views.tool_api_view import ToolApiView
53
53
  from iatoolkit.views.api_key_api_view import ApiKeyApiView
54
54
  from iatoolkit.views.memory_api_view import MemoryApiView
55
+ from iatoolkit.views.wiki_page_view import WikiPageView
55
56
 
56
57
  # Dependency-free liveness endpoint for load balancer/orchestrator health
57
58
  # checks (ALB, ECS, Docker HEALTHCHECK, etc). Deliberately returns a plain
@@ -103,6 +104,14 @@ def register_views(app):
103
104
  view_func=AccountView.as_view('account'),
104
105
  methods=['GET', 'POST'])
105
106
 
107
+ # a knowledge wiki page in the browser: where the wiki tools' `url` points
108
+ wiki_page_view = WikiPageView.as_view('wiki_page')
109
+ app.add_url_rule('/<company_short_name>/wiki/<wiki_key>/',
110
+ defaults={'page_path': ''},
111
+ view_func=wiki_page_view)
112
+ app.add_url_rule('/<company_short_name>/wiki/<wiki_key>/<path:page_path>',
113
+ view_func=wiki_page_view)
114
+
106
115
  # this endpoint is called when onboarding_shell finish the context load
107
116
  app.add_url_rule(
108
117
  '/<company_short_name>/finalize',
@@ -378,7 +378,7 @@ tools:
378
378
  required:
379
379
  - document_id
380
380
  - function_name: iat_wiki_search
381
- 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.
381
+ 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. Cada candidato trae `url`, el link para abrir la página en el navegador.
382
382
  routing:
383
383
  force_include_capability: has_knowledge_wikis
384
384
  routing_profile:
@@ -427,7 +427,7 @@ tools:
427
427
  description: |-
428
428
  Wiki entrypoint: llama `iat_wiki_get_page` con `path="/"` para cargar el índice raíz de una wiki de conocimiento publicada del tenant.
429
429
  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 (solo si esta habilitada).
430
- `wiki_key` identifica la wiki publicada. 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.
430
+ `wiki_key` identifica la wiki publicada. 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; si trae `url`, cítala como link con esa URL exacta.
431
431
  routing:
432
432
  force_include_capability: has_knowledge_wikis
433
433
  routing_profile:
@@ -377,6 +377,14 @@ ui:
377
377
  last_used: "Last used"
378
378
  never_used: "No recorded use"
379
379
 
380
+ wiki_page:
381
+ back_to_chat: "Back to chat"
382
+ trail_label: "Location in the wiki"
383
+ empty: "This page has no content."
384
+ not_found: "This page does not exist in the wiki or is no longer published."
385
+ forbidden: "You do not have access to this page."
386
+ forbidden_labels: "You do not have access to this page. You need one of these labels: {labels}."
387
+ unavailable: "We could not verify your access right now. Try again in a few minutes."
380
388
  memory:
381
389
  title: "Company memory"
382
390
  capture_title: "Teach the company something"
@@ -391,6 +391,14 @@ ui:
391
391
  last_used: "Último uso"
392
392
  never_used: "Sin uso registrado"
393
393
 
394
+ wiki_page:
395
+ back_to_chat: "Volver al chat"
396
+ trail_label: "Ubicación en la wiki"
397
+ empty: "Esta página no tiene contenido."
398
+ not_found: "Esta página no existe en la wiki o ya no está publicada."
399
+ forbidden: "No tienes acceso a esta página."
400
+ forbidden_labels: "No tienes acceso a esta página. Necesitas alguna de estas etiquetas: {labels}."
401
+ unavailable: "No pudimos verificar tu acceso en este momento. Intenta de nuevo en unos minutos."
394
402
  memory:
395
403
  title: "Memoria de la empresa"
396
404
  capture_title: "Enseñar algo a la empresa"
@@ -14,7 +14,9 @@ import unicodedata
14
14
  from datetime import datetime
15
15
  from pathlib import PurePosixPath
16
16
  from typing import Any, Callable
17
+ from urllib.parse import quote
17
18
 
19
+ from flask import has_request_context, request
18
20
  from injector import inject
19
21
 
20
22
  from iatoolkit.repositories.knowledge_wiki_repo import KnowledgeWikiRepo
@@ -583,6 +585,37 @@ class TenantWikiService:
583
585
  "unlabelled": len(pages) - labelled,
584
586
  }
585
587
 
588
+ @classmethod
589
+ def page_url(cls, company_short_name: str, wiki_key: str, path: str | None) -> str | None:
590
+ """
591
+ Where a person opens a page in the browser: the page viewer, at the
592
+ page's own path, so the relative links between pages resolve without
593
+ rewriting them. The root page is the wiki's own folder.
594
+
595
+ `APP_BASE_URL` names the public host, because a scheduled job has no
596
+ request to take it from; without it the request's host is used, and
597
+ with neither there is no URL to give.
598
+ """
599
+ base = str(os.getenv("APP_BASE_URL") or "").strip().rstrip("/")
600
+ if not base and has_request_context():
601
+ base = request.url_root.rstrip("/")
602
+ if not base:
603
+ return None
604
+ return "/".join((
605
+ base,
606
+ quote(str(company_short_name or "").strip(), safe=""),
607
+ "wiki",
608
+ quote(cls.normalize_wiki_key(wiki_key), safe=""),
609
+ quote(cls._normalize_page_path(path), safe="/"),
610
+ ))
611
+
612
+ def _reader_url(self, company_short_name: str, wiki: KnowledgeWiki, path: str | None) -> str | None:
613
+ # A system wiki is read through the feature that owns it; the viewer
614
+ # answers "wiki not found" for it, so it gets no link.
615
+ if self.is_system_wiki(wiki):
616
+ return None
617
+ return self.page_url(company_short_name, wiki.wiki_key, path)
618
+
586
619
  def get_page(
587
620
  self,
588
621
  company_short_name: str,
@@ -638,12 +671,15 @@ class TenantWikiService:
638
671
  return {
639
672
  "status": "success",
640
673
  "wiki": self.serialize_wiki(wiki),
641
- "page": self._build_virtual_index_page(
642
- wiki,
643
- markdown=markdown,
644
- source_storage_key=source_storage_key,
645
- path="/",
646
- ),
674
+ "page": {
675
+ **self._build_virtual_index_page(
676
+ wiki,
677
+ markdown=markdown,
678
+ source_storage_key=source_storage_key,
679
+ path="/",
680
+ ),
681
+ "url": self._reader_url(company_short_name, wiki, "/"),
682
+ },
647
683
  }
648
684
  if normalized_path == self.INDEX_FILENAME:
649
685
  entries = self._filter_page_entries(self._page_entries(wiki), visibility_filter=visibility_filter)
@@ -656,12 +692,15 @@ class TenantWikiService:
656
692
  return {
657
693
  "status": "success",
658
694
  "wiki": self.serialize_wiki(wiki),
659
- "page": self._build_virtual_index_page(
660
- wiki,
661
- markdown=authored_index_markdown,
662
- source_storage_key=authored_index_storage_key,
663
- path=self.INDEX_FILENAME,
664
- ),
695
+ "page": {
696
+ **self._build_virtual_index_page(
697
+ wiki,
698
+ markdown=authored_index_markdown,
699
+ source_storage_key=authored_index_storage_key,
700
+ path=self.INDEX_FILENAME,
701
+ ),
702
+ "url": self._reader_url(company_short_name, wiki, self.INDEX_FILENAME),
703
+ },
665
704
  }
666
705
  page = self.knowledge_wiki_repo.get_page_by_path(wiki.id, normalized_path)
667
706
  if page is None:
@@ -689,6 +728,7 @@ class TenantWikiService:
689
728
  **self.serialize_page(page, include_body=True),
690
729
  "frontmatter": parsed.get("frontmatter") or {},
691
730
  "markdown": markdown,
731
+ "url": self._reader_url(company_short_name, wiki, page.path),
692
732
  },
693
733
  }
694
734
 
@@ -1068,6 +1108,7 @@ class TenantWikiService:
1068
1108
  **self.serialize_page(page, include_body=False),
1069
1109
  "wiki_key": wiki.wiki_key,
1070
1110
  "wiki_name": wiki.name,
1111
+ "url": self._reader_url(company_short_name, wiki, page.path),
1071
1112
  "score": round(score if score > 0 else 1.0, 4),
1072
1113
  })
1073
1114
 
@@ -0,0 +1,35 @@
1
+ .wiki-page {
2
+ --wiki-line: #e2e5e8;
3
+ --wiki-muted: #60666d;
4
+ max-width: 920px;
5
+ margin: 0 auto;
6
+ padding: 0 24px 64px;
7
+ color: #25292d;
8
+ font: 16px/1.6 system-ui, sans-serif;
9
+ }
10
+ .wiki-page * { box-sizing: border-box; min-width: 0; }
11
+ .wiki-page-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 20px 0 16px; border-bottom: 1px solid var(--wiki-line); }
12
+ .wiki-page-brand { font-size: 18px; font-weight: 650; color: var(--brand-primary-color, #285e50); text-decoration: none; }
13
+ .wiki-page-back { display: inline-flex; align-items: center; gap: 8px; font-size: 14px; color: var(--wiki-muted); text-decoration: none; }
14
+ .wiki-page-back:hover { color: #25292d; }
15
+ .wiki-page-trail { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; padding: 16px 0 8px; font-size: 14px; }
16
+ .wiki-page-trail a { display: inline-flex; align-items: center; gap: 6px; font-weight: 600; color: var(--brand-primary-color, #285e50); text-decoration: none; }
17
+ .wiki-page-path { color: var(--wiki-muted); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px; overflow-wrap: anywhere; }
18
+ .wiki-page-main { padding-top: 16px; }
19
+ .wiki-page-notice { padding: 12px 16px; border-left: 3px solid #c9ced3; background: #f6f7f8; overflow-wrap: anywhere; }
20
+ .wiki-page-body { overflow-wrap: anywhere; }
21
+ .wiki-page-body h1 { font-size: 28px; line-height: 1.25; font-weight: 650; margin: 8px 0 20px; }
22
+ .wiki-page-body h2 { font-size: 21px; line-height: 1.3; font-weight: 650; margin: 32px 0 12px; padding-bottom: 6px; border-bottom: 1px solid var(--wiki-line); }
23
+ .wiki-page-body h3 { font-size: 17px; font-weight: 650; margin: 24px 0 8px; }
24
+ .wiki-page-body a { color: var(--brand-primary-color, #285e50); }
25
+ .wiki-page-body code { font-size: 0.9em; background: #f3f4f6; padding: 1px 4px; border-radius: 4px; overflow-wrap: anywhere; }
26
+ .wiki-page-body pre { background: #f6f8fa; padding: 12px 16px; border-radius: 6px; overflow-x: auto; }
27
+ .wiki-page-body pre code { background: none; padding: 0; }
28
+ .wiki-page-body blockquote { margin: 0 0 16px; padding: 4px 16px; border-left: 3px solid var(--wiki-line); color: var(--wiki-muted); }
29
+ .wiki-page-body table { display: block; max-width: 100%; overflow-x: auto; border-collapse: collapse; margin-bottom: 16px; font-size: 14px; }
30
+ .wiki-page-body th, .wiki-page-body td { border: 1px solid var(--wiki-line); padding: 6px 10px; vertical-align: top; }
31
+ .wiki-page-body thead { background: #f6f8fa; }
32
+ @media (max-width: 600px) {
33
+ .wiki-page { padding: 0 16px 48px; }
34
+ .wiki-page-back span { display: none; }
35
+ }
@@ -0,0 +1,29 @@
1
+ {% extends "base.html" %}
2
+ {% set suppress_toasts = true %}
3
+ {% block title %}{{ page_title }} · {{ wiki_name }}{% endblock %}
4
+ {% block styles %}
5
+ <style>{{ branding.css_variables | safe }}</style>
6
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/wiki_page.css') }}">
7
+ {% endblock %}
8
+ {% block content %}
9
+ <div class="wiki-page">
10
+ <header class="wiki-page-header">
11
+ <a class="wiki-page-brand" href="{{ url_for('chat', company_short_name=company_short_name) }}">{{ branding.name }}</a>
12
+ <a class="wiki-page-back" href="{{ url_for('chat', company_short_name=company_short_name) }}">
13
+ <i class="bi bi-chat-dots" aria-hidden="true"></i><span>{{ t('ui.wiki_page.back_to_chat') }}</span>
14
+ </a>
15
+ </header>
16
+ <nav class="wiki-page-trail" aria-label="{{ t('ui.wiki_page.trail_label') }}">
17
+ <a href="{{ root_url }}"><i class="bi bi-journal-text" aria-hidden="true"></i>{{ wiki_name }}</a>
18
+ {% if page_path %}<span class="wiki-page-path">{{ page_path }}</span>{% endif %}
19
+ </nav>
20
+ <main class="wiki-page-main">
21
+ {% if message %}
22
+ <div class="wiki-page-notice" role="status">{{ message }}</div>
23
+ {% endif %}
24
+ {% if body_html %}
25
+ <article class="wiki-page-body">{{ body_html | safe }}</article>
26
+ {% endif %}
27
+ </main>
28
+ </div>
29
+ {% endblock %}
@@ -0,0 +1,110 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ import markdown2
7
+ import nh3
8
+ from flask import redirect, render_template, request, url_for
9
+ from flask.views import MethodView
10
+ from injector import inject
11
+
12
+ from iatoolkit.services.branding_service import BrandingService
13
+ from iatoolkit.services.i18n_service import I18nService
14
+ from iatoolkit.services.markdown_wiki_service import MarkdownWikiService
15
+ from iatoolkit.services.profile_service import ProfileService
16
+ from iatoolkit.services.tenant_wiki_service import TenantWikiService
17
+
18
+
19
+ class WikiPageView(MethodView):
20
+ """
21
+ A knowledge wiki page, read in the browser.
22
+
23
+ The link the wiki tools hand out (`TenantWikiService.page_url`) lands here.
24
+ The page is read as the signed-in person, so its visibility labels apply
25
+ exactly as they do in chat; without a session the person signs in and comes
26
+ back. The URL mirrors the page's path in the wiki, so the relative links
27
+ between pages resolve by themselves.
28
+ """
29
+
30
+ # `code-friendly`: in a technical wiki an underscore joins a name
31
+ # (SYS_alertas_push), it does not start italics.
32
+ MARKDOWN_EXTRAS = ["tables", "fenced-code-blocks", "strike", "task_list", "code-friendly"]
33
+
34
+ @inject
35
+ def __init__(self,
36
+ profile_service: ProfileService,
37
+ branding_service: BrandingService,
38
+ i18n_service: I18nService,
39
+ tenant_wiki_service: TenantWikiService):
40
+ self.profile_service = profile_service
41
+ self.branding_service = branding_service
42
+ self.i18n_service = i18n_service
43
+ self.tenant_wiki_service = tenant_wiki_service
44
+
45
+ def get(self, company_short_name: str, wiki_key: str, page_path: str = ""):
46
+ company = self.profile_service.get_company_by_short_name(company_short_name)
47
+ if not company:
48
+ return render_template('error.html',
49
+ message=self.i18n_service.t('errors.templates.company_not_found')), 404
50
+
51
+ session_info = self.profile_service.get_current_session_info(company_short_name=company_short_name) or {}
52
+ user_identifier = session_info.get('user_identifier')
53
+ if not user_identifier or session_info.get('company_short_name') != company_short_name:
54
+ # The home page carries `next` into its login widget.
55
+ return redirect(url_for('home', company_short_name=company_short_name,
56
+ next=request.full_path.rstrip('?')))
57
+
58
+ result = self.tenant_wiki_service.get_page(
59
+ company_short_name,
60
+ wiki_key=wiki_key,
61
+ path=page_path or "/",
62
+ user_identifier=user_identifier,
63
+ )
64
+ wiki = result.get("wiki") or {}
65
+ context = {
66
+ "company_short_name": company_short_name,
67
+ "branding": self.branding_service.get_company_branding(company_short_name),
68
+ "wiki_name": wiki.get("name") or wiki_key,
69
+ "root_url": url_for('wiki_page', company_short_name=company_short_name,
70
+ wiki_key=wiki_key, page_path=''),
71
+ "page_path": page_path,
72
+ }
73
+
74
+ if result.get("status") == "success":
75
+ page = result.get("page") or {}
76
+ body = MarkdownWikiService.parse_frontmatter_document(page.get("markdown") or "").get("body")
77
+ return render_template(
78
+ "wiki_page.html",
79
+ **context,
80
+ page_title=page.get("title") or page_path or context["wiki_name"],
81
+ body_html=self.render_markdown(body),
82
+ message=None if body else self.i18n_service.t('ui.wiki_page.empty'),
83
+ )
84
+
85
+ status_code, message = self._denial(result)
86
+ return render_template(
87
+ "wiki_page.html",
88
+ **context,
89
+ page_title=page_path or context["wiki_name"],
90
+ body_html="",
91
+ message=message,
92
+ ), status_code
93
+
94
+ @classmethod
95
+ def render_markdown(cls, markdown: str | None) -> str:
96
+ if not str(markdown or "").strip():
97
+ return ""
98
+ return nh3.clean(markdown2.markdown(markdown, extras=cls.MARKDOWN_EXTRAS))
99
+
100
+ def _denial(self, result: dict) -> tuple[int, str]:
101
+ """A withheld page says why, as the wiki tools do; anything else is a 404."""
102
+ status = result.get("status")
103
+ if status == TenantWikiService.ACCESS_STATUS_UNAVAILABLE:
104
+ return 503, self.i18n_service.t('ui.wiki_page.unavailable')
105
+ if status == TenantWikiService.ACCESS_STATUS_FORBIDDEN:
106
+ labels = ", ".join(result.get("required_labels") or [])
107
+ if labels:
108
+ return 403, self.i18n_service.t('ui.wiki_page.forbidden_labels', labels=labels)
109
+ return 403, self.i18n_service.t('ui.wiki_page.forbidden')
110
+ return 404, self.i18n_service.t('ui.wiki_page.not_found')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.62.1
3
+ Version: 2.63.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -202,6 +202,7 @@ src/iatoolkit/static/styles/documents.css
202
202
  src/iatoolkit/static/styles/landing_page.css
203
203
  src/iatoolkit/static/styles/llm_output.css
204
204
  src/iatoolkit/static/styles/onboarding.css
205
+ src/iatoolkit/static/styles/wiki_page.css
205
206
  src/iatoolkit/templates/_chat_header.html
206
207
  src/iatoolkit/templates/_company_header.html
207
208
  src/iatoolkit/templates/_login_widget.html
@@ -217,6 +218,7 @@ src/iatoolkit/templates/home_hosted_default.html
217
218
  src/iatoolkit/templates/login_global.html
218
219
  src/iatoolkit/templates/onboarding_shell.html
219
220
  src/iatoolkit/templates/signup.html
221
+ src/iatoolkit/templates/wiki_page.html
220
222
  src/iatoolkit/templates/memory/wiki_schema.md
221
223
  src/iatoolkit/templates/pdf/base.html
222
224
  src/iatoolkit/templates/pdf/letter.html
@@ -254,4 +256,5 @@ src/iatoolkit/views/static_page_view.py
254
256
  src/iatoolkit/views/tool_api_view.py
255
257
  src/iatoolkit/views/user_feedback_api_view.py
256
258
  src/iatoolkit/views/users_api_view.py
257
- src/iatoolkit/views/verify_user_view.py
259
+ src/iatoolkit/views/verify_user_view.py
260
+ src/iatoolkit/views/wiki_page_view.py
File without changes
File without changes
File without changes
File without changes