From a319df6260a3e7c04e512505ebdc458534c2a39c Mon Sep 17 00:00:00 2001 From: lucabem Date: Tue, 5 May 2026 20:33:31 +0200 Subject: [PATCH 1/2] refactor: decompose GraphView, add RAG semantic search and git hooks --- .gitignore | 1 + CHANGELOG.md | 15 + backend/main.py | 122 +++- frontend/nginx.conf | 2 +- frontend/public/rootly.jpeg | Bin 0 -> 87713 bytes frontend/src/App.css | 115 +++- frontend/src/App.tsx | 111 +++- frontend/src/components/GraphView.tsx | 616 +++++------------- .../src/components/graph/ColumnControls.tsx | 138 ++++ .../src/components/graph/GraphControls.tsx | 128 ++++ .../src/components/graph/NodeContextMenu.tsx | 67 ++ frontend/src/components/graph/NodeLabel.tsx | 117 ++++ frontend/src/components/graph/Select.tsx | 32 + frontend/src/components/graph/layout.tsx | 115 ++++ frontend/src/components/graph/types.ts | 45 ++ .../src/components/graph/useColumnTrace.ts | 115 ++++ frontend/src/components/graph/useGraphData.ts | 39 ++ .../src/components/graph/useGraphFilter.ts | 148 +++++ hooks/generate_commit_message.py | 122 ++++ hooks/install.sh | 6 + hooks/post-commit | 16 + hooks/prepare-commit-msg | 26 + rag/ingest.py | 51 ++ rag/knowledge.py | 100 ++- rag/query.py | 196 ++++-- rag/requirements.txt | 1 + rag/tools/__init__.py | 7 +- rag/tools/athena.py | 114 ++++ rag/tools/dataset.py | 113 +++- rag/tools/job.py | 59 +- rag/vectorize.py | 34 +- scripts/split_knowledge.py | 120 ++++ 32 files changed, 2304 insertions(+), 587 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 frontend/public/rootly.jpeg create mode 100644 frontend/src/components/graph/ColumnControls.tsx create mode 100644 frontend/src/components/graph/GraphControls.tsx create mode 100644 frontend/src/components/graph/NodeContextMenu.tsx create mode 100644 frontend/src/components/graph/NodeLabel.tsx create mode 100644 frontend/src/components/graph/Select.tsx create mode 100644 frontend/src/components/graph/layout.tsx create mode 100644 frontend/src/components/graph/types.ts create mode 100644 frontend/src/components/graph/useColumnTrace.ts create mode 100644 frontend/src/components/graph/useGraphData.ts create mode 100644 frontend/src/components/graph/useGraphFilter.ts create mode 100755 hooks/generate_commit_message.py create mode 100755 hooks/install.sh create mode 100755 hooks/post-commit create mode 100755 hooks/prepare-commit-msg create mode 100644 rag/tools/athena.py create mode 100644 scripts/split_knowledge.py diff --git a/.gitignore b/.gitignore index 69d20e8..0f6dd9a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ data/ openlineage/data/ openlineage/events.ndjson chroma_data/ +knowledge/ # Caché de Maven / Ivy (JARs descargados por spark.jars.packages) .ivy2/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..1dabd70 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# Changelog + +## Unreleased + +### 2026-05-05 +- **refactor(hooks): defer changelog updates to post-commit hook** — Moved changelog file writing to post-commit hook to ensure clean staging area during prepare-commit-msg phase, fixing issues with changelog generation workflow. + +### 2026-05-05 +- **style: add Rootly logo to header and empty state** — Added Rootly logo image to application header and empty state UI for improved branding and visual identity. + +### 2026-05-05 +- **refactor: decompose GraphView and enhance RAG with semantic search** — Refactored GraphView into modular components (controls, context menu, layout), added semantic search with Athena integration, improved backend caching of filter terms and datasets, increased proxy timeout to 300s, and enhanced UI with markdown tables, code copy buttons, and loading suggestions. + +### 2026-05-05 +- **feat(rag): add Claude commit hooks and improve knowledge chunking** — Added git hooks that auto-generate conventional commit messages and changelog entries using Claude Haiku; improved knowledge document splitting to handle large tables and long sections intelligently. diff --git a/backend/main.py b/backend/main.py index 6418377..313a4f7 100644 --- a/backend/main.py +++ b/backend/main.py @@ -26,14 +26,14 @@ ) from rag.tools.dataset import downstream_layers as _downstream_layers from rag.query import ask, load_history, _downstream_layers -from rag.vectorize import get_collection +from rag.vectorize import get_collection, load_graph_cache app = FastAPI(title="RAG Lineage API") -# @app.on_event("startup") -# def startup(): -# threading.Thread(target=_ensure_loaded, daemon=True).start() +@app.on_event("startup") +def startup(): + threading.Thread(target=_ensure_loaded, daemon=True).start() app.add_middleware( @@ -43,7 +43,7 @@ allow_headers=["*"], ) -_state: dict = {"G": None, "collection": None, "loaded_at": 0.0} +_state: dict = {"G": None, "collection": None, "loaded_at": 0.0, "filter_terms": None, "datasets_resp": None} _load_lock = threading.Lock() _last_reloaded_task: str | None = None @@ -58,13 +58,38 @@ def _ensure_loaded(): if _state["collection"] is not None: # otro hilo cargó mientras esperábamos return _state["G"], _state["collection"] - events = load_events() - G = build_graph(events) collection = get_collection() - if collection.count() == 0: - print("[ensure_loaded] WARNING: ChromaDB is empty. Run /api/sync.") + if collection.count() > 0: + G = load_graph_cache() + if G is not None: + print(f"[ensure_loaded] Restored from cache — {G.number_of_nodes()} nodes, {collection.count()} docs in ChromaDB.") + else: + print("[ensure_loaded] ChromaDB has data but no graph cache — rebuilding from local events.") + events = load_events() + G = build_graph(events) + else: + print("[ensure_loaded] ChromaDB is empty. Run /api/sync to populate.") + events = load_events() + G = build_graph(events) + _state.update({"G": G, "collection": collection, "loaded_at": time.time()}) + all_metas = collection.get(include=["metadatas"])["metadatas"] or [] + _state["filter_terms"] = { + "namespaces": {str(v) for m in all_metas if (v := m.get("namespace"))}, + "names": {str(v) for m in all_metas if (v := m.get("name"))}, + } + + datasets = [ + {"key": k, "namespace": d.get("namespace", ""), "name": d.get("name", k)} + for k, d in G.nodes(data=True) + if d.get("kind") == "dataset" + ] + _state["datasets_resp"] = { + "datasets": datasets, + "namespaces": sorted({d["namespace"] for d in datasets if d["namespace"]}), + } + return _state["G"], _state["collection"] @@ -137,6 +162,7 @@ def chat(req: ChatRequest): G=_state["G"], bucket=S3_BUCKET, jobs_prefix=S3_JOBS_PREFIX, + filter_terms=_state.get("filter_terms"), ) _save_chat(req.question, answer) return {"answer": answer} @@ -152,6 +178,8 @@ def chat(req: ChatRequest): @app.get("/api/datasets") def list_datasets(): + if _state.get("datasets_resp"): + return _state["datasets_resp"] try: G = _state["G"] datasets = [] @@ -245,6 +273,8 @@ def task_status(task_id: str): _state["G"] = None _state["collection"] = None _state["loaded_at"] = 0.0 + _state["filter_terms"] = None + _state["datasets_resp"] = None should_reload = True else: print(f"[task_status] task={task_id} SUCCESS (already processed) — skipping reload.") @@ -278,32 +308,87 @@ def graph(): return {"nodes": nodes, "edges": edges} +@app.get("/api/namespaces") +def namespaces(): + G = _state["G"] + if G is None: + return {"namespaces": []} + ns = sorted({ + d.get("namespace", "") + for _, d in G.nodes(data=True) + if d.get("kind") == "dataset" and d.get("namespace") + }) + return {"namespaces": ns} + + +@app.get("/api/tables") +def tables(namespace: str = ""): + G = _state["G"] + if G is None: + return {"tables": []} + result = sorted({ + d.get("name", k) + for k, d in G.nodes(data=True) + if d.get("kind") == "dataset" + and (not namespace or d.get("namespace", "") == namespace) + }) + return {"tables": result} + + +@app.get("/api/schema") +def schema(dataset: str, namespace: str | None = None): + G = _state["G"] + if G is None: + raise HTTPException(status_code=503, detail="Graph not loaded yet.") + matches = [ + d for _, d in G.nodes(data=True) + if d.get("kind") == "dataset" + and d.get("name", "").lower() == dataset.lower() + and (not namespace or d.get("namespace", "") == namespace) + ] + if not matches: + raise HTTPException(status_code=404, detail=f"Dataset '{dataset}' not found.") + node = matches[0] + columns = [] + for raw in node.get("schema", []): + if " (" in raw and raw.endswith(")"): + name, type_part = raw.rsplit(" (", 1) + columns.append({"name": name, "type": type_part[:-1]}) + else: + columns.append({"name": raw, "type": ""}) + return { + "dataset": node.get("name"), + "namespace": node.get("namespace"), + "columns": columns, + } + + @app.get("/api/trace") -def trace(dataset: str, field: str | None = None): +def trace(dataset: str, field: str | None = None, namespace: str | None = None): """ Trace column-level lineage for a field in a dataset. Useful for GDPR audits: find the exact origin of a sensitive field. ?dataset=customers&field=email -> recursive trace of email in customers ?dataset=customers -> full column lineage for the dataset + ?namespace=ns&dataset=customers -> scoped to a specific namespace """ G = _state["G"] if G is None: raise HTTPException(status_code=503, detail="Graph not loaded yet.") - matches = [ - (k, d) - for k, d in G.nodes(data=True) - if d.get("kind") == "dataset" - and dataset.lower() in d.get("name", "").lower() - ] + all_ds = [(k, d) for k, d in G.nodes(data=True) if d.get("kind") == "dataset"] + if namespace: + all_ds = [(k, d) for k, d in all_ds if d.get("namespace", "") == namespace] + exact = [(k, d) for k, d in all_ds if d.get("name", "").lower() == dataset.lower()] + matches = exact or [(k, d) for k, d in all_ds if dataset.lower() in d.get("name", "").lower()] if not matches: raise HTTPException(status_code=404, detail=f"Dataset '{dataset}' not found.") def _trace_field(ds_name: str, out_field: str, visited: set, depth: int) -> dict: """Recursively trace a field back to its origins.""" if depth > 6 or (ds_name, out_field) in visited: - return {"field": out_field, "dataset": ds_name, "sources": [], "cycle": depth > 6} + return {"field": out_field, "dataset": ds_name, "namespace": "", "sources": [], "cycle": depth > 6} visited.add((ds_name, out_field)) src_node = next( @@ -313,6 +398,7 @@ def _trace_field(ds_name: str, out_field: str, visited: set, depth: int) -> dict ), None, ) + ns = src_node[1].get("namespace", "") if src_node else "" col_lineage = src_node[1].get("column_lineage", {}) if src_node else {} sources_meta = col_lineage.get(out_field, []) @@ -323,7 +409,7 @@ def _trace_field(ds_name: str, out_field: str, visited: set, depth: int) -> dict child["transform_subtype"] = s.get("subtype", "?") sources.append(child) - return {"field": out_field, "dataset": ds_name, "sources": sources} + return {"field": out_field, "dataset": ds_name, "namespace": ns, "sources": sources} results = [] for node_key, data in matches: diff --git a/frontend/nginx.conf b/frontend/nginx.conf index a92b5de..4d8e02a 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -12,6 +12,6 @@ server { proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; - proxy_read_timeout 120s; + proxy_read_timeout 300s; } } diff --git a/frontend/public/rootly.jpeg b/frontend/public/rootly.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..71995422b4f66061bea800bdac626c881f6c8e78 GIT binary patch literal 87713 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≦HlBtD9 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 { + const child = (children as any)?.[0] + return child?.props?.children ?? '' + })() + return ( +
+ +
{children}
+
+ ) +} + type Role = 'user' | 'assistant' type Tab = 'chat' | 'impact' | 'graph' | 'tasks' type TaskStatus = 'PENDING' | 'STARTED' | 'SUCCESS' | 'FAILURE' @@ -80,6 +117,7 @@ export default function App() { const [allDatasets, setAllDatasets] = useState([]) const [allNamespaces, setAllNamespaces] = useState([]) const [tasks, setTasks] = useState(loadTasks) + const [loadingHint, setLoadingHint] = useState(0) const messagesEndRef = useRef(null) const MAX_TASK_AGE_MS = 24 * 60 * 60 * 1000 @@ -101,6 +139,13 @@ export default function App() { return () => clearTimeout(t) }, [toast]) + // Cycle loading hint text while waiting for response + useEffect(() => { + if (!loading) { setLoadingHint(0); return } + const t = setInterval(() => setLoadingHint(h => (h + 1) % LOADING_HINTS.length), 3000) + return () => clearInterval(t) + }, [loading]) + // Persist tasks useEffect(() => { saveTasks(tasks) }, [tasks]) @@ -171,14 +216,12 @@ export default function App() { } } - async function sendMessage() { - const q = input.trim() + async function sendQuestion(q: string) { if (!q || loading) return - setInput('') setMessages(prev => [...prev, { id: ++msgId, role: 'user', content: q }]) setLoading(true) try { - const history = messages.map(m => ({ role: m.role, content: m.content })) + const history = messages.slice(-10).map(m => ({ role: m.role, content: m.content })) const r = await fetch('/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -195,6 +238,27 @@ export default function App() { } } + async function sendMessage() { + const q = input.trim() + if (!q) return + setInput('') + await sendQuestion(q) + } + + function handleAskAboutNode(node: { kind: string; name: string; namespace: string; field?: string }) { + setTab('chat') + const ns = node.namespace ? ` (${node.namespace})` : '' + let q: string + if (node.field) { + q = `Cuéntame sobre la columna "${node.field}" del dataset "${node.name}"${ns}: de dónde viene, qué transformaciones sufre y qué jobs la producen o modifican.` + } else if (node.kind === 'job') { + q = `Cuéntame sobre el job ETL "${node.name}": qué datasets lee y escribe, cuál es su lógica y su historial de ejecuciones recientes.` + } else { + q = `Cuéntame sobre el dataset "${node.name}"${ns}: su schema, los jobs que lo producen y consumen, y si tiene linaje de columnas disponible.` + } + sendQuestion(q) + } + async function handleSync() { setSyncing(true) try { @@ -258,7 +322,7 @@ export default function App() { {/* Header */}
- + Rootly RAG Lineage
@@ -302,12 +366,17 @@ export default function App() { {messages.length === 0 && !loading && (
- - - + Rootly

Consulta tu linaje de datos

Pregunta sobre datasets, pipelines, impacto de cambios de schema y más.

+
+ {SUGGESTIONS.map(s => ( + + ))} +
)} {messages.map(msg => ( @@ -315,7 +384,14 @@ export default function App() { {msg.role === 'user' ? 'Tú' : 'Asistente'}
{msg.role === 'assistant' - ? {msg.content} + ? ( + {children} }} + > + {msg.content} + + ) : msg.content}
@@ -323,7 +399,12 @@ export default function App() { {loading && (
Asistente -
+
+
+ + {LOADING_HINTS[loadingHint]} +
+
)}
@@ -331,7 +412,13 @@ export default function App() {