diff --git a/frontend/src/components/layout-wrapper.tsx b/frontend/src/components/layout-wrapper.tsx
index 5c2f0e13..5b598eb9 100644
--- a/frontend/src/components/layout-wrapper.tsx
+++ b/frontend/src/components/layout-wrapper.tsx
@@ -16,6 +16,9 @@ import { useKnowledgeFilter } from "@/contexts/knowledge-filter-context";
// import { GitHubStarButton } from "@/components/github-star-button"
// import { DiscordLink } from "@/components/discord-link"
import { useTask } from "@/contexts/task-context";
+import { DoclingHealthBanner } from "@/components/docling-health-banner";
+import { useDoclingHealthQuery } from "@/src/app/api/queries/useDoclingHealthQuery";
+import { LayoutProvider } from "@/contexts/layout-context";
export function LayoutWrapper({ children }: { children: React.ReactNode }) {
const pathname = usePathname();
@@ -31,6 +34,7 @@ export function LayoutWrapper({ children }: { children: React.ReactNode }) {
const { isLoading: isSettingsLoading, data: settings } = useGetSettingsQuery({
enabled: isAuthenticated || isNoAuthMode,
});
+ const { data: health, isLoading: isHealthLoading, isError } = useDoclingHealthQuery();
// Only fetch conversations on chat page
const isOnChatPage = pathname === "/" || pathname === "/chat";
@@ -56,6 +60,15 @@ export function LayoutWrapper({ children }: { children: React.ReactNode }) {
task.status === "processing",
);
+ const isUnhealthy = health?.status === "unhealthy" || isError;
+ const isBannerVisible = !isHealthLoading && isUnhealthy;
+
+ // Dynamic height calculations based on banner visibility
+ const headerHeight = 53;
+ const bannerHeight = 52; // Approximate banner height
+ const totalTopOffset = isBannerVisible ? headerHeight + bannerHeight : headerHeight;
+ const mainContentHeight = `calc(100vh - ${totalTopOffset}px)`;
+
// Show loading state when backend isn't ready
if (isLoading || isSettingsLoading) {
return (
@@ -76,6 +89,7 @@ export function LayoutWrapper({ children }: { children: React.ReactNode }) {
// For all other pages, render with Langflow-styled navigation and task menu
return (
+
{/* Logo/Title */}
@@ -118,7 +132,10 @@ export function LayoutWrapper({ children }: { children: React.ReactNode }) {
-
+
- {children}
+
+ {children}
+
diff --git a/frontend/src/contexts/layout-context.tsx b/frontend/src/contexts/layout-context.tsx
new file mode 100644
index 00000000..f40ea28c
--- /dev/null
+++ b/frontend/src/contexts/layout-context.tsx
@@ -0,0 +1,34 @@
+"use client";
+
+import { createContext, useContext } from "react";
+
+interface LayoutContextType {
+ headerHeight: number;
+ totalTopOffset: number;
+}
+
+const LayoutContext = createContext
(undefined);
+
+export function useLayout() {
+ const context = useContext(LayoutContext);
+ if (context === undefined) {
+ throw new Error("useLayout must be used within a LayoutProvider");
+ }
+ return context;
+}
+
+export function LayoutProvider({
+ children,
+ headerHeight,
+ totalTopOffset
+}: {
+ children: React.ReactNode;
+ headerHeight: number;
+ totalTopOffset: number;
+}) {
+ return (
+
+ {children}
+
+ );
+}
\ No newline at end of file
diff --git a/src/tui/managers/env_manager.py b/src/tui/managers/env_manager.py
index 9954b463..282f73d0 100644
--- a/src/tui/managers/env_manager.py
+++ b/src/tui/managers/env_manager.py
@@ -32,7 +32,7 @@ class EnvConfig:
langflow_superuser: str = "admin"
langflow_superuser_password: str = ""
langflow_chat_flow_id: str = "1098eea1-6649-4e1d-aed1-b77249fb8dd0"
- langflow_ingest_flow_id: str = "5488df7c-b93f-4f87-a446-b67028bc0813"
+ langflow_ingest_flow_id: str = "1402618b-e6d1-4ff2-9a11-d6ce71186915"
# OAuth settings
google_oauth_client_id: str = ""