#!/usr/bin/env bash # Refresh the vendored engine + sanad_pkg from a full monorepo checkout. # P1 ships a SELF-CONTAINED copy under ./vendor so the repo builds standalone. # P1 now vendors from SanadV3 (the active engine — same evolved voice/audio/gemini # as P2; P1 just mounts only its comms slice). Override with SANAD_SRC=/abs/path. # # ./sync_vendor.sh [/path/to/G1] # default: ../../ (G1/Packages/.. = G1/) # # Excludes runtime data (recordings/audio/faces), Logs, caches, the temp3d 3D # viewer (P1 hides that tab), and tests — keeps code + config + dashboard SPA. set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" PROJECT="${1:-$(cd "$HERE/../.." && pwd)}" # G1/Packages/Sanad_Package_1 -> ../../ = G1/ SRC_SANAD="${SANAD_SRC:-$PROJECT/Sanadv3}" SRC_PKG="$PROJECT/Packages/sanad_pkg" SRC_LIC="$PROJECT/Packages/licensing" [ -d "$SRC_SANAD" ] || { echo "ERROR: no engine at $SRC_SANAD (set SANAD_SRC=/path)"; exit 1; } [ -d "$SRC_PKG" ] || { echo "ERROR: no sanad_pkg at $SRC_PKG"; exit 1; } echo ">> vendoring Sanad engine from $SRC_SANAD" rm -rf "$HERE/vendor"; mkdir -p "$HERE/vendor" rsync -a \ --exclude 'data/' --exclude 'Logs/' --exclude '__pycache__/' --exclude '*.pyc' \ --exclude '.git/' --exclude 'dashboard/static/temp3d/' --exclude 'tests/' \ "$SRC_SANAD/" "$HERE/vendor/Sanad/" echo ">> seeding minimal data/" mkdir -p "$HERE/vendor/Sanad/data/motions" cp "$SRC_SANAD/data/motions/config.json" "$HERE/vendor/Sanad/data/motions/config.json" for j in audio_device.json camera_device.json; do [ -f "$SRC_SANAD/data/$j" ] && cp "$SRC_SANAD/data/$j" "$HERE/vendor/Sanad/data/$j" || true done for d in recordings audio faces photos; do mkdir -p "$HERE/vendor/Sanad/data/$d"; touch "$HERE/vendor/Sanad/data/$d/.gitkeep"; done echo ">> vendoring sanad_pkg + public key" rm -rf "$HERE/vendor/sanad_pkg"; cp -r "$SRC_PKG" "$HERE/vendor/sanad_pkg" find "$HERE/vendor/sanad_pkg" -name __pycache__ -type d -prune -exec rm -rf {} + 2>/dev/null || true mkdir -p "$HERE/license" cp "$SRC_LIC/pubkey.ed25519" "$HERE/license/pubkey.ed25519" echo ">> ship keyless (blank any baked Gemini key in the seed)" python3 - "$HERE" <<'PY' import json, sys h = sys.argv[1] for p, sec in ((h+"/vendor/Sanad/config/core_config.json", "gemini_defaults"), (h+"/vendor/Sanad/data/motions/config.json", "gemini")): try: d = json.load(open(p)) except Exception: continue s = d.get(sec) if isinstance(s, dict) and s.get("api_key"): s["api_key"] = "" json.dump(d, open(p, "w"), ensure_ascii=False, indent=2) print(" blanked", sec, "in", p) PY echo ">> refresh ./data seed mirror (keep structure, drop runtime media)" rsync -a --delete \ --exclude 'recordings/*' --exclude 'audio/*' --exclude 'faces/*' --exclude 'photos/*' \ "$HERE/vendor/Sanad/data/" "$HERE/data/" for d in recordings audio faces photos; do mkdir -p "$HERE/data/$d"; touch "$HERE/data/$d/.gitkeep"; done echo ">> done. vendor: $(du -sh "$HERE/vendor" | cut -f1) — review & commit ./vendor ./data ./license"