Files
MemeMeow/scripts/agent-runtime.sh
T
2026-09-24 11:19:53 +08:00

58 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# 共享 Agent 容器的构建、启动、探针和停止入口。
set -Eeuo pipefail
ROOT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
source "$ROOT_DIR/scripts/runtime-identity.sh"
configure_runtime_identity
COMPOSE_FILE="${MEMEMEOW_COMPOSE_FILE:-$ROOT_DIR/docker-compose.yml}"
SERVICE="mememeow-agent-runtime"
mkdir -p "$ROOT_DIR/data/opencode" "$ROOT_DIR/data/images"
compose() {
# 用户可能尚未刷新 docker 组,统一通过 sg 运行 Docker 命令。
if docker info >/dev/null 2>&1; then
docker compose -f "$COMPOSE_FILE" "$@"
else
# sg 只接受一个命令字符串;用 bash 的 %q 为每个参数安全转义,避免路径
# 或任务参数改变命令语义。
local quoted argument
printf -v quoted 'docker compose -f %q' "$COMPOSE_FILE"
for argument in "$@"; do
printf -v argument '%q' "$argument"
quoted+=" $argument"
done
sg docker -c "$quoted"
fi
}
case "${1:-check}" in
build)
compose build "$SERVICE"
;;
start)
compose up -d --build "$SERVICE"
compose ps "$SERVICE"
;;
check)
compose ps "$SERVICE"
compose exec -T "$SERVICE" sh -lc 'set -eu; id; opencode --version; node --version; python3 --version; file --version | head -1; convert --version | head -1; jq --version; curl --version | head -1; if command -v tesseract >/dev/null 2>&1; then printf "agent runtime forbidden tool present: tesseract\n" >&2; exit 1; fi; test "$(id -u)" != 0; test -r /images && test ! -w /images; test -r /skills/research-meme-context && test ! -w /skills/research-meme-context; test -r /opt/mememeow/node_modules && test ! -w /opt/mememeow/node_modules; test -r /runtime && test -w /runtime; test ! -S /var/run/docker.sock; test ! -e /.env; python3 -m executor.probe; printf "agent runtime probe: ok\n"'
;;
stop)
compose stop "$SERVICE"
;;
restart)
compose stop "$SERVICE"
compose up -d --build "$SERVICE"
;;
logs)
compose logs --tail=200 "$SERVICE"
;;
*)
echo "用法: $0 {build|start|check|stop|restart|logs}" >&2
exit 2
;;
esac