File size: 2,526 Bytes
0366d65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env bash
# One-time setup for the Mac always-on daemon (Scenario 1):
#   Hermes (llama-server) + backend (autonomous) + collector, as launchd jobs.
#
# Prereqs you provide:
#   - llama.cpp built (llama-server on PATH, or pass LLAMA_SERVER=/path/to/llama-server)
#   - a Hermes GGUF (e.g. Hermes-3-Llama-3.1-8B Q4_K_M) -> pass MODEL_GGUF=/path
#   - Google OAuth: credentials.json (+ token.json after first auth) in the repo dir
#   - Full Disk Access for the python binary (the script prints how)
#
# Usage:
#   INGEST_TOKEN=... MODEL_GGUF=~/models/hermes-3-8b-q4.gguf ./scripts/setup_mac.sh
set -euo pipefail

REPO="$(cd "$(dirname "$0")/.." && pwd)"
HOME_DIR="$HOME"
PYTHON="${PYTHON:-$(command -v python3)}"
LLAMA_SERVER="${LLAMA_SERVER:-$(command -v llama-server || true)}"
MODEL_GGUF="${MODEL_GGUF:?set MODEL_GGUF=/path/to/hermes.gguf}"
INGEST_TOKEN="${INGEST_TOKEN:?set INGEST_TOKEN=... (same value you use elsewhere)}"
LA="$HOME_DIR/Library/LaunchAgents"

[ -n "$LLAMA_SERVER" ] || { echo "llama-server not found; set LLAMA_SERVER=/path"; exit 1; }
mkdir -p "$LA" "$HOME_DIR/.offgrid" "$HOME_DIR/Library/Logs"

install_plist() {
  local name="$1"
  sed -e "s|__PYTHON__|$PYTHON|g" \
      -e "s|__REPO__|$REPO|g" \
      -e "s|__HOME__|$HOME_DIR|g" \
      -e "s|__LLAMA_SERVER__|$LLAMA_SERVER|g" \
      -e "s|__MODEL_GGUF__|$MODEL_GGUF|g" \
      -e "s|__INGEST_TOKEN__|$INGEST_TOKEN|g" \
      "$REPO/deploy/launchd/$name" > "$LA/$name"
  launchctl unload "$LA/$name" 2>/dev/null || true
  launchctl load "$LA/$name"
  echo "loaded $name"
}

"$PYTHON" -m pip install -q -r "$REPO/requirements-ci.txt"  # runtime deps (no GPU model needed on Mac)

install_plist com.offgrid.hermes.plist
install_plist com.offgrid.backend.plist
install_plist com.offgrid.collector.plist

cat <<EOF

Done. Three launchd jobs are running (and restart on reboot):
  com.offgrid.hermes     -> llama-server (Hermes) on :8080
  com.offgrid.backend    -> Gradio UI + /agent + /ingest on :7860 (AUTONOMOUS, Hermes brain)
  com.offgrid.collector  -> reads chat.db -> /ingest

ONE MANUAL STEP: grant Full Disk Access to the python binary so the collector can read chat.db:
  System Settings > Privacy & Security > Full Disk Access > +  ->  $PYTHON
Then: launchctl kickstart -k gui/\$(id -u)/com.offgrid.collector

Dashboard: http://127.0.0.1:7860  (Activity = live runs, Memory = what it learned)
Logs:      ~/Library/Logs/offgrid-*.log
Triggers on YOUR sent/accepted iMessages (TRIGGER_ON=outgoing). Set TRIGGER_ON=any to widen.
EOF