Heleni WhatsApp
by @netanel-abergel
Complete WhatsApp management for OpenClaw agents: per-conversation memory (groups + DMs), unanswered message tracking, loop prevention, and multi-PA coordina...
init_whatsapp_memory() {
TYPE="$1" # "group" or "dm"
ID="$2" # JID or phone number
NAME="$3" # Human-readable name SAFE_ID=$(echo "$ID" | tr '@.+' '---')
if [ "$TYPE" = "group" ]; then
DIR="$HOME/.openclaw/workspace/memory/whatsapp/groups/$SAFE_ID"
mkdir -p "$DIR"
cat > "$DIR/meta.json" << EOF
{"type": "group", "jid": "$ID", "name": "$NAME", "created": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"}
EOF
touch "$DIR/context.md" "$DIR/decisions.md" "$DIR/people.md"
else
DIR="$HOME/.openclaw/workspace/memory/whatsapp/dms/$SAFE_ID"
mkdir -p "$DIR"
cat > "$DIR/meta.json" << EOF
{"type": "dm", "phone": "$ID", "name": "$NAME", "created": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"}
EOF
touch "$DIR/context.md" "$DIR/notes.md"
fi
echo "Initialized WhatsApp memory: $NAME"
}
Examples:
init_whatsapp_memory "group" "YOUR_GROUP_JID@g.us" "PA Team"
init_whatsapp_memory "dm" "+PHONE_NUMBER" "Contact Name"
Writing Memory
wa_log() {
TYPE="$1" # "group" or "dm"
ID="$2" # JID or phone
CONTENT="$3" # what to log
FILE_NAME="${4:-context.md}" # context.md / decisions.md / notes.md SAFE_ID=$(echo "$ID" | tr '@.+' '---')
BASE="$HOME/.openclaw/workspace/memory/whatsapp"
if [ "$TYPE" = "group" ]; then
FILE="$BASE/groups/$SAFE_ID/$FILE_NAME"
else
FILE="$BASE/dms/$SAFE_ID/$FILE_NAME"
fi
if [ ! -f "$FILE" ]; then
mkdir -p "$(dirname "$FILE")"
touch "$FILE"
fi
echo "[$(date -u +%Y-%m-%d\ %H:%M)] $CONTENT" >> "$FILE"
}
Reading Memory
wa_context() {
TYPE="$1"
ID="$2"
LINES="${3:-20}" SAFE_ID=$(echo "$ID" | tr '@.+' '---')
BASE="$HOME/.openclaw/workspace/memory/whatsapp"
if [ "$TYPE" = "group" ]; then
DIR="$BASE/groups/$SAFE_ID"
else
DIR="$BASE/dms/$SAFE_ID"
fi
if [ ! -d "$DIR" ]; then
echo "No memory for this conversation yet."
return
fi
NAME=$(python3 -c "
import json
with open('$DIR/meta.json') as f:
print(json.load(f).get('name', '?'))
" 2>/dev/null || echo "?")
echo "=== $NAME ==="
echo "--- Recent ---"
tail -"$LINES" "$DIR/context.md" 2>/dev/null || echo "(empty)"
echo "--- Notes/Decisions ---"
cat "$DIR/notes.md" "$DIR/decisions.md" 2>/dev/null | tail -10 || echo "(none)"
}
Search Across All Memory
wa_search() {
QUERY="$1"
BASE="$HOME/.openclaw/workspace/memory/whatsapp" echo "Searching WhatsApp memory for: '$QUERY'"
grep -r "$QUERY" "$BASE" --include="*.md" -l 2>/dev/null | while read file; do
DIR=$(dirname "$file")
NAME=$(python3 -c "
import json
with open('$DIR/meta.json') as f:
print(json.load(f).get('name', '?'))
" 2>/dev/null || echo "?")
echo "Found in: $NAME"
grep -n "$QUERY" "$file" | head -3
echo ""
done
}
What to Log
| File | Use for | |---|---| | context.md | Ongoing conversation events, tasks assigned | | decisions.md | Agreed outcomes, group decisions | | people.md | Who's in the group, their role/style | | notes.md | DM tasks, owner preferences, follow-ups |
Never log: casual greetings, duplicate info, credentials.
Before Responding β Inject Context
1. Extract JID or phone from inbound metadata
2. If group: run wa_context "group" "$JID" 10
If DM: run wa_context "dm" "$PHONE" 10
3. Use context to inform your response
4. After responding: log anything worth remembering
Use this section when the agent is not responding to WhatsApp messages.
Step 1 β Classify the problem:
openclaw gateway restart, wait 30s, check if count increments.Step 2 β Fix ingest issues (Messages = 0):
openclaw gateway status
openclaw gateway restart
Wait 30 seconds, then test
openclaw gateway logs --last 50 # Look for: binding failed, session dropped, ingest error
If errors persist β escalate to platform admin (infrastructure issue).Step 3 β Fix runtime issues (no reply despite incoming messages):
# Check for billing errors
grep -i "billing\|402\|credits" ~/.openclaw/logs/agent.log | tail -20Verify API key (expect HTTP 200)
curl -s -o /dev/null -w "%{http_code}" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
https://api.anthropic.com/v1/models
200 = OK | 401 = invalid key | 402 = billing error
Prevention:
When to escalate: Gateway restart doesn't fix Messages = 0, logs show socket/binding/session errors, or multiple agents affected at the same time.
clawhub install heleni-whatsapp