mirror of
https://github.com/boshu2/agentops.git
synced 2026-09-14 15:08:13 +08:00
38368750cc
bin/factory gates start on ~/.config/factory/bo-approval.env (must exist with approved_by=Bo). Uses PID-file launch lease instead of pgrep. Stop targets specific PID, no broad pkill. `go` writes config without starting; `status` exposes approval state and runtime. Factory is ARMED, not started. Closes: ag-zqqm Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
161 lines
4.6 KiB
Bash
Executable File
161 lines
4.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
FACTORY_DIR="${FACTORY_DIR:-$HOME/.config/factory}"
|
|
APPROVAL_FILE="$FACTORY_DIR/bo-approval.env"
|
|
APPROVAL_EXAMPLE="$FACTORY_DIR/bo-approval.env.example"
|
|
WORKER_SCRIPT="$FACTORY_DIR/tick.sh"
|
|
PROMPT_FILE="$FACTORY_DIR/driver-tick.txt"
|
|
LEASE_FILE="$FACTORY_DIR/.lease"
|
|
PID_FILE="$FACTORY_DIR/.pid"
|
|
|
|
die() { printf 'factory: %s\n' "$1" >&2; exit 1; }
|
|
|
|
_check_approval() {
|
|
[ -f "$APPROVAL_FILE" ] || return 1
|
|
grep -q '^approved_by=' "$APPROVAL_FILE" 2>/dev/null || return 1
|
|
grep -q '^run=' "$APPROVAL_FILE" 2>/dev/null || return 1
|
|
}
|
|
|
|
_acquire_lease() {
|
|
if [ -f "$LEASE_FILE" ]; then
|
|
local lease_pid
|
|
lease_pid="$(cat "$LEASE_FILE" 2>/dev/null)" || true
|
|
if [ -n "$lease_pid" ] && kill -0 "$lease_pid" 2>/dev/null; then
|
|
die "factory already running (pid $lease_pid, lease $LEASE_FILE)"
|
|
fi
|
|
rm -f "$LEASE_FILE"
|
|
fi
|
|
echo $$ > "$LEASE_FILE"
|
|
}
|
|
|
|
_release_lease() {
|
|
rm -f "$LEASE_FILE" "$PID_FILE"
|
|
}
|
|
|
|
cmd_start() {
|
|
if ! _check_approval; then
|
|
echo "FAIL CLOSED: no valid approval artifact at $APPROVAL_FILE"
|
|
echo "To approve: cp $APPROVAL_EXAMPLE $APPROVAL_FILE"
|
|
echo "Then edit approved_at and reason fields."
|
|
exit 1
|
|
fi
|
|
|
|
[ -x "$WORKER_SCRIPT" ] || die "worker not found or not executable: $WORKER_SCRIPT"
|
|
[ -f "$PROMPT_FILE" ] || die "prompt not found: $PROMPT_FILE"
|
|
|
|
_acquire_lease
|
|
trap _release_lease EXIT
|
|
|
|
echo "factory: approved by $(grep '^approved_by=' "$APPROVAL_FILE" | cut -d= -f2)"
|
|
echo "factory: starting worker ($WORKER_SCRIPT)"
|
|
|
|
"$WORKER_SCRIPT" &
|
|
local worker_pid=$!
|
|
echo "$worker_pid" > "$PID_FILE"
|
|
echo "factory: worker pid $worker_pid"
|
|
wait "$worker_pid"
|
|
}
|
|
|
|
cmd_stop() {
|
|
if [ -f "$PID_FILE" ]; then
|
|
local pid
|
|
pid="$(cat "$PID_FILE" 2>/dev/null)" || true
|
|
if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
|
|
echo "factory: stopping worker pid $pid"
|
|
kill "$pid" 2>/dev/null || true
|
|
sleep 1
|
|
kill -0 "$pid" 2>/dev/null && kill -9 "$pid" 2>/dev/null || true
|
|
else
|
|
echo "factory: stale pid file (process $pid not running)"
|
|
fi
|
|
rm -f "$PID_FILE"
|
|
else
|
|
echo "factory: no pid file — not running"
|
|
fi
|
|
rm -f "$LEASE_FILE"
|
|
}
|
|
|
|
cmd_status() {
|
|
echo "=== Factory Status ==="
|
|
|
|
if _check_approval; then
|
|
echo "Approval: ARMED"
|
|
echo " by: $(grep '^approved_by=' "$APPROVAL_FILE" | cut -d= -f2)"
|
|
echo " at: $(grep '^approved_at=' "$APPROVAL_FILE" | cut -d= -f2)"
|
|
echo " run: $(grep '^run=' "$APPROVAL_FILE" | cut -d= -f2)"
|
|
echo " reason: $(grep '^reason=' "$APPROVAL_FILE" | cut -d= -f2)"
|
|
else
|
|
echo "Approval: NOT APPROVED (fail-closed)"
|
|
fi
|
|
|
|
local runtime="codex"
|
|
if grep -q 'claude' "$WORKER_SCRIPT" 2>/dev/null && ! grep -q 'codex' "$WORKER_SCRIPT" 2>/dev/null; then
|
|
runtime="claude (WARNING: LAW 0 violation risk)"
|
|
fi
|
|
echo "Runtime: $runtime"
|
|
echo "Worker: $WORKER_SCRIPT"
|
|
echo "Prompt: $PROMPT_FILE"
|
|
|
|
if [ -f "$PID_FILE" ]; then
|
|
local pid
|
|
pid="$(cat "$PID_FILE" 2>/dev/null)" || true
|
|
if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
|
|
echo "Running: YES (pid $pid)"
|
|
else
|
|
echo "Running: NO (stale pid $pid)"
|
|
fi
|
|
elif [ -f "$LEASE_FILE" ]; then
|
|
echo "Running: LEASE EXISTS ($(cat "$LEASE_FILE" 2>/dev/null))"
|
|
else
|
|
echo "Running: NO"
|
|
fi
|
|
}
|
|
|
|
cmd_go() {
|
|
mkdir -p "$FACTORY_DIR"
|
|
|
|
if [ ! -f "$APPROVAL_EXAMPLE" ]; then
|
|
cat > "$APPROVAL_EXAMPLE" <<'EOF'
|
|
approved_by=Bo
|
|
run=factory-live
|
|
approved_at=YYYY-MM-DDTHH:MM:SSZ
|
|
reason=factory go-dark activation
|
|
EOF
|
|
echo "factory: wrote example at $APPROVAL_EXAMPLE"
|
|
fi
|
|
|
|
if [ ! -f "$WORKER_SCRIPT" ]; then
|
|
cat > "$WORKER_SCRIPT" <<'WORKER'
|
|
#!/bin/zsh
|
|
export PATH="$HOME/bin:$HOME/.local/bin:/opt/homebrew/bin:$PATH"
|
|
cd "/Users/bo/dev/agentops" || exit 1
|
|
exec codex exec --cd "/Users/bo/dev/agentops" --sandbox workspace-write --ask-for-approval never "$(cat "/Users/bo/.config/factory/driver-tick.txt")"
|
|
WORKER
|
|
chmod +x "$WORKER_SCRIPT"
|
|
echo "factory: wrote worker at $WORKER_SCRIPT"
|
|
fi
|
|
|
|
echo "factory: ARMED (config written). Not started."
|
|
echo "To approve: cp $APPROVAL_EXAMPLE $APPROVAL_FILE"
|
|
echo "To start: factory start"
|
|
}
|
|
|
|
case "${1:-help}" in
|
|
start) cmd_start ;;
|
|
stop) cmd_stop ;;
|
|
status) cmd_status ;;
|
|
go) cmd_go ;;
|
|
help|--help|-h)
|
|
echo "Usage: factory {start|stop|status|go}"
|
|
echo ""
|
|
echo " start Start factory worker (FAILS CLOSED without Bo approval)"
|
|
echo " stop Stop factory worker by pid (no broad pkill)"
|
|
echo " status Show approval state, runtime, running status"
|
|
echo " go Write config/arm factory (does NOT start)"
|
|
;;
|
|
*)
|
|
die "unknown command: $1 (try: factory help)"
|
|
;;
|
|
esac
|