diff --git a/admin-compliance/app/(sdk)/sdk/source-policy/page.tsx b/admin-compliance/app/(sdk)/sdk/source-policy/page.tsx index 4efd3a7..04e5bcd 100644 --- a/admin-compliance/app/(sdk)/sdk/source-policy/page.tsx +++ b/admin-compliance/app/(sdk)/sdk/source-policy/page.tsx @@ -3,8 +3,8 @@ /** * Source Policy Management Page (SDK Version) * - * Whitelist-based data source management for edu-search-service. - * For auditors: Full audit trail for all changes. + * Whitelist-based data source management for compliance RAG corpus. + * Controls which legal sources may be used, PII rules, and audit trail. */ import { useState, useEffect } from 'react' @@ -15,14 +15,14 @@ import { OperationsMatrixTab } from '@/components/sdk/source-policy/OperationsMa import { PIIRulesTab } from '@/components/sdk/source-policy/PIIRulesTab' import { AuditTab } from '@/components/sdk/source-policy/AuditTab' -// API base URL for edu-search-service +// API base URL for backend-compliance const getApiBase = () => { - if (typeof window === 'undefined') return 'http://localhost:8088' + if (typeof window === 'undefined') return 'http://localhost:8002/api' const hostname = window.location.hostname if (hostname === 'localhost' || hostname === '127.0.0.1') { - return 'http://localhost:8088' + return 'http://localhost:8002/api' } - return `https://${hostname}:8089` + return `https://${hostname}:8002/api` } interface PolicyStats { diff --git a/admin-compliance/components/sdk/Sidebar/SDKSidebar.tsx b/admin-compliance/components/sdk/Sidebar/SDKSidebar.tsx index 3260c2e..fecd59d 100644 --- a/admin-compliance/components/sdk/Sidebar/SDKSidebar.tsx +++ b/admin-compliance/components/sdk/Sidebar/SDKSidebar.tsx @@ -10,6 +10,7 @@ import { getStepsForPackage, type SDKPackageId, type SDKStep, + type RAGCorpusStatus, } from '@/lib/sdk' // ============================================================================= @@ -288,6 +289,41 @@ interface SDKSidebarProps { onCollapsedChange?: (collapsed: boolean) => void } +// ============================================================================= +// CORPUS STALENESS INFO +// ============================================================================= + +function CorpusStalenessInfo({ ragCorpusStatus }: { ragCorpusStatus: RAGCorpusStatus }) { + const collections = ragCorpusStatus.collections + const collectionNames = Object.keys(collections) + if (collectionNames.length === 0) return null + + // Check if corpus was updated after the last fetch (simplified: show last update time) + const lastUpdated = collectionNames.reduce((latest, name) => { + const updated = new Date(collections[name].last_updated) + return updated > latest ? updated : latest + }, new Date(0)) + + const daysSinceUpdate = Math.floor((Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24)) + const totalChunks = collectionNames.reduce((sum, name) => sum + collections[name].chunks_count, 0) + + return ( +
+
+
30 ? 'bg-amber-400' : 'bg-green-400'}`} /> + + RAG Corpus: {totalChunks} Chunks + +
+ {daysSinceUpdate > 30 && ( +
+ Corpus {daysSinceUpdate}d alt — Re-Evaluation empfohlen +
+ )} +
+ ) +} + export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarProps) { const pathname = usePathname() const { state, packageCompletion, completionPercentage, getCheckpointStatus } = useSDK() @@ -391,6 +427,11 @@ export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarP
)} + {/* RAG Corpus Staleness Badge */} + {!collapsed && state.ragCorpusStatus && ( + + )} + {/* Navigation - 5 Packages */}