fix(kugetsu): remove broken session existence check
The check_opencode_session_exists() function was fundamentally broken because 'opencode session list' does not include forked sessions, regardless of output format (table or JSON). This caused false 'session expired' reports even when sessions were fully functional. Changes: - Remove session check from cmd_status() - now returns 'ok' if session registered - Remove session check from cmd_delegate() - let opencode run fail naturally - Remove warning from cmd_continue() - proceed regardless - Simplify cmd_doctor() - just show registered sessions - Update test to reflect new behavior Issue #38: #38
This commit is contained in:
@@ -303,7 +303,7 @@ validate_issue_ref() {
|
||||
|
||||
check_opencode_session_exists() {
|
||||
local session_id="$1"
|
||||
opencode session list 2>/dev/null | grep -q "^$session_id"
|
||||
opencode session list --format json 2>/dev/null | grep -q "\"$session_id\""
|
||||
}
|
||||
|
||||
kugetsu_get_pm_context() {
|
||||
@@ -475,11 +475,6 @@ cmd_status() {
|
||||
return
|
||||
fi
|
||||
|
||||
if ! check_opencode_session_exists "$pm_agent"; then
|
||||
echo "pm_agent_expired"
|
||||
return
|
||||
fi
|
||||
|
||||
echo "ok"
|
||||
}
|
||||
|
||||
@@ -498,11 +493,6 @@ cmd_delegate() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! check_opencode_session_exists "$pm_session"; then
|
||||
echo "Error: PM agent session has expired. Run 'kugetsu init' again." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
opencode run --continue --session "$pm_session" "$message" 2>&1
|
||||
}
|
||||
|
||||
@@ -537,12 +527,6 @@ cmd_doctor() {
|
||||
issues=$((issues + 1))
|
||||
else
|
||||
echo "[OK] Base session: $base"
|
||||
if check_opencode_session_exists "$base"; then
|
||||
echo "[OK] Base session active"
|
||||
else
|
||||
echo "[ISSUE] Base session expired"
|
||||
issues=$((issues + 1))
|
||||
fi
|
||||
fi
|
||||
|
||||
local pm_agent=$(get_pm_agent_session_id)
|
||||
@@ -551,12 +535,6 @@ cmd_doctor() {
|
||||
issues=$((issues + 1))
|
||||
else
|
||||
echo "[OK] PM agent: $pm_agent"
|
||||
if check_opencode_session_exists "$pm_agent"; then
|
||||
echo "[OK] PM agent session active"
|
||||
else
|
||||
echo "[ISSUE] PM agent session expired"
|
||||
issues=$((issues + 1))
|
||||
fi
|
||||
fi
|
||||
|
||||
local pm_context_file="${KUGETSU_DIR}/pm-agent.md"
|
||||
@@ -583,44 +561,40 @@ cmd_doctor() {
|
||||
else
|
||||
local pm_agent=$(get_pm_agent_session_id)
|
||||
if [ -n "$pm_agent" ] && [ "$pm_agent" != "null" ] && [ "$pm_agent" != "None" ]; then
|
||||
if ! check_opencode_session_exists "$pm_agent"; then
|
||||
echo "[FIX] Recreating expired PM agent session..."
|
||||
local base=$(get_base_session_id)
|
||||
if [ -n "$base" ] && [ "$base" != "null" ]; then
|
||||
rm -f "$SESSIONS_DIR/pm-agent.json"
|
||||
|
||||
local before_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort)
|
||||
local before_set="${before_sessions//$'\n'/|}"
|
||||
|
||||
local pm_context=$(kugetsu_get_pm_context)
|
||||
if [ -n "$pm_context" ]; then
|
||||
opencode run --fork --session "$base" "You are a PM (Project Manager) agent. Your role is to coordinate task delegation and review PRs. $pm_context" 2>&1 || true
|
||||
else
|
||||
opencode run --fork --session "$base" "You are a PM (Project Manager) agent. Your role is to coordinate task delegation and review PRs. Wait for instructions." 2>&1 || true
|
||||
fi
|
||||
|
||||
local after_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort)
|
||||
local new_pm_session_id=""
|
||||
while IFS= read -r sess; do
|
||||
if [[ ! "$before_set" =~ \|${sess}\| ]] && [[ "$sess" != "$base" ]]; then
|
||||
new_pm_session_id="$sess"
|
||||
break
|
||||
fi
|
||||
done <<< "$after_sessions"
|
||||
|
||||
if [ -n "$new_pm_session_id" ]; then
|
||||
printf '{"type": "pm_agent", "opencode_session_id": "%s", "created_at": "%s", "state": "idle"}\n' \
|
||||
"$new_pm_session_id" "$(date -Iseconds)" > "$SESSIONS_DIR/pm-agent.json"
|
||||
set_pm_agent_in_index "$new_pm_session_id"
|
||||
echo "[FIX] PM agent recreated: $new_pm_session_id"
|
||||
else
|
||||
echo "[FIX] Warning: Could not detect new PM session ID"
|
||||
fi
|
||||
echo "[FIX] Recreating PM agent session..."
|
||||
local base=$(get_base_session_id)
|
||||
if [ -n "$base" ] && [ "$base" != "null" ]; then
|
||||
rm -f "$SESSIONS_DIR/pm-agent.json"
|
||||
|
||||
local before_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort)
|
||||
local before_set="${before_sessions//$'\n'/|}"
|
||||
|
||||
local pm_context=$(kugetsu_get_pm_context)
|
||||
if [ -n "$pm_context" ]; then
|
||||
opencode run --fork --session "$base" "You are a PM (Project Manager) agent. Your role is to coordinate task delegation and review PRs. $pm_context" 2>&1 || true
|
||||
else
|
||||
echo "[FIX] Cannot recreate PM agent: base session missing"
|
||||
opencode run --fork --session "$base" "You are a PM (Project Manager) agent. Your role is to coordinate task delegation and review PRs. Wait for instructions." 2>&1 || true
|
||||
fi
|
||||
|
||||
local after_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort)
|
||||
local new_pm_session_id=""
|
||||
while IFS= read -r sess; do
|
||||
if [[ ! "$before_set" =~ \|${sess}\| ]] && [[ "$sess" != "$base" ]]; then
|
||||
new_pm_session_id="$sess"
|
||||
break
|
||||
fi
|
||||
done <<< "$after_sessions"
|
||||
|
||||
if [ -n "$new_pm_session_id" ]; then
|
||||
printf '{"type": "pm_agent", "opencode_session_id": "%s", "created_at": "%s", "state": "idle"}\n' \
|
||||
"$new_pm_session_id" "$(date -Iseconds)" > "$SESSIONS_DIR/pm-agent.json"
|
||||
set_pm_agent_in_index "$new_pm_session_id"
|
||||
echo "[FIX] PM agent recreated: $new_pm_session_id"
|
||||
else
|
||||
echo "[FIX] Warning: Could not detect new PM session ID"
|
||||
fi
|
||||
else
|
||||
echo "[FIX] PM agent is active, no fix needed"
|
||||
echo "[FIX] Cannot recreate PM agent: base session missing"
|
||||
fi
|
||||
else
|
||||
echo "[FIX] Cannot fix: PM agent not initialized. Run 'kugetsu init' first."
|
||||
@@ -867,11 +841,6 @@ cmd_continue() {
|
||||
local opencode_session_id=$(python3 -c "import json; print(json.load(open('$session_path'))['opencode_session_id'])")
|
||||
local worktree_path=$(python3 -c "import json; print(json.load(open('$session_path')).get('worktree_path', ''))" 2>/dev/null || echo "")
|
||||
|
||||
if ! check_opencode_session_exists "$opencode_session_id"; then
|
||||
echo "Warning: Session may have expired in opencode" >&2
|
||||
echo "Attempting to continue anyway..." >&2
|
||||
fi
|
||||
|
||||
echo "Continuing session for '$session_name'..."
|
||||
if [ -n "$worktree_path" ] && [ -d "$worktree_path" ]; then
|
||||
echo "Using worktree: $worktree_path"
|
||||
|
||||
@@ -417,14 +417,17 @@ else
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 25: status when all good (pm-agent in json but session expired)
|
||||
echo "--- Test: status (session expired) ---"
|
||||
# Test 25: status when all good (pm-agent in json - no longer checks opencode)
|
||||
# Note: check_opencode_session_exists was removed because forked sessions
|
||||
# don't appear in 'opencode session list'. Status now returns 'ok' if
|
||||
# session is registered in kugetsu index, regardless of opencode state.
|
||||
echo "--- Test: status (session registered) ---"
|
||||
setup_mock_base
|
||||
OUTPUT=$($KUGETSU status 2>&1 || true)
|
||||
if [ "$OUTPUT" = "pm_agent_expired" ]; then
|
||||
pass "status returns pm_agent_expired when session not in opencode"
|
||||
if [ "$OUTPUT" = "ok" ]; then
|
||||
pass "status returns ok when session is in kugetsu index"
|
||||
else
|
||||
fail "status session expired: got '$OUTPUT', expected 'pm_agent_expired'"
|
||||
fail "status session registered: got '$OUTPUT', expected 'ok'"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user