openrag 0.5.0.dev30__tar.gz → 0.5.0.dev31__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 (172) hide show
  1. {openrag-0.5.0.dev30/src/openrag.egg-info → openrag-0.5.0.dev31}/PKG-INFO +1 -1
  2. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/pyproject.toml +1 -1
  3. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/settings.py +4 -0
  4. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31/src/openrag.egg-info}/PKG-INFO +1 -1
  5. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/screens/monitor.py +85 -93
  6. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/LICENSE +0 -0
  7. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/MANIFEST.in +0 -0
  8. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/README.md +0 -0
  9. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/setup.cfg +0 -0
  10. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/agent.py +0 -0
  11. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/__init__.py +0 -0
  12. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/auth.py +0 -0
  13. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/chat.py +0 -0
  14. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/connector_router.py +0 -0
  15. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/connectors.py +0 -0
  16. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/docling.py +0 -0
  17. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/documents.py +0 -0
  18. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/flows.py +0 -0
  19. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/keys.py +0 -0
  20. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/knowledge_filter.py +0 -0
  21. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/langflow_files.py +0 -0
  22. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/models.py +0 -0
  23. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/nudges.py +0 -0
  24. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/oidc.py +0 -0
  25. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/provider_health.py +0 -0
  26. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/provider_validation.py +0 -0
  27. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/router.py +0 -0
  28. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/search.py +0 -0
  29. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/tasks.py +0 -0
  30. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/upload.py +0 -0
  31. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/v1/__init__.py +0 -0
  32. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/v1/chat.py +0 -0
  33. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/v1/documents.py +0 -0
  34. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/v1/knowledge_filters.py +0 -0
  35. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/v1/models.py +0 -0
  36. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/v1/search.py +0 -0
  37. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/api/v1/settings.py +0 -0
  38. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/auth/__init__.py +0 -0
  39. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/auth/ibm_auth.py +0 -0
  40. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/auth_context.py +0 -0
  41. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/bootstrap.py +0 -0
  42. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/config/__init__.py +0 -0
  43. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/config/config_manager.py +0 -0
  44. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/config/embedding_constants.py +0 -0
  45. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/config/model_constants.py +0 -0
  46. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/config/paths.py +0 -0
  47. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/config/settings.py +0 -0
  48. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/__init__.py +0 -0
  49. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/aws_s3/__init__.py +0 -0
  50. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/aws_s3/api.py +0 -0
  51. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/aws_s3/auth.py +0 -0
  52. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/aws_s3/connector.py +0 -0
  53. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/aws_s3/models.py +0 -0
  54. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/aws_s3/support.py +0 -0
  55. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/base.py +0 -0
  56. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/connection_manager.py +0 -0
  57. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/google_drive/__init__.py +0 -0
  58. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/google_drive/connector.py +0 -0
  59. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/google_drive/oauth.py +0 -0
  60. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/ibm_cos/__init__.py +0 -0
  61. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/ibm_cos/api.py +0 -0
  62. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/ibm_cos/auth.py +0 -0
  63. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/ibm_cos/connector.py +0 -0
  64. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/ibm_cos/models.py +0 -0
  65. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/ibm_cos/support.py +0 -0
  66. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/langflow_connector_service.py +0 -0
  67. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/onedrive/__init__.py +0 -0
  68. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/onedrive/connector.py +0 -0
  69. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/onedrive/oauth.py +0 -0
  70. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/service.py +0 -0
  71. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/sharepoint/__init__.py +0 -0
  72. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/sharepoint/connector.py +0 -0
  73. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/sharepoint/oauth.py +0 -0
  74. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/connectors/sharepoint/utils.py +0 -0
  75. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/dependencies.py +0 -0
  76. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/main.py +0 -0
  77. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/mcp_http/__init__.py +0 -0
  78. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/mcp_http/server.py +0 -0
  79. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/models/__init__.py +0 -0
  80. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/models/processors.py +0 -0
  81. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/models/tasks.py +0 -0
  82. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/models/url.py +0 -0
  83. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/openrag.egg-info/SOURCES.txt +0 -0
  84. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/openrag.egg-info/dependency_links.txt +0 -0
  85. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/openrag.egg-info/entry_points.txt +0 -0
  86. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/openrag.egg-info/requires.txt +0 -0
  87. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/openrag.egg-info/top_level.txt +0 -0
  88. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/__init__.py +0 -0
  89. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/api_key_service.py +0 -0
  90. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/auth_service.py +0 -0
  91. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/chat_service.py +0 -0
  92. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/conversation_persistence_service.py +0 -0
  93. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/document_service.py +0 -0
  94. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/flows_service.py +0 -0
  95. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/knowledge_filter_service.py +0 -0
  96. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/langflow_file_service.py +0 -0
  97. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/langflow_history_service.py +0 -0
  98. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/langflow_mcp_service.py +0 -0
  99. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/models_service.py +0 -0
  100. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/monitor_service.py +0 -0
  101. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/search_service.py +0 -0
  102. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/session_ownership_service.py +0 -0
  103. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/services/task_service.py +0 -0
  104. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/session_manager.py +0 -0
  105. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/__init__.py +0 -0
  106. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/docker-compose.gpu.yml +0 -0
  107. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/docker-compose.yml +0 -0
  108. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/components/ollama_embedding.json +0 -0
  109. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/components/ollama_llm.json +0 -0
  110. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/components/ollama_llm_text.json +0 -0
  111. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/components/watsonx_embedding.json +0 -0
  112. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/components/watsonx_llm.json +0 -0
  113. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/components/watsonx_llm_text.json +0 -0
  114. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/ingestion_flow.json +0 -0
  115. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/openrag_agent.json +0 -0
  116. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/openrag_nudges.json +0 -0
  117. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/flows/openrag_url_mcp.json +0 -0
  118. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/openrag-documents/docling.pdf +0 -0
  119. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/openrag-documents/ibm_anthropic.pdf +0 -0
  120. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/_assets/openrag-documents/warmup_ocr.pdf +0 -0
  121. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/cli.py +0 -0
  122. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/config_fields.py +0 -0
  123. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/main.py +0 -0
  124. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/managers/__init__.py +0 -0
  125. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/managers/container_manager.py +0 -0
  126. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/managers/docling_manager.py +0 -0
  127. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/managers/env_manager.py +0 -0
  128. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/screens/__init__.py +0 -0
  129. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/screens/config.py +0 -0
  130. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/screens/diagnostics.py +0 -0
  131. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/screens/logs.py +0 -0
  132. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/screens/welcome.py +0 -0
  133. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/utils/__init__.py +0 -0
  134. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/utils/clipboard.py +0 -0
  135. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/utils/platform.py +0 -0
  136. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/utils/startup_checks.py +0 -0
  137. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/utils/validation.py +0 -0
  138. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/utils/version_check.py +0 -0
  139. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/__init__.py +0 -0
  140. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/command_modal.py +0 -0
  141. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/diagnostics_notification.py +0 -0
  142. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/error_notification.py +0 -0
  143. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/factory_reset_warning_modal.py +0 -0
  144. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/flow_backup_warning_modal.py +0 -0
  145. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/prune_options_modal.py +0 -0
  146. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/upgrade_instructions_modal.py +0 -0
  147. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/version_mismatch_warning_modal.py +0 -0
  148. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/tui/widgets/waves.py +0 -0
  149. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/__init__.py +0 -0
  150. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/acl_utils.py +0 -0
  151. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/container_utils.py +0 -0
  152. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/docling_client.py +0 -0
  153. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/document_processing.py +0 -0
  154. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/embedding_fields.py +0 -0
  155. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/embeddings.py +0 -0
  156. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/encryption.py +0 -0
  157. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/env_utils.py +0 -0
  158. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/file_utils.py +0 -0
  159. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/gpu_detection.py +0 -0
  160. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/hash_utils.py +0 -0
  161. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/langflow_headers.py +0 -0
  162. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/langflow_utils.py +0 -0
  163. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/logging_config.py +0 -0
  164. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/opensearch_queries.py +0 -0
  165. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/opensearch_utils.py +0 -0
  166. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/paths.py +0 -0
  167. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/run_mode_utils.py +0 -0
  168. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/telemetry/__init__.py +0 -0
  169. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/telemetry/category.py +0 -0
  170. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/telemetry/client.py +0 -0
  171. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/telemetry/message_id.py +0 -0
  172. {openrag-0.5.0.dev30 → openrag-0.5.0.dev31}/src/utils/version_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrag
3
- Version: 0.5.0.dev30
3
+ Version: 0.5.0.dev31
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.5.0.dev30"
7
+ version = "0.5.0.dev31"
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"
@@ -1940,6 +1940,10 @@ async def rollback_onboarding(
1940
1940
  current_config.knowledge.embedding_model = ""
1941
1941
  current_config.onboarding.openrag_docs_ingested_version = None
1942
1942
  current_config.onboarding.openrag_docs_remote_signature = None
1943
+ current_config.onboarding.assistant_message = None
1944
+ current_config.onboarding.selected_nudge = None
1945
+ current_config.onboarding.card_steps = None
1946
+ current_config.onboarding.upload_steps = None
1943
1947
 
1944
1948
  embedding_only = body.embedding_only if body else False
1945
1949
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrag
3
- Version: 0.5.0.dev30
3
+ Version: 0.5.0.dev31
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
@@ -3,29 +3,34 @@
3
3
  import asyncio
4
4
  import re
5
5
  import shutil
6
+ from collections.abc import AsyncIterator
6
7
  from pathlib import Path
7
- from typing import Literal, Any, Optional, AsyncIterator
8
-
9
- # Define button variant type
10
- ButtonVariant = Literal["default", "primary", "success", "warning", "error"]
8
+ from typing import Any, Literal, cast
11
9
 
10
+ from rich.text import Text
12
11
  from textual.app import ComposeResult
13
- from textual.containers import Container, Vertical, Horizontal, ScrollableContainer
12
+ from textual.containers import Horizontal, ScrollableContainer
13
+ from textual.coordinate import Coordinate
14
14
  from textual.screen import Screen
15
- from textual.widgets import Header, Footer, Static, Button, DataTable
16
- from textual.timer import Timer
17
- from rich.text import Text
18
- from rich.table import Table
19
-
20
- from ..managers.container_manager import ContainerManager, ServiceStatus, ServiceInfo, format_port_conflict_message
15
+ from textual.widgets import Button, DataTable, Footer, Static
16
+
17
+ from ..managers.container_manager import (
18
+ ContainerManager,
19
+ ServiceInfo,
20
+ ServiceStatus,
21
+ format_port_conflict_message,
22
+ )
21
23
  from ..managers.docling_manager import DoclingManager
22
24
  from ..utils.platform import RuntimeType
23
25
  from ..widgets.command_modal import CommandOutputModal
24
- from ..widgets.flow_backup_warning_modal import FlowBackupWarningModal
26
+ from ..widgets.diagnostics_notification import notify_with_diagnostics
25
27
  from ..widgets.factory_reset_warning_modal import FactoryResetWarningModal
26
- from ..widgets.version_mismatch_warning_modal import VersionMismatchWarningModal
28
+ from ..widgets.flow_backup_warning_modal import FlowBackupWarningModal
27
29
  from ..widgets.upgrade_instructions_modal import UpgradeInstructionsModal
28
- from ..widgets.diagnostics_notification import notify_with_diagnostics
30
+ from ..widgets.version_mismatch_warning_modal import VersionMismatchWarningModal
31
+
32
+ # Define button variant type
33
+ ButtonVariant = Literal["default", "primary", "success", "warning", "error"]
29
34
 
30
35
 
31
36
  class MonitorScreen(Screen):
@@ -55,6 +60,8 @@ class MonitorScreen(Screen):
55
60
  self.refresh_timer = None
56
61
  self.operation_in_progress = False
57
62
  self._follow_task = None
63
+ self._follow_service: str | None = None
64
+ self._logs_buffer: list[str] = []
58
65
 
59
66
  # Track which table was last selected for mutual exclusion
60
67
  self._last_selected_table = None
@@ -63,10 +70,9 @@ class MonitorScreen(Screen):
63
70
  def container_manager(self) -> ContainerManager:
64
71
  """Get the shared container manager from the app."""
65
72
  if self._container_manager is None:
66
- self._container_manager = self.app.container_manager
73
+ self._container_manager = cast(Any, self.app).container_manager
67
74
  return self._container_manager
68
75
 
69
-
70
76
  def compose(self) -> ComposeResult:
71
77
  """Create the monitoring screen layout."""
72
78
  # Just show the services content directly (no header, no tabs)
@@ -98,9 +104,7 @@ class MonitorScreen(Screen):
98
104
  yield Horizontal(id="services-controls", classes="button-row")
99
105
  # Create services table with image + digest info
100
106
  self.services_table = DataTable(id="services-table")
101
- self.services_table.add_columns(
102
- "Service", "Status", "Health", "Ports", "Image", "Digest"
103
- )
107
+ self.services_table.add_columns("Service", "Status", "Health", "Ports", "Image", "Digest")
104
108
  yield self.services_table
105
109
  yield Static(" ")
106
110
 
@@ -118,12 +122,8 @@ class MonitorScreen(Screen):
118
122
  status_text = Text()
119
123
 
120
124
  if not self.container_manager.is_available():
121
- status_text.append(
122
- "WARNING: No container runtime available\n", style="bold red"
123
- )
124
- status_text.append(
125
- "Please install Docker or Podman to continue.\n", style="dim"
126
- )
125
+ status_text.append("WARNING: No container runtime available\n", style="bold red")
126
+ status_text.append("Please install Docker or Podman to continue.\n", style="dim")
127
127
  return status_text
128
128
 
129
129
  runtime_info = self.container_manager.get_runtime_info()
@@ -150,7 +150,7 @@ class MonitorScreen(Screen):
150
150
  """Initialize the screen when mounted."""
151
151
  await self._refresh_services()
152
152
  # Set up auto-refresh every 5 seconds
153
- self.refresh_timer = self.set_interval(5.0, self._auto_refresh)
153
+ self.refresh_timer = self.set_interval(5.0, self._auto_refresh_services)
154
154
 
155
155
  self._focus_services_table()
156
156
 
@@ -186,9 +186,9 @@ class MonitorScreen(Screen):
186
186
  images_set.add(img)
187
187
  # Ensure compose-declared images are also shown (e.g., langflow when stopped)
188
188
  try:
189
- for img in (
190
- self.container_manager._parse_compose_images()
191
- ): # best-effort, no YAML dep
189
+ for (
190
+ img
191
+ ) in await self.container_manager._parse_compose_images(): # best-effort, no YAML dep
192
192
  if img:
193
193
  images_set.add(img)
194
194
  except Exception:
@@ -205,7 +205,7 @@ class MonitorScreen(Screen):
205
205
  self.images_table.clear()
206
206
 
207
207
  # Add container service rows
208
- for service_name, service_info in services.items():
208
+ for _service_name, service_info in services.items():
209
209
  status_style = self._get_status_style(service_info.status)
210
210
 
211
211
  self.services_table.add_row(
@@ -238,9 +238,7 @@ class MonitorScreen(Screen):
238
238
  if (docling_running or docling_starting)
239
239
  else "N/A"
240
240
  )
241
- docling_pid = (
242
- str(docling_status.get("pid")) if docling_status.get("pid") else "N/A"
243
- )
241
+ docling_pid = str(docling_status.get("pid")) if docling_status.get("pid") else "N/A"
244
242
 
245
243
  if self.docling_table:
246
244
  self.docling_table.add_row(
@@ -275,7 +273,7 @@ class MonitorScreen(Screen):
275
273
  }
276
274
  return status_styles.get(status, "white")
277
275
 
278
- async def _auto_refresh(self) -> None:
276
+ async def _auto_refresh_services(self) -> None:
279
277
  """Auto-refresh services if not in operation."""
280
278
  if not self.operation_in_progress:
281
279
  await self._refresh_services()
@@ -283,7 +281,6 @@ class MonitorScreen(Screen):
283
281
  def on_button_pressed(self, event: Button.Pressed) -> None:
284
282
  """Handle button presses."""
285
283
  button_id = event.button.id or ""
286
- button_label = event.button.label or ""
287
284
 
288
285
  # Use button ID prefixes to determine action, ignoring any random suffix
289
286
  if button_id.startswith("start-btn"):
@@ -328,7 +325,7 @@ class MonitorScreen(Screen):
328
325
  self.run_worker(self._show_logs(service_name))
329
326
  self._start_follow(service_name)
330
327
 
331
- async def _start_services(self, cpu_mode: Optional[bool] = None) -> None:
328
+ async def _start_services(self, cpu_mode: bool | None = None) -> None:
332
329
  """Start services with progress updates."""
333
330
  self.operation_in_progress = True
334
331
  try:
@@ -365,6 +362,7 @@ class MonitorScreen(Screen):
365
362
  # This ensures docker compose reads the correct version
366
363
  try:
367
364
  from ..managers.env_manager import EnvManager
365
+
368
366
  env_manager = EnvManager()
369
367
  env_manager.ensure_openrag_version()
370
368
  # Small delay to ensure .env file is written and flushed
@@ -433,7 +431,7 @@ class MonitorScreen(Screen):
433
431
  # Show "this is the latest version" toast
434
432
  self.notify(
435
433
  f"You are running the latest version ({current_version}).",
436
- severity="success",
434
+ severity="information",
437
435
  timeout=5,
438
436
  )
439
437
  else:
@@ -442,9 +440,7 @@ class MonitorScreen(Screen):
442
440
  UpgradeInstructionsModal(current_version, latest_version)
443
441
  )
444
442
  except Exception as e:
445
- self.notify(
446
- f"Error checking version: {str(e)}", severity="error", timeout=10
447
- )
443
+ self.notify(f"Error checking version: {str(e)}", severity="error", timeout=10)
448
444
  finally:
449
445
  self.operation_in_progress = False
450
446
 
@@ -453,9 +449,7 @@ class MonitorScreen(Screen):
453
449
  self.operation_in_progress = True
454
450
  try:
455
451
  # Show factory reset warning modal first
456
- should_continue = await self.app.push_screen_wait(
457
- FactoryResetWarningModal()
458
- )
452
+ should_continue = await self.app.push_screen_wait(FactoryResetWarningModal())
459
453
  if not should_continue:
460
454
  self.notify("Factory reset cancelled", severity="information")
461
455
  return
@@ -475,6 +469,7 @@ class MonitorScreen(Screen):
475
469
  try:
476
470
  # Get paths from env config
477
471
  from ..managers.env_manager import EnvManager
472
+
478
473
  env_manager = EnvManager()
479
474
  env_manager.load_existing_env()
480
475
 
@@ -487,7 +482,9 @@ class MonitorScreen(Screen):
487
482
 
488
483
  if config_path.exists():
489
484
  # Use container to handle files owned by container user
490
- success, msg = await self.container_manager.clear_directory_with_container(config_path)
485
+ success, msg = await self.container_manager.clear_directory_with_container(
486
+ config_path
487
+ )
491
488
  if not success:
492
489
  # Fallback to regular rmtree if container method fails
493
490
  shutil.rmtree(config_path)
@@ -497,18 +494,32 @@ class MonitorScreen(Screen):
497
494
  # Also delete legacy TUI config folder if it exists (~/.openrag/tui/config/)
498
495
  tui_config_path = expand_path(env_manager.config.openrag_tui_config_path_legacy)
499
496
  if tui_config_path.exists():
500
- success, msg = await self.container_manager.clear_directory_with_container(tui_config_path)
497
+ success, msg = await self.container_manager.clear_directory_with_container(
498
+ tui_config_path
499
+ )
501
500
  if not success:
502
501
  # Fallback to regular rmtree if container method fails
503
502
  shutil.rmtree(tui_config_path)
504
503
  # Recreate empty config directory
505
504
  tui_config_path.mkdir(parents=True, exist_ok=True)
506
505
 
506
+ # Clear backend data directory (database, session ownership, conversations, oauth tokens)
507
+ data_path = expand_path(env_manager.config.openrag_data_path)
508
+ if data_path.exists():
509
+ success, msg = await self.container_manager.clear_directory_with_container(
510
+ data_path
511
+ )
512
+ if not success:
513
+ shutil.rmtree(data_path)
514
+ data_path.mkdir(parents=True, exist_ok=True)
515
+
507
516
  # Delete flow backups only if user chose to (and they actually exist)
508
517
  if self._check_flow_backups():
509
518
  if delete_backups:
510
519
  # Use container to handle files owned by container user
511
- success, msg = await self.container_manager.clear_directory_with_container(flows_backup_path)
520
+ success, msg = await self.container_manager.clear_directory_with_container(
521
+ flows_backup_path
522
+ )
512
523
  if not success:
513
524
  # Fallback to regular rmtree if container method fails
514
525
  shutil.rmtree(flows_backup_path)
@@ -516,8 +527,10 @@ class MonitorScreen(Screen):
516
527
  flows_backup_path.mkdir(parents=True, exist_ok=True)
517
528
  self.notify("Flow backups deleted", severity="information")
518
529
  else:
519
- self.notify(f"Flow backups preserved in {flows_backup_path}", severity="information")
520
-
530
+ self.notify(
531
+ f"Flow backups preserved in {flows_backup_path}", severity="information"
532
+ )
533
+
521
534
  except Exception as e:
522
535
  self.notify(
523
536
  f"Error clearing config: {str(e)}",
@@ -548,12 +561,14 @@ class MonitorScreen(Screen):
548
561
 
549
562
  # Get data paths from env config
550
563
  from ..managers.env_manager import EnvManager
564
+
551
565
  env_manager = EnvManager()
552
566
  env_manager.load_existing_env()
553
567
 
554
568
  # Delete langflow-data directory (mirrors Makefile factory-reset behaviour)
555
569
  yield False, "Clearing Langflow data..."
556
570
  from tui.main import _resolve_langflow_data_path
571
+
557
572
  langflow_data_path = _resolve_langflow_data_path(Path.home() / ".openrag").resolve()
558
573
  home = Path.home().resolve()
559
574
  if not str(langflow_data_path).startswith(str(home) + "/"):
@@ -575,13 +590,13 @@ class MonitorScreen(Screen):
575
590
  try:
576
591
  # Show prune options modal
577
592
  from tui.widgets.prune_options_modal import PruneOptionsModal
578
-
593
+
579
594
  prune_choice = await self.app.push_screen_wait(PruneOptionsModal())
580
-
595
+
581
596
  if prune_choice == "cancel":
582
597
  self.notify("Prune cancelled", severity="information")
583
598
  return
584
-
599
+
585
600
  # Choose the appropriate pruning method based on user choice
586
601
  if prune_choice == "all":
587
602
  # Stop services and prune all images
@@ -591,7 +606,7 @@ class MonitorScreen(Screen):
591
606
  # Prune only unused images (default)
592
607
  command_generator = self.container_manager.prune_old_images()
593
608
  modal_title = "Pruning Unused Images"
594
-
609
+
595
610
  # Show command output in modal dialog
596
611
  modal = CommandOutputModal(
597
612
  modal_title,
@@ -605,12 +620,15 @@ class MonitorScreen(Screen):
605
620
  def _check_flow_backups(self) -> bool:
606
621
  """Check if there are any flow backups in flows/backup directory."""
607
622
  from pathlib import Path
623
+
608
624
  from ..managers.env_manager import EnvManager
609
625
 
610
626
  # Get flows path from env config
611
627
  env_manager = EnvManager()
612
628
  env_manager.load_existing_env()
613
- flows_path = Path(env_manager.config.openrag_flows_path.replace("$HOME", str(Path.home()))).expanduser()
629
+ flows_path = Path(
630
+ env_manager.config.openrag_flows_path.replace("$HOME", str(Path.home()))
631
+ ).expanduser()
614
632
  backup_dir = flows_path / "backup"
615
633
  if not backup_dir.exists():
616
634
  return False
@@ -651,9 +669,7 @@ class MonitorScreen(Screen):
651
669
  if success:
652
670
  self.notify(message, severity="information")
653
671
  else:
654
- self.notify(
655
- f"Failed to start docling serve: {message}", severity="error"
656
- )
672
+ self.notify(f"Failed to start docling serve: {message}", severity="error")
657
673
  # Refresh again to show final status (running or stopped)
658
674
  await self._refresh_services()
659
675
  except Exception as e:
@@ -671,9 +687,7 @@ class MonitorScreen(Screen):
671
687
  if success:
672
688
  self.notify(message, severity="information")
673
689
  else:
674
- self.notify(
675
- f"Failed to stop docling serve: {message}", severity="error"
676
- )
690
+ self.notify(f"Failed to stop docling serve: {message}", severity="error")
677
691
  # Refresh the services table to show updated status
678
692
  await self._refresh_services()
679
693
  except Exception as e:
@@ -689,9 +703,7 @@ class MonitorScreen(Screen):
689
703
  if success:
690
704
  self.notify(message, severity="information")
691
705
  else:
692
- self.notify(
693
- f"Failed to restart docling serve: {message}", severity="error"
694
- )
706
+ self.notify(f"Failed to restart docling serve: {message}", severity="error")
695
707
  # Refresh the services table to show updated status
696
708
  await self._refresh_services()
697
709
  except Exception as e:
@@ -780,9 +792,7 @@ class MonitorScreen(Screen):
780
792
  except Exception:
781
793
  pass
782
794
  except Exception as e:
783
- notify_with_diagnostics(
784
- self.app, f"Error following logs: {e}", severity="error"
785
- )
795
+ notify_with_diagnostics(self.app, f"Error following logs: {e}", severity="error")
786
796
 
787
797
  def action_refresh(self) -> None:
788
798
  """Refresh services manually."""
@@ -861,9 +871,7 @@ class MonitorScreen(Screen):
861
871
  self._update_mode_row()
862
872
  self.action_refresh()
863
873
  except Exception as e:
864
- notify_with_diagnostics(
865
- self.app, f"Failed to toggle mode: {e}", severity="error"
866
- )
874
+ notify_with_diagnostics(self.app, f"Failed to toggle mode: {e}", severity="error")
867
875
 
868
876
  def _update_controls(self, services: list[ServiceInfo]) -> None:
869
877
  """Update control buttons based on running state."""
@@ -886,31 +894,19 @@ class MonitorScreen(Screen):
886
894
  # Add appropriate buttons based on service state
887
895
  if any_running:
888
896
  # When services are running, show stop and restart
889
- controls.mount(
890
- Button("Stop Services", variant="error", id=f"stop-btn{suffix}")
891
- )
892
- controls.mount(
893
- Button("Restart", variant="primary", id=f"restart-btn{suffix}")
894
- )
897
+ controls.mount(Button("Stop Services", variant="error", id=f"stop-btn{suffix}"))
898
+ controls.mount(Button("Restart", variant="primary", id=f"restart-btn{suffix}"))
895
899
  else:
896
900
  # When services are not running, show start
897
- controls.mount(
898
- Button("Start Services", variant="success", id=f"start-btn{suffix}")
899
- )
901
+ controls.mount(Button("Start Services", variant="success", id=f"start-btn{suffix}"))
900
902
 
901
903
  # Always show upgrade, prune, and reset buttons
902
- controls.mount(
903
- Button("Upgrade", variant="warning", id=f"upgrade-btn{suffix}")
904
- )
905
- controls.mount(
906
- Button("Prune Images", variant="default", id=f"prune-btn{suffix}")
907
- )
904
+ controls.mount(Button("Upgrade", variant="warning", id=f"upgrade-btn{suffix}"))
905
+ controls.mount(Button("Prune Images", variant="default", id=f"prune-btn{suffix}"))
908
906
  controls.mount(Button("Factory Reset", variant="error", id=f"reset-btn{suffix}"))
909
907
 
910
908
  except Exception as e:
911
- notify_with_diagnostics(
912
- self.app, f"Error updating controls: {e}", severity="error"
913
- )
909
+ notify_with_diagnostics(self.app, f"Error updating controls: {e}", severity="error")
914
910
 
915
911
  # Update docling controls separately
916
912
  self._update_docling_controls()
@@ -940,9 +936,7 @@ class MonitorScreen(Screen):
940
936
  Button("Stop", variant="error", id=f"docling-stop-btn{suffix}")
941
937
  )
942
938
  docling_controls.mount(
943
- Button(
944
- "Restart", variant="primary", id=f"docling-restart-btn{suffix}"
945
- )
939
+ Button("Restart", variant="primary", id=f"docling-restart-btn{suffix}")
946
940
  )
947
941
  elif docling_starting:
948
942
  # Show disabled button or no button when starting
@@ -1102,7 +1096,7 @@ class MonitorScreen(Screen):
1102
1096
  return
1103
1097
 
1104
1098
  try:
1105
- table.cursor_coordinate = (row, 0)
1099
+ table.cursor_coordinate = Coordinate(row, 0)
1106
1100
  except Exception:
1107
1101
  move_cursor = getattr(table, "move_cursor", None)
1108
1102
  if callable(move_cursor):
@@ -1111,9 +1105,7 @@ class MonitorScreen(Screen):
1111
1105
  except Exception:
1112
1106
  pass
1113
1107
 
1114
- def _focus_services_table(
1115
- self, row: str | None = None, set_last: bool = True
1116
- ) -> None:
1108
+ def _focus_services_table(self, row: str | None = None, set_last: bool = True) -> None:
1117
1109
  """Focus the services table and update selection."""
1118
1110
  if not self.services_table:
1119
1111
  return
File without changes
File without changes
File without changes
File without changes
File without changes