From 0468740f3e9f99e0d0208ae8a119f93305dcc58c Mon Sep 17 00:00:00 2001 From: phact Date: Thu, 18 Sep 2025 16:03:37 -0400 Subject: [PATCH 01/14] toask on 400 --- frontend/components/knowledge-dropdown.tsx | 11 ++++++ frontend/components/markdown-wrapper.tsx | 43 ++++++++++++++++++++++ frontend/types/jsx.d.ts | 22 +++++++++++ 3 files changed, 76 insertions(+) create mode 100644 frontend/components/markdown-wrapper.tsx create mode 100644 frontend/types/jsx.d.ts diff --git a/frontend/components/knowledge-dropdown.tsx b/frontend/components/knowledge-dropdown.tsx index 82581de8..88c61190 100644 --- a/frontend/components/knowledge-dropdown.tsx +++ b/frontend/components/knowledge-dropdown.tsx @@ -11,6 +11,7 @@ import { } from "lucide-react"; import { useRouter } from "next/navigation"; import { useEffect, useRef, useState } from "react"; +import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Dialog, @@ -294,6 +295,11 @@ export function KnowledgeDropdown({ window.dispatchEvent(new CustomEvent("knowledgeUpdated")); } else { console.error("Folder upload failed:", result.error); + if (response.status === 400) { + toast.error("Upload failed", { + description: result.error || "Bad request", + }); + } } } catch (error) { console.error("Folder upload error:", error); @@ -333,6 +339,11 @@ export function KnowledgeDropdown({ window.dispatchEvent(new CustomEvent("knowledgeUpdated")); } else { console.error("S3 upload failed:", result.error); + if (response.status === 400) { + toast.error("Upload failed", { + description: result.error || "Bad request", + }); + } } } catch (error) { console.error("S3 upload error:", error); diff --git a/frontend/components/markdown-wrapper.tsx b/frontend/components/markdown-wrapper.tsx new file mode 100644 index 00000000..98828f10 --- /dev/null +++ b/frontend/components/markdown-wrapper.tsx @@ -0,0 +1,43 @@ +"use client"; + +import React from "react"; + +// Type-safe wrapper that bypasses react-markdown typing issues +interface MarkdownWrapperProps { + children: string; + remarkPlugins?: any[]; + rehypePlugins?: any[]; + linkTarget?: string; + components?: any; +} + +const MarkdownWrapper: React.FC = ({ + children, + remarkPlugins, + rehypePlugins, + linkTarget, + components +}) => { + const [MarkdownComponent, setMarkdownComponent] = React.useState(null); + + React.useEffect(() => { + // Dynamically import react-markdown at runtime to avoid build-time type issues + import("react-markdown").then((mod) => { + setMarkdownComponent(() => mod.default); + }); + }, []); + + if (!MarkdownComponent) { + return
Loading markdown...
; + } + + return React.createElement(MarkdownComponent, { + remarkPlugins, + rehypePlugins, + linkTarget, + components, + children, + }); +}; + +export default MarkdownWrapper; \ No newline at end of file diff --git a/frontend/types/jsx.d.ts b/frontend/types/jsx.d.ts new file mode 100644 index 00000000..18ff18af --- /dev/null +++ b/frontend/types/jsx.d.ts @@ -0,0 +1,22 @@ +import React from 'react'; + +declare global { + namespace JSX { + interface IntrinsicElements { + [elemName: string]: any; + } + } +} + +declare module 'react-markdown' { + interface ReactMarkdownProps { + children: string; + remarkPlugins?: any[]; + rehypePlugins?: any[]; + linkTarget?: string; + components?: any; + } + + const ReactMarkdown: React.FC; + export default ReactMarkdown; +} \ No newline at end of file From 5c7196437bfa89380d538e8ba7ca9f00b3881c67 Mon Sep 17 00:00:00 2001 From: phact Date: Thu, 18 Sep 2025 16:09:25 -0400 Subject: [PATCH 02/14] fix: oops --- frontend/components/markdown-wrapper.tsx | 43 ------------------------ frontend/types/jsx.d.ts | 22 ------------ 2 files changed, 65 deletions(-) delete mode 100644 frontend/components/markdown-wrapper.tsx delete mode 100644 frontend/types/jsx.d.ts diff --git a/frontend/components/markdown-wrapper.tsx b/frontend/components/markdown-wrapper.tsx deleted file mode 100644 index 98828f10..00000000 --- a/frontend/components/markdown-wrapper.tsx +++ /dev/null @@ -1,43 +0,0 @@ -"use client"; - -import React from "react"; - -// Type-safe wrapper that bypasses react-markdown typing issues -interface MarkdownWrapperProps { - children: string; - remarkPlugins?: any[]; - rehypePlugins?: any[]; - linkTarget?: string; - components?: any; -} - -const MarkdownWrapper: React.FC = ({ - children, - remarkPlugins, - rehypePlugins, - linkTarget, - components -}) => { - const [MarkdownComponent, setMarkdownComponent] = React.useState(null); - - React.useEffect(() => { - // Dynamically import react-markdown at runtime to avoid build-time type issues - import("react-markdown").then((mod) => { - setMarkdownComponent(() => mod.default); - }); - }, []); - - if (!MarkdownComponent) { - return
Loading markdown...
; - } - - return React.createElement(MarkdownComponent, { - remarkPlugins, - rehypePlugins, - linkTarget, - components, - children, - }); -}; - -export default MarkdownWrapper; \ No newline at end of file diff --git a/frontend/types/jsx.d.ts b/frontend/types/jsx.d.ts deleted file mode 100644 index 18ff18af..00000000 --- a/frontend/types/jsx.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -declare global { - namespace JSX { - interface IntrinsicElements { - [elemName: string]: any; - } - } -} - -declare module 'react-markdown' { - interface ReactMarkdownProps { - children: string; - remarkPlugins?: any[]; - rehypePlugins?: any[]; - linkTarget?: string; - components?: any; - } - - const ReactMarkdown: React.FC; - export default ReactMarkdown; -} \ No newline at end of file From bdb477088ce585e6842ca032fd5d38e49ece160f Mon Sep 17 00:00:00 2001 From: phact Date: Thu, 18 Sep 2025 16:12:07 -0400 Subject: [PATCH 03/14] fix: asChild --- frontend/components/knowledge-actions-dropdown.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/components/knowledge-actions-dropdown.tsx b/frontend/components/knowledge-actions-dropdown.tsx index 745e66c5..59d38e47 100644 --- a/frontend/components/knowledge-actions-dropdown.tsx +++ b/frontend/components/knowledge-actions-dropdown.tsx @@ -12,7 +12,7 @@ import { Button } from "./ui/button"; export function KnowledgeActionsDropdown() { return ( - + From dc91f55014794f76def3bbb02e6f2e4d2aeab78c Mon Sep 17 00:00:00 2001 From: phact Date: Thu, 18 Sep 2025 16:27:01 -0400 Subject: [PATCH 04/14] doc processing knobs --- pyproject.toml | 2 +- src/config/settings.py | 5 ++- src/utils/document_processing.py | 74 ++++++++++++++++++++++++++++++-- uv.lock | 2 +- warm_up_docling.py | 12 +++++- 5 files changed, 86 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a2a0e41f..d02bdc0d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrag" -version = "0.1.8" +version = "0.1.9" description = "Add your description here" readme = "README.md" requires-python = ">=3.13" diff --git a/src/config/settings.py b/src/config/settings.py index 715146fb..9a580c76 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -4,12 +4,12 @@ import time import httpx import requests from agentd.patch import patch_openai_with_mcp -from docling.document_converter import DocumentConverter from dotenv import load_dotenv from openai import AsyncOpenAI from opensearchpy import AsyncOpenSearch from opensearchpy._async.http_aiohttp import AIOHttpConnection +from utils.document_processing import create_document_converter from utils.logging_config import get_logger load_dotenv() @@ -45,6 +45,7 @@ LANGFLOW_KEY = os.getenv("LANGFLOW_KEY") SESSION_SECRET = os.getenv("SESSION_SECRET", "your-secret-key-change-in-production") GOOGLE_OAUTH_CLIENT_ID = os.getenv("GOOGLE_OAUTH_CLIENT_ID") GOOGLE_OAUTH_CLIENT_SECRET = os.getenv("GOOGLE_OAUTH_CLIENT_SECRET") +DOCLING_OCR_ENGINE = os.getenv("DOCLING_OCR_ENGINE") # Ingestion configuration DISABLE_INGEST_WITH_LANGFLOW = os.getenv("DISABLE_INGEST_WITH_LANGFLOW", "false").lower() in ("true", "1", "yes") @@ -287,7 +288,7 @@ class AppClients: self.patched_async_client = patch_openai_with_mcp(AsyncOpenAI()) # Initialize document converter - self.converter = DocumentConverter() + self.converter = create_document_converter(ocr_engine=DOCLING_OCR_ENGINE) # Initialize Langflow HTTP client self.langflow_http_client = httpx.AsyncClient( diff --git a/src/utils/document_processing.py b/src/utils/document_processing.py index e46d8f16..a8792e46 100644 --- a/src/utils/document_processing.py +++ b/src/utils/document_processing.py @@ -12,12 +12,80 @@ logger = get_logger(__name__) _worker_converter = None +def create_document_converter(ocr_engine: str | None = None): + """Create a Docling DocumentConverter with OCR disabled unless requested.""" + if ocr_engine is None: + ocr_engine = os.getenv("DOCLING_OCR_ENGINE") + + try: + from docling.document_converter import ( + DocumentConverter, + InputFormat, + PdfFormatOption, + ) + from docling.datamodel.pipeline_options import PdfPipelineOptions + except Exception as exc: # pragma: no cover - fallback path + logger.debug( + "Falling back to default DocumentConverter import", + error=str(exc), + ) + from docling.document_converter import DocumentConverter # type: ignore + + return DocumentConverter() + + pipeline_options = PdfPipelineOptions() + pipeline_options.do_ocr = False + + if ocr_engine: + try: + from docling.models.factories import get_ocr_factory + + factory = get_ocr_factory(allow_external_plugins=False) + pipeline_options.do_ocr = True + pipeline_options.ocr_options = factory.create_options(kind=ocr_engine) + except Exception as exc: # pragma: no cover - optional path + pipeline_options.do_ocr = False + logger.warning( + "Unable to enable requested Docling OCR engine, using OCR-off", + ocr_engine=ocr_engine, + error=str(exc), + ) + + format_options = {} + if hasattr(InputFormat, "PDF"): + format_options[getattr(InputFormat, "PDF")] = PdfFormatOption( + pipeline_options=pipeline_options + ) + if hasattr(InputFormat, "IMAGE"): + format_options[getattr(InputFormat, "IMAGE")] = PdfFormatOption( + pipeline_options=pipeline_options + ) + + try: + converter = DocumentConverter( + format_options=format_options if format_options else None + ) + except Exception as exc: # pragma: no cover - fallback path + logger.warning( + "Docling converter initialization failed, falling back to defaults", + error=str(exc), + ) + converter = DocumentConverter() + + logger.info( + "Docling converter initialized", + ocr_engine=ocr_engine if pipeline_options.do_ocr else None, + ocr_enabled=pipeline_options.do_ocr, + ) + + return converter + + def get_worker_converter(): """Get or create a DocumentConverter instance for this worker process""" global _worker_converter if _worker_converter is None: - from docling.document_converter import DocumentConverter - + # Configure GPU settings for this worker has_gpu_devices, _ = detect_gpu_devices() if not has_gpu_devices: @@ -45,7 +113,7 @@ def get_worker_converter(): logger.info( "Initializing DocumentConverter in worker process", worker_pid=os.getpid() ) - _worker_converter = DocumentConverter() + _worker_converter = create_document_converter() logger.info("DocumentConverter ready in worker process", worker_pid=os.getpid()) return _worker_converter diff --git a/uv.lock b/uv.lock index 0a60fd52..841eb9fd 100644 --- a/uv.lock +++ b/uv.lock @@ -2282,7 +2282,7 @@ wheels = [ [[package]] name = "openrag" -version = "0.1.8" +version = "0.1.9" source = { editable = "." } dependencies = [ { name = "agentd" }, diff --git a/warm_up_docling.py b/warm_up_docling.py index c605bef5..3a834e2f 100644 --- a/warm_up_docling.py +++ b/warm_up_docling.py @@ -1,6 +1,13 @@ import logging +import os +import sys -from docling.document_converter import DocumentConverter +repo_root = os.path.dirname(__file__) +src_path = os.path.join(repo_root, "src") +if src_path not in sys.path: + sys.path.insert(0, src_path) + +from utils.document_processing import create_document_converter logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @@ -11,7 +18,8 @@ try: # Use the sample document to warm up docling test_file = "/app/warmup_ocr.pdf" logger.info(f"Using test file to warm up docling: {test_file}") - DocumentConverter().convert(test_file) + converter = create_document_converter() + converter.convert(test_file) logger.info("Docling models warmed up successfully") except Exception as e: logger.info(f"Docling warm-up completed with exception: {str(e)}") From f81bff1043d59a2b4592435c19931cec4a98899a Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 11:22:01 -0400 Subject: [PATCH 05/14] task tracking running jobs --- .../src/components/task-notification-menu.tsx | 17 ++++++++++++-- src/services/task_service.py | 23 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/task-notification-menu.tsx b/frontend/src/components/task-notification-menu.tsx index c6f94959..0be471be 100644 --- a/frontend/src/components/task-notification-menu.tsx +++ b/frontend/src/components/task-notification-menu.tsx @@ -60,7 +60,9 @@ export function TaskNotificationMenu() { const processed = task.processed_files || 0 const successful = task.successful_files || 0 const failed = task.failed_files || 0 - + const running = task.running_files || 0 + const pending = task.pending_files || 0 + if (total > 0) { return { basic: `${processed}/${total} files`, @@ -69,6 +71,8 @@ export function TaskNotificationMenu() { processed, successful, failed, + running, + pending, remaining: total - processed } } @@ -196,10 +200,16 @@ export function TaskNotificationMenu() { {formatTaskProgress(task)?.detailed.failed} failed +
+
+ + {formatTaskProgress(task)?.detailed.running} running + +
- {formatTaskProgress(task)?.detailed.remaining} pending + {formatTaskProgress(task)?.detailed.pending} pending
@@ -288,6 +298,9 @@ export function TaskNotificationMenu() {
{formatTaskProgress(task)?.detailed.successful} success, {' '} {formatTaskProgress(task)?.detailed.failed} failed + {formatTaskProgress(task)?.detailed.running > 0 && ( + , {formatTaskProgress(task)?.detailed.running} running + )}
)} {task.status === 'failed' && task.error && ( diff --git a/src/services/task_service.py b/src/services/task_service.py index 0341aadf..c9328b90 100644 --- a/src/services/task_service.py +++ b/src/services/task_service.py @@ -220,6 +220,9 @@ class TaskService: return None file_statuses = {} + running_files_count = 0 + pending_files_count = 0 + for file_path, file_task in upload_task.file_tasks.items(): file_statuses[file_path] = { "status": file_task.status.value, @@ -231,6 +234,12 @@ class TaskService: "duration_seconds": file_task.duration_seconds, } + # Count running and pending files + if file_task.status.value == "running": + running_files_count += 1 + elif file_task.status.value == "pending": + pending_files_count += 1 + return { "task_id": upload_task.task_id, "status": upload_task.status.value, @@ -238,6 +247,8 @@ class TaskService: "processed_files": upload_task.processed_files, "successful_files": upload_task.successful_files, "failed_files": upload_task.failed_files, + "running_files": running_files_count, + "pending_files": pending_files_count, "created_at": upload_task.created_at, "updated_at": upload_task.updated_at, "duration_seconds": upload_task.duration_seconds, @@ -259,6 +270,16 @@ class TaskService: for task_id, upload_task in self.task_store[store_user_id].items(): if task_id in tasks_by_id: continue + + # Calculate running and pending counts + running_files_count = 0 + pending_files_count = 0 + for file_task in upload_task.file_tasks.values(): + if file_task.status.value == "running": + running_files_count += 1 + elif file_task.status.value == "pending": + pending_files_count += 1 + tasks_by_id[task_id] = { "task_id": upload_task.task_id, "status": upload_task.status.value, @@ -266,6 +287,8 @@ class TaskService: "processed_files": upload_task.processed_files, "successful_files": upload_task.successful_files, "failed_files": upload_task.failed_files, + "running_files": running_files_count, + "pending_files": pending_files_count, "created_at": upload_task.created_at, "updated_at": upload_task.updated_at, "duration_seconds": upload_task.duration_seconds, From 176038028b06aa95bd7b93fd1736b3d832b0b3cb Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 11:23:17 -0400 Subject: [PATCH 06/14] v0.1.10 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d02bdc0d..c008282d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrag" -version = "0.1.9" +version = "0.1.10" description = "Add your description here" readme = "README.md" requires-python = ">=3.13" From a8d09fbf93324ad2e12bdc23d5bf8dd0116e517c Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 11:24:10 -0400 Subject: [PATCH 07/14] lint fix --- frontend/src/contexts/task-context.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/contexts/task-context.tsx b/frontend/src/contexts/task-context.tsx index c58e1d19..f15e9cc1 100644 --- a/frontend/src/contexts/task-context.tsx +++ b/frontend/src/contexts/task-context.tsx @@ -25,6 +25,8 @@ export interface Task { processed_files?: number; successful_files?: number; failed_files?: number; + running_files?: number; + pending_files?: number; created_at: string; updated_at: string; duration_seconds?: number; From faf35c2a0ed1ce1a65fb7543bee850761fecc26c Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 11:25:17 -0400 Subject: [PATCH 08/14] lint --- frontend/src/components/task-notification-menu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/task-notification-menu.tsx b/frontend/src/components/task-notification-menu.tsx index 0be471be..e17f9579 100644 --- a/frontend/src/components/task-notification-menu.tsx +++ b/frontend/src/components/task-notification-menu.tsx @@ -298,7 +298,7 @@ export function TaskNotificationMenu() {
{formatTaskProgress(task)?.detailed.successful} success, {' '} {formatTaskProgress(task)?.detailed.failed} failed - {formatTaskProgress(task)?.detailed.running > 0 && ( + {(formatTaskProgress(task)?.detailed.running || 0) > 0 && ( , {formatTaskProgress(task)?.detailed.running} running )}
From 4501d24e1e55e682511263ab84f471c48614c9ce Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 11:34:39 -0400 Subject: [PATCH 09/14] switch langflow docker to use main branch --- Dockerfile.langflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.langflow b/Dockerfile.langflow index 99e6e155..f8f57f5c 100644 --- a/Dockerfile.langflow +++ b/Dockerfile.langflow @@ -7,7 +7,7 @@ ENV RUSTFLAGS="--cfg reqwest_unstable" # Accept build arguments for git repository and branch ARG GIT_REPO=https://github.com/langflow-ai/langflow.git -ARG GIT_BRANCH=load_flows_autologin_false +ARG GIT_BRANCH=main WORKDIR /app From 4b58f3564a3a93dab3dec2efa5b39abbc31a2fe2 Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 11:49:34 -0400 Subject: [PATCH 10/14] lint --- frontend/src/app/api/queries/useGetSearchQuery.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/api/queries/useGetSearchQuery.ts b/frontend/src/app/api/queries/useGetSearchQuery.ts index de1daeb6..9928af3d 100644 --- a/frontend/src/app/api/queries/useGetSearchQuery.ts +++ b/frontend/src/app/api/queries/useGetSearchQuery.ts @@ -128,7 +128,7 @@ export const useGetSearchQuery = ( } >(); - data.results.forEach((chunk: ChunkResult) => { + (data.results || []).forEach((chunk: ChunkResult) => { const existing = fileMap.get(chunk.filename); if (existing) { existing.chunks.push(chunk); From 6c66cdc7c8dee51063eefb75c0ddd863445f027a Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 12:00:17 -0400 Subject: [PATCH 11/14] fix: DropdownMenuTrigger asChild --- frontend/components/knowledge-actions-dropdown.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/components/knowledge-actions-dropdown.tsx b/frontend/components/knowledge-actions-dropdown.tsx index f73ffe25..a7cf1337 100644 --- a/frontend/components/knowledge-actions-dropdown.tsx +++ b/frontend/components/knowledge-actions-dropdown.tsx @@ -38,7 +38,7 @@ export const KnowledgeActionsDropdown = ({ return ( <> - + From ab57b26e1fed6b52c7abc8ab89b48bfce64f55b6 Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 12:01:08 -0400 Subject: [PATCH 12/14] 0.1.11 --- pyproject.toml | 2 +- src/api/documents.py | 4 ++-- uv.lock | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c008282d..e093b2c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrag" -version = "0.1.10" +version = "0.1.11" description = "Add your description here" readme = "README.md" requires-python = ">=3.13" diff --git a/src/api/documents.py b/src/api/documents.py index 57a4abb3..82afb349 100644 --- a/src/api/documents.py +++ b/src/api/documents.py @@ -15,8 +15,8 @@ async def delete_documents_by_filename(request: Request, document_service, sessi return JSONResponse({"error": "filename is required"}, status_code=400) user = request.state.user - jwt_token = request.state.jwt_token - + jwt_token = session_manager.get_effective_jwt_token(user.user_id, request.state.jwt_token) + try: # Get user's OpenSearch client opensearch_client = session_manager.get_user_opensearch_client( diff --git a/uv.lock b/uv.lock index 841eb9fd..7a6a6fbc 100644 --- a/uv.lock +++ b/uv.lock @@ -2282,7 +2282,7 @@ wheels = [ [[package]] name = "openrag" -version = "0.1.9" +version = "0.1.11" source = { editable = "." } dependencies = [ { name = "agentd" }, From e80892e4b4e3c125e5facc4907d3a10c03fd095c Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 12:17:46 -0400 Subject: [PATCH 13/14] fix: os add scroll permissions for delete functionality --- securityconfig/roles.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/securityconfig/roles.yml b/securityconfig/roles.yml index 555c069a..07532bfb 100644 --- a/securityconfig/roles.yml +++ b/securityconfig/roles.yml @@ -7,6 +7,8 @@ openrag_user_role: cluster_permissions: - "indices:data/write/bulk" - "indices:data/write/index" + - "indices:data/read/scroll" + - "indices:data/read/scroll/clear" - "cluster:admin/opensearch/notifications/configs/create" - "cluster:admin/opensearch/notifications/configs/list" - "cluster:admin/opensearch/notifications/configs/get" From 2cd286de97f7a6bfc5db5d0e8337e2e43cb09382 Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Sep 2025 12:18:55 -0400 Subject: [PATCH 14/14] v0.1.12 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e093b2c5..ea096d62 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrag" -version = "0.1.11" +version = "0.1.12" description = "Add your description here" readme = "README.md" requires-python = ">=3.13"