fix: resume tag in progress messages, fixes sequencing (#3)

This commit is contained in:
banteg
2025-12-30 13:52:19 +04:00
committed by GitHub
parent b9da516ee7
commit 25c3eccca8
3 changed files with 16 additions and 7 deletions
+2 -4
View File
@@ -557,10 +557,8 @@ async def _handle_message(
elapsed = clock() - started_at elapsed = clock() - started_at
status = "done" if saw_agent_message else "error" status = "done" if saw_agent_message else "error"
final_md = ( progress_renderer.resume_session = session_id
progress_renderer.render_final(elapsed, answer, status=status) final_md = progress_renderer.render_final(elapsed, answer, status=status)
+ f"\n\nresume: `{session_id}`"
)
logger.debug("[final] markdown: %s", final_md) logger.debug("[final] markdown: %s", final_md)
final_rendered, final_entities = render_markdown(final_md) final_rendered, final_entities = render_markdown(final_md)
can_edit_final = ( can_edit_final = (
+11 -2
View File
@@ -211,9 +211,11 @@ class ExecProgressRenderer:
self.command_width = command_width self.command_width = command_width
self.recent_actions: deque[str] = deque(maxlen=max_actions) self.recent_actions: deque[str] = deque(maxlen=max_actions)
self.last_item: int | None = None self.last_item: int | None = None
self.resume_session: str | None = None
def note_event(self, event: dict[str, Any]) -> bool: def note_event(self, event: dict[str, Any]) -> bool:
if event["type"] == "thread.started": if event["type"] == "thread.started":
self.resume_session = event["thread_id"]
return True return True
self.last_item, _, progress_line, progress_prefix = format_event( self.last_item, _, progress_line, progress_prefix = format_event(
@@ -240,12 +242,19 @@ class ExecProgressRenderer:
def render_progress(self, elapsed_s: float) -> str: def render_progress(self, elapsed_s: float) -> str:
header = format_header(elapsed_s, self.last_item, label="working") header = format_header(elapsed_s, self.last_item, label="working")
return self._assemble(header, list(self.recent_actions)) message = self._assemble(header, list(self.recent_actions))
return self._append_resume(message)
def render_final(self, elapsed_s: float, answer: str, status: str = "done") -> str: def render_final(self, elapsed_s: float, answer: str, status: str = "done") -> str:
header = format_header(elapsed_s, self.last_item, label=status) header = format_header(elapsed_s, self.last_item, label=status)
answer = (answer or "").strip() answer = (answer or "").strip()
return header + ("\n\n" + answer if answer else "") message = header + ("\n\n" + answer if answer else "")
return self._append_resume(message)
def _append_resume(self, message: str) -> str:
if not self.resume_session:
return message
return message + f"\n\nresume: `{self.resume_session}`"
@staticmethod @staticmethod
def _assemble(header: str, lines: list[str]) -> str: def _assemble(header: str, lines: list[str]) -> str:
+3 -1
View File
@@ -118,12 +118,14 @@ def test_progress_renderer_renders_progress_and_final() -> None:
progress = r.render_progress(3.0) progress = r.render_progress(3.0)
assert progress.startswith("working · 3s · step 3") assert progress.startswith("working · 3s · step 3")
assert "1\\. ✓ `bash -lc ls`" in progress assert "1\\. ✓ `bash -lc ls`" in progress
assert "resume: `0199a213-81c0-7800-8aa1-bbab2a035a53`" in progress
final = r.render_final(3.0, "answer", status="done") final = r.render_final(3.0, "answer", status="done")
assert final.startswith("done · 3s · step 3") assert final.startswith("done · 3s · step 3")
assert "running:" not in final assert "running:" not in final
assert "ran:" not in final assert "ran:" not in final
assert final.endswith("answer") assert "answer" in final
assert final.rstrip().endswith("resume: `0199a213-81c0-7800-8aa1-bbab2a035a53`")
def test_progress_renderer_clamps_actions_and_ignores_unknown() -> None: def test_progress_renderer_clamps_actions_and_ignores_unknown() -> None: