Spaces:
Running
Running
| """Mirror generator-input data files from the SSOT | |
| (`AI_Ethic_HOT_chatbot/shared_content/`) into this Space's local `data/` | |
| folder. | |
| Two files are mirrored: | |
| - case_analysis.md (consolidated case material) | |
| - ethics-frameworks.md (the three analytical frameworks) | |
| Both are read by core/perfect_answer.py at session start to generate the | |
| per-session perfect-answer essay. | |
| Runs at app startup. On HF Spaces the SSOT folder doesn't exist (it's local | |
| design infrastructure, never deployed); sync is a silent no-op and the | |
| deployed copies in data/ are used as-is. | |
| """ | |
| import sys | |
| import shutil | |
| from core.config_loader import BASE_DIR | |
| SSOT_PATH = BASE_DIR.parent / "shared_content" | |
| LOCAL_DATA_PATH = BASE_DIR / "data" | |
| GENERATOR_INPUT_FILES = {"case_analysis.md", "ethics-frameworks.md"} | |
| def sync_chapters_from_ssot(): | |
| """Mirror generator inputs from SSOT into local data/. Idempotent. | |
| Function name kept for backwards compatibility with existing app.py | |
| imports; it no longer mirrors chapter files. | |
| """ | |
| if not SSOT_PATH.exists(): | |
| return | |
| LOCAL_DATA_PATH.mkdir(parents=True, exist_ok=True) | |
| ssot_files = { | |
| n: SSOT_PATH / n for n in GENERATOR_INPUT_FILES | |
| if (SSOT_PATH / n).exists() | |
| } | |
| local_files = { | |
| p.name: p for p in LOCAL_DATA_PATH.glob("*.md") | |
| if p.name in GENERATOR_INPUT_FILES | |
| } | |
| changes = [] | |
| for name, src in ssot_files.items(): | |
| dst = local_files.get(name) or (LOCAL_DATA_PATH / name) | |
| if not dst.exists() or src.read_bytes() != dst.read_bytes(): | |
| shutil.copy2(src, dst) | |
| changes.append(f"+{name}" if not local_files.get(name) else f"~{name}") | |
| for name in local_files.keys() - ssot_files.keys(): | |
| local_files[name].unlink() | |
| changes.append(f"-{name}") | |
| if changes: | |
| print(f"[content_sync] {', '.join(changes)}", file=sys.stderr) | |