#!/usr/bin/env bash # Switch 103 native goosed pool 18006-18014 from 1.41 to Goose v1.49 (goose serve). set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" NATIVE_ROOT="${GOOSE_NATIVE_ROOT:-/Users/john/Project/tkmind_go-native}" GOOSED_V149_ROOT="${GOOSE_V149_ROOT:-/Users/john/Project/tkmind_go-v149}" STAMP="${GOOSE_V149_RELEASE_STAMP:-$(date +%Y%m%d-v149-m1)}" RELEASE_BIN="${NATIVE_ROOT}/releases/goose-${STAMP}" BACKUP_TAG="$(date +%Y%m%d-%H%M%S)" BACKUP_DIR="${NATIVE_ROOT}/backups/pre-v149-pool-${BACKUP_TAG}" RUN_SCRIPT="${NATIVE_ROOT}/run-goosed-native.sh" PORTAL_ENV="${GOOSE_V149_CANARY_ENV_FILE:-/Users/john/Project/Memind/.env}" GUI="gui/$(id -u)" CANARY_LABEL="cn.tkmind.goose-v149-canary" usage() { cat </dev/null | head -1 || true)" if [[ -z "${latest}" ]]; then echo "No pool backup found under ${NATIVE_ROOT}/backups/" >&2 exit 1 fi say "rollback from ${latest}" cp "${latest}/run-goosed-native.sh" "${RUN_SCRIPT}" chmod +x "${RUN_SCRIPT}" for env in "${latest}"/.env.*; do [[ -f "${env}" ]] || continue cp "${env}" "${NATIVE_ROOT}/$(basename "${env}")" done ln -sfn "${NATIVE_ROOT}/releases/goosed-20260729-v141-m1" "${NATIVE_ROOT}/goosed" for p in $(seq 18006 18014); do launchctl bootout "${GUI}/cn.tkmind.goosed-native-${p}" 2>/dev/null || true launchctl bootstrap "${GUI}" "${HOME}/Library/LaunchAgents/cn.tkmind.goosed-native-${p}.plist" done if [[ -x "${ROOT}/scripts/switch-goose-v149-canary-103.sh" ]]; then bash "${ROOT}/scripts/switch-goose-v149-canary-103.sh" off || true fi sleep 3 for p in $(seq 18006 18014); do printf '%s: ' "$p" curl -kfsS --connect-timeout 5 "https://127.0.0.1:${p}/status" || echo FAIL done say "rollback complete" } if [[ "${1:-}" == "--rollback" ]]; then rollback exit 0 fi if [[ "${1:-}" != "--yes" ]]; then echo "Refusing without --yes (103 production pool switch)" >&2 usage >&2 exit 2 fi SRC_BIN="${GOOSED_V149_ROOT}/target/release/goose" if [[ ! -x "${SRC_BIN}" ]]; then SRC_BIN="${NATIVE_ROOT}/releases/goose-${STAMP}" fi if [[ ! -x "${SRC_BIN}" ]]; then echo "Missing v1.49 binary: ${GOOSED_V149_ROOT}/target/release/goose" >&2 exit 1 fi mkdir -p "${BACKUP_DIR}" "${NATIVE_ROOT}/releases" cp -a "${RUN_SCRIPT}" "${BACKUP_DIR}/" for p in $(seq 18006 18014); do cp -a "${NATIVE_ROOT}/.env.${p}" "${BACKUP_DIR}/" done say "backup ${BACKUP_DIR}" install -m 755 "${SRC_BIN}" "${RELEASE_BIN}" ln -sfn "${RELEASE_BIN}" "${NATIVE_ROOT}/goosed" cat > "${RUN_SCRIPT}" <<'RUNEOF' #!/usr/bin/env bash set -euo pipefail export PATH="/opt/homebrew/opt/node@24/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin" PORT="${1:?missing port argument}" ROOT="/Users/john/Project/tkmind_go-native" cd "${ROOT}" set -a # shellcheck source=/dev/null source "${ROOT}/.env.${PORT}" set +a GOOSE_BIN="${GOOSE_BIN:-${ROOT}/goosed}" exec env "CUSTOM_DEEPSEEK-CP_API_KEY=${DEEPSEEK_API_KEY:-}" \ "${GOOSE_BIN}" serve \ --host "${GOOSE_HOST:-127.0.0.1}" \ --port "${PORT}" \ --tls RUNEOF chmod +x "${RUN_SCRIPT}" for p in $(seq 18006 18014); do ENV_FILE="${NATIVE_ROOT}/.env.${p}" mkdir -p "${NATIVE_ROOT}/state/${p}"/{config,data,state,cache} if ! grep -q 'GOOSE_V149_POOL' "${ENV_FILE}" 2>/dev/null; then { echo "" echo "# GOOSE_V149_POOL overrides ($(date -u +%Y-%m-%dT%H:%M:%SZ))" echo "GOOSE_BIN=${RELEASE_BIN}" echo "XDG_CONFIG_HOME=${NATIVE_ROOT}/state/${p}/config" echo "XDG_DATA_HOME=${NATIVE_ROOT}/state/${p}/data" echo "XDG_STATE_HOME=${NATIVE_ROOT}/state/${p}/state" echo "XDG_CACHE_HOME=${NATIVE_ROOT}/state/${p}/cache" echo "MEMORY_BACKEND=legacy" echo "MEMORY_VECTOR_ENABLED=0" echo "MEMORY_AGENT_INJECTION_MODE=off" echo "MEMORY_LIFECYCLE_ENABLED=0" echo "MEMORY_CANDIDATE_ENABLED=0" } >> "${ENV_FILE}" fi done say "stop stable pool + canary :18015" for p in $(seq 18006 18014); do launchctl bootout "${GUI}/cn.tkmind.goosed-native-${p}" 2>/dev/null || true done launchctl bootout "${GUI}/${CANARY_LABEL}" 2>/dev/null || true if [[ -x "${ROOT}/scripts/switch-goose-v149-canary-103.sh" ]] \ && grep -q '# GOOSE_V149_CANARY_BEGIN' "${PORTAL_ENV}" 2>/dev/null; then bash "${ROOT}/scripts/switch-goose-v149-canary-103.sh" off || true fi say "bootstrap v1.49 pool" for p in $(seq 18006 18014); do launchctl bootstrap "${GUI}" "${HOME}/Library/LaunchAgents/cn.tkmind.goosed-native-${p}.plist" done sleep 5 FAIL=0 for p in $(seq 18006 18014); do printf '%s: ' "$p" if curl -kfsS --connect-timeout 8 "https://127.0.0.1:${p}/status" >/dev/null; then echo ok else echo FAIL FAIL=1 fi done if [[ "${FAIL}" -ne 0 ]]; then say "pool health check failed; consider: bash $0 --rollback" >&2 exit 1 fi "${RELEASE_BIN}" --version | head -1 say "pool switch ok release=${RELEASE_BIN}" say "backup=${BACKUP_DIR}"