#!/bin/bash # # Sync Queued Contexts to Database # Uploads any locally queued contexts to the central API # Can be run manually or called automatically by hooks # # Usage: bash .claude/hooks/sync-contexts # # Load configuration CLAUDE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" CONFIG_FILE="$CLAUDE_DIR/context-recall-config.env" if [ -f "$CONFIG_FILE" ]; then source "$CONFIG_FILE" fi # Default values API_URL="${CLAUDE_API_URL:-http://172.16.3.30:8001}" QUEUE_DIR="$CLAUDE_DIR/context-queue" PENDING_DIR="$QUEUE_DIR/pending" UPLOADED_DIR="$QUEUE_DIR/uploaded" FAILED_DIR="$QUEUE_DIR/failed" # Exit if no JWT token if [ -z "$JWT_TOKEN" ]; then echo "ERROR: No JWT token available" >&2 exit 1 fi # Create directories if they don't exist mkdir -p "$PENDING_DIR" "$UPLOADED_DIR" "$FAILED_DIR" 2>/dev/null # Check if there are any pending files PENDING_COUNT=$(find "$PENDING_DIR" -type f -name "*.json" 2>/dev/null | wc -l) if [ "$PENDING_COUNT" -eq 0 ]; then # No pending contexts to sync exit 0 fi echo "===================================" echo "Syncing Queued Contexts" echo "===================================" echo "Found $PENDING_COUNT pending context(s)" echo "" # Process each pending file SUCCESS_COUNT=0 FAIL_COUNT=0 for QUEUE_FILE in "$PENDING_DIR"/*.json; do # Skip if no files match [ -e "$QUEUE_FILE" ] || continue FILENAME=$(basename "$QUEUE_FILE") echo "Processing: $FILENAME" # Read the payload PAYLOAD=$(cat "$QUEUE_FILE") # Determine endpoint based on filename if [[ "$FILENAME" == *"_state.json" ]]; then ENDPOINT="${API_URL}/api/project-states" else ENDPOINT="${API_URL}/api/conversation-contexts" fi # Try to POST to API RESPONSE=$(curl -s --max-time 10 -w "\n%{http_code}" \ -X POST "$ENDPOINT" \ -H "Authorization: Bearer ${JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d "$PAYLOAD" 2>/dev/null) HTTP_CODE=$(echo "$RESPONSE" | tail -n1) if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ]; then # Success - move to uploaded directory mv "$QUEUE_FILE" "$UPLOADED_DIR/" echo " ✓ Uploaded successfully" ((SUCCESS_COUNT++)) else # Failed - move to failed directory for manual review mv "$QUEUE_FILE" "$FAILED_DIR/" echo " ✗ Upload failed (HTTP $HTTP_CODE) - moved to failed/" ((FAIL_COUNT++)) fi done echo "" echo "===================================" echo "Sync Complete" echo "===================================" echo "Successful: $SUCCESS_COUNT" echo "Failed: $FAIL_COUNT" echo "" # Clean up old uploaded files (keep last 100) UPLOADED_COUNT=$(find "$UPLOADED_DIR" -type f -name "*.json" 2>/dev/null | wc -l) if [ "$UPLOADED_COUNT" -gt 100 ]; then echo "Cleaning up old uploaded contexts (keeping last 100)..." find "$UPLOADED_DIR" -type f -name "*.json" -printf '%T@ %p\n' | \ sort -n | \ head -n -100 | \ cut -d' ' -f2- | \ xargs rm -f fi exit 0