chore: check in all local work — uniwizard, briefings, reports, evennia, morrowind, scripts, specs, training data, angband MCP, diagrams, twitter archive, wizards
- Resolve decisions.md merge conflict (keep both Codex boundary + Ezra/Bezalel entries)
- Update .gitignore: protect bare secret files, exclude venvs and nexus-localhost
- Add uniwizard tools (mention watcher, adaptive prompt router, self-grader, classifiers)
- Add briefings, good-morning reports, production reports
- Add evennia world scaffold and training data
- Add angband and morrowind MCP servers
- Add diagrams, specs, test results, overnight loop scripts
- Add twitter archive insights and media metadata
- Add wizard workspaces (allegro, nahshon)
2026-03-30 17:18:09 -04:00
|
|
|
#!/bin/bash
|
|
|
|
|
# kimi-mention-watcher.sh — Watches for @KimiClaw mentions in Gitea
|
|
|
|
|
# Polls notifications, finds unread mentions, dispatches response via OpenClaw
|
|
|
|
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
KIMI_TOKEN=$(cat /Users/apayne/.timmy/kimi_gitea_token | tr -d '[:space:]')
|
2026-04-05 07:07:05 +00:00
|
|
|
|
|
|
|
|
# --- Tailscale/IP Detection (timmy-home#385) ---
|
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
|
source "${SCRIPT_DIR}/lib/tailscale-gitea.sh"
|
|
|
|
|
BASE="$GITEA_BASE_URL"
|
|
|
|
|
|
chore: check in all local work — uniwizard, briefings, reports, evennia, morrowind, scripts, specs, training data, angband MCP, diagrams, twitter archive, wizards
- Resolve decisions.md merge conflict (keep both Codex boundary + Ezra/Bezalel entries)
- Update .gitignore: protect bare secret files, exclude venvs and nexus-localhost
- Add uniwizard tools (mention watcher, adaptive prompt router, self-grader, classifiers)
- Add briefings, good-morning reports, production reports
- Add evennia world scaffold and training data
- Add angband and morrowind MCP servers
- Add diagrams, specs, test results, overnight loop scripts
- Add twitter archive insights and media metadata
- Add wizard workspaces (allegro, nahshon)
2026-03-30 17:18:09 -04:00
|
|
|
LOG="/tmp/kimi-mentions.log"
|
|
|
|
|
PROCESSED="/tmp/kimi-mentions-processed.txt"
|
|
|
|
|
|
|
|
|
|
touch "$PROCESSED"
|
|
|
|
|
|
|
|
|
|
log() { echo "[$(date '+%H:%M:%S')] $*" | tee -a "$LOG"; }
|
|
|
|
|
|
|
|
|
|
# Get unread notifications for KimiClaw
|
|
|
|
|
notifications=$(curl -s -H "Authorization: token $KIMI_TOKEN" \
|
|
|
|
|
"$BASE/notifications?status-types=unread&limit=20" 2>/dev/null)
|
|
|
|
|
|
|
|
|
|
if [ -z "$notifications" ] || [ "$notifications" = "null" ] || [ "$notifications" = "[]" ]; then
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "$notifications" | python3 -c "
|
|
|
|
|
import json, sys
|
|
|
|
|
notifs = json.load(sys.stdin)
|
|
|
|
|
for n in notifs:
|
|
|
|
|
subject = n.get('subject', {})
|
|
|
|
|
repo = n.get('repository', {}).get('full_name', '')
|
|
|
|
|
title = subject.get('title', '')
|
|
|
|
|
url = subject.get('latest_comment_url', '') or subject.get('url', '')
|
|
|
|
|
nid = n.get('id', '')
|
|
|
|
|
print(f'{nid}|{repo}|{title}|{url}')
|
|
|
|
|
" 2>/dev/null | while IFS='|' read -r nid repo title url; do
|
|
|
|
|
[ -z "$nid" ] && continue
|
|
|
|
|
|
|
|
|
|
# Skip if already processed
|
|
|
|
|
grep -q "^$nid$" "$PROCESSED" && continue
|
|
|
|
|
|
|
|
|
|
log "MENTION: $repo — $title"
|
|
|
|
|
|
|
|
|
|
# Get the actual comment content
|
|
|
|
|
if [ -n "$url" ]; then
|
|
|
|
|
comment_body=$(curl -s -H "Authorization: token $KIMI_TOKEN" "$url" 2>/dev/null | \
|
|
|
|
|
python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('body','')[:500])" 2>/dev/null)
|
|
|
|
|
else
|
|
|
|
|
comment_body="(no comment body available)"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Extract issue number from URL
|
|
|
|
|
issue_num=$(echo "$url" | grep -o '/issues/[0-9]*' | grep -o '[0-9]*' || echo "")
|
|
|
|
|
comment_id=$(echo "$url" | grep -o '/comments/[0-9]*' | grep -o '[0-9]*' || echo "")
|
|
|
|
|
|
|
|
|
|
# Dispatch to OpenClaw for response
|
|
|
|
|
prompt="You are KimiClaw, Timmy's apprentice on Gitea. Someone mentioned you.
|
|
|
|
|
|
|
|
|
|
CONTEXT:
|
|
|
|
|
Repo: $repo
|
|
|
|
|
Issue/PR: $title
|
|
|
|
|
Comment: $comment_body
|
|
|
|
|
|
|
|
|
|
YOUR TASK:
|
|
|
|
|
Respond helpfully to the mention. If they asked a question, answer it.
|
|
|
|
|
If they asked you to do something, do it or explain what you need.
|
|
|
|
|
|
|
|
|
|
Post your response as a comment on the issue.
|
|
|
|
|
Gitea API: $BASE, use token from /Users/apayne/.timmy/kimi_gitea_token
|
|
|
|
|
Repo: $repo, Issue: $issue_num"
|
|
|
|
|
|
|
|
|
|
openclaw agent --agent main --message "$prompt" > /dev/null 2>&1 &
|
|
|
|
|
|
|
|
|
|
# Mark notification as read
|
|
|
|
|
curl -s -X PATCH -H "Authorization: token $KIMI_TOKEN" \
|
|
|
|
|
"$BASE/notifications/threads/$nid" > /dev/null 2>&1
|
|
|
|
|
|
|
|
|
|
# Mark as processed
|
|
|
|
|
echo "$nid" >> "$PROCESSED"
|
|
|
|
|
|
|
|
|
|
log "DISPATCHED response for notification $nid"
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
log "Mention check complete."
|