diff --git a/skills/kugetsu/scripts/kugetsu b/skills/kugetsu/scripts/kugetsu index eb0d1a2..e96b43f 100755 --- a/skills/kugetsu/scripts/kugetsu +++ b/skills/kugetsu/scripts/kugetsu @@ -9,8 +9,10 @@ INDEX_FILE="$KUGETSU_DIR/index.json" NOTIFICATIONS_FILE="$KUGETSU_DIR/notifications.json" LOGS_DIR="$KUGETSU_DIR/logs" ENV_DIR="${ENV_DIR:-$KUGETSU_DIR/env}" +QUEUE_FILE="$KUGETSU_DIR/queue.json" MAX_CONCURRENT_AGENTS="${MAX_CONCURRENT_AGENTS:-3}" KUGETSU_VERBOSITY="${KUGETSU_VERBOSITY:-total}" +POLL_INTERVAL="${POLL_INTERVAL:-600}" # Load user config overrides (~/.kugetsu/config) if [ -f "$KUGETSU_DIR/config" ]; then @@ -598,6 +600,116 @@ cmd_logs() { done } +init_queue() { + if [ ! -f "$QUEUE_FILE" ]; then + cat > "$QUEUE_FILE" << 'EOF' +{ + "dev_followups": [], + "user_interrupts": [], + "background": [] +} +EOF + fi +} + +cmd_queue() { + local action="${1:-}" + + init_queue + + case "$action" in + ""|"list") + local total=0 + echo "Queue status:" + for tier in dev_followups user_interrupts background; do + local count=$(python3 -c "import json; d=json.load(open('$QUEUE_FILE')); print(len(d.get('$tier', [])))" 2>/dev/null || echo 0) + total=$((total + count)) + if [ "$count" -eq 0 ]; then + echo " $tier (0): (empty)" + else + echo " $tier ($count):" + python3 -c "import json, sys; d=json.load(open('$QUEUE_FILE')); [print(f' [{t[\"id\"]}] {t[\"message\"][:60]}') for t in d.get('$tier', [])]" 2>/dev/null || echo " (error reading)" + fi + done + echo "Total queued: $total" + ;; + "enqueue") + local tier="${2:-}" + local message="${3:-}" + if [ -z "$tier" ] || [ -z "$message" ]; then + echo "Usage: kugetsu queue enqueue " >&2 + echo " tier: dev_followups, user_interrupts, or background" >&2 + exit 1 + fi + if [[ ! "$tier" =~ ^(dev_followups|user_interrupts|background)$ ]]; then + echo "Error: Invalid tier '$tier'" >&2 + echo " Valid tiers: dev_followups, user_interrupts, background" >&2 + exit 1 + fi + local id="qe-$(date +%s)-$$" + python3 << EOF +import json +with open('$QUEUE_FILE', 'r') as f: + d = json.load(f) +d.setdefault('$tier', []).append({ + 'id': '$id', + 'message': '$message', + 'created': '$(date -Iseconds)' +}) +with open('$QUEUE_FILE', 'w') as f: + json.dump(d, f, indent=2) +print('Enqueued to $tier: [$id] $message') +EOF + ;; + "dequeue") + local tier="${2:-}" + local result=$(python3 << EOF +import json +with open('$QUEUE_FILE', 'r') as f: + d = json.load(f) +tiers = ['dev_followups', 'user_interrupts', 'background'] if not '$tier' else ['$tier'] +for t in tiers: + if d.get(t) and len(d[t]) > 0: + task = d[t].pop(0) + with open('$QUEUE_FILE', 'w') as f: + json.dump(d, f, indent=2) + print(f'{t}|{task["id"]}|{task["message"]}') + break +else: + print('Queue empty') +EOF +) + if [ "$result" = "Queue empty" ]; then + echo "$result" + exit 1 + fi + echo "$result" + ;; + "clear") + cat > "$QUEUE_FILE" << 'EOF' +{ + "dev_followups": [], + "user_interrupts": [], + "background": [] +} +EOF + echo "Queue cleared" + ;; + *) + echo "Usage: kugetsu queue " >&2 + echo "" >&2 + echo "Commands:" >&2 + echo " list Show queue status" >&2 + echo " enqueue Add task to queue" >&2 + echo " dequeue [tier] Remove and return next task" >&2 + echo " clear Clear all queued tasks" >&2 + echo "" >&2 + echo "Tiers: dev_followups, user_interrupts, background" >&2 + exit 1 + ;; + esac +} + cmd_env() { local action="${1:-}" local agent_type="${2:-}" @@ -1526,6 +1638,9 @@ main() { server) cmd_server "$@" ;; + queue) + cmd_queue "$@" + ;; env) cmd_env "$@" ;;