#!/usr/bin/env bash set -euo pipefail # Sidelinja — start alt for lokal utvikling # Bruk: ./dev.sh [--clean] # --clean Sletter SpacetimeDB-data og starter blankt ROOT="$(cd "$(dirname "$0")" && pwd)" SPACETIME_URL="http://127.0.0.1:3000" SPACETIME_MODULE="sidelinja-realtime" SPACETIME_SERVER="local" # === Rens ved behov === if [[ "${1:-}" == "--clean" ]]; then echo "=== Renser SpacetimeDB-data ===" docker compose -f "$ROOT/docker-compose.dev.yml" --env-file "$ROOT/.env.local" \ rm -sf spacetimedb 2>/dev/null || true rm -rf "$ROOT/.docker-data/spacetimedb" mkdir -p "$ROOT/.docker-data/spacetimedb" fi # === 1. Docker-tjenester === echo "=== Starter Docker-tjenester ===" docker compose -f "$ROOT/docker-compose.dev.yml" --env-file "$ROOT/.env.local" up -d # === 2. Vent på SpacetimeDB === echo "=== Venter på SpacetimeDB ===" timeout 30 bash -c "until curl -sf $SPACETIME_URL/v1/ping > /dev/null 2>&1; do sleep 1; done" \ || { echo "FEIL: SpacetimeDB svarte ikke innen 30s"; exit 1; } echo "SpacetimeDB klar" # === 3. Konfigurer spacetime CLI (håndterer ny fingerprint automatisk) === echo "=== Konfigurerer SpacetimeDB CLI ===" spacetime server remove "$SPACETIME_SERVER" 2>/dev/null || true spacetime server add "$SPACETIME_SERVER" --url "$SPACETIME_URL" --default 2>/dev/null || true # Ved --clean har SpacetimeDB ny identity — re-login for å unngå 401 if [[ "${1:-}" == "--clean" ]]; then spacetime login --server-issued-login "$SPACETIME_SERVER" 2>/dev/null || true fi # === 4. Publiser modul === echo "=== Publiserer SpacetimeDB-modul ===" cd "$ROOT/spacetimedb" spacetime publish "$SPACETIME_MODULE" --server "$SPACETIME_SERVER" 2>&1 \ | grep -v "wasm-opt\|Would you like\|WARNING.*UNSTABLE" || true echo "Modul publisert" # === 5. Generer TypeScript-bindinger === echo "=== Genererer TypeScript-bindinger ===" spacetime generate --lang typescript \ --out-dir "$ROOT/web/src/lib/chat/module_bindings" \ --module-path . echo "Bindinger generert" # === 6. Start worker + frontend === echo "" echo "=== Starter worker + frontend ===" cd "$ROOT/worker" AI_GATEWAY_KEY=$(grep LITELLM_MASTER_KEY "$ROOT/.env.local" | cut -d= -f2 | tr -d '\r') AI_GATEWAY_URL="http://127.0.0.1:4000/v1" cargo run -- --spacetimedb-url "$SPACETIME_URL" --sync-interval 1 --warmup-limit 100 \ --ai-gateway-url "$AI_GATEWAY_URL" --ai-gateway-key "$AI_GATEWAY_KEY" 2>&1 | sed 's/^/[worker] /' & WORKER_PID=$! cd "$ROOT/web" npm run dev 2>&1 | sed 's/^/[frontend] /' & FRONTEND_PID=$! cleanup() { echo "" echo "Stopper worker og frontend..." kill $WORKER_PID $FRONTEND_PID 2>/dev/null wait $WORKER_PID $FRONTEND_PID 2>/dev/null echo "Stoppet. Docker-tjenester kjører fortsatt (bruk 'docker compose down' for å stoppe)." } trap cleanup EXIT INT TERM echo "" echo "Alt kjører:" echo " Frontend: http://localhost:5173" echo " SpacetimeDB: $SPACETIME_URL" echo " PostgreSQL: localhost:5432" echo " Worker PID: $WORKER_PID" echo "" echo "Ctrl+C for å stoppe worker + frontend." echo "" wait