#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" PYTHON_BIN="${PYTHON_BIN:-$ROOT_DIR/.venv/bin/python}" HOST="${HOST:-0.0.0.0}" REQUESTED_PORT="${PORT:-7860}" if [[ ! -x "$PYTHON_BIN" ]]; then PYTHON_BIN="${PYTHON_BIN_FALLBACK:-python3}" fi PORT="$("$PYTHON_BIN" - "$REQUESTED_PORT" "$HOST" <<'PY' import socket import sys start = int(sys.argv[1]) host = sys.argv[2] for port in range(start, start + 50): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.bind((host, port)) except OSError: continue print(port) break else: raise SystemExit(f"No free port found from {start} to {start + 49}") PY )" detect_lan_ip() { local ip="" if command -v ipconfig >/dev/null 2>&1; then ip="$(ipconfig getifaddr en0 2>/dev/null || true)" if [[ -z "$ip" ]]; then local iface iface="$(route get default 2>/dev/null | awk '/interface:/ {print $2; exit}' || true)" if [[ -n "$iface" ]]; then ip="$(ipconfig getifaddr "$iface" 2>/dev/null || true)" fi fi fi if [[ -z "$ip" ]] && command -v hostname >/dev/null 2>&1; then ip="$(hostname -I 2>/dev/null | awk '{print $1}' || true)" fi printf '%s' "$ip" } LAN_IP="${LAN_IP:-$(detect_lan_ip)}" export BUDDY_FORCE_FAKE_RUNTIME="${BUDDY_FORCE_FAKE_RUNTIME:-1}" export BUDDY_ASR_BACKEND="${BUDDY_ASR_BACKEND:-browser}" if [[ -n "$LAN_IP" ]]; then LAN_URL="http://$LAN_IP:$PORT" else LAN_URL="LAN IP not detected. Check your Wi-Fi IP and use http://:$PORT" fi LAN_WARNING="" case "$HOST" in 127.0.0.1|localhost|::1) LAN_WARNING="HOST=127.0.0.1 will block other devices. Use HOST=0.0.0.0 for iPad / LAN testing." ;; esac if [[ -n "$LAN_WARNING" ]]; then LAN_WARNING_LINE=" $LAN_WARNING" else LAN_WARNING_LINE="" fi cat <