mirror of
https://github.com/theniceboy/.config.git
synced 2026-04-21 12:05:21 +08:00
agent tracker + tmux update
This commit is contained in:
parent
cd9c92b1c2
commit
5064629d61
68 changed files with 15041 additions and 3483 deletions
25
agent-tracker/scripts/dair-sync-test.sh
Executable file
25
agent-tracker/scripts/dair-sync-test.sh
Executable file
|
|
@ -0,0 +1,25 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
REMOTE="${DAIR_REMOTE:-david@dair.local}"
|
||||
REMOTE_ROOT="${DAIR_REMOTE_ROOT:-/Users/david/.config/agent-tracker}"
|
||||
|
||||
if [[ "${1:-}" == "--help" ]]; then
|
||||
echo "Usage: $(basename "$0") [remote command]"
|
||||
echo "Syncs $ROOT to $REMOTE:$REMOTE_ROOT and runs a command there."
|
||||
echo "Default remote command: ./install.sh && /opt/homebrew/bin/go test ./..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
REMOTE_CMD="${*:-./install.sh && /opt/homebrew/bin/go test ./...}"
|
||||
|
||||
rsync -az --delete \
|
||||
--exclude '.git/' \
|
||||
--exclude '.build/' \
|
||||
--exclude 'bin/' \
|
||||
--exclude 'run/' \
|
||||
--exclude '.DS_Store' \
|
||||
"$ROOT/" "$REMOTE:$REMOTE_ROOT/"
|
||||
|
||||
ssh "$REMOTE" "mkdir -p '$REMOTE_ROOT' && cd '$REMOTE_ROOT' && export PATH='/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:\$PATH' && $REMOTE_CMD"
|
||||
|
|
@ -6,13 +6,54 @@ if [[ ! -f "$F" ]]; then
|
|||
exit 0
|
||||
fi
|
||||
|
||||
resolve_by_locator() {
|
||||
local session_name="$1"
|
||||
local window_index="$2"
|
||||
local pane_index="$3"
|
||||
tmux list-panes -a -F "#{session_name}:::#{window_index}:::#{pane_index}:::#{session_id}:::#{window_id}:::#{pane_id}" \
|
||||
| awk -F ':::' -v s="$session_name" -v w="$window_index" -v p="$pane_index" '$1==s && $2==w && $3==p {print $4":::"$5":::"$6; exit}'
|
||||
}
|
||||
|
||||
target_exists() {
|
||||
local pane="$1"
|
||||
tmux display-message -p -t "$pane" '#{pane_id}' >/dev/null 2>&1
|
||||
}
|
||||
|
||||
resolve_by_pane() {
|
||||
local pane="$1"
|
||||
tmux display-message -p -t "$pane" '#{session_id}:::#{window_id}:::#{pane_id}' 2>/dev/null | tr -d '\r\n'
|
||||
}
|
||||
|
||||
sid=$(awk -F ':::' 'NR==1{print $1}' "$F" | tr -d '\r\n')
|
||||
wid=$(awk -F ':::' 'NR==1{print $2}' "$F" | tr -d '\r\n')
|
||||
pid=$(awk -F ':::' 'NR==1{print $3}' "$F" | tr -d '\r\n')
|
||||
session_name=$(awk -F ':::' 'NR==1{print $4}' "$F" | tr -d '\r\n')
|
||||
window_index=$(awk -F ':::' 'NR==1{print $5}' "$F" | tr -d '\r\n')
|
||||
pane_index=$(awk -F ':::' 'NR==1{print $6}' "$F" | tr -d '\r\n')
|
||||
|
||||
if [[ -z "${sid:-}" || -z "${wid:-}" || -z "${pid:-}" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
tmux switch-client -t "$sid" \; select-window -t "$wid" \; select-pane -t "$pid"
|
||||
if target_exists "$pid"; then
|
||||
resolved=$(resolve_by_pane "$pid")
|
||||
if [[ -n "$resolved" ]]; then
|
||||
sid=$(printf '%s' "$resolved" | awk -F ':::' '{print $1}')
|
||||
wid=$(printf '%s' "$resolved" | awk -F ':::' '{print $2}')
|
||||
pid=$(printf '%s' "$resolved" | awk -F ':::' '{print $3}')
|
||||
fi
|
||||
else
|
||||
if [[ -n "${session_name:-}" && -n "${window_index:-}" && -n "${pane_index:-}" ]]; then
|
||||
resolved=$(resolve_by_locator "$session_name" "$window_index" "$pane_index")
|
||||
if [[ -z "$resolved" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
sid=$(printf '%s' "$resolved" | awk -F ':::' '{print $1}')
|
||||
wid=$(printf '%s' "$resolved" | awk -F ':::' '{print $2}')
|
||||
pid=$(printf '%s' "$resolved" | awk -F ':::' '{print $3}')
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
tmux switch-client -t "$sid" \; select-window -t "$wid" \; select-pane -t "$pid"
|
||||
|
|
|
|||
|
|
@ -1,35 +1,73 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
F="$HOME/.config/agent-tracker/run/latest_notified.txt"
|
||||
if [[ ! -f "$F" ]]; then
|
||||
exit 0
|
||||
AGENT_BIN="$HOME/.config/agent-tracker/bin/agent"
|
||||
[[ -x "$AGENT_BIN" ]] || exit 0
|
||||
command -v jq >/dev/null 2>&1 || exit 0
|
||||
|
||||
state=$("$AGENT_BIN" tracker state 2>/dev/null || true)
|
||||
[[ -n "$state" ]] || exit 0
|
||||
|
||||
target=$(echo "$state" | jq -r '
|
||||
(.tasks // [])
|
||||
| map(
|
||||
select(
|
||||
.status == "completed" and
|
||||
(.acknowledged != true) and
|
||||
(.session_id // "") != "" and
|
||||
(.window_id // "") != ""
|
||||
)
|
||||
| . + {__ts: ((.completed_at // .started_at // "") | (fromdateiso8601? // 0))}
|
||||
)
|
||||
| if length == 0 then empty else max_by(.__ts) end
|
||||
| [.session_id, .window_id, (.pane // "")] | @tsv
|
||||
' 2>/dev/null || true)
|
||||
|
||||
[[ -n "$target" ]] || exit 0
|
||||
IFS=$'\t' read -r sid wid pid <<< "$target"
|
||||
[[ -n "${sid:-}" && -n "${wid:-}" ]] || exit 0
|
||||
|
||||
task_pid="$pid"
|
||||
|
||||
pane_exists() {
|
||||
local pane="$1"
|
||||
[[ -n "$pane" ]] || return 1
|
||||
tmux list-panes -a -F "#{pane_id}" 2>/dev/null | awk -v p="$pane" '$1==p {found=1} END{exit(found?0:1)}'
|
||||
}
|
||||
|
||||
resolve_first_pane_for_window() {
|
||||
local window="$1"
|
||||
tmux list-panes -t "$window" -F "#{pane_id}" 2>/dev/null | awk 'NF {print $1; exit}'
|
||||
}
|
||||
|
||||
if pane_exists "$pid"; then
|
||||
resolved=$(tmux display-message -p -t "$pid" '#{session_id}:::#{window_id}:::#{pane_id}' 2>/dev/null | tr -d '\r\n')
|
||||
rsid=$(printf '%s' "$resolved" | awk -F ':::' '{print $1}')
|
||||
rwid=$(printf '%s' "$resolved" | awk -F ':::' '{print $2}')
|
||||
rpid=$(printf '%s' "$resolved" | awk -F ':::' '{print $3}')
|
||||
if [[ -n "$rsid" && -n "$rwid" && -n "$rpid" ]]; then
|
||||
sid="$rsid"
|
||||
wid="$rwid"
|
||||
pid="$rpid"
|
||||
fi
|
||||
else
|
||||
pid=$(resolve_first_pane_for_window "$wid")
|
||||
fi
|
||||
|
||||
# Read line and split by literal ':::' into sid, wid, pid robustly
|
||||
# Extract fields robustly using awk with a literal ':::' separator
|
||||
sid=$(awk -F ':::' 'NR==1{print $1}' "$F" | tr -d '\r\n')
|
||||
wid=$(awk -F ':::' 'NR==1{print $2}' "$F" | tr -d '\r\n')
|
||||
pid=$(awk -F ':::' 'NR==1{print $3}' "$F" | tr -d '\r\n')
|
||||
|
||||
if [[ -z "${sid:-}" || -z "${wid:-}" || -z "${pid:-}" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
[[ -n "${pid:-}" ]] || exit 0
|
||||
|
||||
RUN_DIR="$HOME/.config/agent-tracker/run"
|
||||
mkdir -p "$RUN_DIR"
|
||||
|
||||
# Record current location for jump-back
|
||||
current=$(tmux display-message -p "#{session_id}:::#{window_id}:::#{pane_id}" | tr -d '\r\n')
|
||||
current=$(tmux display-message -p "#{session_id}:::#{window_id}:::#{pane_id}:::#{session_name}:::#{window_index}:::#{pane_index}" | tr -d '\r\n')
|
||||
if [[ -n "$current" ]]; then
|
||||
printf '%s\n' "$current" > "$RUN_DIR/jump_back.txt"
|
||||
fi
|
||||
|
||||
# Mark as viewed (acknowledged) in tracker (graceful if unavailable)
|
||||
CLIENT_BIN="$HOME/.config/agent-tracker/bin/tracker-client"
|
||||
if [[ -x "$CLIENT_BIN" ]]; then
|
||||
"$CLIENT_BIN" command acknowledge -session-id "$sid" -window-id "$wid" -pane "$pid" >/dev/null 2>&1 || true
|
||||
if [[ -x "$AGENT_BIN" ]]; then
|
||||
ack_pid="$pid"
|
||||
[[ -n "${task_pid:-}" ]] && ack_pid="$task_pid"
|
||||
"$AGENT_BIN" tracker command acknowledge -session-id "$sid" -window-id "$wid" -pane "$ack_pid" >/dev/null 2>&1 || true
|
||||
fi
|
||||
|
||||
# Focus the tmux target
|
||||
tmux switch-client -t "$sid" \; select-window -t "$wid" \; select-pane -t "$pid"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue