File size: 5,316 Bytes
a9842d5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env bash
# Shadowclaw Startup Script v3.2+ (Fixed)
# Location: /home/kali/shadowclaw-v2/start.sh

set -e

# ---------- Configuration ----------
PROGRAM_NAME="shadowclaw"
PROGRAM_PATH="./$PROGRAM_NAME"
STATE_FILE="shadowclaw.bin"
DATA_DIR="shadowclaw_data"
SOUL_FILE="$DATA_DIR/shadowsoul.md"

# Ollama settings (can be overridden by environment)
OLLAMA_ENDPOINT="${OLLAMA_ENDPOINT:-http://localhost:11434}"
OLLAMA_MODEL="${OLLAMA_MODEL:-qwen2.5:0.5b}"

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color

# ---------- Helper Functions ----------
print_status() { echo -e "${CYAN}[*]${NC} $1"; }
print_success() { echo -e "${GREEN}[βœ“]${NC} $1"; }
print_warning() { echo -e "${YELLOW}[!]${NC} $1"; }
print_error() { echo -e "${RED}[βœ—]${NC} $1"; }

# ---------- Environment Variables for Timeouts ----------
export SHADOWCLAW_CONNECT_TIMEOUT="${SHADOWCLAW_CONNECT_TIMEOUT:-15}"
export SHADOWCLAW_TOTAL_TIMEOUT="${SHADOWCLAW_TOTAL_TIMEOUT:-180}"
export SHADOWCLAW_RETRY_ATTEMPTS="${SHADOWCLAW_RETRY_ATTEMPTS:-5}"

print_status "Timeout settings: connect=${SHADOWCLAW_CONNECT_TIMEOUT}s, total=${SHADOWCLAW_TOTAL_TIMEOUT}s, retries=${SHADOWCLAW_RETRY_ATTEMPTS}"

# ---------- Dependency Checks ----------
print_status "Checking dependencies..."

if ! command -v curl &> /dev/null; then
    print_error "curl not found. Please install curl (sudo apt install curl)."
    exit 1
fi

# ---------- Ollama Availability & Model Check ----------
NO_LLM_MODE=0
FORCE_LLM=0

for arg in "$@"; do
    if [ "$arg" = "--force-llm" ]; then
        FORCE_LLM=1
    fi
done

check_ollama() {
    if ! curl -s --max-time 2 "$OLLAMA_ENDPOINT/api/tags" > /dev/null 2>&1; then
        return 1
    fi
    if ! curl -s "$OLLAMA_ENDPOINT/api/tags" 2>/dev/null | grep -q "\"name\":\"$OLLAMA_MODEL\""; then
        return 2
    fi
    return 0
}

if [ $FORCE_LLM -eq 1 ]; then
    print_warning "--force-llm flag set: will attempt to use LLM even if checks fail."
    NO_LLM_MODE=0
else
    check_ollama
    case $? in
        0)
            print_success "Ollama is reachable and model '$OLLAMA_MODEL' is available."
            ;;
        1)
            print_warning "Ollama not reachable at $OLLAMA_ENDPOINT. Auto-enabling --no-llm mode."
            NO_LLM_MODE=1
            ;;
        2)
            print_warning "Model '$OLLAMA_MODEL' not found in Ollama. Auto-enabling --no-llm mode."
            print_status "Pull it with: ollama pull $OLLAMA_MODEL"
            NO_LLM_MODE=1
            ;;
    esac
fi

# ---------- Binary Existence & Permissions ----------
cd "$(dirname "$0")" || { print_error "Failed to change to script directory."; exit 1; }

if [ ! -f "$PROGRAM_PATH" ]; then
    print_error "Binary '$PROGRAM_NAME' not found in current directory."
    print_status "Compiling Shadowclaw..."
    if [ -f "shadowclaw.c" ] && [ -f "interpreter.c" ] && [ -f "cJSON.c" ]; then
        make clean 2>/dev/null || true
        if make; then
            print_success "Compilation successful."
        else
            print_error "Compilation failed. Check dependencies (libcurl, libpthread, readline)."
            exit 1
        fi
    else
        print_error "Source files missing. Please ensure shadowclaw.c, interpreter.c, cJSON.c are present."
        exit 1
    fi
fi

if [ ! -x "$PROGRAM_PATH" ]; then
    print_warning "Binary not executable. Fixing permissions..."
    chmod +x "$PROGRAM_PATH"
fi

# ---------- Environment Setup ----------
if [ ! -d "$DATA_DIR" ]; then
    mkdir -p "$DATA_DIR"
    print_success "Created data directory: $DATA_DIR"
fi

# ---------- Display Information (Full ASCII Banner) ----------
clear
echo -e "${BOLD}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BOLD}β•‘  ____  _               _                   _                 β•‘${NC}"
echo -e "${BOLD}β•‘ / ___|| |__   __ _  __| | _____      _____| | __ ___      __ β•‘${NC}"
echo -e "${BOLD}β•‘ \___ \| '_ \ / _\` |/ _\` |/ _ \ \ /\ / / __| |/ _\` \ \ /\ / / β•‘${NC}"
echo -e "${BOLD}β•‘  ___) | | | | (_| | (_| | (_) \ V  V / (__| | (_| |\ V  V /  β•‘${NC}"
echo -e "${BOLD}β•‘ |____/|_| |_|\__,_|\__,_|\___/ \_/\_/ \___|_|\__,_| \_/\_/   β•‘${NC}"
echo -e "${BOLD}β•‘                  Shadowclaw AI Agent v3.4                    β•‘${NC}"
echo -e "${BOLD}β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${NC}"
echo ""
print_status "Working directory: $(pwd)"
print_status "State file: $STATE_FILE"
print_status "Soul memory: $SOUL_FILE"
if [ $NO_LLM_MODE -eq 1 ]; then
    print_warning "Starting in NO-LLM mode (local interpreter only)."
else
    print_success "LLM mode enabled (model: $OLLAMA_MODEL)."
fi
echo ""

# ---------- Build final argument list ----------
ARGS=()
if [ $NO_LLM_MODE -eq 1 ]; then
    ARGS+=("--no-llm")
fi
for arg in "$@"; do
    if [ "$arg" != "--force-llm" ]; then
        ARGS+=("$arg")
    fi
done

# ---------- Launch ----------
print_success "Launching Shadowclaw..."
exec "$PROGRAM_PATH" "${ARGS[@]}"