aboutsummaryrefslogtreecommitdiffstats
path: root/claude-vm-sessions
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 "]"