diff --git a/scripts/kimi-loop.sh b/scripts/kimi-loop.sh new file mode 100755 index 00000000..978c98bd --- /dev/null +++ b/scripts/kimi-loop.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# kimi-loop.sh — Efficient Gitea issue polling for Kimi agent +# +# Fetches only Kimi-assigned issues using proper query parameters, +# avoiding the need to pull all unassigned tickets and filter in Python. +# +# Usage: +# ./scripts/kimi-loop.sh +# +# Exit codes: +# 0 — Found work for Kimi +# 1 — No work available + +set -euo pipefail + +# Configuration +GITEA_API="${TIMMY_GITEA_API:-${GITEA_API:-http://143.198.27.163:3000/api/v1}}" +REPO_SLUG="${REPO_SLUG:-rockachopa/Timmy-time-dashboard}" +TOKEN_FILE="${HOME}/.hermes/gitea_token" +WORKTREE_DIR="${HOME}/worktrees" + +# Ensure token exists +if [[ ! -f "$TOKEN_FILE" ]]; then + echo "ERROR: Gitea token not found at $TOKEN_FILE" >&2 + exit 1 +fi + +TOKEN=$(cat "$TOKEN_FILE") + +# Function to make authenticated Gitea API calls +gitea_api() { + local endpoint="$1" + local method="${2:-GET}" + + curl -s -X "$method" \ + -H "Authorization: token $TOKEN" \ + -H "Content-Type: application/json" \ + "$GITEA_API/repos/$REPO_SLUG/$endpoint" +} + +# Efficiently fetch only Kimi-assigned issues (fixes the filter bug) +# Uses assignee parameter to filter server-side instead of pulling all issues +get_kimi_issues() { + gitea_api "issues?state=open&assignee=kimi&sort=created&order=asc&limit=10" +} + +# Main execution +main() { + echo "🤖 Kimi loop: Checking for assigned work..." + + # Fetch Kimi's issues efficiently (server-side filtering) + issues=$(get_kimi_issues) + + # Count issues using jq + count=$(echo "$issues" | jq '. | length') + + if [[ "$count" -eq 0 ]]; then + echo "📭 No issues assigned to Kimi. Idle." + exit 1 + fi + + echo "📝 Found $count issue(s) assigned to Kimi:" + echo "$issues" | jq -r '.[] | " #\(.number): \(.title)"' + + # TODO: Process each issue (create worktree, run task, create PR) + # For now, just report availability + echo "✅ Kimi has work available." + exit 0 +} + +# Handle script being sourced vs executed +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + main "$@" +fi \ No newline at end of file