feat(kugetsu): add queue infrastructure for autonomous PM
This commit is contained in:
@@ -9,8 +9,10 @@ INDEX_FILE="$KUGETSU_DIR/index.json"
|
|||||||
NOTIFICATIONS_FILE="$KUGETSU_DIR/notifications.json"
|
NOTIFICATIONS_FILE="$KUGETSU_DIR/notifications.json"
|
||||||
LOGS_DIR="$KUGETSU_DIR/logs"
|
LOGS_DIR="$KUGETSU_DIR/logs"
|
||||||
ENV_DIR="${ENV_DIR:-$KUGETSU_DIR/env}"
|
ENV_DIR="${ENV_DIR:-$KUGETSU_DIR/env}"
|
||||||
|
QUEUE_FILE="$KUGETSU_DIR/queue.json"
|
||||||
MAX_CONCURRENT_AGENTS="${MAX_CONCURRENT_AGENTS:-3}"
|
MAX_CONCURRENT_AGENTS="${MAX_CONCURRENT_AGENTS:-3}"
|
||||||
KUGETSU_VERBOSITY="${KUGETSU_VERBOSITY:-total}"
|
KUGETSU_VERBOSITY="${KUGETSU_VERBOSITY:-total}"
|
||||||
|
POLL_INTERVAL="${POLL_INTERVAL:-600}"
|
||||||
|
|
||||||
# Load user config overrides (~/.kugetsu/config)
|
# Load user config overrides (~/.kugetsu/config)
|
||||||
if [ -f "$KUGETSU_DIR/config" ]; then
|
if [ -f "$KUGETSU_DIR/config" ]; then
|
||||||
@@ -598,6 +600,116 @@ cmd_logs() {
|
|||||||
done
|
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 <tier> <message>" >&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 <list|enqueue|dequeue|clear>" >&2
|
||||||
|
echo "" >&2
|
||||||
|
echo "Commands:" >&2
|
||||||
|
echo " list Show queue status" >&2
|
||||||
|
echo " enqueue <tier> <msg> 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() {
|
cmd_env() {
|
||||||
local action="${1:-}"
|
local action="${1:-}"
|
||||||
local agent_type="${2:-}"
|
local agent_type="${2:-}"
|
||||||
@@ -1526,6 +1638,9 @@ main() {
|
|||||||
server)
|
server)
|
||||||
cmd_server "$@"
|
cmd_server "$@"
|
||||||
;;
|
;;
|
||||||
|
queue)
|
||||||
|
cmd_queue "$@"
|
||||||
|
;;
|
||||||
env)
|
env)
|
||||||
cmd_env "$@"
|
cmd_env "$@"
|
||||||
;;
|
;;
|
||||||
|
|||||||
Reference in New Issue
Block a user