#!/usr/bin/env bash # Runs on 103 from a verified Deep Search release directory. set -euo pipefail RUNTIME_BASE="${DEEP_SEARCH_RUNTIME_BASE:-/Users/john/Project/deep-search-runtime}" RELEASE_DIR="${DEEP_SEARCH_RELEASE_DIR:?DEEP_SEARCH_RELEASE_DIR is required}" ENV_DIR="${RUNTIME_BASE}/shared" ENV_FILE="${ENV_DIR}/.env" DATA_DIR="${RUNTIME_BASE}/data" LOG_DIR="${RUNTIME_BASE}/logs" PLIST="${HOME}/Library/LaunchAgents/cn.tkmind.memind-deep-search.plist" LABEL="cn.tkmind.memind-deep-search" GUI="gui/$(id -u)" NODE_BIN="${NODE_BIN:-/opt/homebrew/opt/node@24/bin/node}" [[ -x "${NODE_BIN}" ]] || { echo "missing Node.js runtime: ${NODE_BIN}" >&2 exit 1 } [[ -f "${RELEASE_DIR}/deep-search-server.mjs" ]] || { echo "missing Deep Search server in ${RELEASE_DIR}" >&2 exit 1 } mkdir -p "${ENV_DIR}" "${DATA_DIR}" "${LOG_DIR}" "$(dirname "${PLIST}")" touch "${ENV_FILE}" chmod 600 "${ENV_FILE}" ensure_env() { local key="$1" local value="$2" if ! grep -qE "^${key}=" "${ENV_FILE}"; then printf '%s=%s\n' "${key}" "${value}" >> "${ENV_FILE}" fi } if ! grep -qE '^TKMIND_DEEP_SEARCH_SECRET=.+$' "${ENV_FILE}"; then secret="$(openssl rand -hex 32)" ensure_env TKMIND_DEEP_SEARCH_SECRET "${secret}" fi ensure_env TKMIND_DEEP_SEARCH_HOST "127.0.0.1" ensure_env TKMIND_DEEP_SEARCH_PORT "20100" ensure_env TKMIND_DEEP_SEARCH_DB "${DATA_DIR}/research.sqlite" ensure_env TKMIND_DEEP_SEARCH_SEARXNG_URL "http://127.0.0.1:20080/search" ensure_env TKMIND_DEEP_SEARCH_LLM_GATEWAY_URL "http://127.0.0.1:8081/api/internal/deep-search/llm" ensure_env TKMIND_DEEP_SEARCH_LLM_GATEWAY_SECRET '${TKMIND_DEEP_SEARCH_SECRET}' ln -sfn "${RELEASE_DIR}" "${RUNTIME_BASE}/current" cat > "${PLIST}" < Label${LABEL} ProgramArguments /bin/bash ${RUNTIME_BASE}/current/scripts/run-deep-search-prod.sh WorkingDirectory${RUNTIME_BASE} EnvironmentVariables DEEP_SEARCH_RUNTIME_BASE${RUNTIME_BASE} NODE_BIN${NODE_BIN} RunAtLoad KeepAlive ProcessTypeBackground ThrottleInterval10 StandardOutPath${LOG_DIR}/deep-search.log StandardErrorPath${LOG_DIR}/deep-search.log EOF plutil -lint "${PLIST}" >/dev/null launchctl bootout "${GUI}/${LABEL}" >/dev/null 2>&1 || true launchctl bootstrap "${GUI}" "${PLIST}" launchctl enable "${GUI}/${LABEL}" launchctl kickstart -k "${GUI}/${LABEL}" for _ in $(seq 1 30); do if curl -fsS --max-time 2 "http://127.0.0.1:20100/health" >/dev/null 2>&1; then exit 0 fi sleep 1 done echo "Deep Search health check timed out" >&2 exit 1