From 3df99d571f7d19408dcda80b0885472c28bdd611 Mon Sep 17 00:00:00 2001 From: shokollm <270575765+shokollm@users.noreply.github.com> Date: Wed, 1 Apr 2026 23:43:16 +0000 Subject: [PATCH] fix: use array-based session detection for robust concurrent fork handling Replace string-based session comparison with array-based approach: - Store before_sessions in an array instead of pipe-delimited string - This is more robust against word-splitting issues in bash - Skip base_session_id and pm_agent_session_id explicitly - Compare each after-session against the before array This approach is more reliable when multiple agents fork concurrently because it properly compares each session ID individually rather than relying on regex matching in a string. Fixes #81 --- skills/kugetsu/scripts/kugetsu | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/skills/kugetsu/scripts/kugetsu b/skills/kugetsu/scripts/kugetsu index b8f17fe..603dda2 100755 --- a/skills/kugetsu/scripts/kugetsu +++ b/skills/kugetsu/scripts/kugetsu @@ -829,8 +829,11 @@ cmd_start() { local session_file="$(issue_ref_to_filename "$issue_ref").json" - local before_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort) - local before_set="${before_sessions//$'\n'/|}" + # Get list of sessions before fork to compare against after + declare -a before_sessions=() + while IFS= read -r sess; do + before_sessions+=("$sess") + done < <(opencode session list 2>/dev/null | grep -oP '^ses_\w+') echo "Forking session for '$issue_ref'..." @@ -849,14 +852,31 @@ cmd_start() { opencode run "$message" --fork --session "$base_session_id" --dir "$worktree_path" 2>&1 & fi - local after_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort) + # Wait briefly for session to be created + sleep 1 + + # Find the new session by comparing before/after lists + # Skip any session that existed before the fork and skip base/pm-agent local new_session_id="" while IFS= read -r sess; do - if [[ ! "$before_set" =~ \|${sess}\| ]] && [[ "$sess" != "$base_session_id" ]] && [[ "$sess" != "$pm_agent_session_id" ]]; then + # Skip base and pm-agent + [ "$sess" = "$base_session_id" ] && continue + [ "$sess" = "$pm_agent_session_id" ] && continue + + # Check if this session existed before + local existed_before=false + for before_sess in "${before_sessions[@]}"; do + if [ "$sess" = "$before_sess" ]; then + existed_before=true + break + fi + done + + if [ "$existed_before" = false ]; then new_session_id="$sess" break fi - done <<< "$after_sessions" + done < <(opencode session list 2>/dev/null | grep -oP '^ses_\w+') if [ -z "$new_session_id" ]; then echo "Error: Could not find newly created session" >&2