146 lines
5.5 KiB
Bash
Executable File
146 lines
5.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# ====================================================
|
|
# KATA CLI - OPEN THE WIRE ENGINE
|
|
# ====================================================
|
|
|
|
SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
|
|
STATE_FILE="$SCRIPT_DIR/.kata_state"
|
|
|
|
# Load environment securely
|
|
if [ -f "$SCRIPT_DIR/.env" ]; then
|
|
export $(grep -v '^#' "$SCRIPT_DIR/.env" | xargs)
|
|
fi
|
|
|
|
API_URL="https://api.groq.com/openai/v1/chat/completions"
|
|
MODEL="openai/gpt-oss-20b"
|
|
|
|
# Ensure API key is configured
|
|
if [ -z "$GROQ_API_KEY" ]; then
|
|
echo "Error: GROQ_API_KEY is not defined in $SCRIPT_DIR/.env"
|
|
exit 1
|
|
fi
|
|
|
|
COMMAND=$1
|
|
|
|
case $COMMAND in
|
|
start)
|
|
echo "Initializing new Kata environment..."
|
|
|
|
# Scenarios: "Topic | Break Command | Goal | Telemetry Command"
|
|
SCENARIOS=(
|
|
"File Permissions|sudo chmod 000 /sandbox/test.txt|Fix permissions on /sandbox/test.txt to 644|ls -la /sandbox/test.txt"
|
|
"Hidden Files|touch /sandbox/.secret && sudo chmod 000 /sandbox/.secret|Fix permissions on /sandbox/.secret to 644|ls -la /sandbox/.secret"
|
|
)
|
|
|
|
# Pick random scenario and parse using pipe delimiter
|
|
RANDOM_SCENARIO=${SCENARIOS[$RANDOM % ${#SCENARIOS[@]}]}
|
|
IFS='|' read -r TOPIC BREAK_CMD GOAL TELEMETRY <<< "$RANDOM_SCENARIO"
|
|
|
|
# Save active scenario to state file
|
|
echo "GOAL=\"$GOAL\"" > "$STATE_FILE"
|
|
echo "TELEMETRY=\"$TELEMETRY\"" >> "$STATE_FILE"
|
|
|
|
PROMPT="Generate a short, realistic sysadmin troubleshooting scenario where a Linux administrator broke '$TOPIC' using the command: '$BREAK_CMD'. Give it a title and a brief problem statement."
|
|
|
|
PAYLOAD=$(jq -n --arg model "$MODEL" --arg prompt "$PROMPT" '{model: $model, messages: [{"role": "user", "content": $prompt}], stream: false}')
|
|
|
|
RESPONSE=$(curl -s -X POST "$API_URL" -H "Content-Type: application/json" -H "Authorization: Bearer $GROQ_API_KEY" -d "$PAYLOAD")
|
|
|
|
if echo "$RESPONSE" | jq -e '.error' > /dev/null 2>&1; then
|
|
echo "API request failed:" && echo "$RESPONSE" | jq -r '.error.message // .' && exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "--- INCOMING TRANSMISSION ---"
|
|
echo "$RESPONSE" | jq -r '.choices[0].message.content // empty'
|
|
echo "-----------------------------"
|
|
echo ""
|
|
|
|
echo "[Mutation] Applying chaotic state..."
|
|
sudo mkdir -p /sandbox
|
|
sudo chown zimasu:zimasu /sandbox
|
|
echo "critical config" | sudo tee /sandbox/test.txt > /dev/null
|
|
eval "$BREAK_CMD"
|
|
echo "Environment mutated. Good luck."
|
|
echo "Run 'kata check' when you think you have solved it."
|
|
;;
|
|
|
|
check)
|
|
if [ ! -f "$STATE_FILE" ]; then
|
|
echo "No active kata found. Run 'kata start' first."
|
|
exit 1
|
|
fi
|
|
|
|
# Load active scenario goals
|
|
source "$STATE_FILE"
|
|
|
|
echo "[Telemetry] Harvesting system state..."
|
|
CURRENT_STATE=$(eval "$TELEMETRY" 2>&1)
|
|
|
|
DIAGNOSTIC_PROMPT="You are a strict Linux grading engine.
|
|
The user's goal was: $GOAL
|
|
Here is the exact current system telemetry (output of '$TELEMETRY'):
|
|
$CURRENT_STATE
|
|
|
|
Did the user successfully fix the problem?
|
|
Format your response starting with either 'PASS' or 'FAIL', followed by a short explanation."
|
|
|
|
PAYLOAD=$(jq -n --arg model "$MODEL" --arg prompt "$DIAGNOSTIC_PROMPT" '{model: $model, messages: [{"role": "user", "content": $prompt}], stream: false}')
|
|
|
|
RESPONSE=$(curl -s -X POST "$API_URL" -H "Content-Type: application/json" -H "Authorization: Bearer $GROQ_API_KEY" -d "$PAYLOAD")
|
|
|
|
if echo "$RESPONSE" | jq -e '.error' > /dev/null 2>&1; then
|
|
echo "Grading API request failed:" && echo "$RESPONSE" | jq -r '.error.message // .' && exit 1
|
|
fi
|
|
|
|
DIAGNOSIS=$(echo "$RESPONSE" | jq -r '.choices[0].message.content // "Error"')
|
|
|
|
echo ""
|
|
echo "--- AI AUDIT RESULT ---"
|
|
echo "$DIAGNOSIS"
|
|
echo "-----------------------"
|
|
|
|
if [[ "$DIAGNOSIS" == *"PASS"* ]]; then
|
|
echo "Audit passed. Clearing state."
|
|
rm "$STATE_FILE"
|
|
sudo rm -rf /sandbox
|
|
echo "Cleanup complete. You are ready for the next kata."
|
|
fi
|
|
;;
|
|
help)
|
|
if [ ! -f "$STATE_FILE" ]; then
|
|
echo "No active kata found. Run 'kata start' first."
|
|
exit 1
|
|
fi
|
|
|
|
# Load active scenario goals
|
|
source "$STATE_FILE"
|
|
|
|
echo "[Help] Requesting tactical assistance from Groq..."
|
|
|
|
HELP_PROMPT="The user is currently stuck on a Linux troubleshooting challenge.
|
|
Their goal is: $GOAL
|
|
Provide a brief, conceptual hint or point them to the right Linux tool (e.g., man pages, specific commands) to use. Do not just give them the exact copy-paste solution immediately. Be encouraging."
|
|
|
|
PAYLOAD=$(jq -n --arg model "$MODEL" --arg prompt "$HELP_PROMPT" '{model: $model, messages: [{"role": "user", "content": $prompt}], stream: false}')
|
|
|
|
RESPONSE=$(curl -s -X POST "$API_URL" -H "Content-Type: application/json" -H "Authorization: Bearer $GROQ_API_KEY" -d "$PAYLOAD")
|
|
|
|
if echo "$RESPONSE" | jq -e '.error' > /dev/null 2>&1; then
|
|
echo "API request failed:" && echo "$RESPONSE" | jq -r '.error.message // .' && exit 1
|
|
fi
|
|
|
|
HINT=$(echo "$RESPONSE" | jq -r '.choices[0].message.content // "Error generating hint."')
|
|
|
|
echo ""
|
|
echo "--- TACTICAL HINT ---"
|
|
echo "$HINT"
|
|
echo "---------------------"
|
|
;;
|
|
*)
|
|
echo "Usage: kata {start|check|help}"
|
|
exit 1
|
|
;;
|
|
esac
|