import streamlit as st import os, hashlib, re, sys # ─── Ensure utils/ is importable ────────────────────────────── sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from utils.file_utils import normalize_log_line from utils.summarizer import summarize_text from utils.docgen import generate_doc st.title("📂 AI Bulk Digest") st.write("Upload multiple files for batch digestion, summarization, and documentation.") # Init counters if "uploaded_files" not in st.session_state: st.session_state.uploaded_files = [] if "errors" not in st.session_state: st.session_state.errors = [] if "bulk_digests" not in st.session_state: st.session_state.bulk_digests = [] uploads = st.file_uploader( "Upload files (scripts, logs, text, PDFs)", type=["py", "sh", "txt", "log", "pdf"], accept_multiple_files=True ) if uploads: digests = [] for f in uploads: try: content = f.read().decode("utf-8", errors="ignore") sha1 = hashlib.sha1(content.encode()).hexdigest() # Detect type is_log = f.name.endswith(".log") is_script = f.name.endswith(".py") or f.name.endswith(".sh") # Normalize logs if is_log: normalized = [normalize_log_line(line) for line in content.splitlines()] preview = "\n".join(normalized[:30]) else: preview = "\n".join(content.splitlines()[:30]) # AI summary summary = summarize_text(content) # Script docs if applicable doc = generate_doc(f.name, "uploaded", content) if is_script else None result = { "name": f.name, "sha1": sha1, "preview": preview, "summary": summary, "doc": doc, } digests.append(result) # Track upload st.session_state.uploaded_files.append(f.name) # Display in UI st.subheader(f"📄 {f.name}") st.code(preview) st.markdown(f"**SHA1:** `{sha1}`") st.write("🧠 **Summary:**", summary) if doc: st.write("📘 **Generated Documentation:**") st.markdown(doc) except Exception as e: st.error(f"⚠️ Error processing {f.name}: {e}") st.session_state.errors.append(str(e)) # Save to session state for Chatbot st.session_state.bulk_digests = digests st.success(f"✅ Bulk digestion complete for {len(digests)} files.")