iatoolkit 2.65.2__tar.gz → 2.66.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 (271) hide show
  1. {iatoolkit-2.65.2/src/iatoolkit.egg-info → iatoolkit-2.66.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_agents/memory_compiler.prompt +2 -1
  4. iatoolkit-2.66.0/src/iatoolkit/config/system_agents/memory_document_ingest.prompt +35 -0
  5. iatoolkit-2.66.0/src/iatoolkit/config/system_agents/memory_image_ingest.prompt +25 -0
  6. iatoolkit-2.66.0/src/iatoolkit/config/system_agents_pack.yaml +255 -0
  7. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/memory_repo.py +89 -0
  8. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/models.py +65 -0
  9. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/configuration_service.py +11 -0
  10. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/memory_compiler_service.py +418 -37
  11. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/memory_service.py +70 -0
  12. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/memory_wiki_service.py +6 -0
  13. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/system_agent_catalog.py +3 -0
  14. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/system_agent_runner.py +55 -3
  15. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/tenant_wiki_service.py +30 -1
  16. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/wiki_page_view.py +7 -6
  17. {iatoolkit-2.65.2 → iatoolkit-2.66.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  18. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit.egg-info/SOURCES.txt +2 -0
  19. iatoolkit-2.65.2/src/iatoolkit/config/system_agents_pack.yaml +0 -102
  20. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/LICENSE +0 -0
  21. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/LICENSE_COMMUNITY.md +0 -0
  22. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/pyproject.toml +0 -0
  23. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/readme.md +0 -0
  24. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/setup.cfg +0 -0
  25. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/base_company.py +0 -0
  26. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/cli_commands.py +0 -0
  27. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/__init__.py +0 -0
  28. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/bridge_validation.py +0 -0
  29. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/company_paths.py +0 -0
  30. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/exceptions.py +0 -0
  31. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  32. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  33. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  34. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  35. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  36. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  37. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  38. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/model_registry.py +0 -0
  39. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/routes.py +0 -0
  40. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/search_terms.py +0 -0
  41. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  42. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/session_manager.py +0 -0
  43. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/text_splitter.py +0 -0
  44. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/url_safety.py +0 -0
  45. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/common/util.py +0 -0
  46. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/company_registry.py +0 -0
  47. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/__init__.py +0 -0
  48. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  49. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_agents/memory_correction.prompt +0 -0
  50. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_agents/memory_question_review.prompt +0 -0
  51. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  52. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  53. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  54. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  55. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  56. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  57. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  58. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  59. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  60. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  61. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  62. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  63. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  64. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  65. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  66. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  67. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  68. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  69. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  70. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  71. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  72. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  73. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  74. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  75. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  76. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  77. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  78. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  79. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/core.py +0 -0
  80. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/__init__.py +0 -0
  81. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  82. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/call_service.py +0 -0
  83. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  84. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  85. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  86. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  87. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  88. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  89. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  90. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  91. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  92. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  93. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  94. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  95. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  96. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  97. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  98. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  99. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  100. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  101. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  102. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  103. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  104. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/llm_response.py +0 -0
  105. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  106. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/locales/en.yaml +0 -0
  107. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/locales/es.yaml +0 -0
  108. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/__init__.py +0 -0
  109. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  110. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  111. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  112. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  113. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  114. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  115. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  116. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  117. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  118. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/memory_question_repo.py +0 -0
  119. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  120. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  121. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  122. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  123. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  124. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/runtime_logging.py +0 -0
  125. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/__init__.py +0 -0
  126. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/api_key_service.py +0 -0
  127. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  128. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/auth_service.py +0 -0
  129. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/branding_service.py +0 -0
  130. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/company_context_service.py +0 -0
  131. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  132. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  133. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/embedding_service.py +0 -0
  134. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/excel_service.py +0 -0
  135. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  136. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  137. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  138. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/i18n_service.py +0 -0
  139. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/inference_service.py +0 -0
  140. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/jwt_service.py +0 -0
  141. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  142. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/language_service.py +0 -0
  143. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/license_service.py +0 -0
  144. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  145. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/mail_service.py +0 -0
  146. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  147. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  148. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  149. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/memory_question_service.py +0 -0
  150. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  151. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/operator_identity_service.py +0 -0
  152. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  153. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  154. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  155. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  156. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  157. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  158. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  159. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  160. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  161. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  162. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  163. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/pdf_service.py +0 -0
  164. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/profile_service.py +0 -0
  165. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  166. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/prompt_service.py +0 -0
  167. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/query_service.py +0 -0
  168. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  169. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  170. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/sql_service.py +0 -0
  171. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  172. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/storage_service.py +0 -0
  173. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  174. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  175. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/system_tools.py +0 -0
  176. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  177. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  178. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/tool_service.py +0 -0
  179. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  180. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  181. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  182. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  183. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/warmup_service.py +0 -0
  184. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  185. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  186. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  187. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  188. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/services/web_search_service.py +0 -0
  189. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/images/favicon.ico +0 -0
  190. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/images/favicon.png +0 -0
  191. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  192. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  193. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  194. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  195. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  196. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_header_navigation.js +0 -0
  197. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  198. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  199. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  200. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  201. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  202. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  203. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  204. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  205. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  206. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/styles/account.css +0 -0
  207. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  208. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  209. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  210. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/styles/documents.css +0 -0
  211. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  212. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  213. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  214. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/static/styles/wiki_page.css +0 -0
  215. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/_chat_header.html +0 -0
  216. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/_company_header.html +0 -0
  217. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  218. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/account.html +0 -0
  219. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/base.html +0 -0
  220. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/change_password.html +0 -0
  221. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/chat.html +0 -0
  222. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  223. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  224. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/error.html +0 -0
  225. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  226. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  227. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/login_global.html +0 -0
  228. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  229. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  230. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  231. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  232. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  233. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  234. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/signup.html +0 -0
  235. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/templates/wiki_page.html +0 -0
  236. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/__init__.py +0 -0
  237. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/account_view.py +0 -0
  238. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  239. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/base_login_view.py +0 -0
  240. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  241. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/change_password_view.py +0 -0
  242. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  243. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/chat_view.py +0 -0
  244. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  245. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  246. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  247. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  248. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  249. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/history_api_view.py +0 -0
  250. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/home_view.py +0 -0
  251. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  252. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  253. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  254. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/login_view.py +0 -0
  255. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  256. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  257. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  258. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  259. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  260. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  261. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  262. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  263. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/signup_view.py +0 -0
  264. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/static_page_view.py +0 -0
  265. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  266. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  267. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/users_api_view.py +0 -0
  268. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  269. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  270. {iatoolkit-2.65.2 → iatoolkit-2.66.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  271. {iatoolkit-2.65.2 → iatoolkit-2.66.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.65.2
3
+ Version: 2.66.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.65.2"
6
+ __version__ = "2.66.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -10,7 +10,7 @@ How to write the page:
10
10
 
11
11
  - Follow the WIKI_SCHEMA.
12
12
  - When you update, return the COMPLETE new page: keep everything already on it, word for word, including other people's attributions, headings and order. Change only what the capture changes, and put new facts in the section where they belong.
13
- - When the capture contradicts the page, keep both statements with their attributions and make the conflict explicit; never delete what someone else said.
13
+ - When the capture contradicts the page, keep both statements with their attributions and make the conflict explicit; never delete what someone else said. Also list each contradiction in `conflicts`.
14
14
  - Attribute every fact you add as ({{ author }}, {{ captured_on }}).
15
15
  - Write in the language of the page, or of the capture for a new page. Neutral tone, no personal opinions.
16
16
  - If attachments come with the capture, use what they say as part of the capture.
@@ -23,6 +23,7 @@ Answer with JSON following the schema:
23
23
  - `summary`: one sentence saying what the page covers.
24
24
  - `markdown`: the page body without frontmatter, starting with `# Title`.
25
25
  - `change_summary`: one short sentence for the page history (when you skip, why).
26
+ - `conflicts`: each place where the capture contradicts what the page already said, with `existing_statement` (what the page said, as written), `existing_source` (its attribution), `new_statement` and `new_source` ({{ author }}, {{ captured_on }}). An empty list when nothing contradicts.
26
27
 
27
28
  WIKI_SCHEMA:
28
29
  {{ wiki_schema }}
@@ -0,0 +1,35 @@
1
+ You maintain the company's Memory: a wiki of how things are actually done in this company (procedures, rules, exceptions, who decides). It is written from what its people explain and from the company's own documents.
2
+
3
+ A document was loaded into Memory (SOURCE). You receive it in parts; this is part {{ part.index }} of {{ part.total }} (PART). Bring into the wiki what this part teaches about how things are done here.
4
+
5
+ What to take:
6
+
7
+ - Facts, rules, procedures, responsibilities, exceptions, deadlines, amounts and definitions that someone in the company would need to know or do their work.
8
+ - Not the document's structure, legal boilerplate, signatures, indexes or anything that only restates the title.
9
+ - Do not summarize the document: the document itself stays searchable. Write the knowledge where it belongs.
10
+
11
+ How to write the pages:
12
+
13
+ - Update one of the CANDIDATE_PAGES when the part belongs to its subject; create a new page when none covers it (check PAGE_INDEX first so you do not duplicate a page). One part may touch several pages; return each one.
14
+ - When you update, return the COMPLETE new page: keep everything already on it, word for word, including people's attributions. Add the new facts in the section where they belong.
15
+ - When this part says something different from what the page already says, keep both statements with their attributions and make the difference explicit; never delete what someone else said. Also list each contradiction in `conflicts`.
16
+ - Attribute every fact you add as ({{ source.label }}, {{ captured_on }}).
17
+ - Follow the WIKI_SCHEMA. Write in the language of the page, or of the document for a new page.
18
+ - If this part has nothing worth keeping, return an empty `pages` list.
19
+
20
+ Answer with JSON following the schema: a list `pages`, each with `action` (create or update), `target_page_id` (the page_id you update, or null), `title`, `summary` (one sentence on what the page covers), `markdown` (the page body without frontmatter, starting with `# Title`) and `change_summary` (one short sentence for the page history); and a list `conflicts`, one per contradiction with what a page already said: `page_title`, `existing_statement` (what the page said, as written), `existing_source` (its attribution), `new_statement` and `new_source` ({{ source.label }}, {{ captured_on }}). An empty list when nothing contradicts.
21
+
22
+ SOURCE:
23
+ {{ source | json }}
24
+
25
+ PART {{ part.index }} OF {{ part.total }}:
26
+ {{ part.text }}
27
+
28
+ WIKI_SCHEMA:
29
+ {{ wiki_schema }}
30
+
31
+ PAGE_INDEX:
32
+ {{ page_index | json }}
33
+
34
+ CANDIDATE_PAGES:
35
+ {{ candidate_pages | json }}
@@ -0,0 +1,25 @@
1
+ You maintain the company's Memory: a wiki of how things are actually done in this company (procedures, rules, exceptions, who decides). It is written from what its people explain and from the company's own documents and images.
2
+
3
+ An image was loaded into Memory (SOURCE); it comes attached. Look at it and bring into the wiki what it teaches about how things are done here: the steps of a diagram, the decisions of a whiteboard, the fields and rules of a form, the values of a screenshot.
4
+
5
+ - Take facts, rules, procedures, responsibilities, amounts and definitions someone in the company would need. Describe what the image says, not what it looks like.
6
+ - If the image has nothing worth keeping (a logo, a photo of people, decoration), return an empty `pages` list.
7
+ - Update one of the CANDIDATE_PAGES when the image belongs to its subject; create a new page when none covers it (check PAGE_INDEX first so you do not duplicate a page).
8
+ - When you update, return the COMPLETE new page: keep everything already on it, word for word, including people's attributions.
9
+ - When the image says something different from what a page already says, keep both statements with their attributions and list each contradiction in `conflicts`.
10
+ - Attribute every fact you add as ({{ source.label }}, {{ captured_on }}).
11
+ - Follow the WIKI_SCHEMA. Write in the language of the page, or of the text in the image for a new page.
12
+
13
+ Answer with JSON following the schema: a list `pages`, each with `action` (create or update), `target_page_id` (the page_id you update, or null), `title`, `summary`, `markdown` (the page body without frontmatter, starting with `# Title`) and `change_summary`; and a list `conflicts` (`page_title`, `existing_statement`, `existing_source`, `new_statement`, `new_source`), empty when nothing contradicts.
14
+
15
+ SOURCE:
16
+ {{ source | json }}
17
+
18
+ WIKI_SCHEMA:
19
+ {{ wiki_schema }}
20
+
21
+ PAGE_INDEX:
22
+ {{ page_index | json }}
23
+
24
+ CANDIDATE_PAGES:
25
+ {{ candidate_pages | json }}
@@ -0,0 +1,255 @@
1
+ # System agents: model calls the platform makes on its own (see
2
+ # services/system_agent_catalog.py). The tenant may pick each one's model
3
+ # (system_agents.<key>.model in company.yaml); the prompt, inputs and output
4
+ # schema belong to the code that reads the answer and are not editable.
5
+ #
6
+ # `prompt` is a Jinja template in system_agents/, rendered with `inputs`.
7
+ # `default_model: null` means the company's default model.
8
+ version: 1
9
+
10
+ schemas:
11
+ # A Memoria page created, updated or left alone.
12
+ memory_page:
13
+ type: object
14
+ properties:
15
+ action:
16
+ type: string
17
+ enum: [create, update, skip]
18
+ # Nullable as a type list: the structured-output validator rejects null under anyOf.
19
+ target_page_id:
20
+ type: [integer, "null"]
21
+ title:
22
+ type: string
23
+ summary:
24
+ type: string
25
+ markdown:
26
+ type: string
27
+ change_summary:
28
+ type: string
29
+ # Only what a page cannot do without: models often drop the optional
30
+ # fields, and a near miss is repaired by the compiler's normalizer.
31
+ required: [action, target_page_id, title, markdown]
32
+ additionalProperties: false
33
+
34
+ # A memory_page plus the contradictions found while writing it (BL-014).
35
+ memory_page_with_conflicts:
36
+ type: object
37
+ properties:
38
+ action:
39
+ type: string
40
+ enum: [create, update, skip]
41
+ target_page_id:
42
+ type: [integer, "null"]
43
+ title:
44
+ type: string
45
+ summary:
46
+ type: string
47
+ markdown:
48
+ type: string
49
+ change_summary:
50
+ type: string
51
+ conflicts:
52
+ type: array
53
+ items:
54
+ type: object
55
+ properties:
56
+ existing_statement:
57
+ type: string
58
+ existing_source:
59
+ type: string
60
+ new_statement:
61
+ type: string
62
+ new_source:
63
+ type: string
64
+ required: [existing_statement, new_statement]
65
+ additionalProperties: false
66
+ required: [action, target_page_id, title, markdown]
67
+ additionalProperties: false
68
+
69
+ agents:
70
+ - key: memory_compiler
71
+ name: Compilador de Memoria
72
+ name_en: Memory compiler
73
+ description: >-
74
+ (Memoria de la empresa) Integra lo que la gente guarda en Memoria en la página que corresponde,
75
+ o crea una nueva, atribuyendo cada dato a su autor.
76
+ description_en: >-
77
+ (Company memory) Files what people save in Memory into the right page, or creates a new
78
+ one, attributing every fact to its author.
79
+ module: memory
80
+ prompt: memory_compiler.prompt
81
+ output_schema: memory_page_with_conflicts
82
+ inputs: [author, captured_on, wiki_schema, page_index, capture, candidate_pages]
83
+ default_model: null
84
+
85
+ - key: memory_correction
86
+ name: Corrector de Memoria
87
+ name_en: Memory corrector
88
+ description: >-
89
+ (Memoria de la empresa) Aplica a una página de Memoria el cambio que alguien pidió, sin tocar el
90
+ resto de la página.
91
+ description_en: >-
92
+ (Company memory) Applies to a Memory page the change someone asked for, leaving the rest
93
+ of the page as it is.
94
+ module: memory
95
+ prompt: memory_correction.prompt
96
+ output_schema: memory_page
97
+ inputs: [author, captured_on, request, page]
98
+ default_model: null
99
+
100
+ - key: memory_question_review
101
+ name: Revisión de preguntas sin respuesta
102
+ name_en: Unanswered questions review
103
+ description: >-
104
+ (Memoria de la empresa) Revisa las conversaciones que buscaron en Memoria o en los documentos y
105
+ detecta las preguntas que la IA no pudo responder.
106
+ description_en: >-
107
+ (Company memory) Reviews the conversations that searched Memory or the documents and finds
108
+ the questions the AI could not answer.
109
+ module: memory
110
+ prompt: memory_question_review.prompt
111
+ output_schema:
112
+ type: object
113
+ properties:
114
+ items:
115
+ type: array
116
+ items:
117
+ type: object
118
+ properties:
119
+ ref:
120
+ type: string
121
+ answered:
122
+ type: boolean
123
+ question:
124
+ type: string
125
+ topic:
126
+ type: string
127
+ # Nullable as a type list: core's validator rejects null under anyOf.
128
+ same_as_question_id:
129
+ type: [integer, "null"]
130
+ same_as_ref:
131
+ type: [string, "null"]
132
+ required: [ref, answered]
133
+ additionalProperties: false
134
+ required: [items]
135
+ additionalProperties: false
136
+ inputs: [open_questions, turns]
137
+ default_model: null
138
+
139
+ - key: memory_document_ingest
140
+ name: Lector de documentos de Memoria
141
+ name_en: Memory document reader
142
+ description: >-
143
+ (Memoria de la empresa) Lee los documentos que se cargan en Memoria, tramo
144
+ por tramo, y lleva a las páginas de la wiki lo que enseñan sobre cómo se hacen
145
+ las cosas, citando el documento.
146
+ description_en: >-
147
+ (Company memory) Reads the documents loaded into Memory, part by part, and
148
+ files into the wiki pages what they teach about how things are done, citing
149
+ the document.
150
+ module: memory
151
+ prompt: memory_document_ingest.prompt
152
+ output_schema:
153
+ type: object
154
+ properties:
155
+ pages:
156
+ type: array
157
+ items:
158
+ type: object
159
+ properties:
160
+ action:
161
+ type: string
162
+ enum: [create, update]
163
+ # Nullable as a type list: the structured-output validator rejects null under anyOf.
164
+ target_page_id:
165
+ type: [integer, "null"]
166
+ title:
167
+ type: string
168
+ summary:
169
+ type: string
170
+ markdown:
171
+ type: string
172
+ change_summary:
173
+ type: string
174
+ required: [action, target_page_id, title, markdown]
175
+ additionalProperties: false
176
+ conflicts:
177
+ type: array
178
+ items:
179
+ type: object
180
+ properties:
181
+ page_title:
182
+ type: string
183
+ existing_statement:
184
+ type: string
185
+ existing_source:
186
+ type: string
187
+ new_statement:
188
+ type: string
189
+ new_source:
190
+ type: string
191
+ required: [page_title, existing_statement, new_statement]
192
+ additionalProperties: false
193
+ required: [pages]
194
+ additionalProperties: false
195
+ inputs: [source, part, captured_on, wiki_schema, page_index, candidate_pages]
196
+ default_model: null
197
+
198
+ - key: memory_image_ingest
199
+ name: Lector de imágenes de Memoria
200
+ name_en: Memory image reader
201
+ description: >-
202
+ (Memoria de la empresa) Mira las imágenes que se cargan en Memoria
203
+ (diagramas, fotos de pizarras, capturas de pantalla, formularios) y lleva a la
204
+ wiki lo que enseñan sobre cómo se hacen las cosas, citando la imagen.
205
+ description_en: >-
206
+ (Company memory) Looks at the images loaded into Memory (diagrams, whiteboard
207
+ photos, screenshots, forms) and files into the wiki what they teach about how
208
+ things are done, citing the image.
209
+ module: memory
210
+ prompt: memory_image_ingest.prompt
211
+ requires_vision: true
212
+ output_schema:
213
+ type: object
214
+ properties:
215
+ pages:
216
+ type: array
217
+ items:
218
+ type: object
219
+ properties:
220
+ action:
221
+ type: string
222
+ enum: [create, update]
223
+ target_page_id:
224
+ type: [integer, "null"]
225
+ title:
226
+ type: string
227
+ summary:
228
+ type: string
229
+ markdown:
230
+ type: string
231
+ change_summary:
232
+ type: string
233
+ required: [action, target_page_id, title, markdown]
234
+ additionalProperties: false
235
+ conflicts:
236
+ type: array
237
+ items:
238
+ type: object
239
+ properties:
240
+ page_title:
241
+ type: string
242
+ existing_statement:
243
+ type: string
244
+ existing_source:
245
+ type: string
246
+ new_statement:
247
+ type: string
248
+ new_source:
249
+ type: string
250
+ required: [page_title, existing_statement, new_statement]
251
+ additionalProperties: false
252
+ required: [pages]
253
+ additionalProperties: false
254
+ inputs: [source, captured_on, wiki_schema, page_index, candidate_pages]
255
+ default_model: null
@@ -9,7 +9,9 @@ from iatoolkit.repositories.database_manager import DatabaseManager
9
9
  from iatoolkit.repositories.models import (
10
10
  MemoryCapture,
11
11
  MemoryCaptureStatus,
12
+ MemoryConflict,
12
13
  MemoryItem,
14
+ MemoryPageDocument,
13
15
  MemoryWikiPageSource,
14
16
  )
15
17
 
@@ -167,6 +169,93 @@ class MemoryRepo:
167
169
  )
168
170
  return [page_id for (page_id,) in rows]
169
171
 
172
+ def add_page_document(self, company_id: int, wiki_page_id: int, document_id: int, label: str | None) -> None:
173
+ """Records that a page took facts from a RAG document (BL-014); keeps one link per pair."""
174
+ if not company_id or not wiki_page_id or not document_id:
175
+ return
176
+ link = (
177
+ self.session.query(MemoryPageDocument)
178
+ .filter_by(wiki_page_id=wiki_page_id, document_id=document_id)
179
+ .first()
180
+ )
181
+ if link is None:
182
+ self.session.add(MemoryPageDocument(
183
+ company_id=company_id,
184
+ wiki_page_id=wiki_page_id,
185
+ document_id=document_id,
186
+ label=(label or "")[:300] or None,
187
+ ))
188
+ elif label and link.label != label:
189
+ link.label = label[:300]
190
+ self.session.commit()
191
+
192
+ def list_page_ids_for_document(self, company_id: int, document_id: int) -> list[int]:
193
+ if not company_id or not document_id:
194
+ return []
195
+ rows = (
196
+ self.session.query(MemoryPageDocument.wiki_page_id)
197
+ .filter_by(company_id=company_id, document_id=document_id)
198
+ .order_by(MemoryPageDocument.id.asc())
199
+ .all()
200
+ )
201
+ return [page_id for (page_id,) in rows]
202
+
203
+ def list_page_documents(self, wiki_page_id: int) -> list[MemoryPageDocument]:
204
+ if not wiki_page_id:
205
+ return []
206
+ return (
207
+ self.session.query(MemoryPageDocument)
208
+ .filter_by(wiki_page_id=wiki_page_id)
209
+ .order_by(MemoryPageDocument.id.asc())
210
+ .all()
211
+ )
212
+
213
+ def list_document_links(self, company_id: int, document_id: int) -> list[MemoryPageDocument]:
214
+ if not company_id or not document_id:
215
+ return []
216
+ return (
217
+ self.session.query(MemoryPageDocument)
218
+ .filter_by(company_id=company_id, document_id=document_id)
219
+ .order_by(MemoryPageDocument.id.asc())
220
+ .all()
221
+ )
222
+
223
+ def list_obsolete_page_documents(self, company_id: int, limit: int = 50) -> list[MemoryPageDocument]:
224
+ """Pages that cite a deleted document and nobody reviewed yet."""
225
+ if not company_id:
226
+ return []
227
+ return (
228
+ self.session.query(MemoryPageDocument)
229
+ .filter(MemoryPageDocument.company_id == company_id,
230
+ MemoryPageDocument.removed_at.isnot(None),
231
+ MemoryPageDocument.reviewed_at.is_(None))
232
+ .order_by(MemoryPageDocument.removed_at.desc())
233
+ .limit(limit)
234
+ .all()
235
+ )
236
+
237
+ def get_page_document(self, company_id: int, link_id: int) -> MemoryPageDocument | None:
238
+ return self.session.query(MemoryPageDocument).filter_by(company_id=company_id, id=link_id).first()
239
+
240
+ def add_conflict(self, conflict: MemoryConflict) -> MemoryConflict:
241
+ self.session.add(conflict)
242
+ self.session.commit()
243
+ return conflict
244
+
245
+ def list_open_conflicts(self, company_id: int, limit: int = 50) -> list[MemoryConflict]:
246
+ if not company_id:
247
+ return []
248
+ return (
249
+ self.session.query(MemoryConflict)
250
+ .filter_by(company_id=company_id, status=MemoryConflict.STATUS_OPEN)
251
+ .order_by(MemoryConflict.created_at.desc())
252
+ .limit(limit)
253
+ .all()
254
+ )
255
+
256
+ def get_conflict(self, company_id: int, conflict_id: int) -> MemoryConflict | None:
257
+ return self.session.query(MemoryConflict).filter_by(company_id=company_id, id=conflict_id).first()
258
+
170
259
  def delete_page_sources_for_item(self, item_id: int) -> None:
171
260
  """Unlinks an item from every page. The pages themselves are never touched."""
172
261
  if not item_id:
@@ -564,6 +564,71 @@ class MemoryWikiPageSource(Base):
564
564
  return {column.key: getattr(self, column.key) for column in class_mapper(self.__class__).columns}
565
565
 
566
566
 
567
+ class MemoryPageDocument(Base):
568
+ """
569
+ A page of the company's Memoria wiki that took facts from a document of the
570
+ RAG (BL-014): which page cites which document, under what label.
571
+
572
+ `document_id` has no foreign key on purpose: when the document is deleted the
573
+ link stays, so the pages that cited it can be found and their facts marked
574
+ as obsolete.
575
+ """
576
+ __tablename__ = "iat_memory_page_documents"
577
+
578
+ id = Column(Integer, primary_key=True, autoincrement=True)
579
+ company_id = Column(Integer, ForeignKey(f"{ORM_SCHEMA}.iat_companies.id", ondelete="CASCADE"), nullable=False)
580
+ wiki_page_id = Column(Integer, ForeignKey(f"{ORM_SCHEMA}.iat_knowledge_wiki_pages.id", ondelete="CASCADE"),
581
+ nullable=False, index=True)
582
+ document_id = Column(Integer, nullable=False, index=True)
583
+ label = Column(String, nullable=True)
584
+ # The document was deleted: its facts on the page are marked as obsolete and
585
+ # the page waits for someone to review it ("Necesita atención").
586
+ removed_at = Column(DateTime, nullable=True)
587
+ reviewed_at = Column(DateTime, nullable=True)
588
+ reviewed_by = Column(String, nullable=True)
589
+ created_at = Column(DateTime, default=datetime.now, nullable=False)
590
+ updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, nullable=False)
591
+
592
+ __table_args__ = (
593
+ UniqueConstraint("wiki_page_id", "document_id", name="uix_memory_page_document_unique"),
594
+ )
595
+
596
+ def to_dict(self):
597
+ return {column.key: getattr(self, column.key) for column in class_mapper(self.__class__).columns}
598
+
599
+
600
+ class MemoryConflict(Base):
601
+ """
602
+ Two sources that disagree on a page of the company's Memoria wiki (BL-014):
603
+ what the page already said and what a new capture or document says. The
604
+ page keeps both, attributed; the conflict waits in "Necesita atención" until
605
+ someone keeps one of them, or both.
606
+ """
607
+ __tablename__ = "iat_memory_conflicts"
608
+
609
+ STATUS_OPEN = "open"
610
+ STATUS_RESOLVED = "resolved"
611
+
612
+ id = Column(Integer, primary_key=True, autoincrement=True)
613
+ company_id = Column(Integer, ForeignKey(f"{ORM_SCHEMA}.iat_companies.id", ondelete="CASCADE"), nullable=False,
614
+ index=True)
615
+ wiki_page_id = Column(Integer, ForeignKey(f"{ORM_SCHEMA}.iat_knowledge_wiki_pages.id", ondelete="CASCADE"),
616
+ nullable=False, index=True)
617
+ capture_id = Column(Integer, nullable=True)
618
+ existing_statement = Column(Text, nullable=False)
619
+ existing_source = Column(String, nullable=True)
620
+ new_statement = Column(Text, nullable=False)
621
+ new_source = Column(String, nullable=True)
622
+ status = Column(String(16), nullable=False, default=STATUS_OPEN, index=True)
623
+ resolution = Column(String(32), nullable=True)
624
+ resolved_by = Column(String, nullable=True)
625
+ resolved_at = Column(DateTime, nullable=True)
626
+ created_at = Column(DateTime, default=datetime.now, nullable=False)
627
+
628
+ def to_dict(self):
629
+ return {column.key: getattr(self, column.key) for column in class_mapper(self.__class__).columns}
630
+
631
+
567
632
  class MemoryQuestion(Base):
568
633
  """
569
634
  A question about the company that the AI could not answer (BL-005, Fase 1).
@@ -543,6 +543,17 @@ class ConfigurationService:
543
543
  elif agent_config.get("model") is not None and not isinstance(agent_config.get("model"), str):
544
544
  add_error(f"system_agents.{agent_key}.model", "Must be a single model name.")
545
545
 
546
+ # Memoria's settings: which document types do not feed its wiki (BL-014).
547
+ memory_config = config.get("memory")
548
+ if memory_config is not None:
549
+ if not isinstance(memory_config, dict):
550
+ add_error("memory", "Must be a dictionary.")
551
+ else:
552
+ excluded = memory_config.get("excluded_document_types")
553
+ if excluded is not None and (
554
+ not isinstance(excluded, list) or not all(isinstance(value, str) for value in excluded)):
555
+ add_error("memory.excluded_document_types", "Must be a list of document types.")
556
+
546
557
  # 2. LLM section
547
558
  if not isinstance(config.get("llm"), dict):
548
559
  add_error("llm", "Missing or invalid 'llm' section.")