blob: 374238f63bfbb1f09a657781767a6d48115169a4 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#!/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/<SESSION_ID>/
#
# 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 "]"
|