openrag 0.6.0.dev20__tar.gz → 0.6.0.dev22__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. {openrag-0.6.0.dev20/src/openrag.egg-info → openrag-0.6.0.dev22}/PKG-INFO +1 -1
  2. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/pyproject.toml +1 -1
  3. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22/src/openrag.egg-info}/PKG-INFO +1 -1
  4. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/flows_service.py +105 -105
  5. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/cli.py +40 -18
  6. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/managers/container_manager.py +13 -3
  7. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/LICENSE +0 -0
  8. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/MANIFEST.in +0 -0
  9. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/README.md +0 -0
  10. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/setup.cfg +0 -0
  11. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/agent.py +0 -0
  12. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/__init__.py +0 -0
  13. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/acl.py +0 -0
  14. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/auth.py +0 -0
  15. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/chat.py +0 -0
  16. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/config.py +0 -0
  17. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/connectors.py +0 -0
  18. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/docling.py +0 -0
  19. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/documents.py +0 -0
  20. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/files.py +0 -0
  21. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/flows.py +0 -0
  22. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/health.py +0 -0
  23. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/ingest_preview.py +0 -0
  24. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/keys.py +0 -0
  25. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/knowledge_filter.py +0 -0
  26. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/langflow_files.py +0 -0
  27. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/langflow_ingest.py +0 -0
  28. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/models.py +0 -0
  29. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/nudges.py +0 -0
  30. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/oidc.py +0 -0
  31. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/provider_health.py +0 -0
  32. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/provider_validation.py +0 -0
  33. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/router.py +0 -0
  34. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/schemas/tasks.py +0 -0
  35. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/search.py +0 -0
  36. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/settings/__init__.py +0 -0
  37. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/settings/endpoints.py +0 -0
  38. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/settings/helpers.py +0 -0
  39. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/settings/langflow_sync.py +0 -0
  40. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/settings/models.py +0 -0
  41. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/tasks.py +0 -0
  42. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/upload.py +0 -0
  43. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/users.py +0 -0
  44. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/v1/__init__.py +0 -0
  45. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/v1/_filter_resolution.py +0 -0
  46. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/v1/chat.py +0 -0
  47. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/v1/documents.py +0 -0
  48. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/v1/knowledge_filters.py +0 -0
  49. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/v1/models.py +0 -0
  50. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/v1/search.py +0 -0
  51. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/api/v1/settings.py +0 -0
  52. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/__init__.py +0 -0
  53. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/container.py +0 -0
  54. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/factory.py +0 -0
  55. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/lifespan.py +0 -0
  56. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/middleware.py +0 -0
  57. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/router_app.py +0 -0
  58. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/routes/__init__.py +0 -0
  59. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/routes/internal.py +0 -0
  60. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/routes/mcp.py +0 -0
  61. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/app/routes/public_v1.py +0 -0
  62. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/auth/__init__.py +0 -0
  63. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/auth/ibm_auth.py +0 -0
  64. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/auth/jwt_roles.py +0 -0
  65. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/auth/permission_dependencies.py +0 -0
  66. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/auth/request_identity.py +0 -0
  67. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/auth/user_identity_cache.py +0 -0
  68. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/auth_context.py +0 -0
  69. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/bootstrap.py +0 -0
  70. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/config/__init__.py +0 -0
  71. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/config/config_manager.py +0 -0
  72. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/config/embedding_constants.py +0 -0
  73. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/config/model_constants.py +0 -0
  74. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/config/paths.py +0 -0
  75. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/config/settings.py +0 -0
  76. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/config/storage_mode.py +0 -0
  77. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/config/utils.py +0 -0
  78. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/__init__.py +0 -0
  79. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/aws_s3/__init__.py +0 -0
  80. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/aws_s3/api.py +0 -0
  81. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/aws_s3/auth.py +0 -0
  82. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/aws_s3/connector.py +0 -0
  83. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/aws_s3/models.py +0 -0
  84. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/aws_s3/support.py +0 -0
  85. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/base.py +0 -0
  86. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/connection_manager.py +0 -0
  87. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/google_drive/__init__.py +0 -0
  88. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/google_drive/connector.py +0 -0
  89. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/google_drive/oauth.py +0 -0
  90. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/google_drive_acl.py +0 -0
  91. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/microsoft_graph_acl.py +0 -0
  92. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/microsoft_oauth_utils.py +0 -0
  93. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/onedrive/__init__.py +0 -0
  94. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/onedrive/connector.py +0 -0
  95. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/onedrive/oauth.py +0 -0
  96. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/registry.py +0 -0
  97. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/service.py +0 -0
  98. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/sharepoint/__init__.py +0 -0
  99. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/sharepoint/connector.py +0 -0
  100. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/sharepoint/oauth.py +0 -0
  101. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/connectors/sharepoint/utils.py +0 -0
  102. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/__init__.py +0 -0
  103. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/base.py +0 -0
  104. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/engine.py +0 -0
  105. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/migrations_runtime.py +0 -0
  106. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/__init__.py +0 -0
  107. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/api_key.py +0 -0
  108. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/audit_log.py +0 -0
  109. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/conversation.py +0 -0
  110. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/migration_status.py +0 -0
  111. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/permission.py +0 -0
  112. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/role.py +0 -0
  113. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/role_permission.py +0 -0
  114. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/session_ownership.py +0 -0
  115. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/user.py +0 -0
  116. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/user_preferences.py +0 -0
  117. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/user_role.py +0 -0
  118. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/models/workspace_config.py +0 -0
  119. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/__init__.py +0 -0
  120. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/_helpers.py +0 -0
  121. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/api_key_repo.py +0 -0
  122. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/audit_repo.py +0 -0
  123. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/conversation_repo.py +0 -0
  124. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/permission_repo.py +0 -0
  125. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/preferences_repo.py +0 -0
  126. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/role_repo.py +0 -0
  127. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/session_ownership_repo.py +0 -0
  128. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/user_repo.py +0 -0
  129. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/repositories/workspace_config_repo.py +0 -0
  130. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/seed.py +0 -0
  131. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/db/types.py +0 -0
  132. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/dependencies.py +0 -0
  133. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/main.py +0 -0
  134. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/mcp_http/__init__.py +0 -0
  135. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/mcp_http/server.py +0 -0
  136. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/models/__init__.py +0 -0
  137. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/models/processors.py +0 -0
  138. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/models/tasks.py +0 -0
  139. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/models/url.py +0 -0
  140. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/openrag.egg-info/SOURCES.txt +0 -0
  141. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/openrag.egg-info/dependency_links.txt +0 -0
  142. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/openrag.egg-info/entry_points.txt +0 -0
  143. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/openrag.egg-info/requires.txt +0 -0
  144. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/openrag.egg-info/top_level.txt +0 -0
  145. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/__init__.py +0 -0
  146. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/api_key_service.py +0 -0
  147. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/auth_service.py +0 -0
  148. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/chat_service.py +0 -0
  149. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/connector_access_service.py +0 -0
  150. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/connector_oauth_config_service.py +0 -0
  151. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/conversation_persistence_service.py +0 -0
  152. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/default_docs_service.py +0 -0
  153. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/default_role_sync.py +0 -0
  154. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/dev_role_toggle.py +0 -0
  155. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/dls_principal_service.py +0 -0
  156. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/docling_polling_service.py +0 -0
  157. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/docling_service.py +0 -0
  158. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/document_index_writer.py +0 -0
  159. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/document_service.py +0 -0
  160. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/file_service.py +0 -0
  161. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/group_acl_service.py +0 -0
  162. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/ingest_preview_service.py +0 -0
  163. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/knowledge_filter_service.py +0 -0
  164. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/langflow_file_service.py +0 -0
  165. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/langflow_history_service.py +0 -0
  166. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/langflow_ingest_token_service.py +0 -0
  167. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/langflow_mcp_service.py +0 -0
  168. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/models_service.py +0 -0
  169. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/monitor_service.py +0 -0
  170. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/onboarding_reset.py +0 -0
  171. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/rbac_service.py +0 -0
  172. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/search_service.py +0 -0
  173. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/session_ownership_service.py +0 -0
  174. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/startup_orchestrator.py +0 -0
  175. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/task_service.py +0 -0
  176. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/user_service.py +0 -0
  177. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/services/workspace_config_service.py +0 -0
  178. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/session_manager.py +0 -0
  179. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/__init__.py +0 -0
  180. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/docker-compose.gpu.yml +0 -0
  181. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/docker-compose.yml +0 -0
  182. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/components/ollama_embedding.json +0 -0
  183. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/components/ollama_llm.json +0 -0
  184. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/components/ollama_llm_text.json +0 -0
  185. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/components/watsonx_embedding.json +0 -0
  186. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/components/watsonx_llm.json +0 -0
  187. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/components/watsonx_llm_text.json +0 -0
  188. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/ingestion_flow.json +0 -0
  189. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/openrag_agent.json +0 -0
  190. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/openrag_nudges.json +0 -0
  191. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/flows/openrag_url_mcp.json +0 -0
  192. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/openrag-documents/docling.pdf +0 -0
  193. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/openrag-documents/ibm_anthropic.pdf +0 -0
  194. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/_assets/openrag-documents/warmup_ocr.pdf +0 -0
  195. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/config_fields.py +0 -0
  196. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/main.py +0 -0
  197. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/managers/__init__.py +0 -0
  198. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/managers/docling_manager.py +0 -0
  199. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/managers/env_manager.py +0 -0
  200. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/screens/__init__.py +0 -0
  201. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/screens/config.py +0 -0
  202. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/screens/diagnostics.py +0 -0
  203. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/screens/logs.py +0 -0
  204. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/screens/monitor.py +0 -0
  205. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/screens/welcome.py +0 -0
  206. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/utils/__init__.py +0 -0
  207. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/utils/clipboard.py +0 -0
  208. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/utils/platform.py +0 -0
  209. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/utils/startup_checks.py +0 -0
  210. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/utils/validation.py +0 -0
  211. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/utils/version_check.py +0 -0
  212. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/__init__.py +0 -0
  213. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/command_modal.py +0 -0
  214. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/diagnostics_notification.py +0 -0
  215. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/error_notification.py +0 -0
  216. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/factory_reset_warning_modal.py +0 -0
  217. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/flow_backup_warning_modal.py +0 -0
  218. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/prune_options_modal.py +0 -0
  219. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/upgrade_instructions_modal.py +0 -0
  220. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/version_mismatch_warning_modal.py +0 -0
  221. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/tui/widgets/waves.py +0 -0
  222. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/__init__.py +0 -0
  223. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/acl_utils.py +0 -0
  224. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/container_utils.py +0 -0
  225. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/docling_client.py +0 -0
  226. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/document_processing.py +0 -0
  227. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/embedding_fields.py +0 -0
  228. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/embeddings.py +0 -0
  229. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/encryption.py +0 -0
  230. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/env_utils.py +0 -0
  231. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/file_utils.py +0 -0
  232. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/gpu_detection.py +0 -0
  233. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/group_acl.py +0 -0
  234. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/hash_utils.py +0 -0
  235. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/ingest_preview_flag.py +0 -0
  236. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/jwt_keygen.py +0 -0
  237. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/jwt_verification.py +0 -0
  238. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/langflow_headers.py +0 -0
  239. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/langflow_utils.py +0 -0
  240. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/logging_config.py +0 -0
  241. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/opensearch_delete.py +0 -0
  242. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/opensearch_init.py +0 -0
  243. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/opensearch_queries.py +0 -0
  244. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/opensearch_utils.py +0 -0
  245. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/paths.py +0 -0
  246. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/provider_health_cache.py +0 -0
  247. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/run_mode_utils.py +0 -0
  248. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/telemetry/__init__.py +0 -0
  249. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/telemetry/category.py +0 -0
  250. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/telemetry/client.py +0 -0
  251. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/telemetry/message_id.py +0 -0
  252. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/url_content_fetcher.py +0 -0
  253. {openrag-0.6.0.dev20 → openrag-0.6.0.dev22}/src/utils/version_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrag
3
- Version: 0.6.0.dev20
3
+ Version: 0.6.0.dev22
4
4
  Summary: OpenRAG is a comprehensive Retrieval-Augmented Generation platform that enables intelligent document search and AI-powered conversations.
5
5
  Classifier: Development Status :: 4 - Beta
6
6
  Classifier: Environment :: Console
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "openrag"
7
- version = "0.6.0.dev20"
7
+ version = "0.6.0.dev22"
8
8
  description = "OpenRAG is a comprehensive Retrieval-Augmented Generation platform that enables intelligent document search and AI-powered conversations."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrag
3
- Version: 0.6.0.dev20
3
+ Version: 0.6.0.dev22
4
4
  Summary: OpenRAG is a comprehensive Retrieval-Augmented Generation platform that enables intelligent document search and AI-powered conversations.
5
5
  Classifier: Development Status :: 4 - Beta
6
6
  Classifier: Environment :: Console
@@ -1099,128 +1099,128 @@ class FlowsService:
1099
1099
  return label
1100
1100
  return None
1101
1101
 
1102
- # Update embedding component
1103
- if not get_openrag_config().knowledge.disable_ingest_with_langflow and (
1104
- embedding_model or force_embedding_update
1102
+ # Update embedding component
1103
+ if not get_openrag_config().knowledge.disable_ingest_with_langflow and (
1104
+ embedding_model or force_embedding_update
1105
+ ):
1106
+ # Get all embedding nodes in the flow
1107
+ embedding_nodes = self._find_nodes_in_flow(
1108
+ flow_data, display_name=OPENAI_EMBEDDING_COMPONENT_DISPLAY_NAME
1109
+ )
1110
+ logger.info(
1111
+ f"Found {len(embedding_nodes)} embedding nodes in flow {flow_name} with display name '{OPENAI_EMBEDDING_COMPONENT_DISPLAY_NAME}'"
1112
+ )
1113
+
1114
+ # Count configured embedding-enabled providers
1115
+ config_obj = get_openrag_config()
1116
+ configured_providers = []
1117
+ if config_obj.providers.openai.configured:
1118
+ configured_providers.append("openai")
1119
+ if config_obj.providers.watsonx.configured:
1120
+ configured_providers.append("watsonx")
1121
+ if config_obj.providers.ollama.configured:
1122
+ configured_providers.append("ollama")
1123
+
1124
+ # Ensure current provider is in the list for counting purposes if it's being configured
1125
+ if (
1126
+ provider in ["openai", "watsonx", "ollama"]
1127
+ and provider not in configured_providers
1105
1128
  ):
1106
- # Get all embedding nodes in the flow
1107
- embedding_nodes = self._find_nodes_in_flow(
1108
- flow_data, display_name=OPENAI_EMBEDDING_COMPONENT_DISPLAY_NAME
1109
- )
1110
- logger.info(
1111
- f"Found {len(embedding_nodes)} embedding nodes in flow {flow_name} with display name '{OPENAI_EMBEDDING_COMPONENT_DISPLAY_NAME}'"
1112
- )
1129
+ configured_providers.append(provider)
1113
1130
 
1114
- # Count configured embedding-enabled providers
1115
- config_obj = get_openrag_config()
1116
- configured_providers = []
1117
- if config_obj.providers.openai.configured:
1118
- configured_providers.append("openai")
1119
- if config_obj.providers.watsonx.configured:
1120
- configured_providers.append("watsonx")
1121
- if config_obj.providers.ollama.configured:
1122
- configured_providers.append("ollama")
1123
-
1124
- # Ensure current provider is in the list for counting purposes if it's being configured
1125
- if (
1126
- provider in ["openai", "watsonx", "ollama"]
1127
- and provider not in configured_providers
1128
- ):
1129
- configured_providers.append(provider)
1131
+ all_possible = ["openai", "watsonx", "ollama"]
1132
+ configured_providers = [p for p in all_possible if p in configured_providers]
1133
+ provider_count = len(configured_providers)
1134
+ logger.info(
1135
+ f"Configured embedding providers: {configured_providers} (count: {provider_count})"
1136
+ )
1137
+
1138
+ # 1. Check if any node is already this provider - always update those first
1139
+ matched_nodes = []
1140
+ provider_display = self._get_provider_name_display(provider)
1141
+ for node, idx in embedding_nodes:
1142
+ if self._get_node_provider(node) == provider_display:
1143
+ matched_nodes.append((node, idx))
1130
1144
 
1131
- all_possible = ["openai", "watsonx", "ollama"]
1132
- configured_providers = [p for p in all_possible if p in configured_providers]
1133
- provider_count = len(configured_providers)
1145
+ if matched_nodes:
1134
1146
  logger.info(
1135
- f"Configured embedding providers: {configured_providers} (count: {provider_count})"
1147
+ f"Found {len(matched_nodes)} nodes already configured for provider '{provider}'"
1136
1148
  )
1137
-
1138
- # 1. Check if any node is already this provider - always update those first
1139
- matched_nodes = []
1140
- provider_display = self._get_provider_name_display(provider)
1141
- for node, idx in embedding_nodes:
1142
- if self._get_node_provider(node) == provider_display:
1143
- matched_nodes.append((node, idx))
1144
-
1145
- if matched_nodes:
1149
+ for node, _idx in matched_nodes:
1150
+ node_tasks.append(
1151
+ wrap_node_update(
1152
+ node,
1153
+ provider,
1154
+ embedding_model,
1155
+ f"embedding model: {embedding_model} (updated existing {provider} node)",
1156
+ )
1157
+ )
1158
+ else:
1159
+ # 2. No existing node matched, use slot-based logic
1160
+ try:
1161
+ p_index = configured_providers.index(provider)
1146
1162
  logger.info(
1147
- f"Found {len(matched_nodes)} nodes already configured for provider '{provider}'"
1163
+ f"Using slot-based logic for provider '{provider}' (p_index: {p_index}, total configured: {provider_count})"
1148
1164
  )
1149
- for node, _idx in matched_nodes:
1150
- node_tasks.append(
1151
- wrap_node_update(
1152
- node,
1153
- provider,
1154
- embedding_model,
1155
- f"embedding model: {embedding_model} (updated existing {provider} node)",
1156
- )
1157
- )
1158
- else:
1159
- # 2. No existing node matched, use slot-based logic
1160
- try:
1161
- p_index = configured_providers.index(provider)
1165
+
1166
+ if provider_count == 1:
1167
+ # Single provider mode: update all available nodes (up to 3)
1162
1168
  logger.info(
1163
- f"Using slot-based logic for provider '{provider}' (p_index: {p_index}, total configured: {provider_count})"
1169
+ f"Single provider mode: updating all available embedding nodes (available: {len(embedding_nodes)})"
1164
1170
  )
1165
-
1166
- if provider_count == 1:
1167
- # Single provider mode: update all available nodes (up to 3)
1171
+ for i in range(min(3, len(embedding_nodes))):
1172
+ node, idx = embedding_nodes[i]
1173
+ node_tasks.append(
1174
+ wrap_node_update(
1175
+ node,
1176
+ provider,
1177
+ embedding_model,
1178
+ f"embedding model: {embedding_model} (set node {i + 1})",
1179
+ )
1180
+ )
1181
+ else:
1182
+ # Multiple providers: each gets one slot based on its list index
1183
+ if p_index < len(embedding_nodes):
1184
+ node, idx = embedding_nodes[p_index]
1168
1185
  logger.info(
1169
- f"Single provider mode: updating all available embedding nodes (available: {len(embedding_nodes)})"
1186
+ f"Multiple provider mode: assigning provider '{provider}' to node slot {p_index} (node {p_index + 1})"
1170
1187
  )
1171
- for i in range(min(3, len(embedding_nodes))):
1172
- node, idx = embedding_nodes[i]
1173
- node_tasks.append(
1174
- wrap_node_update(
1175
- node,
1176
- provider,
1177
- embedding_model,
1178
- f"embedding model: {embedding_model} (set node {i + 1})",
1179
- )
1188
+ node_tasks.append(
1189
+ wrap_node_update(
1190
+ node,
1191
+ provider,
1192
+ embedding_model,
1193
+ f"embedding model: {embedding_model} (set node {p_index + 1})",
1180
1194
  )
1195
+ )
1181
1196
  else:
1182
- # Multiple providers: each gets one slot based on its list index
1183
- if p_index < len(embedding_nodes):
1184
- node, idx = embedding_nodes[p_index]
1185
- logger.info(
1186
- f"Multiple provider mode: assigning provider '{provider}' to node slot {p_index} (node {p_index + 1})"
1187
- )
1188
- node_tasks.append(
1189
- wrap_node_update(
1190
- node,
1191
- provider,
1192
- embedding_model,
1193
- f"embedding model: {embedding_model} (set node {p_index + 1})",
1194
- )
1195
- )
1196
- else:
1197
- logger.info(
1198
- f"Provider index {p_index} exceeds available embedding nodes ({len(embedding_nodes)}) - skipping automatic assignment"
1199
- )
1200
- except ValueError:
1201
- logger.warning(
1202
- f"Current provider '{provider}' not found in configured providers list: {configured_providers}"
1203
- )
1204
-
1205
- # Update LLM component (if exists in this flow)
1206
- if llm_model or force_llm_update:
1207
- llm_node, _ = self._find_node_in_flow(
1208
- flow_data, display_name=OPENAI_LLM_COMPONENT_DISPLAY_NAME
1209
- )
1210
- if llm_node:
1211
- node_tasks.append(
1212
- wrap_node_update(llm_node, provider, llm_model, f"llm model: {llm_model}")
1197
+ logger.info(
1198
+ f"Provider index {p_index} exceeds available embedding nodes ({len(embedding_nodes)}) - skipping automatic assignment"
1199
+ )
1200
+ except ValueError:
1201
+ logger.warning(
1202
+ f"Current provider '{provider}' not found in configured providers list: {configured_providers}"
1213
1203
  )
1214
1204
 
1215
- agent_node, _ = self._find_node_in_flow(
1216
- flow_data, display_name=AGENT_COMPONENT_DISPLAY_NAME
1205
+ # Update LLM component (if exists in this flow)
1206
+ if llm_model or force_llm_update:
1207
+ llm_node, _ = self._find_node_in_flow(
1208
+ flow_data, display_name=OPENAI_LLM_COMPONENT_DISPLAY_NAME
1209
+ )
1210
+ if llm_node:
1211
+ node_tasks.append(
1212
+ wrap_node_update(llm_node, provider, llm_model, f"llm model: {llm_model}")
1217
1213
  )
1218
- if agent_node:
1219
- node_tasks.append(
1220
- wrap_node_update(
1221
- agent_node, provider, llm_model, f"agent model: {llm_model}"
1222
- )
1214
+
1215
+ agent_node, _ = self._find_node_in_flow(
1216
+ flow_data, display_name=AGENT_COMPONENT_DISPLAY_NAME
1217
+ )
1218
+ if agent_node:
1219
+ node_tasks.append(
1220
+ wrap_node_update(
1221
+ agent_node, provider, llm_model, f"agent model: {llm_model}"
1223
1222
  )
1223
+ )
1224
1224
 
1225
1225
  # Execute all node updates simultaneously
1226
1226
  if node_tasks:
@@ -227,15 +227,18 @@ def _setup_walkthrough(
227
227
  _, _, already_running = _get_service_states(container_manager, docling_manager)
228
228
  if already_running:
229
229
  _stop_services_cli(container_manager, docling_manager)
230
- _start_services_cli(container_manager, docling_manager)
230
+ fully_started = _start_services_cli(container_manager, docling_manager)
231
231
 
232
- console.print()
233
- frontend_url = f"http://localhost:{os.getenv('FRONTEND_PORT', '3000')}"
234
- console.print(f"[bold green]OpenRAG is running at {frontend_url}[/bold green]")
235
- try:
236
- webbrowser.open(frontend_url)
237
- except Exception:
238
- pass
232
+ # Only announce the app URL / open the browser once everything is up;
233
+ # _start_services_cli already surfaced a warning for a partial startup.
234
+ if fully_started:
235
+ console.print()
236
+ frontend_url = f"http://localhost:{os.getenv('FRONTEND_PORT', '3000')}"
237
+ console.print(f"[bold green]OpenRAG is running at {frontend_url}[/bold green]")
238
+ try:
239
+ webbrowser.open(frontend_url)
240
+ except Exception:
241
+ pass
239
242
 
240
243
 
241
244
  def _collect_config(
@@ -345,11 +348,14 @@ def _start_services_cli(
345
348
  console.print("Starting OpenRAG services...", style="bold")
346
349
 
347
350
  async def _inner():
351
+ containers_ok = True
352
+ docling_ok = docling_manager.is_running()
353
+
348
354
  # Start container services
349
355
  if container_manager.is_available():
350
356
  async for item in container_manager.start_services():
351
357
  # start_services yields (success, message) or (success, message, replace_last)
352
- success = item[0]
358
+ containers_ok = item[0]
353
359
  message = item[1]
354
360
  replace_last = item[2] if len(item) > 2 else False
355
361
  if replace_last:
@@ -358,24 +364,40 @@ def _start_services_cli(
358
364
  else:
359
365
  console.print(f" {message}")
360
366
 
361
- if not success and "error" in message.lower():
362
- console.print(f" [red]✗ {message}[/red]")
367
+ if not containers_ok:
368
+ statuses = await container_manager.get_service_status(force_refresh=True)
369
+ containers_ok = bool(statuses) and all(
370
+ s.status == ServiceStatus.RUNNING for s in statuses.values()
371
+ )
363
372
  else:
364
373
  console.print(" [yellow]No container runtime available[/yellow]")
374
+ containers_ok = False
365
375
 
366
- # Start docling
367
- if not docling_manager.is_running():
368
- success, message = await docling_manager.start()
369
- if success:
376
+ if not docling_ok:
377
+ docling_ok, message = await docling_manager.start()
378
+ if docling_ok:
370
379
  console.print(f" {message}")
371
380
  else:
372
381
  console.print(f" [yellow]{message}[/yellow]")
373
382
 
383
+ return containers_ok, docling_ok
384
+
374
385
  try:
375
- asyncio.run(_inner())
376
- console.print("[green]✓ All services started[/green]")
386
+ containers_ok, docling_ok = asyncio.run(_inner())
387
+
388
+ # On full success the menu header already reports "Services are running",
389
+ # so only surface partial/failed startup here to avoid a duplicate message.
390
+ results = {"containers": containers_ok, "docling-serve": docling_ok}
391
+ failed = [name for name, ok in results.items() if not ok]
392
+ if failed:
393
+ console.print(
394
+ f"[yellow]⚠ Startup incomplete: {', '.join(failed)} did not start "
395
+ "(run Show status for details)[/yellow]"
396
+ )
397
+ return not failed
377
398
  except Exception as e:
378
399
  console.print(f"[red]✗ Error starting services: {e}[/red]")
400
+ return False
379
401
 
380
402
 
381
403
  def _stop_services_cli(
@@ -393,7 +415,7 @@ def _stop_services_cli(
393
415
  console.print(f" {message}")
394
416
  # Stop docling
395
417
  if docling_manager.is_running():
396
- success, message = await docling_manager.stop()
418
+ _success, message = await docling_manager.stop()
397
419
  console.print(f" {message}")
398
420
 
399
421
  try:
@@ -644,6 +644,13 @@ class ContainerManager:
644
644
 
645
645
  return True, images, ""
646
646
 
647
+ def _resolve_service_name(self, compose_service: str | None, container_name: str) -> str | None:
648
+ """Resolve a container to its canonical OpenRAG service name"""
649
+ if compose_service and compose_service in self.expected_services:
650
+ return compose_service
651
+
652
+ return self.container_name_map.get(container_name)
653
+
647
654
  def _process_service_json(self, service: dict, services: dict[str, ServiceInfo]) -> None:
648
655
  """Process a service JSON object and add it to the services dict."""
649
656
  # Debug print to see the actual service data
@@ -651,8 +658,8 @@ class ContainerManager:
651
658
 
652
659
  container_name = service.get("Name", "")
653
660
 
654
- # Map container name to service name
655
- service_name = self.container_name_map.get(container_name)
661
+ # Resolve to canonical service name (compose 'Service' field first, then name map)
662
+ service_name = self._resolve_service_name(service.get("Service"), container_name)
656
663
  if not service_name:
657
664
  return
658
665
 
@@ -802,7 +809,10 @@ class ContainerManager:
802
809
  continue
803
810
 
804
811
  container_name = names[0]
805
- service_name = self.container_name_map.get(container_name)
812
+ labels = container.get("Labels") or {}
813
+ service_name = self._resolve_service_name(
814
+ labels.get("com.docker.compose.service"), container_name
815
+ )
806
816
  if not service_name:
807
817
  continue
808
818
 
File without changes
File without changes
File without changes
File without changes