-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathorchestrate-scheduler.sh
More file actions
executable file
·122 lines (98 loc) · 3.15 KB
/
orchestrate-scheduler.sh
File metadata and controls
executable file
·122 lines (98 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BIOME_URL="${BIOME_URL:-http://localhost:3021}"
BIOME_API_KEY_VALUE="${HARNESS_BIOME_API_KEY:-${BIOME_API_KEY:-}}"
TARGET_PANE="${TARGET_PANE:-orchestrator}"
COMMAND_TEXT="${COMMAND_TEXT:-\$orchestrate}"
INTERVAL_SECONDS="${INTERVAL_SECONDS:-300}"
ENTER_DELAY_MS="${ENTER_DELAY_MS:-150}"
SKILL_CONFIRM_DELAY_MS="${SKILL_CONFIRM_DELAY_MS:-300}"
log() {
printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*"
}
log_error() {
printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >&2
}
biome_curl() {
if [[ -n "$BIOME_API_KEY_VALUE" ]]; then
curl -fsS -H "X-API-Key: $BIOME_API_KEY_VALUE" "$@"
else
curl -fsS "$@"
fi
}
resolve_pane_id() {
local panes_json pane_id
if ! panes_json="$(biome_curl "$BIOME_URL/panes")"; then
log_error "failed to query panes from '$BIOME_URL'"
return 1
fi
if ! pane_id="$(printf '%s' "$panes_json" | python3 -c '
import json
import sys
target = sys.argv[1]
try:
panes = json.load(sys.stdin)
except json.JSONDecodeError:
sys.exit(2)
for pane in panes:
if pane.get("name") == target or pane.get("id", "").startswith(target):
print(pane["id"])
break
' "$TARGET_PANE")"; then
log_error "failed to parse panes response from '$BIOME_URL'"
return 1
fi
printf '%s' "$pane_id"
}
send_input_b64() {
local pane_id="$1"
local payload_b64="$2"
biome_curl -X POST "$BIOME_URL/panes/$pane_id/input" \
-H 'Content-Type: application/json' \
-d "{\"data\":\"$payload_b64\"}" >/dev/null
}
send_command() {
local pane_id="${1:-}" text_b64 carriage_b64 newline_b64
if [[ -z "$pane_id" ]]; then
if ! pane_id="$(resolve_pane_id)"; then
return 1
fi
fi
if [[ -z "$pane_id" ]]; then
log "skipped dispatch; pane '$TARGET_PANE' not found during send"
return 1
fi
text_b64="$(printf '%s' "$COMMAND_TEXT" | base64 -w0)"
carriage_b64="$(printf '\r' | base64 -w0)"
newline_b64="$(printf '\n' | base64 -w0)"
send_input_b64 "$pane_id" "$text_b64"
sleep "$(awk "BEGIN { printf \"%.3f\", $ENTER_DELAY_MS / 1000 }")"
send_input_b64 "$pane_id" "$carriage_b64"
if [[ "$COMMAND_TEXT" == \$* ]]; then
sleep "$(awk "BEGIN { printf \"%.3f\", $SKILL_CONFIRM_DELAY_MS / 1000 }")"
send_input_b64 "$pane_id" "$carriage_b64"
sleep "$(awk "BEGIN { printf \"%.3f\", $SKILL_CONFIRM_DELAY_MS / 1000 }")"
send_input_b64 "$pane_id" "$carriage_b64"
log "sent '$COMMAND_TEXT' to pane '$TARGET_PANE' with skill confirm and submit enters"
else
sleep "$(awk "BEGIN { printf \"%.3f\", $ENTER_DELAY_MS / 1000 }")"
send_input_b64 "$pane_id" "$newline_b64"
log "sent '$COMMAND_TEXT' to pane '$TARGET_PANE' with delayed carriage return and newline"
fi
}
main() {
local pane_id
log "scheduler started for pane '$TARGET_PANE' every ${INTERVAL_SECONDS}s"
while true; do
if ! pane_id="$(resolve_pane_id)"; then
log "skipped dispatch; failed to resolve pane '$TARGET_PANE'"
elif [[ -z "$pane_id" ]]; then
log "skipped dispatch; pane '$TARGET_PANE' not found"
else
send_command "$pane_id"
fi
sleep "$INTERVAL_SECONDS"
done
}
main "$@"