feat: add step-by-step visual replay and harden process lifecycle

- UI: Implement dual-mode playback in FloatingVideoPlayer supporting video and step-by-step frame replay with scrub controls and auto-fallback
- Runtime: Prevent asyncio event loop hangs on Darwin and Linux by avoiding psutil.wait_procs on direct child processes
- Task Queue: Add worker exit watchdog and automatic recording recovery for completed or interrupted sessions
- Recording: Add ffmpeg ultrafast transcode fallback, shield recording finalization against cancellation, and handle on-the-fly MP4 conversion
- Docs: Polish README_CN styling and streamline flash runner agent prompt
This commit is contained in:
somew1nd committed 2026-08-26 00:53:24 -07:00
1 parent 06643e955b
commit a36a66ce6d
26 files changed
+1152 -117

No files matched your search

@@ -141,6 +141,22 @@ class SessionRepository:
except Exception:
return False
def mark_recording_ready(self, session_id: str, local_video_path: str) -> bool:
"""Mark a recording as ready with its finalized video path."""
try:
with db_session(self.db_path) as conn:
cursor = conn.cursor()
cursor.execute(
"UPDATE video_recordings SET status = 'ready', error = NULL, "
"local_video_path = ?, end_time = COALESCE(end_time, ?) "
"WHERE session_id = ?",
(str(local_video_path), time.time(), str(session_id)),
)
conn.commit()
return cursor.rowcount > 0
except Exception:
return False
def get_llm_traces_for_profile(self, session_id: str, limit: int = 3) -> list[str]:
with db_session(self.db_path) as conn:
cursor = conn.cursor()