File size: 4,994 Bytes
f3f5774
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
"""
DVNC.AI β€” HuggingFace Spaces Entry Point

This app.py lives at the repo root and handles:
  1. Detecting and fixing misplaced upgrade folders (e.g. 'stevens_upgrade (1)')
  2. Building the connectome database on first run
  3. Launching the Gradio app on port 7860

Drop this file at: DVNC.AI2/app.py  (replaces the existing one)
"""

import json
import os
import shutil
import sys
import time
from pathlib import Path

# ── Locate the project root ─────────────────────────────────────────────────

# On HuggingFace Spaces, app.py sits at /home/user/app/app.py
# The v3 codebase is at /home/user/app/dvnc_connectome_v3/
APP_DIR = Path(__file__).resolve().parent
PROJECT_DIR = APP_DIR / "dvnc_connectome_v3"

if not PROJECT_DIR.exists():
    # Fallback: maybe app.py is inside dvnc_connectome_v3 itself
    if (APP_DIR / "src" / "dvnc_connectome").exists():
        PROJECT_DIR = APP_DIR
    else:
        print("[app.py] ERROR: Cannot find dvnc_connectome_v3/ directory.")
        print(f"[app.py] Searched in: {APP_DIR}")
        sys.exit(1)

print(f"[app.py] Project directory: {PROJECT_DIR}")


# ── Step 1: Fix misplaced Stevens upgrade files ─────────────────────────────

def fix_stevens_upgrade():
    """
    If the 'stevens_upgrade (1)' folder exists as a sibling inside PROJECT_DIR,
    move its contents to the correct locations and remove the leftover folder.
    """
    # Try common variations of the folder name
    candidates = [
        PROJECT_DIR / "stevens_upgrade (1)",
        PROJECT_DIR / "stevens_upgrade",
        PROJECT_DIR / "stevens_upgrade(1)",
    ]
    upgrade_dir = None
    for c in candidates:
        if c.is_dir():
            upgrade_dir = c
            break

    if upgrade_dir is None:
        return  # Nothing to fix

    print(f"[app.py] Found misplaced upgrade folder: {upgrade_dir.name}")
    print("[app.py] Moving files to correct locations...")

    # Walk through the upgrade folder and copy each file to the matching
    # location in the project tree
    count = 0
    for src_file in upgrade_dir.rglob("*"):
        if src_file.is_file():
            # Compute the relative path inside the upgrade folder
            rel = src_file.relative_to(upgrade_dir)
            dst = PROJECT_DIR / rel
            dst.parent.mkdir(parents=True, exist_ok=True)
            shutil.copy2(src_file, dst)
            action = "NEW" if not dst.exists() else "REPLACED"
            print(f"  βœ“ {rel}  ({action})")
            count += 1

    # Remove the upgrade folder
    shutil.rmtree(upgrade_dir)
    print(f"[app.py] Moved {count} files. Removed '{upgrade_dir.name}'.")


fix_stevens_upgrade()


# ── Step 2: Add src/ to Python path ─────────────────────────────────────────

SRC_DIR = PROJECT_DIR / "src"
if str(SRC_DIR) not in sys.path:
    sys.path.insert(0, str(SRC_DIR))

# Also ensure PROJECT_DIR is the working directory so relative paths in
# scripts (e.g. ./data/dvnc.db) resolve correctly
os.chdir(PROJECT_DIR)
print(f"[app.py] Working directory: {os.getcwd()}")
print(f"[app.py] Python path includes: {SRC_DIR}")


# ── Step 3: Build database if it doesn't exist ──────────────────────────────

DB_PATH = PROJECT_DIR / "data" / "dvnc.db"

# Force rebuild if DB is from a previous version (no text snippets in docs)
_REBUILD_MARKER = PROJECT_DIR / "data" / ".v3_with_snippets"
if DB_PATH.exists() and not _REBUILD_MARKER.exists():
    print("[app.py] Rebuilding database with text snippets for evidence retrieval...")
    DB_PATH.unlink()

if not DB_PATH.exists():
    print("[app.py] Database not found β€” building connectome...")
    DB_PATH.parent.mkdir(parents=True, exist_ok=True)

    from dvnc_connectome.db.neurographdb import NeuroGraphDB
    from dvnc_connectome.curation.pipeline import run_full_pipeline

    t0 = time.time()
    db = NeuroGraphDB(str(DB_PATH))
    db.init()
    stats = run_full_pipeline(
        db=db,
        include_network=True,
        include_stevens=True,
        verbose=True,
    )
    elapsed = time.time() - t0
    print(f"[app.py] Database built in {elapsed:.1f}s")
    print(f"[app.py] Stats: {json.dumps(stats, indent=2)}")
    _REBUILD_MARKER.touch()
else:
    print(f"[app.py] Database found: {DB_PATH} ({DB_PATH.stat().st_size / 1024:.0f} KB)")


# ── Step 4: Launch Gradio ────────────────────────────────────────────────────

from dvnc_connectome.apps.gradio_app import make_app

print("[app.py] Starting DVNC.AI Gradio app...")
app = make_app(str(DB_PATH))
app.launch(
    server_name="0.0.0.0",
    server_port=7860,
    share=False,
    show_error=True,
)