#!/usr/bin/env bash # # deploy-gigafactory.sh — one-shot local deploy of the Agent Gigafactory # (platform-service fleet module) against the configured backend, then register # the ecosystem products so live /api/fleet/* calls return data. # # Prereqs: # - learning_ai_common_plat checked out as a sibling of this repo # - services/platform-service/.env filled (Cosmos endpoint/key, JWT_SECRET, ...) # e.g. populated from Azure: COSMOS_ENDPOINT/COSMOS_KEY/AZURE_BLOB_CONNECTION_STRING # - pnpm deps installed in common_plat; Node 18+ # # Usage: # ./deploy-gigafactory.sh # start service, wait for health, register products, smoke # ./deploy-gigafactory.sh --full # full local stack: backend + register factories + web tracker # ./deploy-gigafactory.sh --with-tracker # also start the web tracker (tracker-web) on $TRACKER_PORT # ./deploy-gigafactory.sh --tracker-only # backend already running; just start the web tracker # ./deploy-gigafactory.sh --register-only # service already running on $PORT; just register products # ./deploy-gigafactory.sh --stop # stop the service + tracker started by this script # ./deploy-gigafactory.sh --no-register # start + health only, skip product registration # # Env overrides: # COMMON_PLAT path to learning_ai_common_plat (default: ../learning_ai_common_plat) # PORT platform-service port (default: 4003) # TRACKER_PORT tracker-web (web tracker) port (default: 3003) # DEFAULT_PRODUCT_ID product the tracker logs in / scopes to (default: first of $PRODUCTS) # PRODUCTS space-separated "id|DisplayName|PREFIX" tuples (default: ecosystem set) set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" COMMON_PLAT="${COMMON_PLAT:-$(cd "$HERE/../../learning_ai_common_plat" 2>/dev/null && pwd || true)}" PORT="${PORT:-4003}" TRACKER_PORT="${TRACKER_PORT:-3003}" PS_DIR="$COMMON_PLAT/services/platform-service" TRACKER_DIR="$COMMON_PLAT/dashboards/tracker-web" ENV_FILE="$PS_DIR/.env" PID_FILE="$HERE/.gigafactory-platform-service.pid" TRACKER_PID_FILE="$HERE/.gigafactory-tracker-web.pid" LOG_FILE="${TMPDIR:-/tmp}/gigafactory-platform-service.log" TRACKER_LOG="${TMPDIR:-/tmp}/gigafactory-tracker-web.log" BASE="http://localhost:$PORT" TRACKER_URL="http://localhost:$TRACKER_PORT" PRODUCTS="${PRODUCTS:-\ lysnrai|LysnrAI|LYS \ mindlyst|MindLyst|MIND \ chronomind|ChronoMind|CHR \ jarvisjr|JarvisJr|JAR \ nomgap|NomGap|NOM \ peakpulse|PeakPulse|PEAK \ flowmonk|FlowMonk|FLOW \ notelett|NoteLett|NOTE \ actiontrail|ActionTrail|ACT \ localmemgpt|LocalMemGPT|LMG \ efforise|EffoRise|EFF}" die() { echo "error: $*" >&2; exit 1; } # Stop a process recorded in a pid file, plus any children it spawned # (next dev / pnpm fork worker processes). Returns 0 if it stopped something. stop_pidfile() { local pidfile="$1" label="$2" [ -f "$pidfile" ] || return 1 local pid; pid="$(cat "$pidfile")" if kill -0 "$pid" 2>/dev/null; then pkill -P "$pid" 2>/dev/null || true kill "$pid" 2>/dev/null && echo "stopped $label (pid $pid)" fi rm -f "$pidfile" return 0 } stop_service() { local stopped=1 stop_pidfile "$TRACKER_PID_FILE" "tracker-web" && stopped=0 stop_pidfile "$PID_FILE" "platform-service" && stopped=0 [ "$stopped" = 0 ] || echo "no pid files; nothing started by this script" } mint_token() { node -e ' const c=require("crypto");const s=process.env.JWT_SECRET; if(!s){console.error("JWT_SECRET not set");process.exit(1);} const b=o=>Buffer.from(JSON.stringify(o)).toString("base64url"); const h=b({alg:"HS256",typ:"JWT"});const n=Math.floor(Date.now()/1e3); const p=b({sub:"gigafactory-deploy",email:"deploy@bytelyst.local",role:"admin",type:"access",iat:n,exp:n+3600}); console.log(`${h}.${p}.`+c.createHmac("sha256",s).update(`${h}.${p}`).digest("base64url")); ' } # wait_for_url