Compare commits

...

8 Commits

Author SHA1 Message Date
2e9081f4f5 Merge pull request 'fix(kugetsu): call fix_session_permissions before forking' (#109) from fix/prefork-permissions into main 2026-04-02 13:10:54 +02:00
shokollm
f7ac2f35fe fix(kugetsu): call fix_session_permissions before forking
- Call fix_session_permissions in cmd_start before forking to ensure
  base session has correct permissions for external_directory access
- Add debug logging to show forked session's directory and permissions
  after creation to help diagnose permission inheritance issues
2026-04-02 11:08:30 +00:00
97d7511e56 Merge pull request 'fix(kugetsu): session detection ordering bug and debugging' (#108) from fix/session-detection-v2 into main 2026-04-02 12:26:57 +02:00
shokollm
cd12a0cda8 fix(kugetsu): fix session detection ordering and add DB debugging
1. Move session detection BEFORE checking if fork process is still running.
   Previous code broke out of loop if forked process exited, skipping detection.

2. Add database query debugging when detection fails to help diagnose
   why opencode session list might miss newly created sessions.
2026-04-02 09:57:27 +00:00
ffdf5e34c8 Merge pull request 'fix(kugetsu): improve session detection in cmd_start with retry logic and logging' (#107) from fix/start-session-detection into main 2026-04-02 11:41:52 +02:00
shokollm
b3ac73a283 Merge origin/main into fix/start-session-detection
Resolve conflict: use cd approach for worktree, keep retry logic
2026-04-02 09:39:45 +00:00
shokollm
1128b3dfa8 fix(kugetsu): improve session detection in cmd_start with retry logic and logging
- Capture fork output to log file for debugging
- Track fork PID to detect if process exits early
- Retry session detection up to 10 seconds instead of 1 second
- Show fork log output when session creation fails
- Improve error message to indicate timeout
2026-04-02 09:29:30 +00:00
90f46a778a Merge pull request 'fix: use cd + worktree inside parent dir instead of --dir flag (fixes #105)' (#106) from fix/worktree-isolation-via-cd into main 2026-04-02 10:29:32 +02:00

View File

@@ -1243,44 +1243,96 @@ cmd_start() {
exit 1 exit 1
fi fi
local fork_log="$SESSIONS_DIR/$session_file.fork.log"
local opencode_db="${OPENCODE_DB:-$HOME/.local/share/opencode/opencode.db}"
fix_session_permissions
if [ "$DEBUG_MODE" = true ]; then if [ "$DEBUG_MODE" = true ]; then
(cd "$worktree_path" && opencode run "$message" --fork --session "$base_session_id" 2>&1) | tee "$SESSIONS_DIR/$session_file.debug.log" & (cd "$worktree_path" && opencode run "$message" --fork --session "$base_session_id" 2>&1) | tee "$fork_log" &
else else
(cd "$worktree_path" && opencode run "$message" --fork --session "$base_session_id" 2>&1) & (cd "$worktree_path" && opencode run "$message" --fork --session "$base_session_id" 2>&1) >> "$fork_log" &
fi fi
# Wait briefly for session to be created local fork_pid=$!
sleep 1
local max_attempts=10
# Find the new session by comparing before/after lists local attempt=1
# Skip any session that existed before the fork and skip base/pm-agent
local new_session_id="" local new_session_id=""
while IFS= read -r sess; do local fork_log_output=""
# Skip base and pm-agent
[ "$sess" = "$base_session_id" ] && continue while [ $attempt -le $max_attempts ]; do
[ "$sess" = "$pm_agent_session_id" ] && continue sleep 1
# Check if this session existed before while IFS= read -r sess; do
local existed_before=false [ "$sess" = "$base_session_id" ] && continue
for before_sess in "${before_sessions[@]}"; do [ "$sess" = "$pm_agent_session_id" ] && continue
if [ "$sess" = "$before_sess" ]; then
existed_before=true 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 break
fi fi
done done < <(opencode session list 2>/dev/null | grep -oP '^ses_\w+')
if [ "$existed_before" = false ]; then if [ -n "$new_session_id" ]; then
new_session_id="$sess"
break break
fi fi
done < <(opencode session list 2>/dev/null | grep -oP '^ses_\w+')
if ! kill -0 $fork_pid 2>/dev/null; then
fork_log_output=$(tail -20 "$fork_log" 2>/dev/null || echo "(log empty or unavailable)")
break
fi
attempt=$((attempt + 1))
done
if [ -z "$new_session_id" ]; then if [ -z "$new_session_id" ]; then
echo "Error: Could not find newly created session" >&2 if [ -f "$opencode_db" ]; then
local db_sessions=$(python3 -c "
import sqlite3
conn = sqlite3.connect('$opencode_db')
cursor = conn.cursor()
cursor.execute(\"SELECT id FROM session WHERE parent_id IS NOT NULL ORDER BY time_created DESC LIMIT 5\")
for row in cursor.fetchall():
print(row[0])
" 2>/dev/null || echo "")
if [ -n "$db_sessions" ]; then
echo "Recent forked sessions in DB:" >&2
echo "$db_sessions" >&2
fi
fi
echo "Error: Could not find newly created session after ${max_attempts}s" >&2
if [ -n "$fork_log_output" ]; then
echo "Fork log output:" >&2
echo "$fork_log_output" >&2
fi
remove_worktree_for_issue "$issue_ref" remove_worktree_for_issue "$issue_ref"
exit 1 exit 1
fi fi
if [ "$DEBUG_MODE" = true ]; then
echo "[DEBUG] Forked session permissions check:"
python3 -c "
import sqlite3
conn = sqlite3.connect('$opencode_db')
cursor = conn.cursor()
cursor.execute(\"SELECT id, directory, permission FROM session WHERE id = '$new_session_id'\")
for row in cursor.fetchall():
print(' ID:', row[0])
print(' Directory:', row[1])
print(' Permission:', row[2])
" 2>/dev/null || echo " (failed to query DB)"
fi
printf '{"type": "forked", "issue_ref": "%s", "opencode_session_id": "%s", "worktree_path": "%s", "created_at": "%s", "state": "idle"}\n' \ printf '{"type": "forked", "issue_ref": "%s", "opencode_session_id": "%s", "worktree_path": "%s", "created_at": "%s", "state": "idle"}\n' \
"$issue_ref" "$new_session_id" "$worktree_path" "$(date -Iseconds)" > "$SESSIONS_DIR/$session_file" "$issue_ref" "$new_session_id" "$worktree_path" "$(date -Iseconds)" > "$SESSIONS_DIR/$session_file"