#!/usr/bin/env bash set -euo pipefail CACHE_HOME="${XDG_CACHE_HOME:-/var/lib/qmd/cache}" CONFIG_HOME="${XDG_CONFIG_HOME:-/var/lib/qmd/config}" PORT="${QMD_HTTP_PORT:-8181}" INTERNAL_PORT="${QMD_INTERNAL_PORT:-8182}" QMD_LLM_FILE="${QMD_LLM_FILE:-/usr/local/lib/node_modules/@tobilu/qmd/dist/llm.js}" mkdir -p "${CACHE_HOME}/qmd" "${CONFIG_HOME}/qmd" apply_model_overrides() { if [[ -z "${QMD_EMBED_MODEL_URI:-}" && -z "${QMD_RERANK_MODEL_URI:-}" && -z "${QMD_GENERATE_MODEL_URI:-}" ]]; then return 0 fi if [[ ! -f "${QMD_LLM_FILE}" ]]; then echo "WARN: llm.js not found at ${QMD_LLM_FILE}, skip model overrides." >&2 return 0 fi QMD_LLM_FILE="${QMD_LLM_FILE}" node - <<'NODE' const fs = require("fs"); const llmFile = process.env.QMD_LLM_FILE; let src = fs.readFileSync(llmFile, "utf8"); const replacements = [ ["DEFAULT_EMBED_MODEL", process.env.QMD_EMBED_MODEL_URI], ["DEFAULT_RERANK_MODEL", process.env.QMD_RERANK_MODEL_URI], ["DEFAULT_GENERATE_MODEL", process.env.QMD_GENERATE_MODEL_URI], ]; for (const [name, value] of replacements) { if (!value) continue; const pattern = new RegExp(`const ${name} = \\"[^\\"]+\\";`); if (!pattern.test(src)) { console.error(`WARN: failed to find ${name} in ${llmFile}`); continue; } src = src.replace(pattern, `const ${name} = ${JSON.stringify(value)};`); } fs.writeFileSync(llmFile, src, "utf8"); NODE } apply_model_overrides qmd mcp --http --port "${INTERNAL_PORT}" & qmd_pid=$! socat "TCP-LISTEN:${PORT},fork,reuseaddr,bind=0.0.0.0" "TCP6:[::1]:${INTERNAL_PORT}" & proxy_pid=$! cleanup() { kill "${proxy_pid}" "${qmd_pid}" 2>/dev/null || true wait "${proxy_pid}" "${qmd_pid}" 2>/dev/null || true } trap cleanup SIGINT SIGTERM wait -n "${qmd_pid}" "${proxy_pid}" status=$? cleanup exit "${status}"