feat(runtime): capture step evidence in console
Tests / Test passed: 862

This commit is contained in:
2026-07-15 10:12:09 +08:00
parent 8d5b02e37f
commit ccde30e378
20 changed files with 594 additions and 53 deletions
+34 -4
View File
@@ -136,13 +136,22 @@ class TaskRunner:
if should_stop is not None and should_stop():
return self._interrupt_task(task)
executable_step = self._step_for_device(step, task.device_id)
before_screenshot = self._planning_screenshot(task.device_id)
result = self.executor.execute(
executable_step,
context=context,
)
after_screenshot = self._planning_screenshot(task.device_id)
context.add_step_result(result)
self._record_step_result(
world_handle, context, task, scene, step, result
world_handle,
context,
task,
scene,
step,
result,
before_screenshot=before_screenshot,
after_screenshot=after_screenshot,
)
self._emit_step_progress(
len(context.step_results),
@@ -204,6 +213,9 @@ class TaskRunner:
scene: Scene,
step: PlannedStep,
result: object,
*,
before_screenshot: bytes | None = None,
after_screenshot: bytes | None = None,
) -> None:
"""Record one executed step's bookkeeping: world-model observe + timeline append.
@@ -212,7 +224,14 @@ class TaskRunner:
cannot drift apart on what gets recorded for a step.
"""
self._update_world(world_handle, context, scene, step, result)
self._append_timeline(task, scene, step, result)
self._append_timeline(
task,
scene,
step,
result,
before_screenshot=before_screenshot,
after_screenshot=after_screenshot,
)
def _emit_step_progress(
self, step_index: int, step_status: str, summary: str
@@ -330,10 +349,19 @@ class TaskRunner:
scene: Scene,
step: PlannedStep,
result: object,
*,
before_screenshot: bytes | None = None,
after_screenshot: bytes | None = None,
) -> None:
if not self.timeline:
return
screenshot = self._planning_screenshot(task.device_id)
ocr_results = scene.ocr_results_to_dict()
if not ocr_results:
ocr_results = [
element.to_dict()
for element in scene.elements
if element.source == "ocr"
]
self.timeline.append(
task_id=task.id,
scene=scene.to_dict(),
@@ -346,7 +374,9 @@ class TaskRunner:
result=result.to_dict()
if hasattr(result, "to_dict")
else {"result": result},
screenshot=screenshot,
before_screenshot=before_screenshot,
after_screenshot=after_screenshot,
ocr_results=ocr_results,
)
def _step_for_device(self, step: PlannedStep, device_id: str) -> PlannedStep: