From 5399d709c43009581a54432ab9a99f5d9608690e Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Wed, 18 Feb 2026 20:09:12 +0100 Subject: [PATCH] Replace PID-based temp files with AGENT_ID env var - Simplified Claude hooks to use AGENT_ID instead of PID lookup - Updated 9p-read-inbox to use AGENT_ID env var - Removed temporary file creation in tmux.go - Much cleaner and more reliable approach --- claude/hooks/anvillm-state-idle.sh | 37 ++++++++------------------- claude/hooks/anvillm-state-running.sh | 35 ++++++++----------------- internal/backend/tmux/tmux.go | 11 -------- mkfile | 1 + scripts/9p-read-inbox | 6 +---- 5 files changed, 23 insertions(+), 67 deletions(-) diff --git a/claude/hooks/anvillm-state-idle.sh b/claude/hooks/anvillm-state-idle.sh index fd45077..9332a99 100644 --- a/claude/hooks/anvillm-state-idle.sh +++ b/claude/hooks/anvillm-state-idle.sh @@ -1,37 +1,22 @@ #!/bin/sh -echo "$(date '+%Y-%m-%d %H:%M:%S') - Hook fired: Stop (PPID=$PPID)" >> /tmp/claude-hooks.log +echo "$(date '+%Y-%m-%d %H:%M:%S') - Hook fired: Stop" >> /tmp/claude-hooks.log cat > /dev/null -pid=$PPID -while [ $pid -gt 1 ]; do - if ps -p $pid -o comm= | grep -q claude; then - break - fi - pid=$(ps -p $pid -o ppid= | tr -d ' ') -done -if [ $pid -le 1 ]; then - echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Claude PID not found" >> /tmp/claude-hooks.log + +if [ -z "$AGENT_ID" ]; then + echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: AGENT_ID not set" >> /tmp/claude-hooks.log exit 0 fi -echo "$(date '+%Y-%m-%d %H:%M:%S') - Found Claude PID: $pid" >> /tmp/claude-hooks.log -# Read session ID from filesystem directly (9p read doesn't work in sandbox) -ns_path="/tmp/ns.$USER.:0/anvillm-session-id-$pid" -if [ ! -f "$ns_path" ]; then - ns_path="/tmp/ns.$USER/anvillm-session-id-$pid" -fi -session=$(cat "$ns_path" 2>/dev/null) -if [ -z "$session" ]; then - echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Session ID not found for PID $pid" >> /tmp/claude-hooks.log - exit 0 -fi -echo "$(date '+%Y-%m-%d %H:%M:%S') - Found session ID: $session" >> /tmp/claude-hooks.log -if echo idle | 9p write agent/$session/state 2>>/tmp/claude-hooks.log; then - echo "$(date '+%Y-%m-%d %H:%M:%S') - SUCCESS: Wrote 'idle' to agent/$session/state" >> /tmp/claude-hooks.log + +echo "$(date '+%Y-%m-%d %H:%M:%S') - Using AGENT_ID: $AGENT_ID" >> /tmp/claude-hooks.log + +if echo idle | 9p write agent/$AGENT_ID/state 2>>/tmp/claude-hooks.log; then + echo "$(date '+%Y-%m-%d %H:%M:%S') - SUCCESS: Wrote 'idle' to agent/$AGENT_ID/state" >> /tmp/claude-hooks.log # Check for pending messages in inbox - if [ -n "$(9p ls agent/$session/inbox/ 2>/dev/null)" ]; then + if [ -n "$(9p ls agent/$AGENT_ID/inbox/ 2>/dev/null)" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - INBOX: Pending messages detected" >> /tmp/claude-hooks.log echo "[INBOX] You have pending messages. Check with: 9p-read-inbox" fi else - echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Failed to write to agent/$session/state" >> /tmp/claude-hooks.log + echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Failed to write to agent/$AGENT_ID/state" >> /tmp/claude-hooks.log fi diff --git a/claude/hooks/anvillm-state-running.sh b/claude/hooks/anvillm-state-running.sh index acfd8de..f114285 100644 --- a/claude/hooks/anvillm-state-running.sh +++ b/claude/hooks/anvillm-state-running.sh @@ -1,31 +1,16 @@ #!/bin/sh -echo "$(date '+%Y-%m-%d %H:%M:%S') - Hook fired: UserPromptSubmit (PPID=$PPID)" >> /tmp/claude-hooks.log +echo "$(date '+%Y-%m-%d %H:%M:%S') - Hook fired: UserPromptSubmit" >> /tmp/claude-hooks.log cat > /dev/null -pid=$PPID -while [ $pid -gt 1 ]; do - if ps -p $pid -o comm= | grep -q claude; then - break - fi - pid=$(ps -p $pid -o ppid= | tr -d ' ') -done -if [ $pid -le 1 ]; then - echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Claude PID not found" >> /tmp/claude-hooks.log + +if [ -z "$AGENT_ID" ]; then + echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: AGENT_ID not set" >> /tmp/claude-hooks.log exit 0 fi -echo "$(date '+%Y-%m-%d %H:%M:%S') - Found Claude PID: $pid" >> /tmp/claude-hooks.log -# Read session ID from filesystem directly (9p read doesn't work in sandbox) -ns_path="/tmp/ns.$USER.:0/anvillm-session-id-$pid" -if [ ! -f "$ns_path" ]; then - ns_path="/tmp/ns.$USER/anvillm-session-id-$pid" -fi -session=$(cat "$ns_path" 2>/dev/null) -if [ -z "$session" ]; then - echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Session ID not found for PID $pid" >> /tmp/claude-hooks.log - exit 0 -fi -echo "$(date '+%Y-%m-%d %H:%M:%S') - Found session ID: $session" >> /tmp/claude-hooks.log -if echo running | 9p write agent/$session/state 2>>/tmp/claude-hooks.log; then - echo "$(date '+%Y-%m-%d %H:%M:%S') - SUCCESS: Wrote 'running' to agent/$session/state" >> /tmp/claude-hooks.log + +echo "$(date '+%Y-%m-%d %H:%M:%S') - Using AGENT_ID: $AGENT_ID" >> /tmp/claude-hooks.log + +if echo running | 9p write agent/$AGENT_ID/state 2>>/tmp/claude-hooks.log; then + echo "$(date '+%Y-%m-%d %H:%M:%S') - SUCCESS: Wrote 'running' to agent/$AGENT_ID/state" >> /tmp/claude-hooks.log else - echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Failed to write to agent/$session/state" >> /tmp/claude-hooks.log + echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Failed to write to agent/$AGENT_ID/state" >> /tmp/claude-hooks.log fi diff --git a/internal/backend/tmux/tmux.go b/internal/backend/tmux/tmux.go index 0d0bd0b..222fe64 100644 --- a/internal/backend/tmux/tmux.go +++ b/internal/backend/tmux/tmux.go @@ -363,17 +363,6 @@ func (b *Backend) CreateSession(ctx context.Context, opts backend.SessionOptions } sess.idleCond = sync.NewCond(&sess.mu) - // Write session ID to file for hook access (if kiro-cli or claude backend) - if (b.cfg.Name == "kiro-cli" || b.cfg.Name == "claude") && pid != 0 { - ns := client.Namespace() - sessionIDFile := filepath.Join(ns, fmt.Sprintf("anvillm-session-id-%d", pid)) - if err := os.WriteFile(sessionIDFile, []byte(id), 0644); err != nil { - debug.Log("[session %s] failed to write session ID file: %v", id, err) - } else { - debug.Log("[session %s] wrote session ID file: %s", id, sessionIDFile) - } - } - // 10. Start reader goroutine go sess.reader() diff --git a/mkfile b/mkfile index 390aa7f..f7fcea7 100644 --- a/mkfile +++ b/mkfile @@ -7,6 +7,7 @@ build:V: go build -o $INSTALL_PATH/Assist ./cmd/Assist go build -o $INSTALL_PATH/anvillm ./cmd/anvillm go build -o $INSTALL_PATH/anvilweb ./cmd/anvilweb + go build -o $INSTALL_PATH/anvilmcp ./cmd/anvilmcp cp scripts/Alog $INSTALL_PATH/Alog chmod 0755 $INSTALL_PATH/Alog cp scripts/anvillm-skills $INSTALL_PATH/anvillm-skills diff --git a/scripts/9p-read-inbox b/scripts/9p-read-inbox index e3c68e6..9896f3c 100755 --- a/scripts/9p-read-inbox +++ b/scripts/9p-read-inbox @@ -10,12 +10,8 @@ if [ "$1" = "--help" ]; then exit 0 fi -# Get agent ID from namespace file -KIRO_PID=$(ps -o ppid= -p $PPID | tr -d ' ') -AGENT_ID=$(cat $(namespace)/anvillm-session-id-$KIRO_PID 2>/dev/null) - if [ -z "$AGENT_ID" ]; then - echo "Error: Cannot determine agent ID" >&2 + echo "Error: AGENT_ID environment variable not set" >&2 exit 1 fi