#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" GORI_AGENT_HOME="${GORI_AGENT_HOME:-$ROOT_DIR}" STATE_DIR="$GORI_AGENT_HOME/state" LOG_DIR="$GORI_AGENT_HOME/logs" CONFIG_FILE="${GORI_GATEWAY_CONFIG:-$ROOT_DIR/config.json}" PID_FILE="$STATE_DIR/gori-agent.pid" LOG_FILE="$LOG_DIR/gori-agent.log" usage() { cat < [--config path] Commands: setup Run interactive setup start Start gateway in foreground start-daemon Start gateway in background stop Stop background gateway restart Restart background gateway status Show gateway status doctor Check configuration and local agents logs Follow gateway log discover-agents List detected local CLI agents Environment: GORI_GATEWAY_CONFIG Config path, default: $CONFIG_FILE EOF } ensure_build() { if [[ ! -f "$ROOT_DIR/dist/cli.js" ]]; then echo "dist/cli.js not found; building..." npm run build --prefix "$ROOT_DIR" fi } ensure_state() { mkdir -p "$STATE_DIR" "$LOG_DIR" } is_running() { [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null } start_daemon() { ensure_build ensure_state if is_running; then echo "gori-agent already running, pid $(cat "$PID_FILE")" exit 0 fi nohup node "$ROOT_DIR/dist/cli.js" start --config "$CONFIG_FILE" >>"$LOG_FILE" 2>&1 & echo $! >"$PID_FILE" echo "gori-agent started, pid $(cat "$PID_FILE")" echo "log: $LOG_FILE" } stop_daemon() { if ! is_running; then rm -f "$PID_FILE" echo "gori-agent is not running" exit 0 fi local pid pid="$(cat "$PID_FILE")" kill "$pid" rm -f "$PID_FILE" echo "gori-agent stopped, pid $pid" } if [[ $# -lt 1 ]]; then usage exit 1 fi COMMAND="$1" shift while [[ $# -gt 0 ]]; do case "$1" in --config) CONFIG_FILE="$2" shift 2 ;; --help|-h) usage exit 0 ;; *) echo "Unknown argument: $1" >&2 usage >&2 exit 1 ;; esac done case "$COMMAND" in setup) ensure_build exec node "$ROOT_DIR/dist/cli.js" setup --config "$CONFIG_FILE" ;; start) ensure_build exec node "$ROOT_DIR/dist/cli.js" start --config "$CONFIG_FILE" ;; start-daemon) start_daemon ;; stop) stop_daemon ;; restart) stop_daemon start_daemon ;; status) ensure_build if is_running; then echo "gori-agent process: running, pid $(cat "$PID_FILE")" else echo "gori-agent process: not running" fi exec node "$ROOT_DIR/dist/cli.js" status --config "$CONFIG_FILE" ;; doctor) ensure_build exec node "$ROOT_DIR/dist/cli.js" doctor --config "$CONFIG_FILE" ;; discover-agents) ensure_build exec node "$ROOT_DIR/dist/cli.js" discover-agents --config "$CONFIG_FILE" ;; logs) ensure_state touch "$LOG_FILE" exec tail -f "$LOG_FILE" ;; --help|-h|help) usage ;; *) echo "Unknown command: $COMMAND" >&2 usage >&2 exit 1 ;; esac