#!/usr/bin/env bash set -euo pipefail ROOT="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)" export CODEX_HOME="${CODEX_HOME:-$HOME/.codex}" export FNOS_SKILL="${FNOS_SKILL:-$CODEX_HOME/skills/fnos-hyzq-deploy}" export FNOS_SSH="${FNOS_SSH:-$FNOS_SKILL/scripts/fnos_ssh.sh}" export FNOS_SCP="${FNOS_SCP:-$FNOS_SKILL/scripts/fnos_scp.sh}" FNOS_HOST="${FNOS_HOST:-192.168.31.188}" REMOTE_ROOT="${STORYFORGE_FNOS_REMOTE_ROOT:-/vol1/docker/hyzq-stack/current/storyforge}" REMOTE_COMPOSE_DIR="${STORYFORGE_FNOS_COMPOSE_DIR:-/vol1/docker/hyzq-stack/current/deploy/fnos}" REMOTE_STATE_ROOT="${STORYFORGE_CLIPROXY_STATE_ROOT:-/vol1/docker/hyzq-stack/shared/storyforge-cliproxyapi}" resolve_fnos_password() { if [ -n "${FNOS_PASSWORD:-}" ]; then printf '%s' "$FNOS_PASSWORD" return 0 fi security find-internet-password -s "$FNOS_HOST" -a "${FNOS_USER:-krisolo}" -w } need_cmd() { command -v "$1" >/dev/null 2>&1 || { echo "missing required command: $1" >&2; exit 1; } } need_cmd python3 need_cmd security need_cmd sshpass run_remote() { local remote_cmd="$1" sshpass -p "$FNOS_PASSWORD_VALUE" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "${FNOS_USER:-krisolo}@${FNOS_HOST}" "$remote_cmd" } FNOS_PASSWORD_VALUE="$(resolve_fnos_password)" TMPDIR_DEPLOY="$(mktemp -d)" trap 'rm -rf "$TMPDIR_DEPLOY"' EXIT mkdir -p "$TMPDIR_DEPLOY/cliproxyapi/auths" "$TMPDIR_DEPLOY/cliproxyapi/logs" cp "$ROOT/data/cliproxyapi/config.yaml" "$TMPDIR_DEPLOY/cliproxyapi/config.yaml" rsync -a "$ROOT/data/cliproxyapi/auths/" "$TMPDIR_DEPLOY/cliproxyapi/auths/" 2>/dev/null || true run_remote "mkdir -p '$REMOTE_COMPOSE_DIR' '$REMOTE_ROOT' '$REMOTE_STATE_ROOT/auths' '$REMOTE_STATE_ROOT/logs'" "$FNOS_SCP" "$REMOTE_COMPOSE_DIR" "$ROOT/deploy/storyforge-fnos-cliproxy.compose.yaml" "$FNOS_SCP" "$REMOTE_STATE_ROOT" "$TMPDIR_DEPLOY/cliproxyapi/config.yaml" "$FNOS_SCP" "$REMOTE_STATE_ROOT" "$TMPDIR_DEPLOY/cliproxyapi/auths" run_remote "printf '%s\n' '$FNOS_PASSWORD_VALUE' | sudo -S -p '' sh -lc 'cd \"$REMOTE_COMPOSE_DIR\" && docker compose -f \"$REMOTE_COMPOSE_DIR/storyforge-fnos-cliproxy.compose.yaml\" up -d --force-recreate storyforge-cliproxyapi'" curl -fsS --max-time 15 "http://$FNOS_HOST:8317/v1/models" >/dev/null 2>&1 || true echo "fnOS cliproxy deployed: http://$FNOS_HOST:8317/v1/models"