Initial commit: Kataclysm continuous learning engine v1.0
This commit is contained in:
commit
c402a7ef85
3 files changed
+150
No files matched your search
@@ -0,0 +1,145 @@
|
||||
#!/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
|
||||
Reference in new issue
Block a user