fix(iso): AIUI stage picks the NEWEST candidate and copies with --delete

RC1's aiui/index.html pointed at the stale checked-in demo bundle while
today's dist sat beside it unreferenced: demo/aiui was tried first, and the
rsync without --delete merged it over the fresh capture from /opt. Now the
newest index.html across all candidates wins (demo/aiui remains the
fresh-clone fallback) and the copy deletes before writing.

Found by mounting the RC1 ISO and diffing bundle hashes against the tree —
exactly the 'verify the frontend INSIDE the ISO' rule.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-08-07 11:55:24 -04:00
co-authored by Claude
parent 6815a7d1eb
commit e669a3e436
@@ -1424,35 +1424,48 @@ fi
# Include AIUI web app (Claude chat interface)
AIUI_INCLUDED=0
# Search multiple locations for a pre-built AIUI app.
# demo/aiui is the canonical AIUI bundle checked into the repo and is
# tried first so ISO builds on a fresh clone work without needing any
# external AIUI checkout.
# Pick the NEWEST valid AIUI build across the candidate locations, not the
# first: demo/aiui is the checked-in fallback so fresh clones can build an
# ISO, but on a dev box it is older than the tree's dist and silently won —
# 2026-08-07's RC1 shipped an index.html pointing at the stale demo bundle
# while the fresh one sat unused beside it. The merge also needs --delete,
# or yesterday's hashed assets linger next to today's forever.
AIUI_SRC=""
AIUI_NEWEST=0
for AIUI_DIR in \
"$SCRIPT_DIR/../../demo/aiui" \
"$SCRIPT_DIR/../../aiui/packages/app/dist" \
"$SCRIPT_DIR/../../AIUI/packages/app/dist" \
"$HOME/AIUI/packages/app/dist" \
"/home/archipelago/AIUI/packages/app/dist" \
"/opt/archipelago/web-ui/aiui" \
"/home/archipelago/archy/AIUI/packages/app/dist"; do
"/home/archipelago/archy/AIUI/packages/app/dist" \
"$SCRIPT_DIR/../../demo/aiui"; do
if [ -d "$AIUI_DIR" ] && [ -f "$AIUI_DIR/index.html" ]; then
echo " Including AIUI from $AIUI_DIR..."
mkdir -p "$ARCH_DIR/web-ui/aiui"
# Use rsync to handle same-file (CI workspace == /opt/archipelago) gracefully
if command -v rsync >/dev/null 2>&1; then
rsync -a "$AIUI_DIR/" "$ARCH_DIR/web-ui/aiui/"
else
cp -r "$AIUI_DIR/"* "$ARCH_DIR/web-ui/aiui/" 2>/dev/null || true
m="$(stat -c %Y "$AIUI_DIR/index.html" 2>/dev/null || echo 0)"
if [ "$m" -gt "$AIUI_NEWEST" ]; then
AIUI_NEWEST="$m"
AIUI_SRC="$AIUI_DIR"
fi
echo " ✅ AIUI included ($(du -sh "$ARCH_DIR/web-ui/aiui" | cut -f1))"
AIUI_INCLUDED=1
break
fi
done
if [ -n "$AIUI_SRC" ]; then
echo " Including AIUI from $AIUI_SRC (newest of the candidates)..."
mkdir -p "$ARCH_DIR/web-ui/aiui"
# Use rsync to handle same-file (CI workspace == /opt/archipelago) gracefully
if command -v rsync >/dev/null 2>&1; then
rsync -a --delete "$AIUI_SRC/" "$ARCH_DIR/web-ui/aiui/"
else
rm -rf "${ARCH_DIR:?}/web-ui/aiui"
mkdir -p "$ARCH_DIR/web-ui/aiui"
cp -r "$AIUI_SRC/"* "$ARCH_DIR/web-ui/aiui/" 2>/dev/null || true
fi
echo " ✅ AIUI included ($(du -sh "$ARCH_DIR/web-ui/aiui" | cut -f1))"
AIUI_INCLUDED=1
fi
if [ "$AIUI_INCLUDED" = "0" ]; then
echo " ⚠️ AIUI not found — build it first:"
echo " cd ~/AIUI/packages/app && VITE_BASE_PATH=/aiui/ npx vite build"
echo " Searched: demo/aiui, ~/AIUI, /home/archipelago/AIUI, /opt/archipelago/web-ui/aiui"
echo " cd aiui/packages/app && VITE_BASE_PATH=/aiui/ npx vite build"
echo " Searched: aiui/packages/app/dist, AIUI/packages/app/dist, ~/AIUI, /opt/archipelago/web-ui/aiui, demo/aiui"
fi
# Copy app manifests