openrag 0.4.1.dev2__tar.gz → 0.4.1.dev4__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 (164) hide show
  1. {openrag-0.4.1.dev2/src/openrag.egg-info → openrag-0.4.1.dev4}/PKG-INFO +1 -1
  2. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/pyproject.toml +1 -1
  3. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4/src/openrag.egg-info}/PKG-INFO +1 -1
  4. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/utils/startup_checks.py +86 -19
  5. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/LICENSE +0 -0
  6. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/MANIFEST.in +0 -0
  7. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/README.md +0 -0
  8. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/setup.cfg +0 -0
  9. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/agent.py +0 -0
  10. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/__init__.py +0 -0
  11. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/auth.py +0 -0
  12. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/chat.py +0 -0
  13. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/connector_router.py +0 -0
  14. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/connectors.py +0 -0
  15. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/docling.py +0 -0
  16. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/documents.py +0 -0
  17. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/flows.py +0 -0
  18. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/keys.py +0 -0
  19. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/knowledge_filter.py +0 -0
  20. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/langflow_files.py +0 -0
  21. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/models.py +0 -0
  22. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/nudges.py +0 -0
  23. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/oidc.py +0 -0
  24. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/provider_health.py +0 -0
  25. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/provider_validation.py +0 -0
  26. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/router.py +0 -0
  27. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/search.py +0 -0
  28. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/settings.py +0 -0
  29. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/tasks.py +0 -0
  30. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/upload.py +0 -0
  31. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/v1/__init__.py +0 -0
  32. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/v1/chat.py +0 -0
  33. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/v1/documents.py +0 -0
  34. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/v1/knowledge_filters.py +0 -0
  35. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/v1/models.py +0 -0
  36. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/v1/search.py +0 -0
  37. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/api/v1/settings.py +0 -0
  38. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/auth_context.py +0 -0
  39. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/config/__init__.py +0 -0
  40. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/config/config_manager.py +0 -0
  41. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/config/model_constants.py +0 -0
  42. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/config/settings.py +0 -0
  43. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/__init__.py +0 -0
  44. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/aws_s3/__init__.py +0 -0
  45. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/aws_s3/api.py +0 -0
  46. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/aws_s3/auth.py +0 -0
  47. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/aws_s3/connector.py +0 -0
  48. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/aws_s3/models.py +0 -0
  49. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/aws_s3/support.py +0 -0
  50. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/base.py +0 -0
  51. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/connection_manager.py +0 -0
  52. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/google_drive/__init__.py +0 -0
  53. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/google_drive/connector.py +0 -0
  54. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/google_drive/oauth.py +0 -0
  55. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/ibm_cos/__init__.py +0 -0
  56. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/ibm_cos/api.py +0 -0
  57. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/ibm_cos/auth.py +0 -0
  58. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/ibm_cos/connector.py +0 -0
  59. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/ibm_cos/models.py +0 -0
  60. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/ibm_cos/support.py +0 -0
  61. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/langflow_connector_service.py +0 -0
  62. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/onedrive/__init__.py +0 -0
  63. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/onedrive/connector.py +0 -0
  64. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/onedrive/oauth.py +0 -0
  65. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/service.py +0 -0
  66. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/sharepoint/__init__.py +0 -0
  67. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/sharepoint/connector.py +0 -0
  68. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/sharepoint/oauth.py +0 -0
  69. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/connectors/sharepoint/utils.py +0 -0
  70. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/dependencies.py +0 -0
  71. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/main.py +0 -0
  72. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/models/__init__.py +0 -0
  73. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/models/processors.py +0 -0
  74. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/models/tasks.py +0 -0
  75. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/models/url.py +0 -0
  76. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/openrag.egg-info/SOURCES.txt +0 -0
  77. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/openrag.egg-info/dependency_links.txt +0 -0
  78. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/openrag.egg-info/entry_points.txt +0 -0
  79. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/openrag.egg-info/requires.txt +0 -0
  80. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/openrag.egg-info/top_level.txt +0 -0
  81. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/__init__.py +0 -0
  82. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/api_key_service.py +0 -0
  83. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/auth_service.py +0 -0
  84. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/chat_service.py +0 -0
  85. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/conversation_persistence_service.py +0 -0
  86. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/document_service.py +0 -0
  87. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/flows_service.py +0 -0
  88. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/knowledge_filter_service.py +0 -0
  89. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/langflow_file_service.py +0 -0
  90. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/langflow_history_service.py +0 -0
  91. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/langflow_mcp_service.py +0 -0
  92. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/models_service.py +0 -0
  93. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/monitor_service.py +0 -0
  94. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/search_service.py +0 -0
  95. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/session_ownership_service.py +0 -0
  96. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/services/task_service.py +0 -0
  97. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/session_manager.py +0 -0
  98. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/__init__.py +0 -0
  99. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/docker-compose.gpu.yml +0 -0
  100. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/docker-compose.yml +0 -0
  101. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/components/ollama_embedding.json +0 -0
  102. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/components/ollama_llm.json +0 -0
  103. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/components/ollama_llm_text.json +0 -0
  104. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/components/watsonx_embedding.json +0 -0
  105. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/components/watsonx_llm.json +0 -0
  106. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/components/watsonx_llm_text.json +0 -0
  107. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/ingestion_flow.json +0 -0
  108. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/openrag_agent.json +0 -0
  109. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/openrag_nudges.json +0 -0
  110. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/flows/openrag_url_mcp.json +0 -0
  111. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/openrag-documents/docling.pdf +0 -0
  112. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/openrag-documents/ibm_anthropic.pdf +0 -0
  113. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/openrag-documents/openrag-documentation.pdf +0 -0
  114. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/_assets/openrag-documents/warmup_ocr.pdf +0 -0
  115. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/cli.py +0 -0
  116. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/config_fields.py +0 -0
  117. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/main.py +0 -0
  118. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/managers/__init__.py +0 -0
  119. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/managers/container_manager.py +0 -0
  120. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/managers/docling_manager.py +0 -0
  121. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/managers/env_manager.py +0 -0
  122. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/screens/__init__.py +0 -0
  123. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/screens/config.py +0 -0
  124. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/screens/diagnostics.py +0 -0
  125. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/screens/logs.py +0 -0
  126. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/screens/monitor.py +0 -0
  127. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/screens/welcome.py +0 -0
  128. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/utils/__init__.py +0 -0
  129. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/utils/clipboard.py +0 -0
  130. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/utils/platform.py +0 -0
  131. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/utils/validation.py +0 -0
  132. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/utils/version_check.py +0 -0
  133. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/__init__.py +0 -0
  134. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/command_modal.py +0 -0
  135. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/diagnostics_notification.py +0 -0
  136. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/error_notification.py +0 -0
  137. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/factory_reset_warning_modal.py +0 -0
  138. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/flow_backup_warning_modal.py +0 -0
  139. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/prune_options_modal.py +0 -0
  140. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/upgrade_instructions_modal.py +0 -0
  141. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/version_mismatch_warning_modal.py +0 -0
  142. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/tui/widgets/waves.py +0 -0
  143. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/__init__.py +0 -0
  144. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/acl_utils.py +0 -0
  145. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/container_utils.py +0 -0
  146. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/docling_client.py +0 -0
  147. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/document_processing.py +0 -0
  148. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/embedding_fields.py +0 -0
  149. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/embeddings.py +0 -0
  150. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/env_utils.py +0 -0
  151. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/file_utils.py +0 -0
  152. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/gpu_detection.py +0 -0
  153. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/hash_utils.py +0 -0
  154. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/langflow_headers.py +0 -0
  155. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/langflow_utils.py +0 -0
  156. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/logging_config.py +0 -0
  157. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/opensearch_queries.py +0 -0
  158. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/opensearch_utils.py +0 -0
  159. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/paths.py +0 -0
  160. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/telemetry/__init__.py +0 -0
  161. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/telemetry/category.py +0 -0
  162. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/telemetry/client.py +0 -0
  163. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/telemetry/message_id.py +0 -0
  164. {openrag-0.4.1.dev2 → openrag-0.4.1.dev4}/src/utils/version_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrag
3
- Version: 0.4.1.dev2
3
+ Version: 0.4.1.dev4
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.4.1.dev2"
7
+ version = "0.4.1.dev4"
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.4.1.dev2
3
+ Version: 0.4.1.dev4
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
@@ -78,7 +78,7 @@ def get_platform() -> str:
78
78
  with open("/proc/version", "r") as f:
79
79
  if "microsoft" in f.read().lower():
80
80
  return "WSL"
81
- except:
81
+ except Exception:
82
82
  pass
83
83
  return "Linux"
84
84
  elif system == "Windows":
@@ -175,7 +175,7 @@ def docker_daemon_ready() -> bool:
175
175
  ["docker", "info"], capture_output=True, text=True, timeout=10
176
176
  )
177
177
  return result.returncode == 0
178
- except:
178
+ except Exception:
179
179
  return False
180
180
 
181
181
 
@@ -186,12 +186,12 @@ def podman_ready() -> bool:
186
186
  ["podman", "info"], capture_output=True, text=True, timeout=10
187
187
  )
188
188
  return result.returncode == 0
189
- except:
189
+ except Exception:
190
190
  return False
191
191
 
192
192
 
193
193
  def compose_available() -> bool:
194
- """Check if docker compose or docker-compose is available."""
194
+ """Check if docker compose (v2) or docker-compose (v1) is available."""
195
195
  # Try docker compose (v2)
196
196
  try:
197
197
  result = subprocess.run(
@@ -199,10 +199,12 @@ def compose_available() -> bool:
199
199
  )
200
200
  if result.returncode == 0:
201
201
  return True
202
- except:
202
+ except Exception:
203
203
  pass
204
204
  # Try docker-compose (v1)
205
- return has_cmd("docker-compose")
205
+ if has_cmd("docker-compose"):
206
+ return True
207
+ return False
206
208
 
207
209
 
208
210
  # =============================================================================
@@ -271,7 +273,7 @@ def install_podman() -> bool:
271
273
  elif has_cmd("yum"):
272
274
  subprocess.run(["sudo", "yum", "install", "-y", "podman"], check=True)
273
275
  elif has_cmd("pacman"):
274
- subprocess.run(["sudo", "pacman", "-Sy", "--noconfirm", "podman"], check=True)
276
+ subprocess.run(["sudo", "pacman", "-Syu", "--noconfirm", "podman"], check=True)
275
277
  else:
276
278
  say("Unknown package manager. Please install podman manually.")
277
279
  return False
@@ -283,6 +285,69 @@ def install_podman() -> bool:
283
285
  return False
284
286
 
285
287
 
288
+ def install_podman_compose() -> bool:
289
+ """Install podman-compose standalone binary (provides required dependencies).
290
+
291
+ Installs even if 'podman compose' built-in is available, because the
292
+ standalone package ships dependencies that some environments need.
293
+ Returns True if successful or already installed.
294
+ """
295
+ if has_cmd("podman-compose"):
296
+ say(f"podman-compose already installed: {shutil.which('podman-compose')}")
297
+ return True
298
+
299
+ say("podman-compose not found.")
300
+ if not ask_yes_no("Install podman-compose?"):
301
+ return False
302
+
303
+ plat = get_platform()
304
+
305
+ if plat == "macOS":
306
+ if not install_homebrew():
307
+ say("Cannot install podman-compose without Homebrew.")
308
+ return False
309
+ say("Installing podman-compose via Homebrew...")
310
+ try:
311
+ subprocess.run(["brew", "install", "podman-compose"], check=True)
312
+ return True
313
+ except Exception as e:
314
+ say(f"Failed: {e}")
315
+ return False
316
+
317
+ elif plat in ("Linux", "WSL"):
318
+ say("Installing podman-compose (may prompt for sudo password)...")
319
+ # Prefer pip3 as it always has the latest version
320
+ if has_cmd("pip3"):
321
+ try:
322
+ subprocess.run(["pip3", "install", "--user", "podman-compose"], check=True)
323
+ local_bin = str(Path.home() / ".local" / "bin")
324
+ if local_bin not in os.environ.get("PATH", ""):
325
+ os.environ["PATH"] = f"{local_bin}:{os.environ['PATH']}"
326
+ return True
327
+ except Exception as e:
328
+ say(f"pip3 install failed ({e}), trying package manager...")
329
+ try:
330
+ if has_cmd("apt-get"):
331
+ subprocess.run(["sudo", "apt-get", "update", "-y"], check=True)
332
+ subprocess.run(["sudo", "apt-get", "install", "-y", "podman-compose"], check=True)
333
+ elif has_cmd("dnf"):
334
+ subprocess.run(["sudo", "dnf", "install", "-y", "podman-compose"], check=True)
335
+ elif has_cmd("yum"):
336
+ subprocess.run(["sudo", "yum", "install", "-y", "podman-compose"], check=True)
337
+ elif has_cmd("pacman"):
338
+ subprocess.run(["sudo", "pacman", "-Syu", "--noconfirm", "podman-compose"], check=True)
339
+ else:
340
+ say("Unknown package manager. Please install podman-compose manually.")
341
+ return False
342
+ return True
343
+ except Exception as e:
344
+ say(f"Failed: {e}")
345
+ return False
346
+
347
+ say("Unsupported platform. Please install podman-compose manually.")
348
+ return False
349
+
350
+
286
351
  def install_docker_linux() -> bool:
287
352
  """Install Docker Engine on Linux (not Docker Desktop). Returns True if successful."""
288
353
  if has_cmd("docker"):
@@ -304,7 +369,7 @@ def install_docker_linux() -> bool:
304
369
  try:
305
370
  subprocess.run(["sudo", "usermod", "-aG", "docker", os.environ["USER"]], check=True)
306
371
  say("Added user to docker group. You may need to log out and back in.")
307
- except:
372
+ except Exception:
308
373
  pass
309
374
  return True
310
375
  except Exception as e:
@@ -358,7 +423,7 @@ def setup_podman_machine() -> bool:
358
423
  capture_output=True, text=True, timeout=10
359
424
  )
360
425
  machine_exists = bool(result.stdout.strip())
361
- except:
426
+ except Exception:
362
427
  machine_exists = False
363
428
 
364
429
  if not machine_exists:
@@ -413,14 +478,14 @@ def check_podman_machine_memory() -> Tuple[bool, int]:
413
478
  if result.returncode == 0 and result.stdout.strip():
414
479
  current_mb = int(result.stdout.strip())
415
480
  return current_mb >= MIN_PODMAN_MEMORY_MB, current_mb
416
- except:
481
+ except Exception:
417
482
  pass
418
483
  return True, 0
419
484
 
420
485
 
421
486
  def fix_podman_memory(version: str) -> bool:
422
487
  """Recreate Podman machine with more memory."""
423
- say(f"Podman machine has insufficient memory.")
488
+ say("Podman machine has insufficient memory.")
424
489
  if not ask_yes_no(f"Recreate machine with {MIN_PODMAN_MEMORY_MB}MB? (WARNING: deletes containers/images)"):
425
490
  return False
426
491
 
@@ -491,7 +556,7 @@ def check_storage_corruption(runtime: str) -> Tuple[bool, Optional[str]]:
491
556
  for pattern in corruption_patterns:
492
557
  if re.search(pattern, stderr, re.IGNORECASE):
493
558
  return True, stderr
494
- except:
559
+ except Exception:
495
560
  pass
496
561
  return False, None
497
562
 
@@ -641,7 +706,7 @@ def run_startup_checks() -> bool:
641
706
  match = re.search(r'(\d+\.\d+\.\d+)', result.stdout)
642
707
  if match:
643
708
  runtime_version = match.group(1)
644
- except:
709
+ except Exception:
645
710
  pass
646
711
 
647
712
  say(f"Using {runtime}" + (f" {runtime_version}" if runtime_version else ""))
@@ -672,14 +737,16 @@ def run_startup_checks() -> bool:
672
737
  # User declined fix, but continue anyway
673
738
  pass
674
739
 
675
- # 6. Check compose
676
- if not compose_available():
740
+ # 6. Check / install compose
741
+ if runtime == "podman":
742
+ # Always ensure the standalone podman-compose binary is present —
743
+ # it installs required dependencies even when the built-in subcommand exists.
744
+ if not install_podman_compose() and not compose_available():
745
+ say("Warning: No compose tool found. OpenRAG will fail to start.")
746
+ elif not compose_available():
677
747
  say("Docker Compose not found.")
678
748
  say("OpenRAG requires docker-compose or 'docker compose'.")
679
- if runtime == "podman":
680
- say("Podman typically includes compose. Try: podman compose version")
681
- else:
682
- say("Install docker-compose-plugin via your package manager.")
749
+ say("Install docker-compose-plugin via your package manager.")
683
750
 
684
751
  print("-" * 40)
685
752
  say("Prerequisites check complete.")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes