From 00d25936a52078043b1a2ee80ed6c54518256bae Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Fri, 20 Mar 2026 15:40:51 +0100 Subject: [PATCH] Remove anvillm-notify scripts --- mkfile | 2 - scripts/anvillm-inbox-notify | 152 ----------------------------------- scripts/anvillm-notify | 43 ---------- 3 files changed, 197 deletions(-) delete mode 100755 scripts/anvillm-inbox-notify delete mode 100755 scripts/anvillm-notify diff --git a/mkfile b/mkfile index 6de269f..dfe3b12 100644 --- a/mkfile +++ b/mkfile @@ -4,8 +4,6 @@ all:V: install build:V: go build -o $INSTALL_PATH/anvillm . - cp scripts/anvillm-notify $INSTALL_PATH/anvillm-notify - chmod 0755 $INSTALL_PATH/anvillm-notify cp scripts/anvillm-hook $INSTALL_PATH/anvillm-hook chmod 0755 $INSTALL_PATH/anvillm-hook cp scripts/anvilspawn $INSTALL_PATH/anvilspawn diff --git a/scripts/anvillm-inbox-notify b/scripts/anvillm-inbox-notify deleted file mode 100755 index 19b6d50..0000000 --- a/scripts/anvillm-inbox-notify +++ /dev/null @@ -1,152 +0,0 @@ -#!/bin/bash -# anvillm-inbox-notify — Desktop notification daemon for AnviLLM inbox messages. -# -# Monitors the AnviLLM event stream for incoming messages addressed to the human -# user and fires desktop notifications for configurable message types. -# -# Usage: -# anvillm-inbox-notify [--help] -# -# Configuration (~/.config/anvillm/notifications.yaml): -# notify_on: -# - APPROVAL_REQUEST -# - REVIEW_REQUEST -# -# Default notify_on types: APPROVAL_REQUEST, REVIEW_REQUEST -# Add QUERY_REQUEST, PROMPT_RESPONSE, etc. as desired. -# -# State file (deduplication): -# ~/.local/share/anvillm/notified-ids.txt -# Message IDs are persisted here so restarts do not re-notify. -# -# Environment: -# NAMESPACE — 9P namespace path (default: /tmp/ns.$USER.:0) - -set -euo pipefail - -# ── help ────────────────────────────────────────────────────────────────────── - -if [[ "${1:-}" == "--help" ]]; then - cat <<'EOF' -anvillm-inbox-notify — Desktop notification daemon for AnviLLM inbox messages. - -USAGE - anvillm-inbox-notify [--help] - -CONFIGURATION - ~/.config/anvillm/notifications.yaml - notify_on: - - APPROVAL_REQUEST # default - - REVIEW_REQUEST # default - - QUERY_REQUEST # optional - -STATE FILE - ~/.local/share/anvillm/notified-ids.txt - Persists seen message IDs across restarts to prevent duplicate notifications. - -ENVIRONMENT - NAMESPACE 9P namespace directory (default: /tmp/ns.$USER.:0) -EOF - exit 0 -fi - -# ── paths ───────────────────────────────────────────────────────────────────── - -CONFIG_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/anvillm/notifications.yaml" -STATE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/anvillm" -STATE_FILE="$STATE_DIR/notified-ids.txt" - -mkdir -p "$STATE_DIR" -touch "$STATE_FILE" - -# ── namespace ───────────────────────────────────────────────────────────────── - -NAMESPACE="${NAMESPACE:-/tmp/ns.${USER}.:0}" -export NAMESPACE - -# ── load config ─────────────────────────────────────────────────────────────── - -# Parse notify_on list from YAML config, falling back to defaults. -# Expected YAML format (subset): -# notify_on: -# - APPROVAL_REQUEST -# - REVIEW_REQUEST -load_notify_on() { - if [[ -f "$CONFIG_FILE" ]]; then - # Extract lines under notify_on: that start with " - " - awk '/^notify_on:/{found=1; next} found && /^ - /{gsub(/^ - /, ""); print; next} found && /^[^ ]/{exit}' "$CONFIG_FILE" - fi -} - -NOTIFY_ON_ARRAY=() -while IFS= read -r line; do - [[ -n "$line" ]] && NOTIFY_ON_ARRAY+=("$line") -done < <(load_notify_on) - -# Fall back to defaults if config is absent or empty. -if [[ ${#NOTIFY_ON_ARRAY[@]} -eq 0 ]]; then - NOTIFY_ON_ARRAY=("APPROVAL_REQUEST" "REVIEW_REQUEST") -fi - -# Build a jq expression for type matching: (.data.type | IN("T1","T2",...)) -JQ_TYPES=$(printf '"%s",' "${NOTIFY_ON_ARRAY[@]}") -JQ_TYPES="${JQ_TYPES%,}" # strip trailing comma - -echo "anvillm-inbox-notify: watching for types: ${NOTIFY_ON_ARRAY[*]}" -echo "anvillm-inbox-notify: namespace: $NAMESPACE" - -# ── helpers ─────────────────────────────────────────────────────────────────── - -already_notified() { - grep -qxF "$1" "$STATE_FILE" 2>/dev/null -} - -mark_notified() { - echo "$1" >> "$STATE_FILE" -} - -send_notification() { - local from="$1" subject="$2" body="$3" msg_type="$4" - local urgency="normal" - if [[ "$msg_type" == "APPROVAL_REQUEST" ]]; then - urgency="critical" - fi - notify-send \ - --urgency="$urgency" \ - --app-name="AnviLLM" \ - --icon=dialog-information \ - "AnviLLM [${from}]: ${subject}" \ - "${body}" -} - -# ── event loop ──────────────────────────────────────────────────────────────── - -# Stream events and filter with jq. The jq filter selects UserRecv events -# addressed to the human user whose message type is in the notify_on list. -# -# Full event shape: -# {"id":"...", "ts":..., "source":"user", "type":"UserRecv", -# "data":{"id":"...", "from":"agent-id", "to":"user", -# "type":"APPROVAL_REQUEST", "subject":"...", "body":"..."}} - -JQ_FILTER=" - select( - .type == \"UserRecv\" - and .data.to == \"user\" - and (.data.type | IN(${JQ_TYPES})) - ) -" - -9p read anvillm/events | jq --unbuffered -c "$JQ_FILTER" | while IFS= read -r event; do - msg_id=$(printf '%s' "$event" | jq -r '.data.id // .id') - from=$(printf '%s' "$event" | jq -r '.data.from // "unknown"') - subject=$(printf '%s' "$event" | jq -r '.data.subject // "(no subject)"') - body=$(printf '%s' "$event" | jq -r '.data.body // ""') - msg_type=$(printf '%s' "$event"| jq -r '.data.type // "UNKNOWN"') - - if already_notified "$msg_id"; then - continue - fi - - send_notification "$from" "$subject" "$body" "$msg_type" && mark_notified "$msg_id" -done diff --git a/scripts/anvillm-notify b/scripts/anvillm-notify deleted file mode 100755 index 746cda7..0000000 --- a/scripts/anvillm-notify +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh - -# React to anvillm events and notify on running->idle transitions - -get_alias() { - 9p read "anvillm/$1/alias" 2>/dev/null -} - -get_cwd() { - 9p read "anvillm/$1/cwd" 2>/dev/null -} - -get_summary() { - 9p read "anvillm/$1/summary" 2>/dev/null -} - -9p read anvillm/events | while read -r line; do - type=$(echo "$line" | jq -r '.type // empty') - - case "$type" in - StateChange) - old_state=$(echo "$line" | jq -r '.data.old_state // empty') - new_state=$(echo "$line" | jq -r '.data.new_state // empty') - agent=$(echo "$line" | jq -r '.source // empty') - - if [ "$old_state" = "running" ] && [ "$new_state" = "idle" ]; then - name=$(get_alias "$agent") - [ -z "$name" ] && name=$agent - cwd=$(get_cwd "$agent") - heading=$(basename "$cwd") - summary=$(get_summary "$agent") - [ -z "$summary" ] && summary="completed" - notify-send "$heading ($name)" "$summary" - fi - ;; - UserRecv) - from=$(echo "$line" | jq -r '.data.from // empty') - subject=$(echo "$line" | jq -r '.data.subject // empty') - body=$(echo "$line" | jq -r '.data.body // empty') - notify-send "Message from $from" "$subject" - ;; - esac -done