#!/bin/bash # # claude-vm-sessions - CTASK_SESSIONS provider for claude-vm instances # # Lists all project sessions from ~/.config/claude-vm/instance/*/projects/*/*.jsonl # Tasks are stored in ~/.config/claude-vm/instance/*/tasks// # # Usage: export CTASK_SESSIONS=/path/to/claude-vm-sessions set -e # Get real user home directory (handle sudo case) if [ -n "$SUDO_USER" ]; then USER_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6) else USER_HOME="$HOME" fi CONFIG_DIR="$USER_HOME/.config/claude-vm/instance" # Find all session jsonl files with modification times # Format: TIMESTAMP|PATH # Exclude subagent sessions (containing /subagents/ in path) sessions=$(find "$CONFIG_DIR" -type f -path "*/projects/*/*.jsonl" ! -path "*/subagents/*" -printf "%T@|%p\n" 2>/dev/null | sort -t'|' -k1 -rn || true) # Build JSON array echo "[" first=true while IFS='|' read -r mtime session_file; do [ -z "$session_file" ] && continue # Extract components from path: .../instance/INSTANCE_NAME/projects/PROJECT_ID/SESSION_ID.jsonl relative_path="${session_file#$CONFIG_DIR/}" instance_name="${relative_path%%/*}" remaining="${relative_path#*/projects/}" project_id="${remaining%%/*}" session_filename="${remaining#*/}" session_id="${session_filename%.jsonl}" # Build tasks directory path tasks_path="$CONFIG_DIR/$instance_name/tasks/$session_id" # Create tasks directory if it doesn't exist mkdir -p "$tasks_path" # Get human-readable modification time with relative time if [ -r "$session_file" ]; then abs_time=$(stat -c '%y' "$session_file" 2>/dev/null | cut -d'.' -f1 || echo "Unknown time") # Calculate relative time now=$(date +%s) diff=$((now - ${mtime%.*})) if [ $diff -lt 60 ]; then relative="now" elif [ $diff -lt 3600 ]; then mins=$((diff / 60)) [ $mins -eq 1 ] && relative="1 minute ago" || relative="$mins minutes ago" elif [ $diff -lt 86400 ]; then hours=$((diff / 3600)) [ $hours -eq 1 ] && relative="1 hour ago" || relative="$hours hours ago" elif [ $diff -lt 604800 ]; then days=$((diff / 86400)) [ $days -eq 1 ] && relative="1 day ago" || relative="$days days ago" elif [ $diff -lt 2592000 ]; then weeks=$((diff / 604800)) [ $weeks -eq 1 ] && relative="1 week ago" || relative="$weeks weeks ago" elif [ $diff -lt 31536000 ]; then months=$((diff / 2592000)) [ $months -eq 1 ] && relative="1 month ago" || relative="$months months ago" else years=$((diff / 31536000)) [ $years -eq 1 ] && relative="1 year ago" || relative="$years years ago" fi description="$abs_time ($relative)" else description="Unknown time" fi # Remove claude-vm- prefix from instance name display_instance="${instance_name#claude-vm-}" # Truncate session ID to 8 hex digits session_id_short="${session_id:0:8}" # Session name: instance/session-id (truncated) name="$display_instance/$session_id_short" # Add comma separator if [ "$first" = true ]; then first=false else echo "," fi # Output JSON object (manually escape quotes and backslashes in strings) name_escaped="${name//\\/\\\\}" name_escaped="${name_escaped//\"/\\\"}" path_escaped="${tasks_path//\\/\\\\}" path_escaped="${path_escaped//\"/\\\"}" desc_escaped="${description//\\/\\\\}" desc_escaped="${desc_escaped//\"/\\\"}" printf ' {"name":"%s","path":"%s","description":"%s"}' \ "$name_escaped" \ "$path_escaped" \ "$desc_escaped" done <<< "$sessions" echo "" echo "]"